gnome-shell r137 - trunk/js/ui
- From: danw svn gnome org
- To: svn-commits-list gnome org
- Subject: gnome-shell r137 - trunk/js/ui
- Date: Mon, 22 Dec 2008 22:06:47 +0000 (UTC)
Author: danw
Date: Mon Dec 22 22:06:47 2008
New Revision: 137
URL: http://svn.gnome.org/viewvc/gnome-shell?rev=137&view=rev
Log:
Add (+) and (-) icons for workspace management to the overlay
Modified:
trunk/js/ui/workspaces.js
Modified: trunk/js/ui/workspaces.js
==============================================================================
--- trunk/js/ui/workspaces.js (original)
+++ trunk/js/ui/workspaces.js Mon Dec 22 22:06:47 2008
@@ -3,6 +3,7 @@
const Tweener = imports.tweener.tweener;
const Clutter = imports.gi.Clutter;
const Pango = imports.gi.Pango;
+const Lang = imports.lang;
const Main = imports.ui.main;
const Overlay = imports.ui.overlay;
@@ -10,6 +11,7 @@
const Meta = imports.gi.Meta;
const Shell = imports.gi.Shell;
const Big = imports.gi.Big;
+const GdkPixbuf = imports.gi.GdkPixbuf;
// Windows are slightly translucent in the overlay mode
const WINDOW_OPACITY = 0.9 * 255;
@@ -86,6 +88,66 @@
this._windows.push(clone);
}
}
+
+ this._removeButton = null;
+ this._visible = false;
+ },
+
+ // Checks if the workspace is empty (ie, contains only a desktop window)
+ isEmpty : function() {
+ return this._windows.length == 1;
+ },
+
+ // Change Workspace's removability.
+ setRemovable : function(removable, buttonSize) {
+ let global = Shell.Global.get();
+
+ if (removable) {
+ if (this._removeButton)
+ return;
+
+ this._removeButton = new Clutter.Texture({ width: buttonSize,
+ height: buttonSize,
+ reactive: true
+ });
+ this._removeButton.set_from_file(global.imagedir + "remove-workspace.svg");
+ this._removeButton.connect('button-press-event', Lang.bind(this, this._removeSelf));
+
+ this.actor.add_actor(this._removeButton);
+
+ if (this._visible) {
+ this._removeButton.set_position(
+ this.gridX + (this._desktop.width * this.scale - this._removeButton.width) / 2,
+ this.gridY + (this._desktop.height * this.scale - this._removeButton.height) / 2);
+ this._removeButton.set_opacity(0);
+ Tweener.addTween(this._removeButton,
+ { opacity: 255,
+ time: Overlay.ANIMATION_TIME,
+ transition: "easeOutQuad"
+ });
+ }
+ } else {
+ if (!this._removeButton)
+ return;
+
+ if (this._visible) {
+ Tweener.addTween(this._removeButton,
+ { opacity: 0,
+ time: Overlay.ANIMATION_TIME,
+ transition: "easeOutQuad",
+ onComplete: this._removeRemoveButton,
+ onCompleteScope: this
+ });
+ } else {
+ this._removeButton.destroy();
+ this._removeButton = null;
+ }
+ }
+ },
+
+ _removeRemoveButton : function() {
+ this._removeButton.destroy();
+ this._removeButton = null;
},
// Animate the full-screen to overlay transition.
@@ -136,6 +198,23 @@
onCompleteScope: this
});
}
+
+ // If the workspace is removable, animate in its removeButton
+ if (this._removeButton) {
+ this._removeButton.set_position(
+ this.fullSizeX + (this._desktop.width - this._removeButton.width) / 2,
+ this.fullSizeY + (this._desktop.height - this._removeButton.height) / 2);
+ this._removeButton.set_opacity(0);
+ Tweener.addTween(this._removeButton,
+ { x: this.gridX + (this._desktop.width * this.scale - this._removeButton.width) / 2,
+ y: this.gridY + (this._desktop.height * this.scale - this._removeButton.height) / 2,
+ opacity: 255,
+ time: Overlay.ANIMATION_TIME,
+ transition: "easeOutQuad"
+ });
+ }
+
+ this._visible = true;
},
// Animates the return from overlay mode
@@ -154,6 +233,18 @@
transition: "easeOutQuad"
});
}
+
+ if (this._removeButton) {
+ Tweener.addTween(this._removeButton,
+ { x: this.fullSizeX + (this._desktop.width - this._removeButton.width) / 2,
+ y: this.fullSizeY + (this._desktop.height - this._removeButton.height) / 2,
+ opacity: 0,
+ time: Overlay.ANIMATION_TIME,
+ transition: "easeOutQuad"
+ });
+ }
+
+ this._visible = false;
},
// Animates grid shrinking/expanding when a row or column
@@ -177,6 +268,17 @@
this._adjustCloneTitle(this._windows[i], newX, newY,
newWindowScale);
}
+
+ if (this._removeButton) {
+ // This gets layered on top of any already-running fade-out
+ // animation from setRemovable
+ Tweener.addTween(this._removeButton,
+ { x: this.gridX + (this._desktop.width * this.scale - this._removeButton.width) / 2,
+ y: this.gridY + (this._desktop.height * this.scale - this._removeButton.height) / 2,
+ time: Overlay.ANIMATION_TIME,
+ transition: "easeOutQuad"
+ });
+ }
},
// Animates the addition of a new (empty) workspace
@@ -198,6 +300,22 @@
time: Overlay.ANIMATION_TIME,
transition: "easeOutQuad"
});
+
+ if (this._removeButton) {
+ this._removeButton.set_position(
+ this._desktop.x + (this._desktop.width * oldScale - this._removeButton.width) / 2,
+ this._desktop.y + (this._desktop.height * oldScale - this._removeButton.height) / 2);
+ this._removeButton.set_opacity(0);
+ Tweener.addTween(this._removeButton,
+ { x: this.gridX + (this._desktop.width * this.scale - this._removeButton.width) / 2,
+ y: this.gridY + (this._desktop.height * this.scale - this._removeButton.height) / 2,
+ opacity: 255,
+ time: Overlay.ANIMATION_TIME,
+ transition: "easeOutQuad"
+ });
+ }
+
+ this._visible = true;
},
// Animates the removal of a workspace
@@ -218,6 +336,19 @@
transition: "easeOutQuad",
onComplete: onComplete
});
+
+ if (this._removeButton) {
+ // This gets layered on top of any already-running fade-out
+ // animation from setRemovable()
+ Tweener.addTween(this._removeButton,
+ { x: destX + (this._desktop.width * this.scale - this._removeButton.width) / 2,
+ y: destY + (this._desktop.height * this.scale - this._removeButton.height) / 2,
+ time: Overlay.ANIMATION_TIME,
+ transition: "easeOutQuad"
+ });
+ }
+
+ this._visible = false;
},
destroy : function() {
@@ -345,6 +476,14 @@
} else
w.get_meta_window().activate(time);
Main.hide_overlay();
+ },
+
+ _removeSelf : function(actor, event) {
+ let global = Shell.Global.get();
+ let screen = global.screen;
+ let workspace = screen.get_workspace_by_index(this._workspaceNum);
+
+ screen.remove_workspace(workspace, event.get_time());
}
};
@@ -402,6 +541,26 @@
transition: "easeOutQuad"
});
+ // Create (+) and (-) buttons
+ let bottomHeight = screenHeight - this._height - this._y;
+ this._buttonSize = Math.floor(bottomHeight * 3/5);
+ let plusX = this._x + this._width - this._buttonSize;
+ let plusY = screenHeight - Math.floor(bottomHeight * 4/5);
+
+ let plus = new Clutter.Texture({ x: plusX,
+ y: plusY,
+ width: this._buttonSize,
+ height: this._buttonSize,
+ reactive: true
+ });
+ plus.set_from_file(global.imagedir + "add-workspace.svg");
+ plus.connect('button-press-event', this._addWorkspace);
+ this.actor.add_actor(plus);
+ plus.lower_bottom();
+
+ let lastWorkspace = this._workspaces[this._workspaces.length - 1];
+ if (lastWorkspace.isEmpty())
+ lastWorkspace.setRemovable(true, this._buttonSize);
// Position/scale the desktop windows and their children
for (let w = 0; w < this._workspaces.length; w++)
@@ -443,7 +602,8 @@
this._workspaces[w].destroy();
this._workspaces = [];
- this._backdrop.destroy();
+ this.actor.destroy();
+ this.actor = null;
this._backdrop = null;
global.screen.disconnect(this._nWorkspacesNotifyId);
@@ -529,12 +689,16 @@
let oldGridHeight = Math.ceil(oldNumWorkspaces / oldGridWidth);
let lostWorkspaces = [];
+ // The old last workspace is no longer removable.
+ this._workspaces[oldNumWorkspaces - 1].setRemovable(false);
+
if (newNumWorkspaces > oldNumWorkspaces) {
// Create new workspace groups
for (let w = oldNumWorkspaces; w < newNumWorkspaces; w++) {
this._workspaces[w] = new Workspace(w);
this.actor.add_actor(this._workspaces[w].actor);
}
+
} else {
// Truncate the list of workspaces
// FIXME: assumes that the workspaces are being removed from
@@ -542,6 +706,11 @@
lostWorkspaces = this._workspaces.splice(newNumWorkspaces);
}
+ // The new last workspace may be removable
+ let newLastWorkspace = this._workspaces[this._workspaces.length - 1];
+ if (newLastWorkspace.isEmpty())
+ newLastWorkspace.setRemovable(true, this._buttonSize);
+
// Figure out the new layout
this._positionWorkspaces(global);
let newScale = this._workspaces[0].scale;
@@ -568,5 +737,11 @@
// FIXME: deal with windows on the lost workspaces
}
+ },
+
+ _addWorkspace : function(actor, event) {
+ let global = Shell.Global.get();
+
+ global.screen.append_new_workspace(false, event.get_time());
}
};
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]