[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]

gEDA-user: [PATCH 1/2] gschem: line type edit dialog now uses GtkComboBox



Previously used GtkOptionMenu is deprecated since GTK 2.4.
Also eliminated TYPE_ERASE, unchanged line type is now communicated
using a separate column in GtkTreeModel.
---
 gschem/src/x_dialog.c |  212 ++++++++++++++++++++++++++++++-------------------
 1 files changed, 129 insertions(+), 83 deletions(-)

diff --git a/gschem/src/x_dialog.c b/gschem/src/x_dialog.c
index 507919c..0828d06 100644
--- a/gschem/src/x_dialog.c
+++ b/gschem/src/x_dialog.c
@@ -39,7 +39,7 @@
   g_object_set_data_full (G_OBJECT (component), name, \
     gtk_widget_ref (widget), (GDestroyNotify) gtk_widget_unref)
 
-static GtkWidget* create_menu_linetype (GSCHEM_TOPLEVEL *w_current);
+static GtkWidget* create_line_type_combo (void);
 static gint line_type_dialog_linetype_change (GtkWidget *w, gpointer data);
 static void line_type_dialog_ok (GtkWidget *w, gpointer data);
 
@@ -51,7 +51,7 @@ static void fill_type_dialog_ok(GtkWidget *w, gpointer data);
 struct line_type_data {
   GtkWidget *dialog;
   GtkWidget *width_entry;
-  GtkWidget *line_type;
+  GtkComboBox *line_type;
   GtkWidget *length_entry;
   GtkWidget *space_entry;
 
@@ -573,40 +573,58 @@ void text_edit_dialog (GSCHEM_TOPLEVEL *w_current, const char *string, int text_
 
 /***************** Start of Line Type/width dialog box ****************/
 
-/*! \brief Create a line type menu for the line type dialog
+enum line_type_columns {
+  LT_COLUMN_STRING, /*!< Text displayed in the choice box */
+  LT_COLUMN_VALUE,  /*!< Corresponding value (line type/end type) */
+  LT_COLUMN_VALID,  /*!< Is the value valid */
+  LT_NUM_COLUMNS,   /*!< Total number of columns in the model */
+};
+
+/*! \brief Create a GtkComboBox for line type selection
  *  \par Function Description
- *  This function creates a GtkMenu with the different linetypes.
+ *  This function creates a GtkComboBox based on list of line types.
  */
-static GtkWidget *create_menu_linetype (GSCHEM_TOPLEVEL *w_current)
+static GtkWidget *create_line_type_combo (void)
 {
-  GtkWidget *menu;
-  GSList *group;
-  struct line_type {
-    gchar *str;
-    OBJECT_TYPE type;
-  } types[] = { { N_("Solid"),   TYPE_SOLID },
-                { N_("Dotted"),  TYPE_DOTTED },
-                { N_("Dashed"),  TYPE_DASHED },
-                { N_("Center"),  TYPE_CENTER },
-                { N_("Phantom"), TYPE_PHANTOM },
-                { N_("*unchanged*"), TYPE_ERASE } };
-  gint i;
+  const struct {
+    gchar         *str;
+    OBJECT_TYPE   type;
+    gboolean      valid;
+  } types[] = { { N_("Solid"),   TYPE_SOLID,    TRUE },
+                { N_("Dotted"),  TYPE_DOTTED,   TRUE },
+                { N_("Dashed"),  TYPE_DASHED,   TRUE },
+                { N_("Center"),  TYPE_CENTER,   TRUE },
+                { N_("Phantom"), TYPE_PHANTOM,  TRUE },
+                { N_("*unchanged*"), 0,         FALSE } };
 
-  menu  = gtk_menu_new ();
-  group = NULL;
-
-  for (i = 0; i < sizeof (types) / sizeof (struct line_type); i++) {
-    GtkWidget *menuitem;
-
-    menuitem = gtk_radio_menu_item_new_with_label (group, _(types[i].str));
-    group = gtk_radio_menu_item_group (GTK_RADIO_MENU_ITEM (menuitem));
-    gtk_menu_append (GTK_MENU (menu), menuitem);
-    gtk_object_set_data (GTK_OBJECT(menuitem), "linetype",
-                         GINT_TO_POINTER (types[i].type));
-    gtk_widget_show (menuitem);
+  gint i;
+  GtkListStore *list_store;
+  GtkCellRenderer *cell;
+  GtkWidget *combo;
+
+  list_store = gtk_list_store_new (LT_NUM_COLUMNS,
+                                   G_TYPE_STRING,
+                                   G_TYPE_INT,
+                                   G_TYPE_BOOLEAN);
+
+  for (i = 0; i < sizeof (types) / sizeof (*types); i++) {
+    GtkTreeIter iter;
+    gtk_list_store_append (list_store, &iter);
+    gtk_list_store_set (list_store, &iter,
+                        LT_COLUMN_STRING, types[i].str,
+                        LT_COLUMN_VALUE,  types[i].type,
+                        LT_COLUMN_VALID,  types[i].valid,
+                        -1);
   }
 
-  return(menu);
+  combo = gtk_combo_box_new_with_model (GTK_TREE_MODEL (list_store));
+  g_object_unref (G_OBJECT (list_store));
+  cell = gtk_cell_renderer_text_new();
+  gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (combo), cell, TRUE);
+  gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (combo), cell,
+                                  "text", LT_COLUMN_STRING, NULL);
+
+  return combo;
 }
 
 /*! \brief get the linetype data from selected objects
@@ -676,14 +694,30 @@ static void line_type_dialog_set_values(struct line_type_data *line_type_data,
                                         gint width, gint length, gint space)
 {
   gchar *text;
-  GtkWidget *menu, *menuitem;
+  GtkTreeIter iter;
+  GtkTreeModel *model;
 
-  if (type == -2)
-    type = TYPE_ERASE;
-  gtk_option_menu_set_history(GTK_OPTION_MENU(line_type_data->line_type), type);
-  menu = gtk_option_menu_get_menu(GTK_OPTION_MENU(line_type_data->line_type));
-  menuitem = gtk_menu_get_active(GTK_MENU(menu));
-  gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem), TRUE);
+  model = gtk_combo_box_get_model (line_type_data->line_type);
+  g_assert (gtk_tree_model_get_iter_first (model, &iter));
+  do {
+    if (type == -2) {
+      gboolean valid;
+      gtk_tree_model_get (model, &iter,
+                          LT_COLUMN_VALID, &valid,
+                          -1);
+      if (! valid)
+        break;
+    } else {
+      gint value;
+      gtk_tree_model_get (model, &iter,
+                          LT_COLUMN_VALUE, &value,
+                          -1);
+      if (type == value)
+        break;
+    }
+  } while (gtk_tree_model_iter_next (model, &iter));
+  gtk_combo_box_set_active_iter (line_type_data->line_type,
+                                 &iter);
 
   if (width == -2)
     text = g_strdup(_("*unchanged*"));
@@ -722,34 +756,42 @@ static void line_type_dialog_set_values(struct line_type_data *line_type_data,
 static gint line_type_dialog_linetype_change(GtkWidget *w, gpointer data)
 {
   struct line_type_data *line_type_data = (struct line_type_data*) data;
-  GtkWidget *menuitem;
-  gboolean activate_length_entry, activate_space_entry;
-  gint type;
-
-  menuitem = gtk_menu_get_active (
-    GTK_MENU (gtk_option_menu_get_menu (
-                GTK_OPTION_MENU (line_type_data->line_type))));
-
-  type = GPOINTER_TO_INT(
-    gtk_object_get_data (GTK_OBJECT (menuitem), "linetype"));
-  switch(type) {
-      case(TYPE_SOLID):
-        activate_length_entry = FALSE;
-        activate_space_entry  = FALSE;
-        break;
-      case(TYPE_DOTTED):
-        activate_length_entry = FALSE;
-        activate_space_entry  = TRUE;
-        break;
-      case(TYPE_DASHED):
-      case(TYPE_CENTER):
-      case(TYPE_PHANTOM):
-        activate_length_entry = TRUE;
-        activate_space_entry  = TRUE;
-        break;
-      default:
-        activate_length_entry = TRUE;
-        activate_space_entry  = TRUE;
+  gboolean activate_length_entry = TRUE;
+  gboolean activate_space_entry = TRUE;
+  GtkTreeIter iter;
+  GtkTreeModel *model = gtk_combo_box_get_model (line_type_data->line_type);
+
+  g_assert (model);
+  if (gtk_combo_box_get_active_iter (line_type_data->line_type, &iter)) {
+    gint type;
+    gboolean valid;
+    gtk_tree_model_get (model, &iter,
+                        LT_COLUMN_VALUE, &type,
+                        LT_COLUMN_VALID, &valid,
+                        -1);
+    if (valid)
+      switch(type) {
+        case (TYPE_SOLID):
+          activate_length_entry = FALSE;
+          activate_space_entry  = FALSE;
+          break;
+
+        case (TYPE_DOTTED):
+          activate_length_entry = FALSE;
+          activate_space_entry  = TRUE;
+          break;
+
+        case (TYPE_DASHED):
+        case (TYPE_CENTER):
+        case (TYPE_PHANTOM):
+          activate_length_entry = TRUE;
+          activate_space_entry  = TRUE;
+          break;
+
+        default:
+          activate_length_entry = TRUE;
+          activate_space_entry  = TRUE;
+      }
   }
 
   gtk_widget_set_sensitive (line_type_data->space_entry,
@@ -757,7 +799,7 @@ static gint line_type_dialog_linetype_change(GtkWidget *w, gpointer data)
   gtk_widget_set_sensitive (line_type_data->length_entry,
                             activate_length_entry);
 
-  return(0);
+  return 0;
 }
 
 
@@ -793,15 +835,21 @@ static void line_type_dialog_ok(GtkWidget *w, gpointer data)
                                       line_type_data->length_entry));
   space_str   = gtk_entry_get_text (GTK_ENTRY (
                                       line_type_data->space_entry));
-  type = GPOINTER_TO_INT(
-    gtk_object_get_data (
-      GTK_OBJECT (
-        gtk_menu_get_active (
-          GTK_MENU (gtk_option_menu_get_menu (
-                      GTK_OPTION_MENU (
-                        line_type_data->line_type))))), "linetype"));
-  if (type == TYPE_ERASE)
-    type = -1;
+  {
+    GtkTreeModel *model =
+      gtk_combo_box_get_model (line_type_data->line_type);
+    GtkTreeIter iter;
+    gboolean type_valid;
+    gint type_value;
+
+    g_assert (model);
+    gtk_combo_box_get_active_iter (line_type_data->line_type, &iter);
+    gtk_tree_model_get (model, &iter,
+                        LT_COLUMN_VALUE, &type_value,
+                        LT_COLUMN_VALID, &type_valid,
+                        -1);
+    type = type_valid ? type_value : -1;
+  }
   
   /* convert the options to integers (-1 means unchanged) */
   width =  g_strcasecmp (width_str,
@@ -888,7 +936,7 @@ void line_type_dialog (GSCHEM_TOPLEVEL *w_current)
 {
   GtkWidget *dialog;
   GtkWidget *vbox;
-  GtkWidget *optionmenu   = NULL;
+  GtkWidget *type_combo = NULL;
   GtkWidget *length_entry = NULL;
   GtkWidget *space_entry  = NULL;
   GtkWidget *width_entry  = NULL;
@@ -968,10 +1016,8 @@ void line_type_dialog (GSCHEM_TOPLEVEL *w_current)
   gtk_misc_set_alignment(GTK_MISC(label), 0, 0);
   gtk_table_attach(GTK_TABLE(table), label, 0,1,3,4, GTK_FILL,0,0,0);
 
-  optionmenu = gtk_option_menu_new ();
-  gtk_option_menu_set_menu(GTK_OPTION_MENU(optionmenu),
-                           create_menu_linetype (w_current));
-  gtk_table_attach_defaults(GTK_TABLE(table), optionmenu,
+  type_combo = create_line_type_combo();
+  gtk_table_attach_defaults(GTK_TABLE(table), type_combo,
                             1,2,0,1);
 
   width_entry = gtk_entry_new();
@@ -980,7 +1026,7 @@ void line_type_dialog (GSCHEM_TOPLEVEL *w_current)
   gtk_table_attach_defaults(GTK_TABLE(table), width_entry,
                             1,2,1,2);
 
-  gtk_signal_connect(GTK_OBJECT (optionmenu), "changed",
+  gtk_signal_connect(GTK_OBJECT (type_combo), "changed",
                      (GtkSignalFunc) line_type_dialog_linetype_change,
                      line_type_data);
 
@@ -999,7 +1045,7 @@ void line_type_dialog (GSCHEM_TOPLEVEL *w_current)
   /* populate the data structure */
   line_type_data->dialog = dialog;
   line_type_data->width_entry  = width_entry;
-  line_type_data->line_type    = optionmenu;
+  line_type_data->line_type    = GTK_COMBO_BOX (type_combo);
   line_type_data->length_entry = length_entry;
   line_type_data->space_entry  = space_entry;
 
@@ -1010,7 +1056,7 @@ void line_type_dialog (GSCHEM_TOPLEVEL *w_current)
                               width, length, space);
 
   /* calling it once will set the dash space/length activity */
-  line_type_dialog_linetype_change(optionmenu, line_type_data);
+  line_type_dialog_linetype_change(type_combo, line_type_data);
 
   gtk_widget_grab_focus(width_entry);
   gtk_widget_show_all (dialog);
-- 
1.6.2


-- 
Krzysztof KoÅciuszkiewicz
"Simplicity is the ultimate sophistication" -- Leonardo da Vinci


_______________________________________________
geda-user mailing list
geda-user@xxxxxxxxxxxxxx
http://www.seul.org/cgi-bin/mailman/listinfo/geda-user