diff --git a/lib/Drawing/Color.vala b/lib/Drawing/Color.vala index 6f3a6d3e..2fc9ed64 100644 --- a/lib/Drawing/Color.vala +++ b/lib/Drawing/Color.vala @@ -13,6 +13,9 @@ namespace Gala.Drawing { * A class containing an RGBA color and methods for more powerful color manipulation. */ public class Color : GLib.Object, SettingsSerializable { + public const Gdk.RGBA TOOLTIP_BACKGROUND = { 0, 0, 0, 1}; + public const Gdk.RGBA TOOLTIP_TEXT_COLOR = { 1, 1, 1, 1}; + /** * The value of the red channel, with 0 being the lowest value and 1.0 being the greatest value. */ diff --git a/src/Widgets/Tooltip.vala b/src/Widgets/Tooltip.vala index 14611aa8..5af4976e 100644 --- a/src/Widgets/Tooltip.vala +++ b/src/Widgets/Tooltip.vala @@ -8,20 +8,10 @@ * Clutter actor to display text in a tooltip-like component. */ public class Gala.Tooltip : CanvasActor { - private static Clutter.Color text_color; - private static Gtk.Border padding; - private static Gtk.StyleContext style_context; - /** * Actor to display the Tooltip text. */ - private Clutter.Text? text_actor = null; - - /** - * Text displayed in the Tooltip. - * @see set_text - */ - private string text; + private Clutter.Text text_actor; /** * Maximum width of the Tooltip. @@ -30,97 +20,49 @@ public class Gala.Tooltip : CanvasActor { public float max_width; construct { - text = ""; max_width = 200; - resize (); - } - - private static void create_gtk_objects () { - var tooltip_widget_path = new Gtk.WidgetPath (); - var pos = tooltip_widget_path.append_type (typeof (Gtk.Window)); - tooltip_widget_path.iter_set_object_name (pos, "tooltip"); - tooltip_widget_path.iter_add_class (pos, Gtk.STYLE_CLASS_CSD); - tooltip_widget_path.iter_add_class (pos, Gtk.STYLE_CLASS_BACKGROUND); - - style_context = new Gtk.StyleContext (); - style_context.set_path (tooltip_widget_path); - - padding = style_context.get_padding (Gtk.StateFlags.NORMAL); - - tooltip_widget_path.append_type (typeof (Gtk.Label)); - - var label_style_context = new Gtk.StyleContext (); - label_style_context.set_path (tooltip_widget_path); - - var text_rgba = (Gdk.RGBA) label_style_context.get_property ( - Gtk.STYLE_PROPERTY_COLOR, - Gtk.StateFlags.NORMAL - ); - - text_color = Clutter.Color () { - red = (uint8) text_rgba.red * uint8.MAX, - green = (uint8) text_rgba.green * uint8.MAX, - blue = (uint8) text_rgba.blue * uint8.MAX, - alpha = (uint8) text_rgba.alpha * uint8.MAX, + Clutter.Color text_color = { + (uint8) Drawing.Color.TOOLTIP_TEXT_COLOR.red * uint8.MAX, + (uint8) Drawing.Color.TOOLTIP_TEXT_COLOR.green * uint8.MAX, + (uint8) Drawing.Color.TOOLTIP_TEXT_COLOR.blue * uint8.MAX, + (uint8) Drawing.Color.TOOLTIP_TEXT_COLOR.alpha * uint8.MAX, }; - } - - public void set_text (string new_text, bool redraw = true) { - text = new_text; - - if (redraw) { - resize (); - } - } - - public void set_max_width (float new_max_width, bool redraw = true) { - max_width = new_max_width; - - if (redraw) { - resize (); - } - } - - private void resize () { - visible = (text.length != 0); - - if (!visible) { - return; - } - - // First set the text - if (text_actor != null) { - remove_child (text_actor); - } text_actor = new Clutter.Text () { - color = text_color, - x = padding.left, - y = padding.top, - ellipsize = Pango.EllipsizeMode.MIDDLE + margin_left = 6, + margin_top = 6, + margin_bottom = 6, + margin_right = 6, + ellipsize = Pango.EllipsizeMode.MIDDLE, + color = text_color }; - text_actor.text = text; - - if ((text_actor.width + padding.left + padding.right) > max_width) { - text_actor.width = max_width - padding.left - padding.right; - } add_child (text_actor); - // Adjust the size of the tooltip to the text - width = text_actor.width + padding.left + padding.right; - height = text_actor.height + padding.top + padding.bottom; + layout_manager = new Clutter.BinLayout (); + } - //Failsafe that if by accident the size doesn't change we still redraw - content.invalidate (); + public void set_text (string new_text) { + text_actor.text = new_text; + } + + public void set_max_width (float new_max_width) { + max_width = new_max_width; + + queue_relayout (); + } + + protected override void allocate (Clutter.ActorBox box) { + if (box.get_width () > max_width) { + box.set_origin (box.get_x () + ((box.get_width () - max_width) / 2), box.get_y ()); + box.set_size (max_width, box.get_height ()); + } + + base.allocate (box); } protected override void draw (Cairo.Context ctx, int width, int height) { - if (style_context == null) { - create_gtk_objects (); - } - ctx.save (); ctx.set_operator (Cairo.Operator.CLEAR); ctx.paint (); @@ -128,7 +70,16 @@ public class Gala.Tooltip : CanvasActor { ctx.reset_clip (); ctx.set_operator (Cairo.Operator.OVER); - style_context.render_background (ctx, 0, 0, width, height); + var background_color = Drawing.Color.TOOLTIP_BACKGROUND; + ctx.set_source_rgba ( + background_color.red, + background_color.green, + background_color.blue, + background_color.alpha + ); + + Drawing.Utilities.cairo_rounded_rectangle (ctx, 0, 0, width, height, 4); + ctx.fill (); ctx.restore (); } diff --git a/src/Widgets/WindowClone.vala b/src/Widgets/WindowClone.vala index cc23fe51..cba4aa85 100644 --- a/src/Widgets/WindowClone.vala +++ b/src/Widgets/WindowClone.vala @@ -541,7 +541,7 @@ public class Gala.WindowClone : Clutter.Actor { close_button.opacity = show ? 255 : 0; window_title.opacity = close_button.opacity; - window_title.set_text (window.get_title () ?? "", false); + window_title.set_text (window.get_title () ?? ""); window_title.set_max_width (dest_width - InternalUtils.scale_to_int (TITLE_MAX_WIDTH_MARGIN, scale_factor)); set_window_title_position (dest_width, dest_height, scale_factor); }