added simple wait dialog

This commit is contained in:
DYefremov
2018-02-18 17:14:02 +03:00
parent 5a76601ae6
commit 25ee7f3538
6 changed files with 148 additions and 10 deletions

View File

@@ -1263,4 +1263,77 @@ dmitry.v.yefremov@gmail.com
<action-widget response="-5">ok_button</action-widget> <action-widget response="-5">ok_button</action-widget>
</action-widgets> </action-widgets>
</object> </object>
<object class="GtkDialog" id="wait_dialog">
<property name="can_focus">False</property>
<property name="resizable">False</property>
<property name="modal">True</property>
<property name="window_position">center-on-parent</property>
<property name="destroy_with_parent">True</property>
<property name="type_hint">splashscreen</property>
<property name="skip_taskbar_hint">True</property>
<property name="skip_pager_hint">True</property>
<property name="decorated">False</property>
<child internal-child="vbox">
<object class="GtkBox" id="dialog-vbox4">
<property name="can_focus">False</property>
<property name="orientation">vertical</property>
<child internal-child="action_area">
<object class="GtkButtonBox" id="dialog-action_area4">
<property name="can_focus">False</property>
<property name="opacity">0</property>
<property name="layout_style">end</property>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkBox" id="box4">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="orientation">vertical</property>
<child>
<object class="GtkSpinner" id="spinner">
<property name="width_request">150</property>
<property name="height_request">45</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="active">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label21">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">Loading data...</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
</child>
</object>
</interface> </interface>

View File

@@ -1,24 +1,36 @@
""" Common module for showing dialogs """ """ Common module for showing dialogs """
from enum import Enum from enum import Enum
from app.commons import run_idle
from . import Gtk, UI_RESOURCES_PATH from . import Gtk, UI_RESOURCES_PATH
class DialogType(Enum): class DialogType(Enum):
INPUT = "input_dialog" INPUT = "input_dialog"
MESSAGE = ""
CHOOSER = "path_chooser_dialog" CHOOSER = "path_chooser_dialog"
ERROR = "error_dialog" ERROR = "error_dialog"
QUESTION = "question_dialog" QUESTION = "question_dialog"
ABOUT = "about_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): def show_dialog(dialog_type: DialogType, transient, text=None, options=None, action_type=None, file_filter=None):
""" Shows dialogs by name """ """ Shows dialogs by name """
builder = Gtk.Builder() builder, dialog = get_dialog_from_xml(dialog_type, transient)
builder.add_from_file(UI_RESOURCES_PATH + "dialogs.glade")
dialog = builder.get_object(dialog_type.value)
dialog.set_transient_for(transient)
if dialog_type is DialogType.CHOOSER and options: if dialog_type is DialogType.CHOOSER and options:
if action_type is not None: if action_type is not None:
@@ -58,6 +70,14 @@ def show_dialog(dialog_type: DialogType, transient, text=None, options=None, act
return response 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): def get_chooser_dialog(transient, options, pattern, name):
file_filter = Gtk.FileFilter() file_filter = Gtk.FileFilter()
file_filter.add_pattern(pattern) file_filter.add_pattern(pattern)

View File

@@ -12,7 +12,7 @@ from app.eparser.enigma.bouquets import BqServiceType
from app.eparser.neutrino.bouquets import BqType from app.eparser.neutrino.bouquets import BqType
from app.properties import get_config, write_config, Profile from app.properties import get_config, write_config, Profile
from . import Gtk, Gdk, UI_RESOURCES_PATH, LOCKED_ICON, HIDE_ICON, IPTV_ICON 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 .download_dialog import show_download_dialog
from .main_helper import edit_marker, insert_marker, move_items, rename, ViewTarget, set_flags, locate_in_services, \ 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 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) self.__fav_view.connect("key-press-event", self.force_ctrl)
# Clipboard # Clipboard
self.__clipboard = Gtk.Clipboard.get(Gdk.SELECTION_CLIPBOARD) self.__clipboard = Gtk.Clipboard.get(Gdk.SELECTION_CLIPBOARD)
# Wait dialog
self.__wait_dialog = WaitDialog(self.__main_window)
self.__main_window.show() self.__main_window.show()
def init_drag_and_drop(self): def init_drag_and_drop(self):
@@ -495,6 +497,7 @@ class MainAppWindow:
@run_idle @run_idle
def open_data(self, data_path=None): def open_data(self, data_path=None):
""" Opening data and fill views. """ """ Opening data and fill views. """
self.__wait_dialog.show()
self.clear_current_data() self.clear_current_data()
data_path = self.__options.get(self.__profile).get("data_dir_path") if data_path is None else data_path 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!") "\n\nPlease, download files from receiver or setup your path for read data!")
except SyntaxError as e: except SyntaxError as e:
show_dialog(DialogType.ERROR, self.__main_window, str(e)) show_dialog(DialogType.ERROR, self.__main_window, str(e))
finally:
self.__wait_dialog.hide()
def append_blacklist(self, data_path): def append_blacklist(self, data_path):
black_list = get_blacklist(data_path) black_list = get_blacklist(data_path)

