Code

NEW: radiobuttons for extensions. See radiobutton_example.inx how to use them (they...
authorjohanengelen <johanengelen@users.sourceforge.net>
Fri, 24 Nov 2006 21:17:33 +0000 (21:17 +0000)
committerjohanengelen <johanengelen@users.sourceforge.net>
Fri, 24 Nov 2006 21:17:33 +0000 (21:17 +0000)
share/extensions/radiobutton_example.inx [new file with mode: 0644]
src/extension/Makefile_insert
src/extension/paramenum.cpp
src/extension/parameter.cpp
src/extension/paramradiobutton.cpp [new file with mode: 0644]
src/extension/paramradiobutton.h [new file with mode: 0644]

diff --git a/share/extensions/radiobutton_example.inx b/share/extensions/radiobutton_example.inx
new file mode 100644 (file)
index 0000000..9331f6d
--- /dev/null
@@ -0,0 +1,23 @@
+<inkscape-extension>
+    <_name>RadioButton example</_name>
+    <id>org.inkscape.effect.radiobuttontest</id>
+    <param name="radio1" type="optiongroup" _gui-text="Select option: ">
+        <item>string 1</item>
+        <item>string 2</item>
+        <item>test 3!</item>
+    </param>
+    <param name="radio2" type="optiongroup" _gui-text="Select second option: ">
+        <item>string1</item>
+        <item>string2</item>
+        <item>test3!</item>
+    </param>
+    <effect>
+               <object-type>all</object-type>
+                <effects-menu>
+                      <submenu _name="Developer Examples"/>
+               </effects-menu>
+    </effect>
+    <script>
+        <command reldir="extensions" interpreter="python">eqtexsvg.py</command>
+    </script>
+</inkscape-extension>
index 9540d863db9f2af3b43a11f89541500536a7f6d8..1eaa7ce5d8826001f47924b7aed02e4e4e7dcb79 100644 (file)
@@ -23,6 +23,8 @@ extension_libextension_a_SOURCES =    \
        extension/paramnotebook.cpp \
        extension/paramenum.h \
        extension/paramenum.cpp \
+       extension/paramradiobutton.h \
+       extension/paramradiobutton.cpp \
        extension/prefdialog.cpp \
        extension/prefdialog.h \
        extension/system.cpp    \
index 85656343d8e30299d3243c80b4832369cc4d16f1..849447427c5188bed439871dc32f5a807ee0baa0 100644 (file)
@@ -126,8 +126,8 @@ ParamComboBox::set (const gchar * in, SPDocument * doc, Inkscape::XML::Node * no
 \r
 \r
 /**\r
-    \brief  A function to get the currentpage and the parameters in a string form\r
-    \return A string with the 'value' and all the parameters on all pages as command line arguments\r
+    \brief  A function to get the value of the parameter in string form\r
+    \return A string with the 'value' as command line argument\r
 */\r
 Glib::ustring *\r
 ParamComboBox::string (void)\r
@@ -206,13 +206,3 @@ ParamComboBox::get_widget (SPDocument * doc, Inkscape::XML::Node * node)
 }  /* namespace Extension */\r
 }  /* namespace Inkscape */\r
 \r
-/*\r
-  Local Variables:\r
-  mode:c++\r
-  c-file-style:"stroustrup"\r
-  c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))\r
-  indent-tabs-mode:nil\r
-  fill-column:99\r
-  End:\r
-*/\r
-// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :\r
index 70f66c41660c37995e4dc63f1b332797f5358ab0..7dba1b507552ca12a3eeca0e877994c2c6b31b88 100644 (file)
@@ -33,6 +33,7 @@
 #include "parameter.h"
 #include "paramnotebook.h"
 #include "paramenum.h"
+#include "paramradiobutton.h"
 
 /** \brief  The root directory in the preferences database for extension
             related parameters. */
