mirror of
				https://gitlab.gnome.org/julianschacher/top-bar-organizer.git
				synced 2025-10-27 15:19:09 +00:00 
			
		
		
		
	Refactor: Move AppIndicator/KStatusNotifierItem logic into an own class
Move the AppIndicator/KStatusNotifierItem logic (`handleAppIndicatorKStatusNotifierItemItem`, `createResolvedBoxOrder` and `_applicationRoleMap`) into an own class. Moving this logic into an own class makes the `Extension` class lighter. Introduce for the new file a new directory `src/extensionModules`.
This commit is contained in:
		
							parent
							
								
									1f8305a2f0
								
							
						
					
					
						commit
						158a4b584e
					
				
							
								
								
									
										116
									
								
								src/extension.js
									
									
									
									
									
								
							
							
						
						
									
										116
									
								
								src/extension.js
									
									
									
									
									
								
							| @ -20,20 +20,21 @@ | |||||||
| "use strict"; | "use strict"; | ||||||
| 
 | 
 | ||||||
| const ExtensionUtils = imports.misc.extensionUtils; | const ExtensionUtils = imports.misc.extensionUtils; | ||||||
|  | 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; | ||||||
|  | 
 | ||||||
| class Extension { | class Extension { | ||||||
|     constructor() { |     constructor() { | ||||||
|         this.settings = ExtensionUtils.getSettings(); |         this.settings = ExtensionUtils.getSettings(); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     enable() { |     enable() { | ||||||
|         // Create an application-role map for associating roles with
 |         // Create an instance of AppIndicatorKStatusNotifierItemManager to handle AppIndicator/KStatusNotifierItem items.
 | ||||||
|         // applications.
 |         this._appIndicatorKStatusNotifierItemManager = new AppIndicatorKStatusNotifierItemManager.AppIndicatorKStatusNotifierItemManager(); | ||||||
|         // This is needed to handle AppIndicator/KStatusNotifierItem items.
 |  | ||||||
|         this._applicationRoleMap = new Map(); |  | ||||||
| 
 | 
 | ||||||
|         this._addNewItemsToBoxOrders(); |         this._addNewItemsToBoxOrders(); | ||||||
|         this._orderTopBarItemsOfAllBoxes(); |         this._orderTopBarItemsOfAllBoxes(); | ||||||
| @ -146,17 +147,17 @@ class Extension { | |||||||
|                 switch (box) { |                 switch (box) { | ||||||
|                     case "left": |                     case "left": | ||||||
|                         boxOrder = this.settings.get_strv("left-box-order"); |                         boxOrder = this.settings.get_strv("left-box-order"); | ||||||
|                         this._handleAppIndicatorKStatusNotifierItemItem(indicator.container, role, boxOrder, boxOrders); |                         this._appIndicatorKStatusNotifierItemManager.handleAppIndicatorKStatusNotifierItemItem(indicator.container, role, boxOrder, boxOrders); | ||||||
|                         this.settings.set_strv("left-box-order", boxOrder); |                         this.settings.set_strv("left-box-order", boxOrder); | ||||||
|                         break; |                         break; | ||||||
|                     case "center": |                     case "center": | ||||||
|                         boxOrder = this.settings.get_strv("center-box-order"); |                         boxOrder = this.settings.get_strv("center-box-order"); | ||||||
|                         this._handleAppIndicatorKStatusNotifierItemItem(indicator.container, role, boxOrder, boxOrders); |                         this._appIndicatorKStatusNotifierItemManager.handleAppIndicatorKStatusNotifierItemItem(indicator.container, role, boxOrder, boxOrders); | ||||||
|                         this.settings.set_strv("center-box-order", boxOrder); |                         this.settings.set_strv("center-box-order", boxOrder); | ||||||
|                         break; |                         break; | ||||||
|                     case "right": |                     case "right": | ||||||
|                         boxOrder = this.settings.get_strv("right-box-order"); |                         boxOrder = this.settings.get_strv("right-box-order"); | ||||||
|                         this._handleAppIndicatorKStatusNotifierItemItem(indicator.container, role, boxOrder, boxOrders, true); |                         this._appIndicatorKStatusNotifierItemManager.handleAppIndicatorKStatusNotifierItemItem(indicator.container, role, boxOrder, boxOrders, true); | ||||||
|                         this.settings.set_strv("right-box-order", boxOrder); |                         this.settings.set_strv("right-box-order", boxOrder); | ||||||
|                         break; |                         break; | ||||||
|                 } |                 } | ||||||
| @ -164,9 +165,9 @@ class Extension { | |||||||
| 
 | 
 | ||||||
|             // Get the resolved box orders for all boxes.
 |             // Get the resolved box orders for all boxes.
 | ||||||
|             const resolvedBoxOrders = { |             const resolvedBoxOrders = { | ||||||
|                 left: this._createResolvedBoxOrder("left"), |                 left: this._appIndicatorKStatusNotifierItemManager.createResolvedBoxOrder(this.settings.get_strv("left-box-order")), | ||||||
|                 center: this._createResolvedBoxOrder("center"), |                 center: this._appIndicatorKStatusNotifierItemManager.createResolvedBoxOrder(this.settings.get_strv("center-box-order")), | ||||||
|                 right: this._createResolvedBoxOrder("right"), |                 right: this._appIndicatorKStatusNotifierItemManager.createResolvedBoxOrder(this.settings.get_strv("right-box-order")), | ||||||
|             }; |             }; | ||||||
|             // Also get the restricted valid box order of the target box.
 |             // Also get the restricted valid box order of the target box.
 | ||||||
|             const restrictedValidBoxOrderOfTargetBox = this._createRestrictedValidBoxOrder(box); |             const restrictedValidBoxOrderOfTargetBox = this._createRestrictedValidBoxOrder(box); | ||||||
| @ -346,7 +347,7 @@ class Extension { | |||||||
| 
 | 
 | ||||||
|                 // Handle an AppIndicator/KStatusNotifierItem item differently.
 |                 // Handle an AppIndicator/KStatusNotifierItem item differently.
 | ||||||
|                 if (associatedRole.startsWith("appindicator-")) { |                 if (associatedRole.startsWith("appindicator-")) { | ||||||
|                     this._handleAppIndicatorKStatusNotifierItemItem(indicatorContainer, associatedRole, boxOrder, boxOrders, box === "right"); |                     this._appIndicatorKStatusNotifierItemManager.handleAppIndicatorKStatusNotifierItemItem(indicatorContainer, associatedRole, boxOrder, boxOrders, box === "right"); | ||||||
|                     continue; |                     continue; | ||||||
|                 } |                 } | ||||||
| 
 | 
 | ||||||
| @ -386,7 +387,7 @@ class Extension { | |||||||
|      */ |      */ | ||||||
|     _createValidBoxOrder(box) { |     _createValidBoxOrder(box) { | ||||||
|         // Get a resolved box order.
 |         // Get a resolved box order.
 | ||||||
|         let boxOrder = this._createResolvedBoxOrder(box); |         let boxOrder = this._appIndicatorKStatusNotifierItemManager.createResolvedBoxOrder(this.settings.get_strv(`${box}-box-order`)); | ||||||
| 
 | 
 | ||||||
|         // Get the indicator containers (of the items) currently present in the
 |         // Get the indicator containers (of the items) currently present in the
 | ||||||
|         // Gnome Shell top bar.
 |         // Gnome Shell top bar.
 | ||||||
| @ -436,7 +437,7 @@ class Extension { | |||||||
|         // Get a resolved box order and get the indicator containers (of the
 |         // Get a resolved box order and get the indicator containers (of the
 | ||||||
|         // items) which are currently present in the Gnome Shell top bar in the
 |         // items) which are currently present in the Gnome Shell top bar in the
 | ||||||
|         // specified box.
 |         // specified box.
 | ||||||
|         let boxOrder = this._createResolvedBoxOrder(box); |         let boxOrder = this._appIndicatorKStatusNotifierItemManager.createResolvedBoxOrder(this.settings.get_strv(`${box}-box-order`)); | ||||||
|         let boxIndicatorContainers; |         let boxIndicatorContainers; | ||||||
|         switch (box) { |         switch (box) { | ||||||
|             case "left": |             case "left": | ||||||
| @ -532,95 +533,6 @@ class Extension { | |||||||
|         // of an outdated box order, it would be wise, if the caller updated the
 |         // of an outdated box order, it would be wise, if the caller updated the
 | ||||||
|         // box order now to include the items present in the top bar.
 |         // box order now to include the items present in the top bar.
 | ||||||
|     } |     } | ||||||
| 
 |  | ||||||
|     /** |  | ||||||
|      * 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.
 |  | ||||||
|         const application = indicatorContainer.get_child()._indicator.id; |  | ||||||
| 
 |  | ||||||
|         // 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 placeholder can be replaced with the relevant roles
 |  | ||||||
|         // 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 returns a box order for the specified box, where the |  | ||||||
|      * placeholders are replaced with the relevant roles. |  | ||||||
|      * @param {string} box - The box of which to get the resolved box order. |  | ||||||
|      */ |  | ||||||
|     _createResolvedBoxOrder(box) { |  | ||||||
|         const boxOrder = this.settings.get_strv(`${box}-box-order`); |  | ||||||
| 
 |  | ||||||
|         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; |  | ||||||
|     } |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| function init() { | function init() { | ||||||
|  | |||||||
							
								
								
									
										121
									
								
								src/extensionModules/AppIndicatorKStatusNotifierItemManager.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										121
									
								
								src/extensionModules/AppIndicatorKStatusNotifierItemManager.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,121 @@ | |||||||
|  | /* | ||||||
|  |  * This file is part of Top-Bar-Organizer (a Gnome Shell Extension for | ||||||
|  |  * organizing your Gnome Shell top bar). | ||||||
|  |  * Copyright (C) 2021 Julian Schacher | ||||||
|  |  * | ||||||
|  |  * Top-Bar-Organizer is free software: you can redistribute it and/or modify | ||||||
|  |  * it under the terms of the GNU General Public License as published by | ||||||
|  |  * the Free Software Foundation, either version 3 of the License, or | ||||||
|  |  * (at your option) any later version. | ||||||
|  |  * | ||||||
|  |  * This program is distributed in the hope that it will be useful, | ||||||
|  |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||||
|  |  * GNU General Public License for more details. | ||||||
|  |  * | ||||||
|  |  * You should have received a copy of the GNU General Public License | ||||||
|  |  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
 | ||||||
|  |  */ | ||||||
|  | /* exported AppIndicatorKStatusNotifierItemManager */ | ||||||
|  | "use strict"; | ||||||
|  | 
 | ||||||
|  | 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.
 | ||||||
|  |         const application = indicatorContainer.get_child()._indicator.id; | ||||||
|  | 
 | ||||||
|  |         // 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; | ||||||
|  |     } | ||||||
|  | }; | ||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user