Add (+) and (-) icons for workspace management to the overlay

svn path=/trunk/; revision=137
This commit is contained in:
Dan Winship 2008-12-22 22:06:47 +00:00
parent 54d8f3b27d
commit b3aaf2ced5

View File

@ -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 Panel = imports.ui.panel;
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 @@ Workspace.prototype = {
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 @@ Workspace.prototype = {
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 @@ Workspace.prototype = {
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 @@ Workspace.prototype = {
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 @@ Workspace.prototype = {
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 @@ Workspace.prototype = {
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 @@ Workspace.prototype = {
} 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 @@ Workspaces.prototype = {
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 @@ Workspaces.prototype = {
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 @@ Workspaces.prototype = {
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 @@ Workspaces.prototype = {
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 @@ Workspaces.prototype = {
// 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());
}
};