Пример #1
0
    def OnPopupMenuUsers(self, widget):

        self.selected_transfers = []
        self.selected_users = []
        self.widget.get_selection().selected_foreach(self.SelectedTransfersCallback)

        self.popup_menu_users.clear()
        if len(self.selected_users) > 0:
            items = []
            self.selected_users.sort(key=str.lower)
            for user in self.selected_users:
                popup = PopupMenu(self.frame)
                popup.setup(
                    ("#" + _("Send _message"), popup.OnSendMessage, gtk.STOCK_EDIT),
                    ("#" + _("Show IP a_ddress"), popup.OnShowIPaddress, gtk.STOCK_NETWORK),
                    ("#" + _("Get user i_nfo"), popup.OnGetUserInfo, gtk.STOCK_DIALOG_INFO),
                    ("#" + _("Brow_se files"), popup.OnBrowseUser, gtk.STOCK_HARDDISK),
                    ("#" + _("Gi_ve privileges"), popup.OnGivePrivileges, gtk.STOCK_JUMP_TO),
                    ("", None),
                    ("$" + _("_Add user to list"), popup.OnAddToList),
                    ("$" + _("_Ban this user"), popup.OnBanUser),
                    ("$" + _("_Ignore this user"), popup.OnIgnoreUser),
                    ("#" + _("Select User's Transfers"), self.OnSelectUserTransfer, gtk.STOCK_INDEX),
                )
                popup.set_user(user)

                items.append((1, user, popup, self.OnPopupMenuUser, popup))
            self.popup_menu_users.setup(*items)
        return True
Пример #2
0
	def TabPopup(self, id):
		popup = PopupMenu(self.frame)
		popup.setup(
			("#" + _("Detach this tab"), self.searches[id][2].Detach, gtk.STOCK_REDO),
			("#" + _("Close this tab"), self.searches[id][2].OnClose, gtk.STOCK_CLOSE),
		)
		items = popup.get_children()
		return popup
Пример #3
0
    def TabPopup(self, user):

        popup = PopupMenu(self.frame)
        popup.setup(("#" + _("Send _message"), popup.OnSendMessage),
                    ("#" + _("Show IP a_ddress"), popup.OnShowIPaddress),
                    ("#" + _("Get user i_nfo"), popup.OnGetUserInfo),
                    ("#" + _("Brow_se files"), popup.OnBrowseUser),
                    ("#" + _("Gi_ve privileges"), popup.OnGivePrivileges),
                    ("#" + _("Client Version"), popup.OnVersion), ("", None),
                    ("$" + _("Add user to list"), popup.OnAddToList),
                    ("$" + _("Ban this user"), popup.OnBanUser),
                    ("$" + _("Ignore this user"), popup.OnIgnoreUser),
                    ("", None),
                    ("#" + _("Detach this tab"), self.users[user].Detach),
                    ("#" + _("Close this tab"), self.users[user].OnClose))
        popup.set_user(user)

        items = popup.get_children()

        items[7].set_active(user in [
            i[0] for i in self.frame.np.config.sections["server"]["userlist"]
        ])
        items[8].set_active(
            user in self.frame.np.config.sections["server"]["banlist"])
        items[9].set_active(
            user in self.frame.np.config.sections["server"]["ignorelist"])

        return popup
Пример #4
0
    def TabPopup(self, user):
        popup = PopupMenu(self.frame)
        popup.setup(
            ("#" + _("Send _message"), popup.OnSendMessage, gtk.STOCK_EDIT),
            ("#" + _("Show IP a_ddress"), popup.OnShowIPaddress,
             gtk.STOCK_NETWORK),
            ("#" + _("Get user i_nfo"), popup.OnGetUserInfo,
             gtk.STOCK_DIALOG_INFO),
            ("#" + _("Brow_se files"), popup.OnBrowseUser, gtk.STOCK_HARDDISK),
            ("#" + _("Gi_ve privileges"), popup.OnGivePrivileges,
             gtk.STOCK_JUMP_TO),
            ("#" + _("Client Version"), popup.OnVersion, gtk.STOCK_ABOUT),
            ("", None),
            ("$" + _("Add user to list"), popup.OnAddToList),
            ("$" + _("Ban this user"), popup.OnBanUser),
            ("$" + _("Ignore this user"), popup.OnIgnoreUser),
            ("", None),
            ("#" + _("Detach this tab"), self.users[user].Detach,
             gtk.STOCK_REDO),
            ("#" + _("Close this tab"), self.users[user].OnClose,
             gtk.STOCK_CLOSE),
        )
        popup.set_user(user)

        items = popup.get_children()

        items[7].set_active(user in [
            i[0] for i in self.frame.np.config.sections["server"]["userlist"]
        ])
        items[8].set_active(
            user in self.frame.np.config.sections["server"]["banlist"])
        items[9].set_active(
            user in self.frame.np.config.sections["server"]["ignorelist"])

        return popup
Пример #5
0
    def __init__(self, frame):
        TransferList.__init__(self, frame, frame.UploadList)
        self.myvbox = self.frame.vboxuploads
        self.frame.UploadList.set_property("rules-hint", True)
        self.popup_menu2 = popup2 = PopupMenu(frame)
        popup2.setup(
            ("#" + _("Clear finished/erred"), self.OnClearFinishedErred, gtk.STOCK_CLEAR),
            ("#" + _("Clear finished/aborted"), self.OnClearFinishedAborted, gtk.STOCK_CLEAR),
            ("#" + _("Clear finished"), self.OnClearFinished, gtk.STOCK_CLEAR),
            ("#" + _("Clear aborted"), self.OnClearAborted, gtk.STOCK_CLEAR),
            ("#" + _("Clear queued"), self.OnClearQueued, gtk.STOCK_CLEAR),
            ("#" + _("Clear failed"), self.OnClearFailed, gtk.STOCK_CLEAR),
        )

        self.popup_menu_users = PopupMenu(frame)

        self.popup_menu = popup = PopupMenu(frame)
        popup.setup(
            ("#" + _("Copy _URL"), self.OnCopyURL, gtk.STOCK_COPY),
            ("#" + _("Copy folder URL"), self.OnCopyDirURL, gtk.STOCK_COPY),
            ("#" + _("Send to _player"), self.OnPlayFiles, gtk.STOCK_MEDIA_PLAY),
            ("#" + _("Open Directory"), self.OnOpenDirectory, gtk.STOCK_OPEN),
            ("#" + _("Search"), self.OnFileSearch, gtk.STOCK_FIND),
            (1, _("User(s)"), self.popup_menu_users, self.OnPopupMenuUsers),
            ("", None),
            ("#" + _("Abor_t"), self.OnAbortTransfer, gtk.STOCK_CANCEL),
            ("#" + _("_Clear"), self.OnClearTransfer, gtk.STOCK_CLEAR),
            ("#" + _("_Retry"), self.OnUploadTransfer, gtk.STOCK_REDO),
            ("", None),
            (1, _("Clear Groups"), self.popup_menu2, None),
        )
        frame.UploadList.connect("button_press_event", self.OnPopupMenu, "mouse")
        frame.UploadList.connect("key-press-event", self.on_key_press_event)
        cols = frame.UploadList.get_columns()
        for i in range(9):
            parent = cols[i].get_widget().get_ancestor(gtk.Button)
            if parent:
                parent.connect("button_press_event", PressHeader)
                # Read Show / Hide column settings from last session
            cols[i].set_visible(self.frame.np.config.sections["columns"]["uploads"][i])
        frame.clearUploadFinishedErredButton.connect("clicked", self.OnClearFinishedErred)
        frame.clearUploadQueueButton.connect("clicked", self.OnTryClearQueued)
        frame.abortUploadButton.connect("clicked", self.OnAbortTransfer)
        frame.abortUserUploadButton.connect("clicked", self.OnAbortUser)
        frame.banUploadButton.connect("clicked", self.OnBan)
        frame.UploadList.expand_all()

        self.frame.ToggleAutoclear.set_active(self.frame.np.config.sections["transfers"]["autoclear_uploads"])
        frame.ToggleAutoclear.connect("toggled", self.OnToggleAutoclear)
        self.frame.ToggleTreeUploads.set_active(self.frame.np.config.sections["transfers"]["groupuploads"])
        frame.ToggleTreeUploads.connect("toggled", self.OnToggleTree)
        self.OnToggleTree(None)
        self.frame.ExpandUploads.set_active(self.frame.np.config.sections["transfers"]["uploadsexpanded"])
        frame.ExpandUploads.connect("toggled", self.OnExpandUploads)
        self.OnExpandUploads(None)
Пример #6
0
    def TabPopup(self, user):

        popup = PopupMenu(self.frame)
        popup.setup(
            ("#" + _("Send _message"), popup.OnSendMessage),
            ("#" + _("Show IP a_ddress"), popup.OnShowIPaddress),
            ("#" + _("Get user i_nfo"), popup.OnGetUserInfo),
            ("#" + _("Brow_se files"), popup.OnBrowseUser),
            ("#" + _("Gi_ve privileges"), popup.OnGivePrivileges),
            ("#" + _("Client Version"), popup.OnVersion),
            ("", None),
            ("$" + _("Add user to list"), popup.OnAddToList),
            ("$" + _("Ban this user"), popup.OnBanUser),
            ("$" + _("Ignore this user"), popup.OnIgnoreUser),
            ("", None),
            ("#" + _("Detach this tab"), self.users[user].Detach),
            ("#" + _("Close this tab"), self.users[user].OnClose)
        )
        popup.set_user(user)

        items = popup.get_children()

        items[7].set_active(user in [i[0] for i in self.frame.np.config.sections["server"]["userlist"]])
        items[8].set_active(user in self.frame.np.config.sections["server"]["banlist"])
        items[9].set_active(user in self.frame.np.config.sections["server"]["ignorelist"])

        return popup
Пример #7
0
	def OnPopupMenuUsers(self, widget):
		
		self.select_results()
		#(user, fn, size, bitrate, length)
	
		self.popup_menu_users.clear()

		if len(self.selected_users) > 0:
			items = []
			self.selected_users.sort(key=str.lower)
			for user in self.selected_users:
				popup = PopupMenu(self.frame)
				popup.setup(
					("#" + _("Send _message"), popup.OnSendMessage, gtk.STOCK_EDIT),
					("#" + _("Show IP a_ddress"), popup.OnShowIPaddress, gtk.STOCK_NETWORK),
					("#" + _("Get user i_nfo"), popup.OnGetUserInfo, gtk.STOCK_DIALOG_INFO),
					("#" + _("Brow_se files"), popup.OnBrowseUser, gtk.STOCK_HARDDISK),
					("#" + _("Gi_ve privileges"), popup.OnGivePrivileges, gtk.STOCK_JUMP_TO),
					("", None),
					("$" + _("_Add user to list"), popup.OnAddToList),
					("$" + _("_Ban this user"), popup.OnBanUser),
					("$" + _("_Ignore this user"), popup.OnIgnoreUser),
					("#" + _("Select User's Results"), self.OnSelectUserResults, gtk.STOCK_INDEX),
				)
				popup.set_user(user)

				items.append((1, user, popup, self.OnPopupMenuUser, popup))
			self.popup_menu_users.setup(*items)
		return True
Пример #8
0
    def OnPopupMenuUsers(self, widget):

        self.selected_transfers = []
        self.selected_users = []
        self.widget.get_selection().selected_foreach(
            self.SelectedTransfersCallback)

        self.popup_menu_users.clear()

        if len(self.selected_users) > 0:

            items = []
            self.selected_users.sort(key=str.lower)

            for user in self.selected_users:
                popup = PopupMenu(self.frame)
                popup.setup(
                    ("#" + _("Send _message"), popup.OnSendMessage),
                    ("#" + _("Show IP a_ddress"), popup.OnShowIPaddress),
                    ("#" + _("Get user i_nfo"), popup.OnGetUserInfo),
                    ("#" + _("Brow_se files"), popup.OnBrowseUser),
                    ("#" + _("Gi_ve privileges"), popup.OnGivePrivileges),
                    ("", None),
                    ("$" + _("_Add user to list"), popup.OnAddToList),
                    ("$" + _("_Ban this user"), popup.OnBanUser),
                    ("$" + _("_Ignore this user"), popup.OnIgnoreUser),
                    ("#" + _("Select User's Transfers"),
                     self.OnSelectUserTransfer))
                popup.set_user(user)

                items.append((1, user, popup, self.OnPopupMenuUser, popup))

            self.popup_menu_users.setup(*items)

        return True
Пример #9
0
	def TabPopup(self, user):
		popup = PopupMenu(self.frame)
		popup.setup(
			("#" + _("Send _message"), popup.OnSendMessage, gtk.STOCK_EDIT),
			("#" + _("Show IP a_ddress"), popup.OnShowIPaddress, gtk.STOCK_NETWORK),
			("#" + _("Get user i_nfo"), popup.OnGetUserInfo, gtk.STOCK_DIALOG_INFO),
			("#" + _("Brow_se files"), popup.OnBrowseUser, gtk.STOCK_HARDDISK),
			("#" + _("Gi_ve privileges"), popup.OnGivePrivileges, gtk.STOCK_JUMP_TO),
			("#" + _("Client Version"), popup.OnVersion, gtk.STOCK_ABOUT ),
			("", None),
			("$" + _("Add user to list"), popup.OnAddToList),
			("$" + _("Ban this user"), popup.OnBanUser),
			("$" + _("Ignore this user"), popup.OnIgnoreUser),
			("", None),
			("#" + _("Detach this tab"), self.users[user].Detach, gtk.STOCK_REDO),
			("#" + _("Close this tab"), self.users[user].OnClose, gtk.STOCK_CLOSE),
		)
		popup.set_user(user)
		
		items = popup.get_children()
		
		items[7].set_active(user in [i[0] for i in self.frame.np.config.sections["server"]["userlist"]])
		items[8].set_active(user in self.frame.np.config.sections["server"]["banlist"])
		items[9].set_active(user in self.frame.np.config.sections["server"]["ignorelist"])
	
		return popup
Пример #10
0
    def TabPopup(self, user):

        if user not in self.users:
            return

        popup = PopupMenu(self.frame)
        popup.setup(
            ("#" + _("Show IP a_ddress"), popup.OnShowIPaddress),
            ("#" + _("Get user i_nfo"), popup.OnGetUserInfo),
            ("#" + _("Brow_se files"), popup.OnBrowseUser),
            ("#" + _("Gi_ve privileges"), popup.OnGivePrivileges),
            ("#" + _("Client Version"), popup.OnVersion), ("", None),
            ("$" + _("Add user to list"), popup.OnAddToList),
            ("$" + _("Ban this user"), popup.OnBanUser),
            ("$" + _("Ignore this user"), popup.OnIgnoreUser),
            ("$" + _("B_lock this user's IP Address"), popup.OnBlockUser),
            ("$" + _("Ignore this user's IP Address"), popup.OnIgnoreIP),
            ("", None), ("#" + _("Detach this tab"), self.users[user].Detach),
            ("#" + _("Close this tab"), self.users[user].OnClose))

        popup.set_user(user)

        me = (popup.user is None or popup.user
              == self.frame.np.config.sections["server"]["login"])
        items = popup.get_children()

        items[6].set_active(user in [
            i[0] for i in self.frame.np.config.sections["server"]["userlist"]
        ])
        items[7].set_active(
            user in self.frame.np.config.sections["server"]["banlist"])
        items[8].set_active(
            user in self.frame.np.config.sections["server"]["ignorelist"])
        items[9].set_active(self.frame.UserIpIsBlocked(user))
        items[9].set_sensitive(not me)
        items[10].set_active(self.frame.UserIpIsIgnored(user))
        items[10].set_sensitive(not me)

        return popup
Пример #11
0
    def TabPopup(self, user):

        if user not in self.users:
            return

        popup = PopupMenu(self.frame)
        popup.setup(
            ("#" + _("Show IP a_ddress"), popup.OnShowIPaddress),
            ("#" + _("Get user i_nfo"), popup.OnGetUserInfo),
            ("#" + _("Brow_se files"), popup.OnBrowseUser),
            ("#" + _("Gi_ve privileges"), popup.OnGivePrivileges),
            ("#" + _("Client Version"), popup.OnVersion),
            ("", None),
            ("$" + _("Add user to list"), popup.OnAddToList),
            ("$" + _("Ban this user"), popup.OnBanUser),
            ("$" + _("Ignore this user"), popup.OnIgnoreUser),
            ("$" + _("B_lock this user's IP Address"), popup.OnBlockUser),
            ("$" + _("Ignore this user's IP Address"), popup.OnIgnoreIP),
            ("", None),
            ("#" + _("Detach this tab"), self.users[user].Detach),
            ("#" + _("Close this tab"), self.users[user].OnClose)
        )

        popup.set_user(user)

        me = (popup.user is None or popup.user == self.frame.np.config.sections["server"]["login"])
        items = popup.get_children()

        items[6].set_active(user in [i[0] for i in self.frame.np.config.sections["server"]["userlist"]])
        items[7].set_active(user in self.frame.np.config.sections["server"]["banlist"])
        items[8].set_active(user in self.frame.np.config.sections["server"]["ignorelist"])
        items[9].set_active(self.frame.UserIpIsBlocked(user))
        items[9].set_sensitive(not me)
        items[10].set_active(self.frame.UserIpIsIgnored(user))
        items[10].set_sensitive(not me)

        return popup
Пример #12
0
	def __init__(self, Searches, text, id, mode, remember):
		self.Searches = Searches
		self.frame = Searches.frame
		# self.tooltips = self.frame.tooltips
		# if not self.frame.np.config.sections["ui"]["tooltips"]:
		# self.tooltips.disable()

		self.wTree = gtk.glade.XML(os.path.join(os.path.dirname(os.path.realpath(__file__)), "search.glade"), None)
		widgets = self.wTree.get_widget_prefix("")
		for i in widgets:
			name = gtk.glade.get_widget_name(i)
			self.__dict__[name] = i
		self.SearchTab.remove(self.Main)
		self.SearchTab.destroy()
		self.wTree.signal_autoconnect(self)
		self.FilterBitrate_List = gtk.ListStore(gobject.TYPE_STRING)
		self.FilterBitrate.set_model(self.FilterBitrate_List)
		self.FilterBitrate.set_text_column(0)
		self.FilterSize_List = gtk.ListStore(gobject.TYPE_STRING)
		self.FilterSize.set_model(self.FilterSize_List)
		self.FilterSize.set_text_column(0)
		self.FilterCountry_List = gtk.ListStore(gobject.TYPE_STRING)
		self.FilterCountry.set_model(self.FilterCountry_List)
		self.FilterCountry.set_text_column(0)
		self.FilterIn_List = gtk.ListStore(gobject.TYPE_STRING)
		self.FilterIn.set_model(self.FilterIn_List)
		self.FilterIn.set_text_column(0)
		self.FilterOut_List = gtk.ListStore(gobject.TYPE_STRING)
		self.FilterOut.set_model(self.FilterOut_List)
		self.FilterOut.set_text_column(0)
		self.wTree.signal_autoconnect(self)
		# self.ResultsList.set_double_buffered(False)

		self.text = text
		self.id = id
		self.mode = mode
		self.remember = remember
		self.usersiters = {}
		self.users = []
		self.resultslimit = 2000
		self.QueryLabel.set_text(text)

		self.all_data = []
		self.filters = None
		self.COLUMN_TYPES = [
			int,  # num
			str,  # user
			str,  # filename
			str,  # h_size
			str,  # h_speed
			str,  # h_queue
			str,  # immediatedl
			str,  # h_bitrate
			str,  # length
			gtk.gdk.Pixbuf,  # self.get_flag(user, country)
			str,  # directory
			int,  # bitrate
			str,  # fullpath
			str,  # country
			gobject.TYPE_UINT64,  # size
			int,  # speed
			int,  # queue
			int   # status
		]

		self.resultsmodel = gtk.TreeStore(* self.COLUMN_TYPES)

		if mode > 0:
			self.RememberCheckButton.set_sensitive(False)
		self.RememberCheckButton.set_active(remember)
		
		self.PopulateFilters()
		
		self.FilterSize.clear()
		sizecell = gtk.CellRendererText()
		sizecell.set_property("xalign", 1)
		self.FilterSize.pack_start(sizecell, True)
		self.FilterSize.add_attribute(sizecell, "text", 0)
		
		self.FilterBitrate.clear()
		bit_cell = gtk.CellRendererText()
		bit_cell.set_property("xalign", 1)
		self.FilterBitrate.pack_start(bit_cell, True)
		self.FilterBitrate.add_attribute(bit_cell, "text", 0)
		
		self.FilterIn.connect("changed", self.OnFilterChanged)
		self.FilterOut.connect("changed", self.OnFilterChanged)
		self.FilterSize.connect("changed", self.OnFilterChanged)
		self.FilterBitrate.connect("changed", self.OnFilterChanged)
		self.FilterCountry.connect("changed", self.OnFilterChanged)
		self.FilterIn.child.connect("activate", self.OnRefilter)
		self.FilterOut.child.connect("activate", self.OnRefilter)
		self.FilterSize.child.connect("activate", self.OnRefilter)
		self.FilterBitrate.child.connect("activate", self.OnRefilter)
		self.FilterCountry.child.connect("activate", self.OnRefilter)

		self.selected_results = []
		self.selected_users = []

		self.ResultsList.get_selection().set_mode(gtk.SELECTION_MULTIPLE)
		self.ResultsList.set_property("show-expanders", False)
		self.ResultsList.set_property("rules-hint", True)

		cols = InitialiseColumns(
			self.ResultsList,
			[_("Number"), 50, "number", self.CellDataFunc],
			[_("User"), 100, "text", self.CellDataFunc],
			[_("Filename"), 250, "text", self.CellDataFunc],
			[_("Size"), 100, "number", self.CellDataFunc],
			[_("Speed"), 90, "text", self.CellDataFunc],
			[_("In queue"), 50, "number", self.CellDataFunc],
			[_("Immediate Download"), 20, "text", self.CellDataFunc],
			[_("Bitrate"), 50, "text", self.CellDataFunc],
			[_("Length"), 50, "number", self.CellDataFunc],
			[_("Country"), 25, "pixbuf"],
			[_("Directory"), 1000, "text", self.CellDataFunc]
		)

		self.col_num, self.col_user, self.col_file, self.col_size, self.col_speed, self.col_queue, self.col_immediate, self.col_bitrate, self.col_length, self.col_country, self.col_directory = cols
		cols[0].get_widget().hide()

		for i in range (10):
			parent = cols[i].get_widget().get_ancestor(gtk.Button)
			if parent:
				parent.connect('button_press_event', PressHeader)
			# Read Show / Hide column settings from last session
			cols[i].set_visible(self.frame.np.config.sections["columns"]["search"][i])

		self.ResultsList.set_model(self.resultsmodel)
		#for ix in range(len(cols)):
			#col = cols[ix]
			#col.connect("clicked", self.OnResort, ix)
			#for r in col.get_cell_renderers():
				#r.set_fixed_height_from_font(1)
		#for r in self.col_num.get_cell_renderers() + self.col_size.get_cell_renderers() +  self.col_length.get_cell_renderers():
			#r.set_property("xalign",1)

		self.col_num.set_sort_column_id(0)
		self.col_user.set_sort_column_id(1)
		self.col_file.set_sort_column_id(2)
		self.col_size.set_sort_column_id(14)
		
		self.col_speed.set_sort_column_id(15)
		self.col_queue.set_sort_column_id(16)
		self.col_immediate.set_sort_column_id(6)
		self.col_bitrate.set_sort_column_id(11)
		self.col_length.set_sort_column_id(8)
		self.col_country.set_sort_column_id(13)
		self.col_directory.set_sort_column_id(10)
		self.ResultsList.set_enable_tree_lines(True)

		self.ResultsList.set_headers_clickable(True)
		self.popup_menu_users = PopupMenu(self.frame)
		self.popup_menu = popup = PopupMenu(self.frame)
		popup.setup(
			("#" + _("_Download file(s)"), self.OnDownloadFiles, gtk.STOCK_GO_DOWN),
			("#" + _("Download file(s) _to..."), self.OnDownloadFilesTo, gtk.STOCK_GO_DOWN),
			("#" + _("Download containing _folder(s)"), self.OnDownloadFolders, gtk.STOCK_GO_DOWN),
			("#" + _("Download containing f_older(s) to..."), self.OnDownloadFoldersTo, gtk.STOCK_GO_DOWN),
			("#" + _("View Metadata of file(s)"), self.OnSearchMeta, gtk.STOCK_PROPERTIES),
			("", None),
			("#" + _("Copy _URL"), self.OnCopyURL, gtk.STOCK_COPY),
			("#" + _("Copy folder U_RL"), self.OnCopyDirURL, gtk.STOCK_COPY),
			("", None),
			(1, _("User(s)"), self.popup_menu_users, self.OnPopupMenuUsers)
		)

		self.ResultsList.connect("button_press_event", self.OnListClicked)
		
		self._more_results = 0
		self.new_results = []
		self.ChangeColours()
