diff options
Diffstat (limited to 'src/renderers/sliceRenderer.vala')
-rw-r--r-- | src/renderers/sliceRenderer.vala | 148 |
1 files changed, 74 insertions, 74 deletions
diff --git a/src/renderers/sliceRenderer.vala b/src/renderers/sliceRenderer.vala index 743f13e..2ecf7c4 100644 --- a/src/renderers/sliceRenderer.vala +++ b/src/renderers/sliceRenderer.vala @@ -1,4 +1,4 @@ -/* +/* Copyright (c) 2011 by Simon Schneegans This program is free software: you can redistribute it and/or modify it @@ -12,14 +12,14 @@ FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with -this program. If not, see <http://www.gnu.org/licenses/>. +this program. If not, see <http://www.gnu.org/licenses/>. */ using GLib.Math; namespace GnomePie { -///////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////// /// Renders a Slice of a Pie. According to the current theme. ///////////////////////////////////////////////////////////////////////// @@ -30,57 +30,57 @@ public class SliceRenderer : GLib.Object { ///////////////////////////////////////////////////////////////////// public bool active {get; private set; default = false;} - + ///////////////////////////////////////////////////////////////////// /// The Image which should be displayed as center caption when this /// slice is active. ///////////////////////////////////////////////////////////////////// - + public Image caption {get; private set;} - + ///////////////////////////////////////////////////////////////////// /// The color which should be used for colorizing center layers when /// this slice is active. ///////////////////////////////////////////////////////////////////// - + public Color color {get; private set;} - + ///////////////////////////////////////////////////////////////////// /// The two Images used, when this slice is active or not. ///////////////////////////////////////////////////////////////////// - + private Image active_icon; private Image inactive_icon; - + ///////////////////////////////////////////////////////////////////// /// The Image displaying the associated hot key of this slice. ///////////////////////////////////////////////////////////////////// - + private Image hotkey; - + ///////////////////////////////////////////////////////////////////// /// The Action which is rendered by this SliceRenderer. ///////////////////////////////////////////////////////////////////// - + private Action action; - + ///////////////////////////////////////////////////////////////////// /// The PieRenderer which owns this SliceRenderer. ///////////////////////////////////////////////////////////////////// - private unowned PieRenderer parent; - + private unowned PieRenderer parent; + ///////////////////////////////////////////////////////////////////// /// The index of this slice in a pie. Clockwise assigned, starting /// from the right-most slice. ///////////////////////////////////////////////////////////////////// - + private int position; - + ///////////////////////////////////////////////////////////////////// /// AnimatedValues needed for a slice. ///////////////////////////////////////////////////////////////////// - + private AnimatedValue fade; // for transitions from active to inactive private AnimatedValue scale; // for zoom effect private AnimatedValue alpha; // for fading in/out @@ -94,24 +94,24 @@ 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.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, + 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, Config.global.theme.springiness); - this.fade_scale = new AnimatedValue.cubic(AnimatedValue.Direction.OUT, - Config.global.theme.fade_in_zoom, 1.0, - Config.global.theme.fade_in_time, + this.fade_scale = new AnimatedValue.cubic(AnimatedValue.Direction.OUT, + Config.global.theme.fade_in_zoom, 1.0, + Config.global.theme.fade_in_time, Config.global.theme.springiness); - this.fade_rotation = new AnimatedValue.cubic(AnimatedValue.Direction.OUT, - Config.global.theme.fade_in_rotation, 0.0, + this.fade_rotation = new AnimatedValue.cubic(AnimatedValue.Direction.OUT, + Config.global.theme.fade_in_rotation, 0.0, Config.global.theme.fade_in_time); } - + ///////////////////////////////////////////////////////////////////// /// Loads an Action. All members are initialized accordingly. ///////////////////////////////////////////////////////////////////// @@ -119,64 +119,64 @@ public class SliceRenderer : GLib.Object { public void load(Action action, int position) { this.position = position; this.action = action; - - + + if (Config.global.theme.caption) - this.caption = new RenderedText(action.name, + this.caption = new RenderedText(action.name, Config.global.theme.caption_width, Config.global.theme.caption_height, Config.global.theme.caption_font, Config.global.theme.caption_color, Config.global.global_scale); - + 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); - + string hotkey_label = ""; if (position < 10) { - hotkey_label = "%u".printf(position); + hotkey_label = "%u".printf((position+1)%10); } else if (position < 36) { hotkey_label = "%c".printf((char)(55 + position)); } - + this.hotkey = new RenderedText(hotkey_label, (int)Config.global.theme.slice_radius*2, (int)Config.global.theme.slice_radius*2, "sans 20", Config.global.theme.caption_color, Config.global.global_scale); } - + ///////////////////////////////////////////////////////////////////// /// Activaes the Action of this slice. ///////////////////////////////////////////////////////////////////// - + public void activate() { action.activate(); } - + ///////////////////////////////////////////////////////////////////// /// Initiates the fade-out animation by resetting the targets of the /// AnimatedValues to 0.0. ///////////////////////////////////////////////////////////////////// - + public void fade_out() { this.alpha.reset_target(0.0, Config.global.theme.fade_out_time); - this.fade_scale = new AnimatedValue.cubic(AnimatedValue.Direction.IN, - this.fade_scale.val, - Config.global.theme.fade_out_zoom, - Config.global.theme.fade_out_time, + this.fade_scale = new AnimatedValue.cubic(AnimatedValue.Direction.IN, + this.fade_scale.val, + Config.global.theme.fade_out_zoom, + Config.global.theme.fade_out_time, Config.global.theme.springiness); - this.fade_rotation = new AnimatedValue.cubic(AnimatedValue.Direction.IN, - this.fade_rotation.val, - Config.global.theme.fade_out_rotation, + this.fade_rotation = new AnimatedValue.cubic(AnimatedValue.Direction.IN, + this.fade_rotation.val, + Config.global.theme.fade_out_rotation, Config.global.theme.fade_out_time); } - + ///////////////////////////////////////////////////////////////////// /// Should be called if the active slice of the PieRenderer changes. /// The members activity, caption and color are set accordingly. ///////////////////////////////////////////////////////////////////// - + public void set_active_slice(SliceRenderer? active_slice) { if (active_slice == this) { this.fade.reset_target(1.0, Config.global.theme.transition_time); @@ -184,13 +184,13 @@ public class SliceRenderer : GLib.Object { this.fade.reset_target(0.0, Config.global.theme.transition_time); } } - + ///////////////////////////////////////////////////////////////////// /// Draws all layers of the slice. ///////////////////////////////////////////////////////////////////// public void draw(double frame_time, Cairo.Context ctx, double angle, double distance) { - + // update the AnimatedValues this.scale.update(frame_time); this.alpha.update(frame_time); @@ -198,16 +198,16 @@ public class SliceRenderer : GLib.Object { 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) { @@ -218,61 +218,61 @@ public class SliceRenderer : GLib.Object { } 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; - - - + + + max_scale = (parent.active_slice >= 0 ? max_scale : 1.0/Config.global.theme.max_zoom); - + if (fabs(this.scale.end - max_scale) > Config.global.theme.max_zoom*0.005) this.scale.reset_target(max_scale, Config.global.theme.transition_time); - + ctx.save(); - + // distance from the center double radius = Config.global.theme.radius; - + // increase radius if there are many slices in a pie if (atan((Config.global.theme.slice_radius+Config.global.theme.slice_gap) /(radius/Config.global.theme.max_zoom)) > PI/parent.slice_count()) { radius = (Config.global.theme.slice_radius+Config.global.theme.slice_gap) /tan(PI/parent.slice_count())*Config.global.theme.max_zoom; } - + // transform the context ctx.scale(scale.val*fade_scale.val, scale.val*fade_scale.val); ctx.translate(cos(direction)*radius, sin(direction)*radius); - + ctx.push_group(); - + ctx.set_operator(Cairo.Operator.ADD); - + // paint the images if (fade.val > 0.0) active_icon.paint_on(ctx, this.alpha.val*this.fade.val); if (fade.val < 1.0) inactive_icon.paint_on(ctx, this.alpha.val*(1.0 - fade.val)); - + if (this.parent.show_hotkeys) { ctx.set_operator(Cairo.Operator.ATOP); ctx.set_source_rgba(0, 0, 0, 0.5); ctx.paint(); } - + ctx.set_operator(Cairo.Operator.OVER); - - + + ctx.pop_group_to_source(); ctx.paint(); - + // draw hotkeys if necassary if (this.parent.show_hotkeys) this.hotkey.paint_on(ctx, 1.0); - + ctx.restore(); } } |