Add (+) and (-) icons for workspace management to the overlay
svn path=/trunk/; revision=137
This commit is contained in:
parent
54d8f3b27d
commit
b3aaf2ced5
@ -3,6 +3,7 @@
|
|||||||
const Tweener = imports.tweener.tweener;
|
const Tweener = imports.tweener.tweener;
|
||||||
const Clutter = imports.gi.Clutter;
|
const Clutter = imports.gi.Clutter;
|
||||||
const Pango = imports.gi.Pango;
|
const Pango = imports.gi.Pango;
|
||||||
|
const Lang = imports.lang;
|
||||||
|
|
||||||
const Main = imports.ui.main;
|
const Main = imports.ui.main;
|
||||||
const Overlay = imports.ui.overlay;
|
const Overlay = imports.ui.overlay;
|
||||||
@ -10,6 +11,7 @@ const Panel = imports.ui.panel;
|
|||||||
const Meta = imports.gi.Meta;
|
const Meta = imports.gi.Meta;
|
||||||
const Shell = imports.gi.Shell;
|
const Shell = imports.gi.Shell;
|
||||||
const Big = imports.gi.Big;
|
const Big = imports.gi.Big;
|
||||||
|
const GdkPixbuf = imports.gi.GdkPixbuf;
|
||||||
|
|
||||||
// Windows are slightly translucent in the overlay mode
|
// Windows are slightly translucent in the overlay mode
|
||||||
const WINDOW_OPACITY = 0.9 * 255;
|
const WINDOW_OPACITY = 0.9 * 255;
|
||||||
@ -86,6 +88,66 @@ Workspace.prototype = {
|
|||||||
this._windows.push(clone);
|
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.
|
// Animate the full-screen to overlay transition.
|
||||||
@ -136,6 +198,23 @@ Workspace.prototype = {
|
|||||||
onCompleteScope: this
|
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
|
// Animates the return from overlay mode
|
||||||
@ -154,6 +233,18 @@ Workspace.prototype = {
|
|||||||
transition: "easeOutQuad"
|
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
|
// Animates grid shrinking/expanding when a row or column
|
||||||
@ -177,6 +268,17 @@ Workspace.prototype = {
|
|||||||
this._adjustCloneTitle(this._windows[i], newX, newY,
|
this._adjustCloneTitle(this._windows[i], newX, newY,
|
||||||
newWindowScale);
|
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
|
// Animates the addition of a new (empty) workspace
|
||||||
@ -198,6 +300,22 @@ Workspace.prototype = {
|
|||||||
time: Overlay.ANIMATION_TIME,
|
time: Overlay.ANIMATION_TIME,
|
||||||
transition: "easeOutQuad"
|
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
|
// Animates the removal of a workspace
|
||||||
@ -218,6 +336,19 @@ Workspace.prototype = {
|
|||||||
transition: "easeOutQuad",
|
transition: "easeOutQuad",
|
||||||
onComplete: onComplete
|
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() {
|
destroy : function() {
|
||||||
@ -345,6 +476,14 @@ Workspace.prototype = {
|
|||||||
} else
|
} else
|
||||||
w.get_meta_window().activate(time);
|
w.get_meta_window().activate(time);
|
||||||
Main.hide_overlay();
|
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"
|
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
|
// Position/scale the desktop windows and their children
|
||||||
for (let w = 0; w < this._workspaces.length; w++)
|
for (let w = 0; w < this._workspaces.length; w++)
|
||||||
@ -443,7 +602,8 @@ Workspaces.prototype = {
|
|||||||
this._workspaces[w].destroy();
|
this._workspaces[w].destroy();
|
||||||
this._workspaces = [];
|
this._workspaces = [];
|
||||||
|
|
||||||
this._backdrop.destroy();
|
this.actor.destroy();
|
||||||
|
this.actor = null;
|
||||||
this._backdrop = null;
|
this._backdrop = null;
|
||||||
|
|
||||||
global.screen.disconnect(this._nWorkspacesNotifyId);
|
global.screen.disconnect(this._nWorkspacesNotifyId);
|
||||||
@ -529,12 +689,16 @@ Workspaces.prototype = {
|
|||||||
let oldGridHeight = Math.ceil(oldNumWorkspaces / oldGridWidth);
|
let oldGridHeight = Math.ceil(oldNumWorkspaces / oldGridWidth);
|
||||||
let lostWorkspaces = [];
|
let lostWorkspaces = [];
|
||||||
|
|
||||||
|
// The old last workspace is no longer removable.
|
||||||
|
this._workspaces[oldNumWorkspaces - 1].setRemovable(false);
|
||||||
|
|
||||||
if (newNumWorkspaces > oldNumWorkspaces) {
|
if (newNumWorkspaces > oldNumWorkspaces) {
|
||||||
// Create new workspace groups
|
// Create new workspace groups
|
||||||
for (let w = oldNumWorkspaces; w < newNumWorkspaces; w++) {
|
for (let w = oldNumWorkspaces; w < newNumWorkspaces; w++) {
|
||||||
this._workspaces[w] = new Workspace(w);
|
this._workspaces[w] = new Workspace(w);
|
||||||
this.actor.add_actor(this._workspaces[w].actor);
|
this.actor.add_actor(this._workspaces[w].actor);
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
// Truncate the list of workspaces
|
// Truncate the list of workspaces
|
||||||
// FIXME: assumes that the workspaces are being removed from
|
// FIXME: assumes that the workspaces are being removed from
|
||||||
@ -542,6 +706,11 @@ Workspaces.prototype = {
|
|||||||
lostWorkspaces = this._workspaces.splice(newNumWorkspaces);
|
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
|
// Figure out the new layout
|
||||||
this._positionWorkspaces(global);
|
this._positionWorkspaces(global);
|
||||||
let newScale = this._workspaces[0].scale;
|
let newScale = this._workspaces[0].scale;
|
||||||
@ -568,5 +737,11 @@ Workspaces.prototype = {
|
|||||||
|
|
||||||
// FIXME: deal with windows on the lost workspaces
|
// 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());
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user