@@ -316,6 +317,8 @@ Parameter::make (Inkscape::XML::Node * in_repr, Inkscape::Extension::Extension *
         param = new ParamComboBox(name, guitext, desc, scope, in_ext, in_repr);
     } else if (!strcmp(type, "notebook")) {
         param = new ParamNotebook(name, guitext, desc, scope, in_ext, in_repr);
+    } else if (!strcmp(type, "optiongroup")) {
+        param = new ParamRadioButton(name, guitext, desc, scope, in_ext, in_repr);
     }
 
     /* Note: param could equal NULL */
diff --git a/src/extension/paramradiobutton.cpp b/src/extension/paramradiobutton.cpp
new file mode 100644 (file)
index 0000000..80ec505
--- /dev/null
@@ -0,0 +1,232 @@
+/** \file\r
+ * extension parameter for radiobuttons. \r
+ *\r
+ * It uses a Gtk:ComboBoxText widget in the extension UI.\r
+ */\r
+\r
+/*\r
+ * Author:\r
+ *   Johan Engelen <johan@shouraizou.nl>\r
+ *\r
+ * Copyright (C) 2006 Author\r
+ *\r
+ * Released under GNU GPL, read the file 'COPYING' for more information\r
+ */\r
+\r
+#ifdef HAVE_CONFIG_H\r
+# include "config.h"\r
+#endif\r
+\r
+\r
+#include <gtkmm/box.h>\r
+#include <gtkmm/radiobutton.h>\r
+#include <gtkmm/radiobuttongroup.h>\r
+#include <gtkmm/tooltips.h>\r
+#include <gtkmm/label.h>\r
+\r
+#include <glibmm/i18n.h>\r
+\r
+#include <xml/node.h>\r
+\r
+#include "extension.h"\r
+#include "prefs-utils.h"\r
+#include "document-private.h"\r
+#include "sp-object.h"\r
+\r
+#include "paramradiobutton.h"\r
+\r
+/** \brief  The root directory in the preferences database for extension\r
+            related parameters. */\r
+#define PREF_DIR "extensions"\r
+\r
+namespace Inkscape {\r
+namespace Extension {\r
+\r
+ParamRadioButton::ParamRadioButton (const gchar * name, const gchar * guitext, const gchar * desc, const Parameter::_scope_t scope, Inkscape::Extension::Extension * ext, Inkscape::XML::Node * xml) :\r
+    Parameter(name, guitext, desc, scope, ext)\r
+{              \r
+    choices = NULL;\r
+    _value = NULL;\r
+    \r
+    // Read XML tree to add enumeration items:\r
+    // printf("Extension Constructor: ");\r
+    if (xml != NULL) {\r
+        Inkscape::XML::Node *child_repr = sp_repr_children(xml);\r
+        while (child_repr != NULL) {\r
+            char const * chname = child_repr->name();\r
+            if (!strcmp(chname, "item")) {\r
+                Glib::ustring * newitem = NULL;\r
+                const char * contents = sp_repr_children(child_repr)->content();\r
+                if (contents != NULL)\r
+                     newitem = new Glib::ustring(contents);\r
+                if (newitem != NULL) choices = g_slist_append(choices, newitem);\r
+            }\r
+            child_repr = sp_repr_next(child_repr);\r
+        }\r
+    }\r
+    \r
+    // Initialize _value with the default value from xml\r
+    // for simplicity : default to the contents of the first xml-child\r
+    const char * defaultval = NULL;\r
+    if (sp_repr_children(sp_repr_children(xml)) != NULL)\r
+        defaultval = sp_repr_children(sp_repr_children(xml))->content();\r
+    \r
+    gchar * pref_name = this->pref_name();\r
+    const gchar * paramval = prefs_get_string_attribute(PREF_DIR, pref_name);\r
+    g_free(pref_name);\r
+\r
+    if (paramval != NULL)\r
+        defaultval = paramval;\r
+    if (defaultval != NULL)\r
+        _value = g_strdup(defaultval);  // allocate space for _value\r
+        \r
+    return;\r
+}\r
+\r
+ParamRadioButton::~ParamRadioButton (void)\r
+{                  \r
+    //destroy choice strings\r
+    for (GSList * list = choices; list != NULL; list = g_slist_next(list)) {\r
+        Glib::ustring * text = reinterpret_cast<Glib::ustring *>(list->data);\r
+        delete text;\r
+    }\r
+    g_slist_free(choices);\r
+\r
+    g_free(_value);\r
+}\r
+\r
+\r
+/** \brief  A function to set the \c _value\r
+    \param  in   The value to set\r
+    \param  doc  A document that should be used to set the value.\r
+    \param  node The node where the value may be placed\r
+\r
+    This function sets ONLY the internal value, but it also sets the value\r
+    in the preferences structure.  To put it in the right place, \c PREF_DIR\r
+    and \c pref_name() are used.\r
+\r
+    To copy the data into _value the old memory must be free'd first.\r
+    It is important to note that \c g_free handles \c NULL just fine.  Then\r
+    the passed in value is duplicated using \c g_strdup().\r
+*/\r
+const gchar *\r
+ParamRadioButton::set (const gchar * in, SPDocument * doc, Inkscape::XML::Node * node)\r
+{\r
+    if (in == NULL) return NULL; /* Can't have NULL string */\r
+\r
+    if (_value != NULL)\r
+        g_free(_value);\r
+    _value = g_strdup(in);\r
+\r
+    gchar * prefname = this->pref_name();\r
+    prefs_set_string_attribute(PREF_DIR, prefname, _value);\r
+    g_free(prefname);\r
+\r
+    return _value;\r
+}\r
+\r
+\r
+/**\r
+    \brief  A function to get the current value of the parameter in a string form\r
+    \return A string with the 'value' as command line argument\r
+*/\r
+Glib::ustring *\r
+ParamRadioButton::string (void)\r
+{\r
+    Glib::ustring * param_string = new Glib::ustring("");\r
+\r
+    *param_string += "\"";\r
+    *param_string += _value;\r
+    *param_string += "\"";\r
+\r
+    return param_string;\r
+}\r
+\r
+/** \brief  A special radiobutton class to use in ParamRadioButton */\r
+class ParamRadioButtonWdg : public Gtk::RadioButton {\r
+private:\r
+    ParamRadioButton * _pref;\r
+    SPDocument * _doc;\r
+    Inkscape::XML::Node * _node;\r
+public:\r
+    /** \brief  Build a string preference for the given parameter\r
+        \param  pref  Where to put the radiobutton's string when it is selected.\r
+    */\r
+    ParamRadioButtonWdg ( Gtk::RadioButtonGroup& group, const Glib::ustring& label, \r
+                          ParamRadioButton * pref, SPDocument * doc, Inkscape::XML::Node * node ) :\r
+        Gtk::RadioButton(group, label), _pref(pref), _doc(doc), _node(node) {\r
+        add_changesignal();\r
+    };\r
+    ParamRadioButtonWdg ( const Glib::ustring& label, \r
+                          ParamRadioButton * pref, SPDocument * doc, Inkscape::XML::Node * node ) :\r
+        Gtk::RadioButton(label), _pref(pref), _doc(doc), _node(node) {\r
+        add_changesignal();\r
+    };\r
+    void add_changesignal() {\r
+        this->signal_toggled().connect(sigc::mem_fun(this, &ParamRadioButtonWdg::changed));\r
+    };\r
+    void changed (void);\r
+};\r
+\r
+/** \brief  Respond to the selected radiobutton changing\r
+\r
+    This function responds to the radiobutton selection changing by grabbing the value\r
+    from the text box and putting it in the parameter.\r
+*/\r
+void\r
+ParamRadioButtonWdg::changed (void)\r
+{\r
+    if (this->get_active()) {\r
+        Glib::ustring data = this->get_label();\r
+        g_message(data.c_str());\r
+        _pref->set(data.c_str(), _doc, _node);\r
+    }\r
+}\r
+\r
+\r
+\r
+/**\r
+    \brief  Creates a combobox widget for an enumeration parameter\r
+*/\r
+Gtk::Widget *\r
+ParamRadioButton::get_widget (SPDocument * doc, Inkscape::XML::Node * node)\r
+{\r
+    Gtk::HBox * hbox = Gtk::manage(new Gtk::HBox(false, 4));\r
+    Gtk::VBox * vbox = Gtk::manage(new Gtk::VBox(false, 0));\r
+\r
+    Gtk::Label * label = Gtk::manage(new Gtk::Label(_(_text), Gtk::ALIGN_LEFT, Gtk::ALIGN_TOP));\r
+    label->show();\r
+    hbox->pack_start(*label, false, false);\r
+\r
+    // add choice strings as radiobuttons\r
+    // and select last selected option (_value)\r
+    bool first = true;\r
+    ParamRadioButtonWdg * radio;\r
+    Gtk::RadioButtonGroup group;\r
+    for (GSList * list = choices; list != NULL; list = g_slist_next(list)) {\r
+        Glib::ustring * text = reinterpret_cast<Glib::ustring *>(list->data);\r
+        if (first) {\r
+            radio = Gtk::manage(new ParamRadioButtonWdg(*text, this, doc, node));\r
+            group = radio->get_group();\r
+            first = false;\r
+        } else {\r
+            radio = Gtk::manage(new ParamRadioButtonWdg(group, *text, this, doc, node));\r
+        } \r
+        radio->show();\r
+        vbox->pack_start(*radio, true, true);\r
+        if (!strcmp(text->c_str(), _value)) {\r
+            radio->set_active();\r
+        } \r
+    }\r
+    vbox->show();\r
+    hbox->pack_end(*vbox, false, false);\r
+    hbox->show();\r
+    \r
+\r
+    return dynamic_cast<Gtk::Widget *>(hbox);\r
+}\r
+\r
+\r
+}  /* namespace Extension */\r
+}  /* namespace Inkscape */\r
+\r
diff --git a/src/extension/paramradiobutton.h b/src/extension/paramradiobutton.h
new file mode 100644 (file)
index 0000000..bf0cd21
--- /dev/null
@@ -0,0 +1,57 @@
+#ifndef __INK_EXTENSION_PARAMRADIOBUTTON_H__\r
+#define __INK_EXTENSION_PARAMRADIOBUTTON_H__\r
+\r
+/** \file\r
+ * Radiobutton parameter for extensions.\r
+ */\r
+\r
+/*\r
+ * Author:\r
+ *   Johan Engelen <johan@shouraizou.nl>\r
+ *\r
+ * Copyright (C) 2006 Author\r
+ *\r
+ * Released under GNU GPL, read the file 'COPYING' for more information\r
+ */\r
+\r
+#include <gtkmm/widget.h>\r
+\r
+#include "xml/document.h"\r
+#include "extension-forward.h"\r
+\r
+#include "parameter.h"\r
+\r
+namespace Inkscape {\r
+namespace Extension {\r
+\r
+\r
+\r
+// \brief  A class to represent a radiobutton parameter of an extension\r
+class ParamRadioButton : public Parameter {\r
+private:\r
+    /** \brief  Internal value.  This should point to a string that has\r
+                been allocated in memory.  And should be free'd. \r
+                It is the value of the current selected string */\r
+    gchar * _value;\r
+    \r
+    GSList * choices; /**< A table to store the choice strings  */\r
+    \r
+public:\r
+    ParamRadioButton(const gchar * name, const gchar * guitext, const gchar * desc, const Parameter::_scope_t scope, Inkscape::Extension::Extension * ext, Inkscape::XML::Node * xml);\r
+    ~ParamRadioButton(void);\r
+    Gtk::Widget * get_widget(SPDocument * doc, Inkscape::XML::Node * node);\r
+    Glib::ustring * string (void);\r
+        \r
+    const gchar * get (const SPDocument * doc, const Inkscape::XML::Node * node) { return _value; }\r
+    const gchar * set (const gchar * in, SPDocument * doc, Inkscape::XML::Node * node);\r
+}; /* class ParamRadioButton */\r
+\r
+\r
+\r
+\r
+\r
+}  /* namespace Extension */\r
+}  /* namespace Inkscape */\r
+\r
+#endif /* __INK_EXTENSION_PARAMRADIOBUTTON_H__ */\r
+\r