X-Git-Url: https://vcs.maemo.org/git/?a=blobdiff_plain;f=sla-list.cc;h=dff4767e96f975f93f26a3148dc44cf7bf49c59a;hb=refs%2Fheads%2Fsvn%2Ftags%2F0.9.3;hp=f8da1ac732477c0011de0f445b653deabf4fa132;hpb=2d8840fd0174841b11a741b8c50d26e713865cd6;p=simple-launcher diff --git a/sla-list.cc b/sla-list.cc index f8da1ac..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,7 +27,22 @@ #include "sla-list.h" -SLAList::SLAList(int icon_size, LaunchableItems& items): myWidget(0), myStore(0), myView(0), mySelection(0), myItems(items) { +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; @@ -35,43 +50,48 @@ SLAList::SLAList(int icon_size, LaunchableItems& items): myWidget(0), myStore(0) 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); + g_object_set(renderer, "yalign", 0.0, NULL); column = gtk_tree_view_column_new(); - gtk_tree_view_column_set_cell_data_func(column, renderer, _renderText, this, 0); 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_new(); - gtk_tree_view_column_set_cell_data_func(column, renderer, _renderBool, this, 0); + 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); @@ -85,11 +105,12 @@ SLAList::SLAList(int icon_size, LaunchableItems& items): myWidget(0), myStore(0) gtk_widget_show_all(myWidget); - for (LaunchableItems::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); } } @@ -97,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); } @@ -120,37 +170,35 @@ 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); + 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()); - g_object_set(cell, "markup", text, 0); + 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", myItems[index].second->getName().c_str(), 0); + 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, 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(), 0); + g_object_set(cell, "active", myItems[index]->isEnabled(), NULL); } void SLAList::toggleBool(GtkCellRendererToggle *renderer, const gchar *spath) { - GtkTreePath *path = gtk_tree_path_new_from_string(spath); + GtkTreeIter iter; - if (path != 0) { - GtkTreeIter iter; - - if (gtk_tree_model_get_iter(GTK_TREE_MODEL(myStore), &iter, path)) { - int index; + 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(); } } @@ -193,16 +241,16 @@ void SLAList::moveDown(GtkButton *) { } } -void SLAList::swap(GtkTreeIter *a, GtkTreeIter *b) { +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); }