2025-05-09 09:48:24 +02:00

102 lines
3.1 KiB
JavaScript

import {gettext as _} from 'resource:///org/gnome/shell/extensions/extension.js';
import {ArcMenuManager} from './arcmenuManager.js';
import Gio from 'gi://Gio';
import GLib from 'gi://GLib';
Gio._promisify(Gio.File.prototype, 'query_info_async');
export const RecentFilesManager = class ArcMenuRecentFilesManager {
constructor() {
this._bookmarksFile = new GLib.BookmarkFile();
this._recentFile = GLib.build_filenamev([GLib.get_user_data_dir(), 'recently-used.xbel']);
this._queryCancellables = [];
}
getRecentFiles() {
try {
this._bookmarksFile.load_from_file(this._recentFile);
} catch (e) {
if (!e.matches(GLib.BookmarkFileError.FILE_NOT_FOUND)) {
console.log(`Could not open recent files: ${e.message}`);
return [];
}
}
const recentFilesUris = this._bookmarksFile.get_uris();
recentFilesUris.sort((a, b) => this._bookmarksFile.get_modified(b) - this._bookmarksFile.get_modified(a));
return recentFilesUris;
}
removeItem(uri) {
try {
this._bookmarksFile.remove_item(uri);
this._bookmarksFile.to_file(this._recentFile);
} catch (e) {
console.log(`Could not save recent file ${uri}: ${e.message}`);
}
}
getMimeType(uri) {
return this._bookmarksFile.get_mime_type(uri);
}
async queryInfoAsync(recentFileUri) {
const file = Gio.File.new_for_uri(recentFileUri);
const cancellable = new Gio.Cancellable();
if (file === null)
return {error: 'Recent file is null.'};
this._queryCancellables.push(cancellable);
try {
const fileInfo = await file.query_info_async('standard::type,standard::is-hidden',
0, 0, cancellable);
this.removeCancellableFromList(cancellable);
if (fileInfo) {
const isHidden = fileInfo.get_attribute_boolean('standard::is-hidden');
const showHidden = ArcMenuManager.settings.get_boolean('show-hidden-recent-files');
if (isHidden && !showHidden)
return {error: `${file.get_basename()} is hidden.`};
return {recentFile: file};
}
return {error: 'No File Info Found.'};
} catch (err) {
this.removeCancellableFromList(cancellable);
return {error: err};
}
}
removeCancellableFromList(cancellable) {
const index = this._queryCancellables.indexOf(cancellable);
if (index !== -1)
this._queryCancellables.splice(index, 1);
}
cancelCurrentQueries() {
if (this._queryCancellables.length === 0)
return;
for (let cancellable of this._queryCancellables) {
cancellable.cancel();
cancellable = null;
}
this._queryCancellables = null;
this._queryCancellables = [];
}
destroy() {
this.cancelCurrentQueries();
this._bookmarksFile = null;
this._recentFile = null;
}
};