Learning GTK4 Trees _ initial commit (+ simple & light loop)

This commit is contained in:
Jean Sirmai 2023-12-12 19:02:08 +01:00
parent 1a02d93f20
commit 375d658cc8
Signed by: jean
GPG Key ID: FB3115C340E057E3
1 changed files with 207 additions and 205 deletions

View File

@ -32,9 +32,9 @@ static GtkWidget *source_view;
static char *current_file = NULL;
static GtkWidget *notebook;
static GtkSingleSelection *selection;
static GtkWidget *toplevel;
static char **search_needle;
// static GtkSingleSelection *selection;
// static GtkWidget *toplevel;
// static char **search_needle;
typedef struct _GtkDemo GtkDemo;
struct _GtkDemo
@ -142,26 +142,26 @@ struct _CallbackData
GtkTreePath *path;
};
static gboolean
gtk_demo_run (GtkDemo *self,
GtkWidget *window)
{
GtkWidget *result;
/* static gboolean */
/* gtk_demo_run (GtkDemo *self, */
/* GtkWidget *window) */
/* { */
/* GtkWidget *result; */
if (!self->func)
return FALSE;
/* if (!self->func) */
/* return FALSE; */
result = self->func (window);
if (result == NULL)
return FALSE;
/* result = self->func (window); */
/* if (result == NULL) */
/* return FALSE; */
if (GTK_IS_WINDOW (result))
{
gtk_window_set_transient_for (GTK_WINDOW (result), GTK_WINDOW (window));
gtk_window_set_modal (GTK_WINDOW (result), TRUE);
}
return TRUE;
}
/* if (GTK_IS_WINDOW (result)) */
/* { */
/* gtk_window_set_transient_for (GTK_WINDOW (result), GTK_WINDOW (window)); */
/* gtk_window_set_modal (GTK_WINDOW (result), TRUE); */
/* } */
/* return TRUE; */
/* } */
static void
activate_about (GSimpleAction *action,
@ -255,16 +255,16 @@ activate_inspector (GSimpleAction *action,
gtk_window_set_interactive_debugging (TRUE);
}
static void
activate_run (GSimpleAction *action,
GVariant *parameter,
gpointer window)
{
GtkTreeListRow *row = gtk_single_selection_get_selected_item (selection);
GtkDemo *demo = gtk_tree_list_row_get_item (row);
/* static void */
/* activate_run (GSimpleAction *action, */
/* GVariant *parameter, */
/* gpointer window) */
/* { */
/* GtkTreeListRow *row = gtk_single_selection_get_selected_item (selection); */
/* GtkDemo *demo = gtk_tree_list_row_get_item (row); */
gtk_demo_run (demo, window);
}
/* gtk_demo_run (demo, window); */
/* } */
static GtkWidget *
display_image (const char *format,
@ -681,238 +681,238 @@ load_file (const char *demoname,
g_object_unref (info_buffer);
}
static void
activate_cb (GtkWidget *widget,
guint position,
gpointer window)
{
GListModel *model = G_LIST_MODEL (gtk_list_view_get_model (GTK_LIST_VIEW (widget)));
GtkTreeListRow *row = g_list_model_get_item (model, position);
GtkDemo *demo = gtk_tree_list_row_get_item (row);
/* static void */
/* activate_cb (GtkWidget *widget, */
/* guint position, */
/* gpointer window) */
/* { */
/* GListModel *model = G_LIST_MODEL (gtk_list_view_get_model (GTK_LIST_VIEW (widget))); */
/* GtkTreeListRow *row = g_list_model_get_item (model, position); */
/* GtkDemo *demo = gtk_tree_list_row_get_item (row); */
gtk_demo_run (demo, window);
/* gtk_demo_run (demo, window); */
g_object_unref (row);
}
/* g_object_unref (row); */
/* } */
static void
selection_cb (GtkSingleSelection *sel,
GParamSpec *pspec,
gpointer user_data)
{
GtkTreeListRow *row = gtk_single_selection_get_selected_item (sel);
GtkDemo *demo;
GAction *action;
/* static void */
/* selection_cb (GtkSingleSelection *sel, */
/* GParamSpec *pspec, */
/* gpointer user_data) */
/* { */
/* GtkTreeListRow *row = gtk_single_selection_get_selected_item (sel); */
/* GtkDemo *demo; */
/* GAction *action; */
gtk_widget_set_sensitive (GTK_WIDGET (notebook), !!row);
/* gtk_widget_set_sensitive (GTK_WIDGET (notebook), !!row); */
if (!row)
{
gtk_window_set_title (GTK_WINDOW (toplevel), "No match");
/* if (!row) */
/* { */
/* gtk_window_set_title (GTK_WINDOW (toplevel), "No match"); */
return;
}
/* return; */
/* } */
demo = gtk_tree_list_row_get_item (row);
/* demo = gtk_tree_list_row_get_item (row); */
if (demo->filename)
load_file (demo->name, demo->filename);
/* if (demo->filename) */
/* load_file (demo->name, demo->filename); */
action = g_action_map_lookup_action (G_ACTION_MAP (toplevel), "run");
g_simple_action_set_enabled (G_SIMPLE_ACTION (action), demo->func != NULL);
/* action = g_action_map_lookup_action (G_ACTION_MAP (toplevel), "run"); */
/* g_simple_action_set_enabled (G_SIMPLE_ACTION (action), demo->func != NULL); */
gtk_window_set_title (GTK_WINDOW (toplevel), demo->title);
}
/* gtk_window_set_title (GTK_WINDOW (toplevel), demo->title); */
/* } */
static gboolean
filter_demo (GtkDemo *demo)
{
int i;
/* static gboolean */
/* filter_demo (GtkDemo *demo) */
/* { */
/* int i; */
/* Show only if the name matches every needle */
for (i = 0; search_needle[i]; i++)
{
if (!demo->title)
return FALSE;
/* for (i = 0; search_needle[i]; i++) */
/* { */
/* if (!demo->title) */
/* return FALSE; */
if (g_str_match_string (search_needle[i], demo->title, TRUE))
continue;
/* if (g_str_match_string (search_needle[i], demo->title, TRUE)) */
/* continue; */
if (demo->keywords)
{
int j;
gboolean found = FALSE;
/* if (demo->keywords) */
/* { */
/* int j; */
/* gboolean found = FALSE; */
for (j = 0; !found && demo->keywords[j]; j++)
{
if (strstr (demo->keywords[j], search_needle[i]))
found = TRUE;
}
/* for (j = 0; !found && demo->keywords[j]; j++) */
/* { */
/* if (strstr (demo->keywords[j], search_needle[i])) */
/* found = TRUE; */
/* } */
if (found)
continue;
}
/* if (found) */
/* continue; */
/* } */
return FALSE;
}
/* return FALSE; */
/* } */
return TRUE;
}
/* return TRUE; */
/* } */
static gboolean
demo_filter_by_name (gpointer item,
gpointer user_data)
{
GtkTreeListRow *row = item;
GListModel *children;
GtkDemo *demo;
guint i, n;
GtkTreeListRow *parent;
/* static gboolean */
/* demo_filter_by_name (gpointer item, */
/* gpointer user_data) */
/* { */
/* GtkTreeListRow *row = item; */
/* GListModel *children; */
/* GtkDemo *demo; */
/* guint i, n; */
/* GtkTreeListRow *parent; */
/* Show all items if search is empty */
if (!search_needle || !search_needle[0] || !*search_needle[0])
return TRUE;
/* if (!search_needle || !search_needle[0] || !*search_needle[0]) */
/* return TRUE; */
g_assert (GTK_IS_TREE_LIST_ROW (row));
g_assert (GTK_IS_FILTER_LIST_MODEL (user_data));
/* g_assert (GTK_IS_TREE_LIST_ROW (row)); */
/* g_assert (GTK_IS_FILTER_LIST_MODEL (user_data)); */
/* Show a row if itself of any parent matches */
for (parent = row; parent; parent = gtk_tree_list_row_get_parent (parent))
{
demo = gtk_tree_list_row_get_item (parent);
g_assert (GTK_IS_DEMO (demo));
/* for (parent = row; parent; parent = gtk_tree_list_row_get_parent (parent)) */
/* { */
/* demo = gtk_tree_list_row_get_item (parent); */
/* g_assert (GTK_IS_DEMO (demo)); */
if (filter_demo (demo))
return TRUE;
}
/* if (filter_demo (demo)) */
/* return TRUE; */
/* } */
/* Show a row if any child matches */
children = gtk_tree_list_row_get_children (row);
if (children)
{
n = g_list_model_get_n_items (children);
for (i = 0; i < n; i++)
{
demo = g_list_model_get_item (children, i);
g_assert (GTK_IS_DEMO (demo));
/* children = gtk_tree_list_row_get_children (row); */
/* if (children) */
/* { */
/* n = g_list_model_get_n_items (children); */
/* for (i = 0; i < n; i++) */
/* { */
/* demo = g_list_model_get_item (children, i); */
/* g_assert (GTK_IS_DEMO (demo)); */
if (filter_demo (demo))
{
g_object_unref (demo);
return TRUE;
}
g_object_unref (demo);
}
}
/* if (filter_demo (demo)) */
/* { */
/* g_object_unref (demo); */
/* return TRUE; */
/* } */
/* g_object_unref (demo); */
/* } */
/* } */
return FALSE;
}
/* return FALSE; */
/* } */
static void
demo_search_changed_cb (GtkSearchEntry *entry,
GtkFilter *filter)
{
const char *text;
/* static void */
/* demo_search_changed_cb (GtkSearchEntry *entry, */
/* GtkFilter *filter) */
/* { */
/* const char *text; */
g_assert (GTK_IS_SEARCH_ENTRY (entry));
g_assert (GTK_IS_FILTER (filter));
/* g_assert (GTK_IS_SEARCH_ENTRY (entry)); */
/* g_assert (GTK_IS_FILTER (filter)); */
text = gtk_editable_get_text (GTK_EDITABLE (entry));
/* text = gtk_editable_get_text (GTK_EDITABLE (entry)); */
g_clear_pointer (&search_needle, g_strfreev);
/* g_clear_pointer (&search_needle, g_strfreev); */
if (text && *text)
search_needle = g_str_tokenize_and_fold (text, NULL, NULL);
/* if (text && *text) */
/* search_needle = g_str_tokenize_and_fold (text, NULL, NULL); */
gtk_filter_changed (filter, GTK_FILTER_CHANGE_DIFFERENT);
}
/* gtk_filter_changed (filter, GTK_FILTER_CHANGE_DIFFERENT); */
/* } */
static GListModel *
create_demo_model (void)
{
GListStore *store = g_list_store_new (GTK_TYPE_DEMO);
DemoData *demo = gtk_demos;
GtkDemo *d;
/* static GListModel * */
/* create_demo_model (void) */
/* { */
/* GListStore *store = g_list_store_new (GTK_TYPE_DEMO); */
/* DemoData *demo = gtk_demos; */
/* GtkDemo *d; */
d = GTK_DEMO (g_object_new (GTK_TYPE_DEMO, NULL));
d->name = "main";
d->title = "GTK Demo";
d->keywords = NULL;
d->filename = "main.c";
d->func = NULL;
/* d = GTK_DEMO (g_object_new (GTK_TYPE_DEMO, NULL)); */
/* d->name = "main"; */
/* d->title = "GTK Demo"; */
/* d->keywords = NULL; */
/* d->filename = "main.c"; */
/* d->func = NULL; */
g_list_store_append (store, d);
/* g_list_store_append (store, d); */
while (demo->title)
{
d = GTK_DEMO (g_object_new (GTK_TYPE_DEMO, NULL));
DemoData *children = demo->children;
/* while (demo->title) */
/* { */
/* d = GTK_DEMO (g_object_new (GTK_TYPE_DEMO, NULL)); */
/* DemoData *children = demo->children; */
d->name = demo->name;
d->title = demo->title;
d->keywords = demo->keywords;
d->filename = demo->filename;
d->func = demo->func;
/* d->name = demo->name; */
/* d->title = demo->title; */
/* d->keywords = demo->keywords; */
/* d->filename = demo->filename; */
/* d->func = demo->func; */
g_list_store_append (store, d);
/* g_list_store_append (store, d); */
if (children)
{
d->children_model = G_LIST_MODEL (g_list_store_new (GTK_TYPE_DEMO));
/* if (children) */
/* { */
/* d->children_model = G_LIST_MODEL (g_list_store_new (GTK_TYPE_DEMO)); */
while (children->title)
{
GtkDemo *child = GTK_DEMO (g_object_new (GTK_TYPE_DEMO, NULL));
/* while (children->title) */
/* { */
/* GtkDemo *child = GTK_DEMO (g_object_new (GTK_TYPE_DEMO, NULL)); */
child->name = children->name;
child->title = children->title;
child->keywords = children->keywords;
child->filename = children->filename;
child->func = children->func;
/* child->name = children->name; */
/* child->title = children->title; */
/* child->keywords = children->keywords; */
/* child->filename = children->filename; */
/* child->func = children->func; */
g_list_store_append (G_LIST_STORE (d->children_model), child);
children++;
}
}
/* g_list_store_append (G_LIST_STORE (d->children_model), child); */
/* children++; */
/* } */
/* } */
demo++;
}
/* demo++; */
/* } */
return G_LIST_MODEL (store);
}
/* return G_LIST_MODEL (store); */
/* } */
static GListModel *
get_child_model (gpointer item,
gpointer user_data)
{
GtkDemo *demo = item;
/* static GListModel * */
/* get_child_model (gpointer item, */
/* gpointer user_data) */
/* { */
/* GtkDemo *demo = item; */
if (demo->children_model)
return g_object_ref (G_LIST_MODEL (demo->children_model));
/* if (demo->children_model) */
/* return g_object_ref (G_LIST_MODEL (demo->children_model)); */
return NULL;
}
/* return NULL; */
/* } */
static void
clear_search (GtkSearchBar *bar)
{
if (!gtk_search_bar_get_search_mode (bar))
{
GtkWidget *entry = gtk_search_bar_get_child (GTK_SEARCH_BAR (bar));
gtk_editable_set_text (GTK_EDITABLE (entry), "");
}
}
/* static void */
/* clear_search (GtkSearchBar *bar) */
/* { */
/* if (!gtk_search_bar_get_search_mode (bar)) */
/* { */
/* GtkWidget *entry = gtk_search_bar_get_child (GTK_SEARCH_BAR (bar)); */
/* gtk_editable_set_text (GTK_EDITABLE (entry), ""); */
/* } */
/* } */
static void
activate (GApplication *app)
{
GtkBuilder *builder;
GListModel *listmodel;
GtkTreeListModel *treemodel;
GtkWidget *window, *listview, *search_entry, *search_bar;
GtkFilterListModel *filter_model;
GtkFilter *filter;
GSimpleAction *action;
// GtkBuilder *builder;
// GListModel *listmodel;
// GtkTreeListModel *treemodel;
GtkWidget *window;//, *listview, *search_entry, *search_bar;
// GtkFilterListModel *filter_model;
// GtkFilter *filter;
// GSimpleAction *action;
window= do_tree_store(NULL);
gtk_application_add_window (GTK_APPLICATION (app), GTK_WINDOW (window));
@ -1128,6 +1128,8 @@ main (int argc, char **argv)
g_signal_connect (app, "handle-local-options", G_CALLBACK (local_options), NULL);
g_application_run (G_APPLICATION (app), argc, argv);
printf(" (line 1132 in demos/gtk-demo/main.c) >> [env] $ clear && meson compile && demos/gtk-demo/gtk4-demo\n");
return 0;
}