View File

@@ -4,7 +4,7 @@ from math import fabs
from app.commons import run_idle from app.commons import run_idle
from app.eparser import get_satellites, write_satellites, Satellite, Transponder from app.eparser import get_satellites, write_satellites, Satellite, Transponder
from . import Gtk, Gdk, UI_RESOURCES_PATH 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 from .main_helper import move_items, scroll_to
@@ -15,7 +15,7 @@ def show_satellites_dialog(transient, options):
class SatellitesDialog: 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 _aggr = [None for x in range(9)] # aggregate
@@ -50,6 +50,7 @@ class SatellitesDialog:
self._dialog.set_transient_for(transient) 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._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._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 # Setting the last size of the dialog window if it was saved
window_size = self._options.get("sat_editor_window_size", None) window_size = self._options.get("sat_editor_window_size", None)
if window_size: if window_size:
@@ -132,6 +133,7 @@ class SatellitesDialog:
def on_satellites_list_load(self, model): def on_satellites_list_load(self, model):
""" Load satellites data into model """ """ Load satellites data into model """
try: try:
self._wait_dialog.show()
satellites = get_satellites(self._data_path) satellites = get_satellites(self._data_path)
except FileNotFoundError as e: except FileNotFoundError as e:
show_dialog(DialogType.ERROR, self._dialog, getattr(e, "message", str(e)) + show_dialog(DialogType.ERROR, self._dialog, getattr(e, "message", str(e)) +
@@ -139,6 +141,8 @@ class SatellitesDialog:
else: else:
model.clear() model.clear()
self.append_data(model, satellites) self.append_data(model, satellites)
finally:
self._wait_dialog.hide()
@run_idle @run_idle
def append_data(self, model, satellites): def append_data(self, model, satellites):

View File

@@ -220,7 +220,9 @@
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">True</property> <property name="can_focus">True</property>
<property name="receives_default">True</property> <property name="receives_default">True</property>
<property name="tooltip_text" translatable="yes">Cancel</property>
<property name="use_stock">True</property> <property name="use_stock">True</property>
<property name="always_show_image">True</property>
</object> </object>
<packing> <packing>
<property name="expand">True</property> <property name="expand">True</property>
@@ -230,11 +232,14 @@
</child> </child>
<child> <child>
<object class="GtkButton" id="apply_button"> <object class="GtkButton" id="apply_button">
<property name="label">gtk-apply</property> <property name="label">gtk-save</property>
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">True</property> <property name="can_focus">True</property>
<property name="receives_default">True</property> <property name="receives_default">True</property>
<property name="tooltip_text" translatable="yes">Save current service</property>
<property name="use_stock">True</property> <property name="use_stock">True</property>
<property name="always_show_image">True</property>
<signal name="clicked" handler="on_save" swapped="no"/>
</object> </object>
<packing> <packing>
<property name="expand">True</property> <property name="expand">True</property>
@@ -242,6 +247,23 @@
<property name="position">1</property> <property name="position">1</property>
</packing> </packing>
</child> </child>
<child>
<object class="GtkButton" id="save_as_button">
<property name="label">gtk-new</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="tooltip_text" translatable="yes">Create and save as new service</property>
<property name="use_stock">True</property>
<property name="always_show_image">True</property>
<signal name="clicked" handler="on_create_new" swapped="no"/>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">2</property>
</packing>
</child>
</object> </object>
<packing> <packing>
<property name="expand">False</property> <property name="expand">False</property>
@@ -1341,6 +1363,7 @@
<object class="GtkSeparator" id="separator2"> <object class="GtkSeparator" id="separator2">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">False</property> <property name="can_focus">False</property>
<property name="tooltip_text" translatable="yes">Save as new service</property>
</object> </object>
<packing> <packing>
<property name="expand">False</property> <property name="expand">False</property>

View File

@@ -5,6 +5,7 @@ from app.commons import run_idle
from app.eparser import Service, get_satellites from app.eparser import Service, get_satellites
from app.eparser.ecommons import MODULATION, Inversion, ROLL_OFF, Pilot from app.eparser.ecommons import MODULATION, Inversion, ROLL_OFF, Pilot
from app.properties import Profile from app.properties import Profile
from app.ui.dialogs import show_dialog, DialogType
from . import Gtk, UI_RESOURCES_PATH from . import Gtk, UI_RESOURCES_PATH
from .main_helper import is_only_one_item_selected from .main_helper import is_only_one_item_selected
@@ -29,7 +30,9 @@ def get_sat_positions(path):
class ServiceDetailsDialog: class ServiceDetailsDialog:
def __init__(self, transient, options, view): 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 = Gtk.Builder()
builder.add_from_file(UI_RESOURCES_PATH + "service_details_dialog.glade") builder.add_from_file(UI_RESOURCES_PATH + "service_details_dialog.glade")
@@ -184,6 +187,16 @@ class ServiceDetailsDialog:
return response 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__": if __name__ == "__main__":
dialog = ServiceDetailsDialog() dialog = ServiceDetailsDialog()