diff --git a/app/ui/dialogs.glade b/app/ui/dialogs.glade index 3a9a532f..1fb23878 100644 --- a/app/ui/dialogs.glade +++ b/app/ui/dialogs.glade @@ -1263,4 +1263,77 @@ dmitry.v.yefremov@gmail.com ok_button + + False + False + True + center-on-parent + True + splashscreen + True + True + False + + + False + vertical + + + False + 0 + end + + + + + + + + + False + False + 0 + + + + + True + False + vertical + + + 150 + 45 + True + False + True + + + False + True + 0 + + + + + True + False + Loading data... + + + False + True + 1 + + + + + True + True + 1 + + + + + diff --git a/app/ui/dialogs.py b/app/ui/dialogs.py index 92315254..be40a35f 100644 --- a/app/ui/dialogs.py +++ b/app/ui/dialogs.py @@ -1,24 +1,36 @@ """ Common module for showing dialogs """ from enum import Enum +from app.commons import run_idle from . import Gtk, UI_RESOURCES_PATH class DialogType(Enum): INPUT = "input_dialog" - MESSAGE = "" CHOOSER = "path_chooser_dialog" ERROR = "error_dialog" QUESTION = "question_dialog" ABOUT = "about_dialog" + WAIT = "wait_dialog" + + +class WaitDialog: + def __init__(self, transient): + builder, dialog = get_dialog_from_xml(DialogType.WAIT, transient) + self._dialog = dialog + self._dialog.set_transient_for(transient) + + def show(self): + self._dialog.show() + + @run_idle + def hide(self): + self._dialog.hide() def show_dialog(dialog_type: DialogType, transient, text=None, options=None, action_type=None, file_filter=None): """ Shows dialogs by name """ - builder = Gtk.Builder() - builder.add_from_file(UI_RESOURCES_PATH + "dialogs.glade") - dialog = builder.get_object(dialog_type.value) - dialog.set_transient_for(transient) + builder, dialog = get_dialog_from_xml(dialog_type, transient) if dialog_type is DialogType.CHOOSER and options: if action_type is not None: @@ -58,6 +70,14 @@ def show_dialog(dialog_type: DialogType, transient, text=None, options=None, act return response +def get_dialog_from_xml(dialog_type, transient): + builder = Gtk.Builder() + builder.add_from_file(UI_RESOURCES_PATH + "dialogs.glade") + dialog = builder.get_object(dialog_type.value) + dialog.set_transient_for(transient) + return builder, dialog + + def get_chooser_dialog(transient, options, pattern, name): file_filter = Gtk.FileFilter() file_filter.add_pattern(pattern) diff --git a/app/ui/main_app_window.py b/app/ui/main_app_window.py index b24995a3..8114f95d 100644 --- a/app/ui/main_app_window.py +++ b/app/ui/main_app_window.py @@ -12,7 +12,7 @@ from app.eparser.enigma.bouquets import BqServiceType from app.eparser.neutrino.bouquets import BqType from app.properties import get_config, write_config, Profile from . import Gtk, Gdk, UI_RESOURCES_PATH, LOCKED_ICON, HIDE_ICON, IPTV_ICON -from .dialogs import show_dialog, DialogType, get_chooser_dialog +from .dialogs import show_dialog, DialogType, get_chooser_dialog, WaitDialog from .download_dialog import show_download_dialog from .main_helper import edit_marker, insert_marker, move_items, rename, ViewTarget, set_flags, locate_in_services, \ scroll_to, get_base_model, update_picons, copy_picon_reference, assign_picon, remove_picon, search @@ -156,6 +156,8 @@ class MainAppWindow: self.__fav_view.connect("key-press-event", self.force_ctrl) # Clipboard self.__clipboard = Gtk.Clipboard.get(Gdk.SELECTION_CLIPBOARD) + # Wait dialog + self.__wait_dialog = WaitDialog(self.__main_window) self.__main_window.show() def init_drag_and_drop(self): @@ -495,6 +497,7 @@ class MainAppWindow: @run_idle def open_data(self, data_path=None): """ Opening data and fill views. """ + self.__wait_dialog.show() self.clear_current_data() data_path = self.__options.get(self.__profile).get("data_dir_path") if data_path is None else data_path @@ -510,6 +513,8 @@ class MainAppWindow: "\n\nPlease, download files from receiver or setup your path for read data!") except SyntaxError as e: show_dialog(DialogType.ERROR, self.__main_window, str(e)) + finally: + self.__wait_dialog.hide() def append_blacklist(self, data_path): black_list = get_blacklist(data_path) diff --git a/app/ui/satellites_dialog.py b/app/ui/satellites_dialog.py index 0c74abba..652d17e6 100644 --- a/app/ui/satellites_dialog.py +++ b/app/ui/satellites_dialog.py @@ -4,7 +4,7 @@ from math import fabs from app.commons import run_idle from app.eparser import get_satellites, write_satellites, Satellite, Transponder from . import Gtk, Gdk, UI_RESOURCES_PATH -from .dialogs import show_dialog, DialogType +from .dialogs import show_dialog, DialogType, WaitDialog from .main_helper import move_items, scroll_to @@ -15,7 +15,7 @@ def show_satellites_dialog(transient, options): class SatellitesDialog: - __slots__ = ["_dialog", "_data_path", "_stores", "_options", "_sat_view"] + __slots__ = ["_dialog", "_data_path", "_stores", "_options", "_sat_view", "_wait_dialog"] _aggr = [None for x in range(9)] # aggregate @@ -50,6 +50,7 @@ class SatellitesDialog: self._dialog.set_transient_for(transient) self._dialog.get_content_area().set_border_width(0) # The width of the border around the app dialog area! self._sat_view = builder.get_object("satellites_editor_tree_view") + self._wait_dialog = WaitDialog(self._dialog) # Setting the last size of the dialog window if it was saved window_size = self._options.get("sat_editor_window_size", None) if window_size: @@ -132,6 +133,7 @@ class SatellitesDialog: def on_satellites_list_load(self, model): """ Load satellites data into model """ try: + self._wait_dialog.show() satellites = get_satellites(self._data_path) except FileNotFoundError as e: show_dialog(DialogType.ERROR, self._dialog, getattr(e, "message", str(e)) + @@ -139,6 +141,8 @@ class SatellitesDialog: else: model.clear() self.append_data(model, satellites) + finally: + self._wait_dialog.hide() @run_idle def append_data(self, model, satellites): diff --git a/app/ui/service_details_dialog.glade b/app/ui/service_details_dialog.glade index 6822f3eb..78089f11 100644 --- a/app/ui/service_details_dialog.glade +++ b/app/ui/service_details_dialog.glade @@ -220,7 +220,9 @@ True True True + Cancel True + True True @@ -230,11 +232,14 @@ - gtk-apply + gtk-save True True True + Save current service True + True + True @@ -242,6 +247,23 @@ 1 + + + gtk-new + True + True + True + Create and save as new service + True + True + + + + True + True + 2 + + False @@ -1341,6 +1363,7 @@ True False + Save as new service False diff --git a/app/ui/service_details_dialog.py b/app/ui/service_details_dialog.py index 766c0679..28e849f3 100644 --- a/app/ui/service_details_dialog.py +++ b/app/ui/service_details_dialog.py @@ -5,6 +5,7 @@ from app.commons import run_idle from app.eparser import Service, get_satellites from app.eparser.ecommons import MODULATION, Inversion, ROLL_OFF, Pilot from app.properties import Profile +from app.ui.dialogs import show_dialog, DialogType from . import Gtk, UI_RESOURCES_PATH from .main_helper import is_only_one_item_selected @@ -29,7 +30,9 @@ def get_sat_positions(path): class ServiceDetailsDialog: def __init__(self, transient, options, view): - handlers = {"on_system_changed": self.on_system_changed} + handlers = {"on_system_changed": self.on_system_changed, + "on_save": self.on_save, + "on_create_new": self.on_create_new} builder = Gtk.Builder() builder.add_from_file(UI_RESOURCES_PATH + "service_details_dialog.glade") @@ -184,6 +187,16 @@ class ServiceDetailsDialog: return response + def on_save(self, item): + show_dialog(DialogType.ERROR, transient=self._dialog, text="Not implemented yet!") + # if show_dialog(DialogType.QUESTION, self._dialog) == Gtk.ResponseType.CANCEL: + # return + + def on_create_new(self, item): + show_dialog(DialogType.ERROR, transient=self._dialog, text="Not implemented yet!") + # if show_dialog(DialogType.QUESTION, self._dialog) == Gtk.ResponseType.CANCEL: + # return + if __name__ == "__main__": dialog = ServiceDetailsDialog()