Commit a797319b authored by Roman Alifanov's avatar Roman Alifanov

big fix of dialogues (they broke down from transferring everything to the main loop)

parent e162eae8
from gi.repository import GLib from gi.repository import GLib
import time
import traceback import traceback
from .module import Module from .module import Module
from .page import Page from .page import Page
...@@ -26,8 +25,19 @@ def init_settings_stack(stack, listbox, split_view): ...@@ -26,8 +25,19 @@ def init_settings_stack(stack, listbox, split_view):
else: else:
print("First init...") print("First init...")
for module_data in yaml_data: current_module_index = 0
module = Module(module_data) modules = list(yaml_data)
window = listbox.get_root()
def process_next_module():
nonlocal current_module_index
if current_module_index >= len(modules):
finalize_processing()
return
module_data = modules[current_module_index]
current_module_index += 1
try: try:
deps_results = dep_manager.verify_deps(module_data.get('deps', {})) deps_results = dep_manager.verify_deps(module_data.get('deps', {}))
...@@ -40,64 +50,48 @@ def init_settings_stack(stack, listbox, split_view): ...@@ -40,64 +50,48 @@ def init_settings_stack(stack, listbox, split_view):
all_conflicts_ok = all(r['success'] for r in conflicts_results) all_conflicts_ok = all(r['success'] for r in conflicts_results)
if all_deps_ok and all_conflicts_ok: if all_deps_ok and all_conflicts_ok:
print("Deps: OK") process_module(module_data)
GLib.idle_add(process_next_module)
else: else:
show_dialog(module_data, deps_message, conflicts_message)
except Exception as e:
handle_error(e, module_data)
GLib.idle_add(process_next_module)
def show_dialog(module_data, deps_msg, conflicts_msg):
dialog = TuneItDepsAlertDialog() dialog = TuneItDepsAlertDialog()
dialog.set_body(module_data['name']) dialog.set_body(module_data['name'])
dialog.deps_message_textbuffer.set_text(f"{deps_msg}\n{conflicts_msg}")
dialog.deps_message_textbuffer.set_text( def handle_response(response):
f"{deps_message}\n{conflicts_message}"
)
while True:
w = listbox.get_root()
if w.get_visible() and w.get_mapped():
response = dialog.user_question(w)
break
time.sleep(0.1)
print(f"RESPONSE: {response}")
if response == "skip": if response == "skip":
break GLib.idle_add(process_next_module)
else:
process_module(module_data)
GLib.idle_add(process_next_module)
dialog.ask_user(window, handle_response)
def process_module(module_data):
module = Module(module_data)
modules_dict[module.name] = module modules_dict[module.name] = module
for section_data in module_data.get('sections', []): for section_data in module_data.get('sections', []):
page_name = module.get_translation(section_data.get('page', 'Default')) page_name = module.get_translation(section_data.get('page', 'Default'))
module_page_name = section_data.get('page', 'Default') module_page_name = section_data.get('page', 'Default')
print(module_page_name)
if page_name not in pages_dict: if page_name not in pages_dict:
page_info = module.pages.get(f"_{module_page_name}", {}) or module.pages.get(module_page_name, {})
page_info = ( page = Page(name=page_name, icon=page_info.get('icon'))
module.pages.get(f"_{module_page_name}", {})
or module.pages.get(module_page_name, {})
)
page = Page(
name=page_name,
icon=page_info.get('icon'),
)
pages_dict[page_name] = page pages_dict[page_name] = page
section = section_factory.create_section(section_data, module) section = section_factory.create_section(section_data, module)
pages_dict[page_name].add_section(section) pages_dict[page_name].add_section(section)
except Exception as e:
from ..main import get_error
error = get_error()
full_traceback = traceback.format_exc()
e = f"Module '{module.name}' loading error \nError: {e}\nFull traceback:\n{full_traceback}"
error(e) def finalize_processing():
pages = sorted(pages_dict.values(), key=lambda p: p.name)
pages = list(pages_dict.values())
for page in pages: for page in pages:
page.sort_sections() page.sort_sections()
pages = sorted(pages, key=lambda p: p.name)
for page in pages:
page.create_stack_page(stack, listbox) page.create_stack_page(stack, listbox)
if not stack: if not stack:
...@@ -106,11 +100,18 @@ def init_settings_stack(stack, listbox, split_view): ...@@ -106,11 +100,18 @@ def init_settings_stack(stack, listbox, split_view):
def on_row_selected(listbox, row): def on_row_selected(listbox, row):
if row: if row:
page_id = row.props.name page_id = row.props.name
print(f"Selected page: {page_id}")
visible_child = stack.get_child_by_name(page_id) visible_child = stack.get_child_by_name(page_id)
if visible_child: if visible_child:
stack.set_visible_child(visible_child) stack.set_visible_child(visible_child)
split_view.set_show_content(True) split_view.set_show_content(True)
listbox.connect("row-selected", on_row_selected) listbox.connect("row-selected", on_row_selected)
def handle_error(e, module_data):
from ..main import get_error
error = get_error()
full_traceback = traceback.format_exc()
error_msg = f"Module '{module_data['name']}' loading error\nError: {e}\nFull traceback:\n{full_traceback}"
error(error_msg)
GLib.idle_add(process_next_module)
\ No newline at end of file
...@@ -116,21 +116,10 @@ class Setting: ...@@ -116,21 +116,10 @@ class Setting:
if service_stopped is False: if service_stopped is False:
from ...main import get_main_window from ...main import get_main_window
while True:
w = get_main_window()
if w.get_visible() and w.get_mapped():
dialog = ServiceNotStartedDialog() dialog = ServiceNotStartedDialog()
response = dialog.user_question(get_main_window())
break
time.sleep(0.1)
if response == "yes": dialog.present(get_main_window())
dialog.service_enable_with_restart()
elif response in ("no", "close"):
dialog.close()
service_stopped = True service_stopped = True
return None return None
......
from gi.repository import GLib, Adw, Gtk from gi.repository import GLib, Adw, Gtk
from time import sleep
@Gtk.Template(resource_path='/ru.ximperlinux.TuneIt/settings/widgets/deps_alert_dialog.ui') @Gtk.Template(resource_path='/ru.ximperlinux.TuneIt/settings/widgets/deps_alert_dialog.ui')
class TuneItDepsAlertDialog(Adw.AlertDialog): class TuneItDepsAlertDialog(Adw.AlertDialog):
__gtype_name__ = "TuneItDepsAlertDialog" __gtype_name__ = "TuneItDepsAlertDialog"
deps_message_textbuffer = Gtk.Template.Child() deps_message_textbuffer = Gtk.Template.Child()
response = "" def __init__(self, **kwargs):
super().__init__(**kwargs)
def user_question(self, window): self.callback = None
GLib.idle_add(self.present, window)
def on_response(dialog, response):
self.response = response
self.connect('response', on_response) def ask_user(self, window, callback):
self.callback = callback
self.present(window)
self.connect('response', self.on_response)
while True: def on_response(self, dialog, response):
if self.response != "": if self.callback:
return self.response self.callback(response)
else:
sleep(0.1)
continue
...@@ -20,22 +20,14 @@ class ServiceNotStartedDialog(Adw.AlertDialog): ...@@ -20,22 +20,14 @@ class ServiceNotStartedDialog(Adw.AlertDialog):
self.add_response("yes", _("Yes")) self.add_response("yes", _("Yes"))
self.add_response("no", _("No")) self.add_response("no", _("No"))
def user_question(self, window):
GLib.idle_add(self.present, window)
def on_response(dialog, response):
self.response = response
self.connect('response', on_response) self.connect('response', on_response)
while True: def on_response(self, dialog, response):
if self.response != "": if response == "yes":
return self.response self.service_enable_with_restart()
else:
sleep(0.1) elif response in ("no", "close"):
continue dialog.close()
def service_status(self): def service_status(self):
try: try:
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment