Add GtkLabel:tabs

This adds more powerful formatting capabilities to GtkLabel
without costing us much, since Pango already supports tabs.
This commit is contained in:
Matthias Clasen
2022-07-31 11:40:20 -04:00
parent 9ca41e00d6
commit 1f856e4e82
2 changed files with 77 additions and 0 deletions

View File

@@ -256,6 +256,7 @@ struct _GtkLabel
Pango2AttrList *attrs;
Pango2AttrList *markup_attrs;
Pango2Layout *layout;
Pango2TabArray *tabs;
GtkWidget *popup_menu;
GMenuModel *extra_menu;
@@ -394,6 +395,7 @@ enum {
PROP_XALIGN,
PROP_YALIGN,
PROP_EXTRA_MENU,
PROP_TABS,
NUM_PROPERTIES
};
@@ -520,6 +522,9 @@ gtk_label_set_property (GObject *object,
case PROP_EXTRA_MENU:
gtk_label_set_extra_menu (self, g_value_get_object (value));
break;
case PROP_TABS:
gtk_label_set_tabs (self, g_value_get_boxed (value));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@@ -593,6 +598,9 @@ gtk_label_get_property (GObject *object,
case PROP_EXTRA_MENU:
g_value_set_object (value, gtk_label_get_extra_menu (self));
break;
case PROP_TABS:
g_value_set_boxed (value, self->tabs);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@@ -623,6 +631,7 @@ gtk_label_init (GtkLabel *self)
self->layout = NULL;
self->text = g_strdup ("");
self->attrs = NULL;
self->tabs = NULL;
self->mnemonic_widget = NULL;
@@ -1551,6 +1560,8 @@ gtk_label_finalize (GObject *object)
g_clear_pointer (&self->popup_menu, gtk_widget_unparent);
g_clear_object (&self->extra_menu);
g_clear_pointer (&self->tabs, pango2_tab_array_free);
G_OBJECT_CLASS (gtk_label_parent_class)->finalize (object);
}
@@ -2550,6 +2561,16 @@ gtk_label_class_init (GtkLabelClass *class)
G_TYPE_MENU_MODEL,
GTK_PARAM_READWRITE|G_PARAM_EXPLICIT_NOTIFY);
/**
* GtkLabel:tabs: (attributes org.gtk.Property.get=gtk_label_get_tabs org.gtk.Property.set=gtk_label_set_tabs)
*
* Custom tabs for this label.
*/
label_props[PROP_TABS] =
g_param_spec_boxed ("tabs", NULL, NULL,
PANGO2_TYPE_TAB_ARRAY,
GTK_PARAM_READWRITE|G_PARAM_EXPLICIT_NOTIFY);
g_object_class_install_properties (gobject_class, NUM_PROPERTIES, label_props);
/**
@@ -4156,6 +4177,8 @@ gtk_label_ensure_layout (GtkLabel *self)
if (self->ellipsize || self->wrap)
pango2_layout_set_width (self->layout, gtk_widget_get_width (GTK_WIDGET (self)) * PANGO2_SCALE);
pango2_layout_set_tabs (self->layout, self->tabs);
}
/**
@@ -5925,3 +5948,49 @@ gtk_label_get_extra_menu (GtkLabel *self)
return self->extra_menu;
}
/**
* gtk_label_set_tabs: (attributes org.gtk.Method.set_property=tabs)
* @self: a `GtkLabel`
* @tabs: (nullable): tabs as a `Pango2TabArray`
*
* Sets the default tab stops for paragraphs in @self.
*/
void
gtk_label_set_tabs (GtkLabel *self,
Pango2TabArray *tabs)
{
g_return_if_fail (GTK_IS_LABEL (self));
if (self->tabs == tabs)
return;
if (self->tabs)
pango2_tab_array_free (self->tabs);
self->tabs = pango2_tab_array_copy (tabs);
gtk_label_clear_layout (self);
g_object_notify_by_pspec (G_OBJECT (self), label_props[PROP_TABS]);
gtk_widget_queue_resize (GTK_WIDGET (self));
}
/**
* gtk_label_get_tabs: (attributes org.gtk.Method.get_property=tabs)
* @self: a `GtkLabel`
*
* Gets the tabs for @self.
*
* The returned array will be %NULL if “standard” (8-space) tabs are used.
* Free the return value with [method@Pango2.TabArray.free].
*
* Returns: (nullable) (transfer full): copy of default tab array,
* or %NULL if standard tabs are used; must be freed with
* [method@Pango2.TabArray.free].
*/
Pango2TabArray *
gtk_label_get_tabs (GtkLabel *self)
{
g_return_val_if_fail (GTK_IS_LABEL (self), NULL);
return self->tabs ? pango2_tab_array_copy (self->tabs) : NULL;
}

View File

@@ -177,6 +177,14 @@ void gtk_label_set_extra_menu (GtkLabel *self,
GDK_AVAILABLE_IN_ALL
GMenuModel * gtk_label_get_extra_menu (GtkLabel *self);
GDK_AVAILABLE_IN_ALL
void gtk_label_set_tabs (GtkLabel *self,
Pango2TabArray *tabs);
GDK_AVAILABLE_IN_ALL
Pango2TabArray * gtk_label_get_tabs (GtkLabel *self);
G_DEFINE_AUTOPTR_CLEANUP_FUNC(GtkLabel, g_object_unref)