Code

guard callback, catch release event, set _rgba: fixes #1491876, #1492332
[inkscape.git] / src / ui / widget / color-picker.cpp
1 #define __COLOR_PICKER_C__
3 /** \file
4  * \brief  Color picker button & window
5  *
6  * Authors:
7  *   Lauris Kaplinski <lauris@kaplinski.com>
8  *   bulia byak <buliabyak@users.sf.net>
9  *   Ralf Stephan <ralf@ark.in-berlin.de>
10  *
11  * Copyright (C) Authors 2000-2005
12  *
13  * Released under GNU GPL, read the file 'COPYING' for more information
14  */
16 #include "inkscape.h"
17 #include "desktop-handles.h"
18 #include "document.h"
20 #include "widgets/sp-color-notebook.h"
22 #include "color-picker.h"
24 static bool _in_use = false;
26 namespace Inkscape {
27 namespace UI {
28 namespace Widget {
30 void sp_color_picker_color_mod(SPColorSelector *csel, GObject *cp);
32 ColorPicker::ColorPicker (const Glib::ustring& title, const Glib::ustring& tip,
33                           guint32 rgba, bool undo)
34           : _preview(rgba), _title(title), _rgba(rgba), _undo(undo),
35            _colorSelectorDialog("dialogs.colorpickerwindow")
36 {
37     setupDialog(title);
38     set_relief (Gtk::RELIEF_NONE);
39     _preview.show();
40     add (_preview);
41     _tt.set_tip (*this, tip);
42 }
44 ColorPicker::~ColorPicker()
45 {
46     closeWindow();
47     _colorSelector = NULL;
48 }
50 void
51 ColorPicker::setupDialog(const Glib::ustring &title)
52 {
53     _colorSelectorDialog.hide();
54     _colorSelectorDialog.set_title (title);
55     _colorSelectorDialog.set_border_width (4);
56     _colorSelector = (SPColorSelector*)sp_color_selector_new(SP_TYPE_COLOR_NOTEBOOK,
57                                   SP_COLORSPACE_TYPE_UNKNOWN);
58     _colorSelectorDialog.get_vbox()->pack_start (
59               *Glib::wrap(&_colorSelector->vbox), true, true, 0);
61     g_signal_connect(G_OBJECT(_colorSelector), "dragged",
62                          G_CALLBACK(sp_color_picker_color_mod), (void *)this);
63     g_signal_connect(G_OBJECT(_colorSelector), "released",
64                          G_CALLBACK(sp_color_picker_color_mod), (void *)this);
65     g_signal_connect(G_OBJECT(_colorSelector), "changed",
66                          G_CALLBACK(sp_color_picker_color_mod), (void *)this);
68     gtk_widget_show(GTK_WIDGET(_colorSelector));
70 }
75 void
76 ColorPicker::setRgba32 (guint32 rgba)
77 {
78     if (_in_use) return;
80     _preview.setRgba32 (rgba);
81     _rgba = rgba;
82     if (_colorSelector)
83     {
84         SPColor color;
85         sp_color_set_rgb_rgba32(&color, rgba);
86         _colorSelector->base->setColorAlpha(color, SP_RGBA32_A_F(rgba));
87     }
88 }
90 void
91 ColorPicker::closeWindow()
92 {
93     _colorSelectorDialog.hide();
94 }
96 void
97 ColorPicker::on_clicked()
98 {
99     if (_colorSelector)
100     {
101         SPColor color;
102         sp_color_set_rgb_rgba32(&color, _rgba);
103         _colorSelector->base->setColorAlpha(color, SP_RGBA32_A_F(_rgba));
104     }
105     _colorSelectorDialog.show();
108 void
109 ColorPicker::on_changed (guint32)
113 void
114 sp_color_picker_color_mod(SPColorSelector *csel, GObject *cp)
116     if (_in_use) return;
117     else _in_use = true;
118     
119     SPColor color;
120     float alpha;
121     csel->base->getColorAlpha(color, &alpha);
122     guint32 rgba = sp_color_get_rgba32_falpha(&color, alpha);
124     ColorPicker *ptr = (ColorPicker *)(cp);
126     (ptr->_preview).setRgba32 (rgba);
128     if (ptr->_undo && SP_ACTIVE_DESKTOP)
129         sp_document_done(sp_desktop_document(SP_ACTIVE_DESKTOP));
131     ptr->on_changed (rgba);
132     _in_use = false;
133     ptr->_changed_signal.emit (rgba);
134     ptr->_rgba = rgba;
138 }//namespace Widget
139 }//namespace UI
140 }//namespace Inkscape
143 /*
144   Local Variables:
145   mode:c++
146   c-file-style:"stroustrup"
147   c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
148   indent-tabs-mode:nil
149   fill-column:99
150   End:
151 */
152 // vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=99 :