1 // This file is a part of Simple Launcher
3 // Copyright (C) 2006, Mikhail Sobolev
5 // Simple Launcher is free software; you can redistribute it and/or modify it
6 // under the terms of the GNU General Public License version 2 as published by
7 // the Free Software Foundation.
9 // This program is distributed in the hope that it will be useful, but WITHOUT
10 // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
14 // You should have received a copy of the GNU General Public License along with
15 // this program; if not, write to the Free Software Foundation, Inc., 51
16 // Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
18 #include <gtk/gtkscrolledwindow.h>
19 #include <gtk/gtkcellrendererpixbuf.h>
20 #include <gtk/gtkcellrenderertext.h>
21 #include <gtk/gtkcellrenderertoggle.h>
22 #include <gtk/gtktable.h>
23 #include <gtk/gtkbutton.h>
24 #include <gtk/gtktreeselection.h>
25 #include <gtk/gtkhbox.h>
26 #include <gtk/gtkstock.h>
30 SLAList::SLAList(int icon_size): myWidget(0), myStore(0), myView(0), mySelection(0) {
31 GtkTreeViewColumn *column;
32 GtkCellRenderer *renderer;
34 myStore = gtk_list_store_new(4, GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_BOOLEAN, G_TYPE_STRING);
36 myView = GTK_TREE_VIEW(gtk_tree_view_new_with_model(GTK_TREE_MODEL(myStore)));
37 gtk_tree_view_set_headers_visible(myView, FALSE);
39 mySelection = gtk_tree_view_get_selection(myView);
40 gtk_tree_selection_set_mode(mySelection, GTK_SELECTION_SINGLE);
42 renderer = gtk_cell_renderer_pixbuf_new();
43 g_object_set(renderer, "yalign", 0.0, 0);
44 gtk_cell_renderer_set_fixed_size(renderer, icon_size+4, -1);
45 column = GTK_TREE_VIEW_COLUMN(gtk_tree_view_column_new_with_attributes("", renderer, "pixbuf", 0, 0));
47 gtk_tree_view_insert_column(myView, column, -1);
49 renderer = gtk_cell_renderer_text_new();
50 g_object_set(renderer, "yalign", 0.0, 0);
51 column = GTK_TREE_VIEW_COLUMN(gtk_tree_view_column_new_with_attributes("", renderer, "text", 1, 0));
52 gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
53 gtk_tree_view_column_set_expand(column, TRUE);
55 gtk_tree_view_insert_column(myView, column, -1);
57 renderer = gtk_cell_renderer_toggle_new();
58 g_object_set(renderer, "activatable", TRUE, 0);
59 g_signal_connect(renderer, "toggled", G_CALLBACK(_toggleBool), this);
60 column = GTK_TREE_VIEW_COLUMN(gtk_tree_view_column_new_with_attributes("", renderer, "active", 2, 0));
62 gtk_tree_view_insert_column(myView, column, -1);
64 GtkWidget *swindow = gtk_scrolled_window_new(0, 0);
66 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(swindow), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
67 gtk_container_add(GTK_CONTAINER(swindow), GTK_WIDGET(myView));
69 gtk_widget_set_size_request(swindow, 500, 300);
71 GtkWidget *move_up = gtk_button_new_from_stock(GTK_STOCK_GO_UP),
72 *move_down = gtk_button_new_from_stock(GTK_STOCK_GO_DOWN);
73 GtkTable *table = GTK_TABLE(gtk_table_new(4, 1, FALSE));
74 gtk_table_attach(table, move_up, 0, 1, 1, 2, (GtkAttachOptions)(GTK_EXPAND|GTK_FILL), GTK_EXPAND, 0, 0);
75 gtk_table_attach(table, move_down, 0, 1, 2, 3, (GtkAttachOptions)(GTK_EXPAND|GTK_FILL), GTK_EXPAND, 0, 0);
77 g_signal_connect(move_up, "clicked", G_CALLBACK(_moveUp), this);
78 g_signal_connect(move_down, "clicked", G_CALLBACK(_moveDown), this);
80 myWidget = gtk_hbox_new(FALSE, 0);
81 gtk_box_pack_start(GTK_BOX(myWidget), swindow, FALSE, FALSE, 0);
82 gtk_box_pack_start(GTK_BOX(myWidget), GTK_WIDGET(table), FALSE, FALSE, 0);
84 gtk_widget_show_all(myWidget);
88 // FIXME: do something! :)
91 void SLAList::collectItems(std::vector<std::pair<std::string, bool> >& result) {
94 if (gtk_tree_model_get_iter_first(GTK_TREE_MODEL(myStore), &iter)) {
98 gtk_tree_model_get(GTK_TREE_MODEL(myStore), &iter, 3, &name, 2, &active, -1);
100 result.push_back(std::pair<std::string, bool>(name, active));
102 while (gtk_tree_model_iter_next(GTK_TREE_MODEL(myStore), &iter)) {
103 gtk_tree_model_get(GTK_TREE_MODEL(myStore), &iter, 3, &name, 2, &active, -1);
105 result.push_back(std::pair<std::string, bool>(name, active));
110 void SLAList::addItem(const char *filename, GdkPixbuf *pixbuf, const char *name, bool active) {
113 gtk_list_store_append(myStore, &iter);
114 gtk_list_store_set(myStore, &iter, 0, pixbuf, 1, name, 2, active, 3, filename, -1);
117 void SLAList::_toggleBool(GtkCellRendererToggle *renderer, const gchar *path, void *self) {
118 ((SLAList *)self)->toggleBool(renderer, path);
121 void SLAList::_moveUp(GtkButton *button, void *self) {
122 ((SLAList *)self)->moveUp(button);
125 void SLAList::_moveDown(GtkButton *button, void *self) {
126 ((SLAList *)self)->moveDown(button);
129 void SLAList::toggleBool(GtkCellRendererToggle *renderer, const gchar *spath) {
130 GtkTreePath *path = gtk_tree_path_new_from_string(spath);
135 if (gtk_tree_model_get_iter(GTK_TREE_MODEL(myStore), &iter, path)) {
138 gtk_tree_model_get(GTK_TREE_MODEL(myStore), &iter, 2, &value, -1);
139 gtk_list_store_set(myStore, &iter, 2, !value, -1);
144 void SLAList::moveUp(GtkButton *) {
148 if (gtk_tree_selection_get_selected(mySelection, &dummy, ¤t)) {
149 GtkTreePath *path = gtk_tree_model_get_path(GTK_TREE_MODEL(myStore), ¤t);
151 // FIXME: we kinda expexted path to be non-NULL here :)
152 if (gtk_tree_path_prev(path)) {
155 if (gtk_tree_model_get_iter(GTK_TREE_MODEL(myStore), &next, path)) {
156 gtk_list_store_swap(myStore, ¤t, &next);
160 gtk_tree_path_free(path);
164 void SLAList::moveDown(GtkButton *) {
168 if (gtk_tree_selection_get_selected(mySelection, &dummy, ¤t)) {
169 GtkTreePath *path = gtk_tree_model_get_path(GTK_TREE_MODEL(myStore), ¤t);
172 // FIXME: we kinda expexted path to be non-NULL here :)
173 gtk_tree_path_next(path);
175 if (gtk_tree_model_get_iter(GTK_TREE_MODEL(myStore), &next, path)) {
176 gtk_list_store_swap(myStore, ¤t, &next);
179 gtk_tree_path_free(path);