2
* extension parameter for radiobuttons.
4
* It uses a Gtk:ComboBoxText widget in the extension UI.
9
* Johan Engelen <johan@shouraizou.nl>
11
* Copyright (C) 2006-2007 Johan Engelen
13
* Released under GNU GPL, read the file 'COPYING' for more information
21
#include <gtkmm/box.h>
22
#include <gtkmm/radiobutton.h>
23
#include <gtkmm/radiobuttongroup.h>
24
#include <gtkmm/tooltips.h>
25
#include <gtkmm/label.h>
27
#include <glibmm/i18n.h>
31
#include "extension.h"
32
#include "prefs-utils.h"
33
#include "document-private.h"
34
#include "sp-object.h"
36
#include "paramradiobutton.h"
38
/** \brief The root directory in the preferences database for extension
39
related parameters. */
40
#define PREF_DIR "extensions"
45
/* For internal use only.
46
Note that value and guitext MUST be non-NULL. This is ensured by newing only at one location in the code where non-NULL checks are made. */
49
optionentry (Glib::ustring * val, Glib::ustring * text) {
58
Glib::ustring * value;
59
Glib::ustring * guitext;
62
ParamRadioButton::ParamRadioButton (const gchar * name, const gchar * guitext, const gchar * desc, const Parameter::_scope_t scope, Inkscape::Extension::Extension * ext, Inkscape::XML::Node * xml) :
63
Parameter(name, guitext, desc, scope, ext)
68
// Read XML tree to add enumeration items:
69
// printf("Extension Constructor: ");
71
Inkscape::XML::Node *child_repr = sp_repr_children(xml);
72
while (child_repr != NULL) {
73
char const * chname = child_repr->name();
74
if (!strcmp(chname, "option") || !strcmp(chname, "_option")) {
75
Glib::ustring * newguitext = NULL;
76
Glib::ustring * newvalue = NULL;
77
const char * contents = sp_repr_children(child_repr)->content();
79
// don't translate when 'option' but do translate when '_option'
80
newguitext = new Glib::ustring( !strcmp(chname, "_option") ? _(contents) : contents );
84
const char * val = child_repr->attribute("value");
86
newvalue = new Glib::ustring(val);
88
newvalue = new Glib::ustring(contents);
90
if ( (newguitext) && (newvalue) ) { // logical error if this is not true here
91
choices = g_slist_append( choices, new optionentry(newvalue, newguitext) );
94
child_repr = sp_repr_next(child_repr);
98
// Initialize _value with the default value from xml
99
// for simplicity : default to the contents of the first xml-child
100
const char * defaultval = NULL;
102
defaultval = ((optionentry*) choices->data)->value->c_str();
104
gchar * pref_name = this->pref_name();
105
const gchar * paramval = prefs_get_string_attribute(PREF_DIR, pref_name);
108
if (paramval != NULL)
109
defaultval = paramval;
110
if (defaultval != NULL)
111
_value = g_strdup(defaultval); // allocate space for _value
116
ParamRadioButton::~ParamRadioButton (void)
118
//destroy choice strings
119
for (GSList * list = choices; list != NULL; list = g_slist_next(list)) {
120
delete (reinterpret_cast<optionentry *>(list->data));
122
g_slist_free(choices);
128
/** \brief A function to set the \c _value
129
\param in The value to set
130
\param doc A document that should be used to set the value.
131
\param node The node where the value may be placed
133
This function sets ONLY the internal value, but it also sets the value
134
in the preferences structure. To put it in the right place, \c PREF_DIR
135
and \c pref_name() are used.
137
To copy the data into _value the old memory must be free'd first.
138
It is important to note that \c g_free handles \c NULL just fine. Then
139
the passed in value is duplicated using \c g_strdup().
142
ParamRadioButton::set (const gchar * in, SPDocument * /*doc*/, Inkscape::XML::Node * /*node*/)
144
if (in == NULL) return NULL; /* Can't have NULL string */
146
Glib::ustring * settext = NULL;
147
for (GSList * list = choices; list != NULL; list = g_slist_next(list)) {
148
optionentry * entr = reinterpret_cast<optionentry *>(list->data);
149
if ( !entr->guitext->compare(in) ) {
150
settext = entr->value;
151
break; // break out of for loop
155
if (_value != NULL) g_free(_value);
156
_value = g_strdup(settext->c_str());
157
gchar * prefname = this->pref_name();
158
prefs_set_string_attribute(PREF_DIR, prefname, _value);
167
\brief A function to get the current value of the parameter in a string form
168
\return A string with the 'value' as command line argument
171
ParamRadioButton::string (std::string &string)
177
/** \brief A special radiobutton class to use in ParamRadioButton */
178
class ParamRadioButtonWdg : public Gtk::RadioButton {
180
ParamRadioButton * _pref;
182
Inkscape::XML::Node * _node;
183
sigc::signal<void> * _changeSignal;
185
/** \brief Build a string preference for the given parameter
186
\param pref Where to put the radiobutton's string when it is selected.
188
ParamRadioButtonWdg ( Gtk::RadioButtonGroup& group, const Glib::ustring& label,
189
ParamRadioButton * pref, SPDocument * doc, Inkscape::XML::Node * node, sigc::signal<void> * changeSignal ) :
190
Gtk::RadioButton(group, label), _pref(pref), _doc(doc), _node(node), _changeSignal(changeSignal) {
193
ParamRadioButtonWdg ( const Glib::ustring& label,
194
ParamRadioButton * pref, SPDocument * doc, Inkscape::XML::Node * node , sigc::signal<void> * changeSignal) :
195
Gtk::RadioButton(label), _pref(pref), _doc(doc), _node(node), _changeSignal(changeSignal) {
198
void add_changesignal() {
199
this->signal_toggled().connect(sigc::mem_fun(this, &ParamRadioButtonWdg::changed));
204
/** \brief Respond to the selected radiobutton changing
206
This function responds to the radiobutton selection changing by grabbing the value
207
from the text box and putting it in the parameter.
210
ParamRadioButtonWdg::changed (void)
212
if (this->get_active()) {
213
Glib::ustring data = this->get_label();
214
_pref->set(data.c_str(), _doc, _node);
216
if (_changeSignal != NULL) {
217
_changeSignal->emit();
224
\brief Creates a combobox widget for an enumeration parameter
227
ParamRadioButton::get_widget (SPDocument * doc, Inkscape::XML::Node * node, sigc::signal<void> * changeSignal)
229
Gtk::HBox * hbox = Gtk::manage(new Gtk::HBox(false, 4));
230
Gtk::VBox * vbox = Gtk::manage(new Gtk::VBox(false, 0));
232
Gtk::Label * label = Gtk::manage(new Gtk::Label(_(_text), Gtk::ALIGN_LEFT, Gtk::ALIGN_TOP));
234
hbox->pack_start(*label, false, false);
236
// add choice strings as radiobuttons
237
// and select last selected option (_value)
239
ParamRadioButtonWdg * radio;
240
Gtk::RadioButtonGroup group;
241
for (GSList * list = choices; list != NULL; list = g_slist_next(list)) {
242
optionentry * entr = reinterpret_cast<optionentry *>(list->data);
243
Glib::ustring * text = entr->guitext;
245
radio = Gtk::manage(new ParamRadioButtonWdg(*text, this, doc, node, changeSignal));
246
group = radio->get_group();
249
radio = Gtk::manage(new ParamRadioButtonWdg(group, *text, this, doc, node, changeSignal));
252
vbox->pack_start(*radio, true, true);
253
if (!entr->value->compare(_value)) {
259
hbox->pack_end(*vbox, false, false);
263
return dynamic_cast<Gtk::Widget *>(hbox);
267
} /* namespace Extension */
268
} /* namespace Inkscape */