Compare commits

...

3 Commits

Author SHA1 Message Date
Nelson Benítez León
bab2bf2596 widget-factory: add example on styling tooltip window
by using new api:
  gtk_tooltip_set_css_class()
  GtkWidget signals 'tooltip-show' and 'tooltip-hide'

Part of #5925
2023-07-09 17:07:09 -04:00
Nelson Benítez León
11b4e4a467 GtkWidget: add new signals 'tooltip-show' and 'tooltip-hide'
which are emitted when a tooltip window is about to be shown
on a widget, and when a tooltip window stopped being shown
on a widget.

These signals provide two convenient moments for where to style
our tooltip window in case we want to do so by adding a css
class to it.

The existant signal 'query-tooltip' could not be used for that
as it's triggered on motion events and we cannot distinguish
from that when the tooltip window gets shown or hidden.

Part of issue #5925
2023-07-09 17:07:09 -04:00
Nelson Benítez León
1cae0cd54c GtkToolTip: new API to add css classes to GtkTooltipWindow
we add a simple API to allow styling GtkTooltip's window
by setting a css class on it:

void gtk_tooltip_set_css_class (GtkTooltip *tooltip,
                                const char *css_class);

By passing NULL it will remove any previously set css class
by this function.

Issue #5925
2023-07-09 17:07:09 -04:00
8 changed files with 145 additions and 2 deletions

View File

@@ -153,6 +153,35 @@ get_busy (GSimpleAction *action,
gtk_widget_set_sensitive (window, FALSE);
}
static void
search_button_tooltip_show (GtkWidget *self,
GtkTooltip *tooltip)
{
static int style = 0;
if (style == 0)
{
gtk_tooltip_set_css_class (tooltip, "red-tooltip");
style++;
}
else if (style == 1)
{
gtk_tooltip_set_css_class (tooltip, "yellow-tooltip");
style++;
}
else
{
style = 0;
}
}
static void
search_button_tooltip_hide (GtkWidget *self,
GtkTooltip *tooltip)
{
gtk_tooltip_set_css_class (tooltip, NULL);
}
static int current_page = 0;
static gboolean
on_page (int i)
@@ -2221,6 +2250,8 @@ activate (GApplication *app)
gtk_builder_cscope_add_callback (scope, level_scale_value_changed);
gtk_builder_cscope_add_callback (scope, transition_speed_changed);
gtk_builder_cscope_add_callback (scope, reset_icon_size);
gtk_builder_cscope_add_callback (scope, search_button_tooltip_show);
gtk_builder_cscope_add_callback (scope, search_button_tooltip_hide);
gtk_builder_set_scope (builder, scope);
g_object_unref (scope);
if (!gtk_builder_add_from_resource (builder, "/org/gtk/WidgetFactory4/widget-factory.ui", &error))

View File

@@ -6,3 +6,12 @@
.toolbar {
-gtk-icon-style: symbolic;
}
.red-tooltip {
background-color: red;
}
.yellow-tooltip {
background-color: yellow;
color: black;
}

View File

@@ -257,7 +257,9 @@
</object>
<object class="GtkTextBuffer" id="textbuffer1">
<property name="tag-table">tags</property>
<property name="text">Lorem ipsum dolor sit amet, consectetur adipiscing elit.
<property name="text">Search button above will display its tooltip in an alternating red, yellow and default style.
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Nullam fringilla, est ut feugiat ultrices, elit lacus ultricies nibh, id commodo tortor nisi id elit.
Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.
Morbi vel elit erat. Maecenas dignissim, dui et pharetra rutrum, tellus lectus rutrum mi, a convallis libero nisi quis tellus.
@@ -1921,6 +1923,8 @@ microphone-sensitivity-medium-symbolic</property>
<property name="icon-name">edit-find</property>
<property name="action-name">win.search</property>
<property name="tooltip-text" translatable="1">Search for it</property>
<signal name="tooltip-show" handler="search_button_tooltip_show"/>
<signal name="tooltip-hide" handler="search_button_tooltip_hide"/>
</object>
</child>
<child>

View File

