diff --git a/src/filter.blp b/src/filter.blp index dc238ce..3a2b3e1 100644 --- a/src/filter.blp +++ b/src/filter.blp @@ -25,8 +25,8 @@ template FilterWindow : Adw.Window { content: Adw.ToastOverlay toast_overlay { Stack main_stack { - Box main_box { - orientation: vertical; + //Box main_box { + //orientation: vertical; Overlay main_overlay { ScrolledWindow scrolled_window { vexpand: true; @@ -35,8 +35,8 @@ template FilterWindow : Adw.Window { orientation: vertical; ListBox install_type_list { - margin-top: 6; - margin-bottom: 6; + margin-top: 18; + margin-bottom: 18; margin-start: 12; margin-end: 12; hexpand: true; @@ -62,60 +62,20 @@ template FilterWindow : Adw.Window { activatable-widget: runtimes_switch; } - } - // ListBox install_type_list { - // margin-top: 6; - // margin-bottom: 6; - // margin-start: 12; - // margin-end: 12; - // hexpand: true; - // valign: start; - // selection-mode: none; - // styles["boxed-list"] - - // Adw.ActionRow user { - // title: _("User wide"); - // subtitle: _("Apps only available to you"); - - // [suffix] - // CheckButton user_check { - // } - - // activatable-widget: user_check; - // } - // Adw.ActionRow system { - // title: _("System wide"); - // subtitle: _("Apps available to everyone on this system"); - - // [suffix] - // CheckButton system_check { - // } - - // activatable-widget: system_check; - // } - // } - Label header_label { - margin-top: 6; - margin-bottom: 3; - margin-start: 12; - halign: start; - label: _("Show Flatpaks from these remotes"); - } - ListBox remotes_list { - margin-top: 6; - margin-bottom: 6; - margin-start: 12; - margin-end: 12; - hexpand: true; - valign: start; - selection-mode: none; - styles["boxed-list"] + Adw.ExpanderRow remotes_expander { + enable-expansion: false; + title: _("Filter Apps by Remotes"); + } + Adw.ExpanderRow runtimes_expander { + enable-expansion: false; + title: _("Filter Apps by Runtime"); + } } } } } } - } + //} Adw.StatusPage no_data { icon-name: "check-plain-symbolic"; title: _("No Leftover Data"); diff --git a/src/filter_window.py b/src/filter_window.py index 1b0e3a5..f62bfe9 100644 --- a/src/filter_window.py +++ b/src/filter_window.py @@ -10,10 +10,11 @@ class FilterWindow(Adw.Window): cancel_button = Gtk.Template.Child() apply_button = Gtk.Template.Child() - remotes_list = Gtk.Template.Child() apps_switch = Gtk.Template.Child() runtimes_switch = Gtk.Template.Child() - header_label = Gtk.Template.Child() + remotes_expander = Gtk.Template.Child() + runtimes_expander = Gtk.Template.Child() + def key_handler(self, _a, event, _c, _d): if event == Gdk.KEY_Escape: @@ -23,9 +24,23 @@ class FilterWindow(Adw.Window): self.apply_button.set_sensitive(False) if self.filter_list[0] == True or self.filter_list[1] == True: - if not self.filter_list[3] == []: + if self.filter_list[3] == []: + self.apply_button.set_sensitive(False) + return + else: self.apply_button.set_sensitive(True) + if self.filter_list[4] == []: + self.apply_button.set_sensitive(False) + return + else: + self.apply_button.set_sensitive(True) + + print(self.filter_list[4]) + + # if self.apps_switch.get_active() and not self.runtimes_switch.get_active() and not self.remotes_expander_switch.get_active() and not self.runtimes_expander_switch.get_active(): + # self.apply_button.set_sensitive(False) + def appsHandler(self, switch, _a): self.filter_list[0] = switch.get_active() self.isListApplicable() @@ -34,6 +49,12 @@ class FilterWindow(Adw.Window): self.filter_list[1] = switch.get_active() self.isListApplicable() + def remotesEnableHandler(self, switch, is_enabled): + self.remotes_expander.set_enable_expansion(is_enabled) + + for i in range(len(self.remote_checkboxes)): + self.remote_checkboxes[i].set_active(not is_enabled) + def remoteCheckHandler(self, checkbox, install_type, remote): if checkbox.get_active(): self.filter_list[2].append(install_type) @@ -42,11 +63,42 @@ class FilterWindow(Adw.Window): self.filter_list[2].remove(install_type) self.filter_list[3].remove(remote) + def runtimesEnableHandler(self, switch, is_enabled): + self.runtimes_expander.set_enable_expansion(is_enabled) + + if is_enabled: + self.filter_list[4] = [] + else: + self.filter_list[4] = "all" + + for i in range(len(self.runtime_checkboxes)): + self.runtime_checkboxes[i].set_active(not is_enabled) + + self.isListApplicable() + + def runtimeCheckHandler(self, checkbox, runtime): + if checkbox.get_active(): + self.filter_list[4].append(runtime) + else: + self.filter_list[4].remove(runtime) + self.isListApplicable() def generateList(self): - Gtk.Label.set_markup(self.header_label, ("{}").format(self.header_label.get_label())) + dependant_runtimes = [] + for i in range(len(self.host_flatpaks)): + current = self.host_flatpaks[i] + if current[13] not in dependant_runtimes and current[13] != "": + dependant_runtimes.append(current[13]) + + if len(self.host_remotes) < 2: # Don't give the ability to filter by remotes if there is only 1 + self.remotes_expander.set_visible(False) + + if len(dependant_runtimes) < 2: # Don't give the ability to filter by runtimes if there is only 1 + self.runtimes_expander.set_visible(False) + + self.remote_checkboxes = [] for i in range(len(self.host_remotes)): name = self.host_remotes[i][0] title = self.host_remotes[i][1] @@ -55,16 +107,41 @@ class FilterWindow(Adw.Window): remote_row = Adw.ActionRow(title=title, subtitle=url) if title == "-": remote_row.set_title(name) - self.remotes_list.append(remote_row) + self.remotes_expander.add_row(remote_row) label = Gtk.Label(label=("{} wide").format(install_type)) label.add_css_class("subtitle") remote_check = Gtk.CheckButton() remote_row.add_suffix(label) remote_row.add_suffix(remote_check) remote_row.set_activatable_widget(remote_check) - remote_check.connect("toggled", self.remoteCheckHandler, install_type, name) + self.remote_checkboxes.append(remote_check) remote_check.set_active(True) + self.remotes_expander_switch = Gtk.Switch(valign=Gtk.Align.CENTER) + self.remotes_expander_switch.connect("state-set", self.remotesEnableHandler) + self.remotes_expander.add_suffix(self.remotes_expander_switch) + + self.runtime_checkboxes = [] + for i in range(len(dependant_runtimes)): + current = dependant_runtimes[i] + runtime_row = Adw.ActionRow(title=current) + runtime_check = Gtk.CheckButton() + runtime_check.connect("toggled", self.runtimeCheckHandler, current) + runtime_check.set_active(True) + self.runtime_checkboxes.append(runtime_check) + runtime_row.add_suffix(runtime_check) + runtime_row.set_activatable_widget(runtime_check) + self.runtimes_expander.add_row(runtime_row) + self.runtimes_expander_switch = Gtk.Switch(valign=Gtk.Align.CENTER) + self.runtimes_expander_switch.connect("state-set", self.runtimesEnableHandler) + self.runtimes_expander.add_suffix(self.runtimes_expander_switch) + + def setHas_apply_button_been_clicked(self, is_clicked): + self.has_apply_button_been_clicked = is_clicked + + def disableFilterToggle(self, _widget): + print(self.has_apply_button_been_clicked) + self.app_window.filter_button.set_active(self.has_apply_button_been_clicked) def __init__(self, main_window, **kwargs): super().__init__(**kwargs) @@ -72,9 +149,11 @@ class FilterWindow(Adw.Window): # Create Variables self.my_utils = myUtils(self) self.host_remotes = self.my_utils.getHostRemotes() - self.filter_list = [False, False, [], []] + self.host_flatpaks = main_window.host_flatpaks + self.filter_list = [False, False, [], [], []] event_controller = Gtk.EventControllerKey() self.app_window = main_window + self.has_apply_button_been_clicked = False # Window Things self.set_transient_for(main_window) @@ -82,11 +161,14 @@ class FilterWindow(Adw.Window): # Connections self.apply_button.connect("clicked", lambda *_: main_window.applyFilter(self.filter_list)) + self.apply_button.connect("clicked", lambda *_: self.setHas_apply_button_been_clicked(True)) self.apply_button.connect("clicked", lambda *_: self.close()) - self.cancel_button.connect("clicked", lambda *_: main_window.filter_button.set_active(False)) + #self.cancel_button.connect("clicked", lambda *_: main_window.filter_button.set_active(False)) self.cancel_button.connect("clicked", lambda *_: self.close()) + self.connect("close-request", self.disableFilterToggle) + self.apps_switch.connect("state-set", self.appsHandler) self.runtimes_switch.connect("state-set", self.runtimesHandler) event_controller.connect("key-pressed", self.key_handler) @@ -97,9 +179,10 @@ class FilterWindow(Adw.Window): if not self.host_remotes[0][0] == '': self.generateList() else: - self.header_label.set_visible(False) - self.remotes_list.set_visible(False) + self.remotes_expander.set_visible(False) + self.runtimes_expander.set_visible(False) self.filter_list[2] = "all" self.filter_list[3] = "all" + self.filter_list[4] = "all" diff --git a/src/window.py b/src/window.py index 90b68fa..c96b3b7 100644 --- a/src/window.py +++ b/src/window.py @@ -467,14 +467,15 @@ class WarehouseWindow(Adw.ApplicationWindow): self.filter_button.set_active(not self.filter_button.get_active()) def resetFilterList(self): - self.filter_list = [True, False, ["all"], ["all"]] + self.filter_list = [True, False, ["all"], ["all"], ["all"]] - def applyFilter(self, filter=[True, False, ["all"], ["all"]]): + def applyFilter(self, filter=[True, False, ["all"], ["all"], ["all"]]): self.filter_list = filter show_apps = filter[0] show_runtimes = filter[1] filter_install_type = filter[2] filter_remotes_list = filter[3] + filter_runtimes_list = filter[4] total_visible = 0 for i in range(len(self.flatpak_rows)): @@ -486,10 +487,13 @@ class WarehouseWindow(Adw.ApplicationWindow): if (not show_runtimes) and "runtime" in self.flatpak_rows[i][6][12]: self.flatpak_rows[i][0] = False - if (not 'all' in filter_install_type) and (not self.host_flatpaks[i][7] in filter_install_type): + if (not 'all' in filter_install_type) and (not self.flatpak_rows[i][6][7] in filter_install_type): self.flatpak_rows[i][0] = False - if (not 'all' in filter_remotes_list) and (not self.host_flatpaks[i][6] in filter_remotes_list): + if (not 'all' in filter_remotes_list) and (not self.flatpak_rows[i][6][6] in filter_remotes_list): + self.flatpak_rows[i][0] = False + + if (not 'all' in filter_runtimes_list) and (not self.flatpak_rows[i][6][13] in filter_runtimes_list): self.flatpak_rows[i][0] = False self.flatpak_rows[i][2].set_visible(self.flatpak_rows[i][0]) @@ -508,7 +512,7 @@ class WarehouseWindow(Adw.ApplicationWindow): def __init__(self, **kwargs): super().__init__(**kwargs) self.my_utils = myUtils(self) - self.filter_list = [True, False, ["all"], ["all"]] + self.filter_list = [True, False, ["all"], ["all"], ["all"]] self.host_flatpaks = self.my_utils.getHostFlatpaks() self.set_size_request(0, 230) self.settings = Gio.Settings.new("io.github.flattool.Warehouse")