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 "ui/dialog/dialog.h"
22 #include "widgets/sp-color-notebook.h"
24 #include "color-picker.h"
26 namespace Inkscape {
27 namespace UI {
28 namespace Widget {
30 struct CPPointer {
31 ColorPicker *ptr;
32 };
34 class ColorPickerWindow : public Inkscape::UI::Dialog::Dialog {
35 public:
36 ColorPickerWindow (ColorPicker* cp, const Glib::ustring &title);
37 virtual ~ColorPickerWindow();
38 void setRgba32 (guint32);
40 SPColorSelector *_csel;
41 CPPointer _cpp;
42 };
44 ColorPicker::ColorPicker (const Glib::ustring& title, const Glib::ustring& tip,
45 guint32 rgba, bool undo)
46 : _preview(rgba), _window(0),
47 _title(title), _rgba(rgba), _undo(undo)
48 {
49 set_relief (Gtk::RELIEF_NONE);
50 _preview.show();
51 add (_preview);
52 _tt.set_tip (*this, tip);
53 }
55 ColorPicker::~ColorPicker()
56 {
57 closeWindow();
58 }
60 void
61 ColorPicker::setRgba32 (guint32 rgba)
62 {
63 _preview.setRgba32 (rgba);
64 _rgba = rgba;
65 if (_window)
66 _window->setRgba32 (rgba);
67 }
69 void
70 ColorPicker::closeWindow()
71 {
72 if (_window)
73 {
74 delete _window;
75 _window = 0;
76 }
77 }
79 void
80 ColorPicker::on_clicked()
81 {
82 static int _x, _y;
83 if (_window)
84 {
85 _window->move(_x,_y);
86 _window->present();
87 return;
88 }
90 _window =new ColorPickerWindow (this, _title);
91 _window->setRgba32 (_rgba);
92 _window->show_all();
93 _window->get_position (_x, _y);
94 }
96 void
97 ColorPicker::on_changed (guint32)
98 {
99 }
101 void
102 sp_color_picker_color_mod(SPColorSelector *csel, GObject *cp)
103 {
104 SPColor color;
105 float alpha;
106 csel->base->getColorAlpha(color, &alpha);
107 guint32 rgba = sp_color_get_rgba32_falpha(&color, alpha);
109 ColorPicker *ptr = static_cast<CPPointer*>((void*)cp)->ptr;
111 (ptr->_preview).setRgba32 (rgba);
113 if (ptr->_undo && SP_ACTIVE_DESKTOP)
114 sp_document_done(SP_DT_DOCUMENT(SP_ACTIVE_DESKTOP));
116 ptr->on_changed (rgba);
117 ptr->_changed_signal.emit (rgba);
118 }
120 //==============================================================
122 ColorPickerWindow::ColorPickerWindow (ColorPicker *cp, const Glib::ustring &title)
123 : Dialog("dialogs.colorpickerwindow")
124 {
125 set_title (title);
126 set_border_width (4);
127 _csel = (SPColorSelector*)sp_color_selector_new(SP_TYPE_COLOR_NOTEBOOK,
128 SP_COLORSPACE_TYPE_UNKNOWN);
129 get_vbox()->pack_start (*Glib::wrap(&_csel->vbox), true, true, 0);
131 _cpp.ptr = cp;
132 g_signal_connect(G_OBJECT(_csel), "dragged",
133 G_CALLBACK(sp_color_picker_color_mod), &_cpp);
134 g_signal_connect(G_OBJECT(_csel), "changed",
135 G_CALLBACK(sp_color_picker_color_mod), &_cpp);
137 show();
138 }
140 ColorPickerWindow::~ColorPickerWindow()
141 {
142 _csel = 0;
143 }
145 void
146 ColorPickerWindow::setRgba32 (guint32 rgba)
147 {
148 if (_csel)
149 {
150 SPColor color;
151 sp_color_set_rgb_rgba32(&color, rgba);
152 _csel->base->setColorAlpha(color, SP_RGBA32_A_F(rgba));
153 }
154 }
156 }}}
158 /*
159 Local Variables:
160 mode:c++
161 c-file-style:"stroustrup"
162 c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
163 indent-tabs-mode:nil
164 fill-column:99
165 End:
166 */
167 // vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=99 :