mirror of
https://github.com/DYefremov/DemonEditor.git
synced 2026-03-05 03:51:56 +01:00
services filter skeleton
This commit is contained in:
@@ -9,7 +9,7 @@
|
||||
<property name="icon_name">system-help</property>
|
||||
<property name="type_hint">normal</property>
|
||||
<property name="program_name">DemonEditor</property>
|
||||
<property name="version">0.2.1 Pre-alpha</property>
|
||||
<property name="version">0.2.2 Pre-alpha</property>
|
||||
<property name="copyright" translatable="yes">2018 Dmitriy Yefremov
|
||||
dmitry.v.yefremov@gmail.com
|
||||
</property>
|
||||
@@ -611,7 +611,6 @@ dmitry.v.yefremov@gmail.com
|
||||
<property name="value">1</property>
|
||||
<property name="step_increment">1</property>
|
||||
<property name="page_increment">10</property>
|
||||
<property name="page_size">1</property>
|
||||
</object>
|
||||
<object class="GtkDialog" id="settings_dialog">
|
||||
<property name="can_focus">False</property>
|
||||
|
||||
@@ -19,9 +19,9 @@ from .settings_dialog import show_settings_dialog
|
||||
|
||||
|
||||
class MainAppWindow:
|
||||
_SERVICE_LIST_NAME = "services_list_store"
|
||||
_FAV_LIST_NAME = "fav_list_store"
|
||||
_BOUQUETS_LIST_NAME = "bouquets_tree_store"
|
||||
_SERVICE_VIEW_NAME = "services_tree_view"
|
||||
_FAV_VIEW_NAME = "fav_tree_view"
|
||||
_BOUQUETS_VIEW_NAME = "bouquets_tree_view"
|
||||
# dynamically active elements depending on the selected view
|
||||
_SERVICE_ELEMENTS = ("copy_tool_button", "to_fav_tool_button", "copy_menu_item", "services_to_fav_move_popup_item",
|
||||
"services_edit_popup_item", "services_copy_popup_item")
|
||||
@@ -90,7 +90,8 @@ class MainAppWindow:
|
||||
"on_edit_marker": self.on_edit_marker,
|
||||
"on_fav_popup": self.on_fav_popup,
|
||||
"on_locate_in_services": self.on_locate_in_services,
|
||||
"on_picons_loader_show": self.on_picons_loader_show}
|
||||
"on_picons_loader_show": self.on_picons_loader_show,
|
||||
"on_filter_changed": self.on_filter_changed}
|
||||
|
||||
self.__options = get_config()
|
||||
self.__profile = self.__options.get("profile")
|
||||
@@ -129,6 +130,10 @@ class MainAppWindow:
|
||||
self.__radio_count_label = builder.get_object("radio_count_label")
|
||||
self.__data_count_label = builder.get_object("data_count_label")
|
||||
self.__fav_edit_marker_popup_item = builder.get_object("fav_edit_marker_popup_item")
|
||||
# Filter
|
||||
self.__services_model_filter = builder.get_object("services_model_filter")
|
||||
self.__services_model_filter.set_visible_func(self.services_filter_function)
|
||||
self.__filter_entry = builder.get_object("filter_entry")
|
||||
self.init_drag_and_drop() # drag and drop
|
||||
# Force ctrl press event for view. Multiple selections in lists only with Space key(as in file managers)!!!
|
||||
self.__services_view.connect("key-press-event", self.force_ctrl)
|
||||
@@ -210,20 +215,20 @@ class MainAppWindow:
|
||||
model.insert(dest_index, row)
|
||||
fav_bouquet.insert(dest_index, row[-1])
|
||||
|
||||
if model.get_name() == self._FAV_LIST_NAME:
|
||||
if model.get_name() == self._FAV_VIEW_NAME:
|
||||
self.update_fav_num_column(model)
|
||||
|
||||
self.__rows_buffer.clear()
|
||||
self.on_view_focus(view, None)
|
||||
|
||||
def on_edit(self, view):
|
||||
name = view.get_model().get_name()
|
||||
if name == self._BOUQUETS_LIST_NAME:
|
||||
name = Gtk.Buildable.get_name(view)
|
||||
if name == self._BOUQUETS_VIEW_NAME:
|
||||
self.on_bouquets_edit(view)
|
||||
# edit(view, self.__main_window, ViewTarget.BOUQUET)
|
||||
elif name == self._FAV_LIST_NAME:
|
||||
elif name == self._FAV_VIEW_NAME:
|
||||
edit(view, self.__main_window, ViewTarget.FAV, service_view=self.__services_view, channels=self.__services)
|
||||
elif name == self._SERVICE_LIST_NAME:
|
||||
elif name == self._SERVICE_VIEW_NAME:
|
||||
edit(view, self.__main_window, ViewTarget.SERVICES, fav_view=self.__fav_view, channels=self.__services)
|
||||
|
||||
def on_delete(self, item):
|
||||
@@ -235,7 +240,7 @@ class MainAppWindow:
|
||||
if view.is_focus():
|
||||
selection = view.get_selection()
|
||||
model, paths = selection.get_selected_rows()
|
||||
model_name = model.get_name()
|
||||
view_name = Gtk.Buildable.get_name(view)
|
||||
itrs = [model.get_iter(path) for path in paths]
|
||||
rows = [model.get(in_itr, *[x for x in range(model.get_n_columns())]) for in_itr in itrs]
|
||||
bq_selected = self.is_bouquet_selected()
|
||||
@@ -245,18 +250,22 @@ class MainAppWindow:
|
||||
fav_bouquet = self.__bouquets.get(bq_selected, None)
|
||||
|
||||
for itr in itrs:
|
||||
if fav_bouquet and model_name == self._FAV_LIST_NAME:
|
||||
if fav_bouquet and view_name == self._FAV_VIEW_NAME:
|
||||
del fav_bouquet[int(model.get_path(itr)[0])]
|
||||
if model_name == self._BOUQUETS_LIST_NAME:
|
||||
self.__bouquets_model.remove(itr)
|
||||
elif view_name == self._BOUQUETS_VIEW_NAME:
|
||||
if len(model.get_path(itr)) < 2:
|
||||
show_dialog(DialogType.ERROR, self.__main_window, "This item is not allowed to be removed!")
|
||||
return
|
||||
else:
|
||||
self.delete_bouquet(bq_selected)
|
||||
model.remove(itr)
|
||||
if model_name == self._FAV_LIST_NAME:
|
||||
self.__fav_model.remove(itr)
|
||||
elif view_name == self._SERVICE_VIEW_NAME:
|
||||
self.__services_model.remove(itr)
|
||||
|
||||
if view_name == self._FAV_VIEW_NAME:
|
||||
self.update_fav_num_column(model)
|
||||
elif model_name == self._SERVICE_LIST_NAME:
|
||||
elif view_name == self._SERVICE_VIEW_NAME:
|
||||
self.delete_services(bq_selected, rows)
|
||||
|
||||
self.on_view_focus(view, None)
|
||||
@@ -394,7 +403,7 @@ class MainAppWindow:
|
||||
try:
|
||||
fav_bouquet = self.__bouquets[bq_selected]
|
||||
|
||||
if source == self._SERVICE_LIST_NAME:
|
||||
if source == self._SERVICE_VIEW_NAME:
|
||||
ext_model = self.__services_view.get_model()
|
||||
ext_itrs = [ext_model.get_iter_from_string(itr) for itr in itrs]
|
||||
ext_rows = [ext_model.get(ext_itr, *[x for x in range(ext_model.get_n_columns())]) for
|
||||
@@ -407,7 +416,7 @@ class MainAppWindow:
|
||||
model.insert(dest_index, (0, channel.coded, channel.service, channel.locked, channel.hide,
|
||||
channel.service_type, channel.pos, channel.fav_id))
|
||||
fav_bouquet.insert(dest_index, channel.fav_id)
|
||||
elif source == self._FAV_LIST_NAME:
|
||||
elif source == self._FAV_VIEW_NAME:
|
||||
in_itrs = [model.get_iter_from_string(itr) for itr in itrs]
|
||||
in_rows = [model.get(in_itr, *[x for x in range(model.get_n_columns())]) for in_itr in in_itrs]
|
||||
for row in in_rows:
|
||||
@@ -641,7 +650,7 @@ class MainAppWindow:
|
||||
key = event.keyval
|
||||
ctrl = event.state & Gdk.ModifierType.CONTROL_MASK
|
||||
alt = event.state & Gdk.ModifierType.MOD1_MASK
|
||||
model_name = view.get_model().get_name()
|
||||
view_name = Gtk.Buildable.get_name(view)
|
||||
|
||||
if key == Gdk.KEY_Delete:
|
||||
self.on_delete(view)
|
||||
@@ -649,19 +658,19 @@ class MainAppWindow:
|
||||
self.move_items(key)
|
||||
elif ctrl and key in (Gdk.KEY_Down, Gdk.KEY_Page_Down, Gdk.KEY_KP_Page_Down):
|
||||
self.move_items(key)
|
||||
elif model_name == self._FAV_LIST_NAME and key == Gdk.KEY_Control_L or key == Gdk.KEY_Control_R:
|
||||
elif view_name == self._FAV_VIEW_NAME and key == Gdk.KEY_Control_L or key == Gdk.KEY_Control_R:
|
||||
self.update_fav_num_column(view.get_model())
|
||||
self.update_bouquet_list()
|
||||
elif key == Gdk.KEY_Insert:
|
||||
# Move items from app to fav list
|
||||
if model_name == self._SERVICE_LIST_NAME:
|
||||
if view_name == self._SERVICE_VIEW_NAME:
|
||||
self.on_to_fav_move(view)
|
||||
elif model_name == self._BOUQUETS_LIST_NAME:
|
||||
elif view_name == self._BOUQUETS_VIEW_NAME:
|
||||
self.on_new_bouquet(view)
|
||||
elif ctrl and (key == Gdk.KEY_c or key == Gdk.KEY_C) and model_name == self._SERVICE_LIST_NAME:
|
||||
elif ctrl and (key == Gdk.KEY_c or key == Gdk.KEY_C) and view_name == self._SERVICE_VIEW_NAME:
|
||||
self.on_copy(view)
|
||||
elif ctrl and key == Gdk.KEY_x or key == Gdk.KEY_X:
|
||||
if model_name == self._FAV_LIST_NAME:
|
||||
if view_name == self._FAV_VIEW_NAME:
|
||||
self.on_cut(view)
|
||||
elif ctrl and key == Gdk.KEY_v or key == Gdk.KEY_V:
|
||||
self.on_paste(view)
|
||||
@@ -673,7 +682,7 @@ class MainAppWindow:
|
||||
self.on_hide(None)
|
||||
elif ctrl and key == Gdk.KEY_E or key == Gdk.KEY_e or key == Gdk.KEY_F2:
|
||||
self.on_edit(view)
|
||||
elif key == Gdk.KEY_space and model_name == self._FAV_LIST_NAME:
|
||||
elif key == Gdk.KEY_space and view_name == self._FAV_VIEW_NAME:
|
||||
pass
|
||||
|
||||
def on_download(self, item):
|
||||
@@ -686,10 +695,10 @@ class MainAppWindow:
|
||||
def on_view_focus(self, view, focus_event):
|
||||
profile = Profile(self.__profile)
|
||||
model = view.get_model()
|
||||
model_name = model.get_name()
|
||||
view_name = Gtk.Buildable.get_name(view)
|
||||
not_empty = len(model) > 0 # if > 0 model has items
|
||||
|
||||
if model_name == self._BOUQUETS_LIST_NAME:
|
||||
if view_name == self._BOUQUETS_VIEW_NAME:
|
||||
for elem in self.__tool_elements:
|
||||
self.__tool_elements[elem].set_sensitive(False)
|
||||
for elem in self._BOUQUET_ELEMENTS:
|
||||
@@ -698,7 +707,7 @@ class MainAppWindow:
|
||||
for elem in self._LOCK_HIDE_ELEMENTS:
|
||||
self.__tool_elements[elem].set_sensitive(not_empty)
|
||||
else:
|
||||
is_service = model_name == self._SERVICE_LIST_NAME
|
||||
is_service = view_name == self._SERVICE_VIEW_NAME
|
||||
for elem in self._FAV_ELEMENTS:
|
||||
if elem in ("paste_tool_button", "paste_menu_item", "fav_paste_popup_item"):
|
||||
self.__tool_elements[elem].set_sensitive(not is_service and self.__rows_buffer)
|
||||
@@ -742,11 +751,11 @@ class MainAppWindow:
|
||||
def on_model_changed(self, model, path, itr=None):
|
||||
model_name = model.get_name()
|
||||
|
||||
if model_name == self._FAV_LIST_NAME:
|
||||
if model_name == self._FAV_VIEW_NAME:
|
||||
self.__fav_count_label.set_text(str(len(model)))
|
||||
elif model_name == self._SERVICE_LIST_NAME:
|
||||
elif model_name == self._SERVICE_VIEW_NAME:
|
||||
self.update_services_counts(len(model))
|
||||
elif model_name == self._BOUQUETS_LIST_NAME:
|
||||
elif model_name == self._BOUQUETS_VIEW_NAME:
|
||||
self.__bouquets_count_label.set_text(str(len(self.__bouquets.keys())))
|
||||
|
||||
@lru_cache(maxsize=1)
|
||||
@@ -817,6 +826,17 @@ class MainAppWindow:
|
||||
dialog = PiconsDialog(self.__main_window, self.__options.get(self.__profile), Profile(self.__profile))
|
||||
dialog.show()
|
||||
|
||||
@run_idle
|
||||
def on_filter_changed(self, entry):
|
||||
self.__services_model_filter.clear_cache()
|
||||
self.__services_model_filter.refilter()
|
||||
|
||||
def services_filter_function(self, model, iter, data):
|
||||
if self.__services_model_filter is None or self.__services_model_filter == "None":
|
||||
return True
|
||||
else:
|
||||
return self.__filter_entry.get_text() in str(model.get(iter, 3, 6, 7, 8, 9, 10, 11, 12, 13, 14))
|
||||
|
||||
|
||||
def start_app():
|
||||
MainAppWindow()
|
||||
|
||||
@@ -270,6 +270,12 @@
|
||||
</columns>
|
||||
<signal name="row-deleted" handler="on_model_changed" swapped="no"/>
|
||||
</object>
|
||||
<object class="GtkTreeModelFilter" id="services_model_filter">
|
||||
<property name="child_model">services_list_store</property>
|
||||
</object>
|
||||
<object class="GtkTreeModelSort" id="services_model_tree_model_sort">
|
||||
<property name="model">services_model_filter</property>
|
||||
</object>
|
||||
<object class="GtkApplicationWindow" id="main_window">
|
||||
<property name="width_request">640</property>
|
||||
<property name="can_focus">False</property>
|
||||
@@ -893,7 +899,7 @@
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="padding">2</property>
|
||||
<property name="position">2</property>
|
||||
<property name="position">3</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
@@ -925,12 +931,13 @@
|
||||
<object class="GtkScrolledWindow" id="services_scrolled_window">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="margin_bottom">2</property>
|
||||
<property name="shadow_type">in</property>
|
||||
<child>
|
||||
<object class="GtkTreeView" id="services_tree_view">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="model">services_list_store</property>
|
||||
<property name="model">services_model_tree_model_sort</property>
|
||||
<property name="search_column">3</property>
|
||||
<property name="rubber_banding">True</property>
|
||||
<property name="enable_grid_lines">both</property>
|
||||
@@ -973,6 +980,7 @@
|
||||
<object class="GtkTreeViewColumn" id="service_column">
|
||||
<property name="resizable">True</property>
|
||||
<property name="spacing">2</property>
|
||||
<property name="sizing">autosize</property>
|
||||
<property name="title" translatable="yes">Service</property>
|
||||
<property name="expand">True</property>
|
||||
<property name="reorderable">True</property>
|
||||
@@ -1201,7 +1209,7 @@
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkBox" id="services_bar_box">
|
||||
<property name="height_request">25</property>
|
||||
<property name="height_request">30</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="resize_mode">queue</property>
|
||||
@@ -1323,6 +1331,36 @@
|
||||
<property name="position">8</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkSeparator" id="separator2">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="orientation">vertical</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="padding">5</property>
|
||||
<property name="position">9</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkEntry" id="filter_entry">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="margin_right">15</property>
|
||||
<property name="primary_icon_name">edit-select-all-symbolic</property>
|
||||
<property name="primary_icon_activatable">False</property>
|
||||
<property name="primary_icon_tooltip_text" translatable="yes">Filter</property>
|
||||
<property name="placeholder_text" translatable="yes">Data filter</property>
|
||||
<signal name="changed" handler="on_filter_changed" swapped="no"/>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">10</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
@@ -1338,6 +1376,7 @@
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkPaned" id="fav_bouquets_paned">
|
||||
<property name="width_request">350</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="wide_handle">True</property>
|
||||
@@ -1362,6 +1401,7 @@
|
||||
<object class="GtkScrolledWindow" id="scrolledwindow2">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="margin_bottom">2</property>
|
||||
<property name="shadow_type">in</property>
|
||||
<child>
|
||||
<object class="GtkTreeView" id="fav_tree_view">
|
||||
@@ -1482,7 +1522,7 @@
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkBox" id="fav_bar_box">
|
||||
<property name="height_request">25</property>
|
||||
<property name="height_request">30</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="spacing">2</property>
|
||||
@@ -1549,6 +1589,7 @@
|
||||
<object class="GtkScrolledWindow" id="scrolledwindow3">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="margin_bottom">2</property>
|
||||
<property name="shadow_type">in</property>
|
||||
<child>
|
||||
<object class="GtkTreeView" id="bouquets_tree_view">
|
||||
@@ -1619,7 +1660,7 @@
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkBox" id="bouquet_bar_box">
|
||||
<property name="height_request">25</property>
|
||||
<property name="height_request">30</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="spacing">2</property>
|
||||
@@ -1676,7 +1717,7 @@
|
||||
<property name="expand">True</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="padding">1</property>
|
||||
<property name="position">3</property>
|
||||
<property name="position">4</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
@@ -1689,7 +1730,7 @@
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="padding">2</property>
|
||||
<property name="position">4</property>
|
||||
<property name="position">5</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
@@ -1742,7 +1783,7 @@
|
||||
<object class="GtkLabel" id="ver_label">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="label" translatable="yes">Ver. 0.2.1 Pre-alpha</property>
|
||||
<property name="label" translatable="yes">Ver. 0.2.2 Pre-alpha</property>
|
||||
<property name="xalign">0.94999998807907104</property>
|
||||
</object>
|
||||
<packing>
|
||||
@@ -1755,7 +1796,7 @@
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">5</property>
|
||||
<property name="position">7</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
Package: DemonEditor
|
||||
Version: 0.2.1-Pre-alpha
|
||||
Version: 0.2.2-Pre-alpha
|
||||
Section: utils
|
||||
Priority: optional
|
||||
Architecture: all
|
||||
|
||||
Reference in New Issue
Block a user