iconGrid: Change IconGrid.addItem() to take an object instead of an actor

IconGrid has never really been a general purpose container, but has
always been used in conjunction with BaseIcon. IconGrid will soon
gain the ability to adjust the item size dynamically to adapt to the
available space, which will require that we can make some more
assumptions about the items added to the grid (namely: we need
access to BaseIcon's setIconSize() method).
So change addItem() to take an object instead, which should have
an actor and a (BaseIcon) icon property.

Based on a patch by Carlos Soriano.

https://bugzilla.gnome.org/show_bug.cgi?id=706081
This commit is contained in:
Florian Müllner 2013-08-29 23:25:13 +02:00 committed by Carlos Soriano
parent 9a8bf3b881
commit 792b963bda
4 changed files with 26 additions and 19 deletions

View File

@ -129,7 +129,7 @@ const BaseAppView = new Lang.Class({
let id = this._getItemId(this._allItems[i]); let id = this._getItemId(this._allItems[i]);
if (!id) if (!id)
continue; continue;
this._grid.addItem(this._items[id].actor); this._grid.addItem(this._items[id]);
} }
this.emit('view-loaded'); this.emit('view-loaded');
@ -583,7 +583,7 @@ const FrequentView = new Lang.Class({
if (!mostUsed[i].get_app_info().should_show()) if (!mostUsed[i].get_app_info().should_show())
continue; continue;
let appIcon = new AppIcon(mostUsed[i]); let appIcon = new AppIcon(mostUsed[i]);
this._grid.addItem(appIcon.actor, -1); this._grid.addItem(appIcon, -1);
} }
}, },
@ -862,10 +862,9 @@ const AppSearchProvider = new Lang.Class({
app.open_new_window(workspace); app.open_new_window(workspace);
}, },
createResultActor: function (resultMeta, terms) { createResultObject: function (resultMeta, terms) {
let app = resultMeta['id']; let app = resultMeta['id'];
let icon = new AppIcon(app); return new AppIcon(app);
return icon.actor;
} }
}); });

View File

@ -205,7 +205,7 @@ const IconGrid = new Lang.Class({
this.actor = new St.BoxLayout({ style_class: 'icon-grid', this.actor = new St.BoxLayout({ style_class: 'icon-grid',
vertical: true }); vertical: true });
this._items = [];
// Pulled from CSS, but hardcode some defaults here // Pulled from CSS, but hardcode some defaults here
this._spacing = 0; this._spacing = 0;
this._hItemSize = this._vItemSize = ICON_SIZE; this._hItemSize = this._vItemSize = ICON_SIZE;
@ -406,14 +406,21 @@ const IconGrid = new Lang.Class({
}, },
removeAll: function() { removeAll: function() {
this._items = [];
this._grid.destroy_all_children(); this._grid.destroy_all_children();
}, },
addItem: function(actor, index) { addItem: function(item, index) {
if (!item.icon || !item.icon instanceof BaseIcon) {
log('Only items with a BaseIcon icon property can be added to IconGrid');
return;
}
this._items.push(item);
if (index !== undefined) if (index !== undefined)
this._grid.insert_child_at_index(actor, index); this._grid.insert_child_at_index(item.actor, index);
else else
this._grid.add_actor(actor); this._grid.add_actor(item.actor);
}, },
getItemAtIndex: function(index) { getItemAtIndex: function(index) {

View File

@ -126,23 +126,25 @@ const GridSearchResult = new Lang.Class({
this.actor.style_class = 'grid-search-result'; this.actor.style_class = 'grid-search-result';
let content = provider.createResultActor(metaInfo, terms); let content = provider.createResultObject(metaInfo, terms);
let dragSource = null; let dragSource = null;
if (content == null) { if (content == null) {
content = new St.Bin(); let actor = new St.Bin();
let icon = new IconGrid.BaseIcon(this.metaInfo['name'], let icon = new IconGrid.BaseIcon(this.metaInfo['name'],
{ createIcon: this.metaInfo['createIcon'] }); { createIcon: this.metaInfo['createIcon'] });
content.set_child(icon.actor); actor.set_child(icon.actor);
content.label_actor = icon.label; actor.label_actor = icon.label;
dragSource = icon.icon; dragSource = icon.icon;
content = { actor: actor, icon: icon };
} else { } else {
if (content._delegate && content._delegate.getDragActorSource) if (content._delegate && content._delegate.getDragActorSource)
dragSource = content._delegate.getDragActorSource(); dragSource = content._delegate.getDragActorSource();
} }
this.actor.set_child(content); this.actor.set_child(content.actor);
this.actor.label_actor = content.label_actor; this.actor.label_actor = content.actor.label_actor;
this.icon = content.icon;
let draggable = DND.makeDraggable(this.actor); let draggable = DND.makeDraggable(this.actor);
draggable.connect('drag-begin', draggable.connect('drag-begin',
@ -327,7 +329,7 @@ const GridSearchResults = new Lang.Class({
for (let i = 0; i < metas.length; i++) { for (let i = 0; i < metas.length; i++) {
let display = new GridSearchResult(this.provider, metas[i], this._terms); let display = new GridSearchResult(this.provider, metas[i], this._terms);
display.actor.connect('key-focus-in', Lang.bind(this, this._keyFocusIn)); display.actor.connect('key-focus-in', Lang.bind(this, this._keyFocusIn));
this._grid.addItem(display.actor); this._grid.addItem(display);
} }
}, },

View File

@ -150,8 +150,7 @@ const WandaSearchProvider = new Lang.Class({
this._dialog = new FortuneDialog(capitalize(fish), FISH_COMMAND); this._dialog = new FortuneDialog(capitalize(fish), FISH_COMMAND);
}, },
createResultActor: function (resultMeta, terms) { createResultObject: function (resultMeta, terms) {
let icon = new WandaIconBin(resultMeta.id, resultMeta.name); return new WandaIconBin(resultMeta.id, resultMeta.name);
return icon.actor;
} }
}); });