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)
Beispiel #2
0
    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()
Beispiel #3
0
    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)
Beispiel #4
0
    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)
Beispiel #5
0
    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)
Beispiel #6
0
    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)
Beispiel #7
0
    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)
Beispiel #8
0
    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
Beispiel #9
0
    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()
Beispiel #10
0
    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()
Beispiel #11
0
    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()
Beispiel #12
0
    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()
Beispiel #13
0
    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()
Beispiel #14
0
    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()
Beispiel #15
0
    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()
Beispiel #16
0
    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()
Beispiel #17
0
    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"])
Beispiel #18
0
    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()
Beispiel #19
0
    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()
Beispiel #20
0
    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))
Beispiel #21
0
    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()
Beispiel #23
0
    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))
Beispiel #24
0
    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()
Beispiel #25
0
    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()
Beispiel #26
0
    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()