Пример #13
0
class Downloads(TransferList):

    def __init__(self, frame):

        TransferList.__init__(self, frame, frame.DownloadList, type='downloads')
        self.myvbox = self.frame.downloadsvbox
        self.frame.DownloadList.set_property("rules-hint", True)
        self.accel_group = gtk.AccelGroup()

        self.popup_menu2 = popup2 = PopupMenu(frame)
        popup2.setup(
            ("#" + _("Clear finished/aborted"), self.OnClearFinishedAborted),
            ("#" + _("Clear finished"), self.OnClearFinished),
            ("#" + _("Clear aborted"), self.OnClearAborted),
            ("#" + _("Clear paused"), self.OnClearPaused),
            ("#" + _("Clear filtered"), self.OnClearFiltered),
            ("#" + _("Clear queued"), self.OnClearQueued)
        )
        self.popup_menu_users = PopupMenu(frame)

        self.popup_menu = popup = PopupMenu(frame)
        popup.setup(
            ("#" + _("Get place in _queue"), self.OnGetPlaceInQueue),
            ("", None),
            ("#" + _("Copy _URL"), self.OnCopyURL),
            ("#" + _("Copy folder URL"), self.OnCopyDirURL),
            ("#" + _("Send to _player"), self.OnPlayFiles),
            ("#" + _("View Metadata of file(s)"), self.OnDownloadMeta),
            ("#" + _("Open Directory"), self.OnOpenDirectory),
            ("#" + _("Search"), self.OnFileSearch),
            (1, _("User(s)"), self.popup_menu_users, self.OnPopupMenuUsers),
            ("", None),
            ("#" + _("_Retry"), self.OnRetryTransfer),
            ("", None),
            ("#" + _("Abor_t"), self.OnAbortTransfer),
            ("#" + _("Abort & Delete"), self.OnAbortRemoveTransfer),
            ("#" + _("_Clear"), self.OnClearTransfer),
            ("", None),
            (1, _("Clear Groups"), self.popup_menu2, None)
        )

        frame.DownloadList.connect("button_press_event", self.OnPopupMenu, "mouse")
        frame.DownloadList.connect("key-press-event", self.on_key_press_event)
        cols = frame.DownloadList.get_columns()

        for i in range(9):

            parent = cols[i].get_widget().get_ancestor(gtk.Button)
            if parent:
                parent.connect("button_press_event", PressHeader)

            # Read Show / Hide column settings from last session
            cols[i].set_visible(self.frame.np.config.sections["columns"]["downloads_columns"][i])

        frame.clearFinishedAbortedButton.connect("clicked", self.OnClearFinishedAborted)
        frame.clearQueuedButton.connect("clicked", self.OnTryClearQueued)
        frame.retryTransferButton.connect("clicked", self.OnRetryTransfer)
        frame.abortTransferButton.connect("clicked", self.OnSelectAbortTransfer)
        frame.deleteTransferButton.connect("clicked", self.OnAbortRemoveTransfer)
        frame.banDownloadButton.connect("clicked", self.OnBan)
        frame.DownloadList.expand_all()

        self.frame.ToggleAutoRetry.set_active(self.frame.np.config.sections["transfers"]["autoretry_downloads"])
        frame.ToggleAutoRetry.connect("toggled", self.OnToggleAutoRetry)

        self.frame.ToggleTreeDownloads.set_active(self.frame.np.config.sections["transfers"]["groupdownloads"])
        frame.ToggleTreeDownloads.connect("toggled", self.OnToggleTree)
        self.OnToggleTree(None)

        self.frame.ExpandDownloads.set_active(self.frame.np.config.sections["transfers"]["downloadsexpanded"])
        frame.ExpandDownloads.connect("toggled", self.OnExpandDownloads)
        self.OnExpandDownloads(None)

    def saveColumns(self):
        columns = []
        widths = []
        for column in self.frame.DownloadList.get_columns():
            columns.append(column.get_visible())
            widths.append(column.get_width())
        self.frame.np.config.sections["columns"]["downloads_columns"] = columns
        self.frame.np.config.sections["columns"]["downloads_widths"] = widths 
    def OnToggleAutoRetry(self, widget):
        self.frame.np.config.sections["transfers"]["autoretry_downloads"] = self.frame.ToggleAutoRetry.get_active()

    def OnTryClearQueued(self, widget):

        direction = "down"
        win = OptionDialog(self.frame, _("Clear All Queued Downloads?"), modal=True, status=None, option=False, third="")
        win.connect("response", self.frame.on_clear_response, direction)
        win.set_title(_("Nicotine+") + ": " + _("Clear Queued Transfers"))
        win.set_icon(self.frame.images["n"])
        win.show()

    def expandcollapse(self, path):

        if self.frame.ExpandDownloads.get_active():
            self.frame.DownloadList.expand_row(path, True)
        else:
            self.frame.DownloadList.collapse_row(path)

    def OnExpandDownloads(self, widget):

        expanded = self.frame.ExpandDownloads.get_active()

        if expanded:
            self.frame.DownloadList.expand_all()
            self.frame.ExpandDownloadsImage.set_from_stock(gtk.STOCK_REMOVE, 4)
        else:
            self.frame.DownloadList.collapse_all()
            self.frame.ExpandDownloadsImage.set_from_stock(gtk.STOCK_ADD, 4)

        self.frame.np.config.sections["transfers"]["downloadsexpanded"] = expanded
        self.frame.np.config.writeConfiguration()

    def OnToggleTree(self, widget):

        self.TreeUsers = self.frame.ToggleTreeDownloads.get_active()
        self.frame.np.config.sections["transfers"]["groupdownloads"] = self.TreeUsers

        if not self.TreeUsers:
            self.frame.ExpandDownloads.hide()
        else:
            self.frame.ExpandDownloads.show()

        self.RebuildTransfers()

    def MetaBox(self, title="Meta Data", message="", data=None, modal=True, Search=False):

        win = MetaDialog(self.frame, message,  data, modal, Search=Search)
        win.set_title(title)
        win.set_icon(self.frame.images["n"])
        win.show()
        gtk.main()

        return win.ret

    def SelectedResultsAllData(self, model, path, iter, data):
        if iter in self.selected_users:
            return

        user = model.get_value(iter, 0)
        filename = model.get_value(iter, 1)
        fullname = model.get_value(iter, 10)
        size = speed = "0"
        length = bitrate = None
        queue = immediate = num = country = bitratestr = ""

        for transfer in self.frame.np.transfers.downloads:
            if transfer.user == user and fullname == transfer.filename:
                size = HumanSize(transfer.size)
                try:
                    speed = str(int(transfer.speed))
                    speed += _(" KB/s")
                except:
                    pass
                bitratestr = str(transfer.bitrate)
                length = str(transfer.length)

        directory = fullname.rsplit("\\", 1)[0]

        data[len(data)] = {
            "user": user,
            "fn": fullname,
            "position": num,
            "filename": filename,
            "directory": directory,
            "size": size,
            "speed": speed,
            "queue": queue,
            "immediate": immediate,
            "bitrate": bitratestr,
            "length": length,
            "country": country
        }

    def OnDownloadMeta(self, widget):

        if not self.frame.np.transfers:
            return

        data = {}
        self.widget.get_selection().selected_foreach(self.SelectedResultsAllData, data)

        if data != {}:
            self.MetaBox(title=_("Nicotine+:") + " " + _("Downloads Metadata"), message=_("<b>Metadata</b> for Downloads"), data=data, modal=True, Search=False)

    def OnOpenDirectory(self, widget):

        downloaddir = self.frame.np.config.sections["transfers"]["downloaddir"]
        incompletedir = self.frame.np.config.sections["transfers"]["incompletedir"]

        if incompletedir == "":
            incompletedir = downloaddir

        filemanager = self.frame.np.config.sections["ui"]["filemanager"]
        transfer = self.selected_transfers[0]

        complete_path = os.path.join(downloaddir, transfer.path)

        if transfer.path is "":
            if transfer.status is "Finished":
                executeCommand(filemanager, downloaddir)
            else:
                executeCommand(filemanager, incompletedir)
        elif os.path.exists(complete_path):  # and tranfer.status is "Finished"
            executeCommand(filemanager, complete_path)
        else:
            executeCommand(filemanager, incompletedir)

    def RebuildTransfers(self):

        if self.frame.np.transfers is None:
            return

        self.Clear()
        self.update()

    def select_transfers(self):
        self.selected_transfers = []
        self.selected_users = []
        self.widget.get_selection().selected_foreach(self.SelectedTransfersCallback)

    def OnBan(self, widgets):
        self.select_transfers()
        for user in self.selected_users:
            self.frame.BanUser(user)

    def OnSelectAbortTransfer(self, widget):
        self.select_transfers()
        self.OnAbortTransfer(widget, False)

    def OnSelectUserTransfer(self, widget):

        if len(self.selected_users) == 0:
            return

        selected_user = widget.parent.user

        sel = self.frame.DownloadList.get_selection()
        fmodel = self.frame.DownloadList.get_model()
        sel.unselect_all()

        for item in self.transfers:
            user_file, iter, transfer = item
            user, filepath = user_file
            if selected_user == user:
                ix = fmodel.get_path(iter)
                sel.select_path(ix,)

        self.select_transfers()

    def on_key_press_event(self, widget, event):

        key = gtk.gdk.keyval_name(event.keyval)

        if key in ("P", "p"):
            self.OnPopupMenu(widget, event, "keyboard")
        else:
            self.select_transfers()

            if key in ("T", "t"):
                self.OnAbortTransfer(widget)
            elif key in ("R", "r"):
                self.OnRetryTransfer(widget)
            elif key == "Delete":
                self.OnAbortTransfer(widget, True, True)

    def OnPlayFiles(self, widget, prefix=""):
        start_new_thread(self._OnPlayFiles, (widget, prefix))

    def _OnPlayFiles(self, widget, prefix=""):

        executable = self.frame.np.config.sections["players"]["default"]
        downloaddir = self.frame.np.config.sections["transfers"]["downloaddir"]

        if "$" not in executable:
            return

        for fn in self.selected_transfers:

            if fn.file is None:
                continue
            playfile = None

            if os.path.exists(fn.file.name):
                playfile = fn.file.name
            else:
                # If this file doesn't exist anymore, it may have finished downloading and have been renamed
                # try looking in the download directory and match the original filename.
                basename = string.split(fn.filename, '\\')[-1]
                path = os.sep.join([downloaddir, basename])
                if os.path.exists(path):
                    playfile = path

            if playfile:
                executeCommand(executable, playfile, background=False)

    def OnPopupMenuUsers(self, widget):

        self.selected_transfers = []
        self.selected_users = []
        self.widget.get_selection().selected_foreach(self.SelectedTransfersCallback)

        self.popup_menu_users.clear()

        if len(self.selected_users) > 0:

            items = []
            self.selected_users.sort(key=str.lower)

            for user in self.selected_users:

                popup = PopupMenu(self.frame)
                popup.setup(
                    ("#" + _("Send _message"), popup.OnSendMessage),
                    ("#" + _("Show IP a_ddress"), popup.OnShowIPaddress),
                    ("#" + _("Get user i_nfo"), popup.OnGetUserInfo),
                    ("#" + _("Brow_se files"), popup.OnBrowseUser),
                    ("#" + _("Gi_ve privileges"), popup.OnGivePrivileges),
                    ("", None),
                    ("$" + _("_Add user to list"), popup.OnAddToList),
                    ("$" + _("_Ban this user"), popup.OnBanUser),
                    ("$" + _("_Ignore this user"), popup.OnIgnoreUser),
                    ("#" + _("Select User's Transfers"), self.OnSelectUserTransfer)
                )
                popup.set_user(user)

                items.append((1, user, popup, self.OnPopupMenuUser, popup))

            self.popup_menu_users.setup(*items)

        return True

    def OnPopupMenuUser(self, widget, popup=None):

        if popup is None:
            return

        menu = popup
        user = menu.user
        items = menu.get_children()

        act = False
        if len(self.selected_users) >= 1:
            act = True

        items[0].set_sensitive(act)
        items[1].set_sensitive(act)
        items[2].set_sensitive(act)
        items[3].set_sensitive(act)

        items[6].set_active(user in [i[0] for i in self.frame.np.config.sections["server"]["userlist"]])
        items[7].set_active(user in self.frame.np.config.sections["server"]["banlist"])
        items[8].set_active(user in self.frame.np.config.sections["server"]["ignorelist"])

        for i in range(4, 9):
            items[i].set_sensitive(act)

        return True

    def DoubleClick(self, event):

        self.select_transfers()
        dc = self.frame.np.config.sections["transfers"]["download_doubleclick"]

        if dc == 1:  # Send to player
            self.OnPlayFiles(None)
        elif dc == 2:  # File manager
            self.OnOpenDirectory(None)
        elif dc == 3:  # Search
            self.OnFileSearch(None)
        elif dc == 4:  # Abort
            self.OnAbortTransfer(None, False)
        elif dc == 5:  # Clear
            self.OnClearTransfer(None)
        elif dc == 6:  # Retry
            self.OnRetryTransfer(None)

    def OnPopupMenu(self, widget, event, kind):

        if kind == "mouse":
            if event.button != 3:
                if event.button == 1 and event.type == gtk.gdk._2BUTTON_PRESS:
                    self.DoubleClick(event)
                return False

        self.selected_transfers = []
        self.selected_users = []
        self.widget.get_selection().selected_foreach(self.SelectedTransfersCallback)

        users = len(self.selected_users) > 0
        multi_users = len(self.selected_users) > 1
        files = len(self.selected_transfers) > 0
        multi_files = len(self.selected_transfers) > 1

        self.SelectCurrentRow(event, kind)

        items = self.popup_menu.get_children()
        if users:
            items[7].set_sensitive(True)  # Users Menu
        else:
            items[7].set_sensitive(False)  # Users Menu

        if files:
            act = True
        else:
            act = False

        items[0].set_sensitive(act)  # Place
        items[4].set_sensitive(act)  # Send to player
        items[5].set_sensitive(act)  # View Meta
        items[6].set_sensitive(act)  # File manager
        items[8].set_sensitive(act)  # Search filename

        act = False
        if not multi_files and files:
            act = True

        items[2].set_sensitive(act)  # Copy URL
        items[3].set_sensitive(act)  # Copy Folder URL

        if not users or not files:
            # Disable options
            # Abort, Abort and Remove, retry, clear
            act = False
        else:
            act = True

        for i in range(10, 15):
            items[i].set_sensitive(act)

        self.popup_menu.popup(None, None, None, 3, event.time)

        if kind == "keyboard":
            widget.emit_stop_by_name("key_press_event")
        elif kind == "mouse":
            widget.emit_stop_by_name("button_press_event")

        return True

    def update(self, transfer=None, forced=False):

        TransferList.update(self, transfer, forced)
        if transfer is None and self.frame.np.transfers is not None:
            self.frame.np.transfers.SaveDownloads()

    def OnGetPlaceInQueue(self, widget):

        self.select_transfers()

        for i in self.selected_transfers:
            if i.status != "Queued":
                continue
            self.frame.np.ProcessRequestToPeer(i.user, slskmessages.PlaceInQueueRequest(None, i.filename))

    def OnFileSearch(self, widget):

        self.select_transfers()

        for transfer in self.selected_transfers:
            self.frame.SearchEntry.set_text(transfer.filename.rsplit("\\", 1)[1])
            self.frame.ChangeMainPage(None, "search")
            break

    def OnRetryTransfer(self, widget):

        self.select_transfers()

        for transfer in self.selected_transfers:

            if transfer.status in ["Finished", "Old"]:
                continue

            self.frame.np.transfers.AbortTransfer(transfer)
            transfer.req = None
            self.frame.np.transfers.getFile(transfer.user, transfer.filename, transfer.path, transfer)

        self.frame.np.transfers.SaveDownloads()

    def OnAbortRemoveTransfer(self, widget):
        self.select_transfers()
        self.OnClearTransfer(widget)
Пример #14
0
    def __init__(self, userinfos, user, conn):
        self.wTree = gtk.glade.XML(
            os.path.join(os.path.dirname(os.path.realpath(__file__)),
                         "userinfo.glade"), None)
        widgets = self.wTree.get_widget_prefix("")
        for i in widgets:
            name = gtk.glade.get_widget_name(i)
            self.__dict__[name] = i
        self.UserInfoTab.remove(self.Main)
        self.UserInfoTab.destroy()
        self.wTree.signal_autoconnect(self)
        self.userinfos = userinfos
        self.frame = userinfos.frame
        #self.tooltips = self.frame.tooltips
        #if not self.frame.np.config.sections["ui"]["tooltips"]:
        #	self.tooltips.disable()
        self.frame.np.queue.put(slskmessages.UserInterests(user))
        self.user = user
        self.conn = conn
        self._descr = ""
        self.image_pixbuf = None
        self.zoom_factor = 5
        self.actual_zoom = 0
        self.status = 0

        self.hatesStore = gtk.ListStore(gobject.TYPE_STRING)
        self.Hates.set_model(self.hatesStore)
        cols = InitialiseColumns(self.Hates,
                                 [_("Hates"), 0, "text", self.CellDataFunc])
        cols[0].set_sort_column_id(0)
        self.hatesStore.set_sort_column_id(0, gtk.SORT_ASCENDING)

        self.likesStore = gtk.ListStore(gobject.TYPE_STRING)
        self.Likes.set_model(self.likesStore)
        cols = InitialiseColumns(self.Likes,
                                 [_("Likes"), 0, "text", self.CellDataFunc])
        cols[0].set_sort_column_id(0)
        self.likesStore.set_sort_column_id(0, gtk.SORT_ASCENDING)

        self.Elist = {}
        self.encoding, m = EncodingsMenu(self.frame.np, "userencoding", user)
        self.EncodingStore = gtk.ListStore(gobject.TYPE_STRING,
                                           gobject.TYPE_STRING)
        self.Encoding.set_size_request(100, -1)
        self.Encoding.set_model(self.EncodingStore)

        cell = gtk.CellRendererText()
        self.Encoding.pack_start(cell, True)
        self.Encoding.add_attribute(cell, 'text', 0)
        cell2 = gtk.CellRendererText()
        self.Encoding.pack_start(cell2, False)
        self.Encoding.add_attribute(cell2, 'text', 1)
        for item in m:
            self.Elist[item[1]] = self.EncodingStore.append([item[1], item[0]])
            if self.encoding == item[1]:
                self.Encoding.set_active_iter(self.Elist[self.encoding])

        self.tag_local = self.makecolour(buffer, "chatremote")
        self.ChangeColours()
        self.InterestsExpander.connect("activate", self.ExpanderStatus)
        self.InformationExpander.connect("activate", self.ExpanderStatus)
        self.DescriptionExpander.connect("activate", self.ExpanderStatus)
        self.likes_popup_menu = popup = PopupMenu(self)
        popup.setup(
            ("$" + _("I _like this"), self.frame.OnLikeRecommendation),
            ("$" + _("I _don't like this"),
             self.frame.OnDislikeRecommendation),
            ("", None),
            ("#" + _("_Search for this item"), self.frame.OnRecommendSearch,
             gtk.STOCK_FIND),
        )
        self.Likes.connect("button_press_event", self.OnPopupLikesMenu)

        self.hates_popup_menu = popup = PopupMenu(self)
        popup.setup(
            ("$" + _("I _like this"), self.frame.OnLikeRecommendation),
            ("$" + _("I _don't like this"),
             self.frame.OnDislikeRecommendation),
            ("", None),
            ("#" + _("_Search for this item"), self.frame.OnRecommendSearch,
             gtk.STOCK_FIND),
        )
        self.Hates.connect("button_press_event", self.OnPopupHatesMenu)

        self.image_menu = popup = PopupMenu(self)
        popup.setup(
            ("#" + _("Zoom 1:1"), self.MakeZoomNormal, gtk.STOCK_ZOOM_100),
            ("#" + _("Zoom In"), self.MakeZoomIn, gtk.STOCK_ZOOM_IN),
            ("#" + _("Zoom Out"), self.MakeZoomOut, gtk.STOCK_ZOOM_OUT),
            ("", None),
            ("#" + _("Save Image"), self.OnSavePicture, gtk.STOCK_SAVE),
        )
