mirror of
https://gitlab.gnome.org/GNOME/gtk.git
synced 2024-12-26 21:51:08 +00:00
c93182c416
Test adding multiple custom widgets at each end. This exposes that we're doing it wrong - the pack-end widgets are ordered in the wrong way.
201 lines
6.5 KiB
C
201 lines
6.5 KiB
C
#include <gtk/gtk.h>
|
|
|
|
static void
|
|
on_text_changed (GtkEntry *entry,
|
|
GParamSpec *pspec,
|
|
GtkHeaderBar *bar)
|
|
{
|
|
const gchar *layout;
|
|
|
|
layout = gtk_entry_get_text (entry);
|
|
|
|
gtk_header_bar_set_decoration_layout (bar, layout);
|
|
}
|
|
|
|
static void
|
|
create_widgets (GtkHeaderBar *bar,
|
|
GtkPackType pack_type,
|
|
gint n)
|
|
{
|
|
GList *children, *l;
|
|
GtkWidget *child;
|
|
gint i;
|
|
gchar *label;
|
|
|
|
children = gtk_container_get_children (GTK_CONTAINER (bar));
|
|
for (l = children; l; l = l->next)
|
|
{
|
|
GtkPackType type;
|
|
|
|
child = l->data;
|
|
gtk_container_child_get (GTK_CONTAINER (bar), child, "pack-type", &type, NULL);
|
|
if (type == pack_type)
|
|
gtk_container_remove (GTK_CONTAINER (bar), child);
|
|
}
|
|
g_list_free (children);
|
|
|
|
for (i = 0; i < n; i++)
|
|
{
|
|
label = g_strdup_printf ("%d", i);
|
|
child = gtk_button_new_with_label (label);
|
|
g_free (label);
|
|
|
|
gtk_widget_show (child);
|
|
if (pack_type == GTK_PACK_START)
|
|
gtk_header_bar_pack_start (bar, child);
|
|
else
|
|
gtk_header_bar_pack_end (bar, child);
|
|
}
|
|
}
|
|
|
|
static void
|
|
change_start (GtkSpinButton *button,
|
|
GParamSpec *pspec,
|
|
GtkHeaderBar *bar)
|
|
{
|
|
create_widgets (bar,
|
|
GTK_PACK_START,
|
|
gtk_spin_button_get_value_as_int (button));
|
|
}
|
|
|
|
static void
|
|
change_end (GtkSpinButton *button,
|
|
GParamSpec *pspec,
|
|
GtkHeaderBar *bar)
|
|
{
|
|
create_widgets (bar,
|
|
GTK_PACK_END,
|
|
gtk_spin_button_get_value_as_int (button));
|
|
}
|
|
|
|
static void
|
|
activate (GApplication *gapp)
|
|
{
|
|
GtkApplication *app = GTK_APPLICATION (gapp);
|
|
GtkWidget *window;
|
|
GtkWidget *header;
|
|
GtkWidget *grid;
|
|
GtkWidget *label;
|
|
GtkWidget *entry;
|
|
GtkWidget *check;
|
|
GtkWidget *spin;
|
|
GtkBuilder *builder;
|
|
GMenuModel *menu;
|
|
gchar *layout;
|
|
|
|
g_action_map_add_action (G_ACTION_MAP (gapp), G_ACTION (g_simple_action_new ("test", NULL)));
|
|
builder = gtk_builder_new ();
|
|
gtk_builder_add_from_string (builder,
|
|
"<interface>"
|
|
" <menu id='app-menu'>"
|
|
" <section>"
|
|
" <item>"
|
|
" <attribute name='label'>Test item</attribute>"
|
|
" <attribute name='action'>app.test</attribute>"
|
|
" </item>"
|
|
" </section>"
|
|
" </menu>"
|
|
"</interface>", -1, NULL);
|
|
window = gtk_application_window_new (app);
|
|
gtk_window_set_icon_name (GTK_WINDOW (window), "preferences-desktop-font");
|
|
|
|
menu = (GMenuModel*)gtk_builder_get_object (builder, "app-menu");
|
|
gtk_application_add_window (app, GTK_WINDOW (window));
|
|
gtk_application_set_app_menu (app, menu);
|
|
|
|
header = gtk_header_bar_new ();
|
|
gtk_window_set_titlebar (GTK_WINDOW (window), header);
|
|
|
|
grid = gtk_grid_new ();
|
|
g_object_set (grid,
|
|
"halign", GTK_ALIGN_CENTER,
|
|
"margin", 20,
|
|
"row-spacing", 12,
|
|
"column-spacing", 12,
|
|
NULL);
|
|
|
|
label = gtk_label_new ("Title");
|
|
gtk_widget_set_halign (label, GTK_ALIGN_END);
|
|
entry = gtk_entry_new ();
|
|
g_object_bind_property (header, "title",
|
|
entry, "text",
|
|
G_BINDING_BIDIRECTIONAL|G_BINDING_SYNC_CREATE);
|
|
gtk_grid_attach (GTK_GRID (grid), label, 0, 0, 1, 1);
|
|
gtk_grid_attach (GTK_GRID (grid), entry, 1, 0, 1, 1);
|
|
|
|
label = gtk_label_new ("Subtitle");
|
|
gtk_widget_set_halign (label, GTK_ALIGN_END);
|
|
entry = gtk_entry_new ();
|
|
g_object_bind_property (header, "subtitle",
|
|
entry, "text",
|
|
G_BINDING_BIDIRECTIONAL|G_BINDING_SYNC_CREATE);
|
|
gtk_grid_attach (GTK_GRID (grid), label, 0, 1, 1, 1);
|
|
gtk_grid_attach (GTK_GRID (grid), entry, 1, 1, 1, 1);
|
|
|
|
label = gtk_label_new ("Layout");
|
|
gtk_widget_set_halign (label, GTK_ALIGN_END);
|
|
entry = gtk_entry_new ();
|
|
|
|
g_object_get (gtk_widget_get_settings (window), "gtk-decoration-layout", &layout, NULL);
|
|
gtk_entry_set_text (GTK_ENTRY (entry), layout);
|
|
g_free (layout);
|
|
|
|
g_signal_connect (entry, "notify::text",
|
|
G_CALLBACK (on_text_changed), header);
|
|
gtk_grid_attach (GTK_GRID (grid), label, 0, 2, 1, 1);
|
|
gtk_grid_attach (GTK_GRID (grid), entry, 1, 2, 1, 1);
|
|
|
|
label = gtk_label_new ("Decorations");
|
|
gtk_widget_set_halign (label, GTK_ALIGN_END);
|
|
check = gtk_check_button_new ();
|
|
g_object_bind_property (header, "show-close-button",
|
|
check, "active",
|
|
G_BINDING_BIDIRECTIONAL|G_BINDING_SYNC_CREATE);
|
|
gtk_grid_attach (GTK_GRID (grid), label, 2, 0, 1, 1);
|
|
gtk_grid_attach (GTK_GRID (grid), check, 3, 0, 1, 1);
|
|
|
|
label = gtk_label_new ("Has Subtitle");
|
|
gtk_widget_set_halign (label, GTK_ALIGN_END);
|
|
check = gtk_check_button_new ();
|
|
g_object_bind_property (header, "has-subtitle",
|
|
check, "active",
|
|
G_BINDING_BIDIRECTIONAL|G_BINDING_SYNC_CREATE);
|
|
gtk_grid_attach (GTK_GRID (grid), label, 2, 1, 1, 1);
|
|
gtk_grid_attach (GTK_GRID (grid), check, 3, 1, 1, 1);
|
|
|
|
label = gtk_label_new ("Shell Shows Menu");
|
|
gtk_widget_set_halign (label, GTK_ALIGN_END);
|
|
check = gtk_check_button_new ();
|
|
g_object_bind_property (gtk_settings_get_default (), "gtk-shell-shows-app-menu",
|
|
check, "active",
|
|
G_BINDING_BIDIRECTIONAL|G_BINDING_SYNC_CREATE);
|
|
gtk_grid_attach (GTK_GRID (grid), label, 2, 2, 1, 1);
|
|
gtk_grid_attach (GTK_GRID (grid), check, 3, 2, 1, 1);
|
|
|
|
label = gtk_label_new ("Custom");
|
|
gtk_widget_set_halign (label, GTK_ALIGN_END);
|
|
spin = gtk_spin_button_new_with_range (0, 10, 1);
|
|
g_signal_connect (spin, "notify::value",
|
|
G_CALLBACK (change_start), header);
|
|
gtk_grid_attach (GTK_GRID (grid), label, 0, 3, 1, 1);
|
|
gtk_grid_attach (GTK_GRID (grid), spin, 1, 3, 1, 1);
|
|
spin = gtk_spin_button_new_with_range (0, 10, 1);
|
|
g_signal_connect (spin, "notify::value",
|
|
G_CALLBACK (change_end), header);
|
|
gtk_grid_attach (GTK_GRID (grid), spin, 2, 3, 2, 1);
|
|
|
|
gtk_container_add (GTK_CONTAINER (window), grid);
|
|
gtk_widget_show_all (window);
|
|
}
|
|
|
|
int
|
|
main (int argc, char *argv[])
|
|
{
|
|
GtkApplication *app;
|
|
|
|
app = gtk_application_new ("org.gtk.Test.titlebar", 0);
|
|
g_signal_connect (app, "activate", G_CALLBACK (activate), NULL);
|
|
|
|
return g_application_run (G_APPLICATION (app), argc, argv);
|
|
}
|