summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTomasz Boczkowski <penginsbacon@gmail.com>2015-04-26 09:20:31 +0000
committerTomasz Boczkowski <penginsbacon@gmail.com>2015-04-26 09:20:31 +0000
commitae5c44bfac377f13a0031f3d4db3f7ea15fc939b (patch)
treefbd90c8e4ebb3eda625d88306b57f687766d9b10
parentmerged SPSelected color implementation from svgpaints branch (diff)
parentadded ColorEntry class, refactored SPColorNotebook to use it (diff)
downloadinkscape-ae5c44bfac377f13a0031f3d4db3f7ea15fc939b.tar.gz
inkscape-ae5c44bfac377f13a0031f3d4db3f7ea15fc939b.zip
merged SPNotebook c++-sification from svgpaints branch
(bzr r14059.1.5)
-rw-r--r--src/extension/param/parameter.cpp4
-rw-r--r--src/ui/selected-color.cpp32
-rw-r--r--src/ui/selected-color.h54
-rw-r--r--src/ui/widget/Makefile_insert2
-rw-r--r--src/ui/widget/color-entry.cpp115
-rw-r--r--src/ui/widget/color-entry.h59
-rw-r--r--src/widgets/sp-color-icc-selector.cpp2
-rw-r--r--src/widgets/sp-color-notebook.cpp346
-rw-r--r--src/widgets/sp-color-notebook.h54
-rw-r--r--src/widgets/sp-color-scales.cpp11
-rw-r--r--src/widgets/sp-color-selector.h8
-rw-r--r--src/widgets/sp-color-wheel-selector.cpp2
12 files changed, 426 insertions, 263 deletions
diff --git a/src/extension/param/parameter.cpp b/src/extension/param/parameter.cpp
index 202b8110f..b18525215 100644
--- a/src/extension/param/parameter.cpp
+++ b/src/extension/param/parameter.cpp
@@ -15,6 +15,10 @@
# include "config.h"
#endif
+#if GLIBMM_DISABLE_DEPRECATED && HAVE_GLIBMM_THREADS_H
+#include <glibmm/threads.h>
+#endif
+
#ifdef linux // does the dollar sign need escaping when passed as string parameter?
# define ESCAPE_DOLLAR_COMMANDLINE
#endif
diff --git a/src/ui/selected-color.cpp b/src/ui/selected-color.cpp
index 0da2139cd..fc702de83 100644
--- a/src/ui/selected-color.cpp
+++ b/src/ui/selected-color.cpp
@@ -26,7 +26,7 @@
namespace Inkscape {
namespace UI {
-double SelectedColor::_epsilon = 1e-4;
+double const SelectedColor::_EPSILON = 1e-4;
SelectedColor::SelectedColor()
: _color(0)
@@ -40,28 +40,28 @@ SelectedColor::~SelectedColor() {
}
-void SelectedColor::set_color(const SPColor& color)
+void SelectedColor::setColor(SPColor const &color)
{
- set_color_alpha( color, _alpha );
+ setColorAlpha( color, _alpha );
}
-SPColor SelectedColor::get_color() const
+SPColor SelectedColor::color() const
{
return _color;
}
-void SelectedColor::set_alpha(gfloat alpha)
+void SelectedColor::setAlpha(gfloat alpha)
{
g_return_if_fail( ( 0.0 <= alpha ) && ( alpha <= 1.0 ) );
- set_color_alpha( _color, alpha );
+ setColorAlpha( _color, alpha );
}
-gfloat SelectedColor::get_alpha() const
+gfloat SelectedColor::alpha() const
{
return _alpha;
}
-void SelectedColor::set_color_alpha(const SPColor& color, gfloat alpha, bool emit)
+void SelectedColor::setColorAlpha(SPColor const &color, gfloat alpha, bool emit)
{
#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));
@@ -77,8 +77,8 @@ void SelectedColor::set_color_alpha(const SPColor& color, gfloat alpha, bool emi
);
#endif
- if ( _virgin || !color.isClose( _color, _epsilon ) ||
- (fabs((_alpha) - (alpha)) >= _epsilon )) {
+ if ( _virgin || !color.isClose( _color, _EPSILON ) ||
+ (fabs((_alpha) - (alpha)) >= _EPSILON )) {
_virgin = false;
@@ -96,7 +96,7 @@ void SelectedColor::set_color_alpha(const SPColor& color, gfloat alpha, bool emi
}
}
-void SelectedColor::get_color_alpha(SPColor &color, gfloat &alpha) const {
+void SelectedColor::colorAlpha(SPColor &color, gfloat &alpha) const {
color = _color;
alpha = _alpha;
}
@@ -104,3 +104,13 @@ void SelectedColor::get_color_alpha(SPColor &color, gfloat &alpha) const {
}
}
+/*
+ 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/selected-color.h b/src/ui/selected-color.h
index db2f2f68c..08b84b66c 100644
--- a/src/ui/selected-color.h
+++ b/src/ui/selected-color.h
@@ -13,6 +13,14 @@
#ifndef SEEN_SELECTED_COLOR
#define SEEN_SELECTED_COLOR
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#if GLIBMM_DISABLE_DEPRECATED && HAVE_GLIBMM_THREADS_H
+#include <glibmm/threads.h>
+#endif
+
#include <sigc++/signal.h>
#include <gtkmm/widget.h>
#include "color.h"
@@ -25,47 +33,55 @@ public:
SelectedColor();
virtual ~SelectedColor();
- void set_color( const SPColor& color );
- SPColor get_color() const;
+ void setColor(SPColor const &color);
+ SPColor color() const;
- void set_alpha( gfloat alpha );
- gfloat get_alpha() const;
+ void setAlpha(gfloat alpha);
+ gfloat alpha() const;
- void set_color_alpha( const SPColor& color, gfloat alpha, bool emit = false );
- void get_color_alpha( SPColor &color, gfloat &alpha ) const;
+ void setColorAlpha(SPColor const &color, gfloat alpha, bool emit = false);
+ void colorAlpha(SPColor &color, gfloat &alpha) const;
sigc::signal<void> signal_changed;
private:
// By default, disallow copy constructor and assignment operator
- SelectedColor( const SelectedColor& obj );
- SelectedColor& operator=( const SelectedColor& obj );
+ SelectedColor(SelectedColor const &obj);
+ SelectedColor& operator=(SelectedColor const &obj);
- SPColor _color;
- /**
- * Color alpha value guaranteed to be in [0, 1].
- */
- gfloat _alpha;
+ SPColor _color;
+ /**
+ * Color alpha value guaranteed to be in [0, 1].
+ */
+ gfloat _alpha;
/**
* This flag is true if no color is set yet
*/
bool _virgin;
- static double _epsilon;
+ static double const _EPSILON;
};
-
class ColorSelectorFactory {
public:
- virtual ~ColorSelectorFactory() {}
+ virtual ~ColorSelectorFactory() {
+ }
- virtual Gtk::Widget* createWidget(SelectedColor& color) const = 0;
+ virtual Gtk::Widget* createWidget(SelectedColor &color) const = 0;
virtual Glib::ustring modeName() const = 0;
};
-
}
}
#endif
-
+/*
+ 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/Makefile_insert b/src/ui/widget/Makefile_insert
index 34438a3ac..b63d6b264 100644
--- a/src/ui/widget/Makefile_insert
+++ b/src/ui/widget/Makefile_insert
@@ -6,6 +6,8 @@ ink_common_sources += \
ui/widget/attr-widget.h \
ui/widget/button.h \
ui/widget/button.cpp \
+ ui/widget/color-entry.cpp \
+ ui/widget/color-entry.h \
ui/widget/color-picker.cpp \
ui/widget/color-picker.h \
ui/widget/color-preview.cpp \
diff --git a/src/ui/widget/color-entry.cpp b/src/ui/widget/color-entry.cpp
new file mode 100644
index 000000000..223c86fd3
--- /dev/null
+++ b/src/ui/widget/color-entry.cpp
@@ -0,0 +1,115 @@
+/** @file
+ * Entry widget for typing color value in css form
+ *//*
+ * Authors:
+ * Tomasz Boczkowski <penginsbacon@gmail.com>
+ *
+ * Copyright (C) 2014 Authors
+ * Released under GNU GPL, read the file 'COPYING' for more information
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#if GLIBMM_DISABLE_DEPRECATED && HAVE_GLIBMM_THREADS_H
+#include <glibmm/threads.h>
+#endif
+
+#include <iomanip>
+#include <glibmm/i18n.h>
+
+#include "color-entry.h"
+
+namespace Inkscape {
+namespace UI {
+namespace Widget {
+
+ColorEntry::ColorEntry(SelectedColor &color)
+ : _color(color)
+ , _updating(false)
+{
+ _color_changed_connection = color.signal_changed.connect(sigc::mem_fun(this, &ColorEntry::_onColorChanged));
+ _onColorChanged();
+
+ set_max_length(8);
+ set_width_chars(8);
+ set_tooltip_text(_("Hexadecimal RGBA value of the color"));
+}
+
+ColorEntry::~ColorEntry() {
+ _color_changed_connection.disconnect();
+}
+
+void ColorEntry::on_changed() {
+ if (_updating) {
+ return;
+ }
+
+ Glib::ustring text = get_text();
+ bool changed = false;
+
+ //Coerce the value format to eight hex digits
+ if (!text.empty() && text[0] == '#') {
+ changed = true;
+ text.erase(0, 1);
+ if (text.size() == 6) {
+ // it was a standard RGB hex
+ unsigned int alph = SP_COLOR_F_TO_U(_color.alpha());
+ Glib::ustring tmp = Glib::ustring::format(std::hex, std::setw(2), std::setfill(L'0'), alph);
+ text += tmp;
+ }
+ }
+
+ gchar* str = g_strdup(text.c_str());
+ gchar* end = 0;
+ guint64 rgba = g_ascii_strtoull(str, &end, 16);
+ if (end != str) {
+ ptrdiff_t len = end - str;
+ 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;
+ }
+ g_free(str);
+}
+
+
+void ColorEntry::_onColorChanged() {
+ if (_updating) {
+ return;
+ }
+
+ SPColor color = _color.color();
+ gdouble alpha = _color.alpha();
+
+ guint32 rgba = color.toRGBA32( alpha );
+ Glib::ustring text = Glib::ustring::format(std::hex, std::setw(8), std::setfill(L'0'), rgba);
+
+ Glib::ustring old_text = get_text();
+ if (old_text != text) {
+ _updating = true;
+ set_text(text);
+ _updating = false;
+ }
+}
+
+}
+}
+}
+/*
+ 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-entry.h b/src/ui/widget/color-entry.h
new file mode 100644
index 000000000..742324337
--- /dev/null
+++ b/src/ui/widget/color-entry.h
@@ -0,0 +1,59 @@
+/** @file
+ * Entry widget for typing color value in css form
+ *//*
+ * Authors:
+ * Tomasz Boczkowski <penginsbacon@gmail.com>
+ *
+ * Copyright (C) 2014 Authors
+ * Released under GNU GPL, read the file 'COPYING' for more information
+ */
+
+#ifndef SEEN_COLOR_ENTRY_H
+#define SEEN_COLOR_ENTRY_H_
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#if GLIBMM_DISABLE_DEPRECATED && HAVE_GLIBMM_THREADS_H
+#include <glibmm/threads.h>
+#endif
+
+#include <gtkmm/entry.h>
+#include "ui/selected-color.h"
+
+namespace Inkscape {
+namespace UI {
+namespace Widget {
+
+class ColorEntry: public Gtk::Entry {
+public:
+ ColorEntry(SelectedColor &color);
+ virtual ~ColorEntry();
+
+protected:
+ void on_changed();
+
+private:
+ void _onColorChanged();
+
+ SelectedColor &_color;
+ sigc::connection _color_changed_connection;
+ bool _updating;
+};
+
+}
+}
+}
+
+#endif
+/*
+ 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/sp-color-icc-selector.cpp b/src/widgets/sp-color-icc-selector.cpp
index bd7eb13f0..ce62cf3ea 100644
--- a/src/widgets/sp-color-icc-selector.cpp
+++ b/src/widgets/sp-color-icc-selector.cpp
@@ -1106,7 +1106,7 @@ void ColorICCSelectorImpl::_sliderChanged()
Gtk::Widget *ColorICCSelectorFactory::createWidget(Inkscape::UI::SelectedColor &color) const {
GtkWidget *w = sp_color_selector_new(SP_TYPE_COLOR_ICC_SELECTOR);
- Gtk::Widget *wrapped = Glib::wrap(w);
+ Gtk::Widget *wrapped = Gtk::manage(Glib::wrap(w));
return wrapped;
}
diff --git a/src/widgets/sp-color-notebook.cpp b/src/widgets/sp-color-notebook.cpp
index a0603adc2..4d628df66 100644
--- a/src/widgets/sp-color-notebook.cpp
+++ b/src/widgets/sp-color-notebook.cpp
@@ -28,6 +28,7 @@
#include <cstddef>
#include <gtk/gtk.h>
#include <glibmm/i18n.h>
+#include <gtkmm/label.h>
#include "ui/dialog-events.h"
#include "../preferences.h"
@@ -44,9 +45,12 @@
#include "cms-system.h"
#include "ui/tools-switch.h"
#include "ui/tools/tool-base.h"
+#include "ui/widget/color-entry.h"
using Inkscape::CMSSystem;
+using namespace Inkscape::UI::Widget;
+
struct SPColorNotebookTracker {
const gchar* name;
const gchar* className;
@@ -118,47 +122,6 @@ void ColorNotebook::switchPage(GtkNotebook*,
}
}
-static gint sp_color_notebook_menu_handler( GtkWidget *widget, GdkEvent *event )
-{
- if (event->type == GDK_BUTTON_PRESS)
- {
- SPColorSelector* csel = SP_COLOR_SELECTOR(widget);
- (dynamic_cast<ColorNotebook*>(csel->base))->menuHandler( event );
-
- /* Tell calling code that we have handled this event; the buck
- * stops here. */
- return TRUE;
- }
-
- /* Tell calling code that we have not handled this event; pass it on. */
- return FALSE;
-}
-
-gint ColorNotebook::menuHandler( GdkEvent* event )
-{
- GdkEventButton *bevent = (GdkEventButton *) event;
- gtk_menu_popup (GTK_MENU( _popup ), NULL, NULL, NULL, NULL,
- bevent->button, bevent->time);
- return TRUE;
-}
-
-static void sp_color_notebook_menuitem_response (GtkMenuItem *menuitem, gpointer user_data)
-{
- gboolean active = gtk_check_menu_item_get_active (GTK_CHECK_MENU_ITEM (menuitem));
- SPColorNotebookTracker *entry = reinterpret_cast< SPColorNotebookTracker* > (user_data);
- if ( entry )
- {
- if ( active )
- {
- (dynamic_cast<ColorNotebook*>(SP_COLOR_SELECTOR(entry->backPointer)->base))->addPage(entry->type, entry->submode);
- }
- else
- {
- (dynamic_cast<ColorNotebook*>(SP_COLOR_SELECTOR(entry->backPointer)->base))->removePage(entry->type, entry->submode);
- }
- }
-}
-
static void
sp_color_notebook_init (SPColorNotebook *colorbook)
{
@@ -173,28 +136,8 @@ sp_color_notebook_init (SPColorNotebook *colorbook)
void ColorNotebook::init()
{
guint row = 0;
- guint i = 0;
- guint j = 0;
- GType *selector_types = 0;
- guint selector_type_count = 0;
-
- /* tempory hardcoding to get types loaded */
- SP_TYPE_COLOR_SCALES;
- SP_TYPE_COLOR_WHEEL_SELECTOR;
-#if defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2)
- SP_TYPE_COLOR_ICC_SELECTOR;
-#endif // defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2)
-
- /* REJON: Comment out the next line to not use the normal GTK Color
- wheel. */
-// SP_TYPE_COLOR_GTKSELECTOR;
-
- _updating = FALSE;
- _updatingrgba = FALSE;
- _btn = 0;
- _popup = 0;
- _trackerList = g_ptr_array_new ();
+ _updating = false;
_book = gtk_notebook_new ();
gtk_widget_show (_book);
@@ -203,38 +146,6 @@ void ColorNotebook::init()
gtk_notebook_set_show_border (GTK_NOTEBOOK (_book), false);
gtk_notebook_set_show_tabs (GTK_NOTEBOOK (_book), false);
- selector_types = g_type_children (SP_TYPE_COLOR_SELECTOR, &selector_type_count);
-
- for ( i = 0; i < selector_type_count; i++ )
- {
- if (!g_type_is_a (selector_types[i], SP_TYPE_COLOR_NOTEBOOK))
- {
- guint howmany = 1;
- gpointer klass = g_type_class_ref (selector_types[i]);
- if ( klass && SP_IS_COLOR_SELECTOR_CLASS(klass) )
- {
- SPColorSelectorClass *ck = SP_COLOR_SELECTOR_CLASS (klass);
- howmany = MAX (1, ck->submode_count);
- for ( j = 0; j < howmany; j++ )
- {
- SPColorNotebookTracker *entry = reinterpret_cast< SPColorNotebookTracker* > (malloc(sizeof(SPColorNotebookTracker)));
- if ( entry )
- {
- memset( entry, 0, sizeof(SPColorNotebookTracker) );
- entry->name = ck->name[j];
- entry->type = selector_types[i];
- entry->submode = j;
- entry->enabledFull = TRUE;
- entry->enabledBrief = TRUE;
- entry->backPointer = SP_COLOR_NOTEBOOK(_csel);
-
- g_ptr_array_add (_trackerList, entry);
- }
- }
- }
- }
- }
-
#if GTK_CHECK_VERSION(3,0,0)
_buttonbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 2);
gtk_box_set_homogeneous(GTK_BOX(_buttonbox), TRUE);
@@ -243,16 +154,11 @@ void ColorNotebook::init()
#endif
gtk_widget_show (_buttonbox);
- _buttons = new GtkWidget *[_trackerList->len];
+ _buttons = new GtkWidget *[_available_pages.size()];
- for ( i = 0; i < _trackerList->len; i++ )
+ for (int i = 0; static_cast<size_t>(i) < _available_pages.size(); i++ )
{
- SPColorNotebookTracker *entry =
- reinterpret_cast< SPColorNotebookTracker* > (g_ptr_array_index (_trackerList, i));
- if ( entry )
- {
- addPage(entry->type, entry->submode);
- }
+ _addPage(_available_pages[i]);
}
#if GTK_CHECK_VERSION(3,0,0)
@@ -313,13 +219,15 @@ void ColorNotebook::init()
Inkscape::Preferences *prefs = Inkscape::Preferences::get();
_setCurrentPage(prefs->getInt("/colorselector/page", 0));
+
+ /* Commented out: see comment at the bottom of the header file
{
gboolean found = FALSE;
_popup = gtk_menu_new();
GtkMenu *menu = GTK_MENU (_popup);
- for ( i = 0; i < _trackerList->len; i++ )
+ for (int i = 0; i < _trackerList->len; i++ )
{
SPColorNotebookTracker *entry = reinterpret_cast< SPColorNotebookTracker* > (g_ptr_array_index (_trackerList, i));
if ( entry )
@@ -357,6 +265,7 @@ void ColorNotebook::init()
gtk_widget_set_sensitive (_btn, FALSE);
}
}
+ */
row++;
@@ -395,7 +304,6 @@ void ColorNotebook::init()
GtkWidget *picker = gtk_image_new_from_icon_name ("color-picker", GTK_ICON_SIZE_SMALL_TOOLBAR);
_btn_picker = gtk_button_new ();
gtk_button_set_relief(GTK_BUTTON(_btn_picker), GTK_RELIEF_NONE);
- gtk_widget_show (_btn);
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);
@@ -406,13 +314,10 @@ void ColorNotebook::init()
gtk_misc_set_alignment (GTK_MISC (_rgbal), 1.0, 0.5);
gtk_box_pack_start(GTK_BOX(rgbabox), _rgbal, TRUE, TRUE, 2);
- _rgbae = gtk_entry_new ();
- sp_dialog_defocus_on_enter (_rgbae);
- gtk_entry_set_max_length (GTK_ENTRY (_rgbae), 8);
- gtk_entry_set_width_chars (GTK_ENTRY (_rgbae), 8);
- gtk_widget_set_tooltip_text (_rgbae, _("Hexadecimal RGBA value of the color"));
- gtk_box_pack_start(GTK_BOX(rgbabox), _rgbae, FALSE, FALSE, 0);
- gtk_label_set_mnemonic_widget (GTK_LABEL(_rgbal), _rgbae);
+ ColorEntry* rgba_entry = Gtk::manage(new ColorEntry(_selected_color));
+ sp_dialog_defocus_on_enter (GTK_WIDGET(rgba_entry->gobj()));
+ gtk_box_pack_start(GTK_BOX(rgbabox), GTK_WIDGET(rgba_entry->gobj()), FALSE, FALSE, 0);
+ gtk_label_set_mnemonic_widget (GTK_LABEL(_rgbal), GTK_WIDGET(rgba_entry->gobj()));
sp_set_font_size_smaller (rgbabox);
gtk_widget_show_all (rgbabox);
@@ -446,7 +351,7 @@ void ColorNotebook::init()
_switchId = g_signal_connect(G_OBJECT (_book), "switch-page",
G_CALLBACK (sp_color_notebook_switch_page), SP_COLOR_NOTEBOOK(_csel));
- _entryId = g_signal_connect (G_OBJECT (_rgbae), "changed", G_CALLBACK (ColorNotebook::_rgbaEntryChangedHook), _csel);
+ _selected_color.signal_changed.connect(sigc::mem_fun(this, &ColorNotebook::_onSelectedColorChanged));
}
static void sp_color_notebook_dispose(GObject *object)
@@ -457,12 +362,6 @@ static void sp_color_notebook_dispose(GObject *object)
ColorNotebook::~ColorNotebook()
{
- if ( _trackerList )
- {
- g_ptr_array_free (_trackerList, TRUE);
- _trackerList = 0;
- }
-
if ( _switchId )
{
if ( _book )
@@ -501,6 +400,20 @@ GtkWidget *sp_color_notebook_new()
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()
@@ -520,15 +433,21 @@ SPColorSelector* ColorNotebook::getCurrentSelector()
return csel;
}
+ColorNotebook::Page::Page(Inkscape::UI::ColorSelectorFactory *selector_factory, bool enabled_full)
+ : selector_factory(selector_factory)
+ , enabled_full(enabled_full)
+{
+}
+
void ColorNotebook::_colorChanged()
{
+ _selected_color.setColorAlpha(_color, _alpha, true);
+
SPColorSelector* cselPage = getCurrentSelector();
if ( cselPage )
{
cselPage->base->setColorAlpha( _color, _alpha );
}
-
- _updateRgbaEntry( _color, _alpha );
}
void ColorNotebook::_picker_clicked(GtkWidget * /*widget*/, SPColorNotebook * /*colorbook*/)
@@ -539,52 +458,6 @@ void ColorNotebook::_picker_clicked(GtkWidget * /*widget*/, SPColorNotebook * /*
Inkscape::UI::Tools::sp_toggle_dropper(SP_ACTIVE_DESKTOP);
}
-void ColorNotebook::_rgbaEntryChangedHook(GtkEntry *entry, SPColorNotebook *colorbook)
-{
- (dynamic_cast<ColorNotebook*>(SP_COLOR_SELECTOR(colorbook)->base))->_rgbaEntryChanged( entry );
-}
-
-void ColorNotebook::_rgbaEntryChanged(GtkEntry* entry)
-{
- if (_updating) return;
- if (_updatingrgba) return;
-
- const gchar *t = gtk_entry_get_text( entry );
-
- if (t) {
- Glib::ustring text = t;
- bool changed = false;
- if (!text.empty() && text[0] == '#') {
- changed = true;
- text.erase(0,1);
- if (text.size() == 6) {
- // it was a standard RGB hex
- unsigned int alph = SP_COLOR_F_TO_U(_alpha);
- gchar* tmp = g_strdup_printf("%02x", alph);
- text += tmp;
- g_free(tmp);
- }
- }
- gchar* str = g_strdup(text.c_str());
- gchar* end = 0;
- guint64 rgba = g_ascii_strtoull( str, &end, 16 );
- if ( end != str ) {
- ptrdiff_t len = end - str;
- if ( len < 8 ) {
- rgba = rgba << ( 4 * ( 8 - len ) );
- }
- _updatingrgba = TRUE;
- if ( changed ) {
- gtk_entry_set_text( entry, str );
- }
- SPColor color( rgba );
- setColorAlpha( color, SP_RGBA32_A_F(rgba), true );
- _updatingrgba = FALSE;
- }
- g_free(str);
- }
-}
-
// TODO pass in param so as to avoid the need for SP_ACTIVE_DOCUMENT
void ColorNotebook::_updateRgbaEntry( const SPColor& color, gfloat alpha )
{
@@ -623,31 +496,13 @@ void ColorNotebook::_updateRgbaEntry( const SPColor& color, gfloat alpha )
}
}
#endif //defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2)
-
- if ( !_updatingrgba )
- {
- gchar s[32];
- guint32 rgba;
-
- /* Update RGBA entry */
- rgba = color.toRGBA32( alpha );
-
- g_snprintf (s, 32, "%08x", rgba);
- const gchar* oldText = gtk_entry_get_text( GTK_ENTRY( _rgbae ) );
- if ( strcmp( oldText, s ) != 0 )
- {
- g_signal_handler_block( _rgbae, _entryId );
- gtk_entry_set_text( GTK_ENTRY(_rgbae), s );
- g_signal_handler_unblock( _rgbae, _entryId );
- }
- }
}
void ColorNotebook::_setCurrentPage(int i)
{
gtk_notebook_set_current_page(GTK_NOTEBOOK(_book), i);
- if (_buttons && _trackerList && (static_cast<size_t>(i) < _trackerList->len) ) {
+ if (_buttons && (static_cast<size_t>(i) < _available_pages.size())) {
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(_buttons[i]), TRUE);
}
}
@@ -717,52 +572,60 @@ void ColorNotebook::_entryModified (SPColorSelector *csel, SPColorNotebook *colo
gfloat alpha = 1.0;
csel->base->getColorAlpha( color, alpha );
- nb->_updateRgbaEntry( color, alpha );
+
+ nb->_updating = true;
+ nb->_selected_color.setColorAlpha(color, alpha, true);
+ nb->_updating = false;
nb->_updateInternals( color, alpha, nb->_dragging );
}
-GtkWidget* ColorNotebook::addPage(GType page_type, guint submode)
-{
- GtkWidget *page;
+void ColorNotebook::_onSelectedColorChanged() {
+ if (_updating) {
+ return;
+ }
- page = sp_color_selector_new( page_type );
- if ( page )
- {
- GtkWidget* tab_label = 0;
- SPColorSelector* csel;
+ SPColor color;
+ gfloat alpha = 1.0;
- csel = SP_COLOR_SELECTOR (page);
- if ( submode > 0 )
- {
- csel->base->setSubmode( submode );
- }
- gtk_widget_show (page);
- int index = csel->base ? csel->base->getSubmode() : 0;
- const gchar* str = _(SP_COLOR_SELECTOR_GET_CLASS (csel)->name[index]);
-// g_message( "Hitting up for tab for '%s'", str );
- tab_label = gtk_label_new(_(str));
- gint pageNum = gtk_notebook_append_page( GTK_NOTEBOOK (_book), page, tab_label );
-
- // Add a button for each page
- _buttons[pageNum] = gtk_radio_button_new_with_label(NULL, _(str));
- gtk_toggle_button_set_mode(GTK_TOGGLE_BUTTON(_buttons[pageNum]), FALSE);
- if (pageNum > 0) {
+ _selected_color.colorAlpha(color, alpha);
+ _updateInternals(color, alpha, _dragging);
+}
+
+GtkWidget* ColorNotebook::_addPage(Page& page) {
+ Gtk::Widget *selector_widget;
+
+ selector_widget = page.selector_factory->createWidget(_selected_color);
+ if (selector_widget) {
+ selector_widget->show();
+
+ Glib::ustring mode_name = page.selector_factory->modeName();
+ Gtk::Widget* tab_label = Gtk::manage(new Gtk::Label(mode_name));
+ gint page_num = gtk_notebook_append_page( GTK_NOTEBOOK(_book), selector_widget->gobj(), tab_label->gobj());
+
+ _buttons[page_num] = gtk_radio_button_new_with_label(NULL, mode_name.c_str());
+ gtk_toggle_button_set_mode(GTK_TOGGLE_BUTTON(_buttons[page_num]), FALSE);
+ if (page_num > 0) {
GSList *group = gtk_radio_button_get_group (GTK_RADIO_BUTTON(_buttons[0]));
- gtk_radio_button_set_group (GTK_RADIO_BUTTON(_buttons[pageNum]), group);
+ gtk_radio_button_set_group (GTK_RADIO_BUTTON(_buttons[page_num]), group);
}
- gtk_widget_show (_buttons[pageNum]);
- gtk_box_pack_start (GTK_BOX (_buttonbox), _buttons[pageNum], TRUE, TRUE, 0);
-
- g_signal_connect (G_OBJECT (_buttons[pageNum]), "clicked", G_CALLBACK (_buttonClicked), _csel);
- g_signal_connect (G_OBJECT (page), "grabbed", G_CALLBACK (_entryGrabbed), _csel);
- g_signal_connect (G_OBJECT (page), "dragged", G_CALLBACK (_entryDragged), _csel);
- g_signal_connect (G_OBJECT (page), "released", G_CALLBACK (_entryReleased), _csel);
- g_signal_connect (G_OBJECT (page), "changed", G_CALLBACK (_entryChanged), _csel);
+ 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);
+
+ //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);
}
- return page;
+ return selector_widget->gobj();
}
+
+/* Commented out: see comment at the bottom of the header file
+
GtkWidget* ColorNotebook::getPage(GType page_type, guint submode)
{
gint count = 0;
@@ -818,6 +681,49 @@ void ColorNotebook::removePage( GType page_type, guint submode )
}
}
+
+static gint sp_color_notebook_menu_handler( GtkWidget *widget, GdkEvent *event )
+{
+ if (event->type == GDK_BUTTON_PRESS)
+ {
+ SPColorSelector* csel = SP_COLOR_SELECTOR(widget);
+ (dynamic_cast<ColorNotebook*>(csel->base))->menuHandler( event );
+
+ // Tell calling code that we have handled this event; the buck
+ // stops here.
+ return TRUE;
+ }
+
+ //Tell calling code that we have not handled this event; pass it on.
+ return FALSE;
+}
+
+gint ColorNotebook::menuHandler( GdkEvent* event )
+{
+ GdkEventButton *bevent = (GdkEventButton *) event;
+ gtk_menu_popup (GTK_MENU( _popup ), NULL, NULL, NULL, NULL,
+ bevent->button, bevent->time);
+ return TRUE;
+}
+
+static void sp_color_notebook_menuitem_response (GtkMenuItem *menuitem, gpointer user_data)
+{
+ gboolean active = gtk_check_menu_item_get_active (GTK_CHECK_MENU_ITEM (menuitem));
+ SPColorNotebookTracker *entry = reinterpret_cast< SPColorNotebookTracker* > (user_data);
+ if ( entry )
+ {
+ if ( active )
+ {
+ (dynamic_cast<ColorNotebook*>(SP_COLOR_SELECTOR(entry->backPointer)->base))->addPage(entry->type, entry->submode);
+ }
+ else
+ {
+ (dynamic_cast<ColorNotebook*>(SP_COLOR_SELECTOR(entry->backPointer)->base))->removePage(entry->type, entry->submode);
+ }
+ }
+}
+*/
+
/*
Local Variables:
mode:c++
diff --git a/src/widgets/sp-color-notebook.h b/src/widgets/sp-color-notebook.h
index 469bb56e8..dfadc0572 100644
--- a/src/widgets/sp-color-notebook.h
+++ b/src/widgets/sp-color-notebook.h
@@ -12,10 +12,23 @@
* This code is in public domain
*/
-#include "sp-color-selector.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>
+#include "../color.h"
+#include "sp-color-selector.h"
+#include "ui/selected-color.h"
+
+
struct SPColorNotebook;
class ColorNotebook: public ColorSelector
@@ -29,11 +42,13 @@ public:
SPColorSelector* getCurrentSelector();
void switchPage( GtkNotebook *notebook, GtkWidget *page, guint page_num );
- GtkWidget* addPage( GType page_type, guint submode );
- void removePage( GType page_type, guint submode );
- GtkWidget* getPage( GType page_type, guint submode );
+protected:
+ struct Page {
+ Page(Inkscape::UI::ColorSelectorFactory *selector_factory, bool enabled_full);
- gint menuHandler( GdkEvent* event );
+ Inkscape::UI::ColorSelectorFactory *selector_factory;
+ bool enabled_full;
+ };
protected:
static void _rgbaEntryChangedHook( GtkEntry* entry, SPColorNotebook *colorbook );
@@ -47,10 +62,14 @@ protected:
virtual void _colorChanged();
- void _rgbaEntryChanged( GtkEntry* entry );
+ virtual void _onSelectedColorChanged();
+
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;
@@ -59,24 +78,39 @@ protected:
GtkWidget *_book;
GtkWidget *_buttonbox;
GtkWidget **_buttons;
- GtkWidget *_rgbal, *_rgbae; /* RGBA entry */
+ 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 */
- GtkWidget *_btn;
- GtkWidget *_popup;
- GPtrArray *_trackerList;
+ 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))
diff --git a/src/widgets/sp-color-scales.cpp b/src/widgets/sp-color-scales.cpp
index 4ae202e32..a5f62a613 100644
--- a/src/widgets/sp-color-scales.cpp
+++ b/src/widgets/sp-color-scales.cpp
@@ -55,6 +55,7 @@ G_END_DECLS
#define noDUMP_CHANGE_INFO 1
const gchar* ColorScales::SUBMODE_NAMES[] = {
+ N_("None"),
N_("RGB"),
N_("HSL"),
N_("CMYK")
@@ -761,7 +762,15 @@ ColorScalesFactory::~ColorScalesFactory() {
Gtk::Widget *ColorScalesFactory::createWidget(Inkscape::UI::SelectedColor &color) const {
GtkWidget *w = sp_color_selector_new(SP_TYPE_COLOR_SCALES);
- Gtk::Widget *wrapped = Glib::wrap(w);
+ SPColorSelector* csel;
+
+ csel = SP_COLOR_SELECTOR (w);
+ if ( _submode > 0 )
+ {
+ csel->base->setSubmode( _submode - 1 );
+ }
+
+ Gtk::Widget *wrapped = Gtk::manage(Glib::wrap(w));
return wrapped;
}
diff --git a/src/widgets/sp-color-selector.h b/src/widgets/sp-color-selector.h
index 30061774a..308a5519c 100644
--- a/src/widgets/sp-color-selector.h
+++ b/src/widgets/sp-color-selector.h
@@ -1,6 +1,14 @@
#ifndef SEEN_SP_COLOR_SELECTOR_H
#define SEEN_SP_COLOR_SELECTOR_H
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#if GLIBMM_DISABLE_DEPRECATED && HAVE_GLIBMM_THREADS_H
+#include <glibmm/threads.h>
+#endif
+
#include <gtk/gtk.h>
#include "color.h"
diff --git a/src/widgets/sp-color-wheel-selector.cpp b/src/widgets/sp-color-wheel-selector.cpp
index 929902602..a155077a7 100644
--- a/src/widgets/sp-color-wheel-selector.cpp
+++ b/src/widgets/sp-color-wheel-selector.cpp
@@ -330,7 +330,7 @@ void ColorWheelSelector::_wheelChanged( GimpColorWheel *wheel, SPColorWheelSelec
Gtk::Widget *ColorWheelSelectorFactory::createWidget(Inkscape::UI::SelectedColor &color) const {
GtkWidget *w = sp_color_selector_new(SP_TYPE_COLOR_WHEEL_SELECTOR);
- Gtk::Widget *wrapped = Glib::wrap(w);
+ Gtk::Widget *wrapped = Gtk::manage(Glib::wrap(w));
return wrapped;
}