Files
pilot/gnome-pilot-extension/extension.js
2026-01-10 20:24:11 +01:00

179 lines
5.2 KiB
JavaScript

// extension.js - Point d'entrée principal de l'extension Pilot Control
// Compatible avec GNOME Shell 45+
import GObject from 'gi://GObject';
import St from 'gi://St';
import Gio from 'gi://Gio';
import GLib from 'gi://GLib';
import * as Main from 'resource:///org/gnome/shell/ui/main.js';
import * as PanelMenu from 'resource:///org/gnome/shell/ui/panelMenu.js';
import * as PopupMenu from 'resource:///org/gnome/shell/ui/popupMenu.js';
import {Extension} from 'resource:///org/gnome/shell/extensions/extension.js';
import {YamlConfig} from './yamlConfig.js';
import {PilotWindow} from './ui/pilotWindow.js';
import {ServiceManager} from './serviceManager.js';
/**
* Bouton dans le panel GNOME Shell
*/
const PilotIndicator = GObject.registerClass(
class PilotIndicator extends PanelMenu.Button {
_init(extension) {
super._init(0.0, 'Pilot Control');
this._extension = extension;
this._yamlConfig = new YamlConfig();
this._serviceManager = new ServiceManager();
this._window = null;
// Icône dans le panel
const icon = new St.Icon({
icon_name: 'computer-symbolic',
style_class: 'system-status-icon',
});
this.add_child(icon);
// Menu items
this._buildMenu();
// Charger la config au démarrage
this._loadConfig();
}
/**
* Construit le menu déroulant
*/
_buildMenu() {
// Status du service
this._statusItem = new PopupMenu.PopupMenuItem('Status: Unknown', {
reactive: false,
});
this.menu.addMenuItem(this._statusItem);
this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
// Bouton pour ouvrir la fenêtre principale
const openWindowItem = new PopupMenu.PopupMenuItem('Open Control Panel');
openWindowItem.connect('activate', () => {
this._openMainWindow();
});
this.menu.addMenuItem(openWindowItem);
this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
// Actions rapides
const startServiceItem = new PopupMenu.PopupMenuItem('Start Service');
startServiceItem.connect('activate', () => {
this._serviceManager.startService();
this._updateStatus();
});
this.menu.addMenuItem(startServiceItem);
const stopServiceItem = new PopupMenu.PopupMenuItem('Stop Service');
stopServiceItem.connect('activate', () => {
this._serviceManager.stopService();
this._updateStatus();
});
this.menu.addMenuItem(stopServiceItem);
const restartServiceItem = new PopupMenu.PopupMenuItem('Restart Service');
restartServiceItem.connect('activate', () => {
this._serviceManager.restartService();
this._updateStatus();
});
this.menu.addMenuItem(restartServiceItem);
this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
// Reload config
const reloadConfigItem = new PopupMenu.PopupMenuItem('Reload Config');
reloadConfigItem.connect('activate', () => {
this._loadConfig();
Main.notify('Pilot Control', 'Configuration reloaded');
});
this.menu.addMenuItem(reloadConfigItem);
}
/**
* Charge la configuration depuis le fichier YAML
*/
_loadConfig() {
const config = this._yamlConfig.load();
if (config) {
console.log('Pilot config loaded successfully');
this._updateStatus();
} else {
console.error('Failed to load Pilot config');
Main.notify('Pilot Control', 'Failed to load configuration');
}
}
/**
* Met à jour le status du service dans le menu
*/
_updateStatus() {
const isActive = this._serviceManager.isServiceActive();
const statusText = isActive ? 'Running' : 'Stopped';
const statusIcon = isActive ? '🟢' : '🔴';
this._statusItem.label.text = `Status: ${statusIcon} ${statusText}`;
}
/**
* Ouvre la fenêtre principale de contrôle
*/
_openMainWindow() {
if (this._window && !this._window.is_destroyed) {
this._window.present();
return;
}
this._window = new PilotWindow(
this._extension,
this._yamlConfig,
this._serviceManager
);
this._window.connect('destroy', () => {
this._window = null;
});
this._window.show();
}
/**
* Nettoyage lors de la destruction
*/
destroy() {
if (this._window && !this._window.is_destroyed) {
this._window.destroy();
}
super.destroy();
}
});
/**
* Extension principale
*/
export default class PilotExtension extends Extension {
enable() {
console.log('Enabling Pilot Control extension');
this._indicator = new PilotIndicator(this);
Main.panel.addToStatusArea(this.uuid, this._indicator);
}
disable() {
console.log('Disabling Pilot Control extension');
if (this._indicator) {
this._indicator.destroy();
this._indicator = null;
}
}
}