X-Git-Url: http://git.maemo.org/git/?a=blobdiff_plain;f=sla-list.cc;h=dff4767e96f975f93f26a3148dc44cf7bf49c59a;hb=64824ee0d49f15f057dc86e3b4e97e9a062a86a0;hp=419be6dc0c4454707777a89ea88f32d5b11c8fd4;hpb=f31be8951447aeee3d5e1a745337f0fed9053f5f;p=simple-launcher diff --git a/sla-list.cc b/sla-list.cc index 419be6d..dff4767 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,6 +27,12 @@ #include "sla-list.h" +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); @@ -36,7 +42,7 @@ static GtkWidget *gtk_button_new_stock_image_only(const gchar *stock_id) { return button; } -SLAList::SLAList(int icon_size, LauncherItems& items): myWidget(NULL), myStore(NULL), myView(NULL), mySelection(NULL), myItems(items) { +SLAList::SLAList(int icon_size, LauncherItems& items): myWidget(NULL), myStore(NULL), myView(NULL), mySelection(NULL), myLastSelection(NULL), myItems(items) { GtkTreeViewColumn *column; GtkCellRenderer *renderer; @@ -49,6 +55,8 @@ SLAList::SLAList(int icon_size, LauncherItems& items): myWidget(NULL), myStore(N 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, NULL); gtk_cell_renderer_set_fixed_size(renderer, icon_size+4, -1); @@ -59,10 +67,10 @@ SLAList::SLAList(int icon_size, LauncherItems& items): myWidget(NULL), myStore(N renderer = gtk_cell_renderer_text_new(); g_object_set(renderer, "yalign", 0.0, NULL); 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, _renderText, this, NULL); 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); @@ -97,11 +105,12 @@ SLAList::SLAList(int icon_size, LauncherItems& items): myWidget(NULL), myStore(N gtk_widget_show_all(myWidget); - for (LauncherItems::const_iterator item = myItems.begin(); item != myItems.end(); ++item) { + 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); - gtk_list_store_set(myStore, &iter, 0, item->second->getIcon(icon_size), 1, item-myItems.begin(), -1); + gtk_list_store_set(myStore, &iter, 0, item->getIcon(icon_size), 1, it-myItems.myNames.begin(), -1); } } @@ -109,6 +118,35 @@ SLAList::~SLAList() { // FIXME: do something! :) } +void SLAList::_selectionChanged(GtkTreeSelection *selection, void *self) { + ((SLAList *)self)->selectionChanged(selection); +} + +void SLAList::selectionChanged(GtkTreeSelection *) { + if (myLastSelection != NULL) { + kickIt(myLastSelection); + gtk_tree_iter_free(myLastSelection); + myLastSelection = NULL; + } + + GtkTreeIter iter; + GtkTreeModel *dummy; + + if (gtk_tree_selection_get_selected(mySelection, &dummy, &iter)) { + kickIt(&iter); + myLastSelection = gtk_tree_iter_copy(&iter); + } +} + +void SLAList::kickIt(GtkTreeIter *iter) { + GtkTreePath *path = gtk_tree_model_get_path(GTK_TREE_MODEL(myStore), iter); + + if (path != NULL) { + g_signal_emit_by_name(myStore, "row-changed", path, iter); + gtk_tree_path_free(path); + } +} + void SLAList::_renderText(GtkTreeViewColumn *column, GtkCellRenderer *cell, GtkTreeModel *model, GtkTreeIter *iter, gpointer self) { ((SLAList *)self)->renderText(column, cell, model, iter); } @@ -132,26 +170,25 @@ void SLAList::_moveDown(GtkButton *button, void *self) { void SLAList::renderText(GtkTreeViewColumn *, GtkCellRenderer *cell, GtkTreeModel *model, GtkTreeIter *iter) { int index; - gtk_tree_model_get(GTK_TREE_MODEL(myStore), iter, 1, &index, -1); -#if 1 + gtk_tree_model_get(GTK_TREE_MODEL(myStore), iter, SLA_STORE_COLUMN_INDEX, &index, -1); + + LauncherItem *item = myItems[index]; + if (gtk_tree_selection_iter_is_selected(mySelection, iter)) { - gchar *text = g_markup_printf_escaped("%s\n%s", myItems[index].second->getName().c_str(), myItems[index].second->getComment().c_str()); + 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 { -#endif - g_object_set(cell, "text", myItems[index].second->getName().c_str(), NULL); -#if 1 + g_object_set(cell, "text", item->getName().c_str(), NULL); } -#endif } void SLAList::renderBool(GtkTreeViewColumn *, GtkCellRenderer *cell, GtkTreeModel *model, GtkTreeIter *iter) { int index; - gtk_tree_model_get(GTK_TREE_MODEL(myStore), iter, 1, &index, -1); + gtk_tree_model_get(GTK_TREE_MODEL(myStore), iter, SLA_STORE_COLUMN_INDEX, &index, -1); - g_object_set(cell, "active", myItems[index].second->isEnabled(), NULL); + g_object_set(cell, "active", myItems[index]->isEnabled(), NULL); } void SLAList::toggleBool(GtkCellRendererToggle *renderer, const gchar *spath) { @@ -160,8 +197,8 @@ void SLAList::toggleBool(GtkCellRendererToggle *renderer, const gchar *spath) { 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, 1, &index, -1); - myItems[index].second->toggle(); + gtk_tree_model_get(GTK_TREE_MODEL(myStore), &iter, SLA_STORE_COLUMN_INDEX, &index, -1); + myItems[index]->toggle(); } } @@ -207,13 +244,13 @@ void SLAList::moveDown(GtkButton *) { void SLAList::swap(GtkTreeIter& a, GtkTreeIter& b) { int i1, i2; - gtk_tree_model_get(GTK_TREE_MODEL(myStore), &a, 1, &i1, -1); - gtk_tree_model_get(GTK_TREE_MODEL(myStore), &b, 1, &i2, -1); + 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); - std::swap(myItems[i1], myItems[i2]); + myItems.swap(i1, i2); - gtk_list_store_set(myStore, &a, 1, i2, -1); - gtk_list_store_set(myStore, &b, 1, i1, -1); + 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); }