diff --git a/extension.js b/extension.js index 3d06e16..4b5cdf4 100644 --- a/extension.js +++ b/extension.js @@ -276,7 +276,7 @@ class Indicator extends PanelMenu.Button { }); } - createHeaderBin ( colName ) { + createHeaderBin ( colName, colSize = 50 ) { let col = column_definitions [ colName ]; let _box = new St.BoxLayout ( { vertical: false, @@ -305,7 +305,7 @@ class Indicator extends PanelMenu.Button { let _button = new St.Button ( { x_align: Clutter.ActorAlign.FILL, y_align: Clutter.ActorAlign.CENTER, - width: col.width, + width: colSize, reactive: true, can_focus: true, track_hover: true, @@ -319,7 +319,7 @@ class Indicator extends PanelMenu.Button { let _bin = new St.Bin({ style_class: 'monito-service', - width: col.width, + width: colSize, x_expand: col.expand, child: _button, }); @@ -327,7 +327,7 @@ class Indicator extends PanelMenu.Button { return _bin; } - createBin ( status, text, col ) { + createBin ( status, text, colSize = 50, col ) { let _child; if ( text === undefined ) @@ -339,7 +339,7 @@ class Indicator extends PanelMenu.Button { reactive: true, can_focus: true, track_hover: true, - width: col.width, + width: colSize, text: text.toString().replace(/\n.*/s, ''), x_align: ( col.align ? col.align : Clutter.ActorAlign.START ), style: ( col.style ? col.style : '' ) } ); @@ -351,7 +351,7 @@ class Indicator extends PanelMenu.Button { { _child = new St.BoxLayout ( { x_expand: true, vertical: false, - width: col.width, } ); + width: colSize, } ); if ( this.serverLogic.canRecheck ) { @@ -363,7 +363,7 @@ class Indicator extends PanelMenu.Button { let _bin = new St.Bin({ track_hover: true, - width: col.width, + width: colSize, x_expand: col.expand, child: _child, }); @@ -421,10 +421,8 @@ class Indicator extends PanelMenu.Button { }); this._box.add_child(headerBox); - let _columns = Preferences.getColumns ( this.server ); - for ( let _col of _columns ) - headerBox.add_child ( this.createHeaderBin ( _col ) ); - headerBox.add_child ( this.createHeaderBin ( 'actions' ) ); + for ( let _col of Preferences.getColumns ( this.server ) ) + headerBox.add_child ( this.createHeaderBin ( _col.name, _col.size ) ); let scrollBox = new St.ScrollView ( { hscrollbar_policy: St.PolicyType.NEVER, enable_mouse_scrolling: true, } ); @@ -465,30 +463,28 @@ class Indicator extends PanelMenu.Button { }); tableBox.add_child(infoBox); - let _columns = Preferences.getColumns ( this.server ); - for ( let _col of _columns ) + for ( let _col of Preferences.getColumns ( this.server ) ) { - entry [ 'real_' + _col ] = entry [ _col ]; - if ( _col == 'host_name' && this.account_settings.get_string ( 'host-match' ) ) - entry [ _col ] = entry [ _col ] . replace ( new RegExp ( this.account_settings.get_string ( 'host-match' ), 'i' ), + entry [ 'real_' + _col.name ] = entry [ _col.name ]; + if ( _col.name == 'host_name' && this.account_settings.get_string ( 'host-match' ) ) + entry [ _col.name ] = entry [ _col.name ] . replace ( new RegExp ( this.account_settings.get_string ( 'host-match' ), 'i' ), this.account_settings.get_string ( 'host-replace' ) ); - else if ( _col == 'service_display_name' && this.account_settings.get_string ( 'service-match' ) ) - entry [ _col ] = entry [ _col ] . replace ( new RegExp ( this.account_settings.get_string ( 'service-match' ), 'i' ), + else if ( _col.name == 'service_display_name' && this.account_settings.get_string ( 'service-match' ) ) + entry [ _col.name ] = entry [ _col.name ] . replace ( new RegExp ( this.account_settings.get_string ( 'service-match' ), 'i' ), this.account_settings.get_string ( 'service-replace' ) ); - else if ( _col == 'status_information' && this.account_settings.get_string ( 'status-info-match' ) ) - entry [ _col ] = entry [ _col ] . replace ( new RegExp ( this.account_settings.get_string ( 'status-info-match' ), 'i' ), + else if ( _col.name == 'status_information' && this.account_settings.get_string ( 'status-info-match' ) ) + entry [ _col.name ] = entry [ _col.name ] . replace ( new RegExp ( this.account_settings.get_string ( 'status-info-match' ), 'i' ), this.account_settings.get_string ( 'status-info-replace' ) ) . replace ( new RegExp ( "\\n.*" ), "" ); - else if ( _col == 'has_been_acknowledged' ) + else if ( _col.name == 'has_been_acknowledged' ) { - if ( entry [ _col ] ) - entry [ _col ] = '✔'; + if ( entry [ _col.name ] ) + entry [ _col.name ] = '✔'; else - entry [ _col ] = ''; + entry [ _col.name ] = ''; } - infoBox.add_child ( this.createBin ( entry.status, entry [ _col ], column_definitions [ _col ] ) ); + infoBox.add_child ( this.createBin ( entry.status, entry [ _col.name ], _col.size, column_definitions [ _col.name ] ) ); } - infoBox.add_child ( this.createBin ( entry.status, entry, column_definitions [ 'actions' ] ) ); _row ++; } diff --git a/prefs.js b/prefs.js index d03c644..080a29d 100644 --- a/prefs.js +++ b/prefs.js @@ -44,6 +44,18 @@ const SETTINGS_SCHEMA_ACCOUNT = "org.gnome.shell.extensions.monito.account"; const SETTINGS_SCHEMA_ACCOUNT_PATH = "/org/gnome/shell/extensions/monito/account"; +const column_definitions = { + status: { label: _('Status'), width: 50, expand: false, }, + host_name: { label: _('Host name'), width: 300, expand: false, }, + service_display_name: { label: _('Service'), width: 300, expand: false, }, + has_been_acknowledged: { label: _('Ack'), width: 50, expand: false }, + last_check: { label: _('Last check'), width: 200, expand: false, type: 'date' }, + attempts: { label: _('Attempts'), width: 50, expand: false, }, + status_information: { label: _('Information'), width: 600, expand: false, }, + actions: { label: 'Actions', width: 50, expand: false, special: 'actions' }, +}; + + const prefs = [ { type: Gtk.Switch, category: 'Settings', label: _('Active (restart for effect)'), key: 'active', align: Gtk.Align.START }, { type: Gtk.Entry, category: 'Settings', label: _('Name'), key: 'name' }, @@ -246,7 +258,11 @@ function setSortOrder ( server, sort_order ) function getColumns ( server ) { - return this.getAccountSettings ( server ) . get_strv ( 'columns' ); + let _columns = this.getAccountSettings ( server ) . get_strv ( 'columns' ); + let _columnsSizes = this.getAccountSettings ( server ) . get_strv ( 'columns-size' ); + const zip = (a1, a2) => a1.map((x, i) => { return { name: x, size: a2[i] } } ); + let _result = zip ( _columns, _columnsSizes ); + return _result; } @@ -371,18 +387,21 @@ function createColumnsPrefTab ( noteBook, type, isActive ) vexpand: true }); let columnNumbers = new Gtk.TreeViewColumn ( { title: _("Column") } ); - let rendererNumbers = new Gtk.CellRendererCombo ( { editable: true } ); - rendererNumbers.col = 0; + this.ColumnNameRenderer = new Gtk.CellRendererCombo ( { editable: true, + has_entry: false, + text_column: 0 } ); + this.ColumnNameRenderer.col = 0; if ( this.gtkVersion == 4 ) - columnNumbers.append(rendererNumbers, true); + columnNumbers.append(this.ColumnNameRenderer, true); else - columnNumbers.pack_start(rendererNumbers, true); - columnNumbers.add_attribute(rendererNumbers, 'text', 0); + columnNumbers.pack_start(this.ColumnNameRenderer, true); + columnNumbers.add_attribute(this.ColumnNameRenderer, 'text', 0); this.treeView.append_column(columnNumbers); - rendererNumbers.connect('edited', Lang.bind ( this, this.editColumn ) ); + this.ColumnNameRenderer.connect('edited', Lang.bind ( this, this.editColumn ) ); let _colSize = new Gtk.TreeViewColumn ( { title: _("Size") } ); - let _colRenderer = new Gtk.CellRendererText ( { editable: true } ); + let _colRenderer = new Gtk.CellRendererSpin ( { adjustment: new Gtk.Adjustment ( { lower: 0, upper: 999, step_increment: 1, page_increment: 10 } ), + editable: true } ); if ( this.gtkVersion == 4 ) _colSize.append(_colRenderer, true); else @@ -426,12 +445,30 @@ function activateAccountRow ( ) { this.treeView.model = this.store; let _row = this.accountsChooser.get_selected_row(); - monitoLog('Active:' + _row.server); let _account_settings = getAccountSettings ( _row.server ); + this.columnsModel = new Gtk.ListStore ( ); + this.columnsModel.set_column_types([GObject.TYPE_STRING,GObject.TYPE_STRING]); + for ( let [ _colName, _colDef ] of Object.entries(column_definitions) ) + { + let _iter = this.columnsModel.append(); + this.columnsModel.set_value(_iter, 0, _colName ); + this.columnsModel.set_value(_iter, 1, _colDef.label ); + } + this.ColumnNameRenderer.model = this.columnsModel; + if ( ! _account_settings ) return; + let _columns = _account_settings . get_strv ( 'columns' ); + let _columnsSizes = _account_settings . get_strv ( 'columns-size' ); + for ( var i in _columns ) + { + let _iter = this.store.append(); + this.store.set_value(_iter, 0, _columns [ i ] ); + this.store.set_value(_iter, 1, parseInt(_columnsSizes [ i ]) ); + } + for ( var prefEntry of prefs ) { if ( prefEntry.type == Gtk.Entry ) @@ -464,8 +501,6 @@ function activateAccountRow ( ) { { this.prefWidgets[prefEntry.key].set_active(_account_settings.get_enum('type')); this.prefWidgets[prefEntry.key].connect('changed', Lang.bind(this, function (e) { - monitoLog ( e ) ; - monitoLog('Active:' + this.prefWidgets['type'].get_active()); let _account_settings = getAccountSettings ( _row.server ); _account_settings.set_enum('type', this.prefWidgets['type'].get_active()); })); @@ -546,30 +581,68 @@ function setColor ( color ) function createColumnRow ( ) { - monitoLog ( '> Create column row' ); + let _item = this.store.append(); + this.store.set_value(_item, 0, 'status' ); + this.store.set_value(_item, 1, 300 ); - let _item = this.store.append(null); - this.store.set_value(_item, 0, 'bar' ); - this.store.set_value(_item, 1, 1 ); + let _row = this.accountsChooser.get_selected_row(); + let _account_settings = getAccountSettings ( _row.server ); + let prefKey; + + let _defs = _account_settings . get_strv ( 'columns' ); + _defs.push ( 'status' ); + _account_settings . set_strv ( 'columns', _defs ); + + _defs = _account_settings . get_strv ( 'columns-size' ); + _defs.push ( '300' ); + _account_settings . set_strv ( 'columns-size', _defs ); } function removeColumnRow ( widget ) { - monitoLog ( '> Remove column row' ); let [any, model, _iter] = this.treeView.get_selection().get_selected ( ); + + let _row = this.accountsChooser.get_selected_row(); + let _account_settings = getAccountSettings ( _row.server ); + let prefKey; + + for ( var foo of this.treeView.get_selection().get_selected_rows()[0] ) + { + + let _defs = _account_settings . get_strv ( 'columns' ); + _defs.splice ( foo.get_indices ( ), 1 ); + _account_settings . set_strv ( 'columns', _defs ); + + _defs = _account_settings . get_strv ( 'columns-size' ); + _defs.splice ( foo.get_indices ( ), 1 ); + _account_settings . set_strv ( 'columns-size', _defs ); + } + this.store.remove ( _iter ); } function editColumn ( widget, path, text ) { - monitoLog ( '> Edit column row ' + widget.col + ', ' + path + ', ' + text ) + let _row = this.accountsChooser.get_selected_row(); + let _account_settings = getAccountSettings ( _row.server ); + let prefKey; + let _iter = this.store.get_iter ( Gtk.TreePath.new_from_string ( path ) ); - monitoLog ( '> Iter ' + _iter[1] ); if ( widget.col == 1 ) + { this.store.set_value(_iter[1], widget.col, parseInt(text) ); + prefKey = 'columns-size'; + } else + { this.store.set_value(_iter[1], widget.col, text ); + prefKey = 'columns'; + } + + let _defs = _account_settings . get_strv ( prefKey ); + _defs [ parseInt(path) ] = text; + _account_settings . set_strv ( prefKey, _defs ); return true; } diff --git a/schemas/org.gnome.shell.extensions.monito@drieu.org.gschema.xml b/schemas/org.gnome.shell.extensions.monito@drieu.org.gschema.xml index 0f0d9e0..24ef178 100644 --- a/schemas/org.gnome.shell.extensions.monito@drieu.org.gschema.xml +++ b/schemas/org.gnome.shell.extensions.monito@drieu.org.gschema.xml @@ -134,7 +134,11 @@ - ['status','host_name','service_display_name','has_been_acknowledged','last_check','attempts','status_information'] + ['status','host_name','service_display_name','has_been_acknowledged','last_check','attempts','status_information','actions'] + + + + [ '50', '300', '300', '50', '200', '50', '600', '50' ]