6
6
import shutil
7
7
import traceback
8
8
9
-
from gi.repository import Gtk, Gio
9
+
from gi.repository import Gtk, Gio, GLib, Gdk
10
10
11
11
from .i18n import _
12
12
from .config import USER_COLORS_DIR, SCRIPT_DIR
@@ -129,7 +129,7 @@ def add_simple_action(self, action_name, callback):
129
129
return action
130
130
131
131
132
-
class OomoxApplicationWindow(WindowWithActions): # pylint: disable=too-many-instance-attributes
132
+
class OomoxApplicationWindow(WindowWithActions): # pylint: disable=too-many-instance-attributes,too-many-public-methods
133
133
134
134
colorscheme_name = None
135
135
colorscheme_path = None
@@ -152,6 +152,8 @@ class OomoxApplicationWindow(WindowWithActions): # pylint: disable=too-many-ins
152
152
preset_list = None
153
153
preview = None
154
154
spinner = None
155
+
spinner_message = None
156
+
spinner_revealer = None
155
157
156
158
_currently_focused_widget = None
157
159
_inhibit_id = None
@@ -345,7 +347,9 @@ def load_colorscheme(self, colorscheme):
345
347
self.colorscheme = colorscheme
346
348
self._select_theme_plugin()
347
349
self._select_icons_plugin()
348
-
self.generate_terminal_colors()
350
+
self.generate_terminal_colors(callback=self._load_colorscheme_callback)
351
+
352
+
def _load_colorscheme_callback(self):
349
353
try:
350
354
self.preview.update_preview(
351
355
colorscheme=self.colorscheme,
@@ -371,12 +375,18 @@ def load_colorscheme(self, colorscheme):
371
375
error_dialog.run()
372
376
error_dialog.destroy()
373
377
378
+
@staticmethod
379
+
def schedule_task(task, *args):
380
+
Gdk.threads_add_idle(GLib.PRIORITY_LOW, task, *args)
381
+
374
382
def on_preset_selected(self, selected_preset, selected_preset_path):
375
383
self.ask_unsaved_changes()
376
384
self.colorscheme_name = selected_preset
377
385
self.colorscheme_path = selected_preset_path
378
-
self.load_colorscheme(read_colorscheme_from_path(selected_preset_path))
386
+
read_colorscheme_from_path(selected_preset_path, callback=self._on_preset_selected_callback)
379
387
388
+
def _on_preset_selected_callback(self, colorscheme):
389
+
self.load_colorscheme(colorscheme)
380
390
self.colorscheme_is_user = is_user_colorscheme(self.colorscheme_path)
381
391
self.theme_edit.open_theme(self.colorscheme)
382
392
self._unset_save_needed()
@@ -389,8 +399,15 @@ def theme_reload(self):
389
399
)
390
400
return self.colorscheme
391
401
392
-
def generate_terminal_colors(self):
393
-
self.colorscheme.update(generate_terminal_colors_for_oomox(self.colorscheme))
402
+
def generate_terminal_colors(self, callback):
403
+
def _generate_terminal_colors(colors):
404
+
self.colorscheme.update(colors)
405
+
callback()
406
+
407
+
generate_terminal_colors_for_oomox(
408
+
self.colorscheme,
409
+
app=self, result_callback=_generate_terminal_colors,
410
+
)
394
411
395
412
def on_color_edited(self, colorscheme):
396
413
self.load_colorscheme(colorscheme)
@@ -400,18 +417,27 @@ def reload_presets(self):
400
417
self.preset_list.load_presets()
401
418
self.preset_list.focus_preset_by_filepath(self.colorscheme_path)
402
419
403
-
def disable(self):
404
-
self._currently_focused_widget = self.get_focus()
405
-
self.preset_list.set_sensitive(False)
406
-
self.theme_edit.set_sensitive(False)
407
-
Gtk.main_iteration_do(False)
408
-
self.spinner.start()
420
+
def disable(self, message=''):
421
+
def disable_ui_callback():
422
+
self._currently_focused_widget = self.get_focus()
423
+
self.spinner_revealer.set_reveal_child(True)
424
+
self.preset_list.set_sensitive(False)
425
+
self.theme_edit.set_sensitive(False)
426
+
Gtk.main_iteration_do(False)
427
+
self.spinner_message.set_text(message)
428
+
self.spinner.start()
429
+
430
+
GLib.timeout_add(0, disable_ui_callback, priority=GLib.PRIORITY_HIGH)
409
431
410
432
def enable(self):
411
-
self.preset_list.set_sensitive(True)
412
-
self.theme_edit.set_sensitive(True)
413
-
self.set_focus(self._currently_focused_widget)
414
-
self.spinner.stop()
433
+
def enable_ui_callback():
434
+
self.spinner_revealer.set_reveal_child(False)
435
+
self.preset_list.set_sensitive(True)
436
+
self.theme_edit.set_sensitive(True)
437
+
self.set_focus(self._currently_focused_widget)
438
+
self.spinner.stop()
439
+
440
+
GLib.idle_add(enable_ui_callback, priority=GLib.PRIORITY_LOW)
415
441
416
442
def show_help(self):
417
443
# @TODO: refactor to use .set_help_overlay() ?
@@ -647,10 +673,23 @@ def _init_headerbar(self): # pylint: disable=too-many-locals,too-many-statement
647
673
648
674
#
649
675
650
-
self.spinner = Gtk.Spinner()
651
-
self.headerbar.pack_end(self.spinner)
652
676
self.set_titlebar(self.headerbar)
653
677
678
+
def _init_status_spinner(self):
679
+
self.spinner = Gtk.Spinner()
680
+
self.spinner_message = Gtk.Label()
681
+
revealer_box = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=10)
682
+
revealer_box.add(self.spinner)
683
+
revealer_box.add(self.spinner_message)
684
+
revealer_frame = Gtk.Frame()
685
+
revealer_frame.get_style_context().add_class('app-notification')
686
+
revealer_frame.add(revealer_box)
687
+
self.spinner_revealer = Gtk.Revealer()
688
+
self.spinner_revealer.set_transition_type(Gtk.RevealerTransitionType.SLIDE_DOWN)
689
+
self.spinner_revealer.set_halign(Gtk.Align.CENTER)
690
+
self.spinner_revealer.set_valign(Gtk.Align.START)
691
+
self.spinner_revealer.add(revealer_frame)
692
+
654
693
def _init_window(self):
655
694
self.set_wmclass("oomox", "Oomox")
656
695
self.set_role("Oomox-GUI")
@@ -661,9 +700,14 @@ def _init_window(self):
661
700
)
662
701
663
702
self._init_headerbar()
703
+
self._init_status_spinner()
664
704
665
705
self.box = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL)
666
-
self.add(self.box)
706
+
overlay = Gtk.Overlay()
707
+
overlay.add(self.box)
708
+
overlay.add_overlay(self.spinner_revealer)
709
+
self.add(overlay)
710
+
# self.add(self.box)
667
711
668
712
self.paned_box = Gtk.Paned(orientation=Gtk.Orientation.HORIZONTAL)
669
713
self.paned_box.set_wide_handle(True)
@@ -690,6 +734,10 @@ def _init_actions(self):
690
734
"export_plugin_{}".format(plugin_name), self._on_export_plugin
691
735
)
692
736
737
+
def _init_plugins(self):
738
+
for plugin in IMPORT_PLUGINS.values():
739
+
plugin.set_app(self)
740
+
693
741
def __init__(self, application):
694
742
super().__init__(
695
743
application=application,
@@ -702,6 +750,7 @@ def __init__(self, application):
702
750
703
751
self._init_actions()
704
752
self._init_window()
753
+
self._init_plugins()
705
754
706
755
self.preset_list = ThemePresetList(
707
756
preset_select_callback=self.on_preset_selected
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4