diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-27 15:07:22 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-27 15:07:22 +0000 |
commit | f9d480cfe50ca1d7a0f0b5a2b8bb9932962bfbe7 (patch) | |
tree | ce9e8db2d4e8799780fa72ae8f1953039373e2ee /js/misc/history.js | |
parent | Initial commit. (diff) | |
download | gnome-shell-f9d480cfe50ca1d7a0f0b5a2b8bb9932962bfbe7.tar.xz gnome-shell-f9d480cfe50ca1d7a0f0b5a2b8bb9932962bfbe7.zip |
Adding upstream version 3.38.6.upstream/3.38.6upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'js/misc/history.js')
-rw-r--r-- | js/misc/history.js | 109 |
1 files changed, 109 insertions, 0 deletions
diff --git a/js/misc/history.js b/js/misc/history.js new file mode 100644 index 0000000..c82722c --- /dev/null +++ b/js/misc/history.js @@ -0,0 +1,109 @@ +// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- + +const Signals = imports.signals; +const Clutter = imports.gi.Clutter; +const Params = imports.misc.params; + +var DEFAULT_LIMIT = 512; + +var HistoryManager = class { + constructor(params) { + params = Params.parse(params, { gsettingsKey: null, + limit: DEFAULT_LIMIT, + entry: null }); + + this._key = params.gsettingsKey; + this._limit = params.limit; + + this._historyIndex = 0; + if (this._key) { + this._history = global.settings.get_strv(this._key); + global.settings.connect(`changed::${this._key}`, + this._historyChanged.bind(this)); + + } else { + this._history = []; + } + + this._entry = params.entry; + + if (this._entry) { + this._entry.connect('key-press-event', + this._onEntryKeyPress.bind(this)); + } + } + + _historyChanged() { + this._history = global.settings.get_strv(this._key); + this._historyIndex = this._history.length; + } + + _setPrevItem(text) { + if (this._historyIndex <= 0) + return false; + + if (text) + this._history[this._historyIndex] = text; + this._historyIndex--; + this._indexChanged(); + return true; + } + + _setNextItem(text) { + if (this._historyIndex >= this._history.length) + return false; + + if (text) + this._history[this._historyIndex] = text; + this._historyIndex++; + this._indexChanged(); + return true; + } + + lastItem() { + if (this._historyIndex != this._history.length) { + this._historyIndex = this._history.length; + this._indexChanged(); + } + + return this._historyIndex ? this._history[this._historyIndex - 1] : null; + } + + addItem(input) { + if (this._history.length == 0 || + this._history[this._history.length - 1] != input) { + + this._history = this._history.filter(entry => entry != input); + this._history.push(input); + this._save(); + } + this._historyIndex = this._history.length; + } + + _onEntryKeyPress(entry, event) { + let symbol = event.get_key_symbol(); + if (symbol == Clutter.KEY_Up) + return this._setPrevItem(entry.get_text()); + else if (symbol == Clutter.KEY_Down) + return this._setNextItem(entry.get_text()); + + return Clutter.EVENT_PROPAGATE; + } + + _indexChanged() { + let current = this._history[this._historyIndex] || ''; + this.emit('changed', current); + + if (this._entry) + this._entry.set_text(current); + } + + _save() { + if (this._history.length > this._limit) + this._history.splice(0, this._history.length - this._limit); + + if (this._key) + global.settings.set_strv(this._key, this._history); + } +}; +Signals.addSignalMethods(HistoryManager.prototype); |