[ekiga] Added a new piece of code for magical toolbars (bug #570632)



commit ddeca7ef03b1c70a10533823c5f96949b7ec78e1
Author: Julien Puydt <jpuydt gnome org>
Date:   Sun May 24 20:20:53 2009 +0200

    Added a new piece of code for magical toolbars (bug #570632)
    
    Well, it isn't that magical, but it should be a welcome addition ;
    hopefully I describe the use enough to make that point clear :-)
---
 lib/engine/gui/gtk-core/Makefile.am              |    2 +
 lib/engine/gui/gtk-core/optional-buttons-gtk.cpp |  125 ++++++++++++++++++++++
 lib/engine/gui/gtk-core/optional-buttons-gtk.h   |  123 +++++++++++++++++++++
 3 files changed, 250 insertions(+), 0 deletions(-)

diff --git a/lib/engine/gui/gtk-core/Makefile.am b/lib/engine/gui/gtk-core/Makefile.am
index 0adfcbe..e9eb769 100644
--- a/lib/engine/gui/gtk-core/Makefile.am
+++ b/lib/engine/gui/gtk-core/Makefile.am
@@ -19,6 +19,8 @@ libgmgtk_core_la_SOURCES = \
 	$(gtk_core_dir)/menu-builder-gtk.cpp \
 	$(gtk_core_dir)/form-dialog-gtk.h \
 	$(gtk_core_dir)/form-dialog-gtk.cpp \
+	$(gtk_core_dir)/optional-buttons-gtk.h \
+	$(gtk_core_dir)/optional-buttons-gtk.cpp \
 	$(gtk_core_dir)/gtk-core.h \
 	$(gtk_core_dir)/gtk-core.cpp \
 	$(gtk_core_dir)/gtk-core-main.h \
diff --git a/lib/engine/gui/gtk-core/optional-buttons-gtk.cpp b/lib/engine/gui/gtk-core/optional-buttons-gtk.cpp
new file mode 100644
index 0000000..21b152d
--- /dev/null
+++ b/lib/engine/gui/gtk-core/optional-buttons-gtk.cpp
@@ -0,0 +1,125 @@
+
+/* Ekiga -- A VoIP and Video-Conferencing application
+ * Copyright (C) 2000-2009 Damien Sandras <dsandras seconix com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ *
+ * Ekiga is licensed under the GPL license and as a special exception,
+ * you have permission to link or otherwise combine this program with the
+ * programs OPAL, OpenH323 and PWLIB, and distribute the combination,
+ * without applying the requirements of the GNU GPL to the OPAL, OpenH323
+ * and PWLIB programs, as long as you do follow the requirements of the
+ * GNU GPL for all the rest of the software thus combined.
+ */
+
+
+/*
+ *                         optional-buttons-gtk.cpp  -  description
+ *                         ------------------------------------------
+ *   begin                : written in 2009 by Julien Puydt
+ *   copyright            : (c) 2009 by Julien Puydt
+ *   description          : implementation of a gtk+ optional buttons group
+ *
+ */
+
+#include "optional-buttons-gtk.h"
+
+/* here is some pretty simple stuff to keep data around correctly in a GObject,
+ * (and react correctly to clicks on the buttons)
+ */
+
+struct OptionalButtonsGtkHelper
+{
+  sigc::slot0<void> callback;
+};
+
+static void
+optional_buttons_gtk_helper_destroy (struct OptionalButtonsGtkHelper* helper)
+{
+  delete helper;
+}
+
+static void
+on_optional_buttons_gtk_clicked (gpointer object,
+				 G_GNUC_UNUSED gpointer data)
+{
+  struct OptionalButtonsGtkHelper* helper = 
+    (struct OptionalButtonsGtkHelper*)g_object_get_data (G_OBJECT (object),
+							 "ekiga-optional-buttons-gtk-helper");
+  helper->callback ();
+}
+
+// here comes the implementation of the public interface :
+
+OptionalButtonsGtk::~OptionalButtonsGtk ()
+{
+  for (buttons_type::iterator iter = buttons.begin ();
+       iter != buttons.end ();
+       ++iter) {
+
+    g_object_unref (iter->second);
+  }
+}
+
+void
+OptionalButtonsGtk::add_button (const std::string label,
+				GtkButton* button)
+{
+  g_return_if_fail (GTK_IS_BUTTON (button));
+  g_return_if_fail (buttons[label] == 0);
+
+  g_object_ref (button);
+  gtk_widget_set_sensitive (GTK_WIDGET (button), FALSE);
+  buttons[label] = button;
+  struct OptionalButtonsGtkHelper* helper = new struct OptionalButtonsGtkHelper;
+  g_object_set_data_full (G_OBJECT (button), "ekiga-optional-buttons-gtk-helper",
+			  (gpointer)helper,(GDestroyNotify)optional_buttons_gtk_helper_destroy);
+  g_signal_connect (G_OBJECT (button), "clicked",
+		    G_CALLBACK (on_optional_buttons_gtk_clicked), NULL);
+}
+
+void
+OptionalButtonsGtk::reset ()
+{
+  for (buttons_type::iterator iter = buttons.begin ();
+       iter != buttons.end ();
+       ++iter) {
+
+    gtk_widget_set_sensitive (GTK_WIDGET (iter->second), FALSE);
+    struct OptionalButtonsGtkHelper* helper =
+      (struct OptionalButtonsGtkHelper*)g_object_get_data (G_OBJECT (iter->second),
+							   "ekiga-optional-buttons-gtk-helper");
+    helper->callback = sigc::slot0<void> ();
+  }
+}
+
+void
+OptionalButtonsGtk::add_action (G_GNUC_UNUSED const std::string icon,
+				const std::string label,
+				const sigc::slot0<void> callback)
+{
+  GtkButton* button = buttons[label];
+
+  if (button) {
+
+    struct OptionalButtonsGtkHelper* helper = 
+      (struct OptionalButtonsGtkHelper*)g_object_get_data (G_OBJECT (button),
+							   "ekiga-optional-buttons-gtk-helper");
+    helper->callback = callback;
+    gtk_widget_set_sensitive (GTK_WIDGET (button), TRUE);
+    nbr_elements++;
+  }
+}
diff --git a/lib/engine/gui/gtk-core/optional-buttons-gtk.h b/lib/engine/gui/gtk-core/optional-buttons-gtk.h
new file mode 100644
index 0000000..d815dfe
--- /dev/null
+++ b/lib/engine/gui/gtk-core/optional-buttons-gtk.h
@@ -0,0 +1,123 @@
+
+/* Ekiga -- A VoIP and Video-Conferencing application
+ * Copyright (C) 2000-2009 Damien Sandras <dsandras seconix com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ *
+ * Ekiga is licensed under the GPL license and as a special exception,
+ * you have permission to link or otherwise combine this program with the
+ * programs OPAL, OpenH323 and PWLIB, and distribute the combination,
+ * without applying the requirements of the GNU GPL to the OPAL, OpenH323
+ * and PWLIB programs, as long as you do follow the requirements of the
+ * GNU GPL for all the rest of the software thus combined.
+ */
+
+
+/*
+ *                         optional-buttons-gtk.h  -  description
+ *                         ------------------------------------------
+ *   begin                : written in 2009 by Julien Puydt
+ *   copyright            : (c) 2009 by Julien Puydt
+ *   description          : declaration of a gtk+ optional buttons group
+ *
+ */
+
+#ifndef __OPTIONAL_BUTTONS_GTK_H__
+#define __OPTIONAL_BUTTONS_GTK_H__
+
+#include <map>
+
+#include <gtk/gtk.h>
+
+#include "menu-builder.h"
+
+
+/* Here is the main idea behind the following code : you build a set of buttons
+ * for various actions, but you're not 100% sure the objets on which you'll act
+ * will all have those actions available.
+ *
+ * The solution is to set the buttons up, and put them in an OptionalButtonsGtk,
+ * which will take care of things.
+ *
+ * Basically, you build button1,...,buttonN and put them as you want in the
+ * user interface, but don't hook any callback to them. You also have an object
+ * of class OptionalButtonsGtk, call it "builder". You decide to manage the
+ * buttons with it :
+ * builder.add_button ("foo1", button1);
+ * ...
+ * builder.add_button ("fooN", buttonN);
+ *
+ * then you disable all actions (and clear the callbacks, which may free some
+ * memory) :
+ * builder.reset ();
+ *
+ * Finally, there's an object, call it obj, on which you want your buttons to
+ * act ; you just do :
+ * obj.populate_menu (builder);
+ * and the builder will setup the buttons correctly : it will enable button1
+ * only if obj has a "foo1" action, and it will hook the right callback to a
+ * click on a button.
+ *
+ * If/when obj gets updated, then you just do the following again :
+ * builder.reset ();
+ * obj.populate_menu (builder);
+ *
+ * Likewise, if you know want to act on obj2, then :
+ * builder.reset ();
+ * obj2.populate_menu (builder);
+ *
+ */
+
+class OptionalButtonsGtk: public Ekiga::MenuBuilder
+{
+public:
+
+  OptionalButtonsGtk ()
+  {}
+
+  ~OptionalButtonsGtk ();
+
+  /* here is the specific api */
+
+  void add_button (const std::string label,
+		   GtkButton* button);
+
+  void reset ();
+
+  /* this is the Ekiga::MenuBuilder implementation */
+
+  void add_action (const std::string icon,
+		   const std::string label,
+		   const sigc::slot0<void> callback);
+
+  void add_separator ()
+  {}
+
+  void add_ghost (G_GNUC_UNUSED const std::string icon,
+		  G_GNUC_UNUSED const std::string label)
+  {}
+
+  int size () const
+  { return nbr_elements; }
+
+private:
+
+  typedef std::map<std::string, GtkButton*> buttons_type;
+  buttons_type buttons;
+  int nbr_elements;
+};
+
+#endif



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]