Added files priorities.
This commit is contained in:
parent
9310c7dce5
commit
280f4dfb10
|
@ -1,100 +1,103 @@
|
|||
<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*-->
|
||||
<!DOCTYPE glade-interface SYSTEM "http://glade.gnome.org/glade-2.0.dtd">
|
||||
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!DOCTYPE glade-interface SYSTEM "glade-2.0.dtd">
|
||||
<!--*- mode: xml -*-->
|
||||
<glade-interface>
|
||||
|
||||
<widget class="GtkMenu" id="file_tab_menu">
|
||||
<property name="visible">True</property>
|
||||
|
||||
<child>
|
||||
<widget class="GtkImageMenuItem" id="select_all">
|
||||
<property name="visible">True</property>
|
||||
<property name="label" translatable="yes">Select All</property>
|
||||
<property name="use_underline">True</property>
|
||||
<signal name="activate" handler="select_all" last_modification_time="Mon, 11 Jun 2007 12:54:52 GMT"/>
|
||||
|
||||
<child internal-child="image">
|
||||
<widget class="GtkImage" id="image22">
|
||||
<property name="visible">True</property>
|
||||
<property name="stock">gtk-select-all</property>
|
||||
<property name="icon_size">1</property>
|
||||
<property name="xalign">0.5</property>
|
||||
<property name="yalign">0.5</property>
|
||||
<property name="xpad">0</property>
|
||||
<property name="ypad">0</property>
|
||||
</widget>
|
||||
</child>
|
||||
</widget>
|
||||
</child>
|
||||
|
||||
<child>
|
||||
<widget class="GtkImageMenuItem" id="unselect_all">
|
||||
<property name="visible">True</property>
|
||||
<property name="label" translatable="yes">Unselect All</property>
|
||||
<property name="use_underline">True</property>
|
||||
<signal name="activate" handler="unselect_all" last_modification_time="Mon, 11 Jun 2007 13:16:59 GMT"/>
|
||||
|
||||
<child internal-child="image">
|
||||
<widget class="GtkImage" id="image23">
|
||||
<property name="visible">True</property>
|
||||
<property name="stock">gtk-file</property>
|
||||
<property name="icon_size">1</property>
|
||||
<property name="xalign">0.5</property>
|
||||
<property name="yalign">0.5</property>
|
||||
<property name="xpad">0</property>
|
||||
<property name="ypad">0</property>
|
||||
</widget>
|
||||
</child>
|
||||
</widget>
|
||||
</child>
|
||||
|
||||
<child>
|
||||
<widget class="GtkSeparatorMenuItem" id="separator">
|
||||
<property name="visible">True</property>
|
||||
</widget>
|
||||
</child>
|
||||
|
||||
<child>
|
||||
<widget class="GtkImageMenuItem" id="check_selected">
|
||||
<property name="visible">True</property>
|
||||
<property name="label" translatable="yes">Check Selected</property>
|
||||
<property name="use_underline">True</property>
|
||||
<signal name="activate" handler="check_selected" last_modification_time="Mon, 11 Jun 2007 12:54:52 GMT"/>
|
||||
|
||||
<child internal-child="image">
|
||||
<widget class="GtkImage" id="image24">
|
||||
<property name="visible">True</property>
|
||||
<property name="stock">gtk-ok</property>
|
||||
<property name="icon_size">1</property>
|
||||
<property name="xalign">0.5</property>
|
||||
<property name="yalign">0.5</property>
|
||||
<property name="xpad">0</property>
|
||||
<property name="ypad">0</property>
|
||||
</widget>
|
||||
</child>
|
||||
</widget>
|
||||
</child>
|
||||
|
||||
<child>
|
||||
<widget class="GtkImageMenuItem" id="uncheck_selected">
|
||||
<property name="visible">True</property>
|
||||
<property name="label" translatable="yes">Uncheck Selected</property>
|
||||
<property name="use_underline">True</property>
|
||||
<signal name="activate" handler="uncheck_selected" last_modification_time="Mon, 11 Jun 2007 12:54:52 GMT"/>
|
||||
|
||||
<child internal-child="image">
|
||||
<widget class="GtkImage" id="image25">
|
||||
<property name="visible">True</property>
|
||||
<property name="stock">gtk-remove</property>
|
||||
<property name="icon_size">1</property>
|
||||
<property name="xalign">0.5</property>
|
||||
<property name="yalign">0.5</property>
|
||||
<property name="xpad">0</property>
|
||||
<property name="ypad">0</property>
|
||||
</widget>
|
||||
</child>
|
||||
</widget>
|
||||
</child>
|
||||
</widget>
|
||||
|
||||
<widget class="GtkMenu" id="file_tab_menu">
|
||||
<property name="visible">True</property>
|
||||
<child>
|
||||
<widget class="GtkImageMenuItem" id="select_all">
|
||||
<property name="visible">True</property>
|
||||
<property name="label" translatable="yes">Select All</property>
|
||||
<property name="use_underline">True</property>
|
||||
<signal name="activate" handler="select_all"/>
|
||||
<child internal-child="image">
|
||||
<widget class="GtkImage" id="image22">
|
||||
<property name="visible">True</property>
|
||||
<property name="stock">gtk-select-all</property>
|
||||
<property name="icon_size">1</property>
|
||||
</widget>
|
||||
</child>
|
||||
</widget>
|
||||
</child>
|
||||
<child>
|
||||
<widget class="GtkImageMenuItem" id="unselect_all">
|
||||
<property name="visible">True</property>
|
||||
<property name="label" translatable="yes">Unselect All</property>
|
||||
<property name="use_underline">True</property>
|
||||
<signal name="activate" handler="unselect_all"/>
|
||||
<child internal-child="image">
|
||||
<widget class="GtkImage" id="image23">
|
||||
<property name="visible">True</property>
|
||||
<property name="stock">gtk-missing-image</property>
|
||||
<property name="icon_size">1</property>
|
||||
</widget>
|
||||
</child>
|
||||
</widget>
|
||||
</child>
|
||||
<child>
|
||||
<widget class="GtkSeparatorMenuItem" id="separator">
|
||||
<property name="visible">True</property>
|
||||
</widget>
|
||||
</child>
|
||||
<child>
|
||||
<widget class="GtkImageMenuItem" id="priority_dont_download">
|
||||
<property name="visible">True</property>
|
||||
<property name="label" translatable="yes">Don't download</property>
|
||||
<property name="use_underline">True</property>
|
||||
<signal name="activate" handler="priority_dont_download"/>
|
||||
<child internal-child="image">
|
||||
<widget class="GtkImage" id="image24">
|
||||
<property name="visible">True</property>
|
||||
<property name="stock">gtk-ok</property>
|
||||
<property name="icon_size">1</property>
|
||||
</widget>
|
||||
</child>
|
||||
</widget>
|
||||
</child>
|
||||
<child>
|
||||
<widget class="GtkImageMenuItem" id="priority_normal">
|
||||
<property name="visible">True</property>
|
||||
<property name="label" translatable="yes">Normal</property>
|
||||
<property name="use_underline">True</property>
|
||||
<signal name="activate" handler="priority_normal"/>
|
||||
<child internal-child="image">
|
||||
<widget class="GtkImage" id="image25">
|
||||
<property name="visible">True</property>
|
||||
<property name="stock">gtk-ok</property>
|
||||
<property name="icon_size">1</property>
|
||||
</widget>
|
||||
</child>
|
||||
</widget>
|
||||
</child>
|
||||
<child>
|
||||
<widget class="GtkImageMenuItem" id="priority_high">
|
||||
<property name="visible">True</property>
|
||||
<property name="label" translatable="yes">High</property>
|
||||
<property name="use_underline">True</property>
|
||||
<signal name="activate" handler="priority_high"/>
|
||||
<child internal-child="image">
|
||||
<widget class="GtkImage" id="image26">
|
||||
<property name="visible">True</property>
|
||||
<property name="stock">gtk-ok</property>
|
||||
<property name="icon_size">1</property>
|
||||
</widget>
|
||||
</child>
|
||||
</widget>
|
||||
</child>
|
||||
<child>
|
||||
<widget class="GtkImageMenuItem" id="priority_highest">
|
||||
<property name="visible">True</property>
|
||||
<property name="label" translatable="yes">Highest</property>
|
||||
<property name="use_underline">True</property>
|
||||
<signal name="activate" handler="priority_highest"/>
|
||||
<child internal-child="image">
|
||||
<widget class="GtkImage" id="image27">
|
||||
<property name="visible">True</property>
|
||||
<property name="stock">gtk-ok</property>
|
||||
<property name="icon_size">1</property>
|
||||
</widget>
|
||||
</child>
|
||||
</widget>
|
||||
</child>
|
||||
</widget>
|
||||
</glade-interface>
|
||||
|
|
676
po/deluge.pot
676
po/deluge.pot
File diff suppressed because it is too large
Load Diff
|
@ -105,6 +105,9 @@ def ftime(seconds):
|
|||
return '%dw %dd'%(weeks, days)
|
||||
return 'unknown'
|
||||
|
||||
def fpriority(priority):
|
||||
return PRIORITY_DICT[priority]
|
||||
|
||||
def get_glade_file(fname):
|
||||
return os.path.join(GLADE_DIR, fname)
|
||||
|
||||
|
@ -150,6 +153,9 @@ def fetch_url(url):
|
|||
|
||||
return None
|
||||
|
||||
def N_(arg):
|
||||
return arg
|
||||
|
||||
# Encryption States
|
||||
class EncState:
|
||||
forced, enabled, disabled = range(3)
|
||||
|
@ -159,3 +165,14 @@ class EncLevel:
|
|||
|
||||
class ProxyType:
|
||||
none, socks4, socks5, socks5_pw, http, http_pw = range(6)
|
||||
|
||||
# Priorities
|
||||
PRIORITY_DONT_DOWNLOAD = 0
|
||||
PRIORITY_NORMAL = 1
|
||||
PRIORITY_HIGH = 2
|
||||
PRIORITY_HIGHEST = 6
|
||||
|
||||
PRIORITY_DICT = {PRIORITY_DONT_DOWNLOAD: N_("Don't download"),
|
||||
PRIORITY_NORMAL: N_("Normal"),
|
||||
PRIORITY_HIGH: N_("High"),
|
||||
PRIORITY_HIGHEST: N_("Highest")}
|
|
@ -53,6 +53,7 @@ import shutil
|
|||
import statvfs
|
||||
import time
|
||||
|
||||
from common import N_, PRIORITY_NORMAL
|
||||
import deluge_core
|
||||
import pref
|
||||
|
||||
|
@ -80,9 +81,6 @@ PREF_FUNCTIONS = {
|
|||
"use_utpex" : deluge_core.use_utpex,
|
||||
}
|
||||
|
||||
def N_(self):
|
||||
return self
|
||||
|
||||
STATE_MESSAGES = (N_("Queued"),
|
||||
N_("Checking"),
|
||||
N_("Connecting"),
|
||||
|
@ -634,7 +632,7 @@ class Manager:
|
|||
|
||||
num_files = self.get_core_torrent_state(unique_ID,
|
||||
True)['num_files']
|
||||
return [1] * num_files
|
||||
return [PRIORITY_NORMAL] * num_files
|
||||
|
||||
# Called when a session starts, to apply existing priorities
|
||||
def apply_all_file_priorities(self):
|
||||
|
|
128
src/files.py
128
src/files.py
|
@ -30,23 +30,27 @@
|
|||
# this exception statement from your version. If you delete this exception
|
||||
# statement from all source files in the program, then also delete it here.
|
||||
|
||||
import gtk
|
||||
import dgtk
|
||||
import common
|
||||
from itertools import izip
|
||||
|
||||
import gobject
|
||||
import gtk
|
||||
|
||||
import common
|
||||
import dgtk
|
||||
|
||||
class FilesBaseManager(object):
|
||||
def __init__(self, file_store):
|
||||
self.file_glade = gtk.glade.XML(common.get_glade_file("file_tab_menu.glade"),
|
||||
domain='deluge')
|
||||
self.file_menu = self.file_glade.get_widget("file_tab_menu")
|
||||
self.file_glade.signal_autoconnect({
|
||||
"select_all": self.file_select_all,
|
||||
"unselect_all": self.file_unselect_all,
|
||||
"check_selected": self.file_check_selected,
|
||||
"uncheck_selected": self.file_uncheck_selected,
|
||||
})
|
||||
file_glade = gtk.glade.XML(common.get_glade_file("file_tab_menu.glade"),
|
||||
domain='deluge')
|
||||
self.file_menu = file_glade.get_widget("file_tab_menu")
|
||||
file_glade.signal_autoconnect({
|
||||
"select_all": self.file_select_all,
|
||||
"unselect_all": self.file_unselect_all,
|
||||
"priority_dont_download": self.priority_clicked,
|
||||
"priority_normal": self.priority_clicked,
|
||||
"priority_high": self.priority_clicked,
|
||||
"priority_highest": self.priority_clicked,
|
||||
})
|
||||
|
||||
self.file_store = file_store
|
||||
# We need file_store_sorted so original file_store keeps unchanged
|
||||
|
@ -57,20 +61,21 @@ class FilesBaseManager(object):
|
|||
|
||||
def build_file_view(self, file_view):
|
||||
self.file_view = file_view
|
||||
self.file_selected = []
|
||||
|
||||
dgtk.add_toggle_column(self.file_view, _("Priority"), 0,
|
||||
toggled_signal=self.file_toggled)
|
||||
def priority(column, cell, model, iter, data):
|
||||
priority = common.fpriority(model.get_value(iter, data))
|
||||
cell.set_property("text", priority)
|
||||
|
||||
filename_column = dgtk.add_text_column(self.file_view, _("Filename"),
|
||||
1)
|
||||
0)
|
||||
filename_column.set_expand(True)
|
||||
dgtk.add_func_column(self.file_view, _("Size"), dgtk.cell_data_size,
|
||||
2)
|
||||
1)
|
||||
dgtk.add_func_column(self.file_view, _("Priority"), priority, 2)
|
||||
|
||||
self.file_view.set_model(self.file_store_sorted)
|
||||
self.file_view.get_selection().set_mode(gtk.SELECTION_MULTIPLE)
|
||||
self.file_view.get_selection().set_select_function(self.file_clicked)
|
||||
self.file_view.connect("button-press-event", self.file_view_clicked)
|
||||
self.file_view.connect("button-press-event", self.mouse_clicked)
|
||||
|
||||
def clear_file_store(self):
|
||||
self.file_store.clear()
|
||||
|
@ -85,60 +90,37 @@ class FilesBaseManager(object):
|
|||
def file_unselect_all(self, widget):
|
||||
self.file_view.get_selection().unselect_all()
|
||||
|
||||
def file_check_selected(self, widget):
|
||||
self.file_view.get_selection().selected_foreach(self.file_toggle_selected, True)
|
||||
self.file_toggled_update_priorities()
|
||||
def priority_clicked(self, widget):
|
||||
widget_name = widget.get_name()
|
||||
priority = {'priority_dont_download': common.PRIORITY_DONT_DOWNLOAD,
|
||||
'priority_normal': common.PRIORITY_NORMAL,
|
||||
'priority_high': common.PRIORITY_HIGH,
|
||||
'priority_highest': common.PRIORITY_HIGHEST}[widget_name]
|
||||
|
||||
selected_paths = self.file_view.get_selection().get_selected_rows()[1]
|
||||
for path in selected_paths:
|
||||
child_path = self.file_store_sorted.\
|
||||
convert_path_to_child_path(path)
|
||||
|
||||
self.file_store.set_value(self.file_store.get_iter(child_path), 2,
|
||||
priority)
|
||||
|
||||
self.update_priorities()
|
||||
|
||||
def file_uncheck_selected(self, widget):
|
||||
self.file_view.get_selection().selected_foreach(self.file_toggle_selected, False)
|
||||
self.file_toggled_update_priorities()
|
||||
|
||||
def file_clicked(self, path):
|
||||
return not self.file_selected
|
||||
|
||||
def file_view_clicked(self, widget, event):
|
||||
def mouse_clicked(self, widget, event):
|
||||
if event.button == 3:
|
||||
self.file_menu.popup(None, None, None, event.button, event.time)
|
||||
return True
|
||||
else:
|
||||
self.file_selected = False
|
||||
return False
|
||||
|
||||
def file_toggle_selected(self, treemodel, path, selected_iter, value):
|
||||
child_iter = self.file_store_sorted.convert_iter_to_child_iter(None,
|
||||
selected_iter)
|
||||
if value:
|
||||
new_value = 1
|
||||
else:
|
||||
new_value = 0
|
||||
self.file_store_sorted.get_model().set_value(child_iter, 0, new_value)
|
||||
|
||||
def file_toggled(self, renderer, path):
|
||||
self.file_selected = True
|
||||
|
||||
value = not renderer.get_active()
|
||||
if value:
|
||||
new_value = 1
|
||||
else:
|
||||
new_value = 0
|
||||
|
||||
file_iter = self.file_store_sorted.get_iter_from_string(path)
|
||||
selection = self.file_view.get_selection()
|
||||
if selection.iter_is_selected(file_iter):
|
||||
selection.selected_foreach(self.file_toggle_selected, value)
|
||||
else:
|
||||
child_iter = self.file_store_sorted.convert_iter_to_child_iter(
|
||||
None, file_iter)
|
||||
self.file_store_sorted.get_model().set_value(child_iter, 0,
|
||||
new_value)
|
||||
self.file_toggled_update_priorities()
|
||||
|
||||
def file_toggled_update_priorities(self):
|
||||
def update_priorities(self):
|
||||
pass
|
||||
|
||||
class FilesTabManager(FilesBaseManager):
|
||||
def __init__(self, manager):
|
||||
file_store = gtk.ListStore(int, str, gobject.TYPE_UINT64, float)
|
||||
file_store = gtk.ListStore(str, gobject.TYPE_UINT64,
|
||||
gobject.TYPE_UINT, float)
|
||||
|
||||
super(FilesTabManager, self).__init__(file_store)
|
||||
|
||||
|
@ -161,43 +143,47 @@ class FilesTabManager(FilesBaseManager):
|
|||
def set_unique_id(self, unique_id):
|
||||
self.file_unique_id = unique_id
|
||||
|
||||
# From core to UI
|
||||
def prepare_file_store(self):
|
||||
if not self.file_store_dict:
|
||||
all_files = self.manager.get_torrent_file_info(self.file_unique_id)
|
||||
file_priorities = self.manager.get_priorities(self.file_unique_id)
|
||||
for file, priority in izip(all_files, file_priorities):
|
||||
iter = self.file_store.append([priority, file['path'],
|
||||
file['size'],
|
||||
round(file['progress'], 2)])
|
||||
iter = self.file_store.append([file['path'], file['size'],
|
||||
priority, round(file['progress'], 2)])
|
||||
self.file_store_dict[file['path']] = iter
|
||||
|
||||
# From core to UI
|
||||
def update_file_store(self):
|
||||
new_file_info = self.manager.get_torrent_file_info(self.file_unique_id)
|
||||
for file in new_file_info:
|
||||
iter = self.file_store_dict[file['path']]
|
||||
if self.file_store.get_value(iter, 3) != round(file['progress'], 2):
|
||||
self.file_store.set(iter, 3, file['progress'])
|
||||
|
||||
def file_toggled_update_priorities(self):
|
||||
|
||||
# From UI to core
|
||||
def update_priorities(self):
|
||||
file_priorities = []
|
||||
for x in self.file_store:
|
||||
file_priorities.append(x[0])
|
||||
file_priorities.append(x[2])
|
||||
self.manager.prioritize_files(self.file_unique_id, file_priorities)
|
||||
|
||||
class FilesDialogManager(FilesBaseManager):
|
||||
def __init__(self, dumped_torrent):
|
||||
file_store = gtk.ListStore(int, str, gobject.TYPE_UINT64)
|
||||
file_store = gtk.ListStore(str, gobject.TYPE_UINT64,
|
||||
gobject.TYPE_UINT)
|
||||
super(FilesDialogManager, self).__init__(file_store)
|
||||
|
||||
self.dumped_torrent = dumped_torrent
|
||||
|
||||
def prepare_file_store(self):
|
||||
for file in self.dumped_torrent:
|
||||
self.file_store.append([1, file['path'], file['size']])
|
||||
self.file_store.append([file['path'], file['size'],
|
||||
common.PRIORITY_NORMAL])
|
||||
|
||||
def get_priorities(self):
|
||||
file_priorities = []
|
||||
for x in self.file_store:
|
||||
file_priorities.append(x[0])
|
||||
file_priorities.append(x[2])
|
||||
|
||||
return file_priorities
|
||||
|
|
|
@ -955,6 +955,9 @@ class DelugeGTK:
|
|||
# unique_id param
|
||||
if unique_id is None:
|
||||
unique_id = self.get_selected_torrent()
|
||||
# If no torrents added
|
||||
if unique_id is None:
|
||||
return
|
||||
# page_num is to force update info when user just changes tab
|
||||
if page_num is None:
|
||||
page_num = self.wtree.get_widget("torrent_info").get_current_page()
|
||||
|
@ -1022,7 +1025,6 @@ class DelugeGTK:
|
|||
self.files_tab.set_unique_id(unique_id)
|
||||
self.files_tab.prepare_file_store()
|
||||
self.files_tab.update_file_store()
|
||||
|
||||
|
||||
def calc_share_ratio(self, unique_id, torrent_state):
|
||||
r = float(self.manager.calc_ratio(unique_id, torrent_state))
|
||||
|
|
Loading…
Reference in New Issue