implement launcher-items as an ordered dictionary of some sort
authormishas <mikhail.sobolev@gmail.com>
Tue, 13 Mar 2007 08:13:52 +0000 (08:13 +0000)
committermishas <mikhail.sobolev@gmail.com>
Tue, 13 Mar 2007 08:13:52 +0000 (08:13 +0000)
git-svn-id: file:///svnroot/simple-launcher/trunk@74 3ba93dab-e023-0410-b42a-de7732cf370a

launcher-item.h
simple-launcher.cc
sla-list.cc

index 39cc896..5a60611 100644 (file)
@@ -19,6 +19,7 @@
 #define __LAUNCHER_ITEM_H__
 
 #include <vector>
+#include <map>
 #include <string>
 
 #include <gdk-pixbuf/gdk-pixbuf.h>
@@ -60,7 +61,44 @@ private:
   static GtkIconTheme *ourTheme;
 };
 
-typedef std::vector<std::pair<std::string, LauncherItem *> > LauncherItems;
+typedef struct {
+  typedef std::vector<std::string> Names;
+  typedef std::map<std::string, LauncherItem *> Items;
+
+  Names myNames;
+  Items myItems;
+
+  size_t size() { return myNames.size(); }
+
+  LauncherItem *operator[](int index) {
+    return myItems[myNames[index]];
+  }
+
+  std::string& name(int index) {
+    return myNames[index];
+  }
+
+  void add(std::string& name, LauncherItem *item) {
+    myNames.push_back(name);
+    myItems[name] = item;
+  }
+
+  void swap(size_t i1, size_t i2) {
+    std::swap(myNames[i1], myNames[i2]);
+  }
+
+  void clear() {
+    for (Items::iterator it = myItems.begin(); it != myItems.end(); ++it) {
+      if (it->second != NULL) {
+        delete it->second;
+        it->second = NULL;
+      }
+    }
+
+    myNames.resize(0);
+    myItems.clear();
+  }
+} LauncherItems;
 
 #endif
 
index a3fd111..134664f 100644 (file)
@@ -138,14 +138,7 @@ bool SimpleLauncherApplet::doInit(void *state_data, int *state_size) {
 }
 
 SimpleLauncherApplet::~SimpleLauncherApplet() {
-  for (LauncherItems::iterator it = myItems.begin(); it != myItems.end(); ++it) {
-    if (it->second != NULL) {
-      delete it->second;
-      it->second = NULL;
-    }
-  }
-
-  myItems.resize(0);
+  myItems.clear();
 
   if (myWidget != NULL) {
     gtk_widget_destroy(myWidget);
@@ -179,8 +172,8 @@ void SimpleLauncherApplet::saveConfig() {
   std::ofstream config(configFileName);
 
   if (config) {
-    for (LauncherItems::const_iterator it = myItems.begin(); it != myItems.end(); ++it) {
-      config << it->first << ',' << it->second->isEnabled() << std::endl;
+    for (size_t i = 0 ; i < myItems.size() ; ++i) {
+      config << myItems.name(i) << ',' << myItems[i]->isEnabled() << std::endl;
     }
   }
 }
@@ -190,7 +183,6 @@ bool SimpleLauncherApplet::initWidget() {
 
   if (myWidget != NULL) {
     gtk_frame_set_shadow_type(GTK_FRAME(myWidget), GTK_SHADOW_ETCHED_IN);
-    gtk_widget_set_size_request(myWidget, button_no*(SL_APPLET_ICON_SIZE+SL_APPLET_CANVAS_SIZE), SL_APPLET_ICON_SIZE+SL_APPLET_CANVAS_SIZE);
 
     updateWidget();
   }
@@ -209,19 +201,24 @@ void SimpleLauncherApplet::updateWidget() {
   int button_no = 0;
   GtkToolbar *toolbar = GTK_TOOLBAR(gtk_toolbar_new());
 
-  for (LauncherItems::const_iterator it = myItems.begin(); it != myItems.end(); ++it) {
-    GtkToolItem *button = gtk_tool_button_new(gtk_image_new_from_pixbuf(it->second->getIcon(SL_APPLET_ICON_SIZE)), NULL);
+  for (size_t i = 0 ; i < myItems.size() ; ++i) {
+    LauncherItem *item = myItems[i];
 
-    gtk_object_set_user_data(GTK_OBJECT(button), it->second);
-    g_signal_connect(button, "clicked", G_CALLBACK(_button_clicked), this);
+    if (item != NULL && item->isEnabled()) {
+      GtkToolItem *button = gtk_tool_button_new(gtk_image_new_from_pixbuf(item->getIcon(SL_APPLET_ICON_SIZE)), NULL);
 
-    gtk_toolbar_insert(toolbar, button, -1);
+      gtk_object_set_user_data(GTK_OBJECT(button), item);
+      g_signal_connect(button, "clicked", G_CALLBACK(_button_clicked), this);
 
-    ++button_no;
+      gtk_toolbar_insert(toolbar, button, -1);
+
+      ++button_no;
+    }
   }
 
   if (button_no) {
     gtk_container_add(GTK_CONTAINER(myWidget), GTK_WIDGET(toolbar));
+    gtk_widget_set_size_request(myWidget, button_no*(SL_APPLET_ICON_SIZE+SL_APPLET_CANVAS_SIZE), SL_APPLET_ICON_SIZE+SL_APPLET_CANVAS_SIZE);
   } else {
     gtk_widget_destroy(GTK_WIDGET(toolbar));
   }
index 419be6d..21ab177 100644 (file)
@@ -97,11 +97,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);
   }
 }
 
@@ -133,14 +134,16 @@ void SLAList::renderText(GtkTreeViewColumn *, GtkCellRenderer *cell, GtkTreeMode
   int index;
 
   gtk_tree_model_get(GTK_TREE_MODEL(myStore), iter, 1, &index, -1);
+
+  LauncherItem *item = myItems[index];
 #if 1
   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());
+    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 {
 #endif
-    g_object_set(cell, "text", myItems[index].second->getName().c_str(), NULL);
+    g_object_set(cell, "text", item->getName().c_str(), NULL);
 #if 1
   }
 #endif
@@ -151,7 +154,7 @@ void SLAList::renderBool(GtkTreeViewColumn *, GtkCellRenderer *cell, GtkTreeMode
 
   gtk_tree_model_get(GTK_TREE_MODEL(myStore), iter, 1, &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) {
@@ -161,7 +164,7 @@ void SLAList::toggleBool(GtkCellRendererToggle *renderer, const gchar *spath) {
     int index;
 
     gtk_tree_model_get(GTK_TREE_MODEL(myStore), &iter, 1, &index, -1);
-    myItems[index].second->toggle();
+    myItems[index]->toggle();
   }
 }
 
@@ -210,7 +213,7 @@ void SLAList::swap(GtkTreeIter& a, GtkTreeIter& b) {
   gtk_tree_model_get(GTK_TREE_MODEL(myStore), &a, 1, &i1, -1);
   gtk_tree_model_get(GTK_TREE_MODEL(myStore), &b, 1, &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);