@@ -755,6 +755,8 @@ gtk_tooltip_show_tooltip (GdkDisplay *display)
gtk_tooltip_position (tooltip, display, tooltip_widget, device);
g_signal_emit_by_name (tooltip_widget, "tooltip-show", tooltip);
gtk_widget_set_visible (GTK_WIDGET (tooltip->window), TRUE);
/* Now a tooltip is visible again on the display, make sure browse
@@ -771,6 +773,8 @@ gtk_tooltip_show_tooltip (GdkDisplay *display)
static void
gtk_tooltip_hide_tooltip (GtkTooltip *tooltip)
{
GtkWidget *tooltip_widget;
guint timeout = BROWSE_DISABLE_TIMEOUT;
if (!tooltip)
@@ -785,6 +789,7 @@ gtk_tooltip_hide_tooltip (GtkTooltip *tooltip)
if (!GTK_TOOLTIP_VISIBLE (tooltip))
return;
tooltip_widget = tooltip->tooltip_widget;
tooltip->tooltip_widget = NULL;
/* The tooltip is gone, after (by default, should be configurable) 500ms
@@ -801,7 +806,10 @@ gtk_tooltip_hide_tooltip (GtkTooltip *tooltip)
}
if (tooltip->window)
gtk_widget_set_visible (tooltip->window, FALSE);
{
gtk_widget_set_visible (tooltip->window, FALSE);
g_signal_emit_by_name (tooltip_widget, "tooltip-hide", tooltip);
}
}
static int
@@ -1065,3 +1073,26 @@ gtk_tooltip_unset_surface (GtkNative *native)
gtk_tooltip_set_surface (tooltip, NULL);
}
/**
* gtk_tooltip_set_css_class:
* @tooltip: a #GtkTooltip
* @css_class: (allow-none): a css class name, or %NULL
*
* This function allows to add a single css class
* to @tooltip window, that means it will remove any
* css class previously added by this function before
* adding @css_class as the currently active one.
*
* if %NULL is passed then any active css class (which
* was added by this function) will be cleared.
*
* Since: 4.12
*/
void
gtk_tooltip_set_css_class (GtkTooltip *tooltip,
const char *css_class)
{
g_return_if_fail (GTK_IS_TOOLTIP (tooltip));
gtk_tooltip_window_set_css_class (GTK_TOOLTIP_WINDOW (tooltip->window), css_class);
}

View File

@@ -56,6 +56,9 @@ void gtk_tooltip_set_custom (GtkTooltip *tooltip,
GDK_AVAILABLE_IN_ALL
void gtk_tooltip_set_tip_area (GtkTooltip *tooltip,
const GdkRectangle *rect);
GDK_AVAILABLE_IN_4_12
void gtk_tooltip_set_css_class (GtkTooltip *tooltip,
const char *css_class);
G_DEFINE_AUTOPTR_CLEANUP_FUNC(GtkTooltip, g_object_unref)

View File

@@ -59,6 +59,7 @@ struct _GtkTooltipWindow
GtkWidget *image;
GtkWidget *label;
GtkWidget *custom_widget;
char *css_class;
};
struct _GtkTooltipWindowClass
@@ -392,6 +393,7 @@ static void
gtk_tooltip_window_init (GtkTooltipWindow *self)
{
gtk_widget_init_template (GTK_WIDGET (self));
self->css_class = NULL;
}
GtkWidget *
@@ -520,3 +522,30 @@ gtk_tooltip_window_position (GtkTooltipWindow *window,
gtk_tooltip_window_relayout (window);
}
/* See gtk_tooltip_set_css_class() description */
void
gtk_tooltip_window_set_css_class (GtkTooltipWindow *window,
const char *css_class)
{
GtkWidget *wid = GTK_WIDGET (window);
if (g_strcmp0 (window->css_class, css_class) == 0)
return;
if (css_class)
{
if (window->css_class)
{
gtk_widget_remove_css_class (wid, window->css_class);
g_free (window->css_class);
}
window->css_class = g_strdup (css_class);
gtk_widget_add_css_class (wid, css_class);
}
else
{
gtk_widget_remove_css_class (wid, window->css_class);
g_clear_pointer (&window->css_class, g_free);
}
}

View File

@@ -59,6 +59,8 @@ void gtk_tooltip_window_position (GtkTooltipWindo
GdkAnchorHints anchor_hints,
int dx,
int dy);
void gtk_tooltip_window_set_css_class (GtkTooltipWindow *window,
const char *css_class);
G_END_DECLS

View File

@@ -502,6 +502,8 @@ enum {
MOVE_FOCUS,
KEYNAV_FAILED,
QUERY_TOOLTIP,
TOOLTIP_SHOW,
TOOLTIP_HIDE,
LAST_SIGNAL
};
@@ -1926,6 +1928,38 @@ gtk_widget_class_init (GtkWidgetClass *klass)
gtk_widget_class_set_css_name (klass, I_("widget"));
klass->priv->accessible_role = GTK_ACCESSIBLE_ROLE_WIDGET;
/**
* GtkWidget::tooltip-show:
* @widget: the object which received the signal.
*
* Emitted when a tooltip is about to be shown on @widget.
*/
widget_signals[TOOLTIP_SHOW] =
g_signal_new (I_("tooltip-show"),
G_TYPE_FROM_CLASS (gobject_class),
G_SIGNAL_RUN_FIRST,
0,
NULL, NULL,
NULL,
G_TYPE_NONE, 1,
GTK_TYPE_TOOLTIP);
/**
* GtkWidget::tooltip-hide:
* @widget: the object which received the signal.
*
* Emitted when a tooltip on @widget has just been hidden.
*/
widget_signals[TOOLTIP_HIDE] =
g_signal_new (I_("tooltip-hide"),
G_TYPE_FROM_CLASS (gobject_class),
G_SIGNAL_RUN_FIRST,
0,
NULL, NULL,
NULL,
G_TYPE_NONE, 1,
GTK_TYPE_TOOLTIP);
}
static void