Пример #15
0
    def __init__(self, chats, user):

        self.user = user
        self.chats = chats
        self.frame = chats.frame

        # We should reference the user as soon as possible
        self.chats.users[self.user] = self

        builder = gtk.Builder()

        builder.set_translation_domain('nicotine')
        builder.add_from_file(
            os.path.join(os.path.dirname(os.path.realpath(__file__)), "ui",
                         "privatechat.ui"))

        self.PrivateChatTab = builder.get_object("PrivateChatTab")

        for i in builder.get_objects():
            try:
                self.__dict__[gtk.Buildable.get_name(i)] = i
            except TypeError:
                pass

        self.PrivateChatTab.remove(self.Main)
        self.PrivateChatTab.destroy()

        builder.connect_signals(self)

        self.autoreplied = 0
        self.offlinemessage = 0
        self.status = -1
        self.clist = []

        # Encoding Combobox
        self.Elist = {}
        self.encoding, m = EncodingsMenu(self.frame.np, "userencoding", user)
        self.EncodingStore = gtk.ListStore(gobject.TYPE_STRING,
                                           gobject.TYPE_STRING)
        self.Encoding.set_model(self.EncodingStore)

        cell = gtk.CellRendererText()
        self.Encoding.pack_start(cell, True)
        self.Encoding.add_attribute(cell, 'text', 0)

        cell2 = gtk.CellRendererText()
        self.Encoding.pack_start(cell2, False)
        self.Encoding.add_attribute(cell2, 'text', 1)

        for item in m:
            self.Elist[item[1]] = self.EncodingStore.append([item[1], item[0]])
            if self.encoding == item[1]:
                self.Encoding.set_active_iter(self.Elist[self.encoding])

        if self.frame.SEXY and self.frame.np.config.sections["ui"][
                "spellcheck"]:
            import sexy
            self.hbox5.remove(self.ChatLine)
            self.ChatLine.destroy()
            self.ChatLine = sexy.SpellEntry()
            self.ChatLine.show()
            self.ChatLine.connect("activate", self.OnEnter)
            self.ChatLine.connect("key_press_event", self.OnKeyPress)
            self.hbox5.pack_start(self.ChatLine)
            self.hbox5.reorder_child(self.ChatLine, 0)

        completion = gtk.EntryCompletion()
        self.ChatLine.set_completion(completion)
        liststore = gtk.ListStore(gobject.TYPE_STRING)
        completion.set_model(liststore)

        completion.set_text_column(0)
        completion.set_match_func(self.frame.EntryCompletionFindMatch,
                                  self.ChatLine)
        completion.connect("match-selected",
                           self.frame.EntryCompletionFoundMatch, self.ChatLine)

        self.Log.set_active(
            self.frame.np.config.sections["logging"]["privatechat"])

        self.popup_menu_user = popup = PopupMenu(self.frame)
        popup.setup(
            ("#" + _("Show IP a_ddress"), popup.OnShowIPaddress),
            ("#" + _("Get user i_nfo"), popup.OnGetUserInfo),
            ("#" + _("Brow_se files"), popup.OnBrowseUser),
            ("#" + _("Gi_ve privileges"), popup.OnGivePrivileges),
            ("#" + _("Client Version"), popup.OnVersion), ("", None),
            ("$" + _("Add user to list"), popup.OnAddToList),
            ("$" + _("Ban this user"), popup.OnBanUser),
            ("$" + _("Ignore this user"), popup.OnIgnoreUser),
            ("$" + _("B_lock this user's IP Address"), popup.OnBlockUser),
            ("$" + _("Ignore this user's IP Address"), popup.OnIgnoreIP))

        popup.set_user(user)

        self.popup_menu = popup = PopupMenu(self.frame)
        popup.setup(("USERMENU", _("User"), self.popup_menu_user,
                     self.OnPopupMenuUser), ("", None),
                    ("#" + _("Find"), self.OnFindChatLog), ("", None),
                    ("#" + _("Copy"), self.OnCopyChatLog),
                    ("#" + _("Copy All"), self.OnCopyAllChatLog), ("", None),
                    ("#" + _("Clear log"), self.OnClearChatLog), ("", None),
                    ("#" + _("Close"), self.OnClose))

        popup.set_user(user)

        self.ChatScroll.connect("button_press_event", self.OnPopupMenu)
        self.ChatScroll.connect("key_press_event", self.OnPopupMenu)

        self.UpdateColours()

        self.chats.UpdateCompletions()

        self.ReadPrivateLog()
Пример #16
0
class Uploads(TransferList):
    def __init__(self, frame):
        TransferList.__init__(self, frame, frame.UploadList)
        self.myvbox = self.frame.vboxuploads
        self.frame.UploadList.set_property("rules-hint", True)
        self.popup_menu2 = popup2 = PopupMenu(frame)
        popup2.setup(
            ("#" + _("Clear finished/erred"), self.OnClearFinishedErred, gtk.STOCK_CLEAR),
            ("#" + _("Clear finished/aborted"), self.OnClearFinishedAborted, gtk.STOCK_CLEAR),
            ("#" + _("Clear finished"), self.OnClearFinished, gtk.STOCK_CLEAR),
            ("#" + _("Clear aborted"), self.OnClearAborted, gtk.STOCK_CLEAR),
            ("#" + _("Clear queued"), self.OnClearQueued, gtk.STOCK_CLEAR),
            ("#" + _("Clear failed"), self.OnClearFailed, gtk.STOCK_CLEAR),
        )

        self.popup_menu_users = PopupMenu(frame)

        self.popup_menu = popup = PopupMenu(frame)
        popup.setup(
            ("#" + _("Copy _URL"), self.OnCopyURL, gtk.STOCK_COPY),
            ("#" + _("Copy folder URL"), self.OnCopyDirURL, gtk.STOCK_COPY),
            ("#" + _("Send to _player"), self.OnPlayFiles, gtk.STOCK_MEDIA_PLAY),
            ("#" + _("Open Directory"), self.OnOpenDirectory, gtk.STOCK_OPEN),
            ("#" + _("Search"), self.OnFileSearch, gtk.STOCK_FIND),
            (1, _("User(s)"), self.popup_menu_users, self.OnPopupMenuUsers),
            ("", None),
            ("#" + _("Abor_t"), self.OnAbortTransfer, gtk.STOCK_CANCEL),
            ("#" + _("_Clear"), self.OnClearTransfer, gtk.STOCK_CLEAR),
            ("#" + _("_Retry"), self.OnUploadTransfer, gtk.STOCK_REDO),
            ("", None),
            (1, _("Clear Groups"), self.popup_menu2, None),
        )
        frame.UploadList.connect("button_press_event", self.OnPopupMenu, "mouse")
        frame.UploadList.connect("key-press-event", self.on_key_press_event)
        cols = frame.UploadList.get_columns()
        for i in range(9):
            parent = cols[i].get_widget().get_ancestor(gtk.Button)
            if parent:
                parent.connect("button_press_event", PressHeader)
                # Read Show / Hide column settings from last session
            cols[i].set_visible(self.frame.np.config.sections["columns"]["uploads"][i])
        frame.clearUploadFinishedErredButton.connect("clicked", self.OnClearFinishedErred)
        frame.clearUploadQueueButton.connect("clicked", self.OnTryClearQueued)
        frame.abortUploadButton.connect("clicked", self.OnAbortTransfer)
        frame.abortUserUploadButton.connect("clicked", self.OnAbortUser)
        frame.banUploadButton.connect("clicked", self.OnBan)
        frame.UploadList.expand_all()

        self.frame.ToggleAutoclear.set_active(self.frame.np.config.sections["transfers"]["autoclear_uploads"])
        frame.ToggleAutoclear.connect("toggled", self.OnToggleAutoclear)
        self.frame.ToggleTreeUploads.set_active(self.frame.np.config.sections["transfers"]["groupuploads"])
        frame.ToggleTreeUploads.connect("toggled", self.OnToggleTree)
        self.OnToggleTree(None)
        self.frame.ExpandUploads.set_active(self.frame.np.config.sections["transfers"]["uploadsexpanded"])
        frame.ExpandUploads.connect("toggled", self.OnExpandUploads)
        self.OnExpandUploads(None)

    def saveColumns(self):
        columns = []
        for column in self.frame.UploadList.get_columns():
            columns.append(column.get_visible())
        self.frame.np.config.sections["columns"]["uploads"] = columns

    def OnTryClearQueued(self, widget):
        direction = "up"
        win = OptionDialog(self.frame, _("Clear All Queued Uploads?"), modal=True, status=None, option=False, third="")
        win.connect("response", self.frame.on_clear_response, direction)
        win.set_title(_("Nicotine+") + ": " + _("Clear Queued Transfers"))
        win.set_icon(self.frame.images["n"])
        win.show()

    def OnOpenDirectory(self, widget):

        downloaddir = self.frame.np.config.sections["transfers"]["downloaddir"]
        incompletedir = self.frame.np.config.sections["transfers"]["incompletedir"]
        if incompletedir == "":
            incompletedir = downloaddir
        filemanager = self.frame.np.config.sections["ui"]["filemanager"]
        transfer = self.selected_transfers[0]

        command = ""
        if os.path.exists(transfer.path):
            executeCommand(filemanager, transfer.path)
        else:
            executeCommand(filemanager, incompletedir)

    def OnFileSearch(self, widget):
        self.select_transfers()
        for transfer in self.selected_transfers:
            self.frame.SearchEntry.set_text(transfer.filename.rsplit("\\", 1)[1])
            self.frame.ChangeMainPage(None, "search")
            break

    def expandcollapse(self, path):
        if self.frame.ExpandUploads.get_active():
            self.frame.UploadList.expand_row(path, True)
        else:
            self.frame.UploadList.collapse_row(path)

    def OnExpandUploads(self, widget):
        expanded = self.frame.ExpandUploads.get_active()
        if expanded:
            self.frame.UploadList.expand_all()
            self.frame.ExpandUploadsImage.set_from_stock(gtk.STOCK_REMOVE, 4)
        else:
            self.frame.UploadList.collapse_all()
            self.frame.ExpandUploadsImage.set_from_stock(gtk.STOCK_ADD, 4)
        self.frame.np.config.sections["transfers"]["uploadsexpanded"] = expanded
        self.frame.np.config.writeConfiguration()

    def OnToggleAutoclear(self, widget):
        self.frame.np.config.sections["transfers"]["autoclear_uploads"] = self.frame.ToggleAutoclear.get_active()

    def OnToggleTree(self, widget):
        self.TreeUsers = self.frame.ToggleTreeUploads.get_active()
        self.frame.np.config.sections["transfers"]["groupuploads"] = self.TreeUsers
        self.RebuildTransfers()
        if not self.TreeUsers:
            self.frame.ExpandUploads.hide()
        else:
            self.frame.ExpandUploads.show()

    def RebuildTransfers(self):
        if self.frame.np.transfers is None:
            return
        self.Clear()
        self.update()

    def select_transfers(self):
        self.selected_transfers = []
        self.selected_users = []
        self.widget.get_selection().selected_foreach(self.SelectedTransfersCallback)

    def OnBan(self, widget):
        self.select_transfers()
        for user in self.selected_users:
            self.frame.BanUser(user)

    def OnAbortUser(self, widget):
        self.select_transfers()
        for user in self.selected_users:
            for i in self.list[:]:
                if i.user == user:
                    if i not in self.selected_transfers:
                        self.selected_transfers.append(i)

        TransferList.OnAbortTransfer(self, widget, False, False)
        self.frame.np.transfers.calcUploadQueueSizes()
        self.frame.np.transfers.checkUploadQueue()

    def OnUploadTransfer(self, widget):
        self.select_transfers()
        for transfer in self.selected_transfers:
            filename = transfer.filename
            path = transfer.path
            user = transfer.user

            if user in self.frame.np.transfers.getTransferringUsers():
                continue
            self.frame.np.ProcessRequestToPeer(user, slskmessages.UploadQueueNotification(None))
            self.frame.np.transfers.pushFile(user, filename, path, transfer)
        self.frame.np.transfers.checkUploadQueue()

    def OnSelectUserTransfer(self, widet):
        if len(self.selected_users) != 1:
            return
        selected_user = self.selected_users[0]

        sel = self.frame.UploadList.get_selection()
        fmodel = self.frame.UploadList.get_model()
        sel.unselect_all()

        for item in self.transfers:
            user_file, iter, transfer = item
            user, filepath = user_file
            if selected_user == user:
                ix = fmodel.get_path(iter)
                sel.select_path(ix)

        self.select_transfers()

    def on_key_press_event(self, widget, event):
        key = gtk.gdk.keyval_name(event.keyval)

        if key in ("P", "p"):
            self.OnPopupMenu(widget, event, "keyboard")
        else:
            self.selected_transfers = []
            self.selected_users = []
            self.widget.get_selection().selected_foreach(self.SelectedTransfersCallback)

            if key in ("T", "t"):
                self.OnAbortTransfer(widget)
            elif key == "Delete":
                self.OnAbortTransfer(widget, False, True)

    def OnPlayFiles(self, widget, prefix=""):
        start_new_thread(self._OnPlayFiles, (widget, prefix))

    def _OnPlayFiles(self, widget, prefix=""):
        executable = self.frame.np.config.sections["players"]["default"]
        if "$" not in executable:
            return
        for fn in self.selected_transfers:
            file = fn.filename.replace("\\", os.sep)
            if os.path.exists(file):
                executeCommand(executable, file, background=False)

    def OnPopupMenuUsers(self, widget):

        self.selected_transfers = []
        self.selected_users = []
        self.widget.get_selection().selected_foreach(self.SelectedTransfersCallback)

        self.popup_menu_users.clear()
        if len(self.selected_users) > 0:
            items = []
            self.selected_users.sort(key=str.lower)
            for user in self.selected_users:
                popup = PopupMenu(self.frame)
                popup.setup(
                    ("#" + _("Send _message"), popup.OnSendMessage, gtk.STOCK_EDIT),
                    ("#" + _("Show IP a_ddress"), popup.OnShowIPaddress, gtk.STOCK_NETWORK),
                    ("#" + _("Get user i_nfo"), popup.OnGetUserInfo, gtk.STOCK_DIALOG_INFO),
                    ("#" + _("Brow_se files"), popup.OnBrowseUser, gtk.STOCK_HARDDISK),
                    ("#" + _("Gi_ve privileges"), popup.OnGivePrivileges, gtk.STOCK_JUMP_TO),
                    ("", None),
                    ("$" + _("_Add user to list"), popup.OnAddToList),
                    ("$" + _("_Ban this user"), popup.OnBanUser),
                    ("$" + _("_Ignore this user"), popup.OnIgnoreUser),
                    ("#" + _("Select User's Transfers"), self.OnSelectUserTransfer, gtk.STOCK_INDEX),
                )
                popup.set_user(user)

                items.append((1, user, popup, self.OnPopupMenuUser, popup))
            self.popup_menu_users.setup(*items)
        return True

    def OnPopupMenuUser(self, widget, popup=None):
        if popup is None:
            return
        menu = popup
        user = menu.user
        items = menu.get_children()

        act = False
        if len(self.selected_users) >= 1:
            act = True
        items[0].set_sensitive(act)
        items[1].set_sensitive(act)
        items[2].set_sensitive(act)
        items[3].set_sensitive(act)

        items[6].set_active(user in [i[0] for i in self.frame.np.config.sections["server"]["userlist"]])
        items[7].set_active(user in self.frame.np.config.sections["server"]["banlist"])
        items[8].set_active(user in self.frame.np.config.sections["server"]["ignorelist"])

        for i in range(4, 9):
            items[i].set_sensitive(act)
        return True

    def OnPopupMenu(self, widget, event, kind):
        if kind == "mouse":
            if event.button != 3:
                if event.button == 1 and event.type == gtk.gdk._2BUTTON_PRESS:
                    self.DoubleClick(event)
                return False

        self.selected_transfers = []
        self.selected_users = []
        self.widget.get_selection().selected_foreach(self.SelectedTransfersCallback)

        self.SelectCurrentRow(event, kind)

        users = len(self.selected_users) > 0
        multi_users = len(self.selected_users) > 1
        files = len(self.selected_transfers) > 0
        multi_files = len(self.selected_transfers) > 1

        items = self.popup_menu.get_children()
        if users:
            items[5].set_sensitive(True)  # Users Menu
        else:
            items[5].set_sensitive(False)  # Users Menu
        if files and not multi_files:
            act = True
        else:
            act = False
        items[0].set_sensitive(act)
        items[1].set_sensitive(act)

        if users and files:
            act = True
        else:
            act = False
        for i in range(3, 5) + range(6, 10):
            items[i].set_sensitive(act)

        items[2].set_sensitive(act)  # send to player

        self.popup_menu.popup(None, None, None, 3, event.time)
        if kind == "keyboard":
            widget.emit_stop_by_name("key_press_event")
        elif kind == "mouse":
            widget.emit_stop_by_name("button_press_event")
        return True

    def ClearByUser(self, user):
        for i in self.list[:]:
            if i.user == user:
                if i.transfertimer is not None:
                    i.transfertimer.cancel()
                self.list.remove(i)
        self.frame.np.transfers.calcUploadQueueSizes()
        self.frame.np.transfers.checkUploadQueue()
        self.update()

    def DoubleClick(self, event):
        self.select_transfers()
        dc = self.frame.np.config.sections["transfers"]["upload_doubleclick"]

        if dc == 1:  # Send to player
            self.OnPlayFiles(None)
        elif dc == 2:  # File manager
            self.OnOpenDirectory(None)
        elif dc == 3:  # Search
            self.OnFileSearch(None)
        elif dc == 4:  # Abort
            self.OnAbortTransfer(None, False)
        elif dc == 5:  # Clear
            self.OnClearTransfer(None)

    def OnAbortTransfer(self, widget, remove=False, clear=False):
        self.select_transfers()
        TransferList.OnAbortTransfer(self, widget, remove, clear)
        self.frame.np.transfers.calcUploadQueueSizes()
        self.frame.np.transfers.checkUploadQueue()
        self.update()

    def OnClearQueued(self, widget):
        self.select_transfers()
        TransferList.OnClearQueued(self, widget)
        self.frame.np.transfers.calcUploadQueueSizes()
        self.frame.np.transfers.checkUploadQueue()
        self.update()

    def OnClearFailed(self, widget):
        TransferList.OnClearFailed(self, widget)
        self.frame.np.transfers.calcUploadQueueSizes()
        self.frame.np.transfers.checkUploadQueue()
        self.update()
