folders
This commit is contained in:
parent
2298ca8283
commit
1167230e5f
@ -5,7 +5,6 @@ const Gio = imports.gi.Gio;
|
|||||||
const GLib = imports.gi.GLib;
|
const GLib = imports.gi.GLib;
|
||||||
const GObject = imports.gi.GObject;
|
const GObject = imports.gi.GObject;
|
||||||
const Gtk = imports.gi.Gtk;
|
const Gtk = imports.gi.Gtk;
|
||||||
const GMenu = imports.gi.GMenu;
|
|
||||||
const Shell = imports.gi.Shell;
|
const Shell = imports.gi.Shell;
|
||||||
const Lang = imports.lang;
|
const Lang = imports.lang;
|
||||||
const Signals = imports.signals;
|
const Signals = imports.signals;
|
||||||
@ -47,25 +46,6 @@ const INDICATORS_ANIMATION_MAX_TIME = 0.75;
|
|||||||
const PAGE_SWITCH_TRESHOLD = 0.2;
|
const PAGE_SWITCH_TRESHOLD = 0.2;
|
||||||
const PAGE_SWITCH_TIME = 0.3;
|
const PAGE_SWITCH_TIME = 0.3;
|
||||||
|
|
||||||
// Recursively load a GMenuTreeDirectory; we could put this in ShellAppSystem too
|
|
||||||
function _loadCategory(dir, view) {
|
|
||||||
let iter = dir.iter();
|
|
||||||
let appSystem = Shell.AppSystem.get_default();
|
|
||||||
let nextType;
|
|
||||||
while ((nextType = iter.next()) != GMenu.TreeItemType.INVALID) {
|
|
||||||
if (nextType == GMenu.TreeItemType.ENTRY) {
|
|
||||||
let entry = iter.get_entry();
|
|
||||||
let appInfo = entry.get_app_info();
|
|
||||||
let app = appSystem.lookup_app(entry.get_desktop_file_id());
|
|
||||||
if (appInfo.should_show())
|
|
||||||
view.addApp(app);
|
|
||||||
} else if (nextType == GMenu.TreeItemType.DIRECTORY) {
|
|
||||||
let itemDir = iter.get_directory();
|
|
||||||
_loadCategory(itemDir, view);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
const BaseAppView = new Lang.Class({
|
const BaseAppView = new Lang.Class({
|
||||||
Name: 'BaseAppView',
|
Name: 'BaseAppView',
|
||||||
Abstract: true,
|
Abstract: true,
|
||||||
@ -97,7 +77,7 @@ const BaseAppView = new Lang.Class({
|
|||||||
this._allItems = [];
|
this._allItems = [];
|
||||||
},
|
},
|
||||||
|
|
||||||
_addItem: function(icon) {
|
addItem: function(icon) {
|
||||||
let id = icon.id;
|
let id = icon.id;
|
||||||
if (this._items[id] !== undefined)
|
if (this._items[id] !== undefined)
|
||||||
return;
|
return;
|
||||||
@ -263,7 +243,7 @@ const AllView = new Lang.Class({
|
|||||||
this._pageIndicators.actor.connect('scroll-event', Lang.bind(this, this._onScroll));
|
this._pageIndicators.actor.connect('scroll-event', Lang.bind(this, this._onScroll));
|
||||||
this.actor.add_actor(this._pageIndicators.actor);
|
this.actor.add_actor(this._pageIndicators.actor);
|
||||||
|
|
||||||
this._folderIcons = [];
|
this.folderIcons = [];
|
||||||
|
|
||||||
this._stack = new St.Widget({ layout_manager: new Clutter.BinLayout() });
|
this._stack = new St.Widget({ layout_manager: new Clutter.BinLayout() });
|
||||||
let box = new St.BoxLayout({ vertical: true });
|
let box = new St.BoxLayout({ vertical: true });
|
||||||
@ -450,27 +430,10 @@ const AllView = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
removeAll: function() {
|
removeAll: function() {
|
||||||
this._folderIcons = [];
|
this.folderIcons = [];
|
||||||
this.parent();
|
this.parent();
|
||||||
},
|
},
|
||||||
|
|
||||||
addApp: function(app) {
|
|
||||||
let icon = new AppIcon(app);
|
|
||||||
this._addItem(icon);
|
|
||||||
if (icon)
|
|
||||||
icon.actor.connect('key-focus-in',
|
|
||||||
Lang.bind(this, this._ensureIconVisible));
|
|
||||||
},
|
|
||||||
|
|
||||||
addFolder: function(dir) {
|
|
||||||
let icon = new FolderIcon(dir, this);
|
|
||||||
this._addItem(icon);
|
|
||||||
this._folderIcons.push(icon);
|
|
||||||
if (icon)
|
|
||||||
icon.actor.connect('key-focus-in',
|
|
||||||
Lang.bind(this, this._ensureIconVisible));
|
|
||||||
},
|
|
||||||
|
|
||||||
addFolderPopup: function(popup) {
|
addFolderPopup: function(popup) {
|
||||||
this._stack.add_actor(popup.actor);
|
this._stack.add_actor(popup.actor);
|
||||||
popup.connect('open-state-changed', Lang.bind(this,
|
popup.connect('open-state-changed', Lang.bind(this,
|
||||||
@ -535,8 +498,8 @@ const AllView = new Lang.Class({
|
|||||||
this._availWidth = availWidth;
|
this._availWidth = availWidth;
|
||||||
this._availHeight = availHeight;
|
this._availHeight = availHeight;
|
||||||
// Update folder views
|
// Update folder views
|
||||||
for (let i = 0; i < this._folderIcons.length; i++)
|
for (let i = 0; i < this.folderIcons.length; i++)
|
||||||
this._folderIcons[i].adaptToSize(availWidth, availHeight);
|
this.folderIcons[i].adaptToSize(availWidth, availHeight);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
Signals.addSignalMethods(AllView.prototype);
|
Signals.addSignalMethods(AllView.prototype);
|
||||||
@ -659,8 +622,9 @@ const AppDisplay = new Lang.Class({
|
|||||||
Main.overview.connect('showing', Lang.bind(this, function() {
|
Main.overview.connect('showing', Lang.bind(this, function() {
|
||||||
Main.queueDeferredWork(this._frequentAppsWorkId);
|
Main.queueDeferredWork(this._frequentAppsWorkId);
|
||||||
}));
|
}));
|
||||||
global.settings.connect('changed::app-folder-categories', Lang.bind(this, function() {
|
this._softwareSettings = new Gio.Settings({ schema: 'org.gnome.software' });
|
||||||
Main.queueDeferredWork(this._allAppsWorkId);
|
this._softwareSettings.connect('changed::app-folders', Lang.bind(this, function() {
|
||||||
|
Main.queueDeferredWork(this._frequentAppsWorkId);
|
||||||
}));
|
}));
|
||||||
this._privacySettings = new Gio.Settings({ schema: 'org.gnome.desktop.privacy' });
|
this._privacySettings = new Gio.Settings({ schema: 'org.gnome.desktop.privacy' });
|
||||||
this._privacySettings.connect('changed::remember-app-usage',
|
this._privacySettings.connect('changed::remember-app-usage',
|
||||||
@ -774,23 +738,26 @@ const AppDisplay = new Lang.Class({
|
|||||||
|
|
||||||
view.removeAll();
|
view.removeAll();
|
||||||
|
|
||||||
let tree = new GMenu.Tree({ menu_basename: "applications.menu" });
|
let apps = Gio.AppInfo.get_all();
|
||||||
tree.load_sync();
|
|
||||||
let root = tree.get_root_directory();
|
|
||||||
|
|
||||||
let iter = root.iter();
|
let folders = this._softwareSettings.get_value('app-folders').deep_unpack();
|
||||||
let nextType;
|
for (let id in folders) {
|
||||||
let folderCategories = global.settings.get_strv('app-folder-categories');
|
let folderApps = folders[id];
|
||||||
while ((nextType = iter.next()) != GMenu.TreeItemType.INVALID) {
|
let icon = new FolderIcon(id, id, folderApps, view);
|
||||||
if (nextType == GMenu.TreeItemType.DIRECTORY) {
|
view.addItem(icon);
|
||||||
let dir = iter.get_directory();
|
view.folderIcons.push(icon);
|
||||||
|
|
||||||
if (folderCategories.indexOf(dir.get_menu_id()) != -1)
|
|
||||||
view.addFolder(dir);
|
|
||||||
else
|
|
||||||
_loadCategory(dir, view);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let appSys = Shell.AppSystem.get_default();
|
||||||
|
apps.forEach(Lang.bind(this, function(appInfo) {
|
||||||
|
if (!appInfo.should_show())
|
||||||
|
return;
|
||||||
|
|
||||||
|
let app = appSys.lookup_app(appInfo.get_id());
|
||||||
|
let icon = new AppIcon(app);
|
||||||
|
view.addItem(icon);
|
||||||
|
}));
|
||||||
|
|
||||||
view.loadGrid();
|
view.loadGrid();
|
||||||
|
|
||||||
if (this._focusDummy) {
|
if (this._focusDummy) {
|
||||||
@ -914,11 +881,6 @@ const FolderView = new Lang.Class({
|
|||||||
this.actor.add_action(action);
|
this.actor.add_action(action);
|
||||||
},
|
},
|
||||||
|
|
||||||
addApp: function(app) {
|
|
||||||
let icon = new AppIcon(app);
|
|
||||||
this._addItem(icon);
|
|
||||||
},
|
|
||||||
|
|
||||||
createFolderIcon: function(size) {
|
createFolderIcon: function(size) {
|
||||||
let icon = new St.Widget({ layout_manager: new Clutter.BinLayout(),
|
let icon = new St.Widget({ layout_manager: new Clutter.BinLayout(),
|
||||||
style_class: 'app-folder-icon',
|
style_class: 'app-folder-icon',
|
||||||
@ -1004,11 +966,9 @@ const FolderView = new Lang.Class({
|
|||||||
const FolderIcon = new Lang.Class({
|
const FolderIcon = new Lang.Class({
|
||||||
Name: 'FolderIcon',
|
Name: 'FolderIcon',
|
||||||
|
|
||||||
_init: function(dir, parentView) {
|
_init: function(id, name, apps, parentView) {
|
||||||
this._dir = dir;
|
this.id = id;
|
||||||
this.id = dir.get_menu_id();
|
this.name = name;
|
||||||
this.name = dir.get_name();
|
|
||||||
|
|
||||||
this._parentView = parentView;
|
this._parentView = parentView;
|
||||||
|
|
||||||
this.actor = new St.Button({ style_class: 'app-well-app app-folder',
|
this.actor = new St.Button({ style_class: 'app-well-app app-folder',
|
||||||
@ -1027,7 +987,15 @@ const FolderIcon = new Lang.Class({
|
|||||||
this.actor.label_actor = this.icon.label;
|
this.actor.label_actor = this.icon.label;
|
||||||
|
|
||||||
this.view = new FolderView();
|
this.view = new FolderView();
|
||||||
_loadCategory(dir, this.view);
|
let appSys = Shell.AppSystem.get_default();
|
||||||
|
apps.forEach(Lang.bind(this, function(appId) {
|
||||||
|
let app = appSys.lookup_app(appId + '.desktop');
|
||||||
|
if (!app)
|
||||||
|
return;
|
||||||
|
|
||||||
|
let icon = new AppIcon(app);
|
||||||
|
this.view.addItem(icon);
|
||||||
|
}));
|
||||||
this.view.loadGrid();
|
this.view.loadGrid();
|
||||||
|
|
||||||
this.actor.connect('clicked', Lang.bind(this,
|
this.actor.connect('clicked', Lang.bind(this,
|
||||||
|
Loading…
Reference in New Issue
Block a user