added [empty] dialog-entry.cc; stubbed dialog-entry.h
[simple-launcher] / sla-list.cc
index 70dea06..7104b8e 100644 (file)
@@ -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
 
 #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,16 @@ 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);
+    {
+      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));
+    }
   }
 }
 
@@ -97,6 +122,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 +174,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<small>%s</small>", 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<small>%s</small>", 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);
-
-  if (path != 0) {
-    GtkTreeIter iter;
+  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();
   }
 }
 
@@ -166,17 +218,7 @@ void SLAList::moveUp(GtkButton *) {
       GtkTreeIter next;
 
       if (gtk_tree_model_get_iter(GTK_TREE_MODEL(myStore), &next, path)) {
-        int i1, i2;
-
-        gtk_tree_model_get(GTK_TREE_MODEL(myStore), &current, 1, &i1, -1);
-        gtk_tree_model_get(GTK_TREE_MODEL(myStore), &next, 1, &i2, -1);
-
-        std::swap(myItems[i1], myItems[i2]);
-
-        gtk_list_store_set(myStore, &current, 1, i2, -1);
-        gtk_list_store_set(myStore, &next, 1, i1, -1);
-
-        gtk_list_store_swap(myStore, &current, &next);
+        swap(current, next);
       }
     }
 
@@ -196,21 +238,25 @@ void SLAList::moveDown(GtkButton *) {
     gtk_tree_path_next(path);
 
     if (gtk_tree_model_get_iter(GTK_TREE_MODEL(myStore), &next, path)) {
-      int i1, i2;
+      swap(current, next);
+    }
 
-      gtk_tree_model_get(GTK_TREE_MODEL(myStore), &current, 1, &i1, -1);
-      gtk_tree_model_get(GTK_TREE_MODEL(myStore), &next, 1, &i2, -1);
+    gtk_tree_path_free(path);
+  }
+}
 
-      std::swap(myItems[i1], myItems[i2]);
+void SLAList::swap(GtkTreeIter& a, GtkTreeIter& b) {
+  int i1, i2;
 
-      gtk_list_store_set(myStore, &current, 1, i2, -1);
-      gtk_list_store_set(myStore, &next, 1, i1, -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);
 
-      gtk_list_store_swap(myStore, &current, &next);
-    }
+  myItems.swap(i1, i2);
 
-    gtk_tree_path_free(path);
-  }
+  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