diff options
Diffstat (limited to 'src/themes')
-rw-r--r-- | src/themes/sliceLayer.vala | 50 | ||||
-rw-r--r-- | src/themes/theme.vala | 61 |
2 files changed, 99 insertions, 12 deletions
diff --git a/src/themes/sliceLayer.vala b/src/themes/sliceLayer.vala index 2620912..3c650c0 100644 --- a/src/themes/sliceLayer.vala +++ b/src/themes/sliceLayer.vala @@ -23,31 +23,63 @@ namespace GnomePie { ///////////////////////////////////////////////////////////////////////// public class SliceLayer : GLib.Object { + + public enum Type { FILE, ICON, CAPTION } + public enum Visibility { ANY, WITH_CAPTION, WITHOUT_CAPTION } + + public Type layer_type { get; private set; } + public Visibility visibility { get; private set; } ///////////////////////////////////////////////////////////////////// /// Information on the contained image. ///////////////////////////////////////////////////////////////////// public Image image {get; set;} - public string icon_file {get; private set;} + ///////////////////////////////////////////////////////////////////// /// Properties of this layer. ///////////////////////////////////////////////////////////////////// - public bool colorize {get; private set; } - public bool is_icon {get; private set;} - public int icon_size {get; private set;} + public string icon_file {get; private set; default="";} + public bool colorize {get; private set; default=false;} + public int icon_size {get; private set; default=1;} + + public string font {get; private set; default="";} + public int width {get; private set; default=0;} + public int height {get; private set; default=0;} + public int position {get; private set; default=0;} + public Color color {get; private set; default=new Color();} ///////////////////////////////////////////////////////////////////// /// C'tor, initializes all members of the layer. ///////////////////////////////////////////////////////////////////// - public SliceLayer(string icon_file, int icon_size, bool colorize, bool is_icon) { + public SliceLayer.file(string icon_file, int icon_size, bool colorize, Visibility visibility) { + this.layer_type = Type.FILE; this.icon_file = icon_file; this.colorize = colorize; - this.is_icon = is_icon; this.icon_size = icon_size; + this.visibility = visibility; + } + + public SliceLayer.icon(string icon_file, int icon_size, bool colorize, Visibility visibility) { + this.layer_type = Type.ICON; + this.icon_file = icon_file; + this.colorize = colorize; + this.icon_size = icon_size; + this.visibility = visibility; + } + + public SliceLayer.caption(string font, int width, int height, int position, Color color, bool colorize, Visibility visibility) { + this.layer_type = Type.CAPTION; + this.font = font; + this.width = width; + this.height = height; + this.position = position; + this.color = color; + this.visibility = visibility; + this.colorize = colorize; } ///////////////////////////////////////////////////////////////////// @@ -55,9 +87,11 @@ public class SliceLayer : GLib.Object { ///////////////////////////////////////////////////////////////////// public void load_image() { - if (this.icon_file == "" && this.is_icon == true) + this.image = null; + + if (this.icon_file == "" && this.layer_type == Type.ICON) this.image = new Image.empty(this.icon_size, this.icon_size, new Color.from_rgb(1, 1, 1)); - else + else if (this.icon_file != "") this.image = new Image.from_file_at_size(this.icon_file, this.icon_size, this.icon_size); } } diff --git a/src/themes/theme.vala b/src/themes/theme.vala index 269a574..1956046 100644 --- a/src/themes/theme.vala +++ b/src/themes/theme.vala @@ -38,6 +38,7 @@ public class Theme : GLib.Object { public double max_zoom {get; private set; default=1.2;} public double zoom_range {get; private set; default=0.2;} public double transition_time {get; private set; default=0.5;} + public double wobble {get; private set; default=0.0;} public double fade_in_time {get; private set; default=0.2;} public double fade_out_time {get; private set; default=0.1;} public double fade_in_zoom {get; private set; default=1.0;} @@ -49,6 +50,7 @@ public class Theme : GLib.Object { public double active_radius {get; private set; default=45.0;} public double slice_radius {get; private set; default=32.0;} public double slice_gap {get; private set; default=14.0;} + public bool has_slice_captions {get; private set; default=false;} public bool caption {get; private set; default=false;} public string caption_font {get; private set; default="sans 12";} public int caption_width {get; private set; default=100;} @@ -182,6 +184,9 @@ public class Theme : GLib.Object { case "transitiontime": transition_time = double.parse(attr_content); break; + case "wobble": + wobble = double.parse(attr_content); + break; case "fadeintime": fade_in_time = double.parse(attr_content); break; @@ -403,8 +408,15 @@ public class Theme : GLib.Object { if (element_name == "slice_layer") { string file = ""; double scale = 1.0; - bool is_icon = false; + SliceLayer.Type type = SliceLayer.Type.FILE; + SliceLayer.Visibility visibility = SliceLayer.Visibility.ANY; bool colorize = false; + string slice_caption_font = "sans 8"; + int slice_caption_width = 50; + int slice_caption_height = 20; + int pos_x = 0; + int pos_y = 0; + Color slice_caption_color = new Color.from_rgb(1.0f, 1.0f, 1.0f); for (Xml.Attr* attribute = layer->properties; attribute != null; attribute = attribute->next) { string attr_name = attribute->name.down(); @@ -419,13 +431,46 @@ public class Theme : GLib.Object { break; case "type": if (attr_content == "icon") - is_icon = true; + type = SliceLayer.Type.ICON; + else if (attr_content == "caption") + type = SliceLayer.Type.CAPTION; else if (attr_content != "file") warning("Invalid attribute content " + attr_content + " for attribute " + attr_name + " in <slice_layer> element!"); break; case "colorize": colorize = bool.parse(attr_content); break; + case "font": + slice_caption_font = attr_content; + break; + case "width": + slice_caption_width = (int)(int.parse(attr_content) * Config.global.global_scale); + if (slice_caption_width % 2 == 1) + --slice_caption_width; + break; + case "height": + slice_caption_height = (int)(int.parse(attr_content) * Config.global.global_scale); + if (slice_caption_height % 2 == 1) + --slice_caption_height; + break; + case "x": + pos_x = (int)(double.parse(attr_content) * Config.global.global_scale); + break; + case "y": + pos_y = (int)(double.parse(attr_content) * Config.global.global_scale); + break; + case "color": + slice_caption_color = new Color.from_string(attr_content); + break; + case "visibility": + if (attr_content == "without_caption") + visibility = SliceLayer.Visibility.WITHOUT_CAPTION; + else if (attr_content == "with_caption") { + this.has_slice_captions = true; + visibility = SliceLayer.Visibility.WITH_CAPTION; + } else if (attr_content != "any") + warning("Invalid attribute content " + attr_content + " for attribute " + attr_name + " in <slice_layer> element!"); + break; default: warning("Invalid attribute \"" + attr_name + "\" in <slice_layer> element!"); break; @@ -438,9 +483,17 @@ public class Theme : GLib.Object { int size = 2*(int)(slice_radius*scale*max_zoom); if (slice->name.down() == "activeslice") { - active_slice_layers.add(new SliceLayer(file, size, colorize, is_icon)); + if (type == SliceLayer.Type.ICON) active_slice_layers.add(new SliceLayer.icon(file, size, colorize, visibility)); + else if (type == SliceLayer.Type.CAPTION) active_slice_layers.add(new SliceLayer.caption(slice_caption_font, + slice_caption_width, slice_caption_height, + pos_y, slice_caption_color, colorize, visibility)); + else active_slice_layers.add(new SliceLayer.file(file, size, colorize, visibility)); } else { - inactive_slice_layers.add(new SliceLayer(file, size, colorize, is_icon)); + if (type == SliceLayer.Type.ICON) inactive_slice_layers.add(new SliceLayer.icon(file, size, colorize, visibility)); + else if (type == SliceLayer.Type.CAPTION) inactive_slice_layers.add(new SliceLayer.caption(slice_caption_font, + slice_caption_width, slice_caption_height, + pos_y, slice_caption_color, colorize, visibility)); + else inactive_slice_layers.add(new SliceLayer.file(file, size, colorize, visibility)); } } else { |