def __init__(self, images, tabclosers=False, show_hilite_image=True, show_status_image=False, notebookraw=None): # We store the real Gtk.Notebook object self.notebook = notebookraw self.notebook.set_show_border(False) self.tabclosers = tabclosers self.images = images self._show_hilite_image = show_hilite_image self._show_status_image = show_status_image self.key_controller = connect_key_press_event(self.notebook, self.on_key_press_event) self.notebook.connect("switch-page", self.on_switch_page) self.unread_button = Gtk.MenuButton.new() if Gtk.get_major_version() == 4: self.window = self.notebook.get_root() self.unread_button.set_icon_name("emblem-important-symbolic") self.unread_button.set_has_frame(False) else: self.window = self.notebook.get_toplevel() self.popup_enable() self.unread_button.set_image( Gtk.Image.new_from_icon_name("emblem-important-symbolic", Gtk.IconSize.BUTTON)) self.unread_button.set_relief(Gtk.ReliefStyle.NONE) self.unread_button.set_tooltip_text(_("Unread Tabs")) self.unread_button.set_halign(Gtk.Align.CENTER) self.unread_button.set_valign(Gtk.Align.CENTER) context = self.unread_button.get_style_context() context.add_class("circular") self.notebook.set_action_widget(self.unread_button, Gtk.PackType.END) self.popup_menu_unread = PopupMenu(widget=self.unread_button, connect_events=False) self.unread_button.set_menu_model(self.popup_menu_unread) self.unread_pages = [] self.notebook.hide()
def __init__(self, textview, search_bar, entry): self.textview = textview self.search_bar = search_bar self.entry = entry self.search_bar.connect_entry(self.entry) self.entry.connect("activate", self.on_search_next_match) self.entry.connect("search-changed", self.on_search_changed) self.entry.connect("previous-match", self.on_search_previous_match) self.entry.connect("next-match", self.on_search_next_match) self.key_controller = connect_key_press_event(self.textview, self.on_key_press_event)
def __init__(self, frame, entry, entity, message_class, send_message, command_list, textview, is_chatroom=False): self.frame = frame self.entry = entry self.entity = entity self.message_class = message_class self.send_message = send_message self.command_list = command_list self.textview = textview self.is_chatroom = is_chatroom self.completion_list = None entry.connect("activate", self.on_enter) self.entry_changed_handler = entry.connect("changed", self.on_entry_changed) self.key_controller = connect_key_press_event(entry, self.on_key_press_event) # Spell Check if config.sections["ui"]["spellcheck"]: if not self.frame.spell_checker: self.frame.init_spell_checker() if self.frame.spell_checker: from gi.repository import Gspell spell_buffer = Gspell.EntryBuffer.get_from_gtk_entry_buffer(entry.get_buffer()) spell_buffer.set_spell_checker(self.frame.spell_checker) spell_view = Gspell.Entry.get_from_gtk_entry(entry) spell_view.set_inline_spell_checking(True) self.midwaycompletion = False # True if the user just used tab completion self.completions = {} # Holds temp. information about tab completoin completion = Gtk.EntryCompletion() list_store = Gtk.ListStore(str) completion.set_model(list_store) completion.set_text_column(0) completion.set_match_func(self.entry_completion_find_match) completion.connect("match-selected", self.entry_completion_found_match) entry.set_completion(completion) self.column_numbers = list(range(list_store.get_n_columns()))
def __init__(self, userbrowses, user): self.userbrowses = userbrowses self.frame = userbrowses.frame # Build the window load_ui_elements( self, os.path.join(self.frame.gui_dir, "ui", "userbrowse.ui")) self.info_bar = InfoBar(self.InfoBar, Gtk.MessageType.INFO) self.key_controller_folder = connect_key_press_event( self.FolderTreeView, self.on_folder_key_press_event) self.key_controller_file = connect_key_press_event( self.FileTreeView, self.on_file_key_press_event) if Gtk.get_major_version() == 4: self.MainPaned.set_resize_start_child(True) else: self.MainPaned.child_set_property(self.FolderPane, "resize", True) self.user = user self.conn = None self.local_shares_type = None # selected_folder is the current selected folder self.selected_folder = None # queued_folder is a folder that should be opened once the share has loaded self.queued_folder = None self.search_list = [] self.query = None self.search_position = 0 self.selected_files = {} self.shares = [] # Iters for current DirStore self.directories = {} # Iters for current FileStore self.files = {} self.totalsize = 0 self.dir_store = Gtk.TreeStore(str, str) self.FolderTreeView.set_model(self.dir_store) self.dir_column_numbers = list(range(self.dir_store.get_n_columns())) cols = initialise_columns( None, self.FolderTreeView, ["folders", _("Folders"), -1, "text", None] # 0 ) cols["folders"].set_sort_column_id(0) self.user_popup = popup = PopupMenu(self.frame, None, self.on_tab_popup) popup.setup_user_menu(user, page="userbrowse") popup.setup(("", None), ("#" + _("_Save Shares List to Disk"), self.on_save), ("#" + _("Close All Tabs..."), self.on_close_all_tabs), ("#" + _("_Close Tab"), self.on_close)) self.popup_menu_downloads_folders = PopupMenu(self.frame) self.popup_menu_downloads_folders.setup( ("#" + _("_Download Folder"), self.on_download_directory), ("#" + _("Download Folder _To..."), self.on_download_directory_to), ("#" + _("Download _Recursive"), self.on_download_directory_recursive), ("#" + _("Download R_ecursive To..."), self.on_download_directory_recursive_to)) self.popup_menu_downloads_files = PopupMenu(self.frame) self.popup_menu_downloads_files.setup( ("#" + _("_Download File(s)"), self.on_download_files), ("#" + _("Download _To..."), self.on_download_files_to), ("", None), ("#" + _("_Download Folder"), self.on_download_directory), ("#" + _("Download Folder _To..."), self.on_download_directory_to), ("#" + _("Download _Recursive"), self.on_download_directory_recursive), ("#" + _("Download R_ecursive To..."), self.on_download_directory_recursive_to)) self.popup_menu_uploads_folders = PopupMenu(self.frame) self.popup_menu_uploads_folders.setup( ("#" + _("Upload Folder To..."), self.on_upload_directory_to), ("#" + _("Upload Folder Recursive To..."), self.on_upload_directory_recursive_to)) self.popup_menu_uploads_files = PopupMenu(self.frame) self.popup_menu_uploads_files.setup( ("#" + _("Upload Folder To..."), self.on_upload_directory_to), ("#" + _("Upload Folder Recursive To..."), self.on_upload_directory_recursive_to), ("#" + _("Up_load File(s)"), self.on_upload_files)) self.folder_popup_menu = PopupMenu(self.frame, self.FolderTreeView, self.on_folder_popup_menu) if user == config.sections["server"]["login"]: self.folder_popup_menu.setup( ("#" + _("_Download Folder"), self.on_download_directory), ("#" + _("Download Folder _To..."), self.on_download_directory_to), ("#" + _("Download _Recursive"), self.on_download_directory_recursive), ("#" + _("Download R_ecursive To..."), self.on_download_directory_recursive_to), ("", None), ("#" + _("Upload Folder To..."), self.on_upload_directory_to), ("#" + _("Upload Folder Recursive To..."), self.on_upload_directory_recursive_to), ("", None), ("#" + _("Open in File _Manager"), self.on_file_manager), ("", None), ("#" + _("Copy _Folder Path"), self.on_copy_folder_path), ("#" + _("Copy _URL"), self.on_copy_dir_url), ("", None), (">" + _("User"), self.user_popup)) else: self.folder_popup_menu.setup( ("#" + _("_Download Folder"), self.on_download_directory), ("#" + _("Download Folder _To..."), self.on_download_directory_to), ("#" + _("Download _Recursive"), self.on_download_directory_recursive), ("#" + _("Download R_ecursive To..."), self.on_download_directory_recursive_to), ("", None), ("#" + _("Copy _Folder Path"), self.on_copy_folder_path), ("#" + _("Copy _URL"), self.on_copy_dir_url), ("", None), (">" + _("User"), self.user_popup)) self.FolderTreeView.get_selection().connect("changed", self.on_select_dir) self.file_store = Gtk.ListStore( str, # (0) file name str, # (1) hsize str, # (2) hbitrate str, # (3) hlength GObject.TYPE_UINT64, # (4) size GObject.TYPE_UINT64, # (5) bitrate GObject.TYPE_UINT64 # (6) length ) self.FileTreeView.set_model(self.file_store) self.file_column_numbers = [ i for i in range(self.file_store.get_n_columns()) ] cols = initialise_columns( "user_browse", self.FileTreeView, ["filename", _("Filename"), 600, "text", None], ["size", _("Size"), 100, "number", None], ["bitrate", _("Bitrate"), 100, "number", None], ["length", _("Length"), 100, "number", None]) cols["filename"].set_sort_column_id(0) cols["size"].set_sort_column_id(4) cols["bitrate"].set_sort_column_id(5) cols["length"].set_sort_column_id(6) self.file_popup_menu = PopupMenu(self.frame, self.FileTreeView, self.on_file_popup_menu) if user == config.sections["server"]["login"]: self.file_popup_menu.setup( ("#" + "selected_files", None), ("", None), (">" + _("Download"), self.popup_menu_downloads_files), (">" + _("Upload"), self.popup_menu_uploads_files), ("", None), ("#" + _("Send to _Player"), self.on_play_files), ("#" + _("Open in File _Manager"), self.on_file_manager), ("#" + _("File _Properties"), self.on_file_properties), ("", None), ("#" + _("Copy _File Path"), self.on_copy_file_path), ("#" + _("Copy _URL"), self.on_copy_url), ("", None), (">" + _("User"), self.user_popup)) else: self.file_popup_menu.setup( ("#" + "selected_files", None), ("", None), (">" + _("Download"), self.popup_menu_downloads_files), ("", None), ("#" + _("File _Properties"), self.on_file_properties), ("", None), ("#" + _("Copy _File Path"), self.on_copy_file_path), ("#" + _("Copy _URL"), self.on_copy_url), ("", None), (">" + _("User"), self.user_popup)) self.update_visuals()
def __init__(self, frame, type): self.frame = frame self.type = type load_ui_elements(self, os.path.join(frame.gui_dir, "ui", type + "s.ui")) getattr(frame, type + "svbox").add(self.Main) grouping_button = getattr(frame, "ToggleTree%ss" % self.type.title()) if Gtk.get_major_version() == 4: grouping_button.set_icon_name("view-list-symbolic") self.ClearTransfers.set_has_frame(False) self.ClearTransfers.set_label(self.ClearTransfersLabel.get_first_child().get_text()) else: grouping_button.set_image(Gtk.Image.new_from_icon_name("view-list-symbolic", Gtk.IconSize.BUTTON)) self.ClearTransfers.add(self.ClearTransfersLabel) self.key_controller = connect_key_press_event(self.Transfers, self.on_key_press_event) self.last_ui_update = self.last_save = 0 self.transfer_list = [] self.users = {} self.paths = {} # Status list self.statuses = {} self.statuses["Queued"] = _("Queued") self.statuses["Getting status"] = _("Getting status") self.statuses["Establishing connection"] = _("Establishing connection") self.statuses["Transferring"] = _("Transferring") self.statuses["Cannot connect"] = _("Cannot connect") self.statuses["User logged off"] = _("User logged off") self.statuses["Connection closed by peer"] = _("Connection closed by peer") self.statuses["Aborted"] = _("Aborted") self.statuses["Finished"] = _("Finished") self.statuses["Filtered"] = _("Filtered") self.statuses["File not shared"] = _("File not shared") self.statuses["File not shared."] = _("File not shared") # The official client sends a variant containing a dot self.statuses["Download folder error"] = _("Download folder error") self.statuses["Local file error"] = _("Local file error") self.statuses["Remote file error"] = _("Remote file error") # String templates self.extension_list_template = _("All %(ext)s") self.files_template = _("%(number)2s files ") self.transfersmodel = Gtk.TreeStore( str, # (0) user str, # (1) path str, # (2) file name str, # (3) status str, # (4) hqueue position GObject.TYPE_UINT64, # (5) percent str, # (6) hsize str, # (7) hspeed str, # (8) htime elapsed str, # (9) time left str, # (10) path str, # (11) status (non-translated) GObject.TYPE_UINT64, # (12) size GObject.TYPE_UINT64, # (13) current bytes GObject.TYPE_UINT64, # (14) speed GObject.TYPE_UINT64, # (15) time elapsed GObject.TYPE_UINT64, # (16) file count GObject.TYPE_UINT64, # (17) queue position GObject.TYPE_PYOBJECT # (18) transfer object ) self.column_numbers = list(range(self.transfersmodel.get_n_columns())) self.cols = cols = initialise_columns( type, self.Transfers, ["user", _("User"), 200, "text", None], ["path", _("Path"), 400, "text", None], ["filename", _("Filename"), 400, "text", None], ["status", _("Status"), 140, "text", None], ["queue_position", _("Queue Position"), 50, "number", None], ["percent", _("Percent"), 70, "progress", None], ["size", _("Size"), 170, "number", None], ["speed", _("Speed"), 90, "number", None], ["time_elapsed", _("Time Elapsed"), 140, "number", None], ["time_left", _("Time Left"), 140, "number", None], ) cols["user"].set_sort_column_id(0) cols["path"].set_sort_column_id(1) cols["filename"].set_sort_column_id(2) cols["status"].set_sort_column_id(11) cols["queue_position"].set_sort_column_id(17) cols["percent"].set_sort_column_id(5) cols["size"].set_sort_column_id(12) cols["speed"].set_sort_column_id(14) cols["time_elapsed"].set_sort_column_id(8) cols["time_left"].set_sort_column_id(9) self.Transfers.set_model(self.transfersmodel) self.expand_button = getattr(frame, "Expand%ss" % self.type.title()) state = GLib.Variant.new_string(verify_grouping_mode(config.sections["transfers"]["group%ss" % self.type])) action = Gio.SimpleAction.new_stateful("%sgrouping" % self.type, GLib.VariantType.new("s"), state) action.connect("change-state", self.on_toggle_tree) frame.MainWindow.add_action(action) action.change_state(state) menu = create_grouping_menu( frame.MainWindow, config.sections["transfers"]["group%ss" % self.type], self.on_toggle_tree) grouping_button.set_menu_model(menu) self.expand_button.connect("toggled", self.on_expand_tree) self.expand_button.set_active(config.sections["transfers"]["%ssexpanded" % self.type]) self.popup_menu_users = PopupMenu(frame) self.popup_menu_clear = PopupMenu(frame) self.ClearTransfers.set_menu_model(self.popup_menu_clear) self.popup_menu = PopupMenu(frame, self.Transfers, self.on_popup_menu) self.popup_menu.setup( ("#" + "selected_files", None), ("", None), ("#" + _("Send to _Player"), self.on_play_files), ("#" + _("_Open in File Manager"), self.on_open_directory), ("", None), ("#" + _("Copy _File Path"), self.on_copy_file_path), ("#" + _("Copy _URL"), self.on_copy_url), ("#" + _("Copy Folder URL"), self.on_copy_dir_url), ("", None), ("#" + _("_Search"), self.on_file_search), ("#" + _("_Browse Folder(s)"), self.on_browse_folder), ("#" + _("File P_roperties"), self.on_file_properties), (">" + _("User(s)"), self.popup_menu_users), ("", None), ("#" + _("_Retry"), self.on_retry_transfer), ("#" + _("Abor_t"), self.on_abort_transfer), ("#" + _("_Clear"), self.on_clear_transfer), ("", None), (">" + _("Clear Groups"), self.popup_menu_clear) ) self.update_visuals()
def __init__(self, searches, text, id, mode, remember, showtab): self.searches = searches self.frame = searches.frame # Build the window load_ui_elements(self, os.path.join(self.frame.gui_dir, "ui", "search.ui")) load_ui_elements( self, os.path.join(self.frame.gui_dir, "ui", "popovers", "searchfilters.ui")) self.key_controller = connect_key_press_event(self.ResultsList, self.on_key_press_event) self.ShowSearchHelp.set_popover(self.AboutSearchFiltersPopover) if Gtk.get_major_version() == 4: self.ResultGrouping.set_icon_name("view-list-symbolic") self.ShowSearchHelp.set_icon_name("dialog-question-symbolic") else: self.ResultGrouping.set_image( Gtk.Image.new_from_icon_name("view-list-symbolic", Gtk.IconSize.BUTTON)) self.ShowSearchHelp.set_image( Gtk.Image.new_from_icon_name("dialog-question-symbolic", Gtk.IconSize.BUTTON)) self.text = text self.searchterm_words_include = [ p for p in text.lower().split() if not p.startswith('-') ] self.searchterm_words_ignore = [ p[1:] for p in text.lower().split() if p.startswith('-') and len(p) > 1 ] self.id = id self.mode = mode self.remember = remember self.showtab = showtab self.usersiters = {} self.directoryiters = {} self.users = set() self.all_data = [] self.filters = None self.clearing_filters = False self.resultslimit = 2000 self.numvisibleresults = 0 self.active_filter_count = 0 self.operators = { '<': operator.lt, '<=': operator.le, '==': operator.eq, '!=': operator.ne, '>=': operator.ge, '>': operator.gt } if mode not in ("global", "wishlist"): self.RememberCheckButton.hide() self.RememberCheckButton.set_active(remember) """ Columns """ self.resultsmodel = Gtk.TreeStore( GObject.TYPE_UINT64, # (0) num str, # (1) user GObject.TYPE_OBJECT, # (2) flag str, # (3) immediatedl str, # (4) h_speed str, # (5) h_queue str, # (6) directory str, # (7) filename str, # (8) h_size str, # (9) h_bitrate str, # (10) h_length GObject.TYPE_UINT64, # (11) bitrate str, # (12) fullpath str, # (13) country GObject.TYPE_UINT64, # (14) size GObject.TYPE_UINT64, # (15) speed GObject.TYPE_UINT64, # (16) queue GObject.TYPE_UINT64, # (17) length str # (18) color ) self.column_numbers = list(range(self.resultsmodel.get_n_columns())) color_col = 18 self.cols = cols = initialise_columns( "file_search", self.ResultsList, ["id", _("ID"), 50, "text", color_col], ["user", _("User"), 200, "text", color_col], ["country", _("Country"), 25, "pixbuf", None], [ "immediate_download", _("Immediate Download"), 50, "center", color_col ], ["speed", _("Speed"), 90, "number", color_col], ["in_queue", _("In Queue"), 90, "center", color_col], ["folder", _("Folder"), 400, "text", color_col], ["filename", _("Filename"), 400, "text", color_col], ["size", _("Size"), 100, "number", color_col], ["bitrate", _("Bitrate"), 100, "number", color_col], ["length", _("Length"), 100, "number", color_col]) cols["id"].set_sort_column_id(0) cols["user"].set_sort_column_id(1) cols["country"].set_sort_column_id(13) cols["immediate_download"].set_sort_column_id(3) cols["speed"].set_sort_column_id(15) cols["in_queue"].set_sort_column_id(16) cols["folder"].set_sort_column_id(6) cols["filename"].set_sort_column_id(7) cols["size"].set_sort_column_id(14) cols["bitrate"].set_sort_column_id(11) cols["length"].set_sort_column_id(17) cols["country"].get_widget().hide() self.ResultsList.set_model(self.resultsmodel) self.update_visuals() """ Popup """ self.popup_menu_users = PopupMenu(self.frame) self.popup_menu = PopupMenu(self.frame, self.ResultsList, self.on_popup_menu) self.popup_menu.setup( ("#" + "selected_files", None), ("", None), ("#" + _("_Download File(s)"), self.on_download_files), ("#" + _("Download File(s) _To..."), self.on_download_files_to), ("#" + _("Download _Folder(s)"), self.on_download_folders), ("#" + _("Download F_older(s) To..."), self.on_download_folders_to), ("", None), ("#" + _("_Browse Folder(s)"), self.on_browse_folder), ("#" + _("File _Properties"), self.on_file_properties), ("", None), ("#" + _("Copy _File Path"), self.on_copy_file_path), ("#" + _("Copy _URL"), self.on_copy_url), ("#" + _("Copy Folder U_RL"), self.on_copy_dir_url), ("", None), (">" + _("User(s)"), self.popup_menu_users)) self.tab_menu = PopupMenu(self.frame) self.tab_menu.setup( ("#" + _("Copy Search Term"), self.on_copy_search_term), ("", None), ("#" + _("Clear All Results"), self.on_clear), ("#" + _("Close All Tabs..."), self.on_close_all_tabs), ("#" + _("_Close Tab"), self.on_close)) """ Grouping """ menu = create_grouping_menu( self.frame.MainWindow, config.sections["searches"]["group_searches"], self.on_group) self.ResultGrouping.set_menu_model(menu) self.ExpandButton.set_active( config.sections["searches"]["expand_searches"]) """ Filters """ self.ShowFilters.set_active( config.sections["searches"]["filters_visible"]) self.populate_filters()