Code

Refactoring layout when switching palettes
[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 "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);
39     
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)
104     SPColor color;
105     float alpha;
106     csel->base->getColorAlpha(color, &alpha);
107     guint32 rgba = sp_color_get_rgba32_falpha(&color, alpha);
108     
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);
120 //==============================================================
122 ColorPickerWindow::ColorPickerWindow (ColorPicker *cp, const Glib::ustring &title)
123     : Dialog("dialogs.colorpickerwindow")
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()
142     _csel = 0;
144     
145 void
146 ColorPickerWindow::setRgba32 (guint32 rgba)
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     }
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 :