summaryrefslogtreecommitdiffstats
path: root/src/widgets/sp-color-notebook.cpp
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 /src/widgets/sp-color-notebook.cpp
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)
Diffstat (limited to 'src/widgets/sp-color-notebook.cpp')
-rw-r--r--src/widgets/sp-color-notebook.cpp346
1 files changed, 126 insertions, 220 deletions
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++