summaryrefslogtreecommitdiff
path: root/gladeui/glade-project-properties.c
diff options
context:
space:
mode:
authorJuan Pablo Ugarte <juanpablougarte@gmail.com>2020-06-05 16:34:20 -0300
committerJuan Pablo Ugarte <juanpablougarte@gmail.com>2020-06-05 16:40:16 -0300
commit114124702e7ba506be754ef0cbb0c94a09153ad5 (patch)
tree4fada5056799e4a886fb401ad4ef763b6b5a1080 /gladeui/glade-project-properties.c
parentae53150aa3fad46a0b39c3a17268dd7300a5ae39 (diff)
downloadglade-114124702e7ba506be754ef0cbb0c94a09153ad5.tar.gz
GladeProjectProperties: improve toolkit target version selection
Use a combobox instead of radio buttons to select libraries target version because it was making the dialog too big.
Diffstat (limited to 'gladeui/glade-project-properties.c')
-rw-r--r--gladeui/glade-project-properties.c160
1 files changed, 75 insertions, 85 deletions
diff --git a/gladeui/glade-project-properties.c b/gladeui/glade-project-properties.c
index f7795a54..2763db04 100644
--- a/gladeui/glade-project-properties.c
+++ b/gladeui/glade-project-properties.c
@@ -60,7 +60,7 @@ static void verify_clicked (GtkWidget *b
GladeProjectProperties *properties);
static void on_domain_entry_changed (GtkWidget *entry,
GladeProjectProperties *properties);
-static void target_button_clicked (GtkWidget *widget,
+static void target_combobox_changed (GtkWidget *widget,
GladeProjectProperties *properties);
static void on_glade_project_properties_hide (GtkWidget *widget,
GladeProjectProperties *properties);
@@ -99,7 +99,7 @@ typedef struct
/* Properties */
GtkWidget *project_wide_radio;
GtkWidget *toplevel_contextual_radio;
- GtkWidget *toolkit_box;
+ GtkWidget *toolkit_grid;
GtkWidget *resource_default_radio;
GtkWidget *resource_relative_radio;
@@ -191,7 +191,7 @@ glade_project_properties_class_init (GladeProjectPropertiesClass *klass)
gtk_widget_class_bind_template_child_private (widget_class, GladeProjectProperties, domain_entry);
gtk_widget_class_bind_template_child_private (widget_class, GladeProjectProperties, template_checkbutton);
gtk_widget_class_bind_template_child_private (widget_class, GladeProjectProperties, template_combobox);
- gtk_widget_class_bind_template_child_private (widget_class, GladeProjectProperties, toolkit_box);
+ gtk_widget_class_bind_template_child_private (widget_class, GladeProjectProperties, toolkit_grid);
gtk_widget_class_bind_template_child_private (widget_class, GladeProjectProperties, css_filechooser);
gtk_widget_class_bind_template_child_private (widget_class, GladeProjectProperties, css_checkbutton);
@@ -239,85 +239,83 @@ glade_project_properties_finalize (GObject *object)
}
static void
-target_version_box_fill (GladeProjectProperties *properties)
+combobox_populate_from_catalog (GladeProjectProperties *properties,
+ GtkWidget *combobox,
+ GladeCatalog *catalog)
{
GladeProjectPropertiesPrivate *priv = GLADE_PROJECT_PROPERTIES_PRIVATE(properties);
GladeProject *project = priv->project;
- GtkWidget *vbox = priv->toolkit_box;
- GtkWidget *label, *active_radio, *target_radio, *hbox;
- GList *list, *targets;
+ gint minor, major, position;
+ GList *targets;
- /* Add stuff to vbox */
- for (list = glade_app_get_catalogs (); list; list = g_list_next (list))
+ glade_project_get_target_version (project,
+ glade_catalog_get_name (catalog),
+ &major, &minor);
+
+ for (targets = glade_catalog_get_targets (catalog), position = 0;
+ targets; targets = targets->next, position++)
+ {
+ GladeTargetableVersion *version = targets->data;
+ g_autofree gchar *name = g_strdup_printf ("%d.%d",
+ version->major,
+ version->minor);
+
+ gtk_combo_box_text_insert_text (GTK_COMBO_BOX_TEXT(combobox), position, name);
+ if (major == version->major && minor == version->minor)
+ gtk_combo_box_set_active (GTK_COMBO_BOX(combobox), position);
+
+ g_signal_connect (G_OBJECT (combobox), "changed",
+ G_CALLBACK (target_combobox_changed), properties);
+ g_object_set_data (G_OBJECT (combobox), "catalog",
+ (gchar *) glade_catalog_get_name (catalog));
+ }
+
+ g_hash_table_insert (priv->target_radios,
+ g_strdup (glade_catalog_get_name (catalog)),
+ combobox);
+}
+
+static void
+target_version_box_fill (GladeProjectProperties *properties)
+{
+ GladeProjectPropertiesPrivate *priv = GLADE_PROJECT_PROPERTIES_PRIVATE(properties);
+ GtkWidget *grid = priv->toolkit_grid;
+ GtkWidget *label, *combobox;
+ static gint n_columns = 3;
+ gint i, j, left;
+ GList *list;
+
+
+ /* Add stuff to the toolkit grid */
+ for (list = glade_app_get_catalogs (), i = 0, j = 0; list;
+ list = g_list_next (list))
{
GladeCatalog *catalog = list->data;
- gint minor, major;
/* Skip if theres only one option */
if (g_list_length (glade_catalog_get_targets (catalog)) <= 1)
continue;
- glade_project_get_target_version (project,
- glade_catalog_get_name (catalog),
- &major, &minor);
-
/* Special case to mark GTK+ in upper case */
if (strcmp (glade_catalog_get_name (catalog), "gtk+") == 0)
- label = gtk_label_new ("GTK+");
+ label = gtk_label_new ("GTK");
else
label = gtk_label_new (glade_catalog_get_name (catalog));
- gtk_widget_set_halign (label, GTK_ALIGN_START);
+ left = (i % n_columns) * 2;
+ gtk_widget_set_halign (label, GTK_ALIGN_START);
+ gtk_grid_attach (GTK_GRID (grid), label, left, j, 1, 1);
gtk_widget_show (label);
- gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 2);
- hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
-
- active_radio = target_radio = NULL;
-
- for (targets = glade_catalog_get_targets (catalog);
- targets; targets = targets->next)
- {
- GladeTargetableVersion *version = targets->data;
- gchar *name = g_strdup_printf ("%d.%d",
- version->major,
- version->minor);
-
- if (!target_radio)
- target_radio = gtk_radio_button_new_with_label (NULL, name);
- else
- target_radio =
- gtk_radio_button_new_with_label_from_widget
- (GTK_RADIO_BUTTON (target_radio), name);
- g_free (name);
- g_signal_connect (G_OBJECT (target_radio), "clicked",
- G_CALLBACK (target_button_clicked), properties);
-
- g_object_set_data (G_OBJECT (target_radio), "version", version);
- g_object_set_data (G_OBJECT (target_radio), "catalog",
- (gchar *) glade_catalog_get_name (catalog));
-
- gtk_widget_show (target_radio);
- gtk_box_pack_end (GTK_BOX (hbox), target_radio, TRUE, TRUE, 2);
-
- if (major == version->major && minor == version->minor)
- active_radio = target_radio;
-
- }
+ combobox = gtk_combo_box_text_new ();
+ gtk_widget_set_margin_end (combobox, 8);
+ combobox_populate_from_catalog (properties, combobox, catalog);
+ gtk_grid_attach (GTK_GRID (grid), combobox, left + 1, j, 1, 1);
+ gtk_widget_show (combobox);
- if (active_radio)
- {
- gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (active_radio), TRUE);
- g_hash_table_insert (priv->target_radios,
- g_strdup (glade_catalog_get_name (catalog)),
- gtk_radio_button_get_group (GTK_RADIO_BUTTON
- (active_radio)));
- }
- else
- g_warning ("Corrupt catalog versions");
-
- gtk_widget_show (hbox);
- gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 2);
+ i++;
+ if (i % n_columns == 0)
+ j++;
}
}
@@ -415,19 +413,22 @@ glade_project_properties_set_property (GObject *object,
* Callbacks *
********************************************************/
static void
-target_button_clicked (GtkWidget *widget,
- GladeProjectProperties *properties)
+target_combobox_changed (GtkWidget *widget,
+ GladeProjectProperties *properties)
{
GladeProjectPropertiesPrivate *priv = GLADE_PROJECT_PROPERTIES_PRIVATE(properties);
- GladeTargetableVersion *version;
- gchar *catalog;
+ g_autofree gchar *version = NULL;
+ gchar *catalog;
+ gint major, minor;
if (priv->ignore_ui_cb)
return;
- version = g_object_get_data (G_OBJECT (widget), "version");
+ version = gtk_combo_box_text_get_active_text (GTK_COMBO_BOX_TEXT (widget));
catalog = g_object_get_data (G_OBJECT (widget), "catalog");
- glade_command_set_project_target (priv->project, catalog, version->major, version->minor);
+
+ if (sscanf (version, "%d.%d", &major, &minor) == 2)
+ glade_command_set_project_target (priv->project, catalog, major, minor);
}
static void
@@ -981,15 +982,13 @@ project_targets_changed (GladeProject *project,
{
GladeProjectPropertiesPrivate *priv = GLADE_PROJECT_PROPERTIES_PRIVATE(properties);
GList *list;
- GSList *radios, *l;
-
priv->ignore_ui_cb = TRUE;
/* For each catalog */
for (list = glade_app_get_catalogs (); list; list = g_list_next (list))
{
- GladeTargetableVersion *version;
GladeCatalog *catalog = list->data;
+ GtkComboBox *combobox;
gint minor, major;
/* Skip if theres only one option */
@@ -1003,20 +1002,11 @@ project_targets_changed (GladeProject *project,
/* Fetch the radios for this catalog */
if (priv->target_radios &&
- (radios = g_hash_table_lookup (priv->target_radios, glade_catalog_get_name (catalog))) != NULL)
+ (combobox = g_hash_table_lookup (priv->target_radios, glade_catalog_get_name (catalog))) != NULL)
{
- for (l = radios; l; l = l->next)
- {
- GtkWidget *radio = l->data;
-
- /* Activate the appropriate button for the project/catalog */
- version = g_object_get_data (G_OBJECT (radio), "version");
- if (version->major == major && version->minor == minor)
- {
- gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (radio), TRUE);
- break;
- }
- }
+ g_autofree gchar *id = NULL;
+ id = g_strdup_printf ("%d.%d", major, minor);
+ gtk_combo_box_set_active_id(GTK_COMBO_BOX(combobox), id);
}
}
priv->ignore_ui_cb = FALSE;