Update runners sidebar whenever games are added/removed/modified

This commit is contained in:
Xodetaetl 2015-08-03 22:01:44 +02:00
parent 5eb6924dc6
commit 59ff8f2504
3 changed files with 33 additions and 9 deletions

View file

@ -140,12 +140,13 @@ class LutrisWindow(object):
# Timer
self.timer_id = GLib.timeout_add(2000, self.refresh_status)
# Sidebar
sidebar_paned = self.builder.get_object('sidebar_paned')
sidebar_paned.set_position(150)
sidebar_treeview = SidebarTreeView()
sidebar_treeview.connect('cursor-changed', self.on_sidebar_changed)
self.sidebar_treeview = SidebarTreeView()
self.sidebar_treeview.connect('cursor-changed', self.on_sidebar_changed)
self.sidebar_viewport = self.builder.get_object('sidebar_viewport')
self.sidebar_viewport.add(sidebar_treeview)
self.sidebar_viewport.add(self.sidebar_treeview)
# Window initialization
self.window = self.builder.get_object("window")
@ -247,6 +248,7 @@ class LutrisWindow(object):
def set_library_synced(result, error):
self.set_status("Library synced")
self.switch_splash_screen()
self.sidebar_treeview.update()
self.set_status("Syncing library")
sync = Sync()
async_call(
@ -436,6 +438,7 @@ class LutrisWindow(object):
def on_game_installed(self, view, slug):
view.set_installed(Game(slug))
self.sidebar_treeview.update()
def on_image_downloaded(self, game_slug):
is_installed = Game(game_slug).is_installed
@ -447,6 +450,7 @@ class LutrisWindow(object):
add_game_dialog.run()
if add_game_dialog.saved:
self.view.set_installed(game)
self.sidebar_treeview.update()
def on_view_game_log_activate(self, widget):
if not self.running_game:
@ -471,6 +475,7 @@ class LutrisWindow(object):
def do_add_game():
self.view.add_game(game)
self.switch_splash_screen()
self.sidebar_treeview.update()
GLib.idle_add(do_add_game)
def on_remove_game(self, _widget, _data=None):
@ -482,11 +487,13 @@ class LutrisWindow(object):
def do_remove_game():
self.view.remove_game(game_slug)
self.switch_splash_screen()
self.sidebar_treeview.update()
if from_library:
GLib.idle_add(do_remove_game)
else:
self.view.update_image(game_slug, is_installed=False)
self.sidebar_treeview.update()
def on_browse_files(self, widget):
game = Game(self.view.selected_game)

View file

@ -1,4 +1,6 @@
from gi.repository import Gtk, GdkPixbuf
import lutris.runners
from lutris import pga
from lutris.gui.widgets import get_runner_icon
@ -9,9 +11,12 @@ ICON = 1
class SidebarTreeView(Gtk.TreeView):
def __init__(self):
self.model = Gtk.TreeStore(str, GdkPixbuf.Pixbuf)
super(SidebarTreeView, self).__init__()
super(SidebarTreeView, self).__init__(model=self.model)
self.model = Gtk.TreeStore(str, GdkPixbuf.Pixbuf)
self.model_filter = self.model.filter_new()
self.model_filter.set_visible_func(self.filter_rule)
self.set_model(self.model_filter)
column = Gtk.TreeViewColumn("Runners")
column.set_sizing(Gtk.TreeViewColumnSizing.FIXED)
@ -31,13 +36,15 @@ class SidebarTreeView(Gtk.TreeView):
self.set_headers_visible(False)
self.set_fixed_height_mode(True)
self.get_runners()
self.used_runners = pga.get_used_runners()
self.load_all_runners()
self.update()
self.expand_all()
def get_runners(self):
def load_all_runners(self):
"""Append runners to the model."""
runner_node = self.model.append(None, ["Runners", None])
runners = pga.get_runners()
runners = lutris.runners.__all__
for runner in runners:
icon = get_runner_icon(runner, format='pixbuf', size=(16, 16))
self.model.append(runner_node, [runner, icon])
@ -51,3 +58,12 @@ class SidebarTreeView(Gtk.TreeView):
runner_name = model.get_value(iter, LABEL)
if runner_name != 'Runners':
return runner_name
def filter_rule(self, model, iter, data):
if model[iter][0] == 'Runners':
return True
return model[iter][0] in self.used_runners
def update(self):
self.used_runners = pga.get_used_runners()
self.model_filter.refilter()

View file

@ -242,7 +242,8 @@ def check_for_file(game, file_id):
return False
def get_runners():
def get_used_runners():
"""Return a list of the runners in use by installed games."""
with sql.db_cursor(PGA_DB) as cursor:
query = ("select distinct runner from games "
"where runner is not null order by runner")