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);