Пример #17
0
class UserBrowse:
    def __init__(self, userbrowses, user, conn, data_dir):
        self.data_dir = data_dir

        # Build the window
        builder = gtk.Builder()

        builder.set_translation_domain('nicotine')
        builder.add_from_file(
            os.path.join(os.path.dirname(os.path.realpath(__file__)), "ui",
                         "userbrowse.ui"))

        self.UserBrowseTab = builder.get_object("UserBrowseTab")

        for i in builder.get_objects():
            try:
                self.__dict__[gtk.Buildable.get_name(i)] = i
            except TypeError:
                pass

        self.UserBrowseTab.remove(self.Main)
        self.UserBrowseTab.destroy()

        builder.connect_signals(self)

        self.userbrowses = userbrowses

        self.frame = userbrowses.frame
        self.user = user
        self.conn = conn

        # selected_folder is the current selected folder
        self.selected_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.encoding, m = EncodingsMenu(self.frame.np, "userencoding", user)

        # Encoding Combobox
        self.Elist = {}
        self.EncodingStore = gtk.ListStore(gobject.TYPE_STRING,
                                           gobject.TYPE_STRING)
        self.Encoding.set_model(self.EncodingStore)

        cell = gtk.CellRendererText()
        self.Encoding.pack_start(cell, True)
        self.Encoding.add_attribute(cell, 'text', 0)

        cell2 = gtk.CellRendererText()
        self.Encoding.pack_start(cell2, False)
        self.Encoding.add_attribute(cell2, 'text', 1)

        for item in m:
            self.Elist[item[1]] = self.EncodingStore.append([item[1], item[0]])
            if self.encoding == item[1]:
                self.Encoding.set_active_iter(self.Elist[self.encoding])

        self.DirStore = gtk.TreeStore(str, str)

        self.FolderTreeView.set_headers_visible(True)
        self.FolderTreeView.set_enable_tree_lines(True)

        cols = InitialiseColumns(
            self.FolderTreeView,
            [_("Directories"), -1, "text", self.CellDataFunc]  # 0
        )
        cols[0].set_sort_column_id(0)

        self.popup_menu_users = PopupMenu(self.frame)
        self.popup_menu_users2 = PopupMenu(self.frame)
        for menu in [self.popup_menu_users, self.popup_menu_users2]:
            menu.setup(("#" + _("Send _message"), menu.OnSendMessage),
                       ("#" + _("Show IP a_ddress"), menu.OnShowIPaddress),
                       ("#" + _("Get user i_nfo"), menu.OnGetUserInfo),
                       ("#" + _("Gi_ve privileges"), menu.OnGivePrivileges),
                       ("", None),
                       ("$" + _("_Add user to list"), menu.OnAddToList),
                       ("$" + _("_Ban this user"), menu.OnBanUser),
                       ("$" + _("_Ignore this user"), menu.OnIgnoreUser))

        self.popup_menu_downloads_folders = PopupMenu(self.frame)
        self.popup_menu_downloads_folders.setup(
            ("#" + _("_Download directory"), self.OnDownloadDirectory),
            ("#" + _("Download directory _to..."), self.OnDownloadDirectoryTo),
            ("#" + _("Download _recursive"),
             self.OnDownloadDirectoryRecursive),
            ("#" + _("Download r_ecursive to..."),
             self.OnDownloadDirectoryRecursiveTo))

        self.popup_menu_downloads_files = PopupMenu(self.frame)
        self.popup_menu_downloads_files.setup(
            ("#" + _("_Download file(s)"), self.OnDownloadFiles),
            ("#" + _("Download _to..."), self.OnDownloadFilesTo), ("", None),
            ("#" + _("_Download directory"), self.OnDownloadDirectory),
            ("#" + _("Download directory _to..."), self.OnDownloadDirectoryTo),
            ("#" + _("Download _recursive"),
             self.OnDownloadDirectoryRecursive),
            ("#" + _("Download r_ecursive to..."),
             self.OnDownloadDirectoryRecursiveTo))

        self.popup_menu_uploads_folders = PopupMenu(self.frame)
        self.popup_menu_uploads_folders.setup(
            ("#" + _("Upload Directory to..."), self.OnUploadDirectoryTo),
            ("#" + _("Upload Directory recursive to..."),
             self.OnUploadDirectoryRecursiveTo))

        self.popup_menu_uploads_files = PopupMenu(self.frame)
        self.popup_menu_uploads_files.setup(
            ("#" + _("Upload Directory to..."), self.OnUploadDirectoryTo),
            ("#" + _("Upload Directory recursive to..."),
             self.OnUploadDirectoryRecursiveTo),
            ("#" + _("Up_load file(s)"), self.OnUploadFiles))

        self.folder_popup_menu = PopupMenu(self.frame)
        self.folder_popup_menu.set_user(user)

        if user == self.frame.np.config.sections["server"]["login"]:
            self.folder_popup_menu.setup(
                ("USERMENU", _("User"), self.popup_menu_users,
                 self.OnPopupMenuFolderUser), ("", None),
                (1, _("Download"), self.popup_menu_downloads_folders,
                 self.OnPopupMenuDummy),
                (1, _("Upload"), self.popup_menu_uploads_folders,
                 self.OnPopupMenuDummy), ("", None),
                ("#" + _("Copy _URL"), self.OnCopyDirURL),
                ("#" + _("Open in File Manager"), self.OnFileManager))
        else:
            self.folder_popup_menu.setup(
                ("USERMENU", _("User"), self.popup_menu_users,
                 self.OnPopupMenuFolderUser), ("", None),
                (1, _("Download"), self.popup_menu_downloads_folders,
                 self.OnPopupMenuDummy), ("", None),
                ("#" + _("Copy _URL"), self.OnCopyDirURL))

        self.FolderTreeView.connect("button_press_event", self.OnFolderClicked)
        self.FolderTreeView.get_selection().connect("changed",
                                                    self.OnSelectDir)

        # DecodedFilename, HSize, Bitrate, HLength, Size, Length, RawFilename
        self.FileStore = gtk.ListStore(str, str, str, str, gobject.TYPE_INT64,
                                       int, str)

        self.FileTreeView.set_model(self.FileStore)
        cols = InitialiseColumns(
            self.FileTreeView, [_("Filename"), 250, "text", self.CellDataFunc],
            [_("Size"), 100, "text", self.CellDataFunc],
            [_("Bitrate"), 70, "text", self.CellDataFunc],
            [_("Length"), 50, "text", self.CellDataFunc])
        cols[0].set_sort_column_id(0)
        cols[1].set_sort_column_id(4)
        cols[2].set_sort_column_id(2)
        cols[3].set_sort_column_id(5)
        self.FileStore.set_sort_column_id(0, gtk.SORT_ASCENDING)

        for i in range(4):
            parent = cols[i].get_widget().get_ancestor(gtk.Button)
            if parent:
                parent.connect('button_press_event', PressHeader)

        # Read Show / Hide column settings from last session
        self.FileTreeView.get_selection().set_mode(gtk.SELECTION_MULTIPLE)
        self.FileTreeView.set_headers_clickable(True)
        self.FileTreeView.set_property("rules-hint", True)

        self.file_popup_menu = PopupMenu(self.frame)

        if user == self.frame.np.config.sections["server"]["login"]:
            self.file_popup_menu.setup(
                ("USERMENU", "User", self.popup_menu_users2,
                 self.OnPopupMenuFileUser), ("", None),
                (1, _("Download"), self.popup_menu_downloads_files,
                 self.OnPopupMenuDummy),
                (1, _("Upload"), self.popup_menu_uploads_files,
                 self.OnPopupMenuDummy), ("", None),
                ("#" + _("Copy _URL"), self.OnCopyURL),
                ("#" + _("Send to _player"), self.OnPlayFiles),
                ("#" + _("Open in File Manager"), self.OnFileManager))
        else:
            self.file_popup_menu.setup(
                ("USERMENU", "User", self.popup_menu_users2,
                 self.OnPopupMenuFileUser), ("", None),
                (1, _("Download"), self.popup_menu_downloads_files,
                 self.OnPopupMenuDummy), ("", None),
                ("#" + _("Copy _URL"), self.OnCopyURL))

        self.FileTreeView.connect("button_press_event", self.OnFileClicked)

        self.ChangeColours()

        for name, object in self.__dict__.items():
            if type(object) is PopupMenu:
                object.set_user(self.user)

    def OnPopupMenuDummy(self, widget):
        pass

    def Attach(self, widget=None):
        self.userbrowses.attach_tab(self.Main)

    def Detach(self, widget=None):
        self.userbrowses.detach_tab(
            self.Main,
            _("Nicotine+ User Browse: %(user)s (%(status)s)") % {
                'user': self.user,
                'status': [_("Offline"), _("Away"),
                           _("Online")][self.status]
            })

    def ConnClose(self):
        pass

    def OnPopupMenuFileUser(self, widget):
        self.OnPopupMenuUsers(self.popup_menu_users2)

    def OnPopupMenuFolderUser(self, widget):
        self.OnPopupMenuUsers(self.popup_menu_users)

    def OnPopupMenuUsers(self, menu):

        items = menu.get_children()

        act = True
        items[0].set_sensitive(act)
        items[1].set_sensitive(act)
        items[2].set_sensitive(act)

        items[5].set_active(self.user in [
            i[0] for i in self.frame.np.config.sections["server"]["userlist"]
        ])
        items[6].set_active(
            self.user in self.frame.np.config.sections["server"]["banlist"])
        items[7].set_active(
            self.user in self.frame.np.config.sections["server"]["ignorelist"])

        for i in range(3, 8):
            items[i].set_sensitive(act)

        return True

    def ChangeColours(self):
        self.frame.SetTextBG(self.FileTreeView)
        self.frame.SetTextBG(self.FolderTreeView)
        self.frame.SetTextBG(self.entry4)

        self.frame.ChangeListFont(
            self.FolderTreeView,
            self.frame.np.config.sections["ui"]["browserfont"])
        self.frame.ChangeListFont(
            self.FileTreeView,
            self.frame.np.config.sections["ui"]["browserfont"])

    def CellDataFunc(self, column, cellrenderer, model, iter):
        colour = self.frame.np.config.sections["ui"]["search"]
        if colour == "":
            colour = None
        cellrenderer.set_property("foreground", colour)

    def decode(self, str):
        return self.frame.np.decode(str, self.encoding)

    def OnExpand(self, widget):

        if self.ExpandButton.get_active():
            self.FolderTreeView.expand_all()
            self.ExpandDirectoriesImage.set_from_stock(gtk.STOCK_REMOVE, 4)
        else:
            self.FolderTreeView.collapse_all()
            self.ExpandDirectoriesImage.set_from_stock(gtk.STOCK_ADD, 4)

            dirs = list(self.directories.keys())
            dirs.sort()

            if dirs != []:
                self.SetDirectory(dirs[0])
            else:
                self.SetDirectory(None)

    def OnFolderClicked(self, widget, event):

        if event.button == 1 and event.type == gtk.gdk._2BUTTON_PRESS:
            self.OnDownloadDirectory(widget)
            return True
        elif event.button == 3:
            return self.OnFolderPopupMenu(widget, event)

        return False

    def OnFolderPopupMenu(self, widget, event):

        act = True
        if self.selected_folder is None:
            act = False

        items = self.folder_popup_menu.get_children()
        for item in items[1:]:
            item.set_sensitive(act)

        self.folder_popup_menu.popup(None, None, None, event.button,
                                     event.time)

    def SelectedFilesCallback(self, model, path, iter):
        rawfilename = self.FileStore.get_value(iter, 6)
        self.selected_files.append(rawfilename)

    def OnFileClicked(self, widget, event):

        if event.button == 1 and event.type == gtk.gdk._2BUTTON_PRESS:
            self.selected_files = []
            self.FileTreeView.get_selection().selected_foreach(
                self.SelectedFilesCallback)
            self.OnDownloadFiles(widget)
            self.FileTreeView.get_selection().unselect_all()
            return True
        elif event.button == 3:
            return self.OnFilePopupMenu(widget, event)

        return False

    def OnFilePopupMenu(self, widget, event):

        self.selected_files = []
        self.FileTreeView.get_selection().selected_foreach(
            self.SelectedFilesCallback)

        files = True
        multiple = False

        if len(self.selected_files) > 1:
            multiple = True

        if len(self.selected_files) >= 1:
            files = True
        else:
            files = False

        items = self.file_popup_menu.get_children()

        if self.user == self.frame.np.config.sections["server"]["login"]:
            items[2].set_sensitive(files)  # Downloads
            items[3].set_sensitive(files)  # Uploads
            items[5].set_sensitive(not multiple and files)  # Copy URL
            items[6].set_sensitive(files)  # Send to player
        else:
            items[2].set_sensitive(files)  # Downloads
            items[4].set_sensitive(not multiple and files)  # Copy URL

        self.FileTreeView.emit_stop_by_name("button_press_event")
        self.file_popup_menu.popup(None, None, None, event.button, event.time)

        return True

    def MakeNewModel(self, list):

        self.shares = list
        self.selected_folder = None
        self.selected_files = []
        self.directories.clear()
        self.files.clear()
        self.DirStore.clear()

        # Compute the number of shared dirs and total size
        self.totalsize = 0
        for dir, files in self.shares:
            for filedata in files:
                if filedata[2] < 18446744000000000000:
                    self.totalsize += filedata[2]
                else:
                    print "Unbelievable filesize: %s, %s" % (HumanSize(
                        filedata[2]), repr(filedata))

        self.AmountShared.set_text(_("Shared: %s") % HumanSize(self.totalsize))
        self.NumDirectories.set_text(_("Dirs: %s") % len(self.shares))

        # Generate the directory tree and select first directory
        currentdir = self.BrowseGetDirs()

        sel = self.FolderTreeView.get_selection()
        sel.unselect_all()
        if currentdir in self.directories:
            path = self.DirStore.get_path(self.directories[currentdir])
            if path is not None:
                sel.select_path(path)

        self.FolderTreeView.set_sensitive(True)
        self.FileTreeView.set_sensitive(True)
        self.SaveButton.set_sensitive(True)

        if self.ExpandButton.get_active():
            self.FolderTreeView.expand_all()
        else:
            self.FolderTreeView.collapse_all()

    def BrowseGetDirs(self):

        directory = ""
        dirseparator = '\\'

        # If there is no share
        if self.shares == []:

            # Set the model of the treeviex
            self.FolderTreeView.set_model(self.DirStore)

            # Sort the DirStore
            self.DirStore.set_sort_column_id(0, gtk.SORT_ASCENDING)

            return directory

        def builddicttree(p, s):
            """
                Build recursively a hierarchical dict containing raw subdir
                'p' is a reference to the parent
                's' a list of the subdir of a path

                ex of 's': ['music', 'rock', 'doors']
            """

            if s:
                subdir = s.pop(0)

                if subdir not in p:
                    p[subdir] = {}

                builddicttree(p[subdir], s)

        def buildgtktree(dictdir, parent, path):
            """
                Build recursively self.directories with iters pointing to directories
                'dictdir' is a hierarchical dict containing raw subdir
                'parent' is the iter pointing to the parent
                'path' is the current raw path
            """

            # Foreach subdir
            for subdir in dictdir.keys():

                if parent is None:
                    # The first sudirs are attached to the root (None)
                    current_path = subdir
                else:
                    # Other sudirs futher down the path are attached to their parent
                    current_path = dirseparator.join([path, subdir])

                self.directories[current_path] = self.DirStore.append(
                    parent, [self.decode(subdir), current_path])

                # If there are subdirs futher down the path: recurse
                if len(dictdir[subdir]):
                    buildgtktree(dictdir[subdir],
                                 self.directories[current_path], current_path)

        # For each shared dir we will complete the dictionnary
        dictdir = {}

        for dirshares, f in self.shares:

            # Split the path
            s = dirshares.split(dirseparator)

            # and build a hierarchical dictionnary containing raw subdir
            if len(s) >= 1:
                builddicttree(dictdir, s)

        # Append data to the DirStore
        buildgtktree(dictdir, None, None)

        # Select the first directory
        sortlist = list(self.directories.keys())
        sortlist.sort()

        directory = sortlist[0]

        # Sort the DirStore
        self.DirStore.set_sort_column_id(0, gtk.SORT_ASCENDING)

        # Set the model of the treeviex
        self.FolderTreeView.set_model(self.DirStore)

        return directory

    def SetDirectory(self, directory):

        self.selected_folder = directory
        self.FileStore.clear()
        self.files.clear()

        found_dir = False

        for d, f in self.shares:
            if d == directory:
                found_dir = True
                files = f
                break

        if not found_dir:
            return

        for file in files:
            # DecodedFilename, HSize, Bitrate, HLength, Size, Length, RawFilename
            rl = 0
            try:
                size = int(file[2])
            except ValueError:
                size = 0

            f = [self.decode(file[1]), Humanize(size)]

            if file[3] == "":
                f += ["", ""]
            else:
                # file[4] is for file types such as 'mp3'
                attrs = file[4]
                if attrs != [] and type(attrs) is list:

                    if len(attrs) >= 3:

                        br = str(attrs[0])
                        if attrs[2]:
                            br = br + " (vbr)"

                        try:
                            rl = int(attrs[1])
                        except ValueError:
                            rl = 0

                        l = "%i:%02i" % (rl / 60, rl % 60)
                        f += [br, l]
                    else:
                        f += ["", ""]
                else:
                    f += ["", ""]

            f += [long(size), rl, file[1]]

            try:
                self.files[f[0]] = self.FileStore.append(f)
            except Exception, error:
                displayTraceback()
Пример #18
0
    def __init__(self, frame):

        # Build the window
        self.frame = frame

        builder = gtk.Builder()

        builder.set_translation_domain('nicotine')
        builder.add_from_file(
            os.path.join(os.path.dirname(os.path.realpath(__file__)), "ui",
                         "buddylist.ui"))

        self.TempWindow = builder.get_object("TempWindow")

        for i in builder.get_objects():
            try:
                self.__dict__[gtk.Buildable.get_name(i)] = i
            except TypeError:
                pass

        self.TempWindow.remove(self.userlistvbox)
        self.TempWindow.destroy()

        builder.connect_signals(self)

        TARGETS = [('text/plain', 0, 1)]
        self.UserList.enable_model_drag_source(gtk.gdk.BUTTON1_MASK, TARGETS,
                                               gtk.gdk.ACTION_COPY)
        self.UserList.enable_model_drag_dest(TARGETS, gtk.gdk.ACTION_COPY)
        self.UserList.connect("drag_data_get",
                              self.buddylist_drag_data_get_data)
        self.UserList.connect("drag_data_received", self.DragUserToBuddylist)

        self.userlist = []

        self.usersmodel = gtk.ListStore(
            gtk.gdk.Pixbuf, gtk.gdk.Pixbuf, gobject.TYPE_STRING,
            gobject.TYPE_STRING, gobject.TYPE_STRING, gobject.TYPE_BOOLEAN,
            gobject.TYPE_BOOLEAN, gobject.TYPE_BOOLEAN, gobject.TYPE_STRING,
            gobject.TYPE_STRING, gobject.TYPE_INT, gobject.TYPE_INT,
            gobject.TYPE_INT, gobject.TYPE_INT, gobject.TYPE_STRING)
        statusiconwidth = self.frame.images["offline"].get_width() + 4

        self.cols = cols = InitialiseColumns(
            self.UserList, [_("Status"), statusiconwidth, "pixbuf"],
            [_("Country"), 25, "pixbuf"],
            [_("User"), 120, "text", self.CellDataFunc],
            [_("Speed"), 0, "number", self.CellDataFunc],
            [_("Files"), 0, "number", self.CellDataFunc],
            [_("Trusted"), 0, "toggle"], [_("Notify"), 0, "toggle"],
            [_("Privileged"), 0, "toggle"],
            [_("Last seen"), 160, "text", self.CellDataFunc],
            [_("Comments"), -1, "edit", self.CellDataFunc])

        self.col_status, self.col_country, self.col_user, self.col_speed, self.col_files, self.col_trusted, self.col_notify, self.col_privileged, self.col_last, self.col_comments = cols
        self.col_status.set_sort_column_id(10)
        self.col_country.set_sort_column_id(14)
        self.col_user.set_sort_column_id(2)
        self.col_speed.set_sort_column_id(11)
        self.col_files.set_sort_column_id(12)
        self.col_trusted.set_sort_column_id(5)
        self.col_notify.set_sort_column_id(6)
        self.col_privileged.set_sort_column_id(7)
        self.col_last.set_sort_column_id(13)
        self.col_comments.set_sort_column_id(9)
        self.col_status.get_widget().hide()
        self.col_country.get_widget().hide()

        config = self.frame.np.config.sections

        for i in range(10):

            parent = cols[i].get_widget().get_ancestor(gtk.Button)
            if parent:
                parent.connect('button_press_event', PressHeader)

            # Read Show / Hide column settings from last session
            cols[i].set_visible(config["columns"]["userlist"][i])

        if config["columns"]["hideflags"]:
            cols[1].set_visible(0)
            config["columns"]["userlist"][1] = 0

        for render in self.col_trusted.get_cell_renderers():
            render.connect('toggled', self.cell_toggle_callback, self.UserList,
                           5)

        for render in self.col_notify.get_cell_renderers():
            render.connect('toggled', self.cell_toggle_callback, self.UserList,
                           6)

        for render in self.col_privileged.get_cell_renderers():
            render.connect('toggled', self.cell_toggle_callback, self.UserList,
                           7)

        renderers = self.col_comments.get_cell_renderers()

        for render in renderers:
            render.connect('edited', self.cell_edited_callback, self.UserList,
                           9)

        self.UserList.set_model(self.usersmodel)
        self.UserList.set_property("rules-hint", True)
        self.privileged = []
        self.notify = []
        self.trusted = []

        for user in self.frame.np.config.sections["server"]["userlist"]:

            notify = user[2]
            privileged = user[3]

            if len(user) > 4:
                trusted = user[4]
            else:
                trusted = 0

            if len(user) > 5:
                last_seen = user[5]
                try:
                    time_from_epoch = time.mktime(
                        time.strptime(last_seen, "%m/%d/%Y %H:%M:%S"))
                except:
                    if last_seen == '':
                        time_from_epoch = sys.maxint
                    else:
                        time_from_epoch = 0
            else:
                last_seen = _("Never seen")
                user += [last_seen]
                time_from_epoch = 0

            if len(user) > 6:
                flag = user[6]
            else:
                user += [None]
                flag = None

            row = [
                self.frame.GetStatusImage(0),
                self.frame.GetFlagImage(flag), user[0], "0", "0", trusted,
                notify, privileged, last_seen, user[1], 0, 0, 0,
                int(time_from_epoch), flag
            ]

            if len(user) > 2:
                if user[2]:
                    self.notify.append(user[0])
                if user[3]:
                    self.privileged.append(user[0])
                if trusted:
                    self.trusted.append(user[0])

            iter = self.usersmodel.append(row)
            self.userlist.append([user[0], user[1], last_seen, iter, flag])

        self.usersmodel.set_sort_column_id(2, gtk.SORT_ASCENDING)
        self.Popup_Menu_PrivateRooms = PopupMenu(self.frame)
        self.popup_menu = popup = PopupMenu(frame)

        popup.setup(
            ("#" + _("Send _message"), popup.OnSendMessage), ("", None),
            ("#" + _("Show IP a_ddress"), popup.OnShowIPaddress),
            ("#" + _("Get user i_nfo"), popup.OnGetUserInfo),
            ("#" + _("Brow_se files"), popup.OnBrowseUser),
            ("#" + _("Gi_ve privileges"), popup.OnGivePrivileges),
            ("$" + _("_Ban this user"), popup.OnBanUser),
            ("$" + _("_Ignore this user"), popup.OnIgnoreUser), ("", None),
            ("$" + _("_Online notify"), self.OnNotify),
            ("$" + _("_Privileged"), self.OnPrivileged),
            ("$" + _("_Trusted"), self.OnTrusted), ("", None),
            ("#" + _("Edit _comments"), self.OnEditComments),
            ("#" + _("_Remove"), self.OnRemoveUser),
            (1, _("Private rooms"), self.Popup_Menu_PrivateRooms,
             popup.OnPrivateRooms))

        items = self.popup_menu.get_children()
        self.Menu_SendMessage = items[0]
        self.Menu_ShowIPaddress = items[2]
        self.Menu_GetUserInfo = items[3]
        self.Menu_BrowseUser = items[4]
        self.Menu_GivePrivileges = items[5]
        self.Menu_BanUser = items[6]
        self.Menu_IgnoreUser = items[7]
        self.Menu_OnNotify = items[9]
        self.Menu_OnPrivileged = items[10]
        self.Menu_OnTrusted = items[11]
        self.Menu_EditComments = items[13]
        self.Menu_RemoveUser = items[14]
        self.Menu_PrivateRooms = items[15]

        self.UserList.connect("button_press_event", self.OnPopupMenu)
Пример #19
0
    def __init__(self, userbrowses, user, conn, data_dir):
        self.data_dir = data_dir

        # Build the window
        builder = gtk.Builder()

        builder.set_translation_domain('nicotine')
        builder.add_from_file(
            os.path.join(os.path.dirname(os.path.realpath(__file__)), "ui",
                         "userbrowse.ui"))

        self.UserBrowseTab = builder.get_object("UserBrowseTab")

        for i in builder.get_objects():
            try:
                self.__dict__[gtk.Buildable.get_name(i)] = i
            except TypeError:
                pass

        self.UserBrowseTab.remove(self.Main)
        self.UserBrowseTab.destroy()

        builder.connect_signals(self)

        self.userbrowses = userbrowses

        self.frame = userbrowses.frame
        self.user = user
        self.conn = conn

        # selected_folder is the current selected folder
        self.selected_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.encoding, m = EncodingsMenu(self.frame.np, "userencoding", user)

        # Encoding Combobox
        self.Elist = {}
        self.EncodingStore = gtk.ListStore(gobject.TYPE_STRING,
                                           gobject.TYPE_STRING)
        self.Encoding.set_model(self.EncodingStore)

        cell = gtk.CellRendererText()
        self.Encoding.pack_start(cell, True)
        self.Encoding.add_attribute(cell, 'text', 0)

        cell2 = gtk.CellRendererText()
        self.Encoding.pack_start(cell2, False)
        self.Encoding.add_attribute(cell2, 'text', 1)

        for item in m:
            self.Elist[item[1]] = self.EncodingStore.append([item[1], item[0]])
            if self.encoding == item[1]:
                self.Encoding.set_active_iter(self.Elist[self.encoding])

        self.DirStore = gtk.TreeStore(str, str)

        self.FolderTreeView.set_headers_visible(True)
        self.FolderTreeView.set_enable_tree_lines(True)

        cols = InitialiseColumns(
            self.FolderTreeView,
            [_("Directories"), -1, "text", self.CellDataFunc]  # 0
        )
        cols[0].set_sort_column_id(0)

        self.popup_menu_users = PopupMenu(self.frame)
        self.popup_menu_users2 = PopupMenu(self.frame)
        for menu in [self.popup_menu_users, self.popup_menu_users2]:
            menu.setup(("#" + _("Send _message"), menu.OnSendMessage),
                       ("#" + _("Show IP a_ddress"), menu.OnShowIPaddress),
                       ("#" + _("Get user i_nfo"), menu.OnGetUserInfo),
                       ("#" + _("Gi_ve privileges"), menu.OnGivePrivileges),
                       ("", None),
                       ("$" + _("_Add user to list"), menu.OnAddToList),
                       ("$" + _("_Ban this user"), menu.OnBanUser),
                       ("$" + _("_Ignore this user"), menu.OnIgnoreUser))

        self.popup_menu_downloads_folders = PopupMenu(self.frame)
        self.popup_menu_downloads_folders.setup(
            ("#" + _("_Download directory"), self.OnDownloadDirectory),
            ("#" + _("Download directory _to..."), self.OnDownloadDirectoryTo),
            ("#" + _("Download _recursive"),
             self.OnDownloadDirectoryRecursive),
            ("#" + _("Download r_ecursive to..."),
             self.OnDownloadDirectoryRecursiveTo))

        self.popup_menu_downloads_files = PopupMenu(self.frame)
        self.popup_menu_downloads_files.setup(
            ("#" + _("_Download file(s)"), self.OnDownloadFiles),
            ("#" + _("Download _to..."), self.OnDownloadFilesTo), ("", None),
            ("#" + _("_Download directory"), self.OnDownloadDirectory),
            ("#" + _("Download directory _to..."), self.OnDownloadDirectoryTo),
            ("#" + _("Download _recursive"),
             self.OnDownloadDirectoryRecursive),
            ("#" + _("Download r_ecursive to..."),
             self.OnDownloadDirectoryRecursiveTo))

        self.popup_menu_uploads_folders = PopupMenu(self.frame)
        self.popup_menu_uploads_folders.setup(
            ("#" + _("Upload Directory to..."), self.OnUploadDirectoryTo),
            ("#" + _("Upload Directory recursive to..."),
             self.OnUploadDirectoryRecursiveTo))

        self.popup_menu_uploads_files = PopupMenu(self.frame)
        self.popup_menu_uploads_files.setup(
            ("#" + _("Upload Directory to..."), self.OnUploadDirectoryTo),
            ("#" + _("Upload Directory recursive to..."),
             self.OnUploadDirectoryRecursiveTo),
            ("#" + _("Up_load file(s)"), self.OnUploadFiles))

        self.folder_popup_menu = PopupMenu(self.frame)
        self.folder_popup_menu.set_user(user)

        if user == self.frame.np.config.sections["server"]["login"]:
            self.folder_popup_menu.setup(
                ("USERMENU", _("User"), self.popup_menu_users,
                 self.OnPopupMenuFolderUser), ("", None),
                (1, _("Download"), self.popup_menu_downloads_folders,
                 self.OnPopupMenuDummy),
                (1, _("Upload"), self.popup_menu_uploads_folders,
                 self.OnPopupMenuDummy), ("", None),
                ("#" + _("Copy _URL"), self.OnCopyDirURL),
                ("#" + _("Open in File Manager"), self.OnFileManager))
        else:
            self.folder_popup_menu.setup(
                ("USERMENU", _("User"), self.popup_menu_users,
                 self.OnPopupMenuFolderUser), ("", None),
                (1, _("Download"), self.popup_menu_downloads_folders,
                 self.OnPopupMenuDummy), ("", None),
                ("#" + _("Copy _URL"), self.OnCopyDirURL))

        self.FolderTreeView.connect("button_press_event", self.OnFolderClicked)
        self.FolderTreeView.get_selection().connect("changed",
                                                    self.OnSelectDir)

        # DecodedFilename, HSize, Bitrate, HLength, Size, Length, RawFilename
        self.FileStore = gtk.ListStore(str, str, str, str, gobject.TYPE_INT64,
                                       int, str)

        self.FileTreeView.set_model(self.FileStore)
        cols = InitialiseColumns(
            self.FileTreeView, [_("Filename"), 250, "text", self.CellDataFunc],
            [_("Size"), 100, "text", self.CellDataFunc],
            [_("Bitrate"), 70, "text", self.CellDataFunc],
            [_("Length"), 50, "text", self.CellDataFunc])
        cols[0].set_sort_column_id(0)
        cols[1].set_sort_column_id(4)
        cols[2].set_sort_column_id(2)
        cols[3].set_sort_column_id(5)
        self.FileStore.set_sort_column_id(0, gtk.SORT_ASCENDING)

        for i in range(4):
            parent = cols[i].get_widget().get_ancestor(gtk.Button)
            if parent:
                parent.connect('button_press_event', PressHeader)

        # Read Show / Hide column settings from last session
        self.FileTreeView.get_selection().set_mode(gtk.SELECTION_MULTIPLE)
        self.FileTreeView.set_headers_clickable(True)
        self.FileTreeView.set_property("rules-hint", True)

        self.file_popup_menu = PopupMenu(self.frame)

        if user == self.frame.np.config.sections["server"]["login"]:
            self.file_popup_menu.setup(
                ("USERMENU", "User", self.popup_menu_users2,
                 self.OnPopupMenuFileUser), ("", None),
                (1, _("Download"), self.popup_menu_downloads_files,
                 self.OnPopupMenuDummy),
                (1, _("Upload"), self.popup_menu_uploads_files,
                 self.OnPopupMenuDummy), ("", None),
                ("#" + _("Copy _URL"), self.OnCopyURL),
                ("#" + _("Send to _player"), self.OnPlayFiles),
                ("#" + _("Open in File Manager"), self.OnFileManager))
        else:
            self.file_popup_menu.setup(
                ("USERMENU", "User", self.popup_menu_users2,
                 self.OnPopupMenuFileUser), ("", None),
                (1, _("Download"), self.popup_menu_downloads_files,
                 self.OnPopupMenuDummy), ("", None),
                ("#" + _("Copy _URL"), self.OnCopyURL))

        self.FileTreeView.connect("button_press_event", self.OnFileClicked)

        self.ChangeColours()

        for name, object in self.__dict__.items():
            if type(object) is PopupMenu:
                object.set_user(self.user)
