Merge branch 'master' into pieces-progress-bar
Conflicts: deluge/ui/gtkui/glade/main_window.glade
This commit is contained in:
commit
c4dbf017a5
|
@ -78,6 +78,12 @@ def filter_one_keyword(torrent_ids, keyword):
|
||||||
yield torrent_id
|
yield torrent_id
|
||||||
break
|
break
|
||||||
|
|
||||||
|
def filter_by_name(torrent_ids, search_string):
|
||||||
|
all_torrents = component.get("TorrentManager").torrents
|
||||||
|
for torrent_id in torrent_ids:
|
||||||
|
if search_string[0].lower() in all_torrents[torrent_id].filename.lower():
|
||||||
|
yield torrent_id
|
||||||
|
|
||||||
def tracker_error_filter(torrent_ids, values):
|
def tracker_error_filter(torrent_ids, values):
|
||||||
filtered_torrent_ids = []
|
filtered_torrent_ids = []
|
||||||
tm = component.get("TorrentManager")
|
tm = component.get("TorrentManager")
|
||||||
|
@ -108,6 +114,7 @@ class FilterManager(component.Component):
|
||||||
self.torrents = core.torrentmanager
|
self.torrents = core.torrentmanager
|
||||||
self.registered_filters = {}
|
self.registered_filters = {}
|
||||||
self.register_filter("keyword", filter_keywords)
|
self.register_filter("keyword", filter_keywords)
|
||||||
|
self.register_filter("name", filter_by_name)
|
||||||
self.tree_fields = {}
|
self.tree_fields = {}
|
||||||
|
|
||||||
self.register_tree_field("state", self._init_state_tree)
|
self.register_tree_field("state", self._init_state_tree)
|
||||||
|
|
|
@ -246,14 +246,20 @@ class DelugeRPCProtocol(Protocol):
|
||||||
Sends an error response with the contents of the exception that was raised.
|
Sends an error response with the contents of the exception that was raised.
|
||||||
"""
|
"""
|
||||||
exceptionType, exceptionValue, exceptionTraceback = sys.exc_info()
|
exceptionType, exceptionValue, exceptionTraceback = sys.exc_info()
|
||||||
self.sendData((
|
try:
|
||||||
RPC_ERROR,
|
self.sendData((
|
||||||
request_id,
|
RPC_ERROR,
|
||||||
exceptionType.__name__,
|
request_id,
|
||||||
exceptionValue._args,
|
exceptionType.__name__,
|
||||||
exceptionValue._kwargs,
|
exceptionValue._args,
|
||||||
"".join(traceback.format_tb(exceptionTraceback))
|
exceptionValue._kwargs,
|
||||||
))
|
"".join(traceback.format_tb(exceptionTraceback))
|
||||||
|
))
|
||||||
|
except Exception, err:
|
||||||
|
log.error("An exception occurred while sending RPC_ERROR to "
|
||||||
|
"client. Error to send(exception goes next): %s",
|
||||||
|
"".join(traceback.format_tb(exceptionTraceback)))
|
||||||
|
log.exception(err)
|
||||||
|
|
||||||
if method == "daemon.info":
|
if method == "daemon.info":
|
||||||
# This is a special case and used in the initial connection process
|
# This is a special case and used in the initial connection process
|
||||||
|
|
|
@ -189,14 +189,14 @@ class Torrent(object):
|
||||||
else:
|
else:
|
||||||
self.owner = owner
|
self.owner = owner
|
||||||
|
|
||||||
# Keep trac of last seen complete
|
# Keep track of last seen complete
|
||||||
if state:
|
if state:
|
||||||
self._last_seen_complete = state.last_seen_complete or 0.0
|
self._last_seen_complete = state.last_seen_complete or 0.0
|
||||||
else:
|
else:
|
||||||
self._last_seen_complete = 0.0
|
self._last_seen_complete = 0.0
|
||||||
|
|
||||||
# Keep track if we're forcing a recheck of the torrent so that we can
|
# Keep track if we're forcing a recheck of the torrent so that we can
|
||||||
# repause it after its done if necessary
|
# re-pause it after its done if necessary
|
||||||
self.forcing_recheck = False
|
self.forcing_recheck = False
|
||||||
self.forcing_recheck_paused = False
|
self.forcing_recheck_paused = False
|
||||||
|
|
||||||
|
@ -359,7 +359,7 @@ class Torrent(object):
|
||||||
# Set the tracker list in the torrent object
|
# Set the tracker list in the torrent object
|
||||||
self.trackers = trackers
|
self.trackers = trackers
|
||||||
if len(trackers) > 0:
|
if len(trackers) > 0:
|
||||||
# Force a reannounce if there is at least 1 tracker
|
# Force a re-announce if there is at least 1 tracker
|
||||||
self.force_reannounce()
|
self.force_reannounce()
|
||||||
|
|
||||||
self.tracker_host = None
|
self.tracker_host = None
|
||||||
|
|
|
@ -226,9 +226,10 @@ class Core(CorePluginBase):
|
||||||
if filename in self.invalid_torrents:
|
if filename in self.invalid_torrents:
|
||||||
self.invalid_torrents[filename] += 1
|
self.invalid_torrents[filename] += 1
|
||||||
if self.invalid_torrents[filename] >= MAX_NUM_ATTEMPTS:
|
if self.invalid_torrents[filename] >= MAX_NUM_ATTEMPTS:
|
||||||
log.warning("Maximum attepts reached while trying "
|
log.warning(
|
||||||
"to add the torrent file with the path"
|
"Maximum attempts reached while trying to add the "
|
||||||
" %s", filepath)
|
"torrent file with the path %s", filepath
|
||||||
|
)
|
||||||
os.rename(filepath, filepath + ".invalid")
|
os.rename(filepath, filepath + ".invalid")
|
||||||
del self.invalid_torrents[filename]
|
del self.invalid_torrents[filename]
|
||||||
else:
|
else:
|
||||||
|
@ -261,16 +262,34 @@ class Core(CorePluginBase):
|
||||||
os.rename(filepath, filepath + watchdir['append_extension'])
|
os.rename(filepath, filepath + watchdir['append_extension'])
|
||||||
elif watchdir.get('copy_torrent_toggle'):
|
elif watchdir.get('copy_torrent_toggle'):
|
||||||
copy_torrent_path = watchdir['copy_torrent']
|
copy_torrent_path = watchdir['copy_torrent']
|
||||||
|
copy_torrent_file = os.path.join(copy_torrent_path, filename)
|
||||||
log.debug("Moving added torrent file \"%s\" to \"%s\"",
|
log.debug("Moving added torrent file \"%s\" to \"%s\"",
|
||||||
os.path.basename(filepath), copy_torrent_path)
|
os.path.basename(filepath), copy_torrent_path)
|
||||||
os.rename(
|
try:
|
||||||
filepath, os.path.join(copy_torrent_path, filename)
|
os.rename(filepath, copy_torrent_file)
|
||||||
)
|
except OSError, why:
|
||||||
|
if why.errno == 18:
|
||||||
|
# This can happen for different mount points
|
||||||
|
from shutil import copyfile
|
||||||
|
try:
|
||||||
|
copyfile(filepath, copy_torrent_file)
|
||||||
|
os.remove(filepath)
|
||||||
|
except OSError:
|
||||||
|
# Last Resort!
|
||||||
|
try:
|
||||||
|
open(copy_torrent_file, 'wb').write(
|
||||||
|
open(filepath, 'rb').read()
|
||||||
|
)
|
||||||
|
os.remove(filepath)
|
||||||
|
except OSError, why:
|
||||||
|
raise why
|
||||||
|
else:
|
||||||
|
raise why
|
||||||
else:
|
else:
|
||||||
os.remove(filepath)
|
os.remove(filepath)
|
||||||
|
|
||||||
def on_update_watchdir_error(self, failure, watchdir_id):
|
def on_update_watchdir_error(self, failure, watchdir_id):
|
||||||
"""Disables any watch folders with unhandled exceptions."""
|
"""Disables any watch folders with un-handled exceptions."""
|
||||||
self.disable_watchdir(watchdir_id)
|
self.disable_watchdir(watchdir_id)
|
||||||
log.error("Disabling '%s', error during update: %s",
|
log.error("Disabling '%s', error during update: %s",
|
||||||
self.watchdirs[watchdir_id]["path"], failure)
|
self.watchdirs[watchdir_id]["path"], failure)
|
||||||
|
|
|
@ -213,7 +213,7 @@
|
||||||
<property name="max_length">65535</property>
|
<property name="max_length">65535</property>
|
||||||
<property name="invisible_char">●</property>
|
<property name="invisible_char">●</property>
|
||||||
<property name="width_chars">5</property>
|
<property name="width_chars">5</property>
|
||||||
<property name="adjustment">25 1 100 1 10 0</property>
|
<property name="adjustment">25 1 65535 0 10 0</property>
|
||||||
<property name="climb_rate">1</property>
|
<property name="climb_rate">1</property>
|
||||||
<property name="snap_to_ticks">True</property>
|
<property name="snap_to_ticks">True</property>
|
||||||
<property name="numeric">True</property>
|
<property name="numeric">True</property>
|
||||||
|
@ -292,6 +292,7 @@
|
||||||
<property name="can_focus">True</property>
|
<property name="can_focus">True</property>
|
||||||
<property name="hscrollbar_policy">automatic</property>
|
<property name="hscrollbar_policy">automatic</property>
|
||||||
<property name="vscrollbar_policy">automatic</property>
|
<property name="vscrollbar_policy">automatic</property>
|
||||||
|
<property name="shadow_type">in</property>
|
||||||
<child>
|
<child>
|
||||||
<widget class="GtkTreeView" id="smtp_recipients">
|
<widget class="GtkTreeView" id="smtp_recipients">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
|
|
|
@ -384,174 +384,217 @@
|
||||||
</packing>
|
</packing>
|
||||||
</child>
|
</child>
|
||||||
<child>
|
<child>
|
||||||
<widget class="GtkToolbar" id="toolbar">
|
<widget class="GtkHBox" id="hbox1">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can_focus">False</property>
|
<property name="can_focus">False</property>
|
||||||
<child>
|
<child>
|
||||||
<widget class="GtkToolButton" id="toolbutton_add">
|
<widget class="GtkToolbar" id="toolbar">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="sensitive">False</property>
|
|
||||||
<property name="can_focus">False</property>
|
<property name="can_focus">False</property>
|
||||||
<property name="tooltip" translatable="yes">Add torrent</property>
|
<child>
|
||||||
<property name="use_action_appearance">False</property>
|
<widget class="GtkToolButton" id="toolbutton_add">
|
||||||
<property name="label" translatable="yes">Add Torrent</property>
|
<property name="visible">True</property>
|
||||||
<property name="use_underline">True</property>
|
<property name="sensitive">False</property>
|
||||||
<property name="stock_id">gtk-add</property>
|
<property name="can_focus">False</property>
|
||||||
<signal name="clicked" handler="on_toolbutton_add_clicked"/>
|
<property name="has_tooltip">True</property>
|
||||||
|
<property name="tooltip" translatable="yes">Add torrent</property>
|
||||||
|
<property name="use_action_appearance">False</property>
|
||||||
|
<property name="label" translatable="yes">Add Torrent</property>
|
||||||
|
<property name="use_underline">True</property>
|
||||||
|
<property name="stock_id">gtk-add</property>
|
||||||
|
<signal name="clicked" handler="on_toolbutton_add_clicked"/>
|
||||||
|
</widget>
|
||||||
|
<packing>
|
||||||
|
<property name="expand">False</property>
|
||||||
|
<property name="homogeneous">True</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<widget class="GtkToolButton" id="toolbutton_remove">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="sensitive">False</property>
|
||||||
|
<property name="can_focus">False</property>
|
||||||
|
<property name="has_tooltip">True</property>
|
||||||
|
<property name="tooltip" translatable="yes">Remove torrent</property>
|
||||||
|
<property name="use_action_appearance">False</property>
|
||||||
|
<property name="label" translatable="yes">Remove Torrent</property>
|
||||||
|
<property name="stock_id">gtk-remove</property>
|
||||||
|
<signal name="clicked" handler="on_toolbutton_remove_clicked"/>
|
||||||
|
</widget>
|
||||||
|
<packing>
|
||||||
|
<property name="expand">False</property>
|
||||||
|
<property name="homogeneous">True</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<widget class="GtkSeparatorToolItem" id="separatortoolitem1">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">False</property>
|
||||||
|
</widget>
|
||||||
|
<packing>
|
||||||
|
<property name="expand">False</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<widget class="GtkToolButton" id="toolbutton_pause">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="sensitive">False</property>
|
||||||
|
<property name="can_focus">False</property>
|
||||||
|
<property name="has_tooltip">True</property>
|
||||||
|
<property name="tooltip" translatable="yes">Pause the selected torrents</property>
|
||||||
|
<property name="use_action_appearance">False</property>
|
||||||
|
<property name="label" translatable="yes">Pause</property>
|
||||||
|
<property name="use_underline">True</property>
|
||||||
|
<property name="stock_id">gtk-media-pause</property>
|
||||||
|
<signal name="clicked" handler="on_toolbutton_pause_clicked"/>
|
||||||
|
</widget>
|
||||||
|
<packing>
|
||||||
|
<property name="expand">False</property>
|
||||||
|
<property name="homogeneous">True</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<widget class="GtkToolButton" id="toolbutton_resume">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="sensitive">False</property>
|
||||||
|
<property name="can_focus">False</property>
|
||||||
|
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
|
||||||
|
<property name="has_tooltip">True</property>
|
||||||
|
<property name="tooltip" translatable="yes">Resume the selected torrents</property>
|
||||||
|
<property name="use_action_appearance">False</property>
|
||||||
|
<property name="label" translatable="yes">Resume</property>
|
||||||
|
<property name="stock_id">gtk-media-play</property>
|
||||||
|
<signal name="clicked" handler="on_toolbutton_resume_clicked"/>
|
||||||
|
</widget>
|
||||||
|
<packing>
|
||||||
|
<property name="expand">False</property>
|
||||||
|
<property name="homogeneous">True</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<widget class="GtkSeparatorToolItem" id="separatortoolitem2">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">False</property>
|
||||||
|
</widget>
|
||||||
|
<packing>
|
||||||
|
<property name="expand">False</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<widget class="GtkToolButton" id="toolbutton_queue_up">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="sensitive">False</property>
|
||||||
|
<property name="can_focus">False</property>
|
||||||
|
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
|
||||||
|
<property name="has_tooltip">True</property>
|
||||||
|
<property name="tooltip" translatable="yes">Queue Torrent Up</property>
|
||||||
|
<property name="use_action_appearance">False</property>
|
||||||
|
<property name="label" translatable="yes">Queue Up</property>
|
||||||
|
<property name="stock_id">gtk-go-up</property>
|
||||||
|
<signal name="clicked" handler="on_toolbutton_queue_up_clicked"/>
|
||||||
|
</widget>
|
||||||
|
<packing>
|
||||||
|
<property name="expand">False</property>
|
||||||
|
<property name="homogeneous">True</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<widget class="GtkToolButton" id="toolbutton_queue_down">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="sensitive">False</property>
|
||||||
|
<property name="can_focus">False</property>
|
||||||
|
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
|
||||||
|
<property name="has_tooltip">True</property>
|
||||||
|
<property name="tooltip" translatable="yes">Queue Torrent Down</property>
|
||||||
|
<property name="use_action_appearance">False</property>
|
||||||
|
<property name="label" translatable="yes">Queue Down</property>
|
||||||
|
<property name="stock_id">gtk-go-down</property>
|
||||||
|
<signal name="clicked" handler="on_toolbutton_queue_down_clicked"/>
|
||||||
|
</widget>
|
||||||
|
<packing>
|
||||||
|
<property name="expand">False</property>
|
||||||
|
<property name="homogeneous">True</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<widget class="GtkSeparatorToolItem" id="toolbutton1">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">False</property>
|
||||||
|
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
|
||||||
|
</widget>
|
||||||
|
<packing>
|
||||||
|
<property name="expand">False</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<widget class="GtkToolButton" id="toolbutton_preferences">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">False</property>
|
||||||
|
<property name="has_tooltip">True</property>
|
||||||
|
<property name="tooltip" translatable="yes">Preferences</property>
|
||||||
|
<property name="use_action_appearance">False</property>
|
||||||
|
<property name="label" translatable="yes">Preferences</property>
|
||||||
|
<property name="use_underline">True</property>
|
||||||
|
<property name="stock_id">gtk-preferences</property>
|
||||||
|
<signal name="clicked" handler="on_toolbutton_preferences_clicked"/>
|
||||||
|
</widget>
|
||||||
|
<packing>
|
||||||
|
<property name="expand">False</property>
|
||||||
|
<property name="homogeneous">True</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<widget class="GtkToolButton" id="toolbutton_connectionmanager">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">False</property>
|
||||||
|
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
|
||||||
|
<property name="has_tooltip">True</property>
|
||||||
|
<property name="tooltip" translatable="yes">Connection Manager</property>
|
||||||
|
<property name="use_action_appearance">False</property>
|
||||||
|
<property name="label" translatable="yes">Connection Manager</property>
|
||||||
|
<property name="stock_id">gtk-network</property>
|
||||||
|
<signal name="clicked" handler="on_toolbutton_connectionmanager_clicked"/>
|
||||||
|
</widget>
|
||||||
|
<packing>
|
||||||
|
<property name="expand">False</property>
|
||||||
|
<property name="homogeneous">True</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
</widget>
|
</widget>
|
||||||
<packing>
|
<packing>
|
||||||
<property name="expand">False</property>
|
<property name="expand">True</property>
|
||||||
<property name="homogeneous">True</property>
|
<property name="fill">True</property>
|
||||||
|
<property name="position">0</property>
|
||||||
</packing>
|
</packing>
|
||||||
</child>
|
</child>
|
||||||
<child>
|
<child>
|
||||||
<widget class="GtkToolButton" id="toolbutton_remove">
|
<widget class="GtkEntry" id="search_torrents_entry">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="sensitive">False</property>
|
<property name="can_focus">True</property>
|
||||||
<property name="can_focus">False</property>
|
<property name="tooltip" translatable="yes">Search torrents by name</property>
|
||||||
<property name="tooltip" translatable="yes">Remove torrent</property>
|
<property name="invisible_char">•</property>
|
||||||
<property name="use_action_appearance">False</property>
|
<property name="truncate_multiline">True</property>
|
||||||
<property name="label" translatable="yes">Remove Torrent</property>
|
<property name="caps_lock_warning">False</property>
|
||||||
<property name="stock_id">gtk-remove</property>
|
<property name="secondary_icon_stock">gtk-clear</property>
|
||||||
<signal name="clicked" handler="on_toolbutton_remove_clicked"/>
|
<property name="primary_icon_activatable">False</property>
|
||||||
|
<property name="secondary_icon_activatable">True</property>
|
||||||
|
<property name="primary_icon_sensitive">False</property>
|
||||||
|
<property name="secondary_icon_sensitive">True</property>
|
||||||
|
<property name="secondary_icon_tooltip_text" translatable="yes">Clear the search</property>
|
||||||
|
<signal name="changed" handler="on_search_torrents_entry_changed"/>
|
||||||
|
<signal name="icon_press" handler="on_search_torrents_entry_icon_press"/>
|
||||||
</widget>
|
</widget>
|
||||||
<packing>
|
<packing>
|
||||||
<property name="expand">False</property>
|
<property name="expand">False</property>
|
||||||
<property name="homogeneous">True</property>
|
<property name="fill">False</property>
|
||||||
</packing>
|
<property name="padding">5</property>
|
||||||
</child>
|
<property name="position">1</property>
|
||||||
<child>
|
|
||||||
<widget class="GtkSeparatorToolItem" id="separatortoolitem1">
|
|
||||||
<property name="visible">True</property>
|
|
||||||
<property name="can_focus">False</property>
|
|
||||||
</widget>
|
|
||||||
<packing>
|
|
||||||
<property name="expand">False</property>
|
|
||||||
</packing>
|
|
||||||
</child>
|
|
||||||
<child>
|
|
||||||
<widget class="GtkToolButton" id="toolbutton_pause">
|
|
||||||
<property name="visible">True</property>
|
|
||||||
<property name="sensitive">False</property>
|
|
||||||
<property name="can_focus">False</property>
|
|
||||||
<property name="tooltip" translatable="yes">Pause the selected torrents</property>
|
|
||||||
<property name="use_action_appearance">False</property>
|
|
||||||
<property name="label" translatable="yes">Pause</property>
|
|
||||||
<property name="use_underline">True</property>
|
|
||||||
<property name="stock_id">gtk-media-pause</property>
|
|
||||||
<signal name="clicked" handler="on_toolbutton_pause_clicked"/>
|
|
||||||
</widget>
|
|
||||||
<packing>
|
|
||||||
<property name="expand">False</property>
|
|
||||||
<property name="homogeneous">True</property>
|
|
||||||
</packing>
|
|
||||||
</child>
|
|
||||||
<child>
|
|
||||||
<widget class="GtkToolButton" id="toolbutton_resume">
|
|
||||||
<property name="visible">True</property>
|
|
||||||
<property name="sensitive">False</property>
|
|
||||||
<property name="can_focus">False</property>
|
|
||||||
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
|
|
||||||
<property name="tooltip" translatable="yes">Resume the selected torrents</property>
|
|
||||||
<property name="use_action_appearance">False</property>
|
|
||||||
<property name="label" translatable="yes">Resume</property>
|
|
||||||
<property name="stock_id">gtk-media-play</property>
|
|
||||||
<signal name="clicked" handler="on_toolbutton_resume_clicked"/>
|
|
||||||
</widget>
|
|
||||||
<packing>
|
|
||||||
<property name="expand">False</property>
|
|
||||||
<property name="homogeneous">True</property>
|
|
||||||
</packing>
|
|
||||||
</child>
|
|
||||||
<child>
|
|
||||||
<widget class="GtkSeparatorToolItem" id="separatortoolitem2">
|
|
||||||
<property name="visible">True</property>
|
|
||||||
<property name="can_focus">False</property>
|
|
||||||
</widget>
|
|
||||||
<packing>
|
|
||||||
<property name="expand">False</property>
|
|
||||||
</packing>
|
|
||||||
</child>
|
|
||||||
<child>
|
|
||||||
<widget class="GtkToolButton" id="toolbutton_queue_up">
|
|
||||||
<property name="visible">True</property>
|
|
||||||
<property name="sensitive">False</property>
|
|
||||||
<property name="can_focus">False</property>
|
|
||||||
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
|
|
||||||
<property name="tooltip" translatable="yes">Queue Torrent Up</property>
|
|
||||||
<property name="use_action_appearance">False</property>
|
|
||||||
<property name="label" translatable="yes">Queue Up</property>
|
|
||||||
<property name="stock_id">gtk-go-up</property>
|
|
||||||
<signal name="clicked" handler="on_toolbutton_queue_up_clicked"/>
|
|
||||||
</widget>
|
|
||||||
<packing>
|
|
||||||
<property name="expand">False</property>
|
|
||||||
<property name="homogeneous">True</property>
|
|
||||||
</packing>
|
|
||||||
</child>
|
|
||||||
<child>
|
|
||||||
<widget class="GtkToolButton" id="toolbutton_queue_down">
|
|
||||||
<property name="visible">True</property>
|
|
||||||
<property name="sensitive">False</property>
|
|
||||||
<property name="can_focus">False</property>
|
|
||||||
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
|
|
||||||
<property name="tooltip" translatable="yes">Queue Torrent Down</property>
|
|
||||||
<property name="use_action_appearance">False</property>
|
|
||||||
<property name="label" translatable="yes">Queue Down</property>
|
|
||||||
<property name="stock_id">gtk-go-down</property>
|
|
||||||
<signal name="clicked" handler="on_toolbutton_queue_down_clicked"/>
|
|
||||||
</widget>
|
|
||||||
<packing>
|
|
||||||
<property name="expand">False</property>
|
|
||||||
<property name="homogeneous">True</property>
|
|
||||||
</packing>
|
|
||||||
</child>
|
|
||||||
<child>
|
|
||||||
<widget class="GtkSeparatorToolItem" id="toolbutton1">
|
|
||||||
<property name="visible">True</property>
|
|
||||||
<property name="can_focus">False</property>
|
|
||||||
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
|
|
||||||
</widget>
|
|
||||||
<packing>
|
|
||||||
<property name="expand">False</property>
|
|
||||||
</packing>
|
|
||||||
</child>
|
|
||||||
<child>
|
|
||||||
<widget class="GtkToolButton" id="toolbutton_preferences">
|
|
||||||
<property name="visible">True</property>
|
|
||||||
<property name="can_focus">False</property>
|
|
||||||
<property name="tooltip" translatable="yes">Preferences</property>
|
|
||||||
<property name="use_action_appearance">False</property>
|
|
||||||
<property name="label" translatable="yes">Preferences</property>
|
|
||||||
<property name="use_underline">True</property>
|
|
||||||
<property name="stock_id">gtk-preferences</property>
|
|
||||||
<signal name="clicked" handler="on_toolbutton_preferences_clicked"/>
|
|
||||||
</widget>
|
|
||||||
<packing>
|
|
||||||
<property name="expand">False</property>
|
|
||||||
<property name="homogeneous">True</property>
|
|
||||||
</packing>
|
|
||||||
</child>
|
|
||||||
<child>
|
|
||||||
<widget class="GtkToolButton" id="toolbutton_connectionmanager">
|
|
||||||
<property name="visible">True</property>
|
|
||||||
<property name="can_focus">False</property>
|
|
||||||
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
|
|
||||||
<property name="tooltip" translatable="yes">Connection Manager</property>
|
|
||||||
<property name="use_action_appearance">False</property>
|
|
||||||
<property name="label" translatable="yes">Connection Manager</property>
|
|
||||||
<property name="stock_id">gtk-network</property>
|
|
||||||
<signal name="clicked" handler="on_toolbutton_connectionmanager_clicked"/>
|
|
||||||
</widget>
|
|
||||||
<packing>
|
|
||||||
<property name="expand">False</property>
|
|
||||||
<property name="homogeneous">True</property>
|
|
||||||
</packing>
|
</packing>
|
||||||
</child>
|
</child>
|
||||||
</widget>
|
</widget>
|
||||||
<packing>
|
<packing>
|
||||||
<property name="expand">False</property>
|
<property name="expand">False</property>
|
||||||
<property name="fill">True</property>
|
<property name="fill">False</property>
|
||||||
<property name="position">1</property>
|
<property name="position">1</property>
|
||||||
</packing>
|
</packing>
|
||||||
</child>
|
</child>
|
||||||
|
@ -787,152 +830,6 @@
|
||||||
</widget>
|
</widget>
|
||||||
</child>
|
</child>
|
||||||
</widget>
|
</widget>
|
||||||
<widget class="GtkMenu" id="menu_file_tab">
|
|
||||||
<property name="visible">True</property>
|
|
||||||
<property name="can_focus">False</property>
|
|
||||||
<child>
|
|
||||||
<widget class="GtkImageMenuItem" id="menuitem_open_file">
|
|
||||||
<property name="label">gtk-open</property>
|
|
||||||
<property name="visible">True</property>
|
|
||||||
<property name="can_focus">False</property>
|
|
||||||
<property name="use_action_appearance">False</property>
|
|
||||||
<property name="use_underline">True</property>
|
|
||||||
<property name="use_stock">True</property>
|
|
||||||
<signal name="activate" handler="on_menuitem_open_file_activate"/>
|
|
||||||
</widget>
|
|
||||||
</child>
|
|
||||||
<child>
|
|
||||||
<widget class="GtkSeparatorMenuItem" id="menuitem3">
|
|
||||||
<property name="visible">True</property>
|
|
||||||
<property name="can_focus">False</property>
|
|
||||||
</widget>
|
|
||||||
</child>
|
|
||||||
<child>
|
|
||||||
<widget class="GtkImageMenuItem" id="menuitem_expand_all">
|
|
||||||
<property name="label" translatable="yes">_Expand All</property>
|
|
||||||
<property name="visible">True</property>
|
|
||||||
<property name="can_focus">False</property>
|
|
||||||
<property name="use_action_appearance">False</property>
|
|
||||||
<property name="use_underline">True</property>
|
|
||||||
<property name="use_stock">False</property>
|
|
||||||
<signal name="activate" handler="on_menuitem_expand_all_activate"/>
|
|
||||||
<child internal-child="image">
|
|
||||||
<widget class="GtkImage" id="image1">
|
|
||||||
<property name="visible">True</property>
|
|
||||||
<property name="can_focus">False</property>
|
|
||||||
<property name="stock">gtk-zoom-fit</property>
|
|
||||||
<property name="icon-size">1</property>
|
|
||||||
</widget>
|
|
||||||
</child>
|
|
||||||
</widget>
|
|
||||||
</child>
|
|
||||||
<child>
|
|
||||||
<widget class="GtkSeparatorMenuItem" id="menuitem_priority_sep">
|
|
||||||
<property name="visible">True</property>
|
|
||||||
<property name="can_focus">False</property>
|
|
||||||
</widget>
|
|
||||||
</child>
|
|
||||||
<child>
|
|
||||||
<widget class="GtkImageMenuItem" id="menuitem_donotdownload">
|
|
||||||
<property name="label" translatable="yes">_Do Not Download</property>
|
|
||||||
<property name="visible">True</property>
|
|
||||||
<property name="can_focus">False</property>
|
|
||||||
<property name="use_action_appearance">False</property>
|
|
||||||
<property name="use_underline">True</property>
|
|
||||||
<property name="use_stock">False</property>
|
|
||||||
<signal name="activate" handler="on_menuitem_donotdownload_activate"/>
|
|
||||||
<child internal-child="image">
|
|
||||||
<widget class="GtkImage" id="image2">
|
|
||||||
<property name="visible">True</property>
|
|
||||||
<property name="can_focus">False</property>
|
|
||||||
<property name="stock">gtk-no</property>
|
|
||||||
<property name="icon-size">1</property>
|
|
||||||
</widget>
|
|
||||||
</child>
|
|
||||||
</widget>
|
|
||||||
</child>
|
|
||||||
<child>
|
|
||||||
<widget class="GtkImageMenuItem" id="menuitem_normal">
|
|
||||||
<property name="label" translatable="yes">_Normal Priority</property>
|
|
||||||
<property name="visible">True</property>
|
|
||||||
<property name="can_focus">False</property>
|
|
||||||
<property name="use_action_appearance">False</property>
|
|
||||||
<property name="use_underline">True</property>
|
|
||||||
<property name="use_stock">False</property>
|
|
||||||
<signal name="activate" handler="on_menuitem_normal_activate"/>
|
|
||||||
<child internal-child="image">
|
|
||||||
<widget class="GtkImage" id="image3">
|
|
||||||
<property name="visible">True</property>
|
|
||||||
<property name="can_focus">False</property>
|
|
||||||
<property name="stock">gtk-yes</property>
|
|
||||||
<property name="icon-size">1</property>
|
|
||||||
</widget>
|
|
||||||
</child>
|
|
||||||
</widget>
|
|
||||||
</child>
|
|
||||||
<child>
|
|
||||||
<widget class="GtkImageMenuItem" id="menuitem_high">
|
|
||||||
<property name="label" translatable="yes">_High Priority</property>
|
|
||||||
<property name="visible">True</property>
|
|
||||||
<property name="can_focus">False</property>
|
|
||||||
<property name="use_action_appearance">False</property>
|
|
||||||
<property name="use_underline">True</property>
|
|
||||||
<property name="use_stock">False</property>
|
|
||||||
<signal name="activate" handler="on_menuitem_high_activate"/>
|
|
||||||
<child internal-child="image">
|
|
||||||
<widget class="GtkImage" id="image4">
|
|
||||||
<property name="visible">True</property>
|
|
||||||
<property name="can_focus">False</property>
|
|
||||||
<property name="stock">gtk-go-up</property>
|
|
||||||
<property name="icon-size">1</property>
|
|
||||||
</widget>
|
|
||||||
</child>
|
|
||||||
</widget>
|
|
||||||
</child>
|
|
||||||
<child>
|
|
||||||
<widget class="GtkImageMenuItem" id="menuitem_highest">
|
|
||||||
<property name="label" translatable="yes">Hi_ghest Priority</property>
|
|
||||||
<property name="visible">True</property>
|
|
||||||
<property name="can_focus">False</property>
|
|
||||||
<property name="use_action_appearance">False</property>
|
|
||||||
<property name="use_underline">True</property>
|
|
||||||
<property name="use_stock">False</property>
|
|
||||||
<signal name="activate" handler="on_menuitem_highest_activate"/>
|
|
||||||
<child internal-child="image">
|
|
||||||
<widget class="GtkImage" id="image5">
|
|
||||||
<property name="visible">True</property>
|
|
||||||
<property name="can_focus">False</property>
|
|
||||||
<property name="stock">gtk-goto-top</property>
|
|
||||||
<property name="icon-size">1</property>
|
|
||||||
</widget>
|
|
||||||
</child>
|
|
||||||
</widget>
|
|
||||||
</child>
|
|
||||||
</widget>
|
|
||||||
<widget class="GtkMenu" id="menu_peer_tab">
|
|
||||||
<property name="visible">True</property>
|
|
||||||
<property name="can_focus">False</property>
|
|
||||||
<child>
|
|
||||||
<widget class="GtkImageMenuItem" id="menuitem4">
|
|
||||||
<property name="label" translatable="yes">_Add Peer</property>
|
|
||||||
<property name="visible">True</property>
|
|
||||||
<property name="can_focus">False</property>
|
|
||||||
<property name="tooltip" translatable="yes">Add a peer by its IP</property>
|
|
||||||
<property name="use_action_appearance">False</property>
|
|
||||||
<property name="use_underline">True</property>
|
|
||||||
<property name="use_stock">False</property>
|
|
||||||
<signal name="activate" handler="on_menuitem_add_peer_activate"/>
|
|
||||||
<child internal-child="image">
|
|
||||||
<widget class="GtkImage" id="image1">
|
|
||||||
<property name="visible">True</property>
|
|
||||||
<property name="can_focus">False</property>
|
|
||||||
<property name="stock">gtk-add</property>
|
|
||||||
<property name="icon-size">1</property>
|
|
||||||
</widget>
|
|
||||||
</child>
|
|
||||||
</widget>
|
|
||||||
</child>
|
|
||||||
</widget>
|
|
||||||
<widget class="GtkDialog" id="move_storage_dialog">
|
<widget class="GtkDialog" id="move_storage_dialog">
|
||||||
<property name="can_focus">False</property>
|
<property name="can_focus">False</property>
|
||||||
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
|
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
|
||||||
|
@ -2877,6 +2774,7 @@
|
||||||
<property name="receives_default">False</property>
|
<property name="receives_default">False</property>
|
||||||
<property name="use_action_appearance">False</property>
|
<property name="use_action_appearance">False</property>
|
||||||
<property name="draw_indicator">True</property>
|
<property name="draw_indicator">True</property>
|
||||||
|
<signal name="toggled" handler="on_chk_toggled"/>
|
||||||
</widget>
|
</widget>
|
||||||
<packing>
|
<packing>
|
||||||
<property name="expand">False</property>
|
<property name="expand">False</property>
|
||||||
|
@ -2949,6 +2847,7 @@
|
||||||
<property name="receives_default">False</property>
|
<property name="receives_default">False</property>
|
||||||
<property name="use_action_appearance">False</property>
|
<property name="use_action_appearance">False</property>
|
||||||
<property name="draw_indicator">True</property>
|
<property name="draw_indicator">True</property>
|
||||||
|
<signal name="toggled" handler="on_chk_toggled"/>
|
||||||
</widget>
|
</widget>
|
||||||
</child>
|
</child>
|
||||||
</widget>
|
</widget>
|
||||||
|
|
|
@ -46,6 +46,8 @@ import logging
|
||||||
import warnings
|
import warnings
|
||||||
from urlparse import urlparse
|
from urlparse import urlparse
|
||||||
|
|
||||||
|
from twisted.internet import reactor
|
||||||
|
|
||||||
import deluge.common
|
import deluge.common
|
||||||
import deluge.component as component
|
import deluge.component as component
|
||||||
from deluge.ui.client import client
|
from deluge.ui.client import client
|
||||||
|
@ -270,6 +272,7 @@ class TorrentView(listview.ListView, component.Component):
|
||||||
|
|
||||||
# Set filter to None for now
|
# Set filter to None for now
|
||||||
self.filter = None
|
self.filter = None
|
||||||
|
self.search_pending = None
|
||||||
|
|
||||||
### Connect Signals ###
|
### Connect Signals ###
|
||||||
# Connect to the 'button-press-event' to know when to bring up the
|
# Connect to the 'button-press-event' to know when to bring up the
|
||||||
|
@ -287,6 +290,15 @@ class TorrentView(listview.ListView, component.Component):
|
||||||
self.treeview.connect("key-press-event", self.on_key_press_event)
|
self.treeview.connect("key-press-event", self.on_key_press_event)
|
||||||
self.treeview.connect("columns-changed", self.on_columns_changed_event)
|
self.treeview.connect("columns-changed", self.on_columns_changed_event)
|
||||||
|
|
||||||
|
self.search_torrents_entry = self.window.main_glade.get_widget("search_torrents_entry")
|
||||||
|
self.search_torrents_entry.connect(
|
||||||
|
"icon-press", self.on_search_torrents_entry_icon_press
|
||||||
|
)
|
||||||
|
self.search_torrents_entry.connect(
|
||||||
|
"changed", self.on_search_torrents_entry_changed
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
client.register_event_handler("TorrentStateChangedEvent", self.on_torrentstatechanged_event)
|
client.register_event_handler("TorrentStateChangedEvent", self.on_torrentstatechanged_event)
|
||||||
client.register_event_handler("TorrentAddedEvent", self.on_torrentadded_event)
|
client.register_event_handler("TorrentAddedEvent", self.on_torrentadded_event)
|
||||||
client.register_event_handler("TorrentRemovedEvent", self.on_torrentremoved_event)
|
client.register_event_handler("TorrentRemovedEvent", self.on_torrentremoved_event)
|
||||||
|
@ -319,6 +331,8 @@ class TorrentView(listview.ListView, component.Component):
|
||||||
# We need to clear the liststore
|
# We need to clear the liststore
|
||||||
self.liststore.clear()
|
self.liststore.clear()
|
||||||
self.prev_status = {}
|
self.prev_status = {}
|
||||||
|
self.filter = None
|
||||||
|
self.search_torrents_entry.set_text("")
|
||||||
|
|
||||||
def shutdown(self):
|
def shutdown(self):
|
||||||
"""Called when GtkUi is exiting"""
|
"""Called when GtkUi is exiting"""
|
||||||
|
@ -335,7 +349,10 @@ class TorrentView(listview.ListView, component.Component):
|
||||||
"""Sets filters for the torrentview..
|
"""Sets filters for the torrentview..
|
||||||
see: core.get_torrents_status
|
see: core.get_torrents_status
|
||||||
"""
|
"""
|
||||||
|
search_filter = self.filter and self.filter.get('name', None) or None
|
||||||
self.filter = dict(filter_dict) #copied version of filter_dict.
|
self.filter = dict(filter_dict) #copied version of filter_dict.
|
||||||
|
if search_filter and 'name' not in filter_dict:
|
||||||
|
self.filter['name'] = search_filter
|
||||||
self.update()
|
self.update()
|
||||||
|
|
||||||
def set_columns_to_update(self, columns=None):
|
def set_columns_to_update(self, columns=None):
|
||||||
|
@ -379,6 +396,9 @@ class TorrentView(listview.ListView, component.Component):
|
||||||
|
|
||||||
def update(self):
|
def update(self):
|
||||||
if self.got_state:
|
if self.got_state:
|
||||||
|
if self.search_pending is not None and self.search_pending.active():
|
||||||
|
# An update request is scheduled, let's wait for that one
|
||||||
|
return
|
||||||
# Send a status request
|
# Send a status request
|
||||||
gobject.idle_add(self.send_status_request)
|
gobject.idle_add(self.send_status_request)
|
||||||
|
|
||||||
|
@ -600,3 +620,33 @@ class TorrentView(listview.ListView, component.Component):
|
||||||
torrentmenu = component.get("MenuBar").torrentmenu
|
torrentmenu = component.get("MenuBar").torrentmenu
|
||||||
torrentmenu.popup(None, None, None, 3, event.time)
|
torrentmenu.popup(None, None, None, 3, event.time)
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
def on_search_torrents_entry_icon_press(self, entry, icon, event):
|
||||||
|
if icon != gtk.ENTRY_ICON_SECONDARY:
|
||||||
|
return
|
||||||
|
|
||||||
|
if self.search_pending and self.search_pending.active():
|
||||||
|
self.search_pending.cancel()
|
||||||
|
|
||||||
|
entry.set_text("")
|
||||||
|
if self.filter and 'name' in self.filter:
|
||||||
|
self.filter.pop('name', None)
|
||||||
|
self.search_pending = reactor.callLater(0.7, self.update)
|
||||||
|
|
||||||
|
def on_search_torrents_entry_changed(self, widget):
|
||||||
|
search_string = widget.get_text().lower()
|
||||||
|
|
||||||
|
if self.search_pending and self.search_pending.active():
|
||||||
|
self.search_pending.cancel()
|
||||||
|
|
||||||
|
if not search_string:
|
||||||
|
if self.filter and 'name' in self.filter:
|
||||||
|
self.filter.pop('name', None)
|
||||||
|
self.search_pending = reactor.callLater(0.7, self.update)
|
||||||
|
return
|
||||||
|
|
||||||
|
if self.filter is None:
|
||||||
|
self.filter = {}
|
||||||
|
|
||||||
|
self.filter['name'] = search_string
|
||||||
|
self.search_pending = reactor.callLater(0.7, self.update)
|
||||||
|
|
Loading…
Reference in New Issue