X-Git-Url: http://git.maemo.org/git/?a=blobdiff_plain;f=sla-list.cc;h=7104b8ef6ec698e3c23f799d3b7c2c2a626067e6;hb=3f43bcf738a5c84a2e8594deb477300fbec3007d;hp=7f2d842afb316ffd22b33ffff73f39ced8676473;hpb=b2908c710564ca2be2f15ff1ca97f727abaa7710;p=simple-launcher diff --git a/sla-list.cc b/sla-list.cc index 7f2d842..7104b8e 100644 --- a/sla-list.cc +++ b/sla-list.cc @@ -1,6 +1,6 @@ // This file is a part of Simple Launcher // -// Copyright (C) 2006, Mikhail Sobolev +// Copyright (C) 2006, 2007, Mikhail Sobolev // // Simple Launcher is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License version 2 as published by @@ -27,49 +27,71 @@ #include "sla-list.h" -SLAList::SLAList(int icon_size): myWidget(0), myStore(0), myView(0), mySelection(0) { +enum { + SLA_STORE_COLUMN_ICON = 0, + SLA_STORE_COLUMN_INDEX, + SLA_STORE_COLUMN_LAST +}; + +static GtkWidget *gtk_button_new_stock_image_only(const gchar *stock_id) { + GtkWidget *button = gtk_button_new(); + GtkWidget *image = gtk_image_new_from_stock(stock_id, GTK_ICON_SIZE_BUTTON); + + gtk_container_add(GTK_CONTAINER(button), image); + + return button; +} + +SLAList::SLAList(int icon_size, LauncherItems& items): myWidget(NULL), myStore(NULL), myView(NULL), mySelection(NULL), myLastSelection(NULL), myItems(items) { GtkTreeViewColumn *column; GtkCellRenderer *renderer; - myStore = gtk_list_store_new(4, GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_BOOLEAN, G_TYPE_STRING); + myStore = gtk_list_store_new(2, GDK_TYPE_PIXBUF, G_TYPE_INT); myView = GTK_TREE_VIEW(gtk_tree_view_new_with_model(GTK_TREE_MODEL(myStore))); gtk_tree_view_set_headers_visible(myView, FALSE); + g_object_set(myView, "allow-checkbox-mode", FALSE, NULL); mySelection = gtk_tree_view_get_selection(myView); gtk_tree_selection_set_mode(mySelection, GTK_SELECTION_SINGLE); + g_signal_connect(G_OBJECT(mySelection), "changed", G_CALLBACK(_selectionChanged), this); + renderer = gtk_cell_renderer_pixbuf_new(); - g_object_set(renderer, "yalign", 0.0, 0); + g_object_set(renderer, "yalign", 0.0, NULL); gtk_cell_renderer_set_fixed_size(renderer, icon_size+4, -1); - column = GTK_TREE_VIEW_COLUMN(gtk_tree_view_column_new_with_attributes("", renderer, "pixbuf", 0, 0)); + column = GTK_TREE_VIEW_COLUMN(gtk_tree_view_column_new_with_attributes("", renderer, "pixbuf", 0, NULL)); gtk_tree_view_insert_column(myView, column, -1); renderer = gtk_cell_renderer_text_new(); - g_object_set(renderer, "yalign", 0.0, 0); - column = GTK_TREE_VIEW_COLUMN(gtk_tree_view_column_new_with_attributes("", renderer, "text", 1, 0)); + g_object_set(renderer, "yalign", 0.0, NULL); + column = gtk_tree_view_column_new(); gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED); gtk_tree_view_column_set_expand(column, TRUE); + gtk_tree_view_column_pack_start(column, renderer, TRUE); + gtk_tree_view_column_set_cell_data_func(column, renderer, _renderText, this, NULL); gtk_tree_view_insert_column(myView, column, -1); renderer = gtk_cell_renderer_toggle_new(); - g_object_set(renderer, "activatable", TRUE, 0); + g_object_set(renderer, "activatable", TRUE, NULL); 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)); + column = gtk_tree_view_column_new(); + gtk_tree_view_column_pack_start(column, renderer, TRUE); + gtk_tree_view_column_set_cell_data_func(column, renderer, _renderBool, this, NULL); gtk_tree_view_insert_column(myView, column, -1); - GtkWidget *swindow = gtk_scrolled_window_new(0, 0); + GtkWidget *swindow = gtk_scrolled_window_new(NULL, NULL); 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); + GtkWidget *move_up = gtk_button_new_stock_image_only(GTK_STOCK_GO_UP), + *move_down = gtk_button_new_stock_image_only(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); @@ -82,36 +104,59 @@ SLAList::SLAList(int icon_size): myWidget(0), myStore(0), myView(0), mySelection gtk_box_pack_start(GTK_BOX(myWidget), GTK_WIDGET(table), FALSE, FALSE, 0); gtk_widget_show_all(myWidget); + + for (LauncherItems::Names::const_iterator it = myItems.myNames.begin(); it != myItems.myNames.end(); ++it) { + LauncherItem *item = myItems.myItems[*it]; + GtkTreeIter iter; + + gtk_list_store_append(myStore, &iter); + { + GdkPixbuf *icon = item->getIcon(icon_size); + gtk_list_store_set(myStore, &iter, SLA_STORE_COLUMN_ICON, icon, SLA_STORE_COLUMN_INDEX, it-myItems.myNames.begin(), -1); + g_object_unref(G_OBJECT(icon)); + } + } } SLAList::~SLAList() { // FIXME: do something! :) } -void SLAList::collectItems(std::vector >& result) { - GtkTreeIter iter; +void SLAList::_selectionChanged(GtkTreeSelection *selection, void *self) { + ((SLAList *)self)->selectionChanged(selection); +} - if (gtk_tree_model_get_iter_first(GTK_TREE_MODEL(myStore), &iter)) { - char *name; - gboolean active; +void SLAList::selectionChanged(GtkTreeSelection *) { + if (myLastSelection != NULL) { + kickIt(myLastSelection); + gtk_tree_iter_free(myLastSelection); + myLastSelection = NULL; + } - gtk_tree_model_get(GTK_TREE_MODEL(myStore), &iter, 3, &name, 2, &active, -1); + GtkTreeIter iter; + GtkTreeModel *dummy; - result.push_back(std::pair(name, active)); + if (gtk_tree_selection_get_selected(mySelection, &dummy, &iter)) { + kickIt(&iter); + myLastSelection = gtk_tree_iter_copy(&iter); + } +} - 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); +void SLAList::kickIt(GtkTreeIter *iter) { + GtkTreePath *path = gtk_tree_model_get_path(GTK_TREE_MODEL(myStore), iter); - result.push_back(std::pair(name, active)); - } + if (path != NULL) { + g_signal_emit_by_name(myStore, "row-changed", path, iter); + gtk_tree_path_free(path); } } -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::_renderText(GtkTreeViewColumn *column, GtkCellRenderer *cell, GtkTreeModel *model, GtkTreeIter *iter, gpointer self) { + ((SLAList *)self)->renderText(column, cell, model, iter); +} + +void SLAList::_renderBool(GtkTreeViewColumn *column, GtkCellRenderer *cell, GtkTreeModel *model, GtkTreeIter *iter, gpointer self) { + ((SLAList *)self)->renderBool(column, cell, model, iter); } void SLAList::_toggleBool(GtkCellRendererToggle *renderer, const gchar *path, void *self) { @@ -126,18 +171,38 @@ 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); +void SLAList::renderText(GtkTreeViewColumn *, GtkCellRenderer *cell, GtkTreeModel *model, GtkTreeIter *iter) { + int index; - if (path != 0) { - GtkTreeIter iter; + gtk_tree_model_get(GTK_TREE_MODEL(myStore), iter, SLA_STORE_COLUMN_INDEX, &index, -1); - if (gtk_tree_model_get_iter(GTK_TREE_MODEL(myStore), &iter, path)) { - gboolean value; + LauncherItem *item = myItems[index]; - gtk_tree_model_get(GTK_TREE_MODEL(myStore), &iter, 2, &value, -1); - gtk_list_store_set(myStore, &iter, 2, !value, -1); - } + if (gtk_tree_selection_iter_is_selected(mySelection, iter)) { + gchar *text = g_markup_printf_escaped("%s\n%s", item->getName().c_str(), item->getComment().c_str()); + g_object_set(cell, "markup", text, NULL); + g_free(text); + } else { + g_object_set(cell, "text", item->getName().c_str(), NULL); + } +} + +void SLAList::renderBool(GtkTreeViewColumn *, GtkCellRenderer *cell, GtkTreeModel *model, GtkTreeIter *iter) { + int index; + + gtk_tree_model_get(GTK_TREE_MODEL(myStore), iter, SLA_STORE_COLUMN_INDEX, &index, -1); + + g_object_set(cell, "active", myItems[index]->isEnabled(), NULL); +} + +void SLAList::toggleBool(GtkCellRendererToggle *renderer, const gchar *spath) { + GtkTreeIter iter; + + if (gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(myStore), &iter, spath)) { + int index; + + gtk_tree_model_get(GTK_TREE_MODEL(myStore), &iter, SLA_STORE_COLUMN_INDEX, &index, -1); + myItems[index]->toggle(); } } @@ -153,7 +218,7 @@ void SLAList::moveUp(GtkButton *) { GtkTreeIter next; if (gtk_tree_model_get_iter(GTK_TREE_MODEL(myStore), &next, path)) { - gtk_list_store_swap(myStore, ¤t, &next); + swap(current, next); } } @@ -173,11 +238,25 @@ void SLAList::moveDown(GtkButton *) { gtk_tree_path_next(path); if (gtk_tree_model_get_iter(GTK_TREE_MODEL(myStore), &next, path)) { - gtk_list_store_swap(myStore, ¤t, &next); + swap(current, next); } gtk_tree_path_free(path); } } +void SLAList::swap(GtkTreeIter& a, GtkTreeIter& b) { + int i1, i2; + + gtk_tree_model_get(GTK_TREE_MODEL(myStore), &a, SLA_STORE_COLUMN_INDEX, &i1, -1); + gtk_tree_model_get(GTK_TREE_MODEL(myStore), &b, SLA_STORE_COLUMN_INDEX, &i2, -1); + + myItems.swap(i1, i2); + + gtk_list_store_set(myStore, &a, SLA_STORE_COLUMN_INDEX, i2, -1); + gtk_list_store_set(myStore, &b, SLA_STORE_COLUMN_INDEX, i1, -1); + + gtk_list_store_swap(myStore, &a, &b); +} + // vim:ts=2:sw=2:et