📄 remote_view.py
字号:
#!/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 + -