summaryrefslogtreecommitdiff
path: root/src/renderers
diff options
context:
space:
mode:
Diffstat (limited to 'src/renderers')
-rw-r--r--src/renderers/pieRenderer.vala42
-rw-r--r--src/renderers/pieWindow.vala23
-rw-r--r--src/renderers/sliceRenderer.vala32
3 files changed, 79 insertions, 18 deletions
diff --git a/src/renderers/pieRenderer.vala b/src/renderers/pieRenderer.vala
index 67a6b56..09c5f7a 100644
--- a/src/renderers/pieRenderer.vala
+++ b/src/renderers/pieRenderer.vala
@@ -58,23 +58,23 @@ public class PieRenderer : GLib.Object {
public bool turbo_mode { get; private set; default=false; }
/////////////////////////////////////////////////////////////////////
- /// All SliceRenderers used to draw this Pie.
+ /// True if the pie is currently navigated with the keyboard. This is
+ /// set to false as soon as the mouse moves.
/////////////////////////////////////////////////////////////////////
- private Gee.ArrayList<SliceRenderer?> slices;
+ public bool key_board_control { get; set; default=false; }
/////////////////////////////////////////////////////////////////////
- /// The renderer for the center of this pie.
+ /// All SliceRenderers used to draw this Pie.
/////////////////////////////////////////////////////////////////////
- private CenterRenderer center;
+ private Gee.ArrayList<SliceRenderer?> slices;
/////////////////////////////////////////////////////////////////////
- /// True if the pie is currently navigated with the keyboard. This is
- /// set to false as soon as the mouse moves.
+ /// The renderer for the center of this pie.
/////////////////////////////////////////////////////////////////////
- private bool key_board_control = false;
+ private CenterRenderer center;
/////////////////////////////////////////////////////////////////////
/// C'tor, initializes members.
@@ -130,9 +130,21 @@ public class PieRenderer : GLib.Object {
/////////////////////////////////////////////////////////////////////
public void activate() {
- if (this.active_slice >= 0 && this.active_slice < this.slices.size)
+ if (this.active_slice >= 0 && this.active_slice < this.slices.size) {
slices[active_slice].activate();
- this.cancel();
+
+ if (this.active_slice == this.quickaction)
+ Logger.stats("ACTIVATE QUICKACTION %d".printf(this.active_slice));
+ else
+ Logger.stats("ACTIVATE %d".printf(this.active_slice));
+ } else {
+ Logger.stats("CANCEL");
+ }
+
+ foreach (var slice in this.slices)
+ slice.fade_out();
+
+ center.fade_out();
}
/////////////////////////////////////////////////////////////////////
@@ -144,6 +156,8 @@ public class PieRenderer : GLib.Object {
slice.fade_out();
center.fade_out();
+
+ Logger.stats("CANCEL");
}
/////////////////////////////////////////////////////////////////////
@@ -161,6 +175,8 @@ public class PieRenderer : GLib.Object {
this.set_highlighted_slice(this.active_slice+1);
else if (this.active_slice != top)
this.set_highlighted_slice((this.active_slice-1+this.slice_count())%this.slice_count());
+
+ this.key_board_control = true;
}
/////////////////////////////////////////////////////////////////////
@@ -178,6 +194,8 @@ public class PieRenderer : GLib.Object {
this.set_highlighted_slice(this.active_slice-1);
else if (this.active_slice != bottom)
this.set_highlighted_slice((this.active_slice+1)%this.slice_count());
+
+ this.key_board_control = true;
}
/////////////////////////////////////////////////////////////////////
@@ -195,6 +213,8 @@ public class PieRenderer : GLib.Object {
this.set_highlighted_slice(this.active_slice-1);
else if (this.active_slice < left)
this.set_highlighted_slice(this.active_slice+1);
+
+ this.key_board_control = true;
}
/////////////////////////////////////////////////////////////////////
@@ -212,6 +232,8 @@ public class PieRenderer : GLib.Object {
this.set_highlighted_slice((this.active_slice+1)%this.slice_count());
else if (this.active_slice < left && this.active_slice != right)
this.set_highlighted_slice((this.active_slice-1+this.slice_count())%this.slice_count());
+
+ this.key_board_control = true;
}
/////////////////////////////////////////////////////////////////////
@@ -292,8 +314,6 @@ public class PieRenderer : GLib.Object {
foreach (var slice in this.slices)
slice.set_active_slice(active);
-
- this.key_board_control = true;
}
}
}
diff --git a/src/renderers/pieWindow.vala b/src/renderers/pieWindow.vala
index 54dd691..852a739 100644
--- a/src/renderers/pieWindow.vala
+++ b/src/renderers/pieWindow.vala
@@ -193,6 +193,28 @@ public class PieWindow : Gtk.Window {
}
/////////////////////////////////////////////////////////////////////
+ /// Opens the window at a given location.
+ /////////////////////////////////////////////////////////////////////
+
+ public void open_at(int at_x, int at_y) {
+ this.open();
+ this.move(at_x-this.width_request/2, at_y-this.height_request/2);
+ }
+
+ /////////////////////////////////////////////////////////////////////
+ /// Gets the center position of the window.
+ /////////////////////////////////////////////////////////////////////
+
+ public void get_center_pos(out int out_x, out int out_y) {
+ int x=0, y=0, width=0, height=0;
+ this.get_position(out x, out y);
+ this.get_size(out width, out height);
+
+ out_x = x + width/2;
+ out_y = y + height/2;
+ }
+
+ /////////////////////////////////////////////////////////////////////
/// Draw the Pie.
/////////////////////////////////////////////////////////////////////
@@ -303,6 +325,7 @@ public class PieWindow : Gtk.Window {
else if (key >= 65 && key <= 90) index = (int)key - 55;
if (index >= 0 && index < this.renderer.slice_count()) {
+ this.renderer.key_board_control = true;
this.renderer.set_highlighted_slice(index);
if (this.renderer.active_slice == index) {
diff --git a/src/renderers/sliceRenderer.vala b/src/renderers/sliceRenderer.vala
index 4803070..743f13e 100644
--- a/src/renderers/sliceRenderer.vala
+++ b/src/renderers/sliceRenderer.vala
@@ -86,6 +86,7 @@ public class SliceRenderer : GLib.Object {
private AnimatedValue alpha; // for fading in/out
private AnimatedValue fade_rotation; // for fading in/out
private AnimatedValue fade_scale; // for fading in/out
+ private AnimatedValue wobble; // for organic wobbling
/////////////////////////////////////////////////////////////////////
/// C'tor, initializes all AnimatedValues.
@@ -94,9 +95,10 @@ public class SliceRenderer : GLib.Object {
public SliceRenderer(PieRenderer parent) {
this.parent = parent;
- this.fade = new AnimatedValue.linear(0.0, 0.0, Config.global.theme.transition_time);
- this.alpha = new AnimatedValue.linear(0.0, 1.0, Config.global.theme.fade_in_time);
- this.scale = new AnimatedValue.cubic(AnimatedValue.Direction.OUT,
+ this.fade = new AnimatedValue.linear(0.0, 0.0, Config.global.theme.transition_time);
+ this.wobble = new AnimatedValue.linear(0.0, 0.0, Config.global.theme.transition_time);
+ this.alpha = new AnimatedValue.linear(0.0, 1.0, Config.global.theme.fade_in_time);
+ this.scale = new AnimatedValue.cubic(AnimatedValue.Direction.OUT,
1.0/Config.global.theme.max_zoom,
1.0/Config.global.theme.max_zoom,
Config.global.theme.transition_time,
@@ -127,8 +129,8 @@ public class SliceRenderer : GLib.Object {
Config.global.theme.caption_color,
Config.global.global_scale);
- this.active_icon = new ThemedIcon(action.icon, true);
- this.inactive_icon = new ThemedIcon(action.icon, false);
+ this.active_icon = new ThemedIcon(action.name, action.icon, true);
+ this.inactive_icon = new ThemedIcon(action.name, action.icon, false);
this.color = new Color.from_icon(this.active_icon);
@@ -195,20 +197,36 @@ public class SliceRenderer : GLib.Object {
this.fade.update(frame_time);
this.fade_scale.update(frame_time);
this.fade_rotation.update(frame_time);
+ this.wobble.update(frame_time);
double direction = 2.0 * PI * position/parent.slice_count() + this.fade_rotation.val;
double max_scale = 1.0/Config.global.theme.max_zoom;
double diff = fabs(angle-direction);
-
+
if (diff > PI)
diff = 2 * PI - diff;
+
+ active = ((parent.active_slice >= 0) && (diff < PI/parent.slice_count()));
+
+ if (parent.active_slice >= 0) {
+ double wobble = Config.global.theme.wobble*diff/PI*(1-diff/PI);
+ if ((direction < angle && direction > angle - PI) || direction > PI+angle) {
+ this.wobble.reset_target(-wobble, Config.global.theme.transition_time*0.5);
+ } else {
+ this.wobble.reset_target(wobble, Config.global.theme.transition_time*0.5);
+ }
+ } else {
+ this.wobble.reset_target(0, Config.global.theme.transition_time*0.5);
+ }
+
+ direction += this.wobble.val;
if (diff < 2 * PI * Config.global.theme.zoom_range)
max_scale = (Config.global.theme.max_zoom/(diff * (Config.global.theme.max_zoom - 1)
/(2 * PI * Config.global.theme.zoom_range) + 1))
/Config.global.theme.max_zoom;
- active = ((parent.active_slice >= 0) && (diff < PI/parent.slice_count()));
+
max_scale = (parent.active_slice >= 0 ? max_scale : 1.0/Config.global.theme.max_zoom);