Skip to content

Commit f694c6b

Browse files
committed
feat(main, colors_list): when doing slow operations set insensitive and show spinner
1 parent 52196f2 commit f694c6b

File tree

2 files changed

+55
-8
lines changed

2 files changed

+55
-8
lines changed

oomox_gui/colors_list.py

Lines changed: 36 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
# -*- coding: utf-8 -*-
2-
from gi.repository import Gtk
2+
from gi.repository import Gtk, GLib, Gdk
33

44
from .theme_model import THEME_MODEL, THEME_MODEL_BY_KEY
55
from .palette_cache import PaletteCache
@@ -434,23 +434,45 @@ def build_theme_model_rows(self):
434434
display_name = theme_value.get('display_name', key)
435435
row = None
436436

437-
callback = None
437+
callbacks = [self.color_edited, ]
438438
if theme_value.get('reload_theme'):
439439
def _callback(key, value):
440440
THEME_MODEL_BY_KEY[key]['fallback_value'] = value
441441
self.theme = self.theme_reload_callback()
442-
callback = _callback
442+
callbacks = [_callback, ]
443443
elif key in [
444444
'ICONS_STYLE', 'THEME_STYLE',
445445
'TERMINAL_BASE_TEMPLATE', 'TERMINAL_THEME_MODE',
446446
'TERMINAL_THEME_AUTO_BGFG', 'TERMINAL_FG', 'TERMINAL_BG',
447447
]:
448-
def _callback(key, value):
449-
self.color_edited(key, value)
448+
def _callback(key, value): # pylint:disable=unused-argument
450449
self.open_theme(self.theme)
451-
callback = _callback
452-
else:
453-
callback = self.color_edited
450+
callbacks += [_callback, ]
451+
452+
if key in [
453+
'TERMINAL_THEME_MODE', 'TERMINAL_THEME_ACCURACY',
454+
'TERMINAL_THEME_EXTEND_PALETTE', 'TERMINAL_BASE_TEMPLATE',
455+
'_PIL_PALETTE_QUALITY', '_PIL_PALETTE_STYLE',
456+
]:
457+
def _wrap_slow_callbacks(slow_callbacks):
458+
def _new_cb(key, value):
459+
GLib.timeout_add(0, self.disable, priority=GLib.PRIORITY_HIGH)
460+
for slow_cb in slow_callbacks:
461+
# GLib.idle_add(slow_cb, key, value, priority=GLib.PRIORITY_LOW)
462+
Gdk.threads_add_idle(GLib.PRIORITY_LOW, slow_cb, key, value, )
463+
GLib.idle_add(self.enable, priority=GLib.PRIORITY_LOW)
464+
return _new_cb
465+
466+
callbacks = [_wrap_slow_callbacks(callbacks), ]
467+
468+
def create_callback(_callbacks):
469+
def _callback(key, value):
470+
for each in _callbacks:
471+
each(key, value)
472+
473+
return _callback
474+
475+
callback = create_callback(callbacks)
454476

455477
if theme_value['type'] == 'color':
456478
row = ColorListBoxRow(
@@ -517,6 +539,12 @@ def open_theme(self, theme):
517539
row.set_value(self.theme[key])
518540
row.show()
519541

542+
def disable(self):
543+
self.transient_for.disable()
544+
545+
def enable(self):
546+
self.transient_for.enable()
547+
520548
def __init__(self, color_edited_callback, theme_reload_callback, transient_for):
521549
self.transient_for = transient_for
522550
super().__init__()

oomox_gui/main.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,9 @@ class OomoxApplicationWindow(WindowWithActions): # pylint: disable=too-many-ins
149149
theme_edit = None
150150
presets_list = None
151151
preview = None
152+
spinner = None
153+
154+
_currently_focused_widget = None
152155

153156
def save_theme(self, name=None):
154157
if not name:
@@ -357,6 +360,19 @@ def reload_presets(self):
357360
self.presets_list.load_presets()
358361
self.presets_list.focus_preset_by_filepath(self.colorscheme_path)
359362

363+
def disable(self):
364+
self._currently_focused_widget = self.get_focus()
365+
self.spinner.start()
366+
self.presets_list.set_sensitive(False)
367+
self.theme_edit.set_sensitive(False)
368+
Gtk.main_iteration_do(False)
369+
370+
def enable(self):
371+
self.presets_list.set_sensitive(True)
372+
self.theme_edit.set_sensitive(True)
373+
self.set_focus(self._currently_focused_widget)
374+
self.spinner.stop()
375+
360376
###########################################################################
361377
# Signal handlers:
362378
###########################################################################
@@ -518,6 +534,9 @@ def _init_headerbar(self):
518534
self.attach_action(export_button, WindowActions.export_theme)
519535
self.headerbar.pack_end(export_button)
520536

537+
self.spinner = Gtk.Spinner()
538+
self.headerbar.pack_end(self.spinner)
539+
521540
self.set_titlebar(self.headerbar)
522541

523542
def _init_window(self):

0 commit comments

Comments
 (0)