sub-bouquets creation support

This commit is contained in:
DYefremov
2021-12-02 15:39:33 +03:00
parent b73c1d1118
commit 6f3090a7e1
2 changed files with 160 additions and 125 deletions

View File

@@ -337,122 +337,6 @@ Author: Dmitriy Yefremov
<property name="can_focus">False</property> <property name="can_focus">False</property>
<property name="stock">gtk-file</property> <property name="stock">gtk-file</property>
</object> </object>
<object class="GtkMenu" id="bouquets_popup_menu">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkImageMenuItem" id="bouquets_new_popup_item">
<property name="label">gtk-new</property>
<property name="visible">True</property>
<property name="sensitive">False</property>
<property name="can_focus">False</property>
<property name="use_underline">True</property>
<property name="use_stock">True</property>
<signal name="activate" handler="on_new_bouquet" object="bouquets_tree_view" swapped="no"/>
<accelerator key="Insert" signal="activate" modifiers="Primary"/>
</object>
</child>
<child>
<object class="GtkImageMenuItem" id="bouquet_import_popup_item">
<property name="label" translatable="yes">Import</property>
<property name="visible">True</property>
<property name="sensitive">False</property>
<property name="can_focus">False</property>
<property name="image">import_bouquet_image</property>
<property name="use_stock">False</property>
<signal name="activate" handler="on_import_bouquet" swapped="no"/>
<accelerator key="i" signal="activate" modifiers="Primary"/>
</object>
</child>
<child>
<object class="GtkImageMenuItem" id="bouquet_export_popup_item">
<property name="label">gtk-save-as</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="use_underline">True</property>
<property name="use_stock">True</property>
<signal name="activate" handler="on_bouquet_export" swapped="no"/>
</object>
</child>
<child>
<object class="GtkSeparatorMenuItem" id="bouquets_popup_separator">
<property name="visible">True</property>
<property name="can_focus">False</property>
</object>
</child>
<child>
<object class="GtkImageMenuItem" id="bouquets_cut_popup_item">
<property name="label">gtk-cut</property>
<property name="visible">True</property>
<property name="sensitive">False</property>
<property name="can_focus">False</property>
<property name="use_underline">True</property>
<property name="use_stock">True</property>
<signal name="activate" handler="on_bouquets_cut" object="bouquets_tree_view" swapped="no"/>
<accelerator key="x" signal="activate" modifiers="Primary"/>
</object>
</child>
<child>
<object class="GtkImageMenuItem" id="bouquets_copy_popup_item">
<property name="label">gtk-copy</property>
<property name="visible">True</property>
<property name="sensitive">False</property>
<property name="can_focus">False</property>
<property name="use_underline">True</property>
<property name="use_stock">True</property>
<signal name="activate" handler="on_bouquets_copy" object="bouquets_tree_view" swapped="no"/>
<accelerator key="c" signal="activate" modifiers="Primary"/>
</object>
</child>
<child>
<object class="GtkImageMenuItem" id="bouquets_paste_popup_item">
<property name="label">gtk-paste</property>
<property name="visible">True</property>
<property name="sensitive">False</property>
<property name="can_focus">False</property>
<property name="use_underline">True</property>
<property name="use_stock">True</property>
<signal name="activate" handler="on_bouquets_paste" object="bouquets_tree_view" swapped="no"/>
<accelerator key="v" signal="activate" modifiers="Primary"/>
</object>
</child>
<child>
<object class="GtkSeparatorMenuItem" id="bouquets_popup_separator_2">
<property name="visible">True</property>
<property name="can_focus">False</property>
</object>
</child>
<child>
<object class="GtkImageMenuItem" id="bouquets_edit_popup_item">
<property name="label">gtk-edit</property>
<property name="visible">True</property>
<property name="sensitive">False</property>
<property name="can_focus">False</property>
<property name="use_underline">True</property>
<property name="use_stock">True</property>
<signal name="activate" handler="on_edit" swapped="no"/>
<accelerator key="e" signal="activate" modifiers="Primary"/>
</object>
</child>
<child>
<object class="GtkSeparatorMenuItem" id="bouquets_popup_separator_3">
<property name="visible">True</property>
<property name="can_focus">False</property>
</object>
</child>
<child>
<object class="GtkImageMenuItem" id="bouquets_remove_popup_item">
<property name="label">gtk-remove</property>
<property name="visible">True</property>
<property name="sensitive">False</property>
<property name="can_focus">False</property>
<property name="use_underline">True</property>
<property name="use_stock">True</property>
<signal name="activate" handler="on_delete" object="bouquets_tree_view" swapped="no"/>
<accelerator key="Delete" signal="activate"/>
</object>
</child>
</object>
<object class="GtkImage" id="insert_image"> <object class="GtkImage" id="insert_image">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">False</property> <property name="can_focus">False</property>
@@ -847,6 +731,136 @@ Author: Dmitriy Yefremov
<property name="can_focus">False</property> <property name="can_focus">False</property>
<property name="stock">gtk-new</property> <property name="stock">gtk-new</property>
</object> </object>
<object class="GtkImage" id="new_sub_bouquet_image">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="icon_name">document-new</property>
</object>
<object class="GtkMenu" id="bouquets_popup_menu">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkImageMenuItem" id="bouquets_new_popup_item">
<property name="label">gtk-new</property>
<property name="visible">True</property>
<property name="sensitive">False</property>
<property name="can_focus">False</property>
<property name="use_underline">True</property>
<property name="use_stock">True</property>
<signal name="activate" handler="on_new_bouquet" object="bouquets_tree_view" swapped="no"/>
<accelerator key="Insert" signal="activate" modifiers="Primary"/>
</object>
</child>
<child>
<object class="GtkImageMenuItem" id="bouquets_new_sub_popup_item">
<property name="label" translatable="yes">New sub-bouquet</property>
<property name="can_focus">False</property>
<property name="image">new_sub_bouquet_image</property>
<property name="use_stock">False</property>
<signal name="activate" handler="on_new_sub_bouquet" swapped="no"/>
</object>
</child>
<child>
<object class="GtkImageMenuItem" id="bouquet_import_popup_item">
<property name="label" translatable="yes">Import</property>
<property name="visible">True</property>
<property name="sensitive">False</property>
<property name="can_focus">False</property>
<property name="image">import_bouquet_image</property>
<property name="use_stock">False</property>
<signal name="activate" handler="on_import_bouquet" swapped="no"/>
<accelerator key="i" signal="activate" modifiers="Primary"/>
</object>
</child>
<child>
<object class="GtkImageMenuItem" id="bouquet_export_popup_item">
<property name="label">gtk-save-as</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="use_underline">True</property>
<property name="use_stock">True</property>
<signal name="activate" handler="on_bouquet_export" swapped="no"/>
</object>
</child>
<child>
<object class="GtkSeparatorMenuItem" id="bouquets_popup_separator">
<property name="visible">True</property>
<property name="can_focus">False</property>
</object>
</child>
<child>
<object class="GtkImageMenuItem" id="bouquets_cut_popup_item">
<property name="label">gtk-cut</property>
<property name="visible">True</property>
<property name="sensitive">False</property>
<property name="can_focus">False</property>
<property name="use_underline">True</property>
<property name="use_stock">True</property>
<signal name="activate" handler="on_bouquets_cut" object="bouquets_tree_view" swapped="no"/>
<accelerator key="x" signal="activate" modifiers="Primary"/>
</object>
</child>
<child>
<object class="GtkImageMenuItem" id="bouquets_copy_popup_item">
<property name="label">gtk-copy</property>
<property name="visible">True</property>
<property name="sensitive">False</property>
<property name="can_focus">False</property>
<property name="use_underline">True</property>
<property name="use_stock">True</property>
<signal name="activate" handler="on_bouquets_copy" object="bouquets_tree_view" swapped="no"/>
<accelerator key="c" signal="activate" modifiers="Primary"/>
</object>
</child>
<child>
<object class="GtkImageMenuItem" id="bouquets_paste_popup_item">
<property name="label">gtk-paste</property>
<property name="visible">True</property>
<property name="sensitive">False</property>
<property name="can_focus">False</property>
<property name="use_underline">True</property>
<property name="use_stock">True</property>
<signal name="activate" handler="on_bouquets_paste" object="bouquets_tree_view" swapped="no"/>
<accelerator key="v" signal="activate" modifiers="Primary"/>
</object>
</child>
<child>
<object class="GtkSeparatorMenuItem" id="bouquets_popup_separator_2">
<property name="visible">True</property>
<property name="can_focus">False</property>
</object>
</child>
<child>
<object class="GtkImageMenuItem" id="bouquets_edit_popup_item">
<property name="label">gtk-edit</property>
<property name="visible">True</property>
<property name="sensitive">False</property>
<property name="can_focus">False</property>
<property name="use_underline">True</property>
<property name="use_stock">True</property>
<signal name="activate" handler="on_edit" swapped="no"/>
<accelerator key="e" signal="activate" modifiers="Primary"/>
</object>
</child>
<child>
<object class="GtkSeparatorMenuItem" id="bouquets_popup_separator_3">
<property name="visible">True</property>
<property name="can_focus">False</property>
</object>
</child>
<child>
<object class="GtkImageMenuItem" id="bouquets_remove_popup_item">
<property name="label">gtk-remove</property>
<property name="visible">True</property>
<property name="sensitive">False</property>
<property name="can_focus">False</property>
<property name="use_underline">True</property>
<property name="use_stock">True</property>
<signal name="activate" handler="on_delete" object="bouquets_tree_view" swapped="no"/>
<accelerator key="Delete" signal="activate"/>
</object>
</child>
</object>
<object class="GtkImage" id="open_image"> <object class="GtkImage" id="open_image">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">False</property> <property name="can_focus">False</property>

