def __init__(self, frame): self.frame = frame load_ui_elements( self, os.path.join(self.frame.gui_dir, "ui", "dialogs", "fastconfigure.ui")) self.FastConfigureDialog.set_transient_for(self.frame.MainWindow) self.downloaddir = FileChooserButton(self.downloaddir, self.FastConfigureDialog, "folder") # Page specific, sharepage self.sharelist = Gtk.ListStore(str, str) self.column_numbers = list(range(self.sharelist.get_n_columns())) initialise_columns( None, self.shareddirectoriestree, ["virtual_folder", _("Virtual Folder"), 0, "text", None], ["folder", _("Folder"), 0, "text", None]) self.shareddirectoriestree.set_model(self.sharelist)
def __init__(self, frame): super().__init__("ui/popovers/chathistory.ui") self.frame = frame self.iters = {} self.model = Gtk.ListStore(str, str) self.list_view.set_model(self.model) self.column_numbers = list(range(self.model.get_n_columns())) self.cols = initialise_columns( frame, None, self.list_view, ["user", _("User"), 175, "text", None], ["latest_message", _("Latest Message"), -1, "text", None] ) self.cols["user"].set_sort_column_id(0) self.cols["latest_message"].set_sort_column_id(1) CompletionEntry(frame.PrivateChatEntry, self.model, column=0) if Gtk.get_major_version() == 4: frame.PrivateChatHistory.get_first_child().get_style_context().add_class("arrow-button") frame.PrivateChatHistory.set_popover(self.popover) self.load_users()
def __init__(self, frame): super().__init__("ui/dialogs/fastconfigure.ui") self.frame = frame set_dialog_properties(self.FastConfigureDialog, frame.MainWindow) for page in (self.welcomepage, self.userpasspage, self.portpage, self.sharepage, self.summarypage): self.FastConfigureDialog.append_page(page) if Gtk.get_major_version() == 3: self.FastConfigureDialog.child_set_property(page, "has-padding", False) self.FastConfigureDialog.set_page_type(self.welcomepage, Gtk.AssistantPageType.CUSTOM) self.FastConfigureDialog.set_page_type(self.summarypage, Gtk.AssistantPageType.SUMMARY) logo = get_icon("n") if logo: self.icon.set_property("gicon", logo) else: self.icon.set_property("icon-name", config.application_id) # Page specific, sharepage self.downloaddir = FileChooserButton(self.downloaddir, self.FastConfigureDialog, "folder") self.shared_folders = None self.sharelist = Gtk.ListStore( str, str ) self.column_numbers = list(range(self.sharelist.get_n_columns())) initialise_columns( frame, None, self.shareddirectoriestree, ["virtual_folder", _("Virtual Folder"), 0, "text", None], ["folder", _("Folder"), 0, "text", None] ) self.shareddirectoriestree.set_model(self.sharelist)
def __init__(self, frame): self.frame = frame load_ui_elements( self, os.path.join(self.frame.gui_dir, "ui", "dialogs", "fastconfigure.ui")) set_dialog_properties(self.FastConfigureDialog, frame.MainWindow, type_hint="dialog") for page in (self.welcomepage, self.userpasspage, self.portpage, self.sharepage, self.summarypage): self.FastConfigureDialog.append_page(page) if Gtk.get_major_version() == 3: self.FastConfigureDialog.child_set_property( page, "has-padding", False) self.FastConfigureDialog.set_page_type(self.welcomepage, Gtk.AssistantPageType.CUSTOM) self.FastConfigureDialog.set_page_type(self.summarypage, Gtk.AssistantPageType.SUMMARY) # Page specific, sharepage self.downloaddir = FileChooserButton(self.downloaddir, self.FastConfigureDialog, "folder") self.sharelist = Gtk.ListStore(str, str) self.column_numbers = list(range(self.sharelist.get_n_columns())) initialise_columns( None, self.shareddirectoriestree, ["virtual_folder", _("Virtual Folder"), 0, "text", None], ["folder", _("Folder"), 0, "text", None]) self.shareddirectoriestree.set_model(self.sharelist)
def __init__(self, frame): super().__init__("ui/popovers/roomlist.ui") self.frame = frame self.room_iters = {} self.initializing_feed = False self.room_model = Gtk.ListStore(str, int, Pango.Weight, Pango.Underline) self.room_filter = self.room_model.filter_new() self.room_filter.set_visible_func(self.room_match_function) self.room_model_filtered = Gtk.TreeModelSort(model=self.room_filter) self.list_view.set_model(self.room_model_filtered) self.column_numbers = list(range(self.room_model.get_n_columns())) attribute_columns = (2, 3) self.cols = initialise_columns( frame, None, self.list_view, ["room", _("Room"), 260, "text", attribute_columns], ["users", _("Users"), 100, "number", attribute_columns]) self.cols["room"].set_sort_column_id(0) self.cols["users"].set_sort_column_id(1) self.popup_room = None self.popup_menu = PopupMenu(self.frame, self.list_view, self.on_popup_menu) self.popup_menu.add_items(("#" + _("Join Room"), self.on_popup_join), ("#" + _("Leave Room"), self.on_popup_leave), ("", None), ("#" + _("Disown Private Room"), self.on_popup_private_room_disown), ("#" + _("Cancel Room Membership"), self.on_popup_private_room_dismember)) self.private_room_check.set_active( config.sections["server"]["private_chatrooms"]) self.private_room_check.connect("toggled", self.on_toggle_accept_private_room) Accelerator("<Primary>f", self.popover, self.on_search_accelerator) CompletionEntry(frame.ChatroomsEntry, self.room_model, column=0) if Gtk.get_major_version() == 4: frame.RoomList.get_first_child().get_style_context().add_class( "arrow-button") frame.RoomList.set_popover(self.popover)
def __init__(self, frame, joined_rooms, private_rooms): # Build the window self.frame = frame self.server_rooms = set() self.joined_rooms = joined_rooms self.private_rooms = private_rooms load_ui_elements( self, os.path.join(self.frame.gui_dir, "ui", "popovers", "roomlist.ui")) self.room_model = Gtk.ListStore(str, int, int) self.column_numbers = list(range(self.room_model.get_n_columns())) self.cols = initialise_columns( None, self.RoomsList, ["room", _("Room"), 260, "text", self.room_status], ["users", _("Users"), 100, "number", self.room_status]) self.cols["room"].set_sort_column_id(0) self.cols["users"].set_sort_column_id(1) self.popup_room = None self.popup_menu = PopupMenu(self.frame) self.popup_menu.setup( ("#" + _("Join Room"), self.on_popup_join), ("#" + _("Leave Room"), self.on_popup_leave), ("", None), ("#" + _("Disown Private Room"), self.on_popup_private_room_disown), ("#" + _("Cancel Room Membership"), self.on_popup_private_room_dismember), ("", None), ("#" + _("Join Public Room"), self.on_join_public_room)) self.RoomsList.connect("button_press_event", self.on_list_clicked) self.RoomsList.connect("popup-menu", self.on_popup_menu) self.RoomsList.connect("touch_event", self.on_list_clicked) self.RoomsList.set_headers_clickable(True) self.search_iter = None self.query = "" self.AcceptPrivateRoom.set_active( config.sections["server"]["private_chatrooms"]) self.AcceptPrivateRoom.connect("toggled", self.on_toggle_accept_private_room) frame.RoomList.connect("clicked", self.show) self.RoomListPopover.set_relative_to(frame.RoomList)
def __init__(self, frame, searches): self.disconnected = False self.frame = frame self.interval = 0 self.searches = searches self.timer = None self.wishes = {} load_ui_elements( self, os.path.join(self.frame.gui_dir, "ui", "dialogs", "wishlist.ui")) self.dialog = generic_dialog(parent=frame.MainWindow, content_box=self.Main, quit_callback=self.hide, title=_("Search Wishlist"), width=600, height=600) self.store = Gtk.ListStore(str) self.column_numbers = list(range(self.store.get_n_columns())) cols = initialise_columns( None, self.WishlistView, ["wishes", _("Wishes"), -1, "text", None]) self.WishlistView.set_model(self.store) self.store.set_sort_column_id(0, Gtk.SortType.ASCENDING) for wish in config.sections["server"]["autosearch"]: wish = str(wish) self.wishes[wish] = self.store.insert_with_valuesv( -1, self.column_numbers, [wish]) renderers = cols["wishes"].get_cells() for render in renderers: render.set_property('editable', True) render.connect('edited', self.cell_edited_callback, self.WishlistView, 0) frame.WishList.connect("clicked", self.show)
def __init__(self, frame, searches): super().__init__("ui/dialogs/wishlist.ui") self.dialog = generic_dialog(parent=frame.MainWindow, modal=False, content_box=self.main, quit_callback=self.hide, title=_("Wishlist"), width=600, height=600) self.frame = frame self.searches = searches self.timer = None self.wishes = {} self.store = Gtk.ListStore(str) self.column_numbers = list(range(self.store.get_n_columns())) cols = initialise_columns(frame, None, self.list_view, ["wish", _("Wish"), -1, "text", None]) cols["wish"].set_sort_column_id(0) self.store.set_sort_column_id(0, Gtk.SortType.ASCENDING) self.list_view.set_model(self.store) for wish in config.sections["server"]["autosearch"]: wish = str(wish) self.wishes[wish] = self.store.insert_with_valuesv( -1, self.column_numbers, [wish]) CompletionEntry(self.wish_entry, self.store) Accelerator("Delete", self.list_view, self.on_remove_wish) Accelerator("<Shift>Tab", self.list_view, self.on_list_focus_entry_accelerator) # skip column header
def __init__(self, userbrowses, user): super().__init__("ui/userbrowse.ui") self.userbrowses = userbrowses self.frame = userbrowses.frame self.user = user self.local_shares_type = None self.queued_path = None self.shares = {} self.dir_iters = {} self.dir_user_data = {} self.file_iters = {} self.selected_folder = None self.selected_folder_size = 0 self.selected_files = {} self.num_selected_files = 0 self.search_list = [] self.query = None self.search_position = 0 self.info_bar = InfoBar(self.InfoBar, Gtk.MessageType.INFO) # Setup FolderTreeView self.dir_store = Gtk.TreeStore(str) self.dir_column_numbers = list(range(self.dir_store.get_n_columns())) cols = initialise_columns( self.frame, None, self.FolderTreeView, ["folder", _("Folder"), -1, "text", None]) cols["folder"].set_sort_column_id(0) self.FolderTreeView.get_selection().connect("changed", self.on_select_dir) self.FolderTreeView.set_model(self.dir_store) # Popup Menu (FolderTreeView) self.user_popup = popup = PopupMenu(self.frame, None, self.on_tab_popup) popup.setup_user_menu(user, page="userbrowse") popup.add_items(("", None), ("#" + _("_Save Shares List to Disk"), self.on_save), ("#" + _("Close All Tabs…"), self.on_close_all_tabs), ("#" + _("_Close Tab"), self.on_close)) self.folder_popup_menu = PopupMenu(self.frame, self.FolderTreeView, self.on_folder_popup_menu) if user == config.sections["server"]["login"]: self.folder_popup_menu.add_items( ("#" + _("Upload Folder…"), self.on_upload_directory_to), ("#" + _("Upload Folder & Subfolder(s)…"), self.on_upload_directory_recursive_to), ("", None), ("#" + _("Open in File _Manager"), self.on_file_manager), ("#" + _("F_ile Properties"), self.on_file_properties, True), ("", 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.add_items( ("#" + _("_Download Folder"), self.on_download_directory), ("#" + _("Download Folder _To…"), self.on_download_directory_to), ("#" + _("Download Folder & Subfolder(s)"), self.on_download_directory_recursive), ("#" + _("Download Folder & Subfolder(s) To…"), self.on_download_directory_recursive_to), ("", None), ("#" + _("F_ile Properties"), self.on_file_properties, True), ("", None), ("#" + _("Copy _Folder Path"), self.on_copy_folder_path), ("#" + _("Copy _URL"), self.on_copy_dir_url), ("", None), (">" + _("User"), self.user_popup)) # Setup FileTreeView self.treeview_name = "user_browse" 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.file_column_offsets = {} self.file_column_numbers = list(range(self.file_store.get_n_columns())) cols = initialise_columns( self.frame, "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.FileTreeView.get_selection().connect("changed", self.on_select_file) self.FileTreeView.set_model(self.file_store) for column in self.FileTreeView.get_columns(): self.file_column_offsets[column.get_title()] = 0 column.connect("notify::x-offset", self.on_column_position_changed) # Popup Menu (FileTreeView) self.file_popup_menu = PopupMenu(self.frame, self.FileTreeView, self.on_file_popup_menu) if user == config.sections["server"]["login"]: self.file_popup_menu.add_items( ("#" + "selected_files", None), ("", None), ("#" + _("Up_load File(s)…"), self.on_upload_files), ("#" + _("Upload Folder…"), self.on_upload_directory_to), ("", None), ("#" + _("Send to _Player"), self.on_play_files), ("#" + _("Open in File _Manager"), self.on_file_manager), ("#" + _("F_ile 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.add_items( ("#" + "selected_files", None), ("", None), ("#" + _("_Download File(s)"), self.on_download_files), ("#" + _("Download File(s) _To…"), self.on_download_files_to), ("", None), ("#" + _("_Download Folder"), self.on_download_directory), ("#" + _("Download Folder _To…"), self.on_download_directory_to), ("", None), ("#" + _("F_ile 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)) # Key Bindings (FolderTreeView) Accelerator("Left", self.FolderTreeView, self.on_folder_collapse_accelerator) Accelerator("minus", self.FolderTreeView, self.on_folder_collapse_accelerator) # "-" Accelerator("backslash", self.FolderTreeView, self.on_folder_collapse_sub_accelerator) # "\" Accelerator( "equal", self.FolderTreeView, self.on_folder_expand_sub_accelerator) # "=" (for US/UK laptop) Accelerator("Right", self.FolderTreeView, self.on_folder_expand_accelerator) Accelerator("<Shift>Return", self.FolderTreeView, self.on_folder_focus_filetree_accelerator) # brwse into Accelerator("<Primary>Return", self.FolderTreeView, self.on_folder_transfer_to_accelerator) # w/to prompt Accelerator("<Shift><Primary>Return", self.FolderTreeView, self.on_folder_transfer_accelerator) # no prmt Accelerator("<Primary><Alt>Return", self.FolderTreeView, self.on_folder_open_manager_accelerator) Accelerator("<Alt>Return", self.FolderTreeView, self.on_file_properties_accelerator, True) # Key Bindings (FileTreeView) for accelerator in ("<Shift>Tab", "BackSpace", "backslash"): # Avoid header, navigate up, "\" Accelerator(accelerator, self.FileTreeView, self.on_focus_folder_accelerator) Accelerator("Left", self.FileTreeView, self.on_focus_folder_left_accelerator) Accelerator("<Shift>Return", self.FileTreeView, self.on_file_transfer_multi_accelerator) # multi activate Accelerator("<Primary>Return", self.FileTreeView, self.on_file_transfer_to_accelerator) # with to prompt Accelerator("<Shift><Primary>Return", self.FileTreeView, self.on_file_transfer_accelerator) # no prompt Accelerator("<Primary><Alt>Return", self.FileTreeView, self.on_file_open_manager_accelerator) Accelerator("<Alt>Return", self.FileTreeView, self.on_file_properties_accelerator) # Key Bindings (General) for widget in (self.Main, self.FolderTreeView, self.FileTreeView): Accelerator("<Primary>f", widget, self.on_search_accelerator) # Find focus for widget in (self.Main, self.SearchEntry): Accelerator("<Primary>g", widget, self.on_search_next_accelerator) # Next search match Accelerator("<Shift><Primary>g", widget, self.on_search_previous_accelerator) Accelerator("Escape", self.SearchEntry, self.on_search_escape_accelerator) Accelerator("F3", self.Main, self.on_search_next_accelerator) Accelerator("<Shift>F3", self.Main, self.on_search_previous_accelerator) Accelerator( "<Primary>backslash", self.Main, self.on_expand_accelerator) # expand / collapse all (button) Accelerator("F5", self.Main, self.on_refresh_accelerator) Accelerator("<Primary>r", self.Main, self.on_refresh_accelerator) # Refresh Accelerator("<Primary>s", self.Main, self.on_save_accelerator) # Save Shares List self.ExpandButton.set_active(True) self.update_visuals()
def __init__(self, chatrooms, room, users, meta=False): self.chatrooms = chatrooms self.frame = chatrooms.frame self.room = room self.meta = meta # not a real room if set to True # Build the window load_ui_elements( self, os.path.join(self.frame.gui_dir, "ui", "chatrooms.ui")) self.tickers = Tickers() self.room_wall = RoomWall(self.frame, self) self.leaving = False self.users = {} # Log Text Search TextSearchBar(self.RoomLog, self.LogSearchBar, self.LogSearchEntry) # Chat Text Search TextSearchBar(self.ChatScroll, self.ChatSearchBar, self.ChatSearchEntry) # Chat Entry self.entry = ChatEntry(self.frame, self.ChatEntry, room, slskmessages.SayChatroom, self.send_message, self.chatrooms.CMDS, self.ChatScroll, is_chatroom=True) self.Log.set_active(config.sections["logging"]["chatrooms"]) if not self.Log.get_active(): self.Log.set_active((self.room in config.sections["logging"]["rooms"])) self.AutoJoin.set_active((room in config.sections["server"]["autojoin"])) self.toggle_chat_buttons() if room not in config.sections["columns"]["chat_room"]: config.sections["columns"]["chat_room"][room] = {} self.usersmodel = Gtk.ListStore( GObject.TYPE_OBJECT, # (0) status_image GObject.TYPE_OBJECT, # (1) flag str, # (2) username str, # (3) h_speed str, # (4) h_files int, # (5) status GObject.TYPE_UINT64, # (6) avgspeed GObject.TYPE_UINT64, # (7) files str # (8) country ) self.UserList.set_model(self.usersmodel) self.column_numbers = list(range(self.usersmodel.get_n_columns())) self.cols = cols = initialise_columns( ("chat_room", room), self.UserList, ["status", _("Status"), 25, "pixbuf", None], ["country", _("Country"), 25, "pixbuf", None], ["user", _("User"), 100, "text", self.user_column_draw], ["speed", _("Speed"), 100, "number", None], ["files", _("Files"), 100, "number", None]) cols["status"].set_sort_column_id(5) cols["country"].set_sort_column_id(8) cols["user"].set_sort_column_id(2) cols["speed"].set_sort_column_id(6) cols["files"].set_sort_column_id(7) cols["status"].get_widget().hide() cols["country"].get_widget().hide() if config.sections["columns"]["hideflags"]: cols["country"].set_visible(False) for userdata in users: self.add_user_row(userdata) self.usersmodel.set_sort_column_id(2, Gtk.SortType.ASCENDING) self.popup_menu_private_rooms = PopupMenu(self.frame) self.popup_menu = popup = PopupMenu(self.frame) popup.setup_user_menu() popup.setup(("", None), ("#" + _("Sear_ch User's Files"), popup.on_search_user), (">" + _("Private Rooms"), self.popup_menu_private_rooms)) self.activitylogpopupmenu = PopupMenu(self.frame) self.activitylogpopupmenu.setup( ("#" + _("Find"), self.on_find_activity_log), ("", None), ("#" + _("Copy"), self.on_copy_activity_log), ("#" + _("Copy All"), self.on_copy_all_activity_log), ("", None), ("#" + _("Clear Activity View"), self.on_clear_activity_log), ("", None), ("#" + _("_Leave Room"), self.on_leave)) self.roomlogpopmenu = PopupMenu(self.frame) self.roomlogpopmenu.setup( ("#" + _("Find"), self.on_find_room_log), ("", None), ("#" + _("Copy"), self.on_copy_room_log), ("#" + _("Copy All"), self.on_copy_all_room_log), ("", None), ("#" + _("View Room Log"), self.on_view_room_log), ("#" + _("Delete Room Log"), self.on_delete_room_log), ("", None), ("#" + _("Clear Message View"), self.on_clear_messages), ("#" + _("_Leave Room"), self.on_leave)) self.tab_menu = PopupMenu(self.frame) self.tab_menu.setup(("#" + _("_Leave Room"), self.on_leave)) self.ChatEntry.grab_focus() self.set_completion_list(list(self.chatrooms.completion_list)) self.count_users() self.create_tags() self.update_visuals() self.read_room_logs()
def __init__(self, frame, np): self.frame = frame self.np = np load_ui_elements( self, os.path.join(self.frame.gui_dir, "ui", "interests.ui")) self.frame.interestsvbox.add(self.Main) self.likes = {} self.likes_model = Gtk.ListStore(str) self.likes_model.set_sort_column_id(0, Gtk.SortType.ASCENDING) self.likes_column_numbers = list( range(self.likes_model.get_n_columns())) cols = initialise_columns( None, self.LikesList, ["i_like", _("I Like"), -1, "text", None]) cols["i_like"].set_sort_column_id(0) self.LikesList.set_model(self.likes_model) self.dislikes = {} self.dislikes_model = Gtk.ListStore(str) self.dislikes_model.set_sort_column_id(0, Gtk.SortType.ASCENDING) self.dislikes_column_numbers = list( range(self.dislikes_model.get_n_columns())) cols = initialise_columns( None, self.DislikesList, ["i_dislike", _("I Dislike"), -1, "text", None]) cols["i_dislike"].set_sort_column_id(0) self.DislikesList.set_model(self.dislikes_model) self.recommendations_model = Gtk.ListStore( str, # (0) hrating str, # (1) item int # (2) rating ) self.recommendations_column_numbers = list( range(self.recommendations_model.get_n_columns())) cols = initialise_columns( None, self.RecommendationsList, ["rating", _("Rating"), 0, "number", None], ["item", _("Item"), -1, "text", None]) cols["rating"].set_sort_column_id(2) cols["item"].set_sort_column_id(1) self.RecommendationsList.set_model(self.recommendations_model) self.unrecommendations_model = Gtk.ListStore( str, # (0) hrating str, # (1) item int # (2) rating ) self.unrecommendations_column_numbers = list( range(self.unrecommendations_model.get_n_columns())) cols = initialise_columns( None, self.UnrecommendationsList, ["rating", _("Rating"), 0, "number", None], ["item", _("Item"), -1, "text", None]) cols["rating"].set_sort_column_id(2) cols["item"].set_sort_column_id(1) self.UnrecommendationsList.set_model(self.unrecommendations_model) self.recommendation_users = {} self.recommendation_users_model = Gtk.ListStore( GObject.TYPE_OBJECT, # (0) status icon str, # (1) user str, # (2) hspeed str, # (3) hfiles int, # (4) status GObject.TYPE_UINT64, # (5) speed GObject.TYPE_UINT64 # (6) file count ) self.recommendation_users_column_numbers = list( range(self.recommendation_users_model.get_n_columns())) cols = initialise_columns( None, self.RecommendationUsersList, ["status", _("Status"), 25, "pixbuf", None], ["user", _("User"), 100, "text", None], ["speed", _("Speed"), 100, "text", None], ["files", _("Files"), 100, "text", None], ) cols["status"].set_sort_column_id(4) cols["user"].set_sort_column_id(1) cols["speed"].set_sort_column_id(5) cols["files"].set_sort_column_id(6) cols["status"].get_widget().hide() self.RecommendationUsersList.set_model(self.recommendation_users_model) self.recommendation_users_model.set_sort_column_id( 1, Gtk.SortType.ASCENDING) for thing in config.sections["interests"]["likes"]: if thing and isinstance(thing, str): self.likes[thing] = self.likes_model.insert_with_valuesv( -1, self.likes_column_numbers, [thing]) for thing in config.sections["interests"]["dislikes"]: if thing and isinstance(thing, str): self.dislikes[thing] = self.dislikes_model.insert_with_valuesv( -1, self.dislikes_column_numbers, [thing]) """ Popup """ self.til_popup_menu = popup = PopupMenu(self.frame) popup.setup( ("#" + _("_Remove Item"), self.on_remove_thing_i_like), ("#" + _("Re_commendations For Item"), self.on_recommend_item), ("", None), ("#" + _("_Search For Item"), self.on_til_recommend_search)) self.tidl_popup_menu = popup = PopupMenu(self.frame) popup.setup( ("#" + _("_Remove Item"), self.on_remove_thing_i_dislike), ("", None), ("#" + _("_Search For Item"), self.on_tidl_recommend_search)) self.r_popup_menu = popup = PopupMenu(self.frame) popup.setup( ("$" + _("I _Like This"), self.on_like_recommendation), ("$" + _("I _Dislike This"), self.on_dislike_recommendation), ("#" + _("_Recommendations For Item"), self.on_recommend_recommendation), ("", None), ("#" + _("_Search For Item"), self.on_r_recommend_search)) self.ru_popup_menu = popup = PopupMenu(self.frame) popup.setup_user_menu() self.update_visuals()
def __init__(self, frame): super().__init__("ui/buddylist.ui") self.frame = frame self.page_id = "userlist" # Columns self.user_iterators = {} self.usersmodel = Gtk.ListStore( Gio.Icon, # (0) status icon str, # (1) flag str, # (2) username str, # (3) hspeed str, # (4) hfile count bool, # (5) trusted bool, # (6) notify bool, # (7) prioritized str, # (8) hlast seen str, # (9) note int, # (10) status GObject.TYPE_UINT, # (11) speed GObject.TYPE_UINT, # (12) file count int, # (13) last seen str # (14) country ) self.column_numbers = list(range(self.usersmodel.get_n_columns())) self.cols = cols = initialise_columns( frame, "buddy_list", self.UserListTree, ["status", _("Status"), 25, "icon", None], ["country", _("Country"), 25, "icon", None], ["user", _("User"), 250, "text", None], ["speed", _("Speed"), 150, "number", None], ["files", _("Files"), 150, "number", None], ["trusted", _("Trusted"), 0, "toggle", None], ["notify", _("Notify"), 0, "toggle", None], ["privileged", _("Prioritized"), 0, "toggle", None], ["last_seen", _("Last Seen"), 160, "text", None], ["comments", _("Note"), 400, "text", None]) cols["status"].set_sort_column_id(10) cols["country"].set_sort_column_id(14) cols["user"].set_sort_column_id(2) cols["speed"].set_sort_column_id(11) cols["files"].set_sort_column_id(12) cols["trusted"].set_sort_column_id(5) cols["notify"].set_sort_column_id(6) cols["privileged"].set_sort_column_id(7) cols["last_seen"].set_sort_column_id(13) cols["comments"].set_sort_column_id(9) cols["status"].get_widget().hide() cols["country"].get_widget().hide() for render in cols["trusted"].get_cells(): render.connect('toggled', self.cell_toggle_callback, self.UserListTree, 5) for render in cols["notify"].get_cells(): render.connect('toggled', self.cell_toggle_callback, self.UserListTree, 6) for render in cols["privileged"].get_cells(): render.connect('toggled', self.cell_toggle_callback, self.UserListTree, 7) for render in cols["comments"].get_cells(): render.connect('edited', self.cell_edited_callback, self.UserListTree, 9) self.UserListTree.set_model(self.usersmodel) # Lists for row in config.sections["server"]["userlist"]: self.append_user_row(row) self.usersmodel.set_sort_column_id(2, Gtk.SortType.ASCENDING) for combo_box in (self.frame.UserSearchCombo, self.frame.UserInfoCombo, self.frame.UserBrowseCombo): combo_box.set_model(self.usersmodel) combo_box.set_entry_text_column(2) CompletionEntry(combo_box.get_child(), self.usersmodel, column=2) # Popup menus self.popup_menu_private_rooms = PopupMenu(self.frame) self.popup_menu = popup = PopupMenu(frame, self.UserListTree, self.on_popup_menu) popup.setup_user_menu(page="userlist") popup.add_items( ("", None), ("#" + _("Add User _Note…"), self.on_add_note), (">" + _("Private Rooms"), self.popup_menu_private_rooms), ("#" + _("_Remove"), self.on_remove_user)) self.update_visuals()
def __init__(self, frame): # Build the window self.frame = frame load_ui_elements(self, os.path.join(self.frame.gui_dir, "ui", "buddylist.ui")) """ Columns """ self.user_iterators = {} self.usersmodel = Gtk.ListStore( GObject.TYPE_OBJECT, # (0) status icon GObject.TYPE_OBJECT, # (1) flag str, # (2) username str, # (3) hspeed str, # (4) hfile count bool, # (5) trusted bool, # (6) notify bool, # (7) privileged str, # (8) hlast seen str, # (9) comments int, # (10) status GObject.TYPE_UINT64, # (11) speed GObject.TYPE_UINT64, # (12) file count int, # (13) last seen str # (14) country ) self.column_numbers = list(range(self.usersmodel.get_n_columns())) self.cols = cols = initialise_columns( "buddy_list", self.UserListTree, ["status", _("Status"), 25, "pixbuf", None], ["country", _("Country"), 25, "pixbuf", None], ["user", _("User"), 250, "text", None], ["speed", _("Speed"), 150, "number", None], ["files", _("Files"), 150, "number", None], ["trusted", _("Trusted"), 0, "toggle", None], ["notify", _("Notify"), 0, "toggle", None], ["privileged", _("Privileged"), 0, "toggle", None], ["last_seen", _("Last seen"), 160, "text", None], ["comments", _("Comments"), 400, "edit", None] ) cols["status"].set_sort_column_id(10) cols["country"].set_sort_column_id(14) cols["user"].set_sort_column_id(2) cols["speed"].set_sort_column_id(11) cols["files"].set_sort_column_id(12) cols["trusted"].set_sort_column_id(5) cols["notify"].set_sort_column_id(6) cols["privileged"].set_sort_column_id(7) cols["last_seen"].set_sort_column_id(13) cols["comments"].set_sort_column_id(9) cols["status"].get_widget().hide() cols["country"].get_widget().hide() if config.sections["columns"]["hideflags"]: cols["country"].set_visible(False) for render in cols["trusted"].get_cells(): render.connect('toggled', self.cell_toggle_callback, self.UserListTree, 5) for render in cols["notify"].get_cells(): render.connect('toggled', self.cell_toggle_callback, self.UserListTree, 6) for render in cols["privileged"].get_cells(): render.connect('toggled', self.cell_toggle_callback, self.UserListTree, 7) for render in cols["comments"].get_cells(): render.connect('edited', self.cell_edited_callback, self.UserListTree, 9) self.UserListTree.set_model(self.usersmodel) """ Buddy list """ for user in config.sections["server"]["userlist"]: try: username, comment, notify, privileged, trusted, last_seen, country = user except ValueError: # Invalid user row continue try: time_from_epoch = time.mktime(time.strptime(last_seen, "%m/%d/%Y %H:%M:%S")) except ValueError: last_seen = _("Never seen") time_from_epoch = 0 username = str(username) row = [ GObject.Value(GObject.TYPE_OBJECT, self.frame.get_status_image(0)), GObject.Value(GObject.TYPE_OBJECT, self.frame.get_flag_image(country)), username, "", "", bool(trusted), bool(notify), bool(privileged), str(last_seen), str(comment), 0, 0, 0, time_from_epoch, str(country) ] self.user_iterators[username] = self.usersmodel.insert_with_valuesv(0, self.column_numbers, row) self.usersmodel.set_sort_column_id(2, Gtk.SortType.ASCENDING) self.buddies_combo_entries = ( self.frame.UserSearchCombo, self.frame.PrivateChatCombo, self.frame.UserInfoCombo, self.frame.UserBrowseCombo ) self.buddies_combos_fill() """ Popup """ self.popup_menu_private_rooms = PopupMenu(self.frame) self.popup_menu = popup = PopupMenu(frame) popup.setup_user_menu(page="userlist") popup.setup( ("", None), ("$" + _("_Online Notify"), self.on_notify), ("$" + _("_Privileged"), self.on_privileged), ("$" + _("_Trusted"), self.on_trusted), ("", None), (">" + _("Private Rooms"), self.popup_menu_private_rooms), ("#" + _("Edit _Comments"), self.on_edit_comments), ("#" + _("_Remove"), self.on_remove_user) ) self.update_visuals()
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) self.widget = widget = getattr(self, type.title() + "List") self.last_ui_update = self.last_save = 0 self.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 directory error"] = _( "Download directory 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, widget, ["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) widget.set_model(self.transfersmodel) self.group_dropdown = getattr(frame, "ToggleTree%ss" % self.type.title()) self.expand_button = getattr(frame, "Expand%ss" % self.type.title()) self.group_dropdown.connect("changed", self.on_toggle_tree) self.group_dropdown.set_active( config.sections["transfers"]["group%ss" % self.type]) 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.popup_menu = PopupMenu(frame) self.popup_menu.setup( ("#" + "selected_files", None), ("", None), ("#" + _("Send to _Player"), self.on_play_files), ("#" + _("_Open Folder"), self.on_open_directory), ("#" + _("File P_roperties"), self.on_file_properties), ("", 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), (">" + _("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, userinfos, user): super().__init__("ui/userinfo.ui") self.userinfos = userinfos self.frame = userinfos.frame self.info_bar = InfoBar(self.InfoBar, Gtk.MessageType.INFO) self.descr_textview = TextView(self.descr) self.UserLabel.set_text(user) if Gtk.get_major_version() == 4: self.picture = Gtk.Picture(can_shrink=False, halign=Gtk.Align.CENTER, valign=Gtk.Align.CENTER) self.picture_view.set_child(self.picture) self.scroll_controller = Gtk.EventControllerScroll( flags=Gtk.EventControllerScrollFlags.VERTICAL) self.scroll_controller.connect("scroll", self.on_scroll) self.picture_view.add_controller(self.scroll_controller) else: self.picture = Gtk.Image(visible=True) self.picture_view.add(self.picture) self.picture_view.connect("scroll-event", self.on_scroll_event) self.user = user self.picture_data = None self.zoom_factor = 5 self.actual_zoom = 0 # Set up likes list self.likes_store = Gtk.ListStore(str) self.like_column_numbers = list(range( self.likes_store.get_n_columns())) cols = initialise_columns( self.frame, None, self.Likes, ["likes", _("Likes"), 0, "text", None]) cols["likes"].set_sort_column_id(0) self.likes_store.set_sort_column_id(0, Gtk.SortType.ASCENDING) self.Likes.set_model(self.likes_store) # Set up dislikes list self.hates_store = Gtk.ListStore(str) self.hate_column_numbers = list(range( self.hates_store.get_n_columns())) cols = initialise_columns( self.frame, None, self.Hates, ["dislikes", _("Dislikes"), 0, "text", None]) cols["dislikes"].set_sort_column_id(0) self.hates_store.set_sort_column_id(0, Gtk.SortType.ASCENDING) self.Hates.set_model(self.hates_store) # Popup menus self.user_popup = popup = PopupMenu(self.frame, None, self.on_tab_popup) popup.setup_user_menu(user, page="userinfo") popup.add_items(("", None), ("#" + _("Close All Tabs…"), self.on_close_all_tabs), ("#" + _("_Close Tab"), self.on_close)) def get_interest_items(popup): return (("$" + _("I _Like This"), self.on_like_recommendation, popup), ("$" + _("I _Dislike This"), self.on_dislike_recommendation, popup), ("", None), ("#" + _("_Search for Item"), self.on_interest_recommend_search, popup)) popup = PopupMenu(self.frame, self.Likes, self.on_popup_interest_menu) popup.add_items(*get_interest_items(popup)) popup = PopupMenu(self.frame, self.Hates, self.on_popup_interest_menu) popup.add_items(*get_interest_items(popup)) popup = PopupMenu(self.frame, self.picture_view) popup.add_items(("#" + _("Zoom 1:1"), self.make_zoom_normal), ("#" + _("Zoom In"), self.make_zoom_in), ("#" + _("Zoom Out"), self.make_zoom_out), ("", None), ("#" + _("Save Picture"), self.on_save_picture)) 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")) 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() """ Filters """ self.ShowFilters.set_active( config.sections["searches"]["filters_visible"]) self.populate_filters() """ Popup """ self.popup_menu_users = PopupMenu(self.frame) self.popup_menu = PopupMenu(self.frame) 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), ("#" + _("_Browse Folder"), 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 """ self.ResultGrouping.set_active( config.sections["searches"]["group_searches"]) self.ExpandButton.set_active( config.sections["searches"]["expand_searches"])
def __init__(self, chatrooms, room, users, meta=False): self.chatrooms = chatrooms self.frame = chatrooms.frame self.room = room self.meta = meta # not a real room if set to True # Build the window load_ui_elements( self, os.path.join(self.frame.gui_dir, "ui", "chatrooms.ui")) load_ui_elements( self, os.path.join(self.frame.gui_dir, "ui", "popovers", "chatroomcommands.ui")) self.ShowChatHelp.set_popover(self.AboutChatRoomCommandsPopover) if Gtk.get_major_version() == 4: self.ShowChatHelp.set_icon_name("dialog-question-symbolic") self.ChatPaned.set_resize_start_child(True) self.ChatPaned.set_shrink_start_child(False) self.ChatPaned.set_resize_end_child(False) self.ChatPanedSecond.set_shrink_end_child(False) else: self.ShowChatHelp.set_image( Gtk.Image.new_from_icon_name("dialog-question-symbolic", Gtk.IconSize.BUTTON)) self.ChatPaned.child_set_property(self.ChatPanedSecond, "resize", True) self.ChatPaned.child_set_property(self.ChatPanedSecond, "shrink", False) self.ChatPaned.child_set_property(self.UserView, "resize", False) self.ChatPanedSecond.child_set_property(self.ChatView, "shrink", False) self.tickers = Tickers() self.room_wall = RoomWall(self.frame, self) self.leaving = False self.users = {} # Log Text Search TextSearchBar(self.RoomLog, self.LogSearchBar, self.LogSearchEntry) # Chat Text Search TextSearchBar(self.ChatScroll, self.ChatSearchBar, self.ChatSearchEntry) # Chat Entry self.entry = ChatEntry(self.frame, self.ChatEntry, room, slskmessages.SayChatroom, self.send_message, self.frame.np.chatrooms.CMDS, self.ChatScroll, is_chatroom=True) self.Log.set_active(config.sections["logging"]["chatrooms"]) if not self.Log.get_active(): self.Log.set_active((self.room in config.sections["logging"]["rooms"])) self.AutoJoin.set_active((room in config.sections["server"]["autojoin"])) self.toggle_chat_buttons() if room not in config.sections["columns"]["chat_room"]: config.sections["columns"]["chat_room"][room] = {} self.usersmodel = Gtk.ListStore( GObject.TYPE_OBJECT, # (0) status_image GObject.TYPE_OBJECT, # (1) flag str, # (2) username str, # (3) h_speed str, # (4) h_files int, # (5) status GObject.TYPE_UINT64, # (6) avgspeed GObject.TYPE_UINT64, # (7) files str, # (8) country Pango.Weight, # (9) username_weight Pango.Underline # (10) username_underline ) self.UserList.set_model(self.usersmodel) self.column_numbers = list(range(self.usersmodel.get_n_columns())) attribute_columns = (9, 10) self.cols = cols = initialise_columns( ("chat_room", room), self.UserList, ["status", _("Status"), 25, "pixbuf", None], ["country", _("Country"), 25, "pixbuf", None], ["user", _("User"), 100, "text", attribute_columns], ["speed", _("Speed"), 100, "number", None], ["files", _("Files"), 100, "number", None]) cols["status"].set_sort_column_id(5) cols["country"].set_sort_column_id(8) cols["user"].set_sort_column_id(2) cols["speed"].set_sort_column_id(6) cols["files"].set_sort_column_id(7) cols["status"].get_widget().hide() cols["country"].get_widget().hide() if config.sections["columns"]["hideflags"]: cols["country"].set_visible(False) for userdata in users: self.add_user_row(userdata) self.usersmodel.set_sort_column_id(2, Gtk.SortType.ASCENDING) self.popup_menu_private_rooms = PopupMenu(self.frame) self.popup_menu = popup = PopupMenu(self.frame, self.UserList, self.on_popup_menu) popup.setup_user_menu() popup.setup(("", None), ("#" + _("Sear_ch User's Files"), popup.on_search_user), (">" + _("Private Rooms"), self.popup_menu_private_rooms)) PopupMenu(self.frame, self.RoomLog).setup( ("#" + _("Find..."), self.on_find_activity_log), ("", None), ("#" + _("Copy"), self.on_copy_activity_log), ("#" + _("Copy All"), self.on_copy_all_activity_log), ("", None), ("#" + _("Clear Activity View"), self.on_clear_activity_log), ("", None), ("#" + _("_Leave Room"), self.on_leave)) PopupMenu(self.frame, self.ChatScroll).setup( ("#" + _("Find..."), self.on_find_room_log), ("", None), ("#" + _("Copy"), self.on_copy_room_log), ("#" + _("Copy All"), self.on_copy_all_room_log), ("", None), ("#" + _("View Room Log"), self.on_view_room_log), ("#" + _("Delete Room Log..."), self.on_delete_room_log), ("", None), ("#" + _("Clear Message View"), self.on_clear_messages), ("#" + _("_Leave Room"), self.on_leave)) self.tab_menu = PopupMenu(self.frame) self.tab_menu.setup(("#" + _("_Leave Room"), self.on_leave)) self.ChatEntry.grab_focus() self.set_completion_list(list(self.frame.np.chatrooms.completion_list)) self.count_users() self.create_tags() self.update_visuals() self.read_room_logs()
def __init__(self, frame): # Build the window self.frame = frame load_ui_elements( self, os.path.join(self.frame.gui_dir, "ui", "buddylist.ui")) """ Columns """ self.user_iterators = {} self.usersmodel = Gtk.ListStore( GObject.TYPE_OBJECT, # (0) status icon GObject.TYPE_OBJECT, # (1) flag str, # (2) username str, # (3) hspeed str, # (4) hfile count bool, # (5) trusted bool, # (6) notify bool, # (7) privileged str, # (8) hlast seen str, # (9) comments int, # (10) status GObject.TYPE_UINT64, # (11) speed GObject.TYPE_UINT64, # (12) file count int, # (13) last seen str # (14) country ) self.column_numbers = list(range(self.usersmodel.get_n_columns())) self.cols = cols = initialise_columns( "buddy_list", self.UserListTree, ["status", _("Status"), 25, "pixbuf", None], ["country", _("Country"), 25, "pixbuf", None], ["user", _("User"), 250, "text", None], ["speed", _("Speed"), 150, "number", None], ["files", _("Files"), 150, "number", None], ["trusted", _("Trusted"), 0, "toggle", None], ["notify", _("Notify"), 0, "toggle", None], ["privileged", _("Privileged"), 0, "toggle", None], ["last_seen", _("Last seen"), 160, "text", None], ["comments", _("Comments"), 400, "edit", None]) cols["status"].set_sort_column_id(10) cols["country"].set_sort_column_id(14) cols["user"].set_sort_column_id(2) cols["speed"].set_sort_column_id(11) cols["files"].set_sort_column_id(12) cols["trusted"].set_sort_column_id(5) cols["notify"].set_sort_column_id(6) cols["privileged"].set_sort_column_id(7) cols["last_seen"].set_sort_column_id(13) cols["comments"].set_sort_column_id(9) cols["status"].get_widget().hide() cols["country"].get_widget().hide() if config.sections["columns"]["hideflags"]: cols["country"].set_visible(False) for render in cols["trusted"].get_cells(): render.connect('toggled', self.cell_toggle_callback, self.UserListTree, 5) for render in cols["notify"].get_cells(): render.connect('toggled', self.cell_toggle_callback, self.UserListTree, 6) for render in cols["privileged"].get_cells(): render.connect('toggled', self.cell_toggle_callback, self.UserListTree, 7) for render in cols["comments"].get_cells(): render.connect('edited', self.cell_edited_callback, self.UserListTree, 9) self.UserListTree.set_model(self.usersmodel) """ Lists """ for row in config.sections["server"]["userlist"]: self.append_user_row(row) self.usersmodel.set_sort_column_id(2, Gtk.SortType.ASCENDING) self.buddies_combo_entries = (self.frame.UserSearchCombo, self.frame.PrivateChatCombo, self.frame.UserInfoCombo, self.frame.UserBrowseCombo) self.buddies_combos_fill() """ Popup """ self.popup_menu_private_rooms = PopupMenu(self.frame) self.popup_menu = popup = PopupMenu(frame, self.UserListTree, self.on_popup_menu) popup.setup_user_menu(page="userlist") popup.setup(("", None), ("$" + _("_Online Notify"), self.on_notify), ("$" + _("_Privileged"), self.on_privileged), ("$" + _("_Trusted"), self.on_trusted), ("", None), (">" + _("Private Rooms"), self.popup_menu_private_rooms), ("#" + _("Edit _Comments..."), self.on_edit_comments), ("#" + _("_Remove"), self.on_remove_user)) self.update_visuals()
def __init__(self, userinfos, user): self.userinfos = userinfos self.frame = userinfos.frame # Build the window load_ui_elements(self, os.path.join(self.frame.gui_dir, "ui", "userinfo.ui")) self.info_bar = InfoBar(self.InfoBar, Gtk.MessageType.INFO) # Request user status, speed and number of shared files self.frame.np.watch_user(user, force_update=True) # Request user interests self.frame.np.queue.append(slskmessages.UserInterests(user)) self.user = user self.conn = None self._descr = "" self.image_pixbuf = None self.zoom_factor = 5 self.actual_zoom = 0 self.status = 0 self.hates_store = Gtk.ListStore(str) self.Hates.set_model(self.hates_store) self.hate_column_numbers = list(range( self.hates_store.get_n_columns())) cols = initialise_columns( None, self.Hates, ["hates", _("Hates"), 0, "text", None]) cols["hates"].set_sort_column_id(0) self.hates_store.set_sort_column_id(0, Gtk.SortType.ASCENDING) self.likes_store = Gtk.ListStore(str) self.Likes.set_model(self.likes_store) self.like_column_numbers = list(range( self.likes_store.get_n_columns())) cols = initialise_columns( None, self.Likes, ["likes", _("Likes"), 0, "text", None]) cols["likes"].set_sort_column_id(0) self.likes_store.set_sort_column_id(0, Gtk.SortType.ASCENDING) self.tag_local = self.descr.get_buffer().create_tag() self.update_visuals() self.user_popup = popup = PopupMenu(self.frame) popup.setup_user_menu(user, page="userinfo") popup.setup(("", None), ("#" + _("Close All Tabs"), self.on_close_all_tabs), ("#" + _("_Close Tab"), self.on_close)) self.interest_popup_menu = popup = PopupMenu(self.frame) popup.setup( ("$" + _("I _Like This"), self.on_like_recommendation), ("$" + _("I _Dislike This"), self.on_dislike_recommendation), ("", None), ("#" + _("_Search For Item"), self.on_interest_recommend_search)) self.image_menu = popup = PopupMenu(self.frame) popup.setup(("#" + _("Zoom 1:1"), self.make_zoom_normal), ("#" + _("Zoom In"), self.make_zoom_in), ("#" + _("Zoom Out"), self.make_zoom_out), ("", None), ("#" + _("Save Picture"), self.on_save_picture))
def __init__(self, frame, joined_rooms, private_rooms): # Build the window self.frame = frame self.server_rooms = set() self.joined_rooms = joined_rooms self.private_rooms = private_rooms frame.RoomSearchCombo.set_active_id("joined") load_ui_elements( self, os.path.join(self.frame.gui_dir, "ui", "popovers", "roomlist.ui")) self.room_model = Gtk.ListStore(str, int, Pango.Weight, Pango.Underline) self.room_filter = self.room_model.filter_new() self.room_filter.set_visible_func(self.room_match_function) try: self.room_model_filtered = Gtk.TreeModelSort.new_with_model( self.room_filter) except AttributeError: # Older GTK versions self.room_model_filtered = Gtk.TreeModelSort.sort_new_with_model( self.room_filter) self.RoomsList.set_model(self.room_model_filtered) self.column_numbers = list(range(self.room_model.get_n_columns())) attribute_columns = (2, 3) self.cols = initialise_columns( None, self.RoomsList, ["room", _("Room"), 260, "text", attribute_columns], ["users", _("Users"), 100, "number", attribute_columns]) self.cols["room"].set_sort_column_id(0) self.cols["users"].set_sort_column_id(1) self.popup_room = None self.popup_menu = PopupMenu(self.frame, self.RoomsList, self.on_popup_menu) self.popup_menu.setup(("#" + _("Join Room"), self.on_popup_join), ("#" + _("Leave Room"), self.on_popup_leave), ("", None), ("#" + _("Disown Private Room"), self.on_popup_private_room_disown), ("#" + _("Cancel Room Membership"), self.on_popup_private_room_dismember)) self.RoomsList.set_headers_clickable(True) self.search_iter = None self.query = "" self.AcceptPrivateRoom.set_active( config.sections["server"]["private_chatrooms"]) self.AcceptPrivateRoom.connect("toggled", self.on_toggle_accept_private_room) if Gtk.get_major_version() == 4: button = frame.RoomList.get_first_child() button.set_child(frame.RoomListLabel) else: frame.RoomList.add(frame.RoomListLabel) frame.RoomList.set_popover(self.RoomListPopover)
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, userinfos, user): self.userinfos = userinfos self.frame = userinfos.frame # Build the window load_ui_elements(self, os.path.join(self.frame.gui_dir, "ui", "userinfo.ui")) self.info_bar = InfoBar(self.InfoBar, Gtk.MessageType.INFO) if Gtk.get_major_version() == 4: self.image = Gtk.Picture() self.image_container = Gtk.Box() self.image_container.append(self.image) self.ImageViewport.set_child(self.image_container) self.scroll_controller = Gtk.EventControllerScroll.new( Gtk.EventControllerScrollFlags.VERTICAL) self.scroll_controller.connect("scroll", self.on_scroll) self.ImageViewport.add_controller(self.scroll_controller) else: self.image = Gtk.Image() self.image_container = Gtk.EventBox() self.image_container.add(self.image) self.ImageViewport.add(self.image_container) self.ImageViewport.show_all() try: self.scroll_controller = Gtk.EventControllerScroll.new( self.ImageViewport, Gtk.EventControllerScrollFlags.VERTICAL) self.scroll_controller.connect("scroll", self.on_scroll) except AttributeError: # GTK <3.24 self.ImageViewport.connect("scroll-event", self.on_scroll_event) self.user = user self.conn = None self._descr = "" self.image_pixbuf = None self.zoom_factor = 5 self.actual_zoom = 0 self.hates_store = Gtk.ListStore(str) self.Hates.set_model(self.hates_store) self.hate_column_numbers = list(range( self.hates_store.get_n_columns())) cols = initialise_columns( None, self.Hates, ["hates", _("Hates"), 0, "text", None]) cols["hates"].set_sort_column_id(0) self.hates_store.set_sort_column_id(0, Gtk.SortType.ASCENDING) self.likes_store = Gtk.ListStore(str) self.Likes.set_model(self.likes_store) self.like_column_numbers = list(range( self.likes_store.get_n_columns())) cols = initialise_columns( None, self.Likes, ["likes", _("Likes"), 0, "text", None]) cols["likes"].set_sort_column_id(0) self.likes_store.set_sort_column_id(0, Gtk.SortType.ASCENDING) self.tag_local = self.descr.get_buffer().create_tag() self.update_visuals() self.user_popup = popup = PopupMenu(self.frame, None, self.on_tab_popup) popup.setup_user_menu(user, page="userinfo") popup.setup(("", None), ("#" + _("Close All Tabs..."), self.on_close_all_tabs), ("#" + _("_Close Tab"), self.on_close)) self.interest_popup_menu = popup = PopupMenu( self.frame, self.Hates, self.on_popup_interest_menu) popup.setup( ("$" + _("I _Like This"), self.on_like_recommendation), ("$" + _("I _Dislike This"), self.on_dislike_recommendation), ("", None), ("#" + _("_Search for Item"), self.on_interest_recommend_search)) self.image_menu = popup = PopupMenu(self.frame, self.image_container, self.on_image_popup_menu) popup.setup(("#" + _("Zoom 1:1"), self.make_zoom_normal), ("#" + _("Zoom In"), self.make_zoom_in), ("#" + _("Zoom Out"), self.make_zoom_out), ("", None), ("#" + _("Save Picture"), self.on_save_picture))
def __init__(self, searches, text, token, mode, mode_label, showtab): super().__init__("ui/search.ui") self.searches = searches self.frame = searches.frame self.filter_help = UserInterface("ui/popovers/searchfilters.ui") self.text = text self.searchterm_words_include = [] self.searchterm_words_ignore = [] for word in text.lower().split(): if word.startswith('*'): if len(word) > 1: self.searchterm_words_include.append(word[1:]) elif word.startswith('-'): if len(word) > 1: self.searchterm_words_ignore.append(word[1:]) else: self.searchterm_words_include.append(word) self.token = token self.mode = mode self.mode_label = mode_label self.showtab = showtab self.usersiters = {} self.directoryiters = {} self.users = set() self.all_data = [] self.selected_results = [] self.selected_users = [] self.selected_files_count = 0 self.grouping_mode = None self.filters = None self.clearing_filters = False self.active_filter_count = 0 self.num_results_found = 0 self.num_results_visible = 0 self.max_limit = config.sections["searches"]["max_displayed_results"] self.max_limited = False self.operators = { '<': operator.lt, '<=': operator.le, '==': operator.eq, '!=': operator.ne, '>=': operator.ge, '>': operator.gt } # Columns self.treeview_name = "file_search" self.resultsmodel = Gtk.TreeStore( int, # (0) num str, # (1) user str, # (2) flag str, # (3) h_speed str, # (4) h_queue str, # (5) directory str, # (6) filename str, # (7) h_size str, # (8) h_bitrate str, # (9) h_length GObject.TYPE_UINT, # (10) bitrate str, # (11) fullpath str, # (12) country GObject.TYPE_UINT64, # (13) size GObject.TYPE_UINT, # (14) speed GObject.TYPE_UINT64, # (15) queue GObject.TYPE_UINT, # (16) length str # (17) color ) self.column_offsets = {} self.column_numbers = list(range(self.resultsmodel.get_n_columns())) color_col = 17 self.cols = cols = initialise_columns( self.frame, "file_search", self.ResultsList, ["id", _("ID"), 50, "number", color_col], ["user", _("User"), 200, "text", color_col], ["country", _("Country"), 25, "icon", None], ["speed", _("Speed"), 100, "number", color_col], ["in_queue", _("In Queue"), 90, "number", 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(12) cols["speed"].set_sort_column_id(14) cols["in_queue"].set_sort_column_id(15) cols["folder"].set_sort_column_id(5) cols["filename"].set_sort_column_id(6) cols["size"].set_sort_column_id(13) cols["bitrate"].set_sort_column_id(10) cols["length"].set_sort_column_id(16) cols["country"].get_widget().hide() self.ResultsList.set_model(self.resultsmodel) for column in self.ResultsList.get_columns(): self.column_offsets[column.get_title()] = 0 column.connect("notify::x-offset", self.on_column_position_changed) self.update_visuals() # Popup menus self.popup_menu_users = PopupMenu(self.frame) self.popup_menu_copy = PopupMenu(self.frame) self.popup_menu_copy.add_items( ("#" + _("Copy _File Path"), self.on_copy_file_path), ("#" + _("Copy _URL"), self.on_copy_url), ("#" + _("Copy Folder U_RL"), self.on_copy_dir_url)) self.popup_menu = PopupMenu(self.frame, self.ResultsList, self.on_popup_menu) self.popup_menu.add_items( ("#" + "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), ("#" + _("F_ile Properties"), self.on_file_properties), ("", None), (">" + _("Copy"), self.popup_menu_copy), (">" + _("User(s)"), self.popup_menu_users)) self.tab_menu = PopupMenu(self.frame) self.tab_menu.add_items( ("#" + _("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)) # Key bindings for widget in (self.Main, self.ResultsList): Accelerator("<Primary>f", widget, self.on_show_filter_bar_accelerator) Accelerator("Escape", self.FiltersContainer, self.on_close_filter_bar_accelerator) Accelerator("<Alt>Return", self.ResultsList, self.on_file_properties_accelerator) # 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.filter_comboboxes = { "filterin": self.FilterIn, "filterout": self.FilterOut, "filtersize": self.FilterSize, "filterbr": self.FilterBitrate, "filtercc": self.FilterCountry, "filtertype": self.FilterType } self.ShowFilters.set_active( config.sections["searches"]["filters_visible"]) self.populate_filters() # Wishlist self.update_wish_button()
def __init__(self, chatrooms, room, users): super().__init__("ui/chatrooms.ui") self.chatrooms = chatrooms self.frame = chatrooms.frame self.room = room if Gtk.get_major_version() == 4: self.ChatPaned.set_resize_start_child(True) self.ChatPaned.set_shrink_start_child(False) self.ChatPaned.set_resize_end_child(False) self.ChatPanedSecond.set_shrink_end_child(False) else: self.ChatPaned.child_set_property(self.ChatPanedSecond, "resize", True) self.ChatPaned.child_set_property(self.ChatPanedSecond, "shrink", False) self.ChatPaned.child_set_property(self.UserView, "resize", False) self.ChatPanedSecond.child_set_property(self.ChatView, "shrink", False) self.tickers = Tickers() self.room_wall = RoomWall(self.frame, self) self.leaving = False self.opened = False self.users = {} # Log Text Search TextSearchBar(self.RoomLog, self.LogSearchBar, self.LogSearchEntry) self.log_textview = TextView(self.RoomLog, font="chatfont") # Chat Text Search TextSearchBar(self.ChatScroll, self.ChatSearchBar, self.ChatSearchEntry, controller_widget=self.ChatView, focus_widget=self.ChatEntry) self.chat_textview = TextView(self.ChatScroll, font="chatfont") # Chat Entry ChatEntry(self.frame, self.ChatEntry, chatrooms.completion, room, slskmessages.SayChatroom, self.frame.np.chatrooms.send_message, self.frame.np.chatrooms.CMDS, is_chatroom=True) self.Log.set_active(config.sections["logging"]["chatrooms"]) if not self.Log.get_active(): self.Log.set_active( self.room in config.sections["logging"]["rooms"]) self.AutoJoin.set_active(room in config.sections["server"]["autojoin"]) self.toggle_chat_buttons() if room not in config.sections["columns"]["chat_room"]: config.sections["columns"]["chat_room"][room] = {} self.usersmodel = Gtk.ListStore( Gio.Icon, # (0) status_icon str, # (1) flag str, # (2) username str, # (3) h_speed str, # (4) h_files int, # (5) status GObject.TYPE_UINT, # (6) avgspeed GObject.TYPE_UINT, # (7) files str, # (8) country Pango.Weight, # (9) username_weight Pango.Underline # (10) username_underline ) self.UserList.set_model(self.usersmodel) self.column_numbers = list(range(self.usersmodel.get_n_columns())) attribute_columns = (9, 10) self.cols = cols = initialise_columns( self.frame, ("chat_room", room), self.UserList, ["status", _("Status"), 25, "icon", None], ["country", _("Country"), 25, "icon", None], ["user", _("User"), 155, "text", attribute_columns], ["speed", _("Speed"), 100, "number", None], ["files", _("Files"), -1, "number", None]) cols["status"].set_sort_column_id(5) cols["country"].set_sort_column_id(8) cols["user"].set_sort_column_id(2) cols["speed"].set_sort_column_id(6) cols["files"].set_sort_column_id(7) cols["status"].get_widget().hide() cols["country"].get_widget().hide() for userdata in users: self.add_user_row(userdata) self.usersmodel.set_sort_column_id(2, Gtk.SortType.ASCENDING) self.popup_menu_private_rooms_chat = PopupMenu(self.frame) self.popup_menu_private_rooms_list = PopupMenu(self.frame) self.popup_menu_user_chat = PopupMenu(self.frame, self.ChatScroll, connect_events=False) self.popup_menu_user_list = PopupMenu(self.frame, self.UserList, self.on_popup_menu_user) for menu, menu_private_rooms in ((self.popup_menu_user_chat, self.popup_menu_private_rooms_chat), (self.popup_menu_user_list, self.popup_menu_private_rooms_list)): menu.setup_user_menu() menu.add_items( ("", None), ("#" + _("Sear_ch User's Files"), menu.on_search_user), (">" + _("Private Rooms"), menu_private_rooms)) PopupMenu(self.frame, self.RoomLog, self.on_popup_menu_log).add_items( ("#" + _("Find…"), self.on_find_activity_log), ("", None), ("#" + _("Copy"), self.log_textview.on_copy_text), ("#" + _("Copy All"), self.log_textview.on_copy_all_text), ("", None), ("#" + _("Clear Activity View"), self.log_textview.on_clear_all_text), ("", None), ("#" + _("_Leave Room"), self.on_leave_room)) PopupMenu( self.frame, self.ChatScroll, self.on_popup_menu_chat).add_items( ("#" + _("Find…"), self.on_find_room_log), ("", None), ("#" + _("Copy"), self.chat_textview.on_copy_text), ("#" + _("Copy Link"), self.chat_textview.on_copy_link), ("#" + _("Copy All"), self.chat_textview.on_copy_all_text), ("", None), ("#" + _("View Room Log"), self.on_view_room_log), ("#" + _("Delete Room Log…"), self.on_delete_room_log), ("", None), ("#" + _("Clear Message View"), self.chat_textview.on_clear_all_text), ("#" + _("_Leave Room"), self.on_leave_room)) self.tab_menu = PopupMenu(self.frame) self.tab_menu.add_items(("#" + _("_Leave Room"), self.on_leave_room)) self.setup_public_feed() self.ChatEntry.grab_focus() self.count_users() self.create_tags() self.update_visuals() self.read_room_logs()
def __init__(self, frame): super().__init__("ui/interests.ui") frame.interests_container.add(self.Main) self.frame = frame self.page_id = "interests" self.populated_recommends = False # Columns self.likes = {} self.likes_model = Gtk.ListStore(str) self.likes_model.set_sort_column_id(0, Gtk.SortType.ASCENDING) self.likes_column_numbers = list( range(self.likes_model.get_n_columns())) cols = initialise_columns( frame, None, self.LikesList, ["likes", _("Likes"), -1, "text", None]) cols["likes"].set_sort_column_id(0) self.LikesList.set_model(self.likes_model) self.dislikes = {} self.dislikes_model = Gtk.ListStore(str) self.dislikes_model.set_sort_column_id(0, Gtk.SortType.ASCENDING) self.dislikes_column_numbers = list( range(self.dislikes_model.get_n_columns())) cols = initialise_columns( frame, None, self.DislikesList, ["dislikes", _("Dislikes"), -1, "text", None]) cols["dislikes"].set_sort_column_id(0) self.DislikesList.set_model(self.dislikes_model) self.recommendations_model = Gtk.ListStore( str, # (0) hrating str, # (1) item int # (2) rating ) self.recommendations_column_numbers = list( range(self.recommendations_model.get_n_columns())) cols = initialise_columns( frame, None, self.RecommendationsList, ["rating", _("Rating"), 0, "number", None], ["item", _("Item"), -1, "text", None]) cols["rating"].set_sort_column_id(2) cols["item"].set_sort_column_id(1) self.RecommendationsList.set_model(self.recommendations_model) self.recommendations_model.set_sort_column_id(2, Gtk.SortType.DESCENDING) self.recommendation_users = {} self.recommendation_users_model = Gtk.ListStore( Gio.Icon, # (0) status icon str, # (1) user str, # (2) hspeed str, # (3) hfiles int, # (4) status GObject.TYPE_UINT, # (5) speed GObject.TYPE_UINT # (6) file count ) self.recommendation_users_column_numbers = list( range(self.recommendation_users_model.get_n_columns())) cols = initialise_columns( frame, None, self.RecommendationUsersList, ["status", _("Status"), 25, "icon", None], ["user", _("User"), 135, "text", None], ["speed", _("Speed"), 60, "number", None], ["files", _("Files"), -1, "number", None], ) cols["status"].set_sort_column_id(4) cols["user"].set_sort_column_id(1) cols["speed"].set_sort_column_id(5) cols["files"].set_sort_column_id(6) cols["user"].set_expand(True) cols["speed"].set_expand(True) cols["files"].set_expand(True) cols["status"].get_widget().hide() self.RecommendationUsersList.set_model(self.recommendation_users_model) self.recommendation_users_model.set_sort_column_id( 1, Gtk.SortType.ASCENDING) for thing in config.sections["interests"]["likes"]: if thing and isinstance(thing, str): self.likes[thing] = self.likes_model.insert_with_valuesv( -1, self.likes_column_numbers, [thing]) for thing in config.sections["interests"]["dislikes"]: if thing and isinstance(thing, str): self.dislikes[thing] = self.dislikes_model.insert_with_valuesv( -1, self.dislikes_column_numbers, [thing]) # Popup menus self.til_popup_menu = popup = PopupMenu(self.frame, self.LikesList, self.on_popup_til_menu) popup.add_items( ("#" + _("Re_commendations for Item"), self.on_recommend_item, popup), ("#" + _("_Search for Item"), self.on_recommend_search, popup), ("", None), ("#" + _("_Remove Item"), self.on_remove_thing_i_like)) self.tidl_popup_menu = popup = PopupMenu(self.frame, self.DislikesList, self.on_popup_til_menu) popup.add_items( ("#" + _("Re_commendations for Item"), self.on_recommend_item, popup), ("#" + _("_Search for Item"), self.on_recommend_search, popup), ("", None), ("#" + _("_Remove Item"), self.on_remove_thing_i_dislike)) self.r_popup_menu = popup = PopupMenu(self.frame, self.RecommendationsList, self.on_popup_r_menu) popup.add_items( ("$" + _("I _Like This"), self.on_like_recommendation), ("$" + _("I _Dislike This"), self.on_dislike_recommendation), ("", None), ("#" + _("_Recommendations for Item"), self.on_recommend_item, popup), ("#" + _("_Search for Item"), self.on_recommend_search, popup)) popup = PopupMenu(self.frame, self.RecommendationUsersList, self.on_popup_ru_menu) popup.setup_user_menu() self.update_visuals()
def __init__(self, frame, transfer_type): super().__init__("ui/" + transfer_type + "s.ui") getattr(frame, transfer_type + "s_content").add(self.Main) self.frame = frame self.type = transfer_type self.page_id = transfer_type + "s" self.user_counter = getattr(frame, "%sUsers" % transfer_type.title()) self.file_counter = getattr(frame, "%sFiles" % transfer_type.title()) grouping_button = getattr(frame, "ToggleTree%ss" % transfer_type.title()) if Gtk.get_major_version() == 4: self.ClearTransfers.set_has_frame(False) Accelerator("t", self.Transfers, self.on_abort_transfers_accelerator) Accelerator("r", self.Transfers, self.on_retry_transfers_accelerator) Accelerator("Delete", self.Transfers, self.on_clear_transfers_accelerator) Accelerator("<Alt>Return", self.Transfers, self.on_file_properties_accelerator) self.last_ui_update = 0 self.transfer_list = [] self.users = {} self.paths = {} self.selected_users = [] self.selected_transfers = [] self.tree_users = None # Status list self.statuses = { "Queued": _("Queued"), "Queued (prioritized)": _("Queued (prioritized)"), "Queued (privileged)": _("Queued (privileged)"), "Getting status": _("Getting status"), "Transferring": _("Transferring"), "Cannot connect": _("Cannot connect"), "Pending shutdown.": _("Pending shutdown"), "User logged off": _("User logged off"), "Disallowed extension": _("Disallowed extension" ), # Sent by Soulseek NS for filtered extensions "Aborted": _("Aborted"), "Cancelled": _("Cancelled"), "Paused": _("Paused"), "Finished": _("Finished"), "Filtered": _("Filtered"), "Banned": _("Banned"), "Blocked country": _("Blocked country"), "Too many files": _("Too many files"), "Too many megabytes": _("Too many megabytes"), "File not shared": _("File not shared"), "File not shared.": _("File not shared"), # Newer variant containing a dot "Download folder error": _("Download folder error"), "Local file error": _("Local file error"), "Remote file error": _("Remote file error") } self.deprioritized_statuses = ("", "Paused", "Aborted", "Finished", "Filtered") self.transfersmodel = Gtk.TreeStore( str, # (0) user str, # (1) path str, # (2) file name str, # (3) translated status str, # (4) hqueue position int, # (5) percent str, # (6) hsize str, # (7) hspeed str, # (8) htime elapsed str, # (9) htime left GObject.TYPE_UINT64, # (10) size GObject.TYPE_UINT64, # (11) current bytes GObject.TYPE_UINT64, # (12) speed GObject.TYPE_UINT, # (13) queue position int, # (14) time elapsed int, # (15) time left GObject.TYPE_PYOBJECT # (16) transfer object ) self.column_numbers = list(range(self.transfersmodel.get_n_columns())) self.cols = cols = initialise_columns( frame, transfer_type, self.Transfers, ["user", _("User"), 200, "text", None], ["path", self.path_label, 400, "text", None], ["filename", _("Filename"), 400, "text", None], ["status", _("Status"), 140, "text", None], ["queue_position", _("Queue"), 75, "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(3) cols["queue_position"].set_sort_column_id(13) cols["percent"].set_sort_column_id(5) cols["size"].set_sort_column_id(10) cols["speed"].set_sort_column_id(12) cols["time_elapsed"].set_sort_column_id(14) cols["time_left"].set_sort_column_id(15) self.Transfers.set_model(self.transfersmodel) self.status_page = getattr(frame, "%ss_status_page" % transfer_type) self.expand_button = getattr(frame, "Expand%ss" % transfer_type.title()) state = GLib.Variant( "s", verify_grouping_mode(config.sections["transfers"]["group%ss" % transfer_type])) action = Gio.SimpleAction(name="%sgrouping" % transfer_type, parameter_type=GLib.VariantType("s"), state=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" % transfer_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" % transfer_type]) self.popup_menu_users = PopupMenu(frame) self.popup_menu_clear = PopupMenu(frame) self.ClearTransfers.set_menu_model(self.popup_menu_clear.model) self.popup_menu_copy = PopupMenu(frame) self.popup_menu_copy.add_items( ("#" + _("Copy _File Path"), self.on_copy_file_path), ("#" + _("Copy _URL"), self.on_copy_url), ("#" + _("Copy Folder U_RL"), self.on_copy_dir_url)) self.popup_menu = PopupMenu(frame, self.Transfers, self.on_popup_menu) self.popup_menu.add_items( ("#" + "selected_files", None), ("", None), ("#" + _("Send to _Player"), self.on_play_files), ("#" + _("_Open in File Manager"), self.on_open_file_manager), ("#" + _("F_ile Properties"), self.on_file_properties), ("", None), ("#" + _("_Search"), self.on_file_search), ("#" + _("_Browse Folder(s)"), self.on_browse_folder), ("", None), ("#" + self.retry_label, self.on_retry_transfer), ("#" + self.abort_label, self.on_abort_transfer), ("#" + _("_Clear"), self.on_clear_transfer), ("", None), (">" + _("Clear Groups"), self.popup_menu_clear), (">" + _("Copy"), self.popup_menu_copy), (">" + _("User(s)"), self.popup_menu_users)) self.update_visuals()