diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/extension/prefdialog/parameter-color.cpp | 52 | ||||
| -rw-r--r-- | src/extension/prefdialog/parameter-color.h | 26 | ||||
| -rw-r--r-- | src/extension/prefdialog/parameter-int.cpp | 5 |
3 files changed, 69 insertions, 14 deletions
diff --git a/src/extension/prefdialog/parameter-color.cpp b/src/extension/prefdialog/parameter-color.cpp index 4e80af2a8..a17ca1bbd 100644 --- a/src/extension/prefdialog/parameter-color.cpp +++ b/src/extension/prefdialog/parameter-color.cpp @@ -14,6 +14,8 @@ #include <sstream> #include <gtkmm/box.h> +#include <gtkmm/colorbutton.h> +#include <gtkmm/label.h> #include "color.h" #include "preferences.h" @@ -48,6 +50,16 @@ ParamColor::ParamColor(Inkscape::XML::Node *xml, Inkscape::Extension::Extension _color_changed = _color.signal_changed.connect(sigc::mem_fun(this, &ParamColor::_onColorChanged)); // TODO: SelectedColor does not properly emit signal_changed after dragging, so we also need the following _color_released = _color.signal_released.connect(sigc::mem_fun(this, &ParamColor::_onColorChanged)); + + // parse appearance + if (_appearance) { + if (!strcmp(_appearance, "colorbutton")) { + _mode = COLOR_BUTTON; + } else { + g_warning("Invalid value ('%s') for appearance of parameter '%s' in extension '%s'", + _appearance, _name, _extension->get_id()); + } + } } ParamColor::~ParamColor() @@ -74,12 +86,34 @@ Gtk::Widget *ParamColor::get_widget(sigc::signal<void> *changeSignal) } Gtk::HBox *hbox = Gtk::manage(new Gtk::HBox(false, GUI_PARAM_WIDGETS_SPACING)); - Gtk::Widget *selector = Gtk::manage(new Inkscape::UI::Widget::ColorNotebook(_color)); - hbox->pack_start(*selector, true, true, 0); - selector->show(); + if (_mode == COLOR_BUTTON) { + Gtk::Label *label = Gtk::manage(new Gtk::Label(_text, Gtk::ALIGN_START)); + label->show(); + hbox->pack_start(*label, true, true); + + Gdk::RGBA rgba; + rgba.set_red_u (((_color.value() >> 24) & 255) << 8); + rgba.set_green_u(((_color.value() >> 16) & 255) << 8); + rgba.set_blue_u (((_color.value() >> 8) & 255) << 8); + rgba.set_alpha_u(((_color.value() >> 0) & 255) << 8); + + // TODO: It would be nicer to have a custom Gtk::ColorButton() implementation here, + // that wraps an Inkscape::UI::Widget::ColorNotebook into a new dialog + _color_button = Gtk::manage(new Gtk::ColorButton(rgba)); + _color_button->set_title(_text); + _color_button->set_use_alpha(); + _color_button->show(); + hbox->pack_end(*_color_button, false, false); + + _color_button->signal_color_set().connect(sigc::mem_fun(this, &ParamColor::_onColorButtonChanged)); + } else { + Gtk::Widget *selector = Gtk::manage(new Inkscape::UI::Widget::ColorNotebook(_color)); + hbox->pack_start(*selector, true, true, 0); + selector->show(); + } hbox->show(); - return hbox; + } void ParamColor::_onColorChanged() @@ -91,6 +125,16 @@ void ParamColor::_onColorChanged() _changeSignal->emit(); } +void ParamColor::_onColorButtonChanged() +{ + Gdk::RGBA rgba = _color_button->get_rgba(); + unsigned int value = ((rgba.get_red_u() >> 8) << 24) + + ((rgba.get_green_u() >> 8) << 16) + + ((rgba.get_blue_u() >> 8) << 8) + + ((rgba.get_alpha_u() >> 8) << 0); + set(value); +} + std::string ParamColor::value_to_string() const { char value_string[16]; diff --git a/src/extension/prefdialog/parameter-color.h b/src/extension/prefdialog/parameter-color.h index 6e17a1c62..4fef4b66b 100644 --- a/src/extension/prefdialog/parameter-color.h +++ b/src/extension/prefdialog/parameter-color.h @@ -14,6 +14,7 @@ namespace Gtk { class Widget; +class ColorButton; } namespace Inkscape { @@ -24,14 +25,11 @@ class Node; namespace Extension { class ParamColor : public InxParameter { -private: - void _onColorChanged(); - - Inkscape::UI::SelectedColor _color; - sigc::connection _color_changed; - sigc::connection _color_released; - public: + enum AppearanceMode { + DEFAULT, COLOR_BUTTON + }; + ParamColor(Inkscape::XML::Node *xml, Inkscape::Extension::Extension *ext); ~ParamColor() override; @@ -46,6 +44,20 @@ public: sigc::signal<void> *_changeSignal; +private: + void _onColorChanged(); + void _onColorButtonChanged(); + + /** Internal value of this parameter */ + Inkscape::UI::SelectedColor _color; + + sigc::connection _color_changed; + sigc::connection _color_released; + + Gtk::ColorButton *_color_button; + + /** appearance mode **/ + AppearanceMode _mode = DEFAULT; }; // class ParamColor } // namespace Extension diff --git a/src/extension/prefdialog/parameter-int.cpp b/src/extension/prefdialog/parameter-int.cpp index 1d768ca00..e18e1bddc 100644 --- a/src/extension/prefdialog/parameter-int.cpp +++ b/src/extension/prefdialog/parameter-int.cpp @@ -152,13 +152,12 @@ ParamInt::get_widget(sigc::signal<void> *changeSignal) scale->set_size_request(400, -1); scale->show(); hbox->pack_start(*scale, true, true); - } - else if (_mode == DEFAULT) { + } else if (_mode == DEFAULT) { Gtk::Label *label = Gtk::manage(new Gtk::Label(_text, Gtk::ALIGN_START)); label->show(); hbox->pack_start(*label, true, true); - auto spin = Gtk::manage(new Inkscape::UI::Widget::SpinButton(fadjust, 1.0, 0)); + auto spin = Gtk::manage(new Inkscape::UI::Widget::SpinButton(fadjust, 1.0, 0)); spin->show(); hbox->pack_start(*spin, false, false); } |