View File

@@ -181,6 +181,7 @@ class Application(Gtk.Application):
"on_record": self.on_record, "on_record": self.on_record,
"on_remove_all_unavailable": self.on_remove_all_unavailable, "on_remove_all_unavailable": self.on_remove_all_unavailable,
"on_new_bouquet": self.on_new_bouquet, "on_new_bouquet": self.on_new_bouquet,
"on_new_sub_bouquet": self.on_new_sub_bouquet,
"on_create_bouquet_for_current_satellite": self.on_create_bouquet_for_current_satellite, "on_create_bouquet_for_current_satellite": self.on_create_bouquet_for_current_satellite,
"on_create_bouquet_for_each_satellite": self.on_create_bouquet_for_each_satellite, "on_create_bouquet_for_each_satellite": self.on_create_bouquet_for_each_satellite,
"on_create_bouquet_for_current_package": self.on_create_bouquet_for_current_package, "on_create_bouquet_for_current_package": self.on_create_bouquet_for_current_package,
@@ -376,6 +377,8 @@ class Application(Gtk.Application):
# Lock, Hide. # Lock, Hide.
self.bind_property("is-enigma", self._tool_elements.get(self._LOCK_HIDE_ELEMENTS[0]), "visible") self.bind_property("is-enigma", self._tool_elements.get(self._LOCK_HIDE_ELEMENTS[0]), "visible")
self.bind_property("is-enigma", self._tool_elements.get(self._LOCK_HIDE_ELEMENTS[1]), "visible", 4) self.bind_property("is-enigma", self._tool_elements.get(self._LOCK_HIDE_ELEMENTS[1]), "visible", 4)
# Sub-bouquets menu item.
self.bind_property("is_enigma", builder.get_object("bouquets_new_sub_popup_item"), "visible")
# Stack page widgets. # Stack page widgets.
self._stack_services_frame = builder.get_object("services_frame") self._stack_services_frame = builder.get_object("services_frame")
self._stack_satellite_box = builder.get_object("satellite_box") self._stack_satellite_box = builder.get_object("satellite_box")
@@ -1046,17 +1049,21 @@ class Application(Gtk.Application):
*bouquet.split(":")) *bouquet.split(":"))
return bouquet_file_name return bouquet_file_name
def on_new_bouquet(self, view): def on_new_bouquet(self, view, sub=False):
""" Creates a new item in the bouquets tree """ """ Creates a new item in the bouquets tree """
model, paths = view.get_selection().get_selected_rows() model, paths = view.get_selection().get_selected_rows()
if paths: if paths:
itr = model.get_iter(paths[0]) itr = model.get_iter(paths[0])
bq_type = model.get_value(itr, 3) if not model.iter_parent(itr) and sub:
self.show_error_message("Not allowed in this context!")
return
bq_type = model.get_value(itr, Column.BQ_TYPE)
bq_name = "bouquet" bq_name = "bouquet"
count = 0 count = 0
key = f"{bq_name}:{bq_type}" key = f"{bq_name}:{bq_type}"
# Generating name of new bouquet # Generating name of new bouquet.
while key in self._bouquets: while key in self._bouquets:
count += 1 count += 1
bq_name = f"bouquet{count}" bq_name = f"bouquet{count}"
@@ -1080,15 +1087,29 @@ class Application(Gtk.Application):
self._current_bq_name = response self._current_bq_name = response
if model.iter_n_children(itr): # parent if not model.iter_parent(itr): # root parent
ch_itr = model.insert(itr, 0, bq) scroll_to(model.get_path(model.insert(itr, Column.BQ_NAME, bq)), view, paths)
scroll_to(model.get_path(ch_itr), view, paths)
else: else:
p_itr = model.iter_parent(itr) p_itr = model.iter_parent(itr)
it = model.insert(p_itr, int(model.get_path(itr)[1]) + 1, bq) if p_itr else model.append(itr, bq) if sub:
scroll_to(model.get_path(it), view, paths) if model.iter_parent(p_itr):
self.show_error_message("Not allowed in this context!")
return
else:
if len(self._fav_model):
msg = "This bouquet already contains data.\n\nThey may be lost when saved!"
if show_dialog(DialogType.QUESTION, self._main_window, msg) != Gtk.ResponseType.OK:
return
scroll_to(model.get_path(model.append(itr, bq)), view, paths)
else:
it = model.insert(p_itr, int(model.get_path(itr)[1]) + 1, bq) if p_itr else model.append(itr, bq)
scroll_to(model.get_path(it), view, paths)
self._bouquets[key] = [] self._bouquets[key] = []
def on_new_sub_bouquet(self, item=None):
self.on_new_bouquet(self._bouquets_view, True)
def on_edit(self, *args): def on_edit(self, *args):
""" Edit header bar button """ """ Edit header bar button """
if self._services_view.is_focus(): if self._services_view.is_focus():
@@ -1852,7 +1873,7 @@ class Application(Gtk.Application):
self._services[fav_id] = srv self._services[fav_id] = srv
elif s_type is BqServiceType.BOUQUET: elif s_type is BqServiceType.BOUQUET:
# Sub bouquets! # Sub bouquets!
msg = "Detected sub-bouquets. This feature is not fully supported yet!" msg = "Detected sub-bouquets. This feature is still experimental!"
self.show_info_message(msg, Gtk.MessageType.WARNING) self.show_info_message(msg, Gtk.MessageType.WARNING)
self.append_bouquet(srv.data, bouquet) self.append_bouquet(srv.data, bouquet)
elif srv.name: elif srv.name: