summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/extension/param/color.cpp70
-rw-r--r--src/extension/param/color.h9
-rw-r--r--src/extension/param/parameter.cpp3
-rw-r--r--src/ui/CMakeLists.txt2
-rw-r--r--src/ui/dialog/objects.cpp33
-rw-r--r--src/ui/dialog/objects.h9
-rw-r--r--src/ui/dialog/tags.cpp2
-rw-r--r--src/ui/selected-color.cpp41
-rw-r--r--src/ui/selected-color.h7
-rw-r--r--src/ui/widget/Makefile_insert2
-rw-r--r--src/ui/widget/color-entry.cpp8
-rw-r--r--src/ui/widget/color-icc-selector.cpp2
-rw-r--r--src/ui/widget/color-notebook.cpp (renamed from src/widgets/sp-color-notebook.cpp)432
-rw-r--r--src/ui/widget/color-notebook.h120
-rw-r--r--src/ui/widget/color-picker.cpp70
-rw-r--r--src/ui/widget/color-picker.h8
-rw-r--r--src/ui/widget/color-scales.cpp18
-rw-r--r--src/ui/widget/color-wheel-selector.cpp14
-rw-r--r--src/widgets/CMakeLists.txt2
-rw-r--r--src/widgets/Makefile_insert2
-rw-r--r--src/widgets/gradient-selector.cpp4
-rw-r--r--src/widgets/gradient-vector.cpp82
-rw-r--r--src/widgets/paint-selector.cpp90
-rw-r--r--src/widgets/paint-selector.h20
-rw-r--r--src/widgets/sp-color-notebook.h158
-rw-r--r--src/widgets/swatch-selector.cpp106
-rw-r--r--src/widgets/swatch-selector.h12
27 files changed, 541 insertions, 785 deletions
diff --git a/src/extension/param/color.cpp b/src/extension/param/color.cpp
index 5bd70359f..5b1a6acc8 100644
--- a/src/extension/param/color.cpp
+++ b/src/extension/param/color.cpp
@@ -29,40 +29,37 @@
#include <color.h>
#include "widgets/sp-color-selector.h"
-#include "widgets/sp-color-notebook.h"
+#include "ui/widget/color-notebook.h"
#include "preferences.h"
-
namespace Inkscape {
namespace Extension {
-void sp_color_param_changed(SPColorSelector *csel, GObject *cp);
-
-
ParamColor::~ParamColor(void)
{
-
+ _color_changed.disconnect();
}
guint32 ParamColor::set( guint32 in, SPDocument * /*doc*/, Inkscape::XML::Node * /*node*/ )
{
- _value = in;
+ _color_changed.block(true);
+ _color.setValue(in);
+ _color_changed.block(false);
gchar * prefname = this->pref_name();
std::string value;
string(value);
-
+
Inkscape::Preferences *prefs = Inkscape::Preferences::get();
prefs->setString(extension_pref_root + prefname, value);
g_free(prefname);
- return _value;
+ return in;
}
-ParamColor::ParamColor(const gchar *name, const gchar *guitext, const gchar *desc, const Parameter::_scope_t scope,
- bool gui_hidden, const gchar *gui_tip, Inkscape::Extension::Extension *ext,
- Inkscape::XML::Node *xml)
- : Parameter(name, guitext, desc, scope, gui_hidden, gui_tip, ext), _value(0), _changeSignal(0)
+ParamColor::ParamColor (const gchar * name, const gchar * guitext, const gchar * desc, const Parameter::_scope_t scope, bool gui_hidden, const gchar * gui_tip, Inkscape::Extension::Extension * ext, Inkscape::XML::Node * xml) :
+ Parameter(name, guitext, desc, scope, gui_hidden, gui_tip, ext),
+ _changeSignal(0)
{
const char * defaulthex = NULL;
if (xml->firstChild() != NULL)
@@ -76,51 +73,46 @@ ParamColor::ParamColor(const gchar *name, const gchar *guitext, const gchar *des
if (!paramval.empty())
defaulthex = paramval.data();
- if (defaulthex)
- _value = atoi(defaulthex);
+ if (defaulthex) {
+ _color.setValue(atoi(defaulthex));
+ }
+ _color_changed = _color.signal_changed.connect(sigc::mem_fun(this, &ParamColor::_onColorChanged));
+
}
void ParamColor::string(std::string &string) const
{
char str[16];
- sprintf(str, "%i", _value);
+ sprintf(str, "%i", _color.value());
string += str;
}
Gtk::Widget *ParamColor::get_widget( SPDocument * /*doc*/, Inkscape::XML::Node * /*node*/, sigc::signal<void> * changeSignal )
{
- if (_gui_hidden) return NULL;
+ using Inkscape::UI::Widget::ColorNotebook;
+
+ if (_gui_hidden) return NULL;
_changeSignal = new sigc::signal<void>(*changeSignal);
- Gtk::HBox * hbox = Gtk::manage(new Gtk::HBox(false, 4));
- SPColorSelector* spColorSelector = (SPColorSelector*)sp_color_selector_new(SP_TYPE_COLOR_NOTEBOOK);
- ColorSelector* colorSelector = spColorSelector->base;
- if (_value < 1) {
- _value = 0xFF000000;
+ if (_color.value() < 1) {
+ _color_changed.block(true);
+ _color.setValue(0xFF000000);
+ _color_changed.block(false);
}
- SPColor *color = new SPColor( _value );
- float alpha = (_value & 0xff) / 255.0F;
- colorSelector->setColorAlpha(*color, alpha);
-
- hbox->pack_start (*Glib::wrap(&spColorSelector->vbox), true, true, 0);
- g_signal_connect(G_OBJECT(spColorSelector), "changed", G_CALLBACK(sp_color_param_changed), (void*)this);
- gtk_widget_show(GTK_WIDGET(spColorSelector));
+ Gtk::HBox *hbox = Gtk::manage(new Gtk::HBox(false, 4));
+ Gtk::Widget *selector = Gtk::manage(new ColorNotebook(_color));
+ hbox->pack_start (*selector, true, true, 0);
+ selector->show();
hbox->show();
-
- return dynamic_cast<Gtk::Widget *>(hbox);
+ return hbox;
}
-void sp_color_param_changed(SPColorSelector *csel, GObject *obj)
+void ParamColor::_onColorChanged()
{
- const SPColor color = csel->base->getColor();
- float alpha = csel->base->getAlpha();
-
- ParamColor* ptr = reinterpret_cast<ParamColor*>(obj);
- ptr->set(color.toRGBA32( alpha ), NULL, NULL);
-
- ptr->_changeSignal->emit();
+ if (_changeSignal)
+ _changeSignal->emit();
}
}; /* namespace Extension */
diff --git a/src/extension/param/color.h b/src/extension/param/color.h
index 9894965a9..ed2e57ceb 100644
--- a/src/extension/param/color.h
+++ b/src/extension/param/color.h
@@ -9,6 +9,7 @@
*/
#include "parameter.h"
+#include "ui/selected-color.h"
class SPDocument;
@@ -25,14 +26,17 @@ namespace Extension {
class ParamColor : public Parameter {
private:
- guint32 _value;
+ void _onColorChanged();
+
+ Inkscape::UI::SelectedColor _color;
+ sigc::connection _color_changed;
public:
ParamColor(const gchar * name, const gchar * guitext, const gchar * desc, const Parameter::_scope_t scope, bool gui_hidden, const gchar * gui_tip, Inkscape::Extension::Extension * ext, Inkscape::XML::Node * xml);
virtual ~ParamColor(void);
/** Returns \c _value, with a \i const to protect it. */
- guint32 get( SPDocument const * /*doc*/, Inkscape::XML::Node const * /*node*/ ) const { return _value; }
+ guint32 get( SPDocument const * /*doc*/, Inkscape::XML::Node const * /*node*/ ) const { return _color.value(); }
guint32 set (guint32 in, SPDocument * doc, Inkscape::XML::Node * node);
@@ -44,6 +48,7 @@ public:
virtual void string (std::string &string) const;
sigc::signal<void> * _changeSignal;
+
}; // class ParamColor
} // namespace Extension
diff --git a/src/extension/param/parameter.cpp b/src/extension/param/parameter.cpp
index b18525215..8c99ee55d 100644
--- a/src/extension/param/parameter.cpp
+++ b/src/extension/param/parameter.cpp
@@ -30,8 +30,7 @@
#include "document-private.h"
#include "sp-object.h"
#include <color.h>
-#include "widgets/sp-color-selector.h"
-#include "widgets/sp-color-notebook.h"
+#include "ui/widget/color-notebook.h"
#include "parameter.h"
#include "bool.h"
diff --git a/src/ui/CMakeLists.txt b/src/ui/CMakeLists.txt
index 93920f77e..09c32d501 100644
--- a/src/ui/CMakeLists.txt
+++ b/src/ui/CMakeLists.txt
@@ -118,6 +118,7 @@ set(ui_SRC
widget/clipmaskicon.cpp
widget/color-entry.cpp
widget/color-icc-selector.cpp
+ widget/color-notebook.cpp
widget/color-picker.cpp
widget/color-preview.cpp
widget/color-scales.cpp
@@ -296,6 +297,7 @@ set(ui_SRC
widget/button.h
widget/color-entry.h
widget/color-icc-selector.h
+ widget/color-notebook.h
widget/color-picker.h
widget/color-preview.h
widget/color-scales.h
diff --git a/src/ui/dialog/objects.cpp b/src/ui/dialog/objects.cpp
index 9db0285d7..a50c8baa6 100644
--- a/src/ui/dialog/objects.cpp
+++ b/src/ui/dialog/objects.cpp
@@ -45,6 +45,7 @@
#include "style.h"
#include "ui/tools-switch.h"
#include "ui/icon-names.h"
+#include "ui/selected-color.h"
#include "ui/widget/imagetoggler.h"
#include "ui/widget/layertypeicon.h"
#include "ui/widget/insertordericon.h"
@@ -53,7 +54,7 @@
#include "ui/tools/node-tool.h"
#include "ui/tools/tool-base.h"
#include "verbs.h"
-#include "widgets/sp-color-notebook.h"
+#include "ui/widget/color-notebook.h"
#include "widgets/icon.h"
#include "xml/node.h"
#include "xml/node-observer.h"
@@ -928,12 +929,12 @@ bool ObjectsPanel::_handleButtonEvent(GdkEventButton* event)
//If the current item is not selected, store only it in the highlight source
_storeHighlightTarget(iter);
}
- if (_colorSelector)
+ if (_selectedColor)
{
//Set up the color selector
SPColor color;
color.set( row[_model->_colHighlight] );
- _colorSelector->base->setColorAlpha(color, SP_RGBA32_A_F(row[_model->_colHighlight]));
+ _selectedColor->setColorAlpha(color, SP_RGBA32_A_F(row[_model->_colHighlight]));
}
//Show the color selector dialog
_colorSelectorDialog.show();
@@ -1440,17 +1441,16 @@ void ObjectsPanel::_setExpanded(const Gtk::TreeModel::iterator& iter, const Gtk:
* @param csel Color selector
* @param cp Objects panel
*/
-void sp_highlight_picker_color_mod(SPColorSelector *csel, GObject * cp)
+void ObjectsPanel::_highlightPickerColorMod()
{
SPColor color;
float alpha = 0;
- csel->base->getColorAlpha(color, alpha);
+ _selectedColor->colorAlpha(color, alpha);
+
guint32 rgba = color.toRGBA32( alpha );
-
- ObjectsPanel *ptr = reinterpret_cast<ObjectsPanel *>(cp);
//Set the highlight color for all items in the _highlight_target (all selected items)
- for (std::vector<SPItem *>::iterator iter = ptr->_highlight_target.begin(); iter != ptr->_highlight_target.end(); ++iter)
+ for (std::vector<SPItem *>::iterator iter = _highlight_target.begin(); iter != _highlight_target.end(); ++iter)
{
SPItem * target = *iter;
target->setHighlightColor(rgba);
@@ -1922,18 +1922,16 @@ ObjectsPanel::ObjectsPanel() :
_colorSelectorDialog.set_title (_("Select Highlight Color"));
_colorSelectorDialog.set_border_width (4);
_colorSelectorDialog.property_modal() = true;
- _colorSelector = SP_COLOR_SELECTOR(sp_color_selector_new(SP_TYPE_COLOR_NOTEBOOK));
+ _selectedColor.reset(new Inkscape::UI::SelectedColor);
+ Gtk::Widget *color_selector = Gtk::manage(new Inkscape::UI::Widget::ColorNotebook(*_selectedColor));
_colorSelectorDialog.get_vbox()->pack_start (
- *Glib::wrap(&_colorSelector->vbox), true, true, 0);
+ *color_selector, true, true, 0);
- g_signal_connect(G_OBJECT(_colorSelector), "dragged",
- G_CALLBACK(sp_highlight_picker_color_mod), (void *)this);
- g_signal_connect(G_OBJECT(_colorSelector), "released",
- G_CALLBACK(sp_highlight_picker_color_mod), (void *)this);
- g_signal_connect(G_OBJECT(_colorSelector), "changed",
- G_CALLBACK(sp_highlight_picker_color_mod), (void *)this);
+ _selectedColor->signal_dragged.connect(sigc::mem_fun(*this, &ObjectsPanel::_highlightPickerColorMod));
+ _selectedColor->signal_released.connect(sigc::mem_fun(*this, &ObjectsPanel::_highlightPickerColorMod));
+ _selectedColor->signal_changed.connect(sigc::mem_fun(*this, &ObjectsPanel::_highlightPickerColorMod));
- gtk_widget_show(GTK_WIDGET(_colorSelector));
+ color_selector->show();
setDesktop( targetDesktop );
@@ -1951,7 +1949,6 @@ ObjectsPanel::~ObjectsPanel()
{
//Close the highlight selection dialog
_colorSelectorDialog.hide();
- _colorSelector = NULL;
//Set the desktop to null, which will disconnect all object watchers
setDesktop(NULL);
diff --git a/src/ui/dialog/objects.h b/src/ui/dialog/objects.h
index 74c2382ac..aa50353c2 100644
--- a/src/ui/dialog/objects.h
+++ b/src/ui/dialog/objects.h
@@ -20,6 +20,7 @@
# include <glibmm/threads.h>
#endif
+#include <boost/scoped_ptr.hpp>
#include <gtkmm/box.h>
#include <gtkmm/treeview.h>
#include <gtkmm/treestore.h>
@@ -40,6 +41,9 @@ struct SPColorSelector;
namespace Inkscape {
namespace UI {
+
+class SelectedColor;
+
namespace Dialog {
@@ -170,8 +174,7 @@ private:
Gtk::Alignment _blur_alignment;
Gtk::Dialog _colorSelectorDialog;
- SPColorSelector *_colorSelector;
-
+ boost::scoped_ptr<Inkscape::UI::SelectedColor> _selectedColor;
//Methods:
@@ -237,7 +240,7 @@ private:
void setupDialog(const Glib::ustring &title);
- friend void sp_highlight_picker_color_mod(SPColorSelector *csel, GObject *cp);
+ void _highlightPickerColorMod();
};
diff --git a/src/ui/dialog/tags.cpp b/src/ui/dialog/tags.cpp
index 7d3edaffb..c40bb9c83 100644
--- a/src/ui/dialog/tags.cpp
+++ b/src/ui/dialog/tags.cpp
@@ -51,7 +51,7 @@
#include "ui/tools/tool-base.h" //"event-context.h"
#include "selection.h"
//#include "dialogs/dialog-events.h"
-#include "widgets/sp-color-notebook.h"
+#include "ui/widget/color-notebook.h"
#include "style.h"
#include "filter-chemistry.h"
#include "filters/blend.h"
diff --git a/src/ui/selected-color.cpp b/src/ui/selected-color.cpp
index dff43649c..0d3505c45 100644
--- a/src/ui/selected-color.cpp
+++ b/src/ui/selected-color.cpp
@@ -34,6 +34,7 @@ SelectedColor::SelectedColor()
, _alpha(1.0)
, _held(false)
, _virgin(true)
+ , _updating(false)
{
}
@@ -44,7 +45,7 @@ SelectedColor::~SelectedColor() {
void SelectedColor::setColor(SPColor const &color)
{
- setColorAlpha( color, _alpha, true);
+ setColorAlpha( color, _alpha);
}
SPColor SelectedColor::color() const
@@ -55,7 +56,7 @@ SPColor SelectedColor::color() const
void SelectedColor::setAlpha(gfloat alpha)
{
g_return_if_fail( ( 0.0 <= alpha ) && ( alpha <= 1.0 ) );
- setColorAlpha( _color, alpha, true);
+ setColorAlpha( _color, alpha);
}
gfloat SelectedColor::alpha() const
@@ -63,13 +64,29 @@ gfloat SelectedColor::alpha() const
return _alpha;
}
-void SelectedColor::setColorAlpha(SPColor const &color, gfloat alpha, bool emit)
+void SelectedColor::setValue(guint32 value)
+{
+ SPColor color(value);
+ gfloat alpha = SP_RGBA32_A_F(value);
+ setColorAlpha(color, alpha);
+}
+
+guint32 SelectedColor::value() const
+{
+ return color().toRGBA32(_alpha);
+}
+
+void SelectedColor::setColorAlpha(SPColor const &color, gfloat alpha)
{
#ifdef DUMP_CHANGE_INFO
g_message("SelectedColor::setColorAlpha( this=%p, %f, %f, %f, %s, %f, %s) in %s", this, color.v.c[0], color.v.c[1], color.v.c[2], (color.icc?color.icc->colorProfile.c_str():"<null>"), alpha, (emit?"YES":"no"), FOO_NAME(_csel));
#endif
g_return_if_fail( ( 0.0 <= alpha ) && ( alpha <= 1.0 ) );
+ if (_updating) {
+ return;
+ }
+
#ifdef DUMP_CHANGE_INFO
g_message("---- SelectedColor::setColorAlpha virgin:%s !close:%s alpha is:%s in %s",
(_virgin?"YES":"no"),
@@ -87,13 +104,14 @@ void SelectedColor::setColorAlpha(SPColor const &color, gfloat alpha, bool emit)
_color = color;
_alpha = alpha;
- if (emit) {
- if (_held) {
- signal_dragged.emit();
- } else {
- signal_changed.emit();
- }
+ _updating = true;
+ if (_held) {
+ signal_dragged.emit();
+ } else {
+ signal_changed.emit();
}
+ _updating = false;
+
#ifdef DUMP_CHANGE_INFO
} else {
g_message("++++ SelectedColor::setColorAlpha color:%08x ==> _color:%08X isClose:%s in %s", color.toRGBA32(alpha), _color.toRGBA32(_alpha),
@@ -108,11 +126,15 @@ void SelectedColor::colorAlpha(SPColor &color, gfloat &alpha) const {
}
void SelectedColor::setHeld(bool held) {
+ if (_updating) {
+ return;
+ }
bool grabbed = held && !_held;
bool released = !held && _held;
_held = held;
+ _updating = true;
if (grabbed) {
signal_grabbed.emit();
}
@@ -121,6 +143,7 @@ void SelectedColor::setHeld(bool held) {
signal_released.emit();
signal_changed.emit();
}
+ _updating = false;
}
void SelectedColor::preserveICC() {
diff --git a/src/ui/selected-color.h b/src/ui/selected-color.h
index 5d3d89672..b4268f553 100644
--- a/src/ui/selected-color.h
+++ b/src/ui/selected-color.h
@@ -39,7 +39,10 @@ public:
void setAlpha(gfloat alpha);
gfloat alpha() const;
- void setColorAlpha(SPColor const &color, gfloat alpha, bool emit = false);
+ void setValue(guint32 value);
+ guint32 value() const;
+
+ void setColorAlpha(SPColor const &color, gfloat alpha);
void colorAlpha(SPColor &color, gfloat &alpha) const;
void setHeld(bool held);
@@ -67,6 +70,8 @@ private:
*/
bool _virgin;
+ bool _updating;
+
static double const _EPSILON;
};
diff --git a/src/ui/widget/Makefile_insert b/src/ui/widget/Makefile_insert
index 3f6b868df..d56946745 100644
--- a/src/ui/widget/Makefile_insert
+++ b/src/ui/widget/Makefile_insert
@@ -10,6 +10,8 @@ ink_common_sources += \
ui/widget/color-entry.h \
ui/widget/color-icc-selector.cpp \
ui/widget/color-icc-selector.h \
+ ui/widget/color-notebook.cpp \
+ ui/widget/color-notebook.h \
ui/widget/color-wheel-selector.cpp \
ui/widget/color-wheel-selector.h \
ui/widget/color-picker.cpp \
diff --git a/src/ui/widget/color-entry.cpp b/src/ui/widget/color-entry.cpp
index 56fd6080e..e26cb4ade 100644
--- a/src/ui/widget/color-entry.cpp
+++ b/src/ui/widget/color-entry.cpp
@@ -71,23 +71,17 @@ void ColorEntry::on_changed() {
if (len < 8) {
rgba = rgba << (4 * (8 - len));
}
- _updating = true;
if (changed) {
set_text(str);
}
SPColor color(rgba);
- _color.setColorAlpha(color, SP_RGBA32_A_F(rgba), true);
- _updating = false;
+ _color.setColorAlpha(color, SP_RGBA32_A_F(rgba));
}
g_free(str);
}
void ColorEntry::_onColorChanged() {
- if (_updating) {
- return;
- }
-
SPColor color = _color.color();
gdouble alpha = _color.alpha();
diff --git a/src/ui/widget/color-icc-selector.cpp b/src/ui/widget/color-icc-selector.cpp
index b2656ef8b..db73c9111 100644
--- a/src/ui/widget/color-icc-selector.cpp
+++ b/src/ui/widget/color-icc-selector.cpp
@@ -1017,7 +1017,7 @@ void ColorICCSelectorImpl::_adjustmentChanged( GtkAdjustment *adjustment, ColorI
}
#endif // defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2)
}
- iccSelector->_impl->_color.setColorAlpha(newColor, scaled, true);
+ iccSelector->_impl->_color.setColorAlpha(newColor, scaled);
//iccSelector->_updateInternals( newColor, scaled, iccSelector->_impl->_dragging );
iccSelector->_impl->_updateSliders( match );
diff --git a/src/widgets/sp-color-notebook.cpp b/src/ui/widget/color-notebook.cpp
index 841130632..0a4473a3b 100644
--- a/src/widgets/sp-color-notebook.cpp
+++ b/src/ui/widget/color-notebook.cpp
@@ -1,11 +1,13 @@
-/*
- * A notebook with RGB, CMYK, CMS, HSL, and Wheel pages
- *
- * Author:
+/**
+ * @file
+ * A notebook with RGB, CMYK, CMS, HSL, and Wheel pages - implementation
+ */
+/* Authors:
* Lauris Kaplinski <lauris@kaplinski.com>
* bulia byak <buliabyak@users.sf.net>
+ * Tomasz Boczkowski <penginsbacon@gmail.com> (c++-sification)
*
- * Copyright (C) 2001-2002 Lauris Kaplinski
+ * Copyright (C) 2001-2014 Authors
*
* This code is in public domain
*/
@@ -29,126 +31,91 @@
#include <gtk/gtk.h>
#include <glibmm/i18n.h>
#include <gtkmm/label.h>
+#include <gtkmm/notebook.h>
-#include "ui/dialog-events.h"
-#include "../preferences.h"
-#include "sp-color-notebook.h"
-#include "spw-utilities.h"
+#include "preferences.h"
+#include "widgets/spw-utilities.h"
#include "svg/svg-icc-color.h"
-#include "../inkscape.h"
-#include "../document.h"
-#include "../profile-manager.h"
+#include "inkscape.h"
+#include "document.h"
+#include "profile-manager.h"
#include "color-profile.h"
#include "cms-system.h"
+#include "ui/dialog-events.h"
#include "ui/tools-switch.h"
#include "ui/tools/tool-base.h"
#include "ui/widget/color-entry.h"
#include "ui/widget/color-icc-selector.h"
+#include "ui/widget/color-notebook.h"
#include "ui/widget/color-scales.h"
#include "ui/widget/color-wheel-selector.h"
using Inkscape::CMSSystem;
-using namespace Inkscape::UI::Widget;
-
-struct SPColorNotebookTracker {
- const gchar* name;
- const gchar* className;
- GType type;
- guint submode;
- gboolean enabledFull;
- gboolean enabledBrief;
- SPColorNotebook *backPointer;
-};
-
-static void sp_color_notebook_dispose(GObject *object);
-
-static void sp_color_notebook_show_all (GtkWidget *widget);
-static void sp_color_notebook_hide(GtkWidget *widget);
-
#define XPAD 4
#define YPAD 1
-G_DEFINE_TYPE(SPColorNotebook, sp_color_notebook, SP_TYPE_COLOR_SELECTOR);
-
-static void sp_color_notebook_class_init(SPColorNotebookClass *klass)
-{
- GObjectClass *object_class = reinterpret_cast<GObjectClass *>(klass);
- GtkWidgetClass *widget_class = reinterpret_cast<GtkWidgetClass *>(klass);
+namespace Inkscape {
+namespace UI {
+namespace Widget {
- object_class->dispose = sp_color_notebook_dispose;
- widget_class->show_all = sp_color_notebook_show_all;
- widget_class->hide = sp_color_notebook_hide;
-}
+ColorNotebook::ColorNotebook(SelectedColor &color)
+#if GTK_CHECK_VERSION(3,0,0)
+ : Gtk::Grid()
+#else
+ : Gtk::Table(2, 3, false)
+#endif
+ , _selected_color(color)
-static void
-sp_color_notebook_switch_page(GtkNotebook *notebook,
- GtkWidget *page,
- guint page_num,
- SPColorNotebook *colorbook)
{
- if ( colorbook )
- {
- ColorNotebook* nb = dynamic_cast<ColorNotebook*>(SP_COLOR_SELECTOR(colorbook)->base);
- nb->switchPage( notebook, page, page_num );
+ Page *page;
- // remember the page we switched to
- Inkscape::Preferences *prefs = Inkscape::Preferences::get();
- prefs->setInt("/colorselector/page", page_num);
- }
+ page = new Page(new ColorScalesFactory(SP_COLOR_SCALES_MODE_RGB), true);
+ _available_pages.push_back(page);
+ page = new Page(new ColorScalesFactory(SP_COLOR_SCALES_MODE_HSV), true);
+ _available_pages.push_back(page);
+ page = new Page(new ColorScalesFactory(SP_COLOR_SCALES_MODE_CMYK), true);
+ _available_pages.push_back(page);
+ page = new Page(new ColorWheelSelectorFactory, true);
+ _available_pages.push_back(page);
+#if defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2)
+ page = new Page(new ColorICCSelectorFactory, true);
+ _available_pages.push_back(page);
+#endif
+
+ _initUI();
+
+ _selected_color.signal_changed.connect(sigc::mem_fun(this, &ColorNotebook::_onSelectedColorChanged));
+ _selected_color.signal_dragged.connect(sigc::mem_fun(this, &ColorNotebook::_onSelectedColorChanged));
}
-void ColorNotebook::switchPage(GtkNotebook*,
- GtkWidget*,
- guint page_num)
+ColorNotebook::~ColorNotebook()
{
- SPColorSelector* csel;
- GtkWidget* widget;
-
- if ( gtk_notebook_get_current_page (GTK_NOTEBOOK (_book)) >= 0 )
+ if ( _buttons )
{
- csel = getCurrentSelector();
- if (csel) {
- csel->base->getColorAlpha(_color, _alpha);
- }
+ delete [] _buttons;
+ _buttons = 0;
}
- widget = gtk_notebook_get_nth_page (GTK_NOTEBOOK (_book), page_num);
- if ( widget && SP_IS_COLOR_SELECTOR(widget) )
- {
- csel = SP_COLOR_SELECTOR (widget);
- if (csel) {
- csel->base->setColorAlpha( _color, _alpha );
- }
- // Temporary workaround to undo a spurious GRABBED
- _released();
- }
}
-static void
-sp_color_notebook_init (SPColorNotebook *colorbook)
+ColorNotebook::Page::Page(Inkscape::UI::ColorSelectorFactory *selector_factory, bool enabled_full)
+ : selector_factory(selector_factory)
+ , enabled_full(enabled_full)
{
- SP_COLOR_SELECTOR(colorbook)->base = new ColorNotebook( SP_COLOR_SELECTOR(colorbook) );
-
- if ( SP_COLOR_SELECTOR(colorbook)->base )
- {
- SP_COLOR_SELECTOR(colorbook)->base->init();
- }
}
-void ColorNotebook::init()
+
+void ColorNotebook::_initUI()
{
guint row = 0;
- _updating = false;
-
- _book = gtk_notebook_new ();
- gtk_widget_show (_book);
-
- // Dont show the notebook tabs, use radiobuttons instead
- gtk_notebook_set_show_border (GTK_NOTEBOOK (_book), false);
- gtk_notebook_set_show_tabs (GTK_NOTEBOOK (_book), false);
+ Gtk::Notebook *notebook = Gtk::manage(new Gtk::Notebook);
+ notebook->show();
+ notebook->set_show_border(false);
+ notebook->set_show_tabs(false);
+ _book = GTK_WIDGET(notebook->gobj());
#if GTK_CHECK_VERSION(3,0,0)
_buttonbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 2);
@@ -165,16 +132,6 @@ void ColorNotebook::init()
_addPage(_available_pages[i]);
}
-#if GTK_CHECK_VERSION(3,0,0)
- GtkWidget* table = gtk_grid_new();
-#else
- GtkWidget* table = gtk_table_new(2, 3, FALSE);
-#endif
-
- gtk_widget_show (table);
-
- gtk_box_pack_start (GTK_BOX (_csel), table, TRUE, TRUE, 0);
-
sp_set_font_size_smaller (_buttonbox);
#if GTK_CHECK_VERSION(3,0,0)
@@ -189,12 +146,9 @@ void ColorNotebook::init()
gtk_widget_set_margin_bottom(_buttonbox, YPAD);
gtk_widget_set_hexpand(_buttonbox, TRUE);
gtk_widget_set_valign(_buttonbox, GTK_ALIGN_CENTER);
- gtk_grid_attach(GTK_GRID(table), _buttonbox, 0, row, 2, 1);
+ attach(*Glib::wrap(_buttonbox), 0, row, 2, 1);
#else
- gtk_table_attach (GTK_TABLE (table), _buttonbox, 0, 2, row, row + 1,
- static_cast<GtkAttachOptions>(GTK_EXPAND|GTK_FILL),
- static_cast<GtkAttachOptions>(0),
- XPAD, YPAD);
+ attach(*Glib::wrap(_buttonbox), 0, 2, row, row+1, Gtk::EXPAND | Gtk::FILL, static_cast<Gtk::AttachOptions>(0), XPAD, YPAD);
#endif
row++;
@@ -211,12 +165,9 @@ void ColorNotebook::init()
gtk_widget_set_margin_bottom(_book, YPAD);
gtk_widget_set_hexpand(_book, TRUE);
gtk_widget_set_vexpand(_book, TRUE);
- gtk_grid_attach(GTK_GRID(table), _book, 0, row, 2, 1);
+ attach(*notebook, 0, row, 2, 1);
#else
- gtk_table_attach (GTK_TABLE (table), _book, 0, 2, row, row + 1,
- static_cast<GtkAttachOptions>(GTK_EXPAND|GTK_FILL),
- static_cast<GtkAttachOptions>(GTK_EXPAND|GTK_FILL),
- XPAD*2, YPAD);
+ attach(*notebook, 0, 2, row, row+1, Gtk::EXPAND | Gtk::FILL, Gtk::EXPAND | Gtk::FILL, XPAD * 2, YPAD);
#endif
// restore the last active page
@@ -311,7 +262,7 @@ void ColorNotebook::init()
gtk_container_add (GTK_CONTAINER (_btn_picker), picker);
gtk_widget_set_tooltip_text (_btn_picker, _("Pick colors from image"));
gtk_box_pack_start(GTK_BOX(rgbabox), _btn_picker, FALSE, FALSE, 2);
- g_signal_connect(G_OBJECT(_btn_picker), "clicked", G_CALLBACK(ColorNotebook::_picker_clicked), _csel);
+ g_signal_connect(G_OBJECT(_btn_picker), "clicked", G_CALLBACK(ColorNotebook::_onPickerClicked), this);
/* Create RGBA entry and color preview */
_rgbal = gtk_label_new_with_mnemonic (_("RGBA_:"));
@@ -341,135 +292,65 @@ void ColorNotebook::init()
#endif
gtk_widget_set_margin_top(rgbabox, YPAD);
gtk_widget_set_margin_bottom(rgbabox, YPAD);
- gtk_grid_attach(GTK_GRID(table), rgbabox, 0, row, 2, 1);
+ attach(*Glib::wrap(rgbabox), 0, row, 2, 1);
#else
- gtk_table_attach (GTK_TABLE (table), rgbabox, 0, 2, row, row + 1, GTK_FILL, GTK_SHRINK, XPAD, YPAD);
+ attach(*Glib::wrap(rgbabox), 0, 2, row, row + 1, Gtk::FILL, Gtk::SHRINK, XPAD, YPAD);
#endif
#ifdef SPCS_PREVIEW
_p = sp_color_preview_new (0xffffffff);
gtk_widget_show (_p);
- gtk_table_attach (GTK_TABLE (table), _p, 2, 3, row, row + 1, GTK_FILL, GTK_FILL, XPAD, YPAD);
+ attach(*Glib::wrap(_p), 2, 3, row, row + 1, Gtk::FILL, Gtk::FILL, XPAD, YPAD);
#endif
- _switchId = g_signal_connect(G_OBJECT (_book), "switch-page",
- G_CALLBACK (sp_color_notebook_switch_page), SP_COLOR_NOTEBOOK(_csel));
-
- _selected_color.signal_changed.connect(sigc::mem_fun(this, &ColorNotebook::_onSelectedColorChanged));
- _selected_color.signal_dragged.connect(sigc::mem_fun(this, &ColorNotebook::_onSelectedColorDragged));
- _selected_color.signal_grabbed.connect(sigc::mem_fun(this, &ColorNotebook::_onSelectedColorGrabbed));
- _selected_color.signal_released.connect(sigc::mem_fun(this, &ColorNotebook::_onSelectedColorReleased));
+ g_signal_connect(G_OBJECT (_book), "switch-page",
+ G_CALLBACK (ColorNotebook::_onPageSwitched), this);
}
-static void sp_color_notebook_dispose(GObject *object)
+void ColorNotebook::_onPickerClicked(GtkWidget * /*widget*/, ColorNotebook * /*colorbook*/)
{
- if (G_OBJECT_CLASS(sp_color_notebook_parent_class)->dispose)
- G_OBJECT_CLASS(sp_color_notebook_parent_class)->dispose(object);
+ // Set the dropper into a "one click" mode, so it reverts to the previous tool after a click
+ Inkscape::Preferences *prefs = Inkscape::Preferences::get();
+ prefs->setBool("/tools/dropper/onetimepick", true);
+ Inkscape::UI::Tools::sp_toggle_dropper(SP_ACTIVE_DESKTOP);
}
-ColorNotebook::~ColorNotebook()
+void ColorNotebook::_onButtonClicked(GtkWidget *widget, ColorNotebook *nb)
{
- if ( _switchId )
- {
- if ( _book )
- {
- g_signal_handler_disconnect (_book, _switchId);
- _switchId = 0;
- }
- }
-
- if ( _buttons )
- {
- delete [] _buttons;
- _buttons = 0;
+ if (!gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(widget))) {
+ return;
}
-}
-
-static void
-sp_color_notebook_show_all (GtkWidget *widget)
-{
- gtk_widget_show (widget);
-}
-
-static void sp_color_notebook_hide(GtkWidget *widget)
-{
- gtk_widget_hide(widget);
-}
-
-GtkWidget *sp_color_notebook_new()
-{
- SPColorNotebook *colorbook = SP_COLOR_NOTEBOOK(g_object_new (SP_TYPE_COLOR_NOTEBOOK, NULL));
-
- return GTK_WIDGET(colorbook);
-}
-
-ColorNotebook::ColorNotebook( SPColorSelector* csel )
- : ColorSelector( csel )
-{
- Page *page;
-
- page = new Page(new ColorScalesFactory(SP_COLOR_SCALES_MODE_RGB), true);
- _available_pages.push_back(page);
- page = new Page(new ColorScalesFactory(SP_COLOR_SCALES_MODE_HSV), true);
- _available_pages.push_back(page);
- page = new Page(new ColorScalesFactory(SP_COLOR_SCALES_MODE_CMYK), true);
- _available_pages.push_back(page);
- page = new Page(new ColorWheelSelectorFactory, true);
- _available_pages.push_back(page);
-#if defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2)
- page = new Page(new ColorICCSelectorFactory, true);
- _available_pages.push_back(page);
-#endif
-}
-
-SPColorSelector* ColorNotebook::getCurrentSelector()
-{
- SPColorSelector* csel = NULL;
- gint current_page = gtk_notebook_get_current_page (GTK_NOTEBOOK (_book));
-
- if ( current_page >= 0 )
- {
- GtkWidget* widget = gtk_notebook_get_nth_page (GTK_NOTEBOOK (_book), current_page);
- if ( SP_IS_COLOR_SELECTOR (widget) )
- {
- csel = SP_COLOR_SELECTOR (widget);
+ for(gint i = 0; i < gtk_notebook_get_n_pages (GTK_NOTEBOOK (nb->_book)); i++) {
+ if (nb->_buttons[i] == widget) {
+ gtk_notebook_set_current_page (GTK_NOTEBOOK (nb->_book), i);
}
}
-
- return csel;
}
-ColorNotebook::Page::Page(Inkscape::UI::ColorSelectorFactory *selector_factory, bool enabled_full)
- : selector_factory(selector_factory)
- , enabled_full(enabled_full)
-{
+void ColorNotebook::_onSelectedColorChanged() {
+ _updateICCButtons();
}
-void ColorNotebook::_colorChanged()
+void ColorNotebook::_onPageSwitched(GtkNotebook *notebook,
+ GtkWidget *page,
+ guint page_num,
+ ColorNotebook *colorbook)
{
- _updating = true;
- _selected_color.setColorAlpha(_color, _alpha, true);
- _updating = false;
-
- SPColorSelector* cselPage = getCurrentSelector();
- if ( cselPage )
- {
- cselPage->base->setColorAlpha( _color, _alpha );
+ if (colorbook) {
+ // remember the page we switched to
+ Inkscape::Preferences *prefs = Inkscape::Preferences::get();
+ prefs->setInt("/colorselector/page", page_num);
}
}
-void ColorNotebook::_picker_clicked(GtkWidget * /*widget*/, SPColorNotebook * /*colorbook*/)
-{
- // Set the dropper into a "one click" mode, so it reverts to the previous tool after a click
- Inkscape::Preferences *prefs = Inkscape::Preferences::get();
- prefs->setBool("/tools/dropper/onetimepick", true);
- Inkscape::UI::Tools::sp_toggle_dropper(SP_ACTIVE_DESKTOP);
-}
// TODO pass in param so as to avoid the need for SP_ACTIVE_DOCUMENT
-void ColorNotebook::_updateRgbaEntry( const SPColor& color, gfloat alpha )
+void ColorNotebook::_updateICCButtons()
{
+ SPColor color = _selected_color.color();
+ gfloat alpha = _selected_color.alpha();
+
g_return_if_fail( ( 0.0 <= alpha ) && ( alpha <= 1.0 ) );
#if defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2)
@@ -516,119 +397,7 @@ void ColorNotebook::_setCurrentPage(int i)
}
}
-void ColorNotebook::_buttonClicked(GtkWidget *widget, SPColorNotebook *colorbook)
-{
- ColorNotebook* nb = dynamic_cast<ColorNotebook*>(SP_COLOR_SELECTOR(colorbook)->base);
-
- if (!gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(widget))) {
- return;
- }
-
- for(gint i = 0; i < gtk_notebook_get_n_pages (GTK_NOTEBOOK (nb->_book)); i++) {
- if (nb->_buttons[i] == widget) {
- gtk_notebook_set_current_page (GTK_NOTEBOOK (nb->_book), i);
- }
- }
-}
-
-void ColorNotebook::_entryGrabbed (SPColorSelector *, SPColorNotebook *colorbook)
-{
- ColorNotebook* nb = dynamic_cast<ColorNotebook*>(SP_COLOR_SELECTOR(colorbook)->base);
- nb->_grabbed();
-}
-
-void ColorNotebook::_entryDragged (SPColorSelector *csel, SPColorNotebook *colorbook)
-{
- gboolean oldState;
- ColorNotebook* nb = dynamic_cast<ColorNotebook*>(SP_COLOR_SELECTOR(colorbook)->base);
-
- oldState = nb->_dragging;
-
- nb->_dragging = TRUE;
- nb->_entryModified( csel, colorbook );
-
- nb->_dragging = oldState;
-}
-
-void ColorNotebook::_entryReleased (SPColorSelector *, SPColorNotebook *colorbook)
-{
- ColorNotebook* nb = dynamic_cast<ColorNotebook*>(SP_COLOR_SELECTOR(colorbook)->base);
- nb->_released();
-}
-
-void ColorNotebook::_entryChanged (SPColorSelector *csel, SPColorNotebook *colorbook)
-{
- gboolean oldState;
- ColorNotebook* nb = dynamic_cast<ColorNotebook*>(SP_COLOR_SELECTOR(colorbook)->base);
-
- oldState = nb->_dragging;
-
- nb->_dragging = FALSE;
- nb->_entryModified( csel, colorbook );
-
- nb->_dragging = oldState;
-}
-
-void ColorNotebook::_entryModified (SPColorSelector *csel, SPColorNotebook *colorbook)
-{
- g_return_if_fail (colorbook != NULL);
- g_return_if_fail (SP_IS_COLOR_NOTEBOOK (colorbook));
- g_return_if_fail (csel != NULL);
- g_return_if_fail (SP_IS_COLOR_SELECTOR (csel));
-
- ColorNotebook* nb = dynamic_cast<ColorNotebook*>(SP_COLOR_SELECTOR(colorbook)->base);
- SPColor color;
- gfloat alpha = 1.0;
-
- csel->base->getColorAlpha( color, alpha );
-
- nb->_updating = true;
- nb->_selected_color.setColorAlpha(color, alpha, true);
- nb->_updating = false;
- nb->_updateInternals( color, alpha, nb->_dragging );
-}
-
-void ColorNotebook::_onSelectedColorChanged() {
- if (_updating) {
- return;
- }
-
- SPColor color;
- gfloat alpha = 1.0;
-
- _updating = true;
- _selected_color.colorAlpha(color, alpha);
- _updateInternals(color, alpha, _dragging);
- _updating = false;
-}
-
-void ColorNotebook::_onSelectedColorDragged() {
- if (_updating) {
- return;
- }
- bool oldState = _dragging;
-
- _dragging = true;
- SPColor color;
- gfloat alpha = 1.0;
-
- _updating = true;
- _selected_color.colorAlpha(color, alpha);
- _updateInternals(color, alpha, true);
- _updating = false;
-
- _dragging = oldState;
-}
-
-void ColorNotebook::_onSelectedColorGrabbed() {
- _grabbed();
-}
-
-void ColorNotebook::_onSelectedColorReleased() {
- _released();
-}
-
-GtkWidget* ColorNotebook::_addPage(Page& page) {
+void ColorNotebook::_addPage(Page& page) {
Gtk::Widget *selector_widget;
selector_widget = page.selector_factory->createWidget(_selected_color);
@@ -648,20 +417,13 @@ GtkWidget* ColorNotebook::_addPage(Page& page) {
gtk_widget_show (_buttons[page_num]);
gtk_box_pack_start (GTK_BOX (_buttonbox), _buttons[page_num], TRUE, TRUE, 0);
- g_signal_connect (G_OBJECT (_buttons[page_num]), "clicked", G_CALLBACK (_buttonClicked), _csel);
-
- if (SP_IS_COLOR_SELECTOR(selector_widget->gobj())) {
- //Connect glib signals of non-refactored widgets
- g_signal_connect (selector_widget->gobj(), "grabbed", G_CALLBACK (_entryGrabbed), _csel);
- g_signal_connect (selector_widget->gobj(), "dragged", G_CALLBACK (_entryDragged), _csel);
- g_signal_connect (selector_widget->gobj(), "released", G_CALLBACK (_entryReleased), _csel);
- g_signal_connect (selector_widget->gobj(), "changed", G_CALLBACK (_entryChanged), _csel);
- }
+ g_signal_connect (G_OBJECT (_buttons[page_num]), "clicked", G_CALLBACK (_onButtonClicked), this);
}
-
- return selector_widget->gobj();
}
+}
+}
+}
/* Commented out: see comment at the bottom of the header file
diff --git a/src/ui/widget/color-notebook.h b/src/ui/widget/color-notebook.h
new file mode 100644
index 000000000..8b74f20f1
--- /dev/null
+++ b/src/ui/widget/color-notebook.h
@@ -0,0 +1,120 @@
+/**
+ * @file
+ * A notebook with RGB, CMYK, CMS, HSL, and Wheel pages
+ */
+/* Authors:
+ * Lauris Kaplinski <lauris@kaplinski.com>
+ * bulia byak <buliabyak@users.sf.net>
+ * Tomasz Boczkowski <penginsbacon@gmail.com> (c++-sification)
+ *
+ * Copyright (C) 2001-2014 Authors
+ *
+ * This code is in public domain
+ */
+#ifndef SEEN_SP_COLOR_NOTEBOOK_H
+#define SEEN_SP_COLOR_NOTEBOOK_H
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#if GLIBMM_DISABLE_DEPRECATED && HAVE_GLIBMM_THREADS_H
+#include <glibmm/threads.h>
+#endif
+
+#include <boost/ptr_container/ptr_vector.hpp>
+#include <gtk/gtk.h>
+#include <glib.h>
+#if GTK_CHECK_VERSION(3,0,0)
+#include <gtkmm/grid.h>
+#else
+#include <gtkmm/table.h>
+#endif
+
+#include "color.h"
+#include "ui/selected-color.h"
+
+namespace Inkscape {
+namespace UI {
+namespace Widget {
+
+class ColorNotebook
+#if GTK_CHECK_VERSION(3,0,0)
+ : public Gtk::Grid
+#else
+ : public Gtk::Table
+#endif
+{
+public:
+ ColorNotebook(SelectedColor &color);
+ virtual ~ColorNotebook();
+
+protected:
+ struct Page {
+ Page(Inkscape::UI::ColorSelectorFactory *selector_factory, bool enabled_full);
+
+ Inkscape::UI::ColorSelectorFactory *selector_factory;
+ bool enabled_full;
+ };
+
+ virtual void _initUI();
+ void _addPage(Page& page);
+
+ static void _onButtonClicked(GtkWidget *widget, ColorNotebook *colorbook);
+ static void _onPickerClicked(GtkWidget *widget, ColorNotebook *colorbook);
+ static void _onPageSwitched(GtkNotebook *notebook, GtkWidget *page,
+ guint page_num, ColorNotebook *colorbook);
+ virtual void _onSelectedColorChanged();
+
+ void _updateICCButtons();
+ void _setCurrentPage(int i);
+
+ Inkscape::UI::SelectedColor &_selected_color;
+ gulong _entryId;
+ GtkWidget *_book;
+ GtkWidget *_buttonbox;
+ GtkWidget **_buttons;
+ GtkWidget *_rgbal; /* RGBA entry */
+#if defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2)
+ GtkWidget *_box_outofgamut, *_box_colormanaged, *_box_toomuchink;
+#endif //defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2)
+ GtkWidget *_btn_picker;
+ GtkWidget *_p; /* Color preview */
+ boost::ptr_vector<Page> _available_pages;
+
+private:
+ // By default, disallow copy constructor and assignment operator
+ ColorNotebook( const ColorNotebook& obj );
+ ColorNotebook& operator=( const ColorNotebook& obj );
+
+ /* Following methods support the pop-up menu to choose
+ * active color selectors (notebook tabs). This function
+ * is not used in Inkscape. If you want to re-enable it you have to
+ * * port the code to c++
+ * * fix it so it remembers its settings in prefs
+ * * fix it so it does not take that much space (entire vertical column!)
+ * Current class design supports dynamic addtion and removal of color selectors
+ *
+ GtkWidget* addPage( GType page_type, guint submode );
+ void removePage( GType page_type, guint submode );
+ GtkWidget* getPage( GType page_type, guint submode );
+ gint menuHandler( GdkEvent* event );
+
+ */
+};
+
+}
+}
+}
+#endif // SEEN_SP_COLOR_NOTEBOOK_H
+/*
+ Local Variables:
+ mode:c++
+ c-file-style:"stroustrup"
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
+ indent-tabs-mode:nil
+ fill-column:99
+ End:
+*/
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :
+
diff --git a/src/ui/widget/color-picker.cpp b/src/ui/widget/color-picker.cpp
index d4c4d394e..a66fbfc9c 100644
--- a/src/ui/widget/color-picker.cpp
+++ b/src/ui/widget/color-picker.cpp
@@ -17,7 +17,7 @@
#include "document-undo.h"
#include "ui/dialog-events.h"
-#include "widgets/sp-color-notebook.h"
+#include "ui/widget/color-notebook.h"
#include "verbs.h"
@@ -27,8 +27,6 @@ namespace Inkscape {
namespace UI {
namespace Widget {
-void sp_color_picker_color_mod(SPColorSelector *csel, GObject *cp);
-
ColorPicker::ColorPicker (const Glib::ustring& title, const Glib::ustring& tip,
guint32 rgba, bool undo)
: _preview(rgba), _title(title), _rgba(rgba), _undo(undo),
@@ -39,12 +37,15 @@ ColorPicker::ColorPicker (const Glib::ustring& title, const Glib::ustring& tip,
_preview.show();
add (_preview);
set_tooltip_text (tip);
+
+ _selected_color.signal_changed.connect(sigc::mem_fun(this, &ColorPicker::_onSelectedColorChanged));
+ _selected_color.signal_dragged.connect(sigc::mem_fun(this, &ColorPicker::_onSelectedColorChanged));
+ _selected_color.signal_released.connect(sigc::mem_fun(this, &ColorPicker::_onSelectedColorChanged));
}
ColorPicker::~ColorPicker()
{
closeWindow();
- _colorSelector = NULL;
}
void ColorPicker::setupDialog(const Glib::ustring &title)
@@ -55,25 +56,17 @@ void ColorPicker::setupDialog(const Glib::ustring &title)
_colorSelectorDialog.hide();
_colorSelectorDialog.set_title (title);
_colorSelectorDialog.set_border_width (4);
- _colorSelector = SP_COLOR_SELECTOR(sp_color_selector_new(SP_TYPE_COLOR_NOTEBOOK));
+
+ _color_selector = Gtk::manage(new ColorNotebook(_selected_color));
#if WITH_GTKMM_3_0
_colorSelectorDialog.get_content_area()->pack_start (
- *Glib::wrap(&_colorSelector->vbox), true, true, 0);
+ *_color_selector, true, true, 0);
#else
_colorSelectorDialog.get_vbox()->pack_start (
- *Glib::wrap(&_colorSelector->vbox), true, true, 0);
+ *_color_selector, true, true, 0);
#endif
-
- g_signal_connect(G_OBJECT(_colorSelector), "dragged",
- G_CALLBACK(sp_color_picker_color_mod), (void *)this);
- g_signal_connect(G_OBJECT(_colorSelector), "released",
- G_CALLBACK(sp_color_picker_color_mod), (void *)this);
- g_signal_connect(G_OBJECT(_colorSelector), "changed",
- G_CALLBACK(sp_color_picker_color_mod), (void *)this);
-
- gtk_widget_show(GTK_WIDGET(_colorSelector));
-
+ _color_selector->show();
}
void ColorPicker::setRgba32 (guint32 rgba)
@@ -82,11 +75,11 @@ void ColorPicker::setRgba32 (guint32 rgba)
_preview.setRgba32 (rgba);
_rgba = rgba;
- if (_colorSelector)
+ if (_color_selector)
{
- SPColor color;
- color.set( rgba );
- _colorSelector->base->setColorAlpha(color, SP_RGBA32_A_F(rgba));
+ _updating = true;
+ _selected_color.setValue(rgba);
+ _updating = false;
}
}
@@ -97,11 +90,11 @@ void ColorPicker::closeWindow()
void ColorPicker::on_clicked()
{
- if (_colorSelector)
+ if (_color_selector)
{
- SPColor color;
- color.set( _rgba );
- _colorSelector->base->setColorAlpha(color, SP_RGBA32_A_F(_rgba));
+ _updating = true;
+ _selected_color.setValue(_rgba);
+ _updating = false;
}
_colorSelectorDialog.show();
}
@@ -110,34 +103,31 @@ void ColorPicker::on_changed (guint32)
{
}
-void sp_color_picker_color_mod(SPColorSelector *csel, GObject *cp)
-{
+void ColorPicker::_onSelectedColorChanged() {
+ if (_updating) {
+ return;
+ }
+
if (_in_use) {
return;
} else {
_in_use = true;
}
- SPColor color;
- float alpha = 0;
- csel->base->getColorAlpha(color, alpha);
- guint32 rgba = color.toRGBA32( alpha );
-
- ColorPicker *ptr = reinterpret_cast<ColorPicker *>(cp);
-
- (ptr->_preview).setRgba32 (rgba);
+ guint32 rgba = _selected_color.value();
+ _preview.setRgba32(rgba);
- if (ptr->_undo && SP_ACTIVE_DESKTOP)
+ if (_undo && SP_ACTIVE_DESKTOP) {
DocumentUndo::done(SP_ACTIVE_DESKTOP->getDocument(), SP_VERB_NONE,
/* TODO: annotate */ "color-picker.cpp:130");
+ }
- ptr->on_changed (rgba);
+ on_changed(rgba);
_in_use = false;
- ptr->_changed_signal.emit (rgba);
- ptr->_rgba = rgba;
+ _changed_signal.emit(rgba);
+ _rgba = rgba;
}
-
}//namespace Widget
}//namespace UI
}//namespace Inkscape
diff --git a/src/ui/widget/color-picker.h b/src/ui/widget/color-picker.h
index b4da5dbf2..49275a04c 100644
--- a/src/ui/widget/color-picker.h
+++ b/src/ui/widget/color-picker.h
@@ -26,6 +26,7 @@
#include <gtkmm/dialog.h>
#include <gtkmm/button.h>
#include <sigc++/sigc++.h>
+#include "ui/selected-color.h"
#include "ui/widget/color-preview.h"
struct SPColorSelector;
@@ -57,7 +58,7 @@ public:
protected:
- friend void sp_color_picker_color_mod(SPColorSelector *csel, GObject *cp);
+ void _onSelectedColorChanged();
virtual void on_clicked();
virtual void on_changed (guint32);
@@ -67,13 +68,14 @@ protected:
sigc::signal<void,guint32> _changed_signal;
guint32 _rgba;
bool _undo;
-
+ bool _updating;
//Dialog
void setupDialog(const Glib::ustring &title);
//Inkscape::UI::Dialog::Dialog _colorSelectorDialog;
Gtk::Dialog _colorSelectorDialog;
- SPColorSelector *_colorSelector;
+ SelectedColor _selected_color;
+ Gtk::Widget *_color_selector;
};
}//namespace Widget
diff --git a/src/ui/widget/color-scales.cpp b/src/ui/widget/color-scales.cpp
index 9177185ce..1771644d1 100644
--- a/src/ui/widget/color-scales.cpp
+++ b/src/ui/widget/color-scales.cpp
@@ -182,11 +182,6 @@ void ColorScales::_initUI(SPColorScalesMode mode)
void ColorScales::_recalcColor( gboolean changing )
{
- if (_updating) {
- return;
- }
- _updating = true;
-
if ( changing )
{
SPColor color;
@@ -216,13 +211,12 @@ void ColorScales::_recalcColor( gboolean changing )
}
_color.preserveICC();
- _color.setColorAlpha(color, alpha, true);
+ _color.setColorAlpha(color, alpha);
}
else
{
// _updateInternals( _color, _alpha, _dragging );
}
- _updating = false;
}
/* Helpers for setting color value */
@@ -250,7 +244,7 @@ void ColorScales::_setRangeLimit( gdouble upper )
void ColorScales::_onColorChanged()
{
- if (_updating || !get_visible()) {
+ if (!get_visible()) {
return;
}
#ifdef DUMP_CHANGE_INFO
@@ -486,13 +480,11 @@ void ColorScales::_sliderAnyGrabbed()
if (_updating) {
return;
}
- _updating = true;
if (!_dragging) {
_dragging = TRUE;
_color.setHeld(true);
_recalcColor( FALSE );
}
- _updating = false;
}
void ColorScales::_sliderAnyReleased()
@@ -500,13 +492,11 @@ void ColorScales::_sliderAnyReleased()
if (_updating) {
return;
}
- _updating = true;
if (_dragging) {
_dragging = FALSE;
_color.setHeld(false);
_recalcColor( FALSE );
}
- _updating = false;
}
void ColorScales::_sliderAnyChanged()
@@ -519,7 +509,9 @@ void ColorScales::_sliderAnyChanged()
void ColorScales::_adjustmentChanged( ColorScales *scales, guint channel )
{
- if (scales->_updating) return;
+ if (scales->_updating) {
+ return;
+ }
scales->_updateSliders( (1 << channel) );
scales->_recalcColor (TRUE);
diff --git a/src/ui/widget/color-wheel-selector.cpp b/src/ui/widget/color-wheel-selector.cpp
index 968b834a8..e00fb2fab 100644
--- a/src/ui/widget/color-wheel-selector.cpp
+++ b/src/ui/widget/color-wheel-selector.cpp
@@ -176,10 +176,8 @@ void ColorWheelSelector::_colorChanged()
#ifdef DUMP_CHANGE_INFO
g_message("ColorWheelSelector::_colorChanged( this=%p, %f, %f, %f, %f)", this, _color.color().v.c[0], _color.color().v.c[1], _color.color().v.c[2], alpha );
#endif
- if (_updating) {
- return;
- }
+ bool oldval = _updating;
_updating = true;
{
float hsv[3] = {0,0,0};
@@ -195,7 +193,7 @@ void ColorWheelSelector::_colorChanged()
ColorScales::setScaled(_alpha_adjustment->gobj(), _color.alpha());
- _updating = false;
+ _updating = oldval;
}
void ColorWheelSelector::_adjustmentChanged()
@@ -203,7 +201,6 @@ void ColorWheelSelector::_adjustmentChanged()
if (_updating) {
return;
}
- _updating = true;
// TODO check this. It looks questionable:
// if a value is entered between 0 and 1 exclusive, normalize it to (int) 0..255 or 0..100
@@ -215,8 +212,6 @@ void ColorWheelSelector::_adjustmentChanged()
_color.preserveICC();
_color.setAlpha(ColorScales::getScaled(_alpha_adjustment->gobj()));
-
- _updating = false;
}
void ColorWheelSelector::_sliderGrabbed()
@@ -237,10 +232,8 @@ void ColorWheelSelector::_sliderChanged()
return;
}
- _updating = true;
_color.preserveICC();
_color.setAlpha(ColorScales::getScaled(_alpha_adjustment->gobj()));
- _updating = false;
}
void ColorWheelSelector::_wheelChanged(GimpColorWheel *wheel, ColorWheelSelector *wheelSelector)
@@ -248,7 +241,6 @@ void ColorWheelSelector::_wheelChanged(GimpColorWheel *wheel, ColorWheelSelector
if (wheelSelector->_updating){
return;
}
- wheelSelector->_updating = true;
gdouble h = 0;
gdouble s = 0;
@@ -270,8 +262,6 @@ void ColorWheelSelector::_wheelChanged(GimpColorWheel *wheel, ColorWheelSelector
wheelSelector->_color.setHeld(gimp_color_wheel_is_adjusting(wheel));
wheelSelector->_color.setColor(color);
-
- wheelSelector->_updating = false;
}
diff --git a/src/widgets/CMakeLists.txt b/src/widgets/CMakeLists.txt
index 91057d72b..a3e9e14d0 100644
--- a/src/widgets/CMakeLists.txt
+++ b/src/widgets/CMakeLists.txt
@@ -41,7 +41,6 @@ set(widgets_SRC
select-toolbar.cpp
shrink-wrap-button.cpp
sp-attribute-widget.cpp
- sp-color-notebook.cpp
sp-color-selector.cpp
sp-widget.cpp
sp-xmlview-attr-list.cpp
@@ -99,7 +98,6 @@ set(widgets_SRC
select-toolbar.h
shrink-wrap-button.h
sp-attribute-widget.h
- sp-color-notebook.h
sp-color-selector.h
sp-widget.h
sp-xmlview-attr-list.h
diff --git a/src/widgets/Makefile_insert b/src/widgets/Makefile_insert
index 00abf1265..f66be66ed 100644
--- a/src/widgets/Makefile_insert
+++ b/src/widgets/Makefile_insert
@@ -76,8 +76,6 @@ ink_common_sources += \
widgets/spiral-toolbar.h \
widgets/sp-attribute-widget.cpp \
widgets/sp-attribute-widget.h \
- widgets/sp-color-notebook.cpp \
- widgets/sp-color-notebook.h \
widgets/sp-color-selector.cpp \
widgets/sp-color-selector.h \
widgets/spinbutton-events.cpp \
diff --git a/src/widgets/gradient-selector.cpp b/src/widgets/gradient-selector.cpp
index 42e59cbfe..402f30846 100644
--- a/src/widgets/gradient-selector.cpp
+++ b/src/widgets/gradient-selector.cpp
@@ -17,6 +17,10 @@
# include "config.h"
#endif
+#if GLIBMM_DISABLE_DEPRECATED && HAVE_GLIBMM_THREADS_H
+#include <glibmm/threads.h>
+#endif
+
#include <gtkmm/treeview.h>
#include "gradient-vector.h"
diff --git a/src/widgets/gradient-vector.cpp b/src/widgets/gradient-vector.cpp
index d2c46ffec..31bd01719 100644
--- a/src/widgets/gradient-vector.cpp
+++ b/src/widgets/gradient-vector.cpp
@@ -31,17 +31,16 @@
#include "macros.h"
#include <glibmm/i18n.h>
#include <set>
-#include "widgets/gradient-image.h"
-#include "inkscape.h"
-#include "document-private.h"
-#include "gradient-chemistry.h"
-#include "helper/window.h"
+#include "../widgets/gradient-image.h"
+#include "../inkscape.h"
+#include "../document-private.h"
+#include "../gradient-chemistry.h"
+#include "../helper/window.h"
#include "io/resource.h"
#include "xml/repr.h"
-#include "ui/dialog-events.h"
-#include "preferences.h"
+#include "../preferences.h"
#include "svg/css-ostringstream.h"
#include "sp-stop.h"
#include "selection-chemistry.h"
@@ -51,10 +50,16 @@
#include "desktop.h"
#include "layer-manager.h"
-#include <sigc++/sigc++.h>
+#include <sigc++/functors/ptr_fun.h>
+#include <sigc++/adaptors/bind.h>
#include "document-undo.h"
+#include "ui/dialog-events.h"
+#include "ui/selected-color.h"
+#include "ui/widget/color-notebook.h"
+
using Inkscape::DocumentUndo;
+using Inkscape::UI::SelectedColor;
enum {
VECTOR_SET,
@@ -468,11 +473,10 @@ void SPGradientVectorSelector::setSwatched()
### Vector Editing Widget
##################################################################*/
-#include "widgets/sp-color-notebook.h"
#include "widgets/widget-sizes.h"
#include "xml/node-event-vector.h"
#include "svg/svg-color.h"
-
+#include "ui/widget/color-notebook.h"
#define PAD 4
@@ -491,8 +495,8 @@ static void sp_gradient_vector_widget_destroy(GtkObject *object, gpointer data);
static void sp_gradient_vector_gradient_release(SPObject *obj, GtkWidget *widget);
static void sp_gradient_vector_gradient_modified(SPObject *obj, guint flags, GtkWidget *widget);
-static void sp_gradient_vector_color_dragged(SPColorSelector *csel, GObject *object);
-static void sp_gradient_vector_color_changed(SPColorSelector *csel, GObject *object);
+static void sp_gradient_vector_color_dragged(Inkscape::UI::SelectedColor *selected_color, GObject *object);
+static void sp_gradient_vector_color_changed(Inkscape::UI::SelectedColor *selected_color, GObject *object);
static void update_stop_list( GtkWidget *vb, SPGradient *gradient, SPStop *new_stop);
static gboolean blocked = FALSE;
@@ -648,9 +652,11 @@ static void sp_grad_edit_combo_box_changed (GtkComboBox * /*widget*/, GtkWidget
blocked = TRUE;
- SPColorSelector *csel = static_cast<SPColorSelector*>(g_object_get_data(G_OBJECT(tbl), "cselector"));
+ SelectedColor *csel = static_cast<SelectedColor*>(g_object_get_data(G_OBJECT(tbl), "cselector"));
// set its color, from the stored array
- csel->base->setColorAlpha( stop->getEffectiveColor(), stop->opacity );
+ g_object_set_data(G_OBJECT(tbl), "updating_color", reinterpret_cast<void*>(1));
+ csel->setColorAlpha(stop->getEffectiveColor(), stop->opacity);
+ g_object_set_data(G_OBJECT(tbl), "updating_color", reinterpret_cast<void*>(0));
GtkWidget *offspin = GTK_WIDGET(g_object_get_data(G_OBJECT(tbl), "offspn"));
GtkWidget *offslide =GTK_WIDGET(g_object_get_data(G_OBJECT(tbl), "offslide"));
@@ -831,7 +837,9 @@ static void sp_grd_ed_del_stop(GtkWidget */*widget*/, GtkWidget *vb)
static GtkWidget * sp_gradient_vector_widget_new(SPGradient *gradient, SPStop *select_stop)
{
- GtkWidget *vb, *w, *f, *csel;
+ using Inkscape::UI::Widget::ColorNotebook;
+
+ GtkWidget *vb, *w, *f;
g_return_val_if_fail(!gradient || SP_IS_GRADIENT(gradient), NULL);
@@ -959,12 +967,23 @@ static GtkWidget * sp_gradient_vector_widget_new(SPGradient *gradient, SPStop *s
f = gtk_frame_new(_("Stop Color"));
gtk_widget_show(f);
gtk_box_pack_start(GTK_BOX(vb), f, TRUE, TRUE, PAD);
- csel = static_cast<GtkWidget*>(sp_color_selector_new(SP_TYPE_COLOR_NOTEBOOK));
- g_object_set_data(G_OBJECT(vb), "cselector", csel);
+
+ Inkscape::UI::SelectedColor *selected_color = new Inkscape::UI::SelectedColor;
+ g_object_set_data(G_OBJECT(vb), "cselector", selected_color);
+ g_object_set_data(G_OBJECT(vb), "updating_color", reinterpret_cast<void*>(0));
+ selected_color->signal_dragged.connect(sigc::bind(sigc::ptr_fun(&sp_gradient_vector_color_dragged), selected_color, G_OBJECT(vb)));
+ selected_color->signal_dragged.connect(sigc::bind(sigc::ptr_fun(&sp_gradient_vector_color_changed), selected_color, G_OBJECT(vb)));
+
+ Gtk::Widget *color_selector = Gtk::manage(new ColorNotebook(*selected_color));
+ color_selector->show();
+ gtk_container_add(GTK_CONTAINER(f), color_selector->gobj());
+
+ /*
gtk_widget_show(csel);
gtk_container_add(GTK_CONTAINER(f), csel);
g_signal_connect(G_OBJECT(csel), "dragged", G_CALLBACK(sp_gradient_vector_color_dragged), vb);
g_signal_connect(G_OBJECT(csel), "changed", G_CALLBACK(sp_gradient_vector_color_changed), vb);
+ */
gtk_widget_show(vb);
@@ -1125,9 +1144,11 @@ static void sp_gradient_vector_widget_load_gradient(GtkWidget *widget, SPGradien
}
// get the color selector
- SPColorSelector *csel = SP_COLOR_SELECTOR(g_object_get_data(G_OBJECT(widget), "cselector"));
+ SelectedColor *csel = static_cast<SelectedColor*>(g_object_get_data(G_OBJECT(widget), "cselector"));
- csel->base->setColorAlpha( stop->getEffectiveColor(), stop->opacity );
+ g_object_set_data(G_OBJECT(widget), "updating_color", reinterpret_cast<void*>(1));
+ csel->setColorAlpha(stop->getEffectiveColor(), stop->opacity);
+ g_object_set_data(G_OBJECT(widget), "updating_color", reinterpret_cast<void*>(0));
/* Fill preview */
GtkWidget *w = static_cast<GtkWidget *>(g_object_get_data(G_OBJECT(widget), "preview"));
@@ -1227,6 +1248,12 @@ static void sp_gradient_vector_widget_destroy(GtkObject *object, gpointer /*data
sp_repr_remove_listener_by_data(gradient->getRepr(), object);
}
}
+
+ SelectedColor *selected_color = static_cast<SelectedColor *>(g_object_get_data(G_OBJECT(object), "cselector"));
+ if (selected_color) {
+ delete selected_color;
+ g_object_set_data(G_OBJECT(object), "cselector", NULL);
+ }
}
static void sp_gradient_vector_gradient_release(SPObject */*object*/, GtkWidget *widget)
@@ -1244,7 +1271,7 @@ static void sp_gradient_vector_gradient_modified(SPObject *object, guint /*flags
}
}
-static void sp_gradient_vector_color_dragged(SPColorSelector *csel, GObject *object)
+static void sp_gradient_vector_color_dragged(Inkscape::UI::SelectedColor *selected_color, GObject *object)
{
SPGradient *gradient, *ngr;
@@ -1272,14 +1299,21 @@ static void sp_gradient_vector_color_dragged(SPColorSelector *csel, GObject *obj
return;
}
- csel->base->getColorAlpha(stop->specified_color, stop->opacity);
+ selected_color->colorAlpha(stop->specified_color, stop->opacity);
stop->currentColor = false;
blocked = FALSE;
}
-static void sp_gradient_vector_color_changed(SPColorSelector *csel, GObject *object)
+static void sp_gradient_vector_color_changed(Inkscape::UI::SelectedColor *selected_color, GObject *object)
{
+ (void)selected_color;
+
+ void* updating_color = g_object_get_data(G_OBJECT(object), "updating_color");
+ if (updating_color) {
+ return;
+ }
+
if (blocked) {
return;
}
@@ -1308,10 +1342,10 @@ static void sp_gradient_vector_color_changed(SPColorSelector *csel, GObject *obj
return;
}
- csel = static_cast<SPColorSelector*>(g_object_get_data(G_OBJECT(object), "cselector"));
+ SelectedColor *csel = static_cast<SelectedColor *>(g_object_get_data(G_OBJECT(object), "cselector"));
SPColor color;
float alpha = 0;
- csel->base->getColorAlpha( color, alpha );
+ csel->colorAlpha(color, alpha);
sp_repr_set_css_double(stop->getRepr(), "offset", stop->offset);
Inkscape::CSSOStringStream os;
diff --git a/src/widgets/paint-selector.cpp b/src/widgets/paint-selector.cpp
index 00ad00941..a1a41985f 100644
--- a/src/widgets/paint-selector.cpp
+++ b/src/widgets/paint-selector.cpp
@@ -35,7 +35,6 @@
#include "widgets/widget-sizes.h"
#include "xml/repr.h"
-#include "sp-color-notebook.h"
#include "sp-linear-gradient.h"
#include "sp-radial-gradient.h"
#include "sp-mesh.h"
@@ -51,6 +50,7 @@
#include "io/sys.h"
#include "helper/stock-items.h"
#include "ui/icon-names.h"
+#include "ui/widget/color-notebook.h"
#include "paint-selector.h"
@@ -61,6 +61,7 @@
#include <gtk/gtk.h>
using Inkscape::Widgets::SwatchSelector;
+using Inkscape::UI::SelectedColor;
enum {
MODE_CHANGED,
@@ -295,8 +296,13 @@ sp_paint_selector_init(SPPaintSelector *psel)
/* Last used color */
- psel->color.set( 0.0, 0.0, 0.0 );
- psel->alpha = 1.0;
+ psel->selected_color = new SelectedColor;
+ psel->updating_color = false;
+
+ psel->selected_color->signal_grabbed.connect(sigc::mem_fun(psel, &SPPaintSelector::onSelectedColorGrabbed));
+ psel->selected_color->signal_grabbed.connect(sigc::mem_fun(psel, &SPPaintSelector::onSelectedColorDragged));
+ psel->selected_color->signal_grabbed.connect(sigc::mem_fun(psel, &SPPaintSelector::onSelectedColorReleased));
+ psel->selected_color->signal_grabbed.connect(sigc::mem_fun(psel, &SPPaintSelector::onSelectedColorChanged));
}
static void sp_paint_selector_dispose(GObject *object)
@@ -306,6 +312,11 @@ static void sp_paint_selector_dispose(GObject *object)
// clean up our long-living pattern menu
g_object_set_data(G_OBJECT(psel),"patternmenu",NULL);
+ if (psel->selected_color) {
+ delete psel->selected_color;
+ psel->selected_color = NULL;
+ }
+
if ((G_OBJECT_CLASS(sp_paint_selector_parent_class))->dispose)
(G_OBJECT_CLASS(sp_paint_selector_parent_class))->dispose(object);
}
@@ -441,7 +452,6 @@ void SPPaintSelector::setFillrule(FillRule fillrule)
void SPPaintSelector::setColorAlpha(SPColor const &color, float alpha)
{
g_return_if_fail( ( 0.0 <= alpha ) && ( alpha <= 1.0 ) );
- SPColorSelector *csel = 0;
/*
guint32 rgba = 0;
@@ -461,9 +471,10 @@ void SPPaintSelector::setColorAlpha(SPColor const &color, float alpha)
setMode(MODE_COLOR_RGB);
}
- csel = reinterpret_cast<SPColorSelector*>(g_object_get_data(G_OBJECT(selector), "color-selector"));
+ updating_color = true;
+ selected_color->setColorAlpha(color, alpha);
+ updating_color = false;
//rgba = color.toRGBA32( alpha );
- csel->base->setColorAlpha( color, alpha );
}
void SPPaintSelector::setSwatch(SPGradient *vector )
@@ -544,11 +555,7 @@ void SPPaintSelector::getGradientProperties( SPGradientUnits &units, SPGradientS
*/
void SPPaintSelector::getColorAlpha(SPColor &color, gfloat &alpha) const
{
- SPColorSelector *csel;
-
- csel = reinterpret_cast<SPColorSelector*>(g_object_get_data(G_OBJECT(selector), "color-selector"));
-
- csel->base->getColorAlpha( color, alpha );
+ selected_color->colorAlpha(color, alpha);
g_assert( ( 0.0 <= alpha )
&& ( alpha <= 1.0 ) );
@@ -636,69 +643,60 @@ sp_paint_selector_set_mode_none(SPPaintSelector *psel)
/* Color paint */
-static void sp_paint_selector_color_grabbed(SPColorSelector * /*csel*/, SPPaintSelector *psel)
-{
- g_signal_emit(G_OBJECT(psel), psel_signals[GRABBED], 0);
+void SPPaintSelector::onSelectedColorGrabbed() {
+ g_signal_emit(G_OBJECT(this), psel_signals[GRABBED], 0);
}
-static void sp_paint_selector_color_dragged(SPColorSelector * /*csel*/, SPPaintSelector *psel)
-{
- g_signal_emit(G_OBJECT(psel), psel_signals[DRAGGED], 0);
+void SPPaintSelector::onSelectedColorDragged() {
+ if (updating_color) {
+ return;
+ }
+ g_signal_emit(G_OBJECT(this), psel_signals[DRAGGED], 0);
}
-static void sp_paint_selector_color_released(SPColorSelector * /*csel*/, SPPaintSelector *psel)
-{
- g_signal_emit(G_OBJECT(psel), psel_signals[RELEASED], 0);
+void SPPaintSelector::onSelectedColorReleased() {
+ g_signal_emit(G_OBJECT(this), psel_signals[RELEASED], 0);
}
-static void
-sp_paint_selector_color_changed(SPColorSelector *csel, SPPaintSelector *psel)
-{
- csel->base->getColorAlpha( psel->color, psel->alpha );
-
- g_signal_emit(G_OBJECT(psel), psel_signals[CHANGED], 0);
+void SPPaintSelector::onSelectedColorChanged() {
+ if (updating_color) {
+ return;
+ }
+ g_signal_emit(G_OBJECT(this), psel_signals[CHANGED], 0);
}
static void sp_paint_selector_set_mode_color(SPPaintSelector *psel, SPPaintSelector::Mode /*mode*/)
{
- GtkWidget *csel;
+ using Inkscape::UI::Widget::ColorNotebook;
sp_paint_selector_set_style_buttons(psel, psel->solid);
gtk_widget_set_sensitive(psel->style, TRUE);
if ((psel->mode == SPPaintSelector::MODE_COLOR_RGB) || (psel->mode == SPPaintSelector::MODE_COLOR_CMYK)) {
/* Already have color selector */
- csel = GTK_WIDGET(g_object_get_data(G_OBJECT(psel->selector), "color-selector"));
+ // Do nothing
} else {
sp_paint_selector_clear_frame(psel);
/* Create new color selector */
/* Create vbox */
#if GTK_CHECK_VERSION(3,0,0)
- GtkWidget *vb = gtk_box_new(GTK_ORIENTATION_VERTICAL, 4);
- gtk_box_set_homogeneous(GTK_BOX(vb), FALSE);
+ GtkWidget *vb = gtk_box_new(GTK_ORIENTATION_VERTICAL, 4);
+ gtk_box_set_homogeneous(GTK_BOX(vb), FALSE);
#else
GtkWidget *vb = gtk_vbox_new(FALSE, 4);
#endif
gtk_widget_show(vb);
/* Color selector */
- csel = sp_color_selector_new( SP_TYPE_COLOR_NOTEBOOK );
- gtk_widget_show(csel);
- g_object_set_data(G_OBJECT(vb), "color-selector", csel);
- gtk_box_pack_start(GTK_BOX(vb), csel, TRUE, TRUE, 0);
- g_signal_connect(G_OBJECT(csel), "grabbed", G_CALLBACK(sp_paint_selector_color_grabbed), psel);
- g_signal_connect(G_OBJECT(csel), "dragged", G_CALLBACK(sp_paint_selector_color_dragged), psel);
- g_signal_connect(G_OBJECT(csel), "released", G_CALLBACK(sp_paint_selector_color_released), psel);
- g_signal_connect(G_OBJECT(csel), "changed", G_CALLBACK(sp_paint_selector_color_changed), psel);
+ Gtk::Widget *color_selector = Gtk::manage(new ColorNotebook(*(psel->selected_color)));
+ color_selector->show();
+ gtk_box_pack_start(GTK_BOX(vb), color_selector->gobj(), TRUE, TRUE, 0);
+
/* Pack everything to frame */
gtk_container_add(GTK_CONTAINER(psel->frame), vb);
psel->selector = vb;
-
- /* Set color */
- SP_COLOR_SELECTOR( csel )->base->setColorAlpha( psel->color, psel->alpha );
-
}
gtk_label_set_markup(GTK_LABEL(psel->label), _("<b>Flat color</b>"));
@@ -710,22 +708,22 @@ static void sp_paint_selector_set_mode_color(SPPaintSelector *psel, SPPaintSelec
/* Gradient */
-static void sp_paint_selector_gradient_grabbed(SPColorSelector * /*csel*/, SPPaintSelector *psel)
+static void sp_paint_selector_gradient_grabbed(SPGradientSelector * /*csel*/, SPPaintSelector *psel)
{
g_signal_emit(G_OBJECT(psel), psel_signals[GRABBED], 0);
}
-static void sp_paint_selector_gradient_dragged(SPColorSelector * /*csel*/, SPPaintSelector *psel)
+static void sp_paint_selector_gradient_dragged(SPGradientSelector * /*csel*/, SPPaintSelector *psel)
{
g_signal_emit(G_OBJECT(psel), psel_signals[DRAGGED], 0);
}
-static void sp_paint_selector_gradient_released(SPColorSelector * /*csel*/, SPPaintSelector *psel)
+static void sp_paint_selector_gradient_released(SPGradientSelector * /*csel*/, SPPaintSelector *psel)
{
g_signal_emit(G_OBJECT(psel), psel_signals[RELEASED], 0);
}
-static void sp_paint_selector_gradient_changed(SPColorSelector * /*csel*/, SPPaintSelector *psel)
+static void sp_paint_selector_gradient_changed(SPGradientSelector * /*csel*/, SPPaintSelector *psel)
{
g_signal_emit(G_OBJECT(psel), psel_signals[CHANGED], 0);
}
diff --git a/src/widgets/paint-selector.h b/src/widgets/paint-selector.h
index 788aa673e..0e8a2967d 100644
--- a/src/widgets/paint-selector.h
+++ b/src/widgets/paint-selector.h
@@ -12,12 +12,22 @@
*
*/
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#if GLIBMM_DISABLE_DEPRECATED && HAVE_GLIBMM_THREADS_H
+#include <glibmm/threads.h>
+#endif
+
+#include <glib.h>
#include <gtk/gtk.h>
#include "color.h"
#include "fill-or-stroke.h"
#include "sp-gradient-spread.h"
#include "sp-gradient-units.h"
+#include "ui/selected-color.h"
class SPGradient;
class SPDesktop;
@@ -83,9 +93,8 @@ struct SPPaintSelector {
GtkWidget *frame, *selector;
GtkWidget *label;
- SPColor color;
- float alpha;
-
+ Inkscape::UI::SelectedColor *selected_color;
+ bool updating_color;
static Mode getModeForStyle(SPStyle const & style, FillOrStroke kind);
@@ -114,6 +123,11 @@ struct SPPaintSelector {
// TODO move this elsewhere:
void setFlatColor( SPDesktop *desktop, const gchar *color_property, const gchar *opacity_property );
+
+ void onSelectedColorGrabbed();
+ void onSelectedColorDragged();
+ void onSelectedColorReleased();
+ void onSelectedColorChanged();
};
enum {COMBO_COL_LABEL=0, COMBO_COL_STOCK=1, COMBO_COL_PATTERN=2, COMBO_COL_SEP=3, COMBO_N_COLS=4};
diff --git a/src/widgets/sp-color-notebook.h b/src/widgets/sp-color-notebook.h
deleted file mode 100644
index d25aba708..000000000
--- a/src/widgets/sp-color-notebook.h
+++ /dev/null
@@ -1,158 +0,0 @@
-#ifndef SEEN_SP_COLOR_NOTEBOOK_H
-#define SEEN_SP_COLOR_NOTEBOOK_H
-
-/*
- * A notebook with RGB, CMYK, CMS, HSL, and Wheel pages
- *
- * Author:
- * Lauris Kaplinski <lauris@kaplinski.com>
- *
- * Copyright (C) 2001-2002 Lauris Kaplinski
- *
- * This code is in public domain
- */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-#if GLIBMM_DISABLE_DEPRECATED && HAVE_GLIBMM_THREADS_H
-#include <glibmm/threads.h>
-#endif
-
-#include <boost/ptr_container/ptr_vector.hpp>
-#include <gtk/gtk.h>
-#include <glib.h>
-#include <gtkmm/table.h>
-
-#include "../color.h"
-#include "sp-color-selector.h"
-#include "ui/selected-color.h"
-
-
-struct SPColorNotebook;
-
-class ColorNotebook: public ColorSelector
-{
-public:
- ColorNotebook( SPColorSelector* csel );
- virtual ~ColorNotebook();
-
- virtual void init();
-
- SPColorSelector* getCurrentSelector();
- void switchPage( GtkNotebook *notebook, GtkWidget *page, guint page_num );
-
-protected:
- struct Page {
- Page(Inkscape::UI::ColorSelectorFactory *selector_factory, bool enabled_full);
-
- Inkscape::UI::ColorSelectorFactory *selector_factory;
- bool enabled_full;
- };
-
-protected:
- static void _rgbaEntryChangedHook( GtkEntry* entry, SPColorNotebook *colorbook );
- static void _entryGrabbed( SPColorSelector *csel, SPColorNotebook *colorbook );
- static void _entryDragged( SPColorSelector *csel, SPColorNotebook *colorbook );
- static void _entryReleased( SPColorSelector *csel, SPColorNotebook *colorbook );
- static void _entryChanged( SPColorSelector *csel, SPColorNotebook *colorbook );
- static void _entryModified( SPColorSelector *csel, SPColorNotebook *colorbook );
- static void _buttonClicked(GtkWidget *widget, SPColorNotebook *colorbook);
- static void _picker_clicked(GtkWidget *widget, SPColorNotebook *colorbook);
-
- virtual void _colorChanged();
-
- virtual void _onSelectedColorChanged();
- virtual void _onSelectedColorDragged();
- virtual void _onSelectedColorGrabbed();
- virtual void _onSelectedColorReleased();
-
- void _updateRgbaEntry( const SPColor& color, gfloat alpha );
- void _setCurrentPage(int i);
-
- GtkWidget* _addPage(Page& page);
-
- Inkscape::UI::SelectedColor _selected_color;
- gboolean _updating : 1;
- gboolean _updatingrgba : 1;
- gboolean _dragging : 1;
- gulong _switchId;
- gulong _entryId;
- GtkWidget *_book;
- GtkWidget *_buttonbox;
- GtkWidget **_buttons;
- GtkWidget *_rgbal; /* RGBA entry */
-#if defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2)
- GtkWidget *_box_outofgamut, *_box_colormanaged, *_box_toomuchink;
-#endif //defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2)
- GtkWidget *_btn_picker;
- GtkWidget *_p; /* Color preview */
- boost::ptr_vector<Page> _available_pages;
-
-private:
- // By default, disallow copy constructor and assignment operator
- ColorNotebook( const ColorNotebook& obj );
- ColorNotebook& operator=( const ColorNotebook& obj );
-
- /* Following methods support the pop-up menu to choose
- * active color selectors (notebook tabs). This function
- * is not used in Inkscape. If you want to re-enable it you have to
- * * port the code to c++
- * * fix it so it remembers its settings in prefs
- * * fix it so it does not take that much space (entire vertical column!)
- * Current class design supports dynamic addtion and removal of color selectors
- *
- GtkWidget* addPage( GType page_type, guint submode );
- void removePage( GType page_type, guint submode );
- GtkWidget* getPage( GType page_type, guint submode );
- gint menuHandler( GdkEvent* event );
-
- */
-};
-
-
-
-
-
-#define SP_TYPE_COLOR_NOTEBOOK (sp_color_notebook_get_type ())
-#define SP_COLOR_NOTEBOOK(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), SP_TYPE_COLOR_NOTEBOOK, SPColorNotebook))
-#define SP_COLOR_NOTEBOOK_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), SP_TYPE_COLOR_NOTEBOOK, SPColorNotebookClass))
-#define SP_IS_COLOR_NOTEBOOK(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), SP_TYPE_COLOR_NOTEBOOK))
-#define SP_IS_COLOR_NOTEBOOK_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), SP_TYPE_COLOR_NOTEBOOK))
-
-struct SPColorNotebook {
- SPColorSelector parent; /* Parent */
-};
-
-struct SPColorNotebookClass {
- SPColorSelectorClass parent_class;
-
- void (* grabbed) (SPColorNotebook *rgbsel);
- void (* dragged) (SPColorNotebook *rgbsel);
- void (* released) (SPColorNotebook *rgbsel);
- void (* changed) (SPColorNotebook *rgbsel);
-};
-
-GType sp_color_notebook_get_type(void);
-
-GtkWidget *sp_color_notebook_new (void);
-
-/* void sp_color_notebook_set_mode (SPColorNotebook *csel, SPColorNotebookMode mode); */
-/* SPColorNotebookMode sp_color_notebook_get_mode (SPColorNotebook *csel); */
-
-
-
-#endif // SEEN_SP_COLOR_NOTEBOOK_H
-
-/*
- Local Variables:
- mode:c++
- c-file-style:"stroustrup"
- c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
- indent-tabs-mode:nil
- fill-column:99
- End:
-*/
-// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :
-
diff --git a/src/widgets/swatch-selector.cpp b/src/widgets/swatch-selector.cpp
index 7178ad072..6f2807255 100644
--- a/src/widgets/swatch-selector.cpp
+++ b/src/widgets/swatch-selector.cpp
@@ -5,11 +5,11 @@
#include "document-undo.h"
#include "gradient-chemistry.h"
#include "gradient-selector.h"
-#include "sp-color-notebook.h"
#include "sp-stop.h"
#include "svg/css-ostringstream.h"
#include "svg/svg-color.h"
#include "verbs.h"
+#include "ui/widget/color-notebook.h"
#include "xml/node.h"
namespace Inkscape
@@ -20,8 +20,10 @@ namespace Widgets
SwatchSelector::SwatchSelector() :
Gtk::VBox(),
_gsel(0),
- _csel(0)
+ _updating_color(false)
{
+ using Inkscape::UI::Widget::ColorNotebook;
+
GtkWidget *gsel = sp_gradient_selector_new();
_gsel = SP_GRADIENT_SELECTOR(gsel);
g_object_set_data( G_OBJECT(gobj()), "base", this );
@@ -31,27 +33,18 @@ SwatchSelector::SwatchSelector() :
pack_start(*Gtk::manage(Glib::wrap(gsel)));
+ Gtk::Widget *color_selector = Gtk::manage(new ColorNotebook(_selected_color));
+ color_selector->show();
+ pack_start(*color_selector);
- GtkWidget *csel = sp_color_selector_new( SP_TYPE_COLOR_NOTEBOOK );
- _csel = SP_COLOR_SELECTOR(csel);
- Gtk::Widget *wrappedCSel = Glib::wrap(csel);
- wrappedCSel->show();
- //gtk_widget_show(csel);
-
-
- GObject *obj = G_OBJECT(csel);
-
- g_signal_connect(obj, "grabbed", G_CALLBACK(_grabbedCb), this);
- g_signal_connect(obj, "dragged", G_CALLBACK(_draggedCb), this);
- g_signal_connect(obj, "released", G_CALLBACK(_releasedCb), this);
- g_signal_connect(obj, "changed", G_CALLBACK(_changedCb), this);
-
- pack_start(*Gtk::manage(wrappedCSel));
+ _selected_color.signal_grabbed.connect(sigc::mem_fun(this, &SwatchSelector::_grabbedCb));
+ _selected_color.signal_dragged.connect(sigc::mem_fun(this, &SwatchSelector::_draggedCb));
+ _selected_color.signal_released.connect(sigc::mem_fun(this, &SwatchSelector::_releasedCb));
+ _selected_color.signal_changed.connect(sigc::mem_fun(this, &SwatchSelector::_changedCb));
}
SwatchSelector::~SwatchSelector()
{
- _csel = 0; // dtor should be handled by Gtk::manage()
_gsel = 0;
}
@@ -60,13 +53,13 @@ SPGradientSelector *SwatchSelector::getGradientSelector()
return _gsel;
}
-void SwatchSelector::_grabbedCb(SPColorSelector * /*csel*/, void * /*data*/)
+void SwatchSelector::_grabbedCb()
{
}
-void SwatchSelector::_draggedCb(SPColorSelector * /*csel*/, void *data)
+void SwatchSelector::_draggedCb()
{
- if (data) {
+ // if (data) {
//SwatchSelector *swsel = reinterpret_cast<SwatchSelector*>(data);
// TODO might have to block cycles
@@ -92,50 +85,46 @@ void SwatchSelector::_draggedCb(SPColorSelector * /*csel*/, void *data)
}
}
*/
- }
+ // }
}
-void SwatchSelector::_releasedCb(SPColorSelector * /*csel*/, void * /*data*/)
+void SwatchSelector::_releasedCb()
{
}
-void SwatchSelector::_changedCb(SPColorSelector */*csel*/, void *data)
+void SwatchSelector::_changedCb()
{
- if (data) {
- SwatchSelector *swsel = reinterpret_cast<SwatchSelector*>(data);
+ if (_updating_color) {
+ return;
+ }
+ // TODO might have to block cycles
+
+ if (_gsel && _gsel->getVector()) {
+ SPGradient *gradient = _gsel->getVector();
+ SPGradient *ngr = sp_gradient_ensure_vector_normalized(gradient);
+ if (ngr != gradient) {
+ /* Our master gradient has changed */
+ // TODO replace with proper - sp_gradient_vector_widget_load_gradient(GTK_WIDGET(swsel->_gsel), ngr);
+ }
- // TODO might have to block cycles
+ ngr->ensureVector();
- if (swsel->_gsel && swsel->_gsel->getVector()) {
- SPGradient *gradient = swsel->_gsel->getVector();
- SPGradient *ngr = sp_gradient_ensure_vector_normalized(gradient);
- if (ngr != gradient) {
- /* Our master gradient has changed */
- // TODO replace with proper - sp_gradient_vector_widget_load_gradient(GTK_WIDGET(swsel->_gsel), ngr);
- }
- ngr->ensureVector();
+ SPStop* stop = ngr->getFirstStop();
+ if (stop) {
+ SPColor color = _selected_color.color();
+ gfloat alpha = _selected_color.alpha();
+ guint32 rgb = color.toRGBA32( 0x00 );
+ // TODO replace with generic shared code that also handles icc-color
+ Inkscape::CSSOStringStream os;
+ gchar c[64];
+ sp_svg_write_color(c, sizeof(c), rgb);
+ os << "stop-color:" << c << ";stop-opacity:" << static_cast<gdouble>(alpha) <<";";
+ stop->getRepr()->setAttribute("style", os.str().c_str());
- SPStop* stop = ngr->getFirstStop();
- if (stop) {
- SPColor color;
- float alpha = 0;
- guint32 rgb = 0;
-
- swsel->_csel->base->getColorAlpha( color, alpha );
- rgb = color.toRGBA32( 0x00 );
-
- // TODO replace with generic shared code that also handles icc-color
- Inkscape::CSSOStringStream os;
- gchar c[64];
- sp_svg_write_color(c, sizeof(c), rgb);
- os << "stop-color:" << c << ";stop-opacity:" << static_cast<gdouble>(alpha) <<";";
- stop->getRepr()->setAttribute("style", os.str().c_str());
-
- DocumentUndo::done(ngr->document, SP_VERB_CONTEXT_GRADIENT,
- _("Change swatch color"));
- }
+ DocumentUndo::done(ngr->document, SP_VERB_CONTEXT_GRADIENT,
+ _("Change swatch color"));
}
}
}
@@ -173,11 +162,10 @@ void SwatchSelector::setVector(SPDocument */*doc*/, SPGradient *vector)
SPStop* stop = vector->getFirstStop();
guint32 const colorVal = stop->get_rgba32();
- _csel->base->setAlpha(SP_RGBA32_A_F(colorVal));
- SPColor color( SP_RGBA32_R_F(colorVal), SP_RGBA32_G_F(colorVal), SP_RGBA32_B_F(colorVal) );
- // set its color, from the stored array
- _csel->base->setColor( color );
- gtk_widget_show_all( GTK_WIDGET(_csel) );
+ _updating_color = true;
+ _selected_color.setValue(colorVal);
+ _updating_color = false;
+ // gtk_widget_show_all( GTK_WIDGET(_csel) );
} else {
//gtk_widget_hide( GTK_WIDGET(_csel) );
}
diff --git a/src/widgets/swatch-selector.h b/src/widgets/swatch-selector.h
index c8c9983a6..d447fff37 100644
--- a/src/widgets/swatch-selector.h
+++ b/src/widgets/swatch-selector.h
@@ -10,6 +10,7 @@
#endif
#include <gtkmm/box.h>
+#include "ui/selected-color.h"
class SPDocument;
class SPGradient;
@@ -37,13 +38,14 @@ public:
SPGradientSelector *getGradientSelector();
private:
- static void _grabbedCb(SPColorSelector *csel, void *data);
- static void _draggedCb(SPColorSelector *csel, void *data);
- static void _releasedCb(SPColorSelector *csel, void *data);
- static void _changedCb(SPColorSelector *csel, void *data);
+ void _grabbedCb();
+ void _draggedCb();
+ void _releasedCb();
+ void _changedCb();
SPGradientSelector *_gsel;
- SPColorSelector *_csel;
+ Inkscape::UI::SelectedColor _selected_color;
+ bool _updating_color;
};