tReplace GtkOptionMenu with GtkComboBox - vaccinewars - be a doctor and try to vaccinate the world
 (HTM) git clone git://src.adamsgaard.dk/vaccinewars
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit 8eb41bfc60d33099eeee913eb270ae28101c5d01
 (DIR) parent 65604cd8b7f5b777ebbb06e0b2c8b8188824ec93
 (HTM) Author: Ben Webb <ben@salilab.org>
       Date:   Wed, 25 Nov 2020 22:53:07 -0800
       
       Replace GtkOptionMenu with GtkComboBox
       
       Don't use OptionMenu as this is no longer present
       in GTK+3; use ComboBox instead. This should be
       sufficient to allow the entire dopewars code base
       tto build with GTK+3; closes #53.
       
       Diffstat:
         M src/gui_client/gtk_client.c         |      47 ++++++++++++++++++++++---------
       
       1 file changed, 33 insertions(+), 14 deletions(-)
       ---
 (DIR) diff --git a/src/gui_client/gtk_client.c b/src/gui_client/gtk_client.c
       t@@ -1593,10 +1593,21 @@ static void UpdateDealDialog(void)
          g_string_free(text, TRUE);
        }
        
       +/* Columns in deal list */
       +enum {
       +  DEAL_COL_NAME = 0,
       +  DEAL_COL_INDEX = 1,
       +  DEAL_NUM_COLS
       +};
       +
        static void DealSelectCallback(GtkWidget *widget, gpointer data)
        {
       -  DealDialog.DrugInd = GPOINTER_TO_INT(data);
       -  UpdateDealDialog();
       +  GtkTreeIter iter;
       +  if (gtk_combo_box_get_active_iter(GTK_COMBO_BOX(widget), &iter)) {
       +    GtkTreeModel *model = gtk_combo_box_get_model(GTK_COMBO_BOX(widget));
       +    gtk_tree_model_get(model, &iter, DEAL_COL_INDEX, &DealDialog.DrugInd, -1);
       +    UpdateDealDialog();
       +  }
        }
        
        static void DealOKCallback(GtkWidget *widget, gpointer data)
       t@@ -1621,8 +1632,11 @@ static void DealOKCallback(GtkWidget *widget, gpointer data)
        
        void DealDrugs(GtkWidget *widget, gpointer data)
        {
       -  GtkWidget *dialog, *label, *hbox, *hbbox, *button, *spinner, *menu,
       -      *optionmenu, *menuitem, *vbox, *hsep, *defbutton;
       +  GtkWidget *dialog, *label, *hbox, *hbbox, *button, *spinner, *combo_box,
       +      *vbox, *hsep, *defbutton;
       +  GtkListStore *store;
       +  GtkTreeIter iter;
       +  GtkCellRenderer *renderer;
          GtkAdjustment *spin_adj;
          GtkAccelGroup *accel_group;
          GtkWidget *tv;
       t@@ -1701,8 +1715,7 @@ void DealDrugs(GtkWidget *widget, gpointer data)
          label = gtk_label_new(Action);
          gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
        
       -  optionmenu = gtk_option_menu_new();
       -  menu = gtk_menu_new();
       +  store = gtk_list_store_new(DEAL_NUM_COLS, G_TYPE_STRING, G_TYPE_INT);
          SelIndex = -1;
          for (i = 0; i < NumDrug; i++) {
            if ((data == BT_DROP && Play->Drugs[i].Carried > 0
       t@@ -1711,19 +1724,22 @@ void DealDrugs(GtkWidget *widget, gpointer data)
                 && Play->Drugs[i].Price != 0)
                || (data == BT_BUY && Play->Drugs[i].Price != 0)) {
              dpg_string_printf(text, _("%/DealDrugs drug name/%tde"), Drug[i].Name);
       -      menuitem = gtk_menu_item_new_with_label(text->str);
       -      g_signal_connect(G_OBJECT(menuitem), "activate",
       -                       G_CALLBACK(DealSelectCallback),
       -                       GINT_TO_POINTER(i));
       -      gtk_menu_append(GTK_MENU(menu), menuitem);
       +      gtk_list_store_append(store, &iter);
       +      gtk_list_store_set(store, &iter, DEAL_COL_NAME, text->str,
       +                         DEAL_COL_INDEX, i, -1);
              if (DrugInd >= i) {
                SelIndex++;
              }
            }
          }
       -  gtk_menu_set_active(GTK_MENU(menu), SelIndex);
       -  gtk_option_menu_set_menu(GTK_OPTION_MENU(optionmenu), menu);
       -  gtk_box_pack_start(GTK_BOX(hbox), optionmenu, TRUE, TRUE, 0);
       +  combo_box = gtk_combo_box_new_with_model(GTK_TREE_MODEL(store));
       +  g_object_unref(store);
       +  renderer = gtk_cell_renderer_text_new();
       +  gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(combo_box), renderer, TRUE);
       +  gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(combo_box), renderer,
       +                                 "text", DEAL_COL_NAME, NULL);
       +  gtk_combo_box_set_active(GTK_COMBO_BOX(combo_box), SelIndex);
       +  gtk_box_pack_start(GTK_BOX(hbox), combo_box, TRUE, TRUE, 0);
        
          DealDialog.DrugInd = DrugInd;
        
       t@@ -1780,6 +1796,9 @@ void DealDrugs(GtkWidget *widget, gpointer data)
          gtk_box_pack_start(GTK_BOX(vbox), hbbox, FALSE, FALSE, 0);
          gtk_container_add(GTK_CONTAINER(dialog), vbox);
        
       +  g_signal_connect(G_OBJECT(combo_box), "changed",
       +                   G_CALLBACK(DealSelectCallback), NULL);
       +
          g_string_free(text, TRUE);
          UpdateDealDialog();