mirror of
https://github.com/elementary/gala.git
synced 2024-12-18 23:02:14 +03:00
Added close button to workspaces, scroll position indicator
This commit is contained in:
parent
18a40518ae
commit
4b1913c2c4
@ -31,6 +31,8 @@ namespace Gala
|
|||||||
WorkspaceView workspace_view;
|
WorkspaceView workspace_view;
|
||||||
Clutter.Actor elements;
|
Clutter.Actor elements;
|
||||||
|
|
||||||
|
public unowned Compositor compositor;
|
||||||
|
|
||||||
Window? moving; //place for the window that is being moved over
|
Window? moving; //place for the window that is being moved over
|
||||||
|
|
||||||
public Plugin ()
|
public Plugin ()
|
||||||
@ -49,6 +51,8 @@ namespace Gala
|
|||||||
{
|
{
|
||||||
var screen = get_screen ();
|
var screen = get_screen ();
|
||||||
|
|
||||||
|
compositor = Compositor.new (screen.get_display ());
|
||||||
|
|
||||||
elements = Compositor.get_stage_for_screen (screen);
|
elements = Compositor.get_stage_for_screen (screen);
|
||||||
clutter_actor_reparent (Compositor.get_window_group_for_screen (screen), elements);
|
clutter_actor_reparent (Compositor.get_window_group_for_screen (screen), elements);
|
||||||
clutter_actor_reparent (Compositor.get_overlay_group_for_screen (screen), elements);
|
clutter_actor_reparent (Compositor.get_overlay_group_for_screen (screen), elements);
|
||||||
|
@ -33,6 +33,7 @@ namespace Gala
|
|||||||
Gdk.Pixbuf background_pix;
|
Gdk.Pixbuf background_pix;
|
||||||
Clutter.CairoTexture workspace_thumb;
|
Clutter.CairoTexture workspace_thumb;
|
||||||
Clutter.CairoTexture current_workspace;
|
Clutter.CairoTexture current_workspace;
|
||||||
|
Clutter.CairoTexture scroll;
|
||||||
|
|
||||||
const int current_border = 5;
|
const int current_border = 5;
|
||||||
|
|
||||||
@ -88,15 +89,21 @@ namespace Gala
|
|||||||
|
|
||||||
workspaces = new Clutter.Actor ();
|
workspaces = new Clutter.Actor ();
|
||||||
var box_layout = new Clutter.BoxLayout ();
|
var box_layout = new Clutter.BoxLayout ();
|
||||||
box_layout.spacing = 12;
|
|
||||||
workspaces.set_layout_manager (box_layout);
|
workspaces.set_layout_manager (box_layout);
|
||||||
|
|
||||||
|
box_layout.spacing = 12;
|
||||||
|
|
||||||
bg = new Clutter.CairoTexture (500, (uint)height);
|
bg = new Clutter.CairoTexture (500, (uint)height);
|
||||||
bg.auto_resize = true;
|
bg.auto_resize = true;
|
||||||
bg.add_constraint (new Clutter.BindConstraint (this, Clutter.BindCoordinate.WIDTH, 0));
|
bg.add_constraint (new Clutter.BindConstraint (this, Clutter.BindCoordinate.WIDTH, 0));
|
||||||
bg.add_constraint (new Clutter.BindConstraint (this, Clutter.BindCoordinate.HEIGHT, 0));
|
bg.add_constraint (new Clutter.BindConstraint (this, Clutter.BindCoordinate.HEIGHT, 0));
|
||||||
bg.draw.connect (draw_background);
|
bg.draw.connect (draw_background);
|
||||||
|
|
||||||
|
scroll = new Clutter.CairoTexture (100, 12);
|
||||||
|
scroll.height = 12;
|
||||||
|
scroll.auto_resize = true;
|
||||||
|
scroll.draw.connect (draw_scroll);
|
||||||
|
|
||||||
leave_event.connect ((e) => {
|
leave_event.connect ((e) => {
|
||||||
if (!contains (e.related))
|
if (!contains (e.related))
|
||||||
hide ();
|
hide ();
|
||||||
@ -233,6 +240,7 @@ namespace Gala
|
|||||||
/*add_child (tile); removed for now until Luna+1 */
|
/*add_child (tile); removed for now until Luna+1 */
|
||||||
add_child (current_workspace);
|
add_child (current_workspace);
|
||||||
add_child (workspaces);
|
add_child (workspaces);
|
||||||
|
add_child (scroll);
|
||||||
|
|
||||||
workspace_thumb.visible = false; //will only be used for cloning
|
workspace_thumb.visible = false; //will only be used for cloning
|
||||||
}
|
}
|
||||||
@ -259,6 +267,15 @@ namespace Gala
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool draw_scroll (Cairo.Context cr)
|
||||||
|
{
|
||||||
|
Granite.Drawing.Utilities.cairo_rounded_rectangle (cr, 4, 4, scroll.width-12, 4, 2);
|
||||||
|
cr.set_source_rgba (1, 1, 1, 0.8);
|
||||||
|
cr.fill ();
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
bool draw_background (Cairo.Context cr)
|
bool draw_background (Cairo.Context cr)
|
||||||
{
|
{
|
||||||
cr.rectangle (0, 1, width, height);
|
cr.rectangle (0, 1, width, height);
|
||||||
@ -327,17 +344,20 @@ namespace Gala
|
|||||||
const float scroll_speed = 30.0f;
|
const float scroll_speed = 30.0f;
|
||||||
public override bool scroll_event (Clutter.ScrollEvent event)
|
public override bool scroll_event (Clutter.ScrollEvent event)
|
||||||
{
|
{
|
||||||
if (event.direction == Clutter.ScrollDirection.UP && workspaces.width + workspaces.x > width) { //left
|
if ((event.direction == Clutter.ScrollDirection.DOWN || event.direction == Clutter.ScrollDirection.RIGHT)
|
||||||
|
&& workspaces.width + workspaces.x > width) { //left
|
||||||
workspaces.x -= scroll_speed;
|
workspaces.x -= scroll_speed;
|
||||||
current_workspace.x -= scroll_speed;
|
current_workspace.x -= scroll_speed;
|
||||||
} else if (event.direction == Clutter.ScrollDirection.DOWN && workspaces.x < 0) { //right
|
} else if ((event.direction == Clutter.ScrollDirection.UP || event.direction == Clutter.ScrollDirection.LEFT)
|
||||||
|
&& workspaces.x < 0) { //right
|
||||||
workspaces.x += scroll_speed;
|
workspaces.x += scroll_speed;
|
||||||
current_workspace.x += scroll_speed;
|
current_workspace.x += scroll_speed;
|
||||||
}
|
}
|
||||||
|
scroll.x = Math.fabsf (width/workspaces.width*workspaces.x);
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
//FIXME move all this positioning stuff to a separate function which is only called by screen size changes
|
|
||||||
public new void show ()
|
public new void show ()
|
||||||
{
|
{
|
||||||
if (visible)
|
if (visible)
|
||||||
@ -369,6 +389,11 @@ namespace Gala
|
|||||||
icons.set_layout_manager (new Clutter.BoxLayout ());
|
icons.set_layout_manager (new Clutter.BoxLayout ());
|
||||||
var backg = new Clutter.Clone (workspace_thumb);
|
var backg = new Clutter.Clone (workspace_thumb);
|
||||||
|
|
||||||
|
var close = new GtkClutter.Texture ();
|
||||||
|
try {
|
||||||
|
close.set_from_pixbuf (Granite.Widgets.get_close_pixbuf ());
|
||||||
|
} catch (Error e) { warning (e.message); }
|
||||||
|
|
||||||
var shown_applications = new List<Bamf.Application> ();
|
var shown_applications = new List<Bamf.Application> ();
|
||||||
|
|
||||||
space.list_windows ().foreach ((w) => {
|
space.list_windows ().foreach ((w) => {
|
||||||
@ -407,6 +432,32 @@ namespace Gala
|
|||||||
|
|
||||||
group.height = 160;
|
group.height = 160;
|
||||||
|
|
||||||
|
if (space.index () != screen.n_workspaces - 1) //dont allow closing the last one
|
||||||
|
group.add_child (close);
|
||||||
|
close.x = -12.0f;
|
||||||
|
close.y = -10.0f;
|
||||||
|
close.reactive = true;
|
||||||
|
close.scale_gravity = Clutter.Gravity.CENTER;
|
||||||
|
close.scale_x = 0;
|
||||||
|
close.scale_y = 0;
|
||||||
|
|
||||||
|
close.button_release_event.connect (() => {
|
||||||
|
space.list_windows ().foreach ((w) => {
|
||||||
|
if (w.window_type != WindowType.DOCK) {
|
||||||
|
var gw = Gdk.X11Window.foreign_new_for_display (Gdk.Display.get_default (),
|
||||||
|
w.get_xwindow ());
|
||||||
|
if (gw != null)
|
||||||
|
gw.destroy ();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
Timeout.add (250, () => { //give the windows time to close
|
||||||
|
screen.remove_workspace (space, screen.get_display ().get_current_time ());
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
hide ();
|
||||||
|
return true;
|
||||||
|
});
|
||||||
|
|
||||||
group.reactive = true;
|
group.reactive = true;
|
||||||
group.button_release_event.connect (() => {
|
group.button_release_event.connect (() => {
|
||||||
space.activate (plugin.get_screen ().get_display ().get_current_time ());
|
space.activate (plugin.get_screen ().get_display ().get_current_time ());
|
||||||
@ -414,6 +465,14 @@ namespace Gala
|
|||||||
hide ();
|
hide ();
|
||||||
return true;
|
return true;
|
||||||
});
|
});
|
||||||
|
group.enter_event.connect (() => {
|
||||||
|
close.animate (Clutter.AnimationMode.EASE_OUT_ELASTIC, 400, scale_x:1.0f, scale_y:1.0f);
|
||||||
|
return true;
|
||||||
|
});
|
||||||
|
group.leave_event.connect (() => {
|
||||||
|
close.animate (Clutter.AnimationMode.EASE_IN_QUAD, 400, scale_x:0.0f, scale_y:0.0f);
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
|
||||||
workspaces.add_child (group);
|
workspaces.add_child (group);
|
||||||
}
|
}
|
||||||
@ -421,10 +480,12 @@ namespace Gala
|
|||||||
var new_idx = screen.get_active_workspace ().index ();
|
var new_idx = screen.get_active_workspace ().index ();
|
||||||
|
|
||||||
workspaces.x = width / 2 - workspaces.width / 2;
|
workspaces.x = width / 2 - workspaces.width / 2;
|
||||||
workspaces.y = 25;
|
workspaces.y = 20;
|
||||||
|
|
||||||
current_workspace.y = workspaces.y - current_border;
|
current_workspace.y = workspaces.y - current_border;
|
||||||
|
|
||||||
|
scroll.y = height - 12;
|
||||||
|
|
||||||
visible = true;
|
visible = true;
|
||||||
grab_key_focus ();
|
grab_key_focus ();
|
||||||
Timeout.add (50, () => {
|
Timeout.add (50, () => {
|
||||||
@ -434,7 +495,14 @@ namespace Gala
|
|||||||
animating = false;
|
animating = false;
|
||||||
return false;
|
return false;
|
||||||
}); //catch hot corner hiding problem and indicator placement
|
}); //catch hot corner hiding problem and indicator placement
|
||||||
|
|
||||||
animate (Clutter.AnimationMode.EASE_OUT_QUAD, 250, y : area.height - height, opacity : 255);
|
animate (Clutter.AnimationMode.EASE_OUT_QUAD, 250, y : area.height - height, opacity : 255);
|
||||||
|
|
||||||
|
scroll.visible = workspaces.width > width;
|
||||||
|
if (scroll.visible) {
|
||||||
|
scroll.width = width/workspaces.width*width;
|
||||||
|
workspaces.x = 0.0f;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public new void hide ()
|
public new void hide ()
|
||||||
|
Loading…
Reference in New Issue
Block a user