Fix #1000 : GTKUI: Select first row in list if no rows are selected

Also do not remove selection when changing filter (as 1.3 works)
This commit is contained in:
bendikro 2013-10-04 11:44:17 +02:00 committed by Calum Lind
parent 2b64d78163
commit 80e56eb190
1 changed files with 29 additions and 10 deletions

View File

@ -41,12 +41,10 @@ pygtk.require('2.0')
import gtk import gtk
import gobject import gobject
import logging import logging
import warnings
from twisted.internet import reactor from twisted.internet import reactor
import listview import listview
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
from removetorrentdialog import RemoveTorrentDialog from removetorrentdialog import RemoveTorrentDialog
@ -365,6 +363,7 @@ class TorrentView(listview.ListView, component.Component):
self.status = state self.status = state
self.set_columns_to_update() self.set_columns_to_update()
self.update_view(load_new_list=True) self.update_view(load_new_list=True)
self.select_first_row()
def stop(self): def stop(self):
"""Stops the torrentview""" """Stops the torrentview"""
@ -397,12 +396,11 @@ class TorrentView(listview.ListView, component.Component):
see: core.get_torrents_status see: core.get_torrents_status
""" """
self.treeview.get_selection().unselect_all()
search_filter = self.filter and self.filter.get('name', None) or None 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: if search_filter and 'name' not in filter_dict:
self.filter['name'] = search_filter self.filter['name'] = search_filter
self.update() self.update(select_row=True)
def set_columns_to_update(self, columns=None): def set_columns_to_update(self, columns=None):
status_keys = [] status_keys = []
@ -428,7 +426,7 @@ class TorrentView(listview.ListView, component.Component):
status_keys = list(set(status_keys + self.permanent_status_keys)) status_keys = list(set(status_keys + self.permanent_status_keys))
return status_keys return status_keys
def send_status_request(self, columns=None): def send_status_request(self, columns=None, select_row=False):
# Store the 'status_fields' we need to send to core # Store the 'status_fields' we need to send to core
status_keys = self.set_columns_to_update(columns) status_keys = self.set_columns_to_update(columns)
@ -441,16 +439,36 @@ class TorrentView(listview.ListView, component.Component):
# Request the statuses for all these torrent_ids, this is async so we # Request the statuses for all these torrent_ids, this is async so we
# will deal with the return in a signal callback. # will deal with the return in a signal callback.
component.get("SessionProxy").get_torrents_status( d = component.get("SessionProxy").get_torrents_status(
self.filter, status_keys).addCallback(self._on_get_torrents_status) self.filter, status_keys).addCallback(self._on_get_torrents_status)
if select_row:
d.addCallback(self.select_first_row)
def update(self): def select_first_row(self, ignored=None):
"""
Set the first row in the list selected if a selection does
not already exist
"""
rows = self.treeview.get_selection().get_selected_rows()[1]
# Only select row if noe rows are selected
if not rows:
self.treeview.get_selection().select_path((0,))
def update(self, select_row=False):
"""
Sends a status request to core and updates the torrent list with the result.
:param select_row: if the first row in the list should be selected if
no rows are already selected.
:type select_row: boolean
"""
if self.got_state: if self.got_state:
if self.search_box.search_pending is not None and self.search_box.search_pending.active(): if self.search_box.search_pending is not None and self.search_box.search_pending.active():
# An update request is scheduled, let's wait for that one # An update request is scheduled, let's wait for that one
return return
# Send a status request # Send a status request
gobject.idle_add(self.send_status_request) gobject.idle_add(self.send_status_request, None, select_row)
def update_view(self, load_new_list=False): def update_view(self, load_new_list=False):
"""Update the torrent view model with data we've received.""" """Update the torrent view model with data we've received."""
@ -514,17 +532,18 @@ class TorrentView(listview.ListView, component.Component):
component.get("MenuBar").update_menu() component.get("MenuBar").update_menu()
self.prev_status = status self.prev_status = status
def _on_get_torrents_status(self, status): def _on_get_torrents_status(self, status, select_row=False):
"""Callback function for get_torrents_status(). 'status' should be a """Callback function for get_torrents_status(). 'status' should be a
dictionary of {torrent_id: {key, value}}.""" dictionary of {torrent_id: {key, value}}."""
self.status = status self.status = status
if self.search_box.prefiltered is not None: if self.search_box.prefiltered is not None:
self.search_box.prefiltered = None self.search_box.prefiltered = None
if self.status == self.prev_status and self.prev_status: if self.status == self.prev_status and self.prev_status:
# We do not bother updating since the status hasn't changed # We do not bother updating since the status hasn't changed
self.prev_status = self.status self.prev_status = self.status
return return
gobject.idle_add(self.update_view) self.update_view()
def add_rows(self, torrent_ids): def add_rows(self, torrent_ids):
"""Accepts a list of torrent_ids to add to self.liststore""" """Accepts a list of torrent_ids to add to self.liststore"""