Turn labels into page properties

This commit is contained in:
Matthias Clasen 2019-02-20 08:39:21 -05:00
parent 78c54b27d7
commit ff4b3f1170

View File

@ -284,6 +284,8 @@ enum {
CHILD_PROP_REORDERABLE,
CHILD_PROP_DETACHABLE,
CHILD_PROP_CHILD,
CHILD_PROP_TAB,
CHILD_PROP_MENU,
};
#define GTK_NOTEBOOK_PAGE_FROM_LIST(_glist_) ((GtkNotebookPage *)(_glist_)->data)
@ -302,6 +304,9 @@ struct _GtkNotebookPage
GtkWidget *tab_widget; /* widget used for the tab itself */
char *tab_text;
char *menu_text;
guint default_menu : 1; /* If true, we create the menu label ourself */
guint default_tab : 1; /* If true, we create the tab label ourself */
guint expand : 1;
@ -325,6 +330,8 @@ G_DEFINE_TYPE (GtkNotebookPage, gtk_notebook_page, G_TYPE_OBJECT)
static void
gtk_notebook_page_init (GtkNotebookPage *page)
{
page->default_tab = TRUE;
page->default_menu = TRUE;
}
static void
@ -336,6 +343,9 @@ gtk_notebook_page_finalize (GObject *object)
g_clear_object (&page->tab_label);
g_clear_object (&page->menu_label);
g_free (page->tab_text);
g_free (page->menu_text);
G_OBJECT_CLASS (gtk_notebook_page_parent_class)->finalize (object);
}
@ -354,12 +364,28 @@ gtk_notebook_page_set_property (GObject *object,
g_set_object (&page->child, g_value_get_object (value));
break;
case CHILD_PROP_TAB_LABEL:
case CHILD_PROP_TAB:
g_set_object (&page->tab_label, g_value_get_object (value));
page->default_tab = page->tab_label == NULL;
break;
case CHILD_PROP_MENU:
g_set_object (&page->menu_label, g_value_get_object (value));
page->default_menu = page->menu_label == NULL;
break;
case CHILD_PROP_TAB_LABEL:
g_free (page->tab_text);
page->tab_text = g_value_dup_string (value);
if (page->default_tab && GTK_IS_LABEL (page->tab_label))
gtk_label_set_label (GTK_LABEL (page->tab_label), page->tab_text);
break;
case CHILD_PROP_MENU_LABEL:
g_set_object (&page->tab_label, g_value_get_object (value));
g_free (page->menu_text);
page->menu_text = g_value_dup_string (value);
if (page->default_menu && GTK_IS_LABEL (page->menu_label))
gtk_label_set_label (GTK_LABEL (page->menu_label), page->menu_text);
break;
case CHILD_PROP_POSITION:
@ -405,14 +431,22 @@ gtk_notebook_page_get_property (GObject *object,
g_value_set_object (value, page->child);
break;
case CHILD_PROP_TAB_LABEL:
case CHILD_PROP_TAB:
g_value_set_object (value, page->tab_label);
break;
case CHILD_PROP_MENU_LABEL:
case CHILD_PROP_MENU:
g_value_set_object (value, page->menu_label);
break;
case CHILD_PROP_TAB_LABEL:
g_value_set_string (value, page->tab_text);
break;
case CHILD_PROP_MENU_LABEL:
g_value_set_string (value, page->menu_text);
break;
case CHILD_PROP_POSITION:
#if 0
g_value_set_int (value, g_list_position (priv->children, list));
@ -458,19 +492,33 @@ gtk_notebook_page_class_init (GtkNotebookPageClass *class)
GTK_TYPE_WIDGET,
GTK_PARAM_READWRITE|G_PARAM_CONSTRUCT_ONLY));
g_object_class_install_property (object_class,
CHILD_PROP_TAB_LABEL,
g_param_spec_object ("tab-label",
CHILD_PROP_TAB,
g_param_spec_object ("tab",
P_("Tab"),
P_("The tab widget for this page"),
GTK_TYPE_WIDGET,
GTK_PARAM_READWRITE|G_PARAM_CONSTRUCT_ONLY));
g_object_class_install_property (object_class,
CHILD_PROP_MENU_LABEL,
g_param_spec_object ("menu-label",
CHILD_PROP_MENU,
g_param_spec_object ("menu",
P_("Menu"),
P_("The label widget displayed in the childs menu entry"),
GTK_TYPE_WIDGET,
GTK_PARAM_READWRITE|G_PARAM_CONSTRUCT_ONLY));
g_object_class_install_property (object_class,
CHILD_PROP_TAB_LABEL,
g_param_spec_string ("tab-label",
P_("Tab label"),
P_("The text of the tab widget"),
NULL,
GTK_PARAM_READWRITE));
g_object_class_install_property (object_class,
CHILD_PROP_MENU_LABEL,
g_param_spec_string ("menu-label",
P_("Menu label"),
P_("The text of the menu widget"),
NULL,
GTK_PARAM_READWRITE));
g_object_class_install_property (object_class,
CHILD_PROP_POSITION,
g_param_spec_int ("position",
@ -696,7 +744,7 @@ static void gtk_notebook_menu_switch_page (GtkWidget *widget,
/*** GtkNotebook Menu Functions ***/
static void gtk_notebook_menu_item_create (GtkNotebook *notebook,
GList *list);
GtkNotebookPage *page);
static void gtk_notebook_menu_item_recreate (GtkNotebook *notebook,
GList *list);
static void gtk_notebook_menu_label_unparent (GtkWidget *widget,
@ -4130,25 +4178,16 @@ allocate_tab (GtkGizmo *gizmo,
}
static gint
gtk_notebook_real_insert_page (GtkNotebook *notebook,
GtkWidget *child,
GtkWidget *tab_label,
GtkWidget *menu_label,
gint position)
gtk_notebook_insert_notebook_page (GtkNotebook *notebook,
GtkNotebookPage *page,
int position)
{
GtkNotebookPrivate *priv = notebook->priv;
GtkNotebookPage *page;
gint nchildren;
GList *list;
GtkWidget *sibling;
gtk_widget_freeze_child_notify (child);
page = g_object_new (GTK_TYPE_NOTEBOOK_PAGE,
"child", child,
"tab-label", tab_label,
"menu-label", menu_label,
NULL);
gtk_widget_freeze_child_notify (page->child);
nchildren = g_list_length (priv->children);
if ((position < 0) || (position > nchildren))
@ -4163,30 +4202,21 @@ gtk_notebook_real_insert_page (GtkNotebook *notebook,
else
sibling = priv->arrow_widget[ARROW_RIGHT_AFTER];
page->tab_widget = gtk_gizmo_new ("tab",
measure_tab,
allocate_tab,
NULL);
page->tab_widget = gtk_gizmo_new ("tab", measure_tab, allocate_tab, NULL);
g_object_set_data (G_OBJECT (page->tab_widget), "notebook", notebook);
gtk_widget_insert_before (page->tab_widget, priv->tabs_widget, sibling);
if (!tab_label)
page->default_tab = TRUE;
if (!menu_label)
page->default_menu = TRUE;
page->expand = FALSE;
page->fill = TRUE;
if (priv->menu)
gtk_notebook_menu_item_create (notebook,
g_list_find (priv->children, page));
gtk_notebook_menu_item_create (notebook, page);
gtk_container_add (GTK_CONTAINER (priv->stack_widget), child);
gtk_container_add (GTK_CONTAINER (priv->stack_widget), page->child);
if (tab_label)
if (page->tab_label)
{
gtk_widget_set_parent (tab_label, page->tab_widget);
gtk_widget_set_parent (page->tab_label, page->tab_widget);
g_object_set_data (G_OBJECT (page->tab_label), "notebook", notebook);
}
@ -4195,28 +4225,24 @@ gtk_notebook_real_insert_page (GtkNotebook *notebook,
if (!priv->first_tab)
priv->first_tab = priv->children;
if (tab_label)
if (page->tab_label)
{
if (priv->show_tabs && gtk_widget_get_visible (child))
gtk_widget_show (tab_label);
if (priv->show_tabs && gtk_widget_get_visible (page->child))
gtk_widget_show (page->tab_label);
else
gtk_widget_hide (tab_label);
gtk_widget_hide (page->tab_label);
page->mnemonic_activate_signal =
g_signal_connect (tab_label,
g_signal_connect (page->tab_label,
"mnemonic-activate",
G_CALLBACK (gtk_notebook_mnemonic_activate_switch_page),
notebook);
}
page->notify_visible_handler = g_signal_connect (child, "notify::visible",
page->notify_visible_handler = g_signal_connect (page->child, "notify::visible",
G_CALLBACK (page_visible_cb), notebook);
g_signal_emit (notebook,
notebook_signals[PAGE_ADDED],
0,
child,
position);
g_signal_emit (notebook, notebook_signals[PAGE_ADDED], 0, page->child, position);
if (!gtk_notebook_has_current_page (notebook))
{
@ -4225,10 +4251,10 @@ gtk_notebook_real_insert_page (GtkNotebook *notebook,
gtk_notebook_switch_focus_tab (notebook, priv->focus_tab);
}
child_notify (notebook, child, "tab-expand");
child_notify (notebook, child, "tab-fill");
child_notify (notebook, child, "tab-label");
child_notify (notebook, child, "menu-label");
child_notify (notebook, page->child, "tab-expand");
child_notify (notebook, page->child, "tab-fill");
child_notify (notebook, page->child, "tab-label");
child_notify (notebook, page->child, "menu-label");
list = g_list_nth (priv->children, position);
while (list)
@ -4237,12 +4263,30 @@ gtk_notebook_real_insert_page (GtkNotebook *notebook,
list = list->next;
}
gtk_widget_thaw_child_notify (child);
gtk_widget_thaw_child_notify (page->child);
update_arrow_state (notebook);
/* The page-added handler might have reordered the pages, re-get the position */
return gtk_notebook_page_num (notebook, child);
return gtk_notebook_page_num (notebook, page->child);
}
static gint
gtk_notebook_real_insert_page (GtkNotebook *notebook,
GtkWidget *child,
GtkWidget *tab_label,
GtkWidget *menu_label,
gint position)
{
GtkNotebookPage *page;
page = g_object_new (GTK_TYPE_NOTEBOOK_PAGE,
"child", child,
"tab", tab_label,
"menu", menu_label,
NULL);
return gtk_notebook_insert_notebook_page (notebook, page, position);
}
static gboolean
@ -4410,8 +4454,6 @@ gtk_notebook_real_remove (GtkNotebook *notebook,
gtk_widget_queue_resize (priv->menu);
}
if (!page->default_menu)
g_object_unref (page->menu_label);
g_list_free (list);
@ -4436,7 +4478,7 @@ gtk_notebook_update_labels (GtkNotebook *notebook)
GtkNotebookPrivate *priv = notebook->priv;
GtkNotebookPage *page;
GList *list;
gchar string[32];
char string[32];
gint page_num = 1;
if (!priv->show_tabs && !priv->menu)
@ -4446,36 +4488,40 @@ gtk_notebook_update_labels (GtkNotebook *notebook)
list;
list = gtk_notebook_search_page (notebook, list, STEP_NEXT, FALSE))
{
const char *text;
page = list->data;
g_snprintf (string, sizeof(string), _("Page %u"), page_num++);
g_snprintf (string, sizeof (string), _("Page %u"), page_num++);
if (page->tab_text)
text = page->tab_text;
else
text = string;
if (priv->show_tabs)
{
if (page->default_tab)
{
if (!page->tab_label)
{
page->tab_label = gtk_label_new (string);
page->tab_label = gtk_label_new ("");
g_object_ref_sink (page->tab_label);
g_object_set_data (G_OBJECT (page->tab_label), "notebook", notebook);
gtk_widget_set_parent (page->tab_label, page->tab_widget);
}
else
gtk_label_set_text (GTK_LABEL (page->tab_label), string);
gtk_label_set_text (GTK_LABEL (page->tab_label), text);
}
if (gtk_widget_get_visible (page->child) &&
!gtk_widget_get_visible (page->tab_label))
gtk_widget_show (page->tab_label);
else if (!gtk_widget_get_visible (page->child) &&
gtk_widget_get_visible (page->tab_label))
gtk_widget_hide (page->tab_label);
if (page->child && page->tab_label)
gtk_widget_set_visible (page->tab_label, gtk_widget_get_visible (page->child));
}
if (priv->menu && page->default_menu)
{
if (GTK_IS_LABEL (page->tab_label))
gtk_label_set_text (GTK_LABEL (page->menu_label),
gtk_label_get_text (GTK_LABEL (page->tab_label)));
if (page->menu_text)
text = page->menu_text;
else if (GTK_IS_LABEL (page->tab_label))
text = gtk_label_get_text (GTK_LABEL (page->tab_label));
else
gtk_label_set_text (GTK_LABEL (page->menu_label), string);
text = string;
gtk_label_set_text (GTK_LABEL (page->menu_label), text);
}
}
}
@ -5693,19 +5739,18 @@ gtk_notebook_menu_switch_page (GtkWidget *widget,
*/
static void
gtk_notebook_menu_item_create (GtkNotebook *notebook,
GList *list)
GtkNotebookPage *page)
{
GtkNotebookPrivate *priv = notebook->priv;
GtkNotebookPage *page;
GtkWidget *menu_item;
page = list->data;
if (page->default_menu)
{
if (GTK_IS_LABEL (page->tab_label))
page->menu_label = gtk_label_new (gtk_label_get_text (GTK_LABEL (page->tab_label)));
else
page->menu_label = gtk_label_new ("");
g_object_ref_sink (page->menu_label);
gtk_widget_set_halign (page->menu_label, GTK_ALIGN_START);
gtk_widget_set_valign (page->menu_label, GTK_ALIGN_CENTER);
}
@ -5714,7 +5759,7 @@ gtk_notebook_menu_item_create (GtkNotebook *notebook,
menu_item = gtk_menu_item_new ();
gtk_container_add (GTK_CONTAINER (menu_item), page->menu_label);
gtk_menu_shell_insert (GTK_MENU_SHELL (priv->menu), menu_item,
g_list_position (priv->children, list));
g_list_index (priv->children, page));
g_signal_connect (menu_item, "activate",
G_CALLBACK (gtk_notebook_menu_switch_page), page);
if (gtk_widget_get_visible (page->child))
@ -5731,7 +5776,7 @@ gtk_notebook_menu_item_recreate (GtkNotebook *notebook,
gtk_container_remove (GTK_CONTAINER (menu_item), page->menu_label);
gtk_container_remove (GTK_CONTAINER (priv->menu), menu_item);
gtk_notebook_menu_item_create (notebook, list);
gtk_notebook_menu_item_create (notebook, page);
}
static void
@ -6582,7 +6627,7 @@ gtk_notebook_popup_enable (GtkNotebook *notebook)
for (list = gtk_notebook_search_page (notebook, NULL, STEP_NEXT, FALSE);
list;
list = gtk_notebook_search_page (notebook, list, STEP_NEXT, FALSE))
gtk_notebook_menu_item_create (notebook, list);
gtk_notebook_menu_item_create (notebook, list->data);
gtk_notebook_update_labels (notebook);
gtk_menu_attach_to_widget (GTK_MENU (priv->menu),
@ -6854,8 +6899,7 @@ gtk_notebook_set_menu_label (GtkNotebook *notebook,
gtk_container_remove (GTK_CONTAINER (priv->menu),
gtk_widget_get_parent (page->menu_label));
if (!page->default_menu)
g_object_unref (page->menu_label);
g_clear_object (&page->menu_label);
}
if (menu_label)
@ -6868,7 +6912,7 @@ gtk_notebook_set_menu_label (GtkNotebook *notebook,
page->default_menu = TRUE;
if (priv->menu)
gtk_notebook_menu_item_create (notebook, list);
gtk_notebook_menu_item_create (notebook, page);
child_notify (notebook, child, "menu-label");
}