1 /** \file
2 * \brief Color picker button & window
3 *
4 * Authors:
5 * Lauris Kaplinski <lauris@kaplinski.com>
6 * bulia byak <buliabyak@users.sf.net>
7 * Ralf Stephan <ralf@ark.in-berlin.de>
8 * Abhishek Sharma
9 *
10 * Copyright (C) Authors 2000-2005
11 *
12 * Released under GNU GPL, read the file 'COPYING' for more information
13 */
15 #include "inkscape.h"
16 #include "desktop-handles.h"
17 #include "document.h"
18 #include "dialogs/dialog-events.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 GtkWidget *dlg = GTK_WIDGET(_colorSelectorDialog.gobj());
54 sp_transientize(dlg);
56 _colorSelectorDialog.hide();
57 _colorSelectorDialog.set_title (title);
58 _colorSelectorDialog.set_border_width (4);
59 _colorSelector = (SPColorSelector*)sp_color_selector_new(SP_TYPE_COLOR_NOTEBOOK);
60 _colorSelectorDialog.get_vbox()->pack_start (
61 *Glib::wrap(&_colorSelector->vbox), true, true, 0);
63 g_signal_connect(G_OBJECT(_colorSelector), "dragged",
64 G_CALLBACK(sp_color_picker_color_mod), (void *)this);
65 g_signal_connect(G_OBJECT(_colorSelector), "released",
66 G_CALLBACK(sp_color_picker_color_mod), (void *)this);
67 g_signal_connect(G_OBJECT(_colorSelector), "changed",
68 G_CALLBACK(sp_color_picker_color_mod), (void *)this);
70 gtk_widget_show(GTK_WIDGET(_colorSelector));
72 }
77 void
78 ColorPicker::setRgba32 (guint32 rgba)
79 {
80 if (_in_use) return;
82 _preview.setRgba32 (rgba);
83 _rgba = rgba;
84 if (_colorSelector)
85 {
86 SPColor color;
87 color.set( rgba );
88 _colorSelector->base->setColorAlpha(color, SP_RGBA32_A_F(rgba));
89 }
90 }
92 void
93 ColorPicker::closeWindow()
94 {
95 _colorSelectorDialog.hide();
96 }
98 void
99 ColorPicker::on_clicked()
100 {
101 if (_colorSelector)
102 {
103 SPColor color;
104 color.set( _rgba );
105 _colorSelector->base->setColorAlpha(color, SP_RGBA32_A_F(_rgba));
106 }
107 _colorSelectorDialog.show();
108 }
110 void
111 ColorPicker::on_changed (guint32)
112 {
113 }
115 void
116 sp_color_picker_color_mod(SPColorSelector *csel, GObject *cp)
117 {
118 if (_in_use) {
119 return;
120 } else {
121 _in_use = true;
122 }
124 SPColor color;
125 float alpha = 0;
126 csel->base->getColorAlpha(color, alpha);
127 guint32 rgba = color.toRGBA32( alpha );
129 ColorPicker *ptr = (ColorPicker *)(cp);
131 (ptr->_preview).setRgba32 (rgba);
133 if (ptr->_undo && SP_ACTIVE_DESKTOP)
134 DocumentUndo::done(sp_desktop_document(SP_ACTIVE_DESKTOP), SP_VERB_NONE,
135 /* TODO: annotate */ "color-picker.cpp:130");
137 ptr->on_changed (rgba);
138 _in_use = false;
139 ptr->_changed_signal.emit (rgba);
140 ptr->_rgba = rgba;
141 }
144 }//namespace Widget
145 }//namespace UI
146 }//namespace Inkscape
149 /*
150 Local Variables:
151 mode:c++
152 c-file-style:"stroustrup"
153 c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
154 indent-tabs-mode:nil
155 fill-column:99
156 End:
157 */
158 // vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :