def create(self): self.connect("destroy", self.destroy_cb) ClientUtil.add_updater(self) self.catch_event("no_credits") def on_launched(button): self.start() self._start_listening_for_event("launched", self.app, on_launched) self.popupMenu = TorrentPopupMenu(self) #everything changes in relation to this magic number maggicPadding = 2 self.statusRow = BTUtilityStatusRow(self.app, maggicPadding) self.buttonRow = BTUtilityButtonRow(self.app, maggicPadding) self._start_listening_for_event("add_file", self.buttonRow, self._add_file_cb) self._start_listening_for_event("remove_file", self.buttonRow, self._remove_file_cb) self._start_listening_for_event("pause_torrent", self.buttonRow, self._pause_cb) self._start_listening_for_event("toggle_anonymity", self.buttonRow, self._toggle_anon_cb) self.rows = {} self.curDownload = None self.exitDialog = None self.trackerEditDialog = None #create a liststore with one string column to use as the model #COLUMNS: #0: File name typeList = [ gobject.TYPE_STRING, #1: Amount done gobject.TYPE_FLOAT, #2: Status gobject.TYPE_STRING, #3: ETA gobject.TYPE_STRING, #4: Peers gobject.TYPE_STRING, #5: Seeds gobject.TYPE_STRING, #6: Download Rate gobject.TYPE_STRING, #7: Upload Rate gobject.TYPE_STRING, #8: Download Amount gobject.TYPE_STRING, #9: Upload Amount gobject.TYPE_STRING, #10: Upload Amount gobject.TYPE_STRING, #11: the hash for the download. Stored hex-encoded, because nulls mess up gtk gobject.TYPE_STRING, #12: is the row visible? gobject.TYPE_BOOLEAN ] self.attrIdx = {} self.attrIdx["name"] = 0 self.attrIdx["progress"] = 1 self.attrIdx["progressMsg"] = 2 self.attrIdx["status"] = 3 self.attrIdx["peers"] = 4 self.attrIdx["seeds"] = 5 self.attrIdx["rateUp"] = 6 self.attrIdx["rateDown"] = 7 self.attrIdx["amountUp"] = 8 self.attrIdx["amountDown"] = 9 self.attrIdx["copies"] = 10 self.attrIdx["hash"] = 11 self.attrIdx["visibility"] = 12 self.liststore = gtk.ListStore(*typeList) COLUMN_NAMES = [ "Name", "Progress", "Time Left", "Peers", "Seeds", "Down Rate", "Up Rate", "Down Amt", "Up Amt", "Copies" ] modelfilter, treeview = GTKUtils.make_listview(self.liststore, COLUMN_NAMES) GTKUtils.make_text_cell(treeview.columns[0], 0) GTKUtils.make_progress_cell(treeview.columns[1], 1, 2) for i in range(2, len(COLUMN_NAMES)): GTKUtils.make_text_cell(treeview.columns[i], i + 1) #make treeview searchable treeview.set_search_column(0) #attach the filtermodel and treeview treeview.set_model(gtk.TreeModelSort(modelfilter)) treeview.connect("cursor-changed", self.row_change_cb) treeview.connect("button-press-event", self.button_press_cb) treeview.connect("button-press-event", self.button_press_cb) # treeview.set_size_request(-1, 30) treeview.get_selection().set_mode(gtk.SELECTION_MULTIPLE) self.treeview, self.modelfilter = treeview, modelfilter self.modelfilter.set_visible_func(self.visible_cb) topBox = gtk.VBox() topBox.pack_start(self.buttonRow, False, False, 0) scrolledTorrentsBox = GTKUtils.make_scroll_box( treeview, hPolicy=gtk.POLICY_AUTOMATIC, vPolicy=gtk.POLICY_AUTOMATIC) scrolledTorrentsBoxAlign = gtk.Alignment(0, 0, 1, 1) scrolledTorrentsBoxAlign.set_padding(0, maggicPadding, maggicPadding, maggicPadding) scrolledTorrentsBoxAlign.add(scrolledTorrentsBox) topBox.pack_start(scrolledTorrentsBoxAlign, True, True, 0) self.priorityBox = gtk.HBox() self.priorityBox.pack_start( gtk.Label("Select a torrent to set the priority for its files."), True, True, 0) self.priorityBox.set_border_width(0) self.peerBox = gtk.HBox() self.peerBox.pack_start( gtk.Label("Select a torrent to see your peers in the swarm."), True, True, 0) self.bwGraph = BWGraph.BWGraph(self.app, root=self) self.bwGraph.container.set_size_request(-1, 150) self.notebook = ClosableTabNotebook.ClosableTabNotebook() self.notebook.set_show_border(True) self.notebook.set_border_width(0) self.bwGraph.label = gtk.Label("BitTorrent Traffic") self.priorityBox.label = gtk.Label("Priorities") self.priorityBox.container = self.priorityBox self.peerBox.label = gtk.Label("Peers") self.peerBox.container = self.peerBox self.notebook.show_display(self.bwGraph) self.notebook.show_display(self.priorityBox) self.notebook.show_display(self.peerBox) self.notebook.show_display(self.bwGraph) alignBottom = gtk.Alignment(0, 0, 1, 1) alignBottom.set_padding(0, maggicPadding + 3, maggicPadding + 2, maggicPadding + 2) alignBottom.add(self.notebook) vBoxBottom = gtk.VBox() vBoxBottom.pack_start(alignBottom, True, True, 0) vBoxBottom.pack_end(self.statusRow, False, False, 0) vpane = gtk.VPaned() self.menuBar = BitTorrentMenuBar(self.controller, self) frame = gtk.Frame() frame.set_shadow_type(gtk.SHADOW_OUT) frame.add(topBox) alignTop = gtk.Alignment(1, 1, 1, 1) alignTop.set_padding(10, 0, maggicPadding + 3, maggicPadding + 3) alignTop.add(frame) topContainer = gtk.VBox() topContainer.pack_start(self.menuBar.create_menus(), False, False, 0) topContainer.pack_start(alignTop, True, True, 0) vpane.pack1(topContainer, resize=True, shrink=False) vpane.pack2(vBoxBottom, resize=False, shrink=False) self.label = gtk.Label("") self.label.set_markup( "<span size='x-large' weight='bold'>Bit Twister</span>") self.container = vpane vpane.set_position(400) self.add(self.container) self.container.show_all()
def create(self): self.connect("destroy", self.destroy_cb) ClientUtil.add_updater(self) self.catch_event("no_credits") def on_launched(button): self.start() self._start_listening_for_event("launched", self.app, on_launched) self.popupMenu = TorrentPopupMenu(self) #everything changes in relation to this magic number maggicPadding = 2 self.statusRow = BTUtilityStatusRow(self.app, maggicPadding) self.buttonRow = BTUtilityButtonRow(self.app, maggicPadding) self._start_listening_for_event("add_file", self.buttonRow, self._add_file_cb) self._start_listening_for_event("remove_file", self.buttonRow, self._remove_file_cb) self._start_listening_for_event("pause_torrent", self.buttonRow, self._pause_cb) self._start_listening_for_event("toggle_anonymity", self.buttonRow, self._toggle_anon_cb) self.rows = {} self.curDownload = None self.exitDialog = None self.trackerEditDialog = None #create a liststore with one string column to use as the model #COLUMNS: #0: File name typeList = [gobject.TYPE_STRING, #1: Amount done gobject.TYPE_FLOAT, #2: Status gobject.TYPE_STRING, #3: ETA gobject.TYPE_STRING, #4: Peers gobject.TYPE_STRING, #5: Seeds gobject.TYPE_STRING, #6: Download Rate gobject.TYPE_STRING, #7: Upload Rate gobject.TYPE_STRING, #8: Download Amount gobject.TYPE_STRING, #9: Upload Amount gobject.TYPE_STRING, #10: Upload Amount gobject.TYPE_STRING, #11: the hash for the download. Stored hex-encoded, because nulls mess up gtk gobject.TYPE_STRING, #12: is the row visible? gobject.TYPE_BOOLEAN ] self.attrIdx = {} self.attrIdx["name"] = 0 self.attrIdx["progress"] = 1 self.attrIdx["progressMsg"] = 2 self.attrIdx["status"] = 3 self.attrIdx["peers"] = 4 self.attrIdx["seeds"] = 5 self.attrIdx["rateUp"] = 6 self.attrIdx["rateDown"] = 7 self.attrIdx["amountUp"] = 8 self.attrIdx["amountDown"] = 9 self.attrIdx["copies"] = 10 self.attrIdx["hash"] = 11 self.attrIdx["visibility"] = 12 self.liststore = gtk.ListStore(*typeList) COLUMN_NAMES = ["Name", "Progress", "Time Left", "Peers", "Seeds", "Down Rate", "Up Rate", "Down Amt", "Up Amt", "Copies"] modelfilter, treeview = GTKUtils.make_listview(self.liststore, COLUMN_NAMES) GTKUtils.make_text_cell(treeview.columns[0], 0) GTKUtils.make_progress_cell(treeview.columns[1], 1, 2) for i in range (2, len(COLUMN_NAMES)): GTKUtils.make_text_cell(treeview.columns[i], i+1) #make treeview searchable treeview.set_search_column(0) #attach the filtermodel and treeview treeview.set_model(gtk.TreeModelSort(modelfilter)) treeview.connect("cursor-changed", self.row_change_cb) treeview.connect("button-press-event", self.button_press_cb) treeview.connect("button-press-event", self.button_press_cb) # treeview.set_size_request(-1, 30) treeview.get_selection().set_mode(gtk.SELECTION_MULTIPLE) self.treeview, self.modelfilter = treeview, modelfilter self.modelfilter.set_visible_func(self.visible_cb) topBox = gtk.VBox() topBox.pack_start(self.buttonRow, False, False, 0) scrolledTorrentsBox = GTKUtils.make_scroll_box(treeview, hPolicy=gtk.POLICY_AUTOMATIC, vPolicy=gtk.POLICY_AUTOMATIC) scrolledTorrentsBoxAlign = gtk.Alignment(0, 0, 1, 1) scrolledTorrentsBoxAlign.set_padding(0, maggicPadding, maggicPadding, maggicPadding) scrolledTorrentsBoxAlign.add(scrolledTorrentsBox) topBox.pack_start(scrolledTorrentsBoxAlign, True, True, 0) self.priorityBox = gtk.HBox() self.priorityBox.pack_start(gtk.Label("Select a torrent to set the priority for its files."), True, True, 0) self.priorityBox.set_border_width(0) self.peerBox = gtk.HBox() self.peerBox.pack_start(gtk.Label("Select a torrent to see your peers in the swarm."), True, True, 0) self.bwGraph = BWGraph.BWGraph(self.app, root=self) self.bwGraph.container.set_size_request(-1, 150) self.notebook = ClosableTabNotebook.ClosableTabNotebook() self.notebook.set_show_border(True) self.notebook.set_border_width(0) self.bwGraph.label = gtk.Label("BitTorrent Traffic") self.priorityBox.label = gtk.Label("Priorities") self.priorityBox.container = self.priorityBox self.peerBox.label = gtk.Label("Peers") self.peerBox.container = self.peerBox self.notebook.show_display(self.bwGraph) self.notebook.show_display(self.priorityBox) self.notebook.show_display(self.peerBox) self.notebook.show_display(self.bwGraph) alignBottom = gtk.Alignment(0, 0, 1, 1) alignBottom.set_padding(0, maggicPadding + 3, maggicPadding + 2, maggicPadding + 2) alignBottom.add(self.notebook) vBoxBottom = gtk.VBox() vBoxBottom.pack_start(alignBottom, True, True, 0) vBoxBottom.pack_end(self.statusRow, False, False, 0) vpane = gtk.VPaned() self.menuBar = BitTorrentMenuBar(self.controller, self) frame = gtk.Frame() frame.set_shadow_type(gtk.SHADOW_OUT) frame.add(topBox) alignTop = gtk.Alignment(1, 1, 1, 1) alignTop.set_padding(10, 0, maggicPadding + 3, maggicPadding + 3) alignTop.add(frame) topContainer = gtk.VBox() topContainer.pack_start(self.menuBar.create_menus(), False, False, 0) topContainer.pack_start(alignTop, True, True, 0) vpane.pack1(topContainer, resize=True, shrink=False) vpane.pack2(vBoxBottom, resize=False, shrink=False) self.label = gtk.Label("") self.label.set_markup("<span size='x-large' weight='bold'>Bit Twister</span>") self.container = vpane vpane.set_position(400) self.add(self.container) self.container.show_all()
def __init__(self, app, torrentHash, data, showDoneColumn): self.app = app self.torrentHash = torrentHash self.torrentData = data self.download = None self.showDoneColumn = showDoneColumn #0: File name typeList = [ gobject.TYPE_STRING, #1: Priority gobject.TYPE_INT, #2: Size gobject.TYPE_INT64, #3: Percent done gobject.TYPE_FLOAT ] self.liststore = gtk.ListStore(*typeList) COLUMN_NAMES = ['File', 'Size', 'Priority'] if showDoneColumn: COLUMN_NAMES += ['Completion'] def format_priority(value): if value == -1: return "" elif value == 0: return "High" elif value == 1: return "Normal" elif value == 2: return "Low" else: log_msg( "Bad priority value for format_priority: %s" % (value), 3) return str(value) def format_size(value): value = float(value) / (1024.0 * 1024.0) if value < 1.0: return "%.2f MB" % (value) return "%.0f MB" % (value) modelfilter, treeview = GTKUtils.make_listview(self.liststore, COLUMN_NAMES) GTKUtils.make_toggle_cell(treeview.columns[0], 1) GTKUtils.make_text_cell(treeview.columns[0], 0) GTKUtils.make_text_cell(treeview.columns[1], 2, format_size) GTKUtils.make_text_cell(treeview.columns[2], 1, format_priority) if showDoneColumn: GTKUtils.make_progress_cell(treeview.columns[3], 3) #make treeview searchable treeview.set_search_column(0) #attach the filtermodel and treeview treeview.set_model(gtk.TreeModelSort(modelfilter)) treeview.connect("row-activated", self.row_activate_cb) treeview.connect("button-press-event", self.button_press_cb) treeview.get_selection().set_mode(gtk.SELECTION_MULTIPLE) self.modelfilter, self.treeview = modelfilter, treeview scrolled_window = GTKUtils.make_scroll_box( self.treeview, hPolicy=gtk.POLICY_AUTOMATIC, vPolicy=gtk.POLICY_AUTOMATIC) scrolled_window.set_size_request(-1, 200) scrolled_window.set_border_width(0) treeview.set_border_width(0) self.container = scrolled_window #now add the actual data: fileList = [] i = self.torrentData['metainfo']['info'] if i.has_key('length'): fileList.append([ self.torrentData['file'].replace(".torrent", ""), self.torrentData['length'] ]) elif i.has_key('files'): for entry in i['files']: folderList = entry['path'] fileList.append([os.path.join(*folderList), entry['length']]) else: raise Exception( "Cannot handle torrent without length or files keys") #stick it in the gui for fileName, size in fileList: #TODO: When you try putting some torrents in here, you get this error message: # C:\Projects\web\innominet\gui\BTDisplay.py:386: PangoWarning: Invalid UTF-8 string passed to pango_layout_set_text() # self.dia.show_all() #tried these, but they didnt work: #fileName = fileName.encode("UTF-8") #fileName = unicode( fileName, "utf-8" ) self.liststore.append([fileName, 1, size, 0.0])