Пример #20
0
    def __init__(self, frame):
        TransferList.__init__(self, frame, frame.UploadList)
        self.myvbox = self.frame.vboxuploads
        self.frame.UploadList.set_property("rules-hint", True)
        self.popup_menu2 = popup2 = PopupMenu(frame)
        popup2.setup(
            ("#" + _("Clear finished/erred"), self.OnClearFinishedErred,
             gtk.STOCK_CLEAR),
            ("#" + _("Clear finished/aborted"), self.OnClearFinishedAborted,
             gtk.STOCK_CLEAR),
            ("#" + _("Clear finished"), self.OnClearFinished, gtk.STOCK_CLEAR),
            ("#" + _("Clear aborted"), self.OnClearAborted, gtk.STOCK_CLEAR),
            ("#" + _("Clear queued"), self.OnClearQueued, gtk.STOCK_CLEAR),
            ("#" + _("Clear failed"), self.OnClearFailed, gtk.STOCK_CLEAR),
        )

        self.popup_menu_users = PopupMenu(frame)

        self.popup_menu = popup = PopupMenu(frame)
        popup.setup(
            ("#" + _("Copy _URL"), self.OnCopyURL, gtk.STOCK_COPY),
            ("#" + _("Copy folder URL"), self.OnCopyDirURL, gtk.STOCK_COPY),
            ("#" + _("Send to _player"), self.OnPlayFiles,
             gtk.STOCK_MEDIA_PLAY),
            ("#" + _("Open Directory"), self.OnOpenDirectory, gtk.STOCK_OPEN),
            ("#" + _("Search"), self.OnFileSearch, gtk.STOCK_FIND),
            (1, _("User(s)"), self.popup_menu_users, self.OnPopupMenuUsers),
            ("", None),
            ("#" + _("Abor_t"), self.OnAbortTransfer, gtk.STOCK_CANCEL),
            ("#" + _("_Clear"), self.OnClearTransfer, gtk.STOCK_CLEAR),
            ("#" + _("_Retry"), self.OnUploadTransfer, gtk.STOCK_REDO),
            ("", None),
            (1, _("Clear Groups"), self.popup_menu2, None),
        )
        frame.UploadList.connect("button_press_event", self.OnPopupMenu,
                                 "mouse")
        frame.UploadList.connect("key-press-event", self.on_key_press_event)
        cols = frame.UploadList.get_columns()
        for i in range(9):
            parent = cols[i].get_widget().get_ancestor(gtk.Button)
            if parent:
                parent.connect('button_press_event', PressHeader)
            # Read Show / Hide column settings from last session
            cols[i].set_visible(
                self.frame.np.config.sections["columns"]["uploads"][i])
        frame.clearUploadFinishedErredButton.connect("clicked",
                                                     self.OnClearFinishedErred)
        frame.clearUploadQueueButton.connect("clicked", self.OnTryClearQueued)
        frame.abortUploadButton.connect("clicked", self.OnAbortTransfer)
        frame.abortUserUploadButton.connect("clicked", self.OnAbortUser)
        frame.banUploadButton.connect("clicked", self.OnBan)
        frame.UploadList.expand_all()

        self.frame.ToggleAutoclear.set_active(
            self.frame.np.config.sections["transfers"]["autoclear_uploads"])
        frame.ToggleAutoclear.connect("toggled", self.OnToggleAutoclear)
        self.frame.ToggleTreeUploads.set_active(
            self.frame.np.config.sections["transfers"]["groupuploads"])
        frame.ToggleTreeUploads.connect("toggled", self.OnToggleTree)
        self.OnToggleTree(None)
        self.frame.ExpandUploads.set_active(
            self.frame.np.config.sections["transfers"]["uploadsexpanded"])
        frame.ExpandUploads.connect("toggled", self.OnExpandUploads)
        self.OnExpandUploads(None)
Пример #21
0
class UserBrowse:
	def __init__(self, userbrowses, user, conn):
		self.wTree = gtk.glade.XML(os.path.join(os.path.dirname(os.path.realpath(__file__)), "userbrowse.glade" ), None, "nicotine" ) 
		widgets = self.wTree.get_widget_prefix("")
		for i in widgets:
			name = gtk.glade.get_widget_name(i)
			self.__dict__[name] = i
		self.UserBrowseTab.remove(self.Main)
		self.UserBrowseTab.destroy()
		#UserBrowseTab.__init__(self, False)
		self.wTree.signal_autoconnect(self)
		self.userbrowses = userbrowses

		self.frame = userbrowses.frame
		#self.tooltips = self.frame.tooltips
		#if not self.frame.np.config.sections["ui"]["tooltips"]:
		#	self.tooltips.disable()
		self.user = user
		self.conn = conn
		# selected_folder is a path for TreeStore, i.e. a tuple
		self.selected_folder = None
		self.search_list = []
		self.query = None
		self.search_position = 0
		self.selected_files = []
		
		self.shares = []
		self.Elist = {}
		# Iters for current FileStore
		self.files = {}
		self.totalsize = 0
		self.encoding, m = EncodingsMenu(self.frame.np, "userencoding", user)
		
		self.EncodingStore = gtk.ListStore(gobject.TYPE_STRING, gobject.TYPE_STRING)
		self.Encoding.set_size_request(100, -1)
		self.Encoding.set_model(self.EncodingStore)
		cell = gtk.CellRendererText()
		self.Encoding.pack_start(cell, True)
		self.Encoding.add_attribute(cell, 'text', 0)
		cell2 = gtk.CellRendererText()
		self.Encoding.pack_start(cell2, False)
	
		self.Encoding.add_attribute(cell2, 'text', 1)
		
		for item in m:
			self.Elist[item[1]] = self.EncodingStore.append([item[1], item[0] ])
			if self.encoding == item[1]:
				self.Encoding.set_active_iter(self.Elist[self.encoding])
		
		# Is there a need for this here?
		self.DirStore = UglyTree([gobject.TYPE_STRING, gobject.TYPE_STRING])
		self.FolderTreeView.set_model(self.DirStore)

		self.FolderTreeView.set_headers_visible(True)
		# GTK 2.10
		if gtk.pygtk_version[0] >= 2 and gtk.pygtk_version[1] >= 10:
			self.FolderTreeView.set_enable_tree_lines(True)

		cols = InitialiseColumns(self.FolderTreeView,
			[_("Directories"), -1, "text", self.CellDataFunc], #0
		)
		
		self.popup_menu_users = PopupMenu(self.frame)
		self.popup_menu_users2 = PopupMenu(self.frame)
		for menu in [self.popup_menu_users, self.popup_menu_users2]:
			menu.setup( 
				("#" + _("Send _message"), menu.OnSendMessage, gtk.STOCK_EDIT),
				("#" + _("Show IP a_ddress"), menu.OnShowIPaddress, gtk.STOCK_NETWORK),
				("#" + _("Get user i_nfo"), menu.OnGetUserInfo, gtk.STOCK_DIALOG_INFO),
				("#" + _("Gi_ve privileges"), menu.OnGivePrivileges, gtk.STOCK_JUMP_TO),
				("", None),
				("$" + _("_Add user to list"),  menu.OnAddToList),
				("$" + _("_Ban this user"), menu.OnBanUser),
				("$" + _("_Ignore this user"), menu.OnIgnoreUser),
			)
		
		self.popup_menu_downloads_folders = PopupMenu(self.frame)
		self.popup_menu_downloads_folders.setup( 
			("#" + _("_Download directory"), self.OnDownloadDirectory, gtk.STOCK_GO_DOWN),
			("#" + _("Download directory _to..."), self.OnDownloadDirectoryTo, gtk.STOCK_GO_DOWN),
			("#" + _("Download _recursive"), self.OnDownloadDirectoryRecursive, gtk.STOCK_GO_DOWN),
			("#" + _("Download r_ecursive to..."), self.OnDownloadDirectoryRecursiveTo, gtk.STOCK_GO_DOWN),
		)
		self.popup_menu_downloads_files = PopupMenu(self.frame)
		self.popup_menu_downloads_files.setup( 
			("#" + _("_Download file(s)"), self.OnDownloadFiles, gtk.STOCK_GO_DOWN),
			("#" + _("Download _to..."), self.OnDownloadFilesTo, gtk.STOCK_GO_DOWN),
			("", None),
			("#" + _("_Download directory"), self.OnDownloadDirectory, gtk.STOCK_GO_DOWN),
			("#" + _("Download directory _to..."), self.OnDownloadDirectoryTo, gtk.STOCK_GO_DOWN),
			("#" + _("Download _recursive"), self.OnDownloadDirectoryRecursive, gtk.STOCK_GO_DOWN),
			("#" + _("Download r_ecursive to..."), self.OnDownloadDirectoryRecursiveTo, gtk.STOCK_GO_DOWN),
		)
				
		self.popup_menu_uploads_folders = PopupMenu(self.frame)
		self.popup_menu_uploads_folders.setup( 
			("#" + _("Upload Directory to..."), self.OnUploadDirectoryTo, gtk.STOCK_GO_UP),
			("#" + _("Upload Directory recursive to..."), self.OnUploadDirectoryRecursiveTo, gtk.STOCK_GO_UP),
		)
		
		self.popup_menu_uploads_files = PopupMenu(self.frame)
		self.popup_menu_uploads_files.setup( 
			("#" + _("Upload Directory to..."), self.OnUploadDirectoryTo, gtk.STOCK_GO_UP),
			("#" + _("Upload Directory recursive to..."), self.OnUploadDirectoryRecursiveTo, gtk.STOCK_GO_UP),
			("#" + _("Up_load file(s)"), self.OnUploadFiles, gtk.STOCK_GO_UP),
		)
		
		self.folder_popup_menu  = PopupMenu(self.frame)
		self.folder_popup_menu.set_user(user)
		if user == self.frame.np.config.sections["server"]["login"]:
			self.folder_popup_menu.setup(
				("USERMENU", _("User"), self.popup_menu_users, self.OnPopupMenuFolderUser),
				("", None),
				(2, _("Download"), self.popup_menu_downloads_folders, self.OnPopupMenuDummy, gtk.STOCK_GO_DOWN),
				(2, _("Upload"), self.popup_menu_uploads_folders, self.OnPopupMenuDummy, gtk.STOCK_GO_UP),
				("", None),
				("#" + _("Copy _URL"), self.OnCopyDirURL, gtk.STOCK_COPY),
				("#" + _("Open in File Manager"), self.OnFileManager, gtk.STOCK_OPEN),
			)
		else:
			self.folder_popup_menu.setup(
				("USERMENU", _("User"), self.popup_menu_users, self.OnPopupMenuFolderUser),
				("", None),
				(2, _("Download"), self.popup_menu_downloads_folders, self.OnPopupMenuDummy, gtk.STOCK_GO_DOWN),
				("", None),
				("#" + _("Copy _URL"), self.OnCopyDirURL, gtk.STOCK_COPY),
			)
		
		self.FolderTreeView.connect("button_press_event", self.OnFolderClicked)
		self.FolderTreeView.get_selection().connect("changed", self.OnSelectDir)
		
		# DecodedFilename, HSize, Bitrate, HLength, Size, Length, RawFilename
		self.FileStore = gtk.ListStore(str, str, str, str, gobject.TYPE_INT64, int, str)

		self.FileTreeView.set_model(self.FileStore)
		cols = InitialiseColumns(self.FileTreeView,
			[_("Filename"), 250, "text", self.CellDataFunc],
			[_("Size"), 100, "number", self.CellDataFunc],
			[_("Bitrate"), 70, "text", self.CellDataFunc],
			[_("Length"), 50, "number", self.CellDataFunc],
		)
		cols[0].set_sort_column_id(0)
		cols[1].set_sort_column_id(4)
		cols[2].set_sort_column_id(2)
		cols[3].set_sort_column_id(5)
		self.FileStore.set_sort_column_id(0, gtk.SORT_ASCENDING)
		for i in range (4):
			parent = cols[i].get_widget().get_ancestor(gtk.Button)
			if parent:
				parent.connect('button_press_event', PressHeader)
			# Read Show / Hide column settings from last session
		self.FileTreeView.get_selection().set_mode(gtk.SELECTION_MULTIPLE)

		self.FileTreeView.set_headers_clickable(True)
		self.FileTreeView.set_property("rules-hint", True)
		
		self.file_popup_menu = PopupMenu(self.frame)
		
		if user == self.frame.np.config.sections["server"]["login"]:
			self.file_popup_menu.setup(
				("USERMENU", "User", self.popup_menu_users2, self.OnPopupMenuFileUser),
				("", None),
				(2, _("Download"), self.popup_menu_downloads_files, self.OnPopupMenuDummy, gtk.STOCK_GO_DOWN),
				(2, _("Upload"), self.popup_menu_uploads_files, self.OnPopupMenuDummy, gtk.STOCK_GO_UP),
				("", None),
				("#" + _("Copy _URL"), self.OnCopyURL, gtk.STOCK_COPY),
				("#" + _("Send to _player"), self.OnPlayFiles, gtk.STOCK_MEDIA_PLAY),
				("#" + _("Open in File Manager"), self.OnFileManager, gtk.STOCK_OPEN),
				
				
			
			)
		else:
			self.file_popup_menu.setup(
				("USERMENU", "User", self.popup_menu_users2, self.OnPopupMenuFileUser),
				("", None),
				(2, _("Download"), self.popup_menu_downloads_files, self.OnPopupMenuDummy, gtk.STOCK_GO_DOWN),
				("", None),
				("#" + _("Copy _URL"), self.OnCopyURL, gtk.STOCK_COPY),
			)
		self.FileTreeView.connect("button_press_event", self.OnFileClicked)
		self.ChangeColours()

		for name, object in self.__dict__.items():
			if type(object) is PopupMenu:
				object.set_user(self.user)
				
	def OnPopupMenuDummy(self, widget, something):
		pass
	
	def Attach(self, widget=None):
		self.userbrowses.attach_tab(self.Main)

		
	def Detach(self, widget=None):
		self.userbrowses.detach_tab(self.Main, _("Nicotine+ User Browse: %s (%s)") % (self.user, [_("Offline"), _("Away"), _("Online")][self.status]))
		
	def ConnClose(self):
		pass
		
	def OnPopupMenuFileUser(self, widget):
		self.OnPopupMenuUsers(self.popup_menu_users2)
		
	def OnPopupMenuFolderUser(self, widget):
		self.OnPopupMenuUsers(self.popup_menu_users)
		
	def OnPopupMenuUsers(self, menu):
		items = menu.get_children()

		act = True
		items[0].set_sensitive(act)
		items[1].set_sensitive(act)
		items[2].set_sensitive(act)

		items[5].set_active(self.user in [i[0] for i in self.frame.np.config.sections["server"]["userlist"]])
		items[6].set_active(self.user in self.frame.np.config.sections["server"]["banlist"])
		items[7].set_active(self.user in self.frame.np.config.sections["server"]["ignorelist"])
		
		for i in range(3, 8):
			items[i].set_sensitive(act)
		return True
		
	def ChangeColours(self):
		self.frame.SetTextBG(self.FileTreeView)
		self.frame.SetTextBG(self.FolderTreeView)
		self.frame.SetTextBG(self.entry4)
		
		self.frame.ChangeListFont(self.FolderTreeView, self.frame.np.config.sections["ui"]["browserfont"])
		self.frame.ChangeListFont(self.FileTreeView, self.frame.np.config.sections["ui"]["browserfont"])

		
	def CellDataFunc(self, column, cellrenderer, model, iter):
		colour = self.frame.np.config.sections["ui"]["search"]
		if colour == "":
			colour = None
		cellrenderer.set_property("foreground", colour)
			
	def decode(self, str):
		return self.frame.np.decode(str, self.encoding)
	
	def OnExpand(self, widget):
		if self.ExpandButton.get_active():
			self.FolderTreeView.expand_all()
			self.ExpandDirectoriesImage.set_from_stock(gtk.STOCK_REMOVE, 4)
		else:
			self.FolderTreeView.collapse_all()
			self.ExpandDirectoriesImage.set_from_stock(gtk.STOCK_ADD, 4)

			nchildren, node = self.DirStore.GetChildren(0,0)
			if nchildren > 0:
				self.SetDirectory((0,))
			else:
				self.SetDirectory(None)
			
	def OnFolderClicked(self, widget, event):
		if event.button == 1 and event.type == gtk.gdk._2BUTTON_PRESS:
			self.OnDownloadDirectory(widget)
			return True
		elif event.button == 3:
			return self.OnFolderPopupMenu(widget, event)
		return False
		
	def OnFolderPopupMenu(self, widget, event):
		act = True
		if self.selected_folder is None:
			act = False
		items = self.folder_popup_menu.get_children()
		for item in items[1:]:
			item.set_sensitive(act)

		self.folder_popup_menu.popup(None, None, None, event.button, event.time)
	
	def SelectedFilesCallback(self, model, path, iter):
		rawfilename = self.FileStore.get_value(iter, 6)
		self.selected_files.append(rawfilename)
	
	def OnFileClicked(self, widget, event):
		if event.button == 1 and event.type == gtk.gdk._2BUTTON_PRESS:
			self.selected_files = []
			self.FileTreeView.get_selection().selected_foreach(self.SelectedFilesCallback)
			self.OnDownloadFiles(widget)
			self.FileTreeView.get_selection().unselect_all()
			return True
		elif event.button == 3:
			return self.OnFilePopupMenu(widget, event)
		return False
			
	def OnFilePopupMenu(self, widget, event):
		self.selected_files = []
		self.FileTreeView.get_selection().selected_foreach(self.SelectedFilesCallback)
		
		files = True
		multiple = False
	
		if len(self.selected_files) > 1:
			multiple = True
		if len(self.selected_files) >= 1:
			files = True
		else:
			files = False
			
		items = self.file_popup_menu.get_children()
		
		if self.user == self.frame.np.config.sections["server"]["login"]:
			items[2].set_sensitive(files) # Downloads
			items[3].set_sensitive(files) # Uploads
			items[5].set_sensitive(not multiple and files) # Copy URL
			items[6].set_sensitive(files) # Send to player
		else:
			items[2].set_sensitive(files) # Downloads
			items[4].set_sensitive(not multiple and files) # Copy URL
			
		self.FileTreeView.emit_stop_by_name("button_press_event")
		self.file_popup_menu.popup(None, None, None, event.button, event.time)
		return True

	def MakeNewModel(self, list):
		self.shares = list
		self.selected_folder = None
		self.selected_files = []
		self.files.clear()
#		self.DirStore.clear()
		self.DirStore=None
		self.totalsize = 0
		
		self.FolderTreeView.set_model(None)
		self.DirStore = UglyTree([gobject.TYPE_STRING, gobject.TYPE_STRING], list)

		for dir, files in self.shares:
			for filedata in files:
				if filedata[2] < 18446744000000000000:
					self.totalsize += filedata[2]
				else:
					print "Unbelievable filesize: %s, %s" % (HumanizeBytes(filedata[2]), repr(filedata))
		self.AmountShared.set_text(_("Shared: %s") % HumanizeBytes(self.totalsize))
		self.NumDirectories.set_text(_("Dirs: %s") % len(self.shares))

		self.FolderTreeView.set_model(self.DirStore)
		sel = self.FolderTreeView.get_selection()
		sel.unselect_all()
		# Select first directory
		sel.select_path((0,))
		
		self.FolderTreeView.set_sensitive(True)
		self.FileTreeView.set_sensitive(True)
		self.SaveButton.set_sensitive(True)
		
		if self.ExpandButton.get_active():
			self.FolderTreeView.expand_all()
		else:
			self.FolderTreeView.collapse_all()
		
	def SetDirectory(self, path):
		self.selected_folder = path
		self.FileStore.clear()
		self.files.clear()
		
		node = self.DirStore.on_get_iter(path)
		if node == None or node == (0,0):
			return

		files = self.DirStore.GetData(node)
		for file in files:
			# DecodedFilename, HSize, Bitrate, HLength, Size, Length, RawFilename
			rl = 0
			try:
				size = int(file[2])
			except ValueError:
				size = 0
			f = [self.decode(file[1]), Humanize(size)]
			if file[3] == "":
				f += ["", ""]
			else:
				#file[4] is for file types such as 'mp3'
				attrs = file[4]
				if attrs != [] and type(attrs) is list:
					if len(attrs) >= 3:
						br = str(attrs[0])
						if len(attrs) > 2 and attrs[2]:
							br = br + _(" (vbr)")
						try:
							rl = int(attrs[1])
						except ValueError:
							rl = 0
						l = "%i:%02i" % (rl / 60, rl % 60)
						f += [br, l]
					else:
						f += ["", ""]
				else:
					f += ["", ""]
			f += [long(size), rl, file[1]]

			try:
				self.files[f[0]] = self.FileStore.append(f)
			except Exception, error:
				displayTraceback()
