From b2908c710564ca2be2f15ff1ca97f727abaa7710 Mon Sep 17 00:00:00 2001 From: mishas Date: Wed, 13 Dec 2006 22:07:16 +0000 Subject: [PATCH] first more or less complete version of applet configuration stuff; requires memory related review git-svn-id: file:///svnroot/simple-launcher/trunk@54 3ba93dab-e023-0410-b42a-de7732cf370a --- sla-list.cc | 131 +++++++++++++++++++++++++++++++++++++++++++++++++++++++---- sla-list.h | 19 ++++++++- 2 files changed, 141 insertions(+), 9 deletions(-) diff --git a/sla-list.cc b/sla-list.cc index efe5875..7f2d842 100644 --- a/sla-list.cc +++ b/sla-list.cc @@ -19,18 +19,26 @@ #include #include #include +#include +#include +#include +#include +#include #include "sla-list.h" -SLAList::SLAList(int icon_size): myWidget(0), myStore(0), myView(0) { +SLAList::SLAList(int icon_size): myWidget(0), myStore(0), myView(0), mySelection(0) { GtkTreeViewColumn *column; GtkCellRenderer *renderer; - myStore = gtk_list_store_new(3, GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_BOOLEAN); - myView = GTK_TREE_VIEW(gtk_tree_view_new_with_model(GTK_TREE_MODEL(myStore))); + myStore = gtk_list_store_new(4, GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_BOOLEAN, G_TYPE_STRING); + myView = GTK_TREE_VIEW(gtk_tree_view_new_with_model(GTK_TREE_MODEL(myStore))); gtk_tree_view_set_headers_visible(myView, FALSE); + mySelection = gtk_tree_view_get_selection(myView); + gtk_tree_selection_set_mode(mySelection, GTK_SELECTION_SINGLE); + renderer = gtk_cell_renderer_pixbuf_new(); g_object_set(renderer, "yalign", 0.0, 0); gtk_cell_renderer_set_fixed_size(renderer, icon_size+4, -1); @@ -47,22 +55,129 @@ SLAList::SLAList(int icon_size): myWidget(0), myStore(0), myView(0) { gtk_tree_view_insert_column(myView, column, -1); renderer = gtk_cell_renderer_toggle_new(); + g_object_set(renderer, "activatable", TRUE, 0); + g_signal_connect(renderer, "toggled", G_CALLBACK(_toggleBool), this); column = GTK_TREE_VIEW_COLUMN(gtk_tree_view_column_new_with_attributes("", renderer, "active", 2, 0)); gtk_tree_view_insert_column(myView, column, -1); - myWidget = gtk_scrolled_window_new(0, 0); + GtkWidget *swindow = gtk_scrolled_window_new(0, 0); + + gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(swindow), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); + gtk_container_add(GTK_CONTAINER(swindow), GTK_WIDGET(myView)); + + gtk_widget_set_size_request(swindow, 500, 300); + + GtkWidget *move_up = gtk_button_new_from_stock(GTK_STOCK_GO_UP), + *move_down = gtk_button_new_from_stock(GTK_STOCK_GO_DOWN); + GtkTable *table = GTK_TABLE(gtk_table_new(4, 1, FALSE)); + gtk_table_attach(table, move_up, 0, 1, 1, 2, (GtkAttachOptions)(GTK_EXPAND|GTK_FILL), GTK_EXPAND, 0, 0); + gtk_table_attach(table, move_down, 0, 1, 2, 3, (GtkAttachOptions)(GTK_EXPAND|GTK_FILL), GTK_EXPAND, 0, 0); + + g_signal_connect(move_up, "clicked", G_CALLBACK(_moveUp), this); + g_signal_connect(move_down, "clicked", G_CALLBACK(_moveDown), this); + + myWidget = gtk_hbox_new(FALSE, 0); + gtk_box_pack_start(GTK_BOX(myWidget), swindow, FALSE, FALSE, 0); + gtk_box_pack_start(GTK_BOX(myWidget), GTK_WIDGET(table), FALSE, FALSE, 0); + + gtk_widget_show_all(myWidget); +} + +SLAList::~SLAList() { + // FIXME: do something! :) +} + +void SLAList::collectItems(std::vector >& result) { + GtkTreeIter iter; + + if (gtk_tree_model_get_iter_first(GTK_TREE_MODEL(myStore), &iter)) { + char *name; + gboolean active; - gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(myWidget), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); - gtk_container_add(GTK_CONTAINER(myWidget), GTK_WIDGET(myView)); + gtk_tree_model_get(GTK_TREE_MODEL(myStore), &iter, 3, &name, 2, &active, -1); + + result.push_back(std::pair(name, active)); + + while (gtk_tree_model_iter_next(GTK_TREE_MODEL(myStore), &iter)) { + gtk_tree_model_get(GTK_TREE_MODEL(myStore), &iter, 3, &name, 2, &active, -1); + + result.push_back(std::pair(name, active)); + } + } } -void SLAList::addItem(GdkPixbuf *pixbuf, const char *name, bool active) { +void SLAList::addItem(const char *filename, GdkPixbuf *pixbuf, const char *name, bool active) { GtkTreeIter iter; gtk_list_store_append(myStore, &iter); + gtk_list_store_set(myStore, &iter, 0, pixbuf, 1, name, 2, active, 3, filename, -1); +} + +void SLAList::_toggleBool(GtkCellRendererToggle *renderer, const gchar *path, void *self) { + ((SLAList *)self)->toggleBool(renderer, path); +} + +void SLAList::_moveUp(GtkButton *button, void *self) { + ((SLAList *)self)->moveUp(button); +} + +void SLAList::_moveDown(GtkButton *button, void *self) { + ((SLAList *)self)->moveDown(button); +} + +void SLAList::toggleBool(GtkCellRendererToggle *renderer, const gchar *spath) { + GtkTreePath *path = gtk_tree_path_new_from_string(spath); + + if (path != 0) { + GtkTreeIter iter; + + if (gtk_tree_model_get_iter(GTK_TREE_MODEL(myStore), &iter, path)) { + gboolean value; + + gtk_tree_model_get(GTK_TREE_MODEL(myStore), &iter, 2, &value, -1); + gtk_list_store_set(myStore, &iter, 2, !value, -1); + } + } +} + +void SLAList::moveUp(GtkButton *) { + GtkTreeModel *dummy; + GtkTreeIter current; + + if (gtk_tree_selection_get_selected(mySelection, &dummy, ¤t)) { + GtkTreePath *path = gtk_tree_model_get_path(GTK_TREE_MODEL(myStore), ¤t); + + // FIXME: we kinda expexted path to be non-NULL here :) + if (gtk_tree_path_prev(path)) { + GtkTreeIter next; + + if (gtk_tree_model_get_iter(GTK_TREE_MODEL(myStore), &next, path)) { + gtk_list_store_swap(myStore, ¤t, &next); + } + } + + gtk_tree_path_free(path); + } +} + +void SLAList::moveDown(GtkButton *) { + GtkTreeModel *dummy; + GtkTreeIter current; + + if (gtk_tree_selection_get_selected(mySelection, &dummy, ¤t)) { + GtkTreePath *path = gtk_tree_model_get_path(GTK_TREE_MODEL(myStore), ¤t); + GtkTreeIter next; + + // FIXME: we kinda expexted path to be non-NULL here :) + gtk_tree_path_next(path); + + if (gtk_tree_model_get_iter(GTK_TREE_MODEL(myStore), &next, path)) { + gtk_list_store_swap(myStore, ¤t, &next); + } - gtk_list_store_set(myStore, &iter, 0, pixbuf, 1, name, 2, active, -1); + gtk_tree_path_free(path); + } } // vim:ts=2:sw=2:et diff --git a/sla-list.h b/sla-list.h index 8944598..0fbfc3a 100644 --- a/sla-list.h +++ b/sla-list.h @@ -18,22 +18,39 @@ #ifndef __SLA_LIST_H__ #define __SLA_LIST_H__ +#include +#include + #include #include +#include +#include class SLAList { public: SLAList(int); ~SLAList(); - void addItem(GdkPixbuf *pixbuf, const char *name, bool active); + void addItem(const char *filename, GdkPixbuf *pixbuf, const char *name, bool active); GtkWidget *getWidget() { return myWidget; } + void collectItems(std::vector >&); + +private: + static void _moveUp(GtkButton *, void *); + static void _moveDown(GtkButton *, void *); + static void _toggleBool(GtkCellRendererToggle *, const gchar *, void *); + + void moveUp(GtkButton *); + void moveDown(GtkButton *); + void toggleBool(GtkCellRendererToggle *, const gchar *); + private: GtkWidget *myWidget; GtkListStore *myStore; GtkTreeView *myView; + GtkTreeSelection *mySelection; }; #endif -- 1.7.9.5