tExpand our GtkTreeView Win32 implementation - 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 fbddb9bf7cb2e0023beed6039895844347737e7b
 (DIR) parent d9f07d249229b0334196961afc812d1932bf2254
 (HTM) Author: Ben Webb <ben@salilab.org>
       Date:   Fri, 27 Nov 2020 00:26:41 -0800
       
       Expand our GtkTreeView Win32 implementation
       
       Diffstat:
         M src/gtkport/gtkenums.h              |       6 ++++++
         M src/gtkport/treeview.c              |      43 ++++++++++++++++++++++++++++++
         M src/gtkport/treeview.h              |      20 +++++++++++++++++++-
       
       3 files changed, 68 insertions(+), 1 deletion(-)
       ---
 (DIR) diff --git a/src/gtkport/gtkenums.h b/src/gtkport/gtkenums.h
       t@@ -127,6 +127,12 @@ typedef enum
          GTK_ORIENTATION_VERTICAL
        } GtkOrientation;
        
       +typedef enum
       +{
       +  GTK_SORT_ASCENDING,
       +  GTK_SORT_DESCENDING
       +} GtkSortType;
       +
        enum
        {
          G_TYPE_STRING,
 (DIR) diff --git a/src/gtkport/treeview.c b/src/gtkport/treeview.c
       t@@ -426,6 +426,15 @@ void gtk_tree_model_get(GtkTreeModel *tree_model, GtkTreeIter *iter, ...)
          va_end(ap);
        }
        
       +gboolean gtk_tree_model_iter_nth_child(GtkTreeModel *tree_model,
       +                                       GtkTreeIter *iter,
       +                                       GtkTreeIter *parent, gint n)
       +{
       +  /* We only work with one level (lists) for now */
       +  g_assert(parent == NULL);
       +  *iter = n;
       +}
       +
        static void gtk_tree_view_column_free(gpointer data)
        {
          GtkTreeViewColumn *col = data;
       t@@ -736,6 +745,28 @@ void gtk_tree_selection_select_path(GtkTreeSelection *selection,
          }
        }
        
       +void gtk_tree_selection_unselect_all(GtkTreeSelection *selection)
       +{
       +  GList *sel;
       +  for (sel = selection->selection; sel; sel = g_list_next(sel)) {
       +    int row = GPOINTER_TO_INT(sel->data);
       +    gtk_tree_selection_unselect_path(selection, &row);
       +  }
       +}
       +
       +GList *gtk_tree_selection_get_selected_rows(GtkTreeSelection *selection,
       +                                            GtkTreeModel **model)
       +{
       +  GList *sel, *pathsel = NULL;
       +  for (sel = selection->selection; sel; sel = g_list_next(sel)) {
       +    int row = GPOINTER_TO_INT(sel->data);
       +    GtkTreePath *path = g_new(GtkTreePath, 1);
       +    *path = row;
       +    pathsel = g_list_append(pathsel, path);
       +  }
       +  return pathsel;
       +}
       +
        void gtk_tree_selection_unselect_path(GtkTreeSelection *selection,
                                              GtkTreePath *path)
        {
       t@@ -879,6 +910,7 @@ static GtkTreeViewColumn *new_column_internal(const char *title, va_list args)
          col->title = g_strdup(title);
          col->resizeable = FALSE;
          col->expand = FALSE;
       +  col->sort_column_id = -1;
          col->model_column = -1;
        
          /* Currently we only support the "text" attribute to point to the
       t@@ -928,6 +960,12 @@ void gtk_tree_view_column_set_expand(GtkTreeViewColumn *tree_column,
          tree_column->expand = expand;
        }
        
       +void gtk_tree_view_column_set_sort_column_id(GtkTreeViewColumn *tree_column,
       +                                             gint sort_column_id)
       +{
       +  tree_column->sort_column_id = sort_column_id;
       +}
       +
        gint gtk_tree_view_insert_column(GtkTreeView *tree_view,
                                         GtkTreeViewColumn *column,
                                         gint position)
       t@@ -936,6 +974,11 @@ gint gtk_tree_view_insert_column(GtkTreeView *tree_view,
          return g_slist_length(tree_view->columns);
        }
        
       +GtkTreeViewColumn *gtk_tree_view_get_column(GtkTreeView *tree_view, gint n)
       +{
       +  return g_slist_nth_data(tree_view->columns, n);
       +}
       +
        void gtk_tree_view_set_model(GtkTreeView *tree_view, GtkTreeModel *model)
        {
          /* We only support a single model per view, so ignore attempts to remove it */
 (DIR) diff --git a/src/gtkport/treeview.h b/src/gtkport/treeview.h
       t@@ -39,6 +39,9 @@ typedef struct _GtkListStore GtkListStore;
        typedef struct _GtkListStore GtkTreeModel;
        typedef struct _GtkCellRenderer GtkCellRenderer;
        
       +/* Our TreeModel is sortable, so this can be a synonym */
       +typedef struct _GtkListStore GtkTreeSortable;
       +
        /* We only support one selection per tree view, so make them synonyms */
        typedef struct _GtkTreeView GtkTreeSelection;
        
       t@@ -64,6 +67,7 @@ struct _GtkTreeView {
        struct _GtkTreeViewColumn {
          gchar *title;       /* header title */
          int model_column;   /* the index of the column in the GtkTreeModel */
       +  gint sort_column_id; /* what to sort by when this column is selected */
          gint width;
          gint optimal_width;
          GtkJustification justification;
       t@@ -93,8 +97,12 @@ typedef void (*GtkTreeSelectionForeachFunc) (GtkTreeModel *model,
        
        #define GTK_TREE_VIEW(obj) ((GtkTreeView *)(obj))
        #define GTK_TREE_MODEL(obj) ((GtkTreeModel *)(obj))
       +#define GTK_TREE_SORTABLE(obj) ((GtkTreeSortable *)(obj))
        #define GTK_LIST_STORE(obj) ((GtkListStore *)(obj))
        
       +#define GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID (-1)
       +#define GTK_TREE_SORTABLE_UNSORTED_SORT_COLUMN_ID (-2)
       +
        GtkListStore *gtk_list_store_new(gint n_columns, ...);
        void gtk_list_store_clear(GtkListStore *list_store);
        void gtk_list_store_insert(GtkListStore *list_store, GtkTreeIter *iter,
       t@@ -104,6 +112,9 @@ gboolean gtk_list_store_remove(GtkListStore *list_store, GtkTreeIter *iter);
        void gtk_list_store_set(GtkListStore *list_store, GtkTreeIter *iter, ...);
        
        void gtk_tree_model_get(GtkTreeModel *tree_model, GtkTreeIter *iter, ...);
       +gboolean gtk_tree_model_iter_nth_child(GtkTreeModel *tree_model,
       +                                       GtkTreeIter *iter,
       +                                       GtkTreeIter *parent, gint n);
        
        GtkWidget *gtk_tree_view_new(void);
        GtkTreeSelection *gtk_tree_view_get_selection(GtkTreeView *tree_view);
       t@@ -128,17 +139,24 @@ void gtk_tree_selection_select_path(GtkTreeSelection *selection,
                                            GtkTreePath *path);
        void gtk_tree_selection_unselect_path(GtkTreeSelection *selection,
                                              GtkTreePath *path);
       +void gtk_tree_selection_unselect_all(GtkTreeSelection *selection);
        #define gtk_tree_selection_select_iter(sel, iter) gtk_tree_selection_select_path(sel, iter)
       -
       +#define gtk_tree_selection_unselect_iter(sel, iter) gtk_tree_selection_unselect_path(sel, iter)
       +GList *gtk_tree_selection_get_selected_rows(GtkTreeSelection *selection,
       +                                            GtkTreeModel **model);
       +#define gtk_tree_path_free g_free
        GtkTreeViewColumn *gtk_tree_view_column_new_with_attributes
                           (const gchar *title, GtkCellRenderer *cell, ...);
        void gtk_tree_view_column_set_resizable(GtkTreeViewColumn *tree_column,
                                                gboolean resizable);
        void gtk_tree_view_column_set_expand(GtkTreeViewColumn *tree_column,
                                             gboolean expand);
       +void gtk_tree_view_column_set_sort_column_id(GtkTreeViewColumn *tree_column,
       +                                             gint sort_column_id);
        gint gtk_tree_view_insert_column(GtkTreeView *tree_view,
                                         GtkTreeViewColumn *column,
                                         gint position);
       +GtkTreeViewColumn *gtk_tree_view_get_column(GtkTreeView *tree_view, gint n);
        
        GtkCellRenderer *gtk_cell_renderer_text_new(void);