Пример #22
0
class Downloads(TransferList):
    def __init__(self, frame):

        TransferList.__init__(self,
                              frame,
                              frame.DownloadList,
                              type='downloads')
        self.myvbox = self.frame.downloadsvbox
        self.frame.DownloadList.set_property("rules-hint", True)
        self.accel_group = gtk.AccelGroup()

        self.popup_menu2 = popup2 = PopupMenu(frame)
        popup2.setup(
            ("#" + _("Clear finished/aborted"), self.OnClearFinishedAborted),
            ("#" + _("Clear finished"), self.OnClearFinished),
            ("#" + _("Clear aborted"), self.OnClearAborted),
            ("#" + _("Clear paused"), self.OnClearPaused),
            ("#" + _("Clear filtered"), self.OnClearFiltered),
            ("#" + _("Clear queued"), self.OnClearQueued))
        self.popup_menu_users = PopupMenu(frame)

        self.popup_menu = popup = PopupMenu(frame)
        popup.setup(
            ("#" + _("Get place in _queue"), self.OnGetPlaceInQueue),
            ("", None), ("#" + _("Copy _URL"), self.OnCopyURL),
            ("#" + _("Copy folder URL"), self.OnCopyDirURL),
            ("#" + _("Send to _player"), self.OnPlayFiles),
            ("#" + _("View Metadata of file(s)"), self.OnDownloadMeta),
            ("#" + _("Open Directory"), self.OnOpenDirectory),
            ("#" + _("Search"), self.OnFileSearch),
            (1, _("User(s)"), self.popup_menu_users, self.OnPopupMenuUsers),
            ("", None), ("#" + _("_Retry"), self.OnRetryTransfer), ("", None),
            ("#" + _("Abor_t"), self.OnAbortTransfer),
            ("#" + _("Abort & Delete"), self.OnAbortRemoveTransfer),
            ("#" + _("_Clear"), self.OnClearTransfer), ("", None),
            (1, _("Clear Groups"), self.popup_menu2, None))

        frame.DownloadList.connect("button_press_event", self.OnPopupMenu,
                                   "mouse")
        frame.DownloadList.connect("key-press-event", self.on_key_press_event)
        cols = frame.DownloadList.get_columns()

        for i in range(9):

            parent = cols[i].get_widget().get_ancestor(gtk.Button)
            if parent:
                parent.connect("button_press_event", PressHeader)

            # Read Show / Hide column settings from last session
            cols[i].set_visible(self.frame.np.config.sections["columns"]
                                ["downloads_columns"][i])

        frame.clearFinishedAbortedButton.connect("clicked",
                                                 self.OnClearFinishedAborted)
        frame.clearQueuedButton.connect("clicked", self.OnTryClearQueued)
        frame.retryTransferButton.connect("clicked", self.OnRetryTransfer)
        frame.abortTransferButton.connect("clicked",
                                          self.OnSelectAbortTransfer)
        frame.deleteTransferButton.connect("clicked",
                                           self.OnAbortRemoveTransfer)
        frame.banDownloadButton.connect("clicked", self.OnBan)
        frame.DownloadList.expand_all()

        self.frame.ToggleAutoRetry.set_active(
            self.frame.np.config.sections["transfers"]["autoretry_downloads"])
        frame.ToggleAutoRetry.connect("toggled", self.OnToggleAutoRetry)

        self.frame.ToggleTreeDownloads.set_active(
            self.frame.np.config.sections["transfers"]["groupdownloads"])
        frame.ToggleTreeDownloads.connect("toggled", self.OnToggleTree)
        self.OnToggleTree(None)

        self.frame.ExpandDownloads.set_active(
            self.frame.np.config.sections["transfers"]["downloadsexpanded"])
        frame.ExpandDownloads.connect("toggled", self.OnExpandDownloads)
        self.OnExpandDownloads(None)

    def saveColumns(self):
        columns = []
        widths = []
        for column in self.frame.DownloadList.get_columns():
            columns.append(column.get_visible())
            widths.append(column.get_width())
        self.frame.np.config.sections["columns"]["downloads_columns"] = columns
        self.frame.np.config.sections["columns"]["downloads_widths"] = widths

    def OnToggleAutoRetry(self, widget):
        self.frame.np.config.sections["transfers"][
            "autoretry_downloads"] = self.frame.ToggleAutoRetry.get_active()

    def OnTryClearQueued(self, widget):

        direction = "down"
        win = OptionDialog(self.frame,
                           _("Clear All Queued Downloads?"),
                           modal=True,
                           status=None,
                           option=False,
                           third="")
        win.connect("response", self.frame.on_clear_response, direction)
        win.set_title(_("Nicotine+") + ": " + _("Clear Queued Transfers"))
        win.set_icon(self.frame.images["n"])
        win.show()

    def expandcollapse(self, path):

        if self.frame.ExpandDownloads.get_active():
            self.frame.DownloadList.expand_row(path, True)
        else:
            self.frame.DownloadList.collapse_row(path)

    def OnExpandDownloads(self, widget):

        expanded = self.frame.ExpandDownloads.get_active()

        if expanded:
            self.frame.DownloadList.expand_all()
            self.frame.ExpandDownloadsImage.set_from_stock(gtk.STOCK_REMOVE, 4)
        else:
            self.frame.DownloadList.collapse_all()
            self.frame.ExpandDownloadsImage.set_from_stock(gtk.STOCK_ADD, 4)

        self.frame.np.config.sections["transfers"][
            "downloadsexpanded"] = expanded
        self.frame.np.config.writeConfiguration()

    def OnToggleTree(self, widget):

        self.TreeUsers = self.frame.ToggleTreeDownloads.get_active()
        self.frame.np.config.sections["transfers"][
            "groupdownloads"] = self.TreeUsers

        if not self.TreeUsers:
            self.frame.ExpandDownloads.hide()
        else:
            self.frame.ExpandDownloads.show()

        self.RebuildTransfers()

    def MetaBox(self,
                title="Meta Data",
                message="",
                data=None,
                modal=True,
                Search=False):

        win = MetaDialog(self.frame, message, data, modal, Search=Search)
        win.set_title(title)
        win.set_icon(self.frame.images["n"])
        win.show()
        gtk.main()

        return win.ret

    def SelectedResultsAllData(self, model, path, iter, data):
        if iter in self.selected_users:
            return

        user = model.get_value(iter, 0)
        filename = model.get_value(iter, 1)
        fullname = model.get_value(iter, 10)
        size = speed = "0"
        length = bitrate = None
        queue = immediate = num = country = bitratestr = ""

        for transfer in self.frame.np.transfers.downloads:
            if transfer.user == user and fullname == transfer.filename:
                size = HumanSize(transfer.size)
                try:
                    speed = str(int(transfer.speed))
                    speed += _(" KB/s")
                except:
                    pass
                bitratestr = str(transfer.bitrate)
                length = str(transfer.length)

        directory = fullname.rsplit("\\", 1)[0]

        data[len(data)] = {
            "user": user,
            "fn": fullname,
            "position": num,
            "filename": filename,
            "directory": directory,
            "size": size,
            "speed": speed,
            "queue": queue,
            "immediate": immediate,
            "bitrate": bitratestr,
            "length": length,
            "country": country
        }

    def OnDownloadMeta(self, widget):

        if not self.frame.np.transfers:
            return

        data = {}
        self.widget.get_selection().selected_foreach(
            self.SelectedResultsAllData, data)

        if data != {}:
            self.MetaBox(title=_("Nicotine+:") + " " + _("Downloads Metadata"),
                         message=_("<b>Metadata</b> for Downloads"),
                         data=data,
                         modal=True,
                         Search=False)

    def OnOpenDirectory(self, widget):

        downloaddir = self.frame.np.config.sections["transfers"]["downloaddir"]
        incompletedir = self.frame.np.config.sections["transfers"][
            "incompletedir"]

        if incompletedir == "":
            incompletedir = downloaddir

        filemanager = self.frame.np.config.sections["ui"]["filemanager"]
        transfer = self.selected_transfers[0]

        complete_path = os.path.join(downloaddir, transfer.path)

        if transfer.path is "":
            if transfer.status is "Finished":
                executeCommand(filemanager, downloaddir)
            else:
                executeCommand(filemanager, incompletedir)
        elif os.path.exists(complete_path):  # and tranfer.status is "Finished"
            executeCommand(filemanager, complete_path)
        else:
            executeCommand(filemanager, incompletedir)

    def RebuildTransfers(self):

        if self.frame.np.transfers is None:
            return

        self.Clear()
        self.update()

    def select_transfers(self):
        self.selected_transfers = []
        self.selected_users = []
        self.widget.get_selection().selected_foreach(
            self.SelectedTransfersCallback)

    def OnBan(self, widgets):
        self.select_transfers()
        for user in self.selected_users:
            self.frame.BanUser(user)

    def OnSelectAbortTransfer(self, widget):
        self.select_transfers()
        self.OnAbortTransfer(widget, False)

    def OnSelectUserTransfer(self, widget):

        if len(self.selected_users) == 0:
            return

        selected_user = widget.parent.user

        sel = self.frame.DownloadList.get_selection()
        fmodel = self.frame.DownloadList.get_model()
        sel.unselect_all()

        for item in self.transfers:
            user_file, iter, transfer = item
            user, filepath = user_file
            if selected_user == user:
                ix = fmodel.get_path(iter)
                sel.select_path(ix, )

        self.select_transfers()

    def on_key_press_event(self, widget, event):

        key = gtk.gdk.keyval_name(event.keyval)

        if key in ("P", "p"):
            self.OnPopupMenu(widget, event, "keyboard")
        else:
            self.select_transfers()

            if key in ("T", "t"):
                self.OnAbortTransfer(widget)
            elif key in ("R", "r"):
                self.OnRetryTransfer(widget)
            elif key == "Delete":
                self.OnAbortTransfer(widget, True, True)

    def OnPlayFiles(self, widget, prefix=""):
        start_new_thread(self._OnPlayFiles, (widget, prefix))

    def _OnPlayFiles(self, widget, prefix=""):

        executable = self.frame.np.config.sections["players"]["default"]
        downloaddir = self.frame.np.config.sections["transfers"]["downloaddir"]

        if "$" not in executable:
            return

        for fn in self.selected_transfers:

            if fn.file is None:
                continue
            playfile = None

            if os.path.exists(fn.file.name):
                playfile = fn.file.name
            else:
                # If this file doesn't exist anymore, it may have finished downloading and have been renamed
                # try looking in the download directory and match the original filename.
                basename = string.split(fn.filename, '\\')[-1]
                path = os.sep.join([downloaddir, basename])
                if os.path.exists(path):
                    playfile = path

            if playfile:
                executeCommand(executable, playfile, background=False)

    def OnPopupMenuUsers(self, widget):

        self.selected_transfers = []
        self.selected_users = []
        self.widget.get_selection().selected_foreach(
            self.SelectedTransfersCallback)

        self.popup_menu_users.clear()

        if len(self.selected_users) > 0:

            items = []
            self.selected_users.sort(key=str.lower)

            for user in self.selected_users:

                popup = PopupMenu(self.frame)
                popup.setup(
                    ("#" + _("Send _message"), popup.OnSendMessage),
                    ("#" + _("Show IP a_ddress"), popup.OnShowIPaddress),
                    ("#" + _("Get user i_nfo"), popup.OnGetUserInfo),
                    ("#" + _("Brow_se files"), popup.OnBrowseUser),
                    ("#" + _("Gi_ve privileges"), popup.OnGivePrivileges),
                    ("", None),
                    ("$" + _("_Add user to list"), popup.OnAddToList),
                    ("$" + _("_Ban this user"), popup.OnBanUser),
                    ("$" + _("_Ignore this user"), popup.OnIgnoreUser),
                    ("#" + _("Select User's Transfers"),
                     self.OnSelectUserTransfer))
                popup.set_user(user)

                items.append((1, user, popup, self.OnPopupMenuUser, popup))

            self.popup_menu_users.setup(*items)

        return True

    def OnPopupMenuUser(self, widget, popup=None):

        if popup is None:
            return

        menu = popup
        user = menu.user
        items = menu.get_children()

        act = False
        if len(self.selected_users) >= 1:
            act = True

        items[0].set_sensitive(act)
        items[1].set_sensitive(act)
        items[2].set_sensitive(act)
        items[3].set_sensitive(act)

        items[6].set_active(user in [
            i[0] for i in self.frame.np.config.sections["server"]["userlist"]
        ])
        items[7].set_active(
            user in self.frame.np.config.sections["server"]["banlist"])
        items[8].set_active(
            user in self.frame.np.config.sections["server"]["ignorelist"])

        for i in range(4, 9):
            items[i].set_sensitive(act)

        return True

    def DoubleClick(self, event):

        self.select_transfers()
        dc = self.frame.np.config.sections["transfers"]["download_doubleclick"]

        if dc == 1:  # Send to player
            self.OnPlayFiles(None)
        elif dc == 2:  # File manager
            self.OnOpenDirectory(None)
        elif dc == 3:  # Search
            self.OnFileSearch(None)
        elif dc == 4:  # Abort
            self.OnAbortTransfer(None, False)
        elif dc == 5:  # Clear
            self.OnClearTransfer(None)
        elif dc == 6:  # Retry
            self.OnRetryTransfer(None)

    def OnPopupMenu(self, widget, event, kind):

        if kind == "mouse":
            if event.button != 3:
                if event.button == 1 and event.type == gtk.gdk._2BUTTON_PRESS:
                    self.DoubleClick(event)
                return False

        self.selected_transfers = []
        self.selected_users = []
        self.widget.get_selection().selected_foreach(
            self.SelectedTransfersCallback)

        users = len(self.selected_users) > 0
        multi_users = len(self.selected_users) > 1
        files = len(self.selected_transfers) > 0
        multi_files = len(self.selected_transfers) > 1

        self.SelectCurrentRow(event, kind)

        items = self.popup_menu.get_children()
        if users:
            items[7].set_sensitive(True)  # Users Menu
        else:
            items[7].set_sensitive(False)  # Users Menu

        if files:
            act = True
        else:
            act = False

        items[0].set_sensitive(act)  # Place
        items[4].set_sensitive(act)  # Send to player
        items[5].set_sensitive(act)  # View Meta
        items[6].set_sensitive(act)  # File manager
        items[8].set_sensitive(act)  # Search filename

        act = False
        if not multi_files and files:
            act = True

        items[2].set_sensitive(act)  # Copy URL
        items[3].set_sensitive(act)  # Copy Folder URL

        if not users or not files:
            # Disable options
            # Abort, Abort and Remove, retry, clear
            act = False
        else:
            act = True

        for i in range(10, 15):
            items[i].set_sensitive(act)

        self.popup_menu.popup(None, None, None, 3, event.time)

        if kind == "keyboard":
            widget.emit_stop_by_name("key_press_event")
        elif kind == "mouse":
            widget.emit_stop_by_name("button_press_event")

        return True

    def update(self, transfer=None, forced=False):

        TransferList.update(self, transfer, forced)
        if transfer is None and self.frame.np.transfers is not None:
            self.frame.np.transfers.SaveDownloads()

    def OnGetPlaceInQueue(self, widget):

        self.select_transfers()

        for i in self.selected_transfers:
            if i.status != "Queued":
                continue
            self.frame.np.ProcessRequestToPeer(
                i.user, slskmessages.PlaceInQueueRequest(None, i.filename))

    def OnFileSearch(self, widget):

        self.select_transfers()

        for transfer in self.selected_transfers:
            self.frame.SearchEntry.set_text(
                transfer.filename.rsplit("\\", 1)[1])
            self.frame.ChangeMainPage(None, "search")
            break

    def OnRetryTransfer(self, widget):

        self.select_transfers()

        for transfer in self.selected_transfers:

            if transfer.status in ["Finished", "Old"]:
                continue

            self.frame.np.transfers.AbortTransfer(transfer)
            transfer.req = None
            self.frame.np.transfers.getFile(transfer.user, transfer.filename,
                                            transfer.path, transfer)

        self.frame.np.transfers.SaveDownloads()

    def OnAbortRemoveTransfer(self, widget):
        self.select_transfers()
        self.OnClearTransfer(widget)
