From 4ca7ced7578056cbcd9a2b703113045b114c97c2 Mon Sep 17 00:00:00 2001 From: Andrew Resch Date: Fri, 21 Sep 2007 00:08:12 +0000 Subject: [PATCH] Add status icons to torrentview. --- deluge/common.py | 1 + deluge/ui/gtkui/listview.py | 97 ++++++++++++++++++---------------- deluge/ui/gtkui/torrentview.py | 30 ++++++++++- 3 files changed, 80 insertions(+), 48 deletions(-) diff --git a/deluge/common.py b/deluge/common.py index 7490de859..1be89d5f9 100644 --- a/deluge/common.py +++ b/deluge/common.py @@ -89,6 +89,7 @@ def get_pixmap(fname): """Returns a pixmap file included with deluge""" return pkg_resources.resource_filename("deluge", os.path.join("data", \ "pixmaps", fname)) + def get_logo(size): """Returns a deluge logo pixbuf based on the size parameter.""" import gtk diff --git a/deluge/ui/gtkui/listview.py b/deluge/ui/gtkui/listview.py index 73cc6ce7a..681cbf70b 100644 --- a/deluge/ui/gtkui/listview.py +++ b/deluge/ui/gtkui/listview.py @@ -40,7 +40,6 @@ import deluge.common from deluge.log import LOG as log # Cell data functions to pass to add_func_column() - def cell_data_speed(column, cell, model, row, data): """Display value as a speed, eg. 2 KiB/s""" speed = int(model.get_value(row, data)) @@ -244,8 +243,9 @@ class ListView: return - def add_column(self, header, renderer, col_types, hidden, position, - status_field, sortid, text=0, value=0, function=None): + def add_column(self, header, render, col_types, hidden, position, + status_field, sortid, text=0, value=0, pixbuf=0, function=None, + column_type=None): """Adds a column to the ListView""" # Add the column types to liststore_columns column_indices = [] @@ -272,43 +272,37 @@ class ListView: # Create a new list with the added column self.create_new_liststore() - if type(renderer) is not tuple and type(renderer) is not list: - renderer = [renderer] - - column = gtk.TreeViewColumn(header) - for render in renderer: - if type(render) is gtk.CellRendererText: - # Check to see if this is a function column or not - if function is None: - # Not a function column, so lets treat it as a regular - # text col - column.pack_start(render) - column.add_attribute(render, "text", - self.columns[header].column_indices[text]) - else: - # This is a function column - column.pack_start(render, True) - if len(self.columns[header].column_indices) > 1: - column.set_cell_data_func(render, function, - tuple(self.columns[header].column_indices)) - else: - column.set_cell_data_func(render, function, - self.columns[header].column_indices[0]) - elif type(render) is gtk.CellRendererProgress: - # This is a progress column - column.pack_start(render) - column.add_attribute(render, "text", + column = gtk.TreeViewColumn(header) + if column_type == "text": + column.pack_start(render) + column.add_attribute(render, "text", self.columns[header].column_indices[text]) - column.add_attribute(render, "value", - self.columns[header].column_indices[value]) - - elif type(render) is gtk.CellRendererPixbuf: - # This is a pixbuf column - column.pack_start(render, expand=False) - column.add_attribute(render, "pixbuf", - self.columns[header].column_indices[pixbuf]) + elif column_type == "func": + column.pack_start(render, True) + if len(self.columns[header].column_indices) > 1: + column.set_cell_data_func(render, function, + tuple(self.columns[header].column_indices)) else: - column.pack_start(render) + column.set_cell_data_func(render, function, + self.columns[header].column_indices[0]) + elif column_type == "progress": + column.pack_start(render) + column.add_attribute(render, "text", + self.columns[header].column_indices[text]) + column.add_attribute(render, "value", + self.columns[header].column_indices[value]) + elif column_type == "texticon": + column.pack_start(render[pixbuf]) + if function is not None: + column.set_cell_data_func(render[pixbuf], function, + self.columns[header].column_indices[pixbuf]) + column.pack_start(render[text]) + column.add_attribute(render[text], "text", + self.columns[header].column_indices[text]) + elif column_type == None: + return + + column.set_sort_column_id(self.columns[header].column_indices[sortid]) column.set_clickable(True) @@ -332,23 +326,26 @@ class ListView: def add_text_column(self, header, col_type=str, hidden=False, position=None, status_field=None, - sortid=0): + sortid=0, + column_type="text"): """Add a text column to the listview. Only the header name is required. """ render = gtk.CellRendererText() self.add_column(header, render, col_type, hidden, position, - status_field, sortid, text=0) + status_field, sortid, column_type=column_type) return True def add_func_column(self, header, function, col_types, sortid=0, - hidden=False, position=None, status_field=None): + hidden=False, position=None, status_field=None, + column_type="func"): """Add a function column to the listview. Need a header name, the function and the column types.""" render = gtk.CellRendererText() self.add_column(header, render, col_types, hidden, position, - status_field, sortid, function=function) + status_field, sortid, column_type=column_type, + function=function) return True @@ -356,25 +353,31 @@ class ListView: sortid=0, hidden=False, position=None, - status_field=None): + status_field=None, + column_type="progress"): """Add a progress column to the listview.""" render = gtk.CellRendererProgress() self.add_column(header, render, col_types, hidden, position, - status_field, sortid, value=0, text=1) + status_field, sortid, column_type=column_type, + value=0, text=1) return True - def add_texticon_column(self, header, col_types=[gtk.gdk.Pixbuf, str], + def add_texticon_column(self, header, col_types=[int, str], sortid=0, hidden=False, position=None, - status_field=None): + status_field=None, + column_type="texticon", + function=None): """Adds a texticon column to the listview.""" render1 = gtk.CellRendererPixbuf() render2 = gtk.CellRendererText() self.add_column(header, (render1, render2), col_types, hidden, - position, status_field, sortid, text=1, pixbuf=0) + position, status_field, sortid, + column_type=column_type, function=function, + pixbuf=0, text=1) return True diff --git a/deluge/ui/gtkui/torrentview.py b/deluge/ui/gtkui/torrentview.py index 1b482b6b8..d628c6117 100644 --- a/deluge/ui/gtkui/torrentview.py +++ b/deluge/ui/gtkui/torrentview.py @@ -38,10 +38,34 @@ pygtk.require('2.0') import gtk, gtk.glade import gettext +import deluge.common import deluge.ui.functions as functions from deluge.log import LOG as log import deluge.ui.gtkui.listview as listview +def cell_data_statusicon(column, cell, model, row, data): + """Display text with an icon""" + state = model.get_value(row, data) + if state == deluge.common.TORRENT_STATE.index("Connecting"): + fname = "downloading16.png" + if state == deluge.common.TORRENT_STATE.index("Downloading"): + fname = "downloading16.png" + if state == deluge.common.TORRENT_STATE.index("Downloading Metadata"): + fname = "downloading16.png" + if state == deluge.common.TORRENT_STATE.index("Queued"): + fname = "inactive16.png" + if state == deluge.common.TORRENT_STATE.index("Checking"): + fname = "downloading16.png" + if state == deluge.common.TORRENT_STATE.index("Allocating"): + fname = "downloading16.png" + if state == deluge.common.TORRENT_STATE.index("Finished"): + fname = "seeding16.png" + if state == deluge.common.TORRENT_STATE.index("Seeding"): + fname = "seeding16.png" + + icon = gtk.gdk.pixbuf_new_from_file(deluge.common.get_pixmap(fname)) + cell.set_property("pixbuf", icon) + class TorrentView(listview.ListView): """TorrentView handles the listing of torrents.""" def __init__(self, window): @@ -59,7 +83,8 @@ class TorrentView(listview.ListView): # Add the columns to the listview self.add_text_column("torrent_id", hidden=True) - self.add_text_column("Name", status_field=["name"]) + self.add_texticon_column("Name", status_field=["state", "name"], + function=cell_data_statusicon) self.add_func_column("Size", listview.cell_data_size, [long], @@ -143,6 +168,9 @@ class TorrentView(listview.ListView): status_keys.append(field) columns_to_update.append(column) + # Remove duplicate keys + columns_to_update = list(set(columns_to_update)) + # If there is nothing in status_keys then we must not continue if status_keys is []: return