diff --git a/data/ui/prefs-box-order-item-options-dialog.ui b/data/ui/prefs-box-order-item-options-dialog.ui
new file mode 100644
index 0000000..d953d24
--- /dev/null
+++ b/data/ui/prefs-box-order-item-options-dialog.ui
@@ -0,0 +1,38 @@
+
+
+
+
+ 640
+
+
+
+
+
diff --git a/data/ui/prefs-box-order-item-row.ui b/data/ui/prefs-box-order-item-row.ui
index 0debab6..dd06b32 100644
--- a/data/ui/prefs-box-order-item-row.ui
+++ b/data/ui/prefs-box-order-item-row.ui
@@ -46,6 +46,12 @@
row.move-down
+
+ -
+ Options
+ row.options
+
+
-
Forget
diff --git a/src/prefsModules/PrefsBoxOrderItemOptionsDialog.ts b/src/prefsModules/PrefsBoxOrderItemOptionsDialog.ts
new file mode 100644
index 0000000..e3d87d6
--- /dev/null
+++ b/src/prefsModules/PrefsBoxOrderItemOptionsDialog.ts
@@ -0,0 +1,58 @@
+"use strict";
+
+import GObject from "gi://GObject";
+import Adw from "gi://Adw";
+import GLib from "gi://GLib";
+import type Gio from "gi://Gio";
+import type Gtk from "gi://Gtk";
+
+import { ExtensionPreferences } from "resource:///org/gnome/Shell/Extensions/js/extensions/prefs.js";
+
+export default class PrefsBoxOrderItemOptionsDialog extends Adw.Dialog {
+ static {
+ GObject.registerClass({
+ GTypeName: "PrefsBoxOrderItemOptionsDialog",
+ Template: GLib.uri_resolve_relative(import.meta.url, "../ui/prefs-box-order-item-options-dialog.ui", GLib.UriFlags.NONE),
+ InternalChildren: [
+ "visibility-row",
+ ],
+ }, this);
+ }
+
+ declare _visibility_row: Adw.ComboRow;
+ #settings: Gio.Settings;
+ item: string;
+
+ constructor(params = {}, item: string) {
+ super(params);
+
+ // Associate `this` with an item.
+ this.item = item;
+ // Load the settings.
+ this.#settings = ExtensionPreferences.lookupByURL(import.meta.url)!.getSettings();
+ }
+
+ onVisibilityRowSelectionChanged(): void {
+ const visibility = (this._visibility_row.get_selected_item() as Gtk.StringObject).get_string();
+ const itemsToHide = new Set(this.#settings.get_strv("hide"));
+ const itemsToShow = new Set(this.#settings.get_strv("show"));
+
+ switch (visibility) {
+ case "Forcefully Hide":
+ itemsToHide.add(this.item)
+ itemsToShow.delete(this.item);
+ break;
+ case "Forcefully Show":
+ itemsToHide.delete(this.item)
+ itemsToShow.add(this.item);
+ break;
+ case "Default":
+ itemsToHide.delete(this.item)
+ itemsToShow.delete(this.item);
+ break;
+ }
+
+ this.#settings.set_strv("hide", Array.from(itemsToHide));
+ this.#settings.set_strv("show", Array.from(itemsToShow));
+ }
+}
diff --git a/src/prefsModules/PrefsBoxOrderItemRow.ts b/src/prefsModules/PrefsBoxOrderItemRow.ts
index fa691f8..3da4d6b 100644
--- a/src/prefsModules/PrefsBoxOrderItemRow.ts
+++ b/src/prefsModules/PrefsBoxOrderItemRow.ts
@@ -6,6 +6,7 @@ import GObject from "gi://GObject";
import Adw from "gi://Adw";
import GLib from "gi://GLib";
+import PrefsBoxOrderItemOptionsDialog from "./PrefsBoxOrderItemOptionsDialog.js";
import type PrefsBoxOrderListBox from "./PrefsBoxOrderListBox.js";
export default class PrefsBoxOrderItemRow extends Adw.ActionRow {
@@ -25,6 +26,15 @@ export default class PrefsBoxOrderItemRow extends Adw.ActionRow {
parentListBox.saveBoxOrderToSettings();
parentListBox.determineRowMoveActionEnable();
});
+ this.install_action("row.options", null, (self, _actionName, _param) => {
+ const itemOptionsDialog = new PrefsBoxOrderItemOptionsDialog({
+ // Get the title from self as the constructor of
+ // PrefsBoxOrderItemRow already processes the item name into a
+ // nice title.
+ title: (self as PrefsBoxOrderItemRow).get_title()
+ }, (self as PrefsBoxOrderItemRow).item);
+ itemOptionsDialog.present(self);
+ });
this.install_action("row.move-up", null, (self, _actionName, _param) => self.emit("move", "up"));
this.install_action("row.move-down", null, (self, _actionName, _param) => self.emit("move", "down"));
}