Пример #23
0
class UserBrowse:

    def __init__(self, userbrowses, user, conn):

        self.wTree = gtk.glade.XML(os.path.join(os.path.dirname(os.path.realpath(__file__)), "userbrowse.glade"), None)
        widgets = self.wTree.get_widget_prefix("")

        for i in widgets:
            name = gtk.glade.get_widget_name(i)
            self.__dict__[name] = i

        self.UserBrowseTab.remove(self.Main)
        self.UserBrowseTab.destroy()

        self.wTree.signal_autoconnect(self)
        self.userbrowses = userbrowses

        self.frame = userbrowses.frame
        self.user = user
        self.conn = conn

        # selected_folder is the current selected folder
        self.selected_folder = None
        self.search_list = []
        self.query = None
        self.search_position = 0
        self.selected_files = []

        self.shares = []
        self.Elist = {}

        # Iters for current DirStore
        self.directories = {}

        # Iters for current FileStore
        self.files = {}
        self.totalsize = 0
        self.encoding, m = EncodingsMenu(self.frame.np, "userencoding", user)

        self.EncodingStore = gtk.ListStore(gobject.TYPE_STRING, gobject.TYPE_STRING)
        self.Encoding.set_size_request(100, -1)
        self.Encoding.set_model(self.EncodingStore)
        cell = gtk.CellRendererText()
        self.Encoding.pack_start(cell, True)
        self.Encoding.add_attribute(cell, 'text', 0)
        cell2 = gtk.CellRendererText()
        self.Encoding.pack_start(cell2, False)

        self.Encoding.add_attribute(cell2, 'text', 1)

        for item in m:
            self.Elist[item[1]] = self.EncodingStore.append([item[1], item[0]])
            if self.encoding == item[1]:
                self.Encoding.set_active_iter(self.Elist[self.encoding])

        self.DirStore = gtk.TreeStore(str, str)
        self.FolderTreeView.set_headers_visible(True)
        self.FolderTreeView.set_enable_tree_lines(True)

        cols = InitialiseColumns(
            self.FolderTreeView,
            [_("Directories"), -1, "text", self.CellDataFunc]  # 0
        )
        cols[0].set_sort_column_id(0)

        self.popup_menu_users = PopupMenu(self.frame)
        self.popup_menu_users2 = PopupMenu(self.frame)
        for menu in [self.popup_menu_users, self.popup_menu_users2]:
            menu.setup(
                ("#" + _("Send _message"), menu.OnSendMessage, gtk.STOCK_EDIT),
                ("#" + _("Show IP a_ddress"), menu.OnShowIPaddress, gtk.STOCK_NETWORK),
                ("#" + _("Get user i_nfo"), menu.OnGetUserInfo, gtk.STOCK_DIALOG_INFO),
                ("#" + _("Gi_ve privileges"), menu.OnGivePrivileges, gtk.STOCK_JUMP_TO),
                ("", None),
                ("$" + _("_Add user to list"),  menu.OnAddToList),
                ("$" + _("_Ban this user"), menu.OnBanUser),
                ("$" + _("_Ignore this user"), menu.OnIgnoreUser)
            )

        self.popup_menu_downloads_folders = PopupMenu(self.frame)
        self.popup_menu_downloads_folders.setup(
            ("#" + _("_Download directory"), self.OnDownloadDirectory, gtk.STOCK_GO_DOWN),
            ("#" + _("Download directory _to..."), self.OnDownloadDirectoryTo, gtk.STOCK_GO_DOWN),
            ("#" + _("Download _recursive"), self.OnDownloadDirectoryRecursive, gtk.STOCK_GO_DOWN),
            ("#" + _("Download r_ecursive to..."), self.OnDownloadDirectoryRecursiveTo, gtk.STOCK_GO_DOWN)
        )

        self.popup_menu_downloads_files = PopupMenu(self.frame)
        self.popup_menu_downloads_files.setup(
            ("#" + _("_Download file(s)"), self.OnDownloadFiles, gtk.STOCK_GO_DOWN),
            ("#" + _("Download _to..."), self.OnDownloadFilesTo, gtk.STOCK_GO_DOWN),
            ("", None),
            ("#" + _("_Download directory"), self.OnDownloadDirectory, gtk.STOCK_GO_DOWN),
            ("#" + _("Download directory _to..."), self.OnDownloadDirectoryTo, gtk.STOCK_GO_DOWN),
            ("#" + _("Download _recursive"), self.OnDownloadDirectoryRecursive, gtk.STOCK_GO_DOWN),
            ("#" + _("Download r_ecursive to..."), self.OnDownloadDirectoryRecursiveTo, gtk.STOCK_GO_DOWN)
        )

        self.popup_menu_uploads_folders = PopupMenu(self.frame)
        self.popup_menu_uploads_folders.setup(
            ("#" + _("Upload Directory to..."), self.OnUploadDirectoryTo, gtk.STOCK_GO_UP),
            ("#" + _("Upload Directory recursive to..."), self.OnUploadDirectoryRecursiveTo, gtk.STOCK_GO_UP)
        )

        self.popup_menu_uploads_files = PopupMenu(self.frame)
        self.popup_menu_uploads_files.setup(
            ("#" + _("Upload Directory to..."), self.OnUploadDirectoryTo, gtk.STOCK_GO_UP),
            ("#" + _("Upload Directory recursive to..."), self.OnUploadDirectoryRecursiveTo, gtk.STOCK_GO_UP),
            ("#" + _("Up_load file(s)"), self.OnUploadFiles, gtk.STOCK_GO_UP)
        )

        self.folder_popup_menu = PopupMenu(self.frame)
        self.folder_popup_menu.set_user(user)

        if user == self.frame.np.config.sections["server"]["login"]:
            self.folder_popup_menu.setup(
                ("USERMENU", _("User"), self.popup_menu_users, self.OnPopupMenuFolderUser),
                ("", None),
                (2, _("Download"), self.popup_menu_downloads_folders, self.OnPopupMenuDummy, gtk.STOCK_GO_DOWN),
                (2, _("Upload"), self.popup_menu_uploads_folders, self.OnPopupMenuDummy, gtk.STOCK_GO_UP),
                ("", None),
                ("#" + _("Copy _URL"), self.OnCopyDirURL, gtk.STOCK_COPY),
                ("#" + _("Open in File Manager"), self.OnFileManager, gtk.STOCK_OPEN)
            )
        else:
            self.folder_popup_menu.setup(
                ("USERMENU", _("User"), self.popup_menu_users, self.OnPopupMenuFolderUser),
                ("", None),
                (2, _("Download"), self.popup_menu_downloads_folders, self.OnPopupMenuDummy, gtk.STOCK_GO_DOWN),
                ("", None),
                ("#" + _("Copy _URL"), self.OnCopyDirURL, gtk.STOCK_COPY)
            )

        self.FolderTreeView.connect("button_press_event", self.OnFolderClicked)
        self.FolderTreeView.get_selection().connect("changed", self.OnSelectDir)

        # DecodedFilename, HSize, Bitrate, HLength, Size, Length, RawFilename
        self.FileStore = gtk.ListStore(str, str, str, str, gobject.TYPE_INT64, int, str)

        self.FileTreeView.set_model(self.FileStore)
        cols = InitialiseColumns(
            self.FileTreeView,
            [_("Filename"), 250, "text", self.CellDataFunc],
            [_("Size"), 100, "number", self.CellDataFunc],
            [_("Bitrate"), 70, "text", self.CellDataFunc],
            [_("Length"), 50, "number", self.CellDataFunc]
        )
        cols[0].set_sort_column_id(0)
        cols[1].set_sort_column_id(4)
        cols[2].set_sort_column_id(2)
        cols[3].set_sort_column_id(5)
        self.FileStore.set_sort_column_id(0, gtk.SORT_ASCENDING)

        for i in range(4):
            parent = cols[i].get_widget().get_ancestor(gtk.Button)
            if parent:
                parent.connect('button_press_event', PressHeader)

        # Read Show / Hide column settings from last session
        self.FileTreeView.get_selection().set_mode(gtk.SELECTION_MULTIPLE)
        self.FileTreeView.set_headers_clickable(True)
        self.FileTreeView.set_property("rules-hint", True)

        self.file_popup_menu = PopupMenu(self.frame)

        if user == self.frame.np.config.sections["server"]["login"]:
            self.file_popup_menu.setup(
                ("USERMENU", "User", self.popup_menu_users2, self.OnPopupMenuFileUser),
                ("", None),
                (2, _("Download"), self.popup_menu_downloads_files, self.OnPopupMenuDummy, gtk.STOCK_GO_DOWN),
                (2, _("Upload"), self.popup_menu_uploads_files, self.OnPopupMenuDummy, gtk.STOCK_GO_UP),
                ("", None),
                ("#" + _("Copy _URL"), self.OnCopyURL, gtk.STOCK_COPY),
                ("#" + _("Send to _player"), self.OnPlayFiles, gtk.STOCK_MEDIA_PLAY),
                ("#" + _("Open in File Manager"), self.OnFileManager, gtk.STOCK_OPEN)
            )
        else:
            self.file_popup_menu.setup(
                ("USERMENU", "User", self.popup_menu_users2, self.OnPopupMenuFileUser),
                ("", None),
                (2, _("Download"), self.popup_menu_downloads_files, self.OnPopupMenuDummy, gtk.STOCK_GO_DOWN),
                ("", None),
                ("#" + _("Copy _URL"), self.OnCopyURL, gtk.STOCK_COPY)
            )

        self.FileTreeView.connect("button_press_event", self.OnFileClicked)

        self.ChangeColours()

        for name, object in self.__dict__.items():
            if type(object) is PopupMenu:
                object.set_user(self.user)

    def OnPopupMenuDummy(self, widget, something):
        pass

    def Attach(self, widget=None):
        self.userbrowses.attach_tab(self.Main)

    def Detach(self, widget=None):
        self.userbrowses.detach_tab(
            self.Main,
            _("Nicotine+ User Browse: %(user)s (%(status)s)") % {
                'user': self.user,
                'status': [_("Offline"), _("Away"), _("Online")][self.status]
            }
        )

    def ConnClose(self):
        pass

    def OnPopupMenuFileUser(self, widget):
        self.OnPopupMenuUsers(self.popup_menu_users2)

    def OnPopupMenuFolderUser(self, widget):
        self.OnPopupMenuUsers(self.popup_menu_users)

    def OnPopupMenuUsers(self, menu):

        items = menu.get_children()

        act = True
        items[0].set_sensitive(act)
        items[1].set_sensitive(act)
        items[2].set_sensitive(act)

        items[5].set_active(self.user in [i[0] for i in self.frame.np.config.sections["server"]["userlist"]])
        items[6].set_active(self.user in self.frame.np.config.sections["server"]["banlist"])
        items[7].set_active(self.user in self.frame.np.config.sections["server"]["ignorelist"])

        for i in range(3, 8):
            items[i].set_sensitive(act)

        return True

    def ChangeColours(self):
        self.frame.SetTextBG(self.FileTreeView)
        self.frame.SetTextBG(self.FolderTreeView)
        self.frame.SetTextBG(self.entry4)

        self.frame.ChangeListFont(self.FolderTreeView, self.frame.np.config.sections["ui"]["browserfont"])
        self.frame.ChangeListFont(self.FileTreeView, self.frame.np.config.sections["ui"]["browserfont"])

    def CellDataFunc(self, column, cellrenderer, model, iter):
        colour = self.frame.np.config.sections["ui"]["search"]
        if colour == "":
            colour = None
        cellrenderer.set_property("foreground", colour)

    def decode(self, str):
        return self.frame.np.decode(str, self.encoding)

    def OnExpand(self, widget):

        if self.ExpandButton.get_active():
            self.FolderTreeView.expand_all()
            self.ExpandDirectoriesImage.set_from_stock(gtk.STOCK_REMOVE, 4)
        else:
            self.FolderTreeView.collapse_all()
            self.ExpandDirectoriesImage.set_from_stock(gtk.STOCK_ADD, 4)

            dirs = list(self.directories.keys())
            dirs.sort()

            if dirs != []:
                self.SetDirectory(dirs[0])
            else:
                self.SetDirectory(None)

    def OnFolderClicked(self, widget, event):

        if event.button == 1 and event.type == gtk.gdk._2BUTTON_PRESS:
            self.OnDownloadDirectory(widget)
            return True
        elif event.button == 3:
            return self.OnFolderPopupMenu(widget, event)

        return False

    def OnFolderPopupMenu(self, widget, event):

        act = True
        if self.selected_folder is None:
            act = False

        items = self.folder_popup_menu.get_children()
        for item in items[1:]:
            item.set_sensitive(act)

        self.folder_popup_menu.popup(None, None, None, event.button, event.time)

    def SelectedFilesCallback(self, model, path, iter):
        rawfilename = self.FileStore.get_value(iter, 6)
        self.selected_files.append(rawfilename)

    def OnFileClicked(self, widget, event):

        if event.button == 1 and event.type == gtk.gdk._2BUTTON_PRESS:
            self.selected_files = []
            self.FileTreeView.get_selection().selected_foreach(self.SelectedFilesCallback)
            self.OnDownloadFiles(widget)
            self.FileTreeView.get_selection().unselect_all()
            return True
        elif event.button == 3:
            return self.OnFilePopupMenu(widget, event)

        return False

    def OnFilePopupMenu(self, widget, event):

        self.selected_files = []
        self.FileTreeView.get_selection().selected_foreach(self.SelectedFilesCallback)

        files = True
        multiple = False

        if len(self.selected_files) > 1:
            multiple = True

        if len(self.selected_files) >= 1:
            files = True
        else:
            files = False

        items = self.file_popup_menu.get_children()

        if self.user == self.frame.np.config.sections["server"]["login"]:
            items[2].set_sensitive(files)  # Downloads
            items[3].set_sensitive(files)  # Uploads
            items[5].set_sensitive(not multiple and files)  # Copy URL
            items[6].set_sensitive(files)  # Send to player
        else:
            items[2].set_sensitive(files)  # Downloads
            items[4].set_sensitive(not multiple and files)  # Copy URL

        self.FileTreeView.emit_stop_by_name("button_press_event")
        self.file_popup_menu.popup(None, None, None, event.button, event.time)

        return True

    def MakeNewModel(self, list):

        self.shares = list
        self.selected_folder = None
        self.selected_files = []
        self.directories.clear()
        self.files.clear()
        self.DirStore.clear()

        # Compute the number of shared dirs and total size
        self.totalsize = 0
        for dir, files in self.shares:
            for filedata in files:
                if filedata[2] < 18446744000000000000:
                    self.totalsize += filedata[2]
                else:
                    print "Unbelievable filesize: %s, %s" % (HumanizeBytes(filedata[2]), repr(filedata))

        self.AmountShared.set_text(_("Shared: %s") % HumanizeBytes(self.totalsize))
        self.NumDirectories.set_text(_("Dirs: %s") % len(self.shares))

        # Generate the directory tree and select first directory
        currentdir = self.BrowseGetDirs()

        sel = self.FolderTreeView.get_selection()
        sel.unselect_all()
        if currentdir in self.directories:
            path = self.DirStore.get_path(self.directories[currentdir])
            if path is not None:
                sel.select_path(path)

        self.FolderTreeView.set_sensitive(True)
        self.FileTreeView.set_sensitive(True)
        self.SaveButton.set_sensitive(True)

        if self.ExpandButton.get_active():
            self.FolderTreeView.expand_all()
        else:
            self.FolderTreeView.collapse_all()

    def BrowseGetDirs(self):

        directory = ""
        dirseparator = '\\'

        # If there is no share
        if self.shares == []:

            # Set the model of the treeviex
            self.FolderTreeView.set_model(self.DirStore)

            # Sort the DirStore
            self.DirStore.set_sort_column_id(0, gtk.SORT_ASCENDING)

            return directory

        def builddicttree(p, s):
            """
                Build recursively a hierarchical dict containing raw subdir
                'p' is a reference to the parent
                's' a list of the subdir of a path

                ex of 's': ['music', 'rock', 'doors']
            """

            if s:
                subdir = s.pop(0)

                if subdir not in p:
                    p[subdir] = {}

                builddicttree(p[subdir], s)

        def buildgtktree(dictdir, parent, path):
            """
                Build recursively self.directories with iters pointing to directories
                'dictdir' is a hierarchical dict containing raw subdir
                'parent' is the iter pointing to the parent
                'path' is the current raw path
            """

            # Foreach subdir
            for subdir in dictdir.keys():

                if parent is None:
                    # The first sudirs are attached to the root (None)
                    current_path = subdir
                else:
                    # Other sudirs futher down the path are attached to their parent
                    current_path = dirseparator.join([path, subdir])

                self.directories[current_path] = self.DirStore.append(parent, [self.decode(subdir), current_path])

                # If there are subdirs futher down the path: recurse
                if len(dictdir[subdir]):
                    buildgtktree(dictdir[subdir], self.directories[current_path], current_path)

        # For each shared dir we will complete the dictionnary
        dictdir = {}

        for dirshares, f in self.shares:

            # Split the path
            s = dirshares.split(dirseparator)

            # and build a hierarchical dictionnary containing raw subdir
            if len(s) >= 1:
                builddicttree(dictdir, s)

        # Append data to the DirStore
        buildgtktree(dictdir, None, None)

        # Select the first directory
        sortlist = list(self.directories.keys())
        sortlist.sort()

        directory = sortlist[0]

        # Sort the DirStore
        self.DirStore.set_sort_column_id(0, gtk.SORT_ASCENDING)

        # Set the model of the treeviex
        self.FolderTreeView.set_model(self.DirStore)

        return directory

    def SetDirectory(self, directory):

        self.selected_folder = directory
        self.FileStore.clear()
        self.files.clear()

        found_dir = False

        for d, f in self.shares:
            if d == directory:
                found_dir = True
                files = f
                break

        if not found_dir:
            return

        for file in files:
            # DecodedFilename, HSize, Bitrate, HLength, Size, Length, RawFilename
            rl = 0
            try:
                size = int(file[2])
            except ValueError:
                size = 0

            f = [self.decode(file[1]), Humanize(size)]

            if file[3] == "":
                f += ["", ""]
            else:
                # file[4] is for file types such as 'mp3'
                attrs = file[4]
                if attrs != [] and type(attrs) is list:

                    if len(attrs) >= 3:

                        br = str(attrs[0])
                        if attrs[2]:
                            br = br + " (vbr)"

                        try:
                            rl = int(attrs[1])
                        except ValueError:
                            rl = 0

                        l = "%i:%02i" % (rl / 60, rl % 60)
                        f += [br, l]
                    else:
                        f += ["", ""]
                else:
                    f += ["", ""]

            f += [long(size), rl, file[1]]

            try:
                self.files[f[0]] = self.FileStore.append(f)
            except Exception, error:
                displayTraceback()
Пример #24
0
    def __init__(self, userbrowses, user, conn):

        self.wTree = gtk.glade.XML(os.path.join(os.path.dirname(os.path.realpath(__file__)), "userbrowse.glade"), None)
        widgets = self.wTree.get_widget_prefix("")

        for i in widgets:
            name = gtk.glade.get_widget_name(i)
            self.__dict__[name] = i

        self.UserBrowseTab.remove(self.Main)
        self.UserBrowseTab.destroy()

        self.wTree.signal_autoconnect(self)
        self.userbrowses = userbrowses

        self.frame = userbrowses.frame
        self.user = user
        self.conn = conn

        # selected_folder is the current selected folder
        self.selected_folder = None
        self.search_list = []
        self.query = None
        self.search_position = 0
        self.selected_files = []

        self.shares = []
        self.Elist = {}

        # Iters for current DirStore
        self.directories = {}

        # Iters for current FileStore
        self.files = {}
        self.totalsize = 0
        self.encoding, m = EncodingsMenu(self.frame.np, "userencoding", user)

        self.EncodingStore = gtk.ListStore(gobject.TYPE_STRING, gobject.TYPE_STRING)
        self.Encoding.set_size_request(100, -1)
        self.Encoding.set_model(self.EncodingStore)
        cell = gtk.CellRendererText()
        self.Encoding.pack_start(cell, True)
        self.Encoding.add_attribute(cell, 'text', 0)
        cell2 = gtk.CellRendererText()
        self.Encoding.pack_start(cell2, False)

        self.Encoding.add_attribute(cell2, 'text', 1)

        for item in m:
            self.Elist[item[1]] = self.EncodingStore.append([item[1], item[0]])
            if self.encoding == item[1]:
                self.Encoding.set_active_iter(self.Elist[self.encoding])

        self.DirStore = gtk.TreeStore(str, str)
        self.FolderTreeView.set_headers_visible(True)
        self.FolderTreeView.set_enable_tree_lines(True)

        cols = InitialiseColumns(
            self.FolderTreeView,
            [_("Directories"), -1, "text", self.CellDataFunc]  # 0
        )
        cols[0].set_sort_column_id(0)

        self.popup_menu_users = PopupMenu(self.frame)
        self.popup_menu_users2 = PopupMenu(self.frame)
        for menu in [self.popup_menu_users, self.popup_menu_users2]:
            menu.setup(
                ("#" + _("Send _message"), menu.OnSendMessage, gtk.STOCK_EDIT),
                ("#" + _("Show IP a_ddress"), menu.OnShowIPaddress, gtk.STOCK_NETWORK),
                ("#" + _("Get user i_nfo"), menu.OnGetUserInfo, gtk.STOCK_DIALOG_INFO),
                ("#" + _("Gi_ve privileges"), menu.OnGivePrivileges, gtk.STOCK_JUMP_TO),
                ("", None),
                ("$" + _("_Add user to list"),  menu.OnAddToList),
                ("$" + _("_Ban this user"), menu.OnBanUser),
                ("$" + _("_Ignore this user"), menu.OnIgnoreUser)
            )

        self.popup_menu_downloads_folders = PopupMenu(self.frame)
        self.popup_menu_downloads_folders.setup(
            ("#" + _("_Download directory"), self.OnDownloadDirectory, gtk.STOCK_GO_DOWN),
            ("#" + _("Download directory _to..."), self.OnDownloadDirectoryTo, gtk.STOCK_GO_DOWN),
            ("#" + _("Download _recursive"), self.OnDownloadDirectoryRecursive, gtk.STOCK_GO_DOWN),
            ("#" + _("Download r_ecursive to..."), self.OnDownloadDirectoryRecursiveTo, gtk.STOCK_GO_DOWN)
        )

        self.popup_menu_downloads_files = PopupMenu(self.frame)
        self.popup_menu_downloads_files.setup(
            ("#" + _("_Download file(s)"), self.OnDownloadFiles, gtk.STOCK_GO_DOWN),
            ("#" + _("Download _to..."), self.OnDownloadFilesTo, gtk.STOCK_GO_DOWN),
            ("", None),
            ("#" + _("_Download directory"), self.OnDownloadDirectory, gtk.STOCK_GO_DOWN),
            ("#" + _("Download directory _to..."), self.OnDownloadDirectoryTo, gtk.STOCK_GO_DOWN),
            ("#" + _("Download _recursive"), self.OnDownloadDirectoryRecursive, gtk.STOCK_GO_DOWN),
            ("#" + _("Download r_ecursive to..."), self.OnDownloadDirectoryRecursiveTo, gtk.STOCK_GO_DOWN)
        )

        self.popup_menu_uploads_folders = PopupMenu(self.frame)
        self.popup_menu_uploads_folders.setup(
            ("#" + _("Upload Directory to..."), self.OnUploadDirectoryTo, gtk.STOCK_GO_UP),
            ("#" + _("Upload Directory recursive to..."), self.OnUploadDirectoryRecursiveTo, gtk.STOCK_GO_UP)
        )

        self.popup_menu_uploads_files = PopupMenu(self.frame)
        self.popup_menu_uploads_files.setup(
            ("#" + _("Upload Directory to..."), self.OnUploadDirectoryTo, gtk.STOCK_GO_UP),
            ("#" + _("Upload Directory recursive to..."), self.OnUploadDirectoryRecursiveTo, gtk.STOCK_GO_UP),
            ("#" + _("Up_load file(s)"), self.OnUploadFiles, gtk.STOCK_GO_UP)
        )

        self.folder_popup_menu = PopupMenu(self.frame)
        self.folder_popup_menu.set_user(user)

        if user == self.frame.np.config.sections["server"]["login"]:
            self.folder_popup_menu.setup(
                ("USERMENU", _("User"), self.popup_menu_users, self.OnPopupMenuFolderUser),
                ("", None),
                (2, _("Download"), self.popup_menu_downloads_folders, self.OnPopupMenuDummy, gtk.STOCK_GO_DOWN),
                (2, _("Upload"), self.popup_menu_uploads_folders, self.OnPopupMenuDummy, gtk.STOCK_GO_UP),
                ("", None),
                ("#" + _("Copy _URL"), self.OnCopyDirURL, gtk.STOCK_COPY),
                ("#" + _("Open in File Manager"), self.OnFileManager, gtk.STOCK_OPEN)
            )
        else:
            self.folder_popup_menu.setup(
                ("USERMENU", _("User"), self.popup_menu_users, self.OnPopupMenuFolderUser),
                ("", None),
                (2, _("Download"), self.popup_menu_downloads_folders, self.OnPopupMenuDummy, gtk.STOCK_GO_DOWN),
                ("", None),
                ("#" + _("Copy _URL"), self.OnCopyDirURL, gtk.STOCK_COPY)
            )

        self.FolderTreeView.connect("button_press_event", self.OnFolderClicked)
        self.FolderTreeView.get_selection().connect("changed", self.OnSelectDir)

        # DecodedFilename, HSize, Bitrate, HLength, Size, Length, RawFilename
        self.FileStore = gtk.ListStore(str, str, str, str, gobject.TYPE_INT64, int, str)

        self.FileTreeView.set_model(self.FileStore)
        cols = InitialiseColumns(
            self.FileTreeView,
            [_("Filename"), 250, "text", self.CellDataFunc],
            [_("Size"), 100, "number", self.CellDataFunc],
            [_("Bitrate"), 70, "text", self.CellDataFunc],
            [_("Length"), 50, "number", self.CellDataFunc]
        )
        cols[0].set_sort_column_id(0)
        cols[1].set_sort_column_id(4)
        cols[2].set_sort_column_id(2)
        cols[3].set_sort_column_id(5)
        self.FileStore.set_sort_column_id(0, gtk.SORT_ASCENDING)

        for i in range(4):
            parent = cols[i].get_widget().get_ancestor(gtk.Button)
            if parent:
                parent.connect('button_press_event', PressHeader)

        # Read Show / Hide column settings from last session
        self.FileTreeView.get_selection().set_mode(gtk.SELECTION_MULTIPLE)
        self.FileTreeView.set_headers_clickable(True)
        self.FileTreeView.set_property("rules-hint", True)

        self.file_popup_menu = PopupMenu(self.frame)

        if user == self.frame.np.config.sections["server"]["login"]:
            self.file_popup_menu.setup(
                ("USERMENU", "User", self.popup_menu_users2, self.OnPopupMenuFileUser),
                ("", None),
                (2, _("Download"), self.popup_menu_downloads_files, self.OnPopupMenuDummy, gtk.STOCK_GO_DOWN),
                (2, _("Upload"), self.popup_menu_uploads_files, self.OnPopupMenuDummy, gtk.STOCK_GO_UP),
                ("", None),
                ("#" + _("Copy _URL"), self.OnCopyURL, gtk.STOCK_COPY),
                ("#" + _("Send to _player"), self.OnPlayFiles, gtk.STOCK_MEDIA_PLAY),
                ("#" + _("Open in File Manager"), self.OnFileManager, gtk.STOCK_OPEN)
            )
        else:
            self.file_popup_menu.setup(
                ("USERMENU", "User", self.popup_menu_users2, self.OnPopupMenuFileUser),
                ("", None),
                (2, _("Download"), self.popup_menu_downloads_files, self.OnPopupMenuDummy, gtk.STOCK_GO_DOWN),
                ("", None),
                ("#" + _("Copy _URL"), self.OnCopyURL, gtk.STOCK_COPY)
            )

        self.FileTreeView.connect("button_press_event", self.OnFileClicked)

        self.ChangeColours()

        for name, object in self.__dict__.items():
            if type(object) is PopupMenu:
                object.set_user(self.user)
Пример #25
0
    def __init__(self, userinfos, user, conn):

        # Build the window
        builder = gtk.Builder()

        builder.set_translation_domain('nicotine')
        builder.add_from_file(
            os.path.join(os.path.dirname(os.path.realpath(__file__)), "ui",
                         "userinfo.ui"))

        self.UserInfoTab = builder.get_object("UserInfoTab")

        for i in builder.get_objects():
            try:
                self.__dict__[gtk.Buildable.get_name(i)] = i
            except TypeError:
                pass

        self.UserInfoTab.remove(self.Main)
        self.UserInfoTab.destroy()

        builder.connect_signals(self)

        self.userinfos = userinfos
        self.frame = userinfos.frame

        self.frame.np.queue.put(slskmessages.UserInterests(user))
        self.user = user
        self.conn = conn
        self._descr = ""
        self.image_pixbuf = None
        self.zoom_factor = 5
        self.actual_zoom = 0
        self.status = 0

        self.hatesStore = gtk.ListStore(gobject.TYPE_STRING)
        self.Hates.set_model(self.hatesStore)
        cols = InitialiseColumns(self.Hates,
                                 [_("Hates"), 0, "text", self.CellDataFunc])
        cols[0].set_sort_column_id(0)
        self.hatesStore.set_sort_column_id(0, gtk.SORT_ASCENDING)

        self.likesStore = gtk.ListStore(gobject.TYPE_STRING)
        self.Likes.set_model(self.likesStore)
        cols = InitialiseColumns(self.Likes,
                                 [_("Likes"), 0, "text", self.CellDataFunc])
        cols[0].set_sort_column_id(0)
        self.likesStore.set_sort_column_id(0, gtk.SORT_ASCENDING)

        # Encoding Combobox
        self.Elist = {}
        self.encoding, m = EncodingsMenu(self.frame.np, "userencoding", user)
        self.EncodingStore = gtk.ListStore(gobject.TYPE_STRING,
                                           gobject.TYPE_STRING)
        self.Encoding.set_model(self.EncodingStore)

        cell = gtk.CellRendererText()
        self.Encoding.pack_start(cell, True)
        self.Encoding.add_attribute(cell, 'text', 0)

        cell2 = gtk.CellRendererText()
        self.Encoding.pack_start(cell2, False)
        self.Encoding.add_attribute(cell2, 'text', 1)

        for item in m:
            self.Elist[item[1]] = self.EncodingStore.append([item[1], item[0]])
            if self.encoding == item[1]:
                self.Encoding.set_active_iter(self.Elist[self.encoding])

        self.tag_local = self.makecolour(buffer, "chatremote")
        self.ChangeColours()

        self.InterestsExpander.connect("activate", self.ExpanderStatus)
        self.InformationExpander.connect("activate", self.ExpanderStatus)
        self.DescriptionExpander.connect("activate", self.ExpanderStatus)

        self.likes_popup_menu = popup = PopupMenu(self)
        popup.setup(
            ("$" + _("I _like this"), self.frame.OnLikeRecommendation),
            ("$" + _("I _don't like this"),
             self.frame.OnDislikeRecommendation), ("", None),
            ("#" + _("_Search for this item"), self.frame.OnRecommendSearch))
        self.Likes.connect("button_press_event", self.OnPopupLikesMenu)

        self.hates_popup_menu = popup = PopupMenu(self)
        popup.setup(
            ("$" + _("I _like this"), self.frame.OnLikeRecommendation),
            ("$" + _("I _don't like this"),
             self.frame.OnDislikeRecommendation), ("", None),
            ("#" + _("_Search for this item"), self.frame.OnRecommendSearch))
        self.Hates.connect("button_press_event", self.OnPopupHatesMenu)

        self.image_menu = popup = PopupMenu(self)
        popup.setup(("#" + _("Zoom 1:1"), self.MakeZoomNormal),
                    ("#" + _("Zoom In"), self.MakeZoomIn),
                    ("#" + _("Zoom Out"), self.MakeZoomOut), ("", None),
                    ("#" + _("Save Image"), self.OnSavePicture))
Пример #26
0
    def __init__(self, frame):

        TransferList.__init__(self, frame, frame.DownloadList, type='downloads')
        self.myvbox = self.frame.downloadsvbox
        self.frame.DownloadList.set_property("rules-hint", True)
        self.accel_group = gtk.AccelGroup()

        self.popup_menu2 = popup2 = PopupMenu(frame)
        popup2.setup(
            ("#" + _("Clear finished/aborted"), self.OnClearFinishedAborted),
            ("#" + _("Clear finished"), self.OnClearFinished),
            ("#" + _("Clear aborted"), self.OnClearAborted),
            ("#" + _("Clear paused"), self.OnClearPaused),
            ("#" + _("Clear filtered"), self.OnClearFiltered),
            ("#" + _("Clear queued"), self.OnClearQueued)
        )
        self.popup_menu_users = PopupMenu(frame)

        self.popup_menu = popup = PopupMenu(frame)
        popup.setup(
            ("#" + _("Get place in _queue"), self.OnGetPlaceInQueue),
            ("", None),
            ("#" + _("Copy _URL"), self.OnCopyURL),
            ("#" + _("Copy folder URL"), self.OnCopyDirURL),
            ("#" + _("Send to _player"), self.OnPlayFiles),
            ("#" + _("View Metadata of file(s)"), self.OnDownloadMeta),
            ("#" + _("Open Directory"), self.OnOpenDirectory),
            ("#" + _("Search"), self.OnFileSearch),
            (1, _("User(s)"), self.popup_menu_users, self.OnPopupMenuUsers),
            ("", None),
            ("#" + _("_Retry"), self.OnRetryTransfer),
            ("", None),
            ("#" + _("Abor_t"), self.OnAbortTransfer),
            ("#" + _("Abort & Delete"), self.OnAbortRemoveTransfer),
            ("#" + _("_Clear"), self.OnClearTransfer),
            ("", None),
            (1, _("Clear Groups"), self.popup_menu2, None)
        )

        frame.DownloadList.connect("button_press_event", self.OnPopupMenu, "mouse")
        frame.DownloadList.connect("key-press-event", self.on_key_press_event)
        cols = frame.DownloadList.get_columns()

        for i in range(9):

            parent = cols[i].get_widget().get_ancestor(gtk.Button)
            if parent:
                parent.connect("button_press_event", PressHeader)

            # Read Show / Hide column settings from last session
            cols[i].set_visible(self.frame.np.config.sections["columns"]["downloads_columns"][i])

        frame.clearFinishedAbortedButton.connect("clicked", self.OnClearFinishedAborted)
        frame.clearQueuedButton.connect("clicked", self.OnTryClearQueued)
        frame.retryTransferButton.connect("clicked", self.OnRetryTransfer)
        frame.abortTransferButton.connect("clicked", self.OnSelectAbortTransfer)
        frame.deleteTransferButton.connect("clicked", self.OnAbortRemoveTransfer)
        frame.banDownloadButton.connect("clicked", self.OnBan)
        frame.DownloadList.expand_all()

        self.frame.ToggleAutoRetry.set_active(self.frame.np.config.sections["transfers"]["autoretry_downloads"])
        frame.ToggleAutoRetry.connect("toggled", self.OnToggleAutoRetry)

        self.frame.ToggleTreeDownloads.set_active(self.frame.np.config.sections["transfers"]["groupdownloads"])
        frame.ToggleTreeDownloads.connect("toggled", self.OnToggleTree)
        self.OnToggleTree(None)

        self.frame.ExpandDownloads.set_active(self.frame.np.config.sections["transfers"]["downloadsexpanded"])
        frame.ExpandDownloads.connect("toggled", self.OnExpandDownloads)
        self.OnExpandDownloads(None)
Пример #27
0
    def __init__(self, frame):

        TransferList.__init__(self,
                              frame,
                              frame.DownloadList,
                              type='downloads')
        self.myvbox = self.frame.downloadsvbox
        self.frame.DownloadList.set_property("rules-hint", True)
        self.accel_group = gtk.AccelGroup()

        self.popup_menu2 = popup2 = PopupMenu(frame)
        popup2.setup(
            ("#" + _("Clear finished/aborted"), self.OnClearFinishedAborted),
            ("#" + _("Clear finished"), self.OnClearFinished),
            ("#" + _("Clear aborted"), self.OnClearAborted),
            ("#" + _("Clear paused"), self.OnClearPaused),
            ("#" + _("Clear filtered"), self.OnClearFiltered),
            ("#" + _("Clear queued"), self.OnClearQueued))
        self.popup_menu_users = PopupMenu(frame)

        self.popup_menu = popup = PopupMenu(frame)
        popup.setup(
            ("#" + _("Get place in _queue"), self.OnGetPlaceInQueue),
            ("", None), ("#" + _("Copy _URL"), self.OnCopyURL),
            ("#" + _("Copy folder URL"), self.OnCopyDirURL),
            ("#" + _("Send to _player"), self.OnPlayFiles),
            ("#" + _("View Metadata of file(s)"), self.OnDownloadMeta),
            ("#" + _("Open Directory"), self.OnOpenDirectory),
            ("#" + _("Search"), self.OnFileSearch),
            (1, _("User(s)"), self.popup_menu_users, self.OnPopupMenuUsers),
            ("", None), ("#" + _("_Retry"), self.OnRetryTransfer), ("", None),
            ("#" + _("Abor_t"), self.OnAbortTransfer),
            ("#" + _("Abort & Delete"), self.OnAbortRemoveTransfer),
            ("#" + _("_Clear"), self.OnClearTransfer), ("", None),
            (1, _("Clear Groups"), self.popup_menu2, None))

        frame.DownloadList.connect("button_press_event", self.OnPopupMenu,
                                   "mouse")
        frame.DownloadList.connect("key-press-event", self.on_key_press_event)
        cols = frame.DownloadList.get_columns()

        for i in range(9):

            parent = cols[i].get_widget().get_ancestor(gtk.Button)
            if parent:
                parent.connect("button_press_event", PressHeader)

            # Read Show / Hide column settings from last session
            cols[i].set_visible(self.frame.np.config.sections["columns"]
                                ["downloads_columns"][i])

        frame.clearFinishedAbortedButton.connect("clicked",
                                                 self.OnClearFinishedAborted)
        frame.clearQueuedButton.connect("clicked", self.OnTryClearQueued)
        frame.retryTransferButton.connect("clicked", self.OnRetryTransfer)
        frame.abortTransferButton.connect("clicked",
                                          self.OnSelectAbortTransfer)
        frame.deleteTransferButton.connect("clicked",
                                           self.OnAbortRemoveTransfer)
        frame.banDownloadButton.connect("clicked", self.OnBan)
        frame.DownloadList.expand_all()

        self.frame.ToggleAutoRetry.set_active(
            self.frame.np.config.sections["transfers"]["autoretry_downloads"])
        frame.ToggleAutoRetry.connect("toggled", self.OnToggleAutoRetry)

        self.frame.ToggleTreeDownloads.set_active(
            self.frame.np.config.sections["transfers"]["groupdownloads"])
        frame.ToggleTreeDownloads.connect("toggled", self.OnToggleTree)
        self.OnToggleTree(None)

        self.frame.ExpandDownloads.set_active(
            self.frame.np.config.sections["transfers"]["downloadsexpanded"])
        frame.ExpandDownloads.connect("toggled", self.OnExpandDownloads)
        self.OnExpandDownloads(None)
Пример #28
0
class Uploads(TransferList):
    def __init__(self, frame):
        TransferList.__init__(self, frame, frame.UploadList)
        self.myvbox = self.frame.vboxuploads
        self.frame.UploadList.set_property("rules-hint", True)
        self.popup_menu2 = popup2 = PopupMenu(frame)
        popup2.setup(
            ("#" + _("Clear finished/erred"), self.OnClearFinishedErred,
             gtk.STOCK_CLEAR),
            ("#" + _("Clear finished/aborted"), self.OnClearFinishedAborted,
             gtk.STOCK_CLEAR),
            ("#" + _("Clear finished"), self.OnClearFinished, gtk.STOCK_CLEAR),
            ("#" + _("Clear aborted"), self.OnClearAborted, gtk.STOCK_CLEAR),
            ("#" + _("Clear queued"), self.OnClearQueued, gtk.STOCK_CLEAR),
            ("#" + _("Clear failed"), self.OnClearFailed, gtk.STOCK_CLEAR),
        )

        self.popup_menu_users = PopupMenu(frame)

        self.popup_menu = popup = PopupMenu(frame)
        popup.setup(
            ("#" + _("Copy _URL"), self.OnCopyURL, gtk.STOCK_COPY),
            ("#" + _("Copy folder URL"), self.OnCopyDirURL, gtk.STOCK_COPY),
            ("#" + _("Send to _player"), self.OnPlayFiles,
             gtk.STOCK_MEDIA_PLAY),
            ("#" + _("Open Directory"), self.OnOpenDirectory, gtk.STOCK_OPEN),
            ("#" + _("Search"), self.OnFileSearch, gtk.STOCK_FIND),
            (1, _("User(s)"), self.popup_menu_users, self.OnPopupMenuUsers),
            ("", None),
            ("#" + _("Abor_t"), self.OnAbortTransfer, gtk.STOCK_CANCEL),
            ("#" + _("_Clear"), self.OnClearTransfer, gtk.STOCK_CLEAR),
            ("#" + _("_Retry"), self.OnUploadTransfer, gtk.STOCK_REDO),
            ("", None),
            (1, _("Clear Groups"), self.popup_menu2, None),
        )
        frame.UploadList.connect("button_press_event", self.OnPopupMenu,
                                 "mouse")
        frame.UploadList.connect("key-press-event", self.on_key_press_event)
        cols = frame.UploadList.get_columns()
        for i in range(9):
            parent = cols[i].get_widget().get_ancestor(gtk.Button)
            if parent:
                parent.connect('button_press_event', PressHeader)
            # Read Show / Hide column settings from last session
            cols[i].set_visible(
                self.frame.np.config.sections["columns"]["uploads"][i])
        frame.clearUploadFinishedErredButton.connect("clicked",
                                                     self.OnClearFinishedErred)
        frame.clearUploadQueueButton.connect("clicked", self.OnTryClearQueued)
        frame.abortUploadButton.connect("clicked", self.OnAbortTransfer)
        frame.abortUserUploadButton.connect("clicked", self.OnAbortUser)
        frame.banUploadButton.connect("clicked", self.OnBan)
        frame.UploadList.expand_all()

        self.frame.ToggleAutoclear.set_active(
            self.frame.np.config.sections["transfers"]["autoclear_uploads"])
        frame.ToggleAutoclear.connect("toggled", self.OnToggleAutoclear)
        self.frame.ToggleTreeUploads.set_active(
            self.frame.np.config.sections["transfers"]["groupuploads"])
        frame.ToggleTreeUploads.connect("toggled", self.OnToggleTree)
        self.OnToggleTree(None)
        self.frame.ExpandUploads.set_active(
            self.frame.np.config.sections["transfers"]["uploadsexpanded"])
        frame.ExpandUploads.connect("toggled", self.OnExpandUploads)
        self.OnExpandUploads(None)

    def saveColumns(self):
        columns = []
        for column in self.frame.UploadList.get_columns():
            columns.append(column.get_visible())
        self.frame.np.config.sections["columns"]["uploads"] = columns

    def OnTryClearQueued(self, widget):
        direction = "up"
        win = OptionDialog(self.frame,
                           _("Clear All Queued Uploads?"),
                           modal=True,
                           status=None,
                           option=False,
                           third="")
        win.connect("response", self.frame.on_clear_response, direction)
        win.set_title(_("Nicotine+") + ": " + _("Clear Queued Transfers"))
        win.set_icon(self.frame.images["n"])
        win.show()

    def OnOpenDirectory(self, widget):

        downloaddir = self.frame.np.config.sections["transfers"]["downloaddir"]
        incompletedir = self.frame.np.config.sections["transfers"][
            "incompletedir"]
        if incompletedir == "":
            incompletedir = downloaddir
        filemanager = self.frame.np.config.sections["ui"]["filemanager"]
        transfer = self.selected_transfers[0]

        command = ""
        if os.path.exists(transfer.path):
            executeCommand(filemanager, transfer.path)
        else:
            executeCommand(filemanager, incompletedir)

    def OnFileSearch(self, widget):
        self.select_transfers()
        for transfer in self.selected_transfers:
            self.frame.SearchEntry.set_text(
                transfer.filename.rsplit("\\", 1)[1])
            self.frame.ChangeMainPage(None, "search")
            break

    def expandcollapse(self, path):
        if self.frame.ExpandUploads.get_active():
            self.frame.UploadList.expand_row(path, True)
        else:
            self.frame.UploadList.collapse_row(path)

    def OnExpandUploads(self, widget):
        expanded = self.frame.ExpandUploads.get_active()
        if expanded:
            self.frame.UploadList.expand_all()
            self.frame.ExpandUploadsImage.set_from_stock(gtk.STOCK_REMOVE, 4)
        else:
            self.frame.UploadList.collapse_all()
            self.frame.ExpandUploadsImage.set_from_stock(gtk.STOCK_ADD, 4)
        self.frame.np.config.sections["transfers"][
            "uploadsexpanded"] = expanded
        self.frame.np.config.writeConfiguration()

    def OnToggleAutoclear(self, widget):
        self.frame.np.config.sections["transfers"][
            "autoclear_uploads"] = self.frame.ToggleAutoclear.get_active()

    def OnToggleTree(self, widget):
        self.TreeUsers = self.frame.ToggleTreeUploads.get_active()
        self.frame.np.config.sections["transfers"][
            "groupuploads"] = self.TreeUsers
        self.RebuildTransfers()
        if not self.TreeUsers:
            self.frame.ExpandUploads.hide()
        else:
            self.frame.ExpandUploads.show()

    def RebuildTransfers(self):
        if self.frame.np.transfers is None:
            return
        self.Clear()
        self.update()

    def select_transfers(self):
        self.selected_transfers = []
        self.selected_users = []
        self.widget.get_selection().selected_foreach(
            self.SelectedTransfersCallback)

    def OnBan(self, widget):
        self.select_transfers()
        for user in self.selected_users:
            self.frame.BanUser(user)

    def OnAbortUser(self, widget):
        self.select_transfers()
        for user in self.selected_users:
            for i in self.list[:]:
                if i.user == user:
                    if i not in self.selected_transfers:
                        self.selected_transfers.append(i)

        TransferList.OnAbortTransfer(self, widget, False, False)
        self.frame.np.transfers.calcUploadQueueSizes()
        self.frame.np.transfers.checkUploadQueue()

    def OnUploadTransfer(self, widget):
        self.select_transfers()
        for transfer in self.selected_transfers:
            filename = transfer.filename
            path = transfer.path
            user = transfer.user

            if user in self.frame.np.transfers.getTransferringUsers():
                continue
            self.frame.np.ProcessRequestToPeer(
                user, slskmessages.UploadQueueNotification(None))
            self.frame.np.transfers.pushFile(user, filename, path, transfer)
        self.frame.np.transfers.checkUploadQueue()

    def OnSelectUserTransfer(self, widet):
        if len(self.selected_users) != 1:
            return
        selected_user = self.selected_users[0]

        sel = self.frame.UploadList.get_selection()
        fmodel = self.frame.UploadList.get_model()
        sel.unselect_all()

        for item in self.transfers:
            user_file, iter, transfer = item
            user, filepath = user_file
            if selected_user == user:
                ix = fmodel.get_path(iter)
                sel.select_path(ix, )

        self.select_transfers()

    def on_key_press_event(self, widget, event):
        key = gtk.gdk.keyval_name(event.keyval)

        if key in ("P", "p"):
            self.OnPopupMenu(widget, event, "keyboard")
        else:
            self.selected_transfers = []
            self.selected_users = []
            self.widget.get_selection().selected_foreach(
                self.SelectedTransfersCallback)

            if key in ("T", "t"):
                self.OnAbortTransfer(widget)
            elif key == "Delete":
                self.OnAbortTransfer(widget, False, True)

    def OnPlayFiles(self, widget, prefix=""):
        start_new_thread(self._OnPlayFiles, (widget, prefix))

    def _OnPlayFiles(self, widget, prefix=""):
        executable = self.frame.np.config.sections["players"]["default"]
        if "$" not in executable:
            return
        for fn in self.selected_transfers:
            file = fn.filename.replace("\\", os.sep)
            if os.path.exists(file):
                executeCommand(executable, file, background=False)

    def OnPopupMenuUsers(self, widget):

        self.selected_transfers = []
        self.selected_users = []
        self.widget.get_selection().selected_foreach(
            self.SelectedTransfersCallback)

        self.popup_menu_users.clear()
        if len(self.selected_users) > 0:
            items = []
            self.selected_users.sort(key=str.lower)
            for user in self.selected_users:
                popup = PopupMenu(self.frame)
                popup.setup(
                    ("#" + _("Send _message"), popup.OnSendMessage,
                     gtk.STOCK_EDIT),
                    ("#" + _("Show IP a_ddress"), popup.OnShowIPaddress,
                     gtk.STOCK_NETWORK),
                    ("#" + _("Get user i_nfo"), popup.OnGetUserInfo,
                     gtk.STOCK_DIALOG_INFO),
                    ("#" + _("Brow_se files"), popup.OnBrowseUser,
                     gtk.STOCK_HARDDISK),
                    ("#" + _("Gi_ve privileges"), popup.OnGivePrivileges,
                     gtk.STOCK_JUMP_TO),
                    ("", None),
                    ("$" + _("_Add user to list"), popup.OnAddToList),
                    ("$" + _("_Ban this user"), popup.OnBanUser),
                    ("$" + _("_Ignore this user"), popup.OnIgnoreUser),
                    ("#" + _("Select User's Transfers"),
                     self.OnSelectUserTransfer, gtk.STOCK_INDEX),
                )
                popup.set_user(user)

                items.append((1, user, popup, self.OnPopupMenuUser, popup))
            self.popup_menu_users.setup(*items)
        return True

    def OnPopupMenuUser(self, widget, popup=None):
        if popup is None:
            return
        menu = popup
        user = menu.user
        items = menu.get_children()

        act = False
        if len(self.selected_users) >= 1:
            act = True
        items[0].set_sensitive(act)
        items[1].set_sensitive(act)
        items[2].set_sensitive(act)
        items[3].set_sensitive(act)

        items[6].set_active(user in [
            i[0] for i in self.frame.np.config.sections["server"]["userlist"]
        ])
        items[7].set_active(
            user in self.frame.np.config.sections["server"]["banlist"])
        items[8].set_active(
            user in self.frame.np.config.sections["server"]["ignorelist"])

        for i in range(4, 9):
            items[i].set_sensitive(act)
        return True

    def OnPopupMenu(self, widget, event, kind):
        if kind == "mouse":
            if event.button != 3:
                if event.button == 1 and event.type == gtk.gdk._2BUTTON_PRESS:
                    self.DoubleClick(event)
                return False

        self.selected_transfers = []
        self.selected_users = []
        self.widget.get_selection().selected_foreach(
            self.SelectedTransfersCallback)

        self.SelectCurrentRow(event, kind)

        users = len(self.selected_users) > 0
        multi_users = len(self.selected_users) > 1
        files = len(self.selected_transfers) > 0
        multi_files = len(self.selected_transfers) > 1

        items = self.popup_menu.get_children()
        if users:
            items[5].set_sensitive(True)  # Users Menu
        else:
            items[5].set_sensitive(False)  # Users Menu
        if files and not multi_files:
            act = True
        else:
            act = False
        items[0].set_sensitive(act)
        items[1].set_sensitive(act)

        if users and files:
            act = True
        else:
            act = False
        for i in range(3, 5) + range(6, 10):
            items[i].set_sensitive(act)

        items[2].set_sensitive(act)  # send to player

        self.popup_menu.popup(None, None, None, 3, event.time)
        if kind == "keyboard":
            widget.emit_stop_by_name("key_press_event")
        elif kind == "mouse":
            widget.emit_stop_by_name("button_press_event")
        return True

    def ClearByUser(self, user):
        for i in self.list[:]:
            if i.user == user:
                if i.transfertimer is not None:
                    i.transfertimer.cancel()
                self.list.remove(i)
        self.frame.np.transfers.calcUploadQueueSizes()
        self.frame.np.transfers.checkUploadQueue()
        self.update()

    def DoubleClick(self, event):
        self.select_transfers()
        dc = self.frame.np.config.sections["transfers"]["upload_doubleclick"]

        if dc == 1:  # Send to player
            self.OnPlayFiles(None)
        elif dc == 2:  #File manager
            self.OnOpenDirectory(None)
        elif dc == 3:  #Search
            self.OnFileSearch(None)
        elif dc == 4:  #Abort
            self.OnAbortTransfer(None, False)
        elif dc == 5:  #Clear
            self.OnClearTransfer(None)

    def OnAbortTransfer(self, widget, remove=False, clear=False):
        self.select_transfers()
        TransferList.OnAbortTransfer(self, widget, remove, clear)
        self.frame.np.transfers.calcUploadQueueSizes()
        self.frame.np.transfers.checkUploadQueue()
        self.update()

    def OnClearQueued(self, widget):
        self.select_transfers()
        TransferList.OnClearQueued(self, widget)
        self.frame.np.transfers.calcUploadQueueSizes()
        self.frame.np.transfers.checkUploadQueue()
        self.update()

    def OnClearFailed(self, widget):
        TransferList.OnClearFailed(self, widget)
        self.frame.np.transfers.calcUploadQueueSizes()
        self.frame.np.transfers.checkUploadQueue()
        self.update()