mirror of
https://gitlab.gnome.org/julianschacher/top-bar-organizer.git
synced 2025-10-27 23:29:08 +00:00
Refactor: Merge AppIndi.KStat.ItemManager code into BoxOrderManager
Let `BoxOrderManager` do the relevant work itself and get rid of `AppIndicatorKStatusNotifierItemManager`. This is also in preparation to make the addition of AppIndicator/KStatusNotifierItem items work again.
This commit is contained in:
parent
59d5665661
commit
644656d93a
@ -7,7 +7,6 @@ const Me = ExtensionUtils.getCurrentExtension();
|
|||||||
const Main = imports.ui.main;
|
const Main = imports.ui.main;
|
||||||
const Panel = imports.ui.panel;
|
const Panel = imports.ui.panel;
|
||||||
|
|
||||||
const AppIndicatorKStatusNotifierItemManager = Me.imports.extensionModules.AppIndicatorKStatusNotifierItemManager;
|
|
||||||
const BoxOrderManager = Me.imports.extensionModules.BoxOrderManager;
|
const BoxOrderManager = Me.imports.extensionModules.BoxOrderManager;
|
||||||
|
|
||||||
class Extension {
|
class Extension {
|
||||||
@ -17,11 +16,7 @@ class Extension {
|
|||||||
enable() {
|
enable() {
|
||||||
this.settings = ExtensionUtils.getSettings();
|
this.settings = ExtensionUtils.getSettings();
|
||||||
|
|
||||||
// Create an instance of AppIndicatorKStatusNotifierItemManager to
|
this._boxOrderManager = new BoxOrderManager.BoxOrderManager();
|
||||||
// handle AppIndicator/KStatusNotifierItem items.
|
|
||||||
this._appIndicatorKStatusNotifierItemManager = new AppIndicatorKStatusNotifierItemManager.AppIndicatorKStatusNotifierItemManager();
|
|
||||||
|
|
||||||
this._boxOrderManager = new BoxOrderManager.BoxOrderManager(this._appIndicatorKStatusNotifierItemManager);
|
|
||||||
|
|
||||||
// Stuff to do on startup(extension enable).
|
// Stuff to do on startup(extension enable).
|
||||||
this._boxOrderManager.saveNewTopBarItems();
|
this._boxOrderManager.saveNewTopBarItems();
|
||||||
|
|||||||
@ -1,107 +0,0 @@
|
|||||||
"use strict";
|
|
||||||
/* exported AppIndicatorKStatusNotifierItemManager */
|
|
||||||
|
|
||||||
var AppIndicatorKStatusNotifierItemManager = class AppIndicatorKStatusNotifierItemManager {
|
|
||||||
constructor() {
|
|
||||||
// Create an application-role map for associating roles with
|
|
||||||
// applications.
|
|
||||||
// This is needed so that this class can handle/manage
|
|
||||||
// AppIndicator/KStatusNotifierItem items.
|
|
||||||
this._applicationRoleMap = new Map();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Handle an AppIndicator/KStatusNotifierItem item.
|
|
||||||
*
|
|
||||||
* This function basically does the following two things:
|
|
||||||
* - Associate the role of the given item with the application of the
|
|
||||||
* AppIndicator/KStatusNotifierItem.
|
|
||||||
* - Add a placeholder for the roles associated with the application of the
|
|
||||||
* AppIndiciator/KStatusNotifierItem to the box order, if needed.
|
|
||||||
*
|
|
||||||
* Note: The caller is responsible for saving the updated box order to
|
|
||||||
* settings.
|
|
||||||
* @param {} indicatorContainer - The container of the indicator of the
|
|
||||||
* AppIndicator/KStatusNotifierItem item.
|
|
||||||
* @param {string} role - The role of the AppIndicator/KStatusNotifierItem
|
|
||||||
* item.
|
|
||||||
* @param {string[]} - The box order the placeholder should be added to, if
|
|
||||||
* needed.
|
|
||||||
* @param {BoxOrders} boxOrders - An object containing the box orders, which
|
|
||||||
* is currently getting worked on.
|
|
||||||
* @param {boolean} - Whether to add the placeholder to the beginning of the
|
|
||||||
* box order.
|
|
||||||
*/
|
|
||||||
handleAppIndicatorKStatusNotifierItemItem(indicatorContainer, role, boxOrder, boxOrders, atToBeginning = false) {
|
|
||||||
// Get the application the AppIndicator/KStatusNotifierItem is
|
|
||||||
// associated with.
|
|
||||||
let application = indicatorContainer.get_child()._indicator.id;
|
|
||||||
|
|
||||||
// Since the Dropbox client appends its PID to the id, drop the PID and
|
|
||||||
// the hyphen before it.
|
|
||||||
if (application.startsWith("dropbox-client-")) application = "dropbox-client";
|
|
||||||
|
|
||||||
// Associate the role with the application.
|
|
||||||
let roles = this._applicationRoleMap.get(application);
|
|
||||||
if (roles) {
|
|
||||||
// If the application already has an array of associated roles, just
|
|
||||||
// add the role to it, if needed.
|
|
||||||
if (!roles.includes(role)) roles.push(role);
|
|
||||||
} else {
|
|
||||||
// Otherwise create a new array.
|
|
||||||
this._applicationRoleMap.set(application, [ role ]);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Store a placeholder for the roles associated with the application in
|
|
||||||
// the box order, if needed.
|
|
||||||
// (Then later the `this.createResolvedBoxOrder` method can be used to
|
|
||||||
// get a box order, where the placeholder/s get/s replaced with the
|
|
||||||
// relevant roles (by using `this._applicationRoleMap`).)
|
|
||||||
const placeholder = `appindicator-kstatusnotifieritem-${application}`;
|
|
||||||
if (!boxOrders.left.includes(placeholder)
|
|
||||||
&& !boxOrders.center.includes(placeholder)
|
|
||||||
&& !boxOrders.right.includes(placeholder)) {
|
|
||||||
if (atToBeginning) {
|
|
||||||
boxOrder.unshift(placeholder);
|
|
||||||
} else {
|
|
||||||
boxOrder.push(placeholder);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This function takes a box order and returns a box order, where all
|
|
||||||
* placeholders got replaced with their relevant roles.
|
|
||||||
* @param {string[]} boxOrder - The box order of which to replace the
|
|
||||||
* placeholders.
|
|
||||||
* @returns {string[]} A resolved box order, where all placeholders got
|
|
||||||
* replaced with their relevant roles.
|
|
||||||
*/
|
|
||||||
createResolvedBoxOrder(boxOrder) {
|
|
||||||
let resolvedBoxOrder = [ ];
|
|
||||||
for (const item of boxOrder) {
|
|
||||||
// If the item isn't a placeholder, just add it to the new resolved
|
|
||||||
// box order.
|
|
||||||
if (!item.startsWith("appindicator-kstatusnotifieritem-")) {
|
|
||||||
resolvedBoxOrder.push(item);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// If the item is a placeholder, replace it.
|
|
||||||
// First get the application this placeholder is associated with.
|
|
||||||
const application = item.replace("appindicator-kstatusnotifieritem-", "");
|
|
||||||
|
|
||||||
// Then get the roles associated with the application.
|
|
||||||
let roles = this._applicationRoleMap.get(application);
|
|
||||||
|
|
||||||
// Continue, if there are no roles.
|
|
||||||
if (!roles) continue;
|
|
||||||
// Otherwise add the roles
|
|
||||||
for (const role of roles) {
|
|
||||||
resolvedBoxOrder.push(role);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return resolvedBoxOrder;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
@ -21,18 +21,86 @@ const Main = imports.ui.main;
|
|||||||
* It's basically a heavy wrapper around the box orders stored in the settings.
|
* It's basically a heavy wrapper around the box orders stored in the settings.
|
||||||
*/
|
*/
|
||||||
var BoxOrderManager = class BoxOrderManager {
|
var BoxOrderManager = class BoxOrderManager {
|
||||||
/**
|
constructor() {
|
||||||
* @param {AppIndicatorKStatusNotifierItemManager}
|
this._appIndicatorItemApplicationRoleMap = new Map();
|
||||||
* appIndicatorKStatusNotifierItemManager - An instance of
|
|
||||||
* AppIndicatorKStatusNotifierItemManager to be used in the methods of
|
|
||||||
* `this`.
|
|
||||||
*/
|
|
||||||
constructor(appIndicatorKStatusNotifierItemManager) {
|
|
||||||
this._appIndicatorKStatusNotifierItemManager = appIndicatorKStatusNotifierItemManager;
|
|
||||||
|
|
||||||
this._settings = ExtensionUtils.getSettings();
|
this._settings = ExtensionUtils.getSettings();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handles an AppIndicator/KStatusNotifierItem item by associating the role
|
||||||
|
* of the given item with the application of the
|
||||||
|
* AppIndicator/KStatusNotifier item and returning a placeholder role.
|
||||||
|
* @param {string} indicatorContainer - The container of the indicator of the
|
||||||
|
* AppIndicator/KStatusNotifierItem item.
|
||||||
|
* @param {string} role - The role of the AppIndicator/KStatusNotifierItem
|
||||||
|
* item.
|
||||||
|
* @returns {string} The placeholder role.
|
||||||
|
*/
|
||||||
|
#handleAppIndicatorItem(indicatorContainer, role) {
|
||||||
|
let application = indicatorContainer.get_child()._indicator.id;
|
||||||
|
|
||||||
|
// Since the Dropbox client appends its PID to the id, drop the PID and
|
||||||
|
// the hyphen before it.
|
||||||
|
if (application.startsWith("dropbox-client-")) {
|
||||||
|
application = "dropbox-client";
|
||||||
|
}
|
||||||
|
|
||||||
|
// Associate the role with the application.
|
||||||
|
let roles = this._appIndicatorItemApplicationRoleMap.get(application);
|
||||||
|
if (roles) {
|
||||||
|
// If the application already has an array of associated roles, just
|
||||||
|
// add the role to it, if needed.
|
||||||
|
if (!roles.includes(role)) {
|
||||||
|
roles.push(role);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// Otherwise create a new array.
|
||||||
|
this._appIndicatorItemApplicationRoleMap.set(application, [ role ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Return the placeholder.
|
||||||
|
// A box order containing this placeholder can later be resolved to
|
||||||
|
// relevant roles using `#resolveAppIndicatorPlaceholders`.
|
||||||
|
return `appindicator-kstatusnotifieritem-${application}`;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Takes a box order and replaces AppIndicator placeholder roles with
|
||||||
|
* actual roles.
|
||||||
|
* @param {string[]} - The box order of which to replace placeholder roles.
|
||||||
|
* @returns {string[]} - A box order with all placeholder roles
|
||||||
|
* resolved/replaced to/with actual roles.
|
||||||
|
*/
|
||||||
|
#resolveAppIndicatorPlaceholders(boxOrder) {
|
||||||
|
let resolvedBoxOrder = [ ];
|
||||||
|
for (const role of boxOrder) {
|
||||||
|
// If the role isn't a placeholder, just add it to the resolved box
|
||||||
|
// order.
|
||||||
|
if (!role.startsWith("appindicator-kstatusnotifieritem-")) {
|
||||||
|
resolvedBoxOrder.push(role);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// If the role is a placeholder, replace it.
|
||||||
|
// First get the application this placeholder is associated with.
|
||||||
|
const application = role.replace("appindicator-kstatusnotifieritem-", "");
|
||||||
|
|
||||||
|
// Then get the actual roles associated with this application.
|
||||||
|
let actualRoles = this._appIndicatorItemApplicationRoleMap.get(application);
|
||||||
|
|
||||||
|
// If there are no actual roles, continue.
|
||||||
|
if (!actualRoles) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Otherwise add the actual roles to the resolved box order.
|
||||||
|
resolvedBoxOrder.push(...actualRoles);
|
||||||
|
}
|
||||||
|
|
||||||
|
return resolvedBoxOrder;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This method returns a valid box order for the given top bar box.
|
* This method returns a valid box order for the given top bar box.
|
||||||
* This means it returns a box order, where only roles are included, which
|
* This means it returns a box order, where only roles are included, which
|
||||||
@ -47,7 +115,7 @@ var BoxOrderManager = class BoxOrderManager {
|
|||||||
*/
|
*/
|
||||||
createValidBoxOrder(box) {
|
createValidBoxOrder(box) {
|
||||||
// Get a resolved box order.
|
// Get a resolved box order.
|
||||||
let boxOrder = this._appIndicatorKStatusNotifierItemManager.createResolvedBoxOrder(this._settings.get_strv(`${box}-box-order`));
|
let boxOrder = this.#resolveAppIndicatorPlaceholders(this._settings.get_strv(`${box}-box-order`));
|
||||||
|
|
||||||
// ToDo: simplify.
|
// ToDo: simplify.
|
||||||
// Get the indicator containers (of the items) currently present in the
|
// Get the indicator containers (of the items) currently present in the
|
||||||
@ -111,13 +179,12 @@ var BoxOrderManager = class BoxOrderManager {
|
|||||||
for (const indicatorContainer of indicatorContainers) {
|
for (const indicatorContainer of indicatorContainers) {
|
||||||
// First get the role associated with the current indicator
|
// First get the role associated with the current indicator
|
||||||
// container.
|
// container.
|
||||||
const role = indicatorContainerRoleMap.get(indicatorContainer);
|
let role = indicatorContainerRoleMap.get(indicatorContainer);
|
||||||
if (!role) continue;
|
if (!role) continue;
|
||||||
|
|
||||||
// Handle an AppIndicator/KStatusNotifierItem item differently.
|
// Handle an AppIndicator/KStatusNotifierItem item differently.
|
||||||
if (role.startsWith("appindicator-")) {
|
if (role.startsWith("appindicator-")) {
|
||||||
this._appIndicatorKStatusNotifierItemManager.handleAppIndicatorKStatusNotifierItemItem(indicatorContainer, role, boxOrder, boxOrders, box === "right");
|
role = this.#handleAppIndicatorItem(indicatorContainer, role);
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add the role to the box order, if it isn't in in one already.
|
// Add the role to the box order, if it isn't in in one already.
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user