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
import time
import traceback
from .module import Module
from .page import Page
......@@ -26,8 +25,19 @@ def init_settings_stack(stack, listbox, split_view):
else:
print("First init...")
for module_data in yaml_data:
module = Module(module_data)
current_module_index = 0
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:
deps_results = dep_manager.verify_deps(module_data.get('deps', {}))
......@@ -40,64 +50,48 @@ def init_settings_stack(stack, listbox, split_view):
all_conflicts_ok = all(r['success'] for r in conflicts_results)
if all_deps_ok and all_conflicts_ok:
print("Deps: OK")
process_module(module_data)
GLib.idle_add(process_next_module)
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.set_body(module_data['name'])
dialog.deps_message_textbuffer.set_text(f"{deps_msg}\n{conflicts_msg}")
dialog.deps_message_textbuffer.set_text(
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}")
def handle_response(response):
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
for section_data in module_data.get('sections', []):
page_name = module.get_translation(section_data.get('page', 'Default'))
module_page_name = section_data.get('page', 'Default')
print(module_page_name)
if page_name not in pages_dict:
page_info = (
module.pages.get(f"_{module_page_name}", {})
or module.pages.get(module_page_name, {})
)
page = Page(
name=page_name,
icon=page_info.get('icon'),
)
page_info = 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
section = section_factory.create_section(section_data, module)
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)
pages = list(pages_dict.values())
def finalize_processing():
pages = sorted(pages_dict.values(), key=lambda p: p.name)
for page in pages:
page.sort_sections()
pages = sorted(pages, key=lambda p: p.name)
for page in pages:
page.create_stack_page(stack, listbox)
if not stack:
......@@ -106,11 +100,18 @@ def init_settings_stack(stack, listbox, split_view):
def on_row_selected(listbox, row):
if row:
page_id = row.props.name
print(f"Selected page: {page_id}")
visible_child = stack.get_child_by_name(page_id)
if visible_child:
stack.set_visible_child(visible_child)
split_view.set_show_content(True)
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:
if service_stopped is False:
from ...main import get_main_window
while True:
w = get_main_window()
if w.get_visible() and w.get_mapped():
dialog = ServiceNotStartedDialog()
response = dialog.user_question(get_main_window())
break
time.sleep(0.1)
if response == "yes":
dialog.service_enable_with_restart()
dialog.present(get_main_window())
elif response in ("no", "close"):
dialog.close()
service_stopped = True
return None
......
from gi.repository import GLib, Adw, Gtk
from time import sleep
@Gtk.Template(resource_path='/ru.ximperlinux.TuneIt/settings/widgets/deps_alert_dialog.ui')
class TuneItDepsAlertDialog(Adw.AlertDialog):
__gtype_name__ = "TuneItDepsAlertDialog"
deps_message_textbuffer = Gtk.Template.Child()
response = ""
def user_question(self, window):
GLib.idle_add(self.present, window)
def on_response(dialog, response):
self.response = response
def __init__(self, **kwargs):
super().__init__(**kwargs)
self.callback = None
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:
if self.response != "":
return self.response
else:
sleep(0.1)
continue
def on_response(self, dialog, response):
if self.callback:
self.callback(response)
......@@ -20,22 +20,14 @@ class ServiceNotStartedDialog(Adw.AlertDialog):
self.add_response("yes", _("Yes"))
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)
while True:
if self.response != "":
return self.response
else:
sleep(0.1)
continue
def on_response(self, dialog, response):
if response == "yes":
self.service_enable_with_restart()
elif response in ("no", "close"):
dialog.close()
def service_status(self):
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