⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 remote_view.py

📁 CoralFTP是一款用Python语言编写的工作在GTK2环境下的FTP客户端软件
💻 PY
📖 第 1 页 / 共 4 页
字号:
#!/usr/bin/env python# -*- coding: utf-8 -*-# Copyright (C) 1994  Ling Li## This program is free software; you can redistribute it and/or modify# it under the terms of the GNU General Public License as published by# the Free Software Foundation; either version 2 of the License, or# (at your option) any later version.## This program is distributed in the hope that it will be useful,# but WITHOUT ANY WARRANTY; without even the implied warranty of# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the# GNU Library General Public License for more details.## You should have received a copy of the GNU General Public License# along with this program; if not, write to the Free Software# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.import gobject, gtk, gtk.gdkfrom gtk import *import datetime, string, logging, time, thread, threadingfrom coralftp_globals import *from ftp_engine import FTPEnginefrom transfer_view import *from quick_connect import QuickConnectfrom general_input import *from site_info import *from ftp_exception import *from configuration import config_key, config_valuefrom utils import *class RemoteView:    COL_ICON = 0    COL_NAME = 1    COL_TYPE = 2    COL_SIZE = 3    COL_DATE = 4    COL_ATTR = 5    COL_OWNER = 6    COL_GROUP = 7    COL_INFO = 8    __ftp_engine = None    __site_info = None    __selected_count = 0    __change_selection_now = False    # This event object is used when ftp_close() method is called before    # open a new site.    __ftp_close_event = threading.Event()    __clipboard = None    __change_sort_menu_item = True    # file listing font    __use_custom_file_listing_font = False    __file_listing_font = None    __text_renderers = []    # show idle time    __show_idle_time = True    # registered cd-succeeded handler id    __cd_succeeded_hids = []    def __init__(self, main_window):        ACTIONS = {            'connect' : { 'label' : 'Connect',                          'update' : self.on_connect_action_update,                          'execute' : self.on_connect_action_execute },            'disconnect' : { 'label' : 'Disconnect',                             'sensitive' : FALSE,                             'update' : self.on_disconnect_action_update,                             'execute' : self.on_disconnect_action_execute },            'refresh' : { 'label' : 'Refresh',                          'sensitive' : FALSE,                          'update' : self.on_refresh_action_update,                          'execute' : self.on_refresh_action_execute },            'abort' : { 'label' : 'Abort',                        'sensitive' : TRUE,                        'execute' : self.on_abort_action_execute },            'transfer' : { 'label' : '_Transfer',                           'sensitive' : FALSE,                           'update' : self.on_transfer_queue_action_update,                           'execute' : self.on_transfer_action_execute },            'transfer_as' : {'label' : 'Transfer As',                             'sensitive' : FALSE,                             'update' : self.on_transfer_queue_as_action_update,                             'execute' : self.on_transfer_as_action_execute},            'queue' : { 'label' : '_Queue',                        'sensitive' : FALSE,                        'update' : self.on_transfer_queue_action_update,                        'execute' : self.on_queue_action_execute },            'queue_as' : { 'label' : 'Queue As',                           'sensitive' : FALSE,                           'update' : self.on_transfer_queue_as_action_update,                           'execute' : self.on_queue_as_action_execute },            'delete' : { 'label' : '_Delete',                         'sensitive' : FALSE,                         'update' : self.on_delete_action_update,                         'execute' : self.on_delete_action_execute },            'move' : { 'label' : '_Move',                       'sensitive' : FALSE,                       'update' : self.on_move_action_update,                       'execute' : self.on_move_action_execute },            'rename' : { 'label' : 'Re_name',                         'sensitive' : FALSE,                         'update' : self.on_rename_action_update,                         'execute' : self.on_rename_action_execute },            'copyurl' : { 'label' : 'Copy URL',                          'sensitive' : FALSE,                          'update' : self.on_copyurl_action_update,                          'execute' : self.on_copyurl_action_execute },            'mkdir' : { 'label' : 'Make Folder',                        'sensitive' : FALSE,                        'update' : self.on_mkdir_action_update,                        'execute' : self.on_mkdir_action_execute },            'chdir' : { 'label' : 'Change Folder',                        'sensitive' : FALSE,                        'update' : self.on_chdir_action_update,                        'execute' : self.on_chdir_action_execute },            'updir' : { 'sensitive' : FALSE,                        'update' : self.on_updir_action_update,                        'execute' : self.on_updir_action_execute },            'sort' : { 'sensitive' : TRUE,                       'execute' : self.on_sort_action_execute },            'attributes' : { 'sensitive' : FALSE },            'save_path' : { 'sensitive' : FALSE },            }        WIDGET_ACTIONS = { 'tbtn_remote_connect' : 'connect',                           'tbtn_remote_disconnect' : 'disconnect',                           'tbtn_remote_abort' : 'abort',                           'tbtn_remote_transfer' : 'transfer',                           'tbtn_remote_refresh' : 'refresh',                           'btn_remote_updir' : 'updir' }                MENU_ACTIONS = { 'mi_remote_transfer' : 'transfer',                         'mi_remote_queue' : 'queue',                         'mi_remote_transfer_as' : 'transfer_as',                         'mi_remote_queue_as' : 'queue_as',                         'mi_remote_delete' : 'delete',                         'mi_remote_rename' : 'rename',                         'mi_remote_move' : 'move',                         'mi_remote_copy_url' : 'copyurl',                         'mi_remote_attributes' : 'attributes',                         'mi_remote_save_path' : 'save_path',                         'mi_remote_make_folder' : 'mkdir',                         'mi_remote_change_folder' : 'chdir',                         'mi_remote_refresh' : 'refresh',                         'mi_remote_arr_by_name' : 'sort',                         'mi_remote_arr_by_size' : 'sort',                         'mi_remote_arr_by_date' : 'sort',                         'mi_remote_arr_by_file_extension' : 'sort',                         'mi_remote_arr_by_owner' : 'sort',                         'mi_remote_arr_by_group' : 'sort',                         'mi_remote_arr_ascending' : 'sort',                         'mi_remote_arr_descending' : 'sort' }        self.__main_window = main_window        self.__config = main_window.config        self.__xml = main_window.xml        self.__menu_xml = get_glade_xml('remote_file_list_menu')        self.widget = self.__xml.get_widget('remote_view')        self.widget.connect('destroy', self.on_destroy)        self.__cmb_dir = self.__xml.get_widget('cmb_remote_dir')        self.__cmb_dir.child.connect('activate',                                     self.on_remote_dir_entry_activate)        # init actions        self.actions = ActionList(ACTIONS)        self.__model = ListStore(gtk.gdk.Pixbuf,         # icon                                 gobject.TYPE_STRING,    # name                                 gobject.TYPE_STRING,    # type                                 gobject.TYPE_STRING,    # size                                 gobject.TYPE_STRING,    # date                                 gobject.TYPE_STRING,    # attr                                 gobject.TYPE_STRING,    # owner                                 gobject.TYPE_STRING,    # group                                 gobject.TYPE_PYOBJECT)  # info        self.__model.set_sort_func(RemoteView.COL_NAME, self.filelist_sort)        self.__model.set_sort_func(RemoteView.COL_SIZE, self.filelist_sort)        self.__model.set_sort_func(RemoteView.COL_TYPE, self.filelist_sort)        self.__model.set_sort_func(RemoteView.COL_DATE, self.filelist_sort)        self.__model.set_sort_func(RemoteView.COL_OWNER, self.filelist_sort)        self.__model.set_sort_func(RemoteView.COL_GROUP, self.filelist_sort)        self.__list = self.__xml.get_widget('tv_remote_file_list')        self.__list.set_model(self.__model)        self.__list.get_selection().set_mode(gtk.SELECTION_MULTIPLE)        self.__list.get_selection().set_select_function(self.__select_func)                column = TreeViewColumn(_("Name"))        renderer = CellRendererPixbuf()        column.pack_start(renderer, expand=FALSE)        column.add_attribute(renderer, 'pixbuf', RemoteView.COL_ICON)        renderer = CellRendererText()        self.__text_renderers.append(renderer)        column.pack_start(renderer, expand=TRUE)        column.add_attribute(renderer, 'text', RemoteView.COL_NAME)        column.set_sort_column_id(RemoteView.COL_NAME)        column.set_resizable(TRUE)        self.__list.append_column(column)                renderer = CellRendererText()        self.__text_renderers.append(renderer)        renderer.set_property('xalign', 1)        column = TreeViewColumn(_("Size"), renderer, text=RemoteView.COL_SIZE)        column.set_sort_column_id(RemoteView.COL_SIZE)        column.set_resizable(TRUE)        self.__list.append_column(column)                renderer = CellRendererText()        self.__text_renderers.append(renderer)        column = TreeViewColumn(_("Attrib"), renderer, text=RemoteView.COL_ATTR)        column.set_resizable(TRUE)        self.__list.append_column(column)        renderer = CellRendererText()        self.__text_renderers.append(renderer)        column = TreeViewColumn(_("Owner"), renderer, text=RemoteView.COL_OWNER)        column.set_sort_column_id(RemoteView.COL_OWNER)        column.set_resizable(TRUE)        self.__list.append_column(column)        renderer = CellRendererText()        self.__text_renderers.append(renderer)        column = TreeViewColumn(_("Group"), renderer, text=RemoteView.COL_GROUP)        column.set_sort_column_id(RemoteView.COL_GROUP)        column.set_resizable(TRUE)        self.__list.append_column(column)        renderer = CellRendererText()        self.__text_renderers.append(renderer)        column = TreeViewColumn(_("Modified"), renderer,                                text=RemoteView.COL_DATE)        column.set_sort_column_id(RemoteView.COL_DATE)        column.set_resizable(TRUE)        self.__list.append_column(column)        # set file list sort by according to gconf         self.__model.connect('sort-column-changed',                             self.on_list_sort_column_changed)        value = config_value(self.__config, 'display', 'ftp_sort_by')        if value == 0:            ftp_sort_by = RemoteView.COL_NAME        elif value == 1:            ftp_sort_by = RemoteView.COL_OWNER        elif value == 2:            ftp_sort_by = RemoteView.COL_SIZE        elif value == 3:            ftp_sort_by = RemoteView.COL_GROUP        elif value == 4:            ftp_sort_by = RemoteView.COL_DATE        elif value == 5:            ftp_sort_by = RemoteView.COL_TYPE        else:            raise ValueError        value = config_value(self.__config, 'display', 'ftp_order')        ftp_order = value        self.__model.set_sort_column_id(ftp_sort_by, ftp_order)        # add config change listener        self.__config.notify_add(config_key('display',                                            'display_file_size_as'),                                 self.on_display_file_size_as_change)        # setup fonts        self.__use_custom_file_listing_font = config_value(            self.__config, 'display', 'use_custom_file_listing_font')        self.__file_listing_font = config_value(            self.__config, 'display', 'file_listing_font')        self.__change_font()        self.__config.notify_add(            config_key('display', 'use_custom_file_listing_font'),            self.on_use_custom_file_listing_font_change)        self.__config.notify_add(            config_key('display', 'file_listing_font'),            self.on_file_listing_font_change)        # setup column resize        self.__config.notify_add(            config_key('display', 'auto_size_file_list_columns'),            self.on_auto_size_file_list_columns_change)        auto_size_file_list_columns = config_value(            self.__config, 'display', 'auto_size_file_list_columns')        for column in self.__list.get_columns():            if auto_size_file_list_columns:                column.set_sizing(TREE_VIEW_COLUMN_AUTOSIZE)            else:                column.set_sizing(TREE_VIEW_COLUMN_GROW_ONLY)        # setup show idle time        self.__show_idle_time = config_value(self.__config, 'display',                                             'show_site_idle_time')        self.__config.notify_add(            config_key('display', 'show_site_idle_time'),            self.on_show_site_idle_time_change)        # rules hint        self.__list.set_property('rules-hint',                                 config_value(self.__config, 'display',                                              'rules_hint'))        self.__config.notify_add(            config_key('display', 'rules_hint'),            lambda config, id, entry, *args: self.__list.set_property('rules-hint', entry.value.get_bool()))                self.__frame4 = self.__xml.get_widget('frame_remote_4')        self.__frame5 = self.__xml.get_widget('frame_remote_5')        self.active_indicator = self.__xml.get_widget('eb_remote')        self.__status1 = self.__xml.get_widget('label_remote_status1')        self.__status2 = self.__xml.get_widget('label_remote_status2')        # connect widget with action        for widget_name, action_name in WIDGET_ACTIONS.items():            widget = self.__xml.get_widget(widget_name)            self.actions[action_name].attach(widget)        self.__menu = self.__menu_xml.get_widget('remote_file_list_menu')        for widget_name, action_name in MENU_ACTIONS.items():            widget = self.__menu_xml.get_widget(widget_name)            self.actions[action_name].attach(widget)                    self.__list.connect('button-release-event',                            self.on_list_button_release)        self.__list.connect('button-press-event',                            self.on_list_button_press)    def __getattr__(self, name):        if name == 'model':            return self.__model        elif name == 'ftp_engine':

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -