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
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 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 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
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
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
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
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
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
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
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()
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()
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()
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()
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()
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)
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)