places: Implement drag&drop for overview

Add drag and drop.  We need to be able to recreate the icon texture,
so instead of passing it directly into PlaceDisplay, pass
a factory function which knows how to create a new texture.
This commit is contained in:
Colin Walters 2009-08-19 16:55:39 -04:00
parent 9f5a5ad635
commit 9dff05a394

View File

@ -10,32 +10,61 @@ const Lang = imports.lang;
const Mainloop = imports.mainloop; const Mainloop = imports.mainloop;
const Signals = imports.signals; const Signals = imports.signals;
const DND = imports.ui.dnd;
const Main = imports.ui.main; const Main = imports.ui.main;
const GenericDisplay = imports.ui.genericDisplay; const GenericDisplay = imports.ui.genericDisplay;
const PLACES_VSPACING = 8; const PLACES_VSPACING = 8;
const PLACES_ICON_SIZE = 16; const PLACES_ICON_SIZE = 16;
function PlaceDisplay(name, icon, onActivate) { /**
this._init(name, icon, onActivate); * An entry in the places menu.
* @name: String title
* @iconFactory: A JavaScript callback which will create an icon texture
* @onActivate: A JavaScript callback to launch the entry
*/
function PlaceDisplay(name, iconFactory, onActivate) {
this._init(name, iconFactory, onActivate);
} }
PlaceDisplay.prototype = { PlaceDisplay.prototype = {
_init : function(name, iconTexture, onActivate) { _init : function(name, iconFactory, onActivate) {
this.actor = new Big.Box({ orientation: Big.BoxOrientation.HORIZONTAL, this.actor = new Big.Box({ orientation: Big.BoxOrientation.HORIZONTAL,
reactive: true, reactive: true,
spacing: 4 }); spacing: 4 });
this.actor.connect('button-press-event', Lang.bind(this, function (b, e) { this.actor.connect('button-release-event', Lang.bind(this, function (b, e) {
onActivate(this); onActivate(this);
Main.overview.hide();
})); }));
let text = new Clutter.Text({ font_name: "Sans 14px", let text = new Clutter.Text({ font_name: "Sans 14px",
ellipsize: Pango.EllipsizeMode.END, ellipsize: Pango.EllipsizeMode.END,
color: GenericDisplay.ITEM_DISPLAY_NAME_COLOR, color: GenericDisplay.ITEM_DISPLAY_NAME_COLOR,
text: name }); text: name });
let iconBox = new Big.Box({ y_align: Big.BoxAlignment.CENTER }); let iconBox = new Big.Box({ y_align: Big.BoxAlignment.CENTER });
iconBox.append(iconTexture, Big.BoxPackFlags.NONE); this._icon = iconFactory();
iconBox.append(this._icon, Big.BoxPackFlags.NONE);
this.actor.append(iconBox, Big.BoxPackFlags.NONE); this.actor.append(iconBox, Big.BoxPackFlags.NONE);
this.actor.append(text, Big.BoxPackFlags.EXPAND); this.actor.append(text, Big.BoxPackFlags.EXPAND);
this._iconFactory = iconFactory;
this._onActivate = onActivate;
this.actor._delegate = this;
let draggable = DND.makeDraggable(this.actor);
},
getDragActorSource: function() {
return this._icon;
},
getDragActor: function(stageX, stageY) {
return this._iconFactory();
},
//// Drag and drop methods ////
shellWorkspaceLaunch : function() {
this._onActivate();
} }
}; };
Signals.addSignalMethods(PlaceDisplay.prototype); Signals.addSignalMethods(PlaceDisplay.prototype);
@ -59,11 +88,13 @@ Places.prototype = {
let homeUri = homeFile.get_uri(); let homeUri = homeFile.get_uri();
let homeLabel = Shell.util_get_label_for_uri (homeUri); let homeLabel = Shell.util_get_label_for_uri (homeUri);
let homeIcon = Shell.util_get_icon_for_uri (homeUri); let homeIcon = Shell.util_get_icon_for_uri (homeUri);
let homeTexture = Shell.TextureCache.get_default().load_gicon(homeIcon, PLACES_ICON_SIZE); let home = new PlaceDisplay(homeLabel,
let home = new PlaceDisplay(homeLabel, homeTexture, Lang.bind(this, function() { function() {
Main.overview.hide(); return Shell.TextureCache.get_default().load_gicon(homeIcon, PLACES_ICON_SIZE);
},
function() {
Gio.app_info_launch_default_for_uri(homeUri, Main.createAppLaunchContext()); Gio.app_info_launch_default_for_uri(homeUri, Main.createAppLaunchContext());
})); });
this._menuBox.append(home.actor, Big.BoxPackFlags.NONE); this._menuBox.append(home.actor, Big.BoxPackFlags.NONE);
@ -79,19 +110,23 @@ Places.prototype = {
} }
if (networkApp != null) { if (networkApp != null) {
let networkIcon = networkApp.create_icon_texture(PLACES_ICON_SIZE); let network = new PlaceDisplay(networkApp.get_name(),
let network = new PlaceDisplay(networkApp.get_name(), networkIcon, Lang.bind(this, function () { function() {
Main.overview.hide(); return networkApp.create_icon_texture(PLACES_ICON_SIZE);
},
function () {
networkApp.launch(); networkApp.launch();
})); });
this._menuBox.append(network.actor, Big.BoxPackFlags.NONE); this._menuBox.append(network.actor, Big.BoxPackFlags.NONE);
} }
let connectIcon = Shell.TextureCache.get_default().load_icon_name("applications-internet", PLACES_ICON_SIZE); let connect = new PlaceDisplay('Connect to...',
let connect = new PlaceDisplay('Connect to...', connectIcon, Lang.bind(this, function () { function () {
Main.overview.hide(); return Shell.TextureCache.get_default().load_icon_name("applications-internet", PLACES_ICON_SIZE);
},
function () {
new Shell.Process({ args: ['nautilus-connect-server'] }).run(); new Shell.Process({ args: ['nautilus-connect-server'] }).run();
})); });
this._menuBox.append(connect.actor, Big.BoxPackFlags.NONE); this._menuBox.append(connect.actor, Big.BoxPackFlags.NONE);
this._bookmarksPath = GLib.build_filenamev([GLib.get_home_dir(), ".gtk-bookmarks"]); this._bookmarksPath = GLib.build_filenamev([GLib.get_home_dir(), ".gtk-bookmarks"]);
@ -149,11 +184,14 @@ Places.prototype = {
if (label == null) if (label == null)
continue; continue;
let icon = Shell.util_get_icon_for_uri(bookmark); let icon = Shell.util_get_icon_for_uri(bookmark);
let iconTexture = Shell.TextureCache.get_default().load_gicon(icon, PLACES_ICON_SIZE);
let item = new PlaceDisplay(label, iconTexture, Lang.bind(this, function() { let item = new PlaceDisplay(label,
Main.overview.hide(); function() {
return Shell.TextureCache.get_default().load_gicon(icon, PLACES_ICON_SIZE);
},
function() {
Gio.app_info_launch_default_for_uri(bookmark, Main.createAppLaunchContext()); Gio.app_info_launch_default_for_uri(bookmark, Main.createAppLaunchContext());
})); });
this._dirsBox.append(item.actor, Big.BoxPackFlags.NONE); this._dirsBox.append(item.actor, Big.BoxPackFlags.NONE);
} }
} }