Code

clean up redundancies. add a placeholder for Export dialog
[inkscape.git] / src / ui / widget / color-picker.cpp
index 9bc79ddc1f9f1a999e5c94be4791f39eb0c9431f..d5c4899c67624b3a2b8197a6fd3f77fd8db576a5 100644 (file)
 #include "desktop-handles.h"
 #include "document.h"
 
-#include "ui/dialog/dialog.h"
-
 #include "widgets/sp-color-notebook.h"
 
 #include "color-picker.h"
 
+static bool _in_use = false;
+
 namespace Inkscape {
-    namespace UI {
-        namespace Widget {
-
-struct CPPointer {
-    ColorPicker *ptr;
-};
-
-class ColorPickerWindow : public Inkscape::UI::Dialog::Dialog {
-public:
-    ColorPickerWindow (ColorPicker* cp, const Glib::ustring &title);
-    virtual ~ColorPickerWindow();
-    void setRgba32 (guint32);
-    
-    SPColorSelector *_csel;
-    CPPointer _cpp;
-};
+namespace UI {
+namespace Widget {
 
-ColorPicker::ColorPicker (const Glib::ustring& title, const Glib::ustring& tip, 
+void sp_color_picker_color_mod(SPColorSelector *csel, GObject *cp);
+
+ColorPicker::ColorPicker (const Glib::ustring& title, const Glib::ustring& tip,
                           guint32 rgba, bool undo)
-: _preview(rgba), _window(0), 
-  _title(title), _rgba(rgba), _undo(undo)
+          : _preview(rgba), _title(title), _rgba(rgba), _undo(undo),
+           _colorSelectorDialog("dialogs.colorpickerwindow")
 {
+    setupDialog(title);
     set_relief (Gtk::RELIEF_NONE);
     _preview.show();
     add (_preview);
@@ -55,42 +44,65 @@ ColorPicker::ColorPicker (const Glib::ustring& title, const Glib::ustring& tip,
 ColorPicker::~ColorPicker()
 {
     closeWindow();
+    _colorSelector = NULL;
+}
+
+void
+ColorPicker::setupDialog(const Glib::ustring &title)
+{
+    _colorSelectorDialog.hide();
+    _colorSelectorDialog.set_title (title);
+    _colorSelectorDialog.set_border_width (4);
+    _colorSelector = (SPColorSelector*)sp_color_selector_new(SP_TYPE_COLOR_NOTEBOOK,
+                                  SP_COLORSPACE_TYPE_UNKNOWN);
+    _colorSelectorDialog.get_vbox()->pack_start (
+              *Glib::wrap(&_colorSelector->vbox), true, true, 0);
+
+    g_signal_connect(G_OBJECT(_colorSelector), "dragged",
+                         G_CALLBACK(sp_color_picker_color_mod), (void *)this);
+    g_signal_connect(G_OBJECT(_colorSelector), "released",
+                         G_CALLBACK(sp_color_picker_color_mod), (void *)this);
+    g_signal_connect(G_OBJECT(_colorSelector), "changed",
+                         G_CALLBACK(sp_color_picker_color_mod), (void *)this);
+
+    gtk_widget_show(GTK_WIDGET(_colorSelector));
+
 }
 
+
+
+
 void
 ColorPicker::setRgba32 (guint32 rgba)
 {
+    if (_in_use) return;
+
     _preview.setRgba32 (rgba);
     _rgba = rgba;
-    if (_window)
-        _window->setRgba32 (rgba);
+    if (_colorSelector)
+    {
+        SPColor color;
+        sp_color_set_rgb_rgba32(&color, rgba);
+        _colorSelector->base->setColorAlpha(color, SP_RGBA32_A_F(rgba));
+    }
 }
 
 void
 ColorPicker::closeWindow()
 {
-    if (_window)
-    {
-        delete _window;
-        _window = 0;
-    }
+    _colorSelectorDialog.hide();
 }
 
 void
 ColorPicker::on_clicked()
 {
-    static int _x, _y;
-    if (_window)
-    { 
-        _window->move(_x,_y);
-        _window->present();
-        return;
+    if (_colorSelector)
+    {
+        SPColor color;
+        sp_color_set_rgb_rgba32(&color, _rgba);
+        _colorSelector->base->setColorAlpha(color, SP_RGBA32_A_F(_rgba));
     }
-
-    _window =new ColorPickerWindow (this, _title);
-    _window->setRgba32 (_rgba);
-    _window->show_all();
-    _window->get_position (_x, _y);
+    _colorSelectorDialog.show();
 }
 
 void
@@ -101,59 +113,33 @@ ColorPicker::on_changed (guint32)
 void
 sp_color_picker_color_mod(SPColorSelector *csel, GObject *cp)
 {
+    if (_in_use) return;
+    else _in_use = true;
+    
     SPColor color;
     float alpha;
     csel->base->getColorAlpha(color, &alpha);
     guint32 rgba = sp_color_get_rgba32_falpha(&color, alpha);
-    
-    ColorPicker *ptr = static_cast<CPPointer*>((void*)cp)->ptr;
+
+    ColorPicker *ptr = (ColorPicker *)(cp);
 
     (ptr->_preview).setRgba32 (rgba);
 
     if (ptr->_undo && SP_ACTIVE_DESKTOP)
-        sp_document_done(SP_DT_DOCUMENT(SP_ACTIVE_DESKTOP));
+        sp_document_done(sp_desktop_document(SP_ACTIVE_DESKTOP), SP_VERB_NONE, 
+                         /* TODO: annotate */ "color-picker.cpp:130");
 
     ptr->on_changed (rgba);
+    _in_use = false;
     ptr->_changed_signal.emit (rgba);
+    ptr->_rgba = rgba;
 }
 
-//==============================================================
-
-ColorPickerWindow::ColorPickerWindow (ColorPicker *cp, const Glib::ustring &title)
-    : Dialog("dialogs.colorpickerwindow")
-{
-    set_title (title);
-    set_border_width (4);
-    _csel = (SPColorSelector*)sp_color_selector_new(SP_TYPE_COLOR_NOTEBOOK,
-                                  SP_COLORSPACE_TYPE_UNKNOWN);
-    get_vbox()->pack_start (*Glib::wrap(&_csel->vbox), true, true, 0);
-
-    _cpp.ptr = cp;
-    g_signal_connect(G_OBJECT(_csel), "dragged",
-                         G_CALLBACK(sp_color_picker_color_mod), &_cpp);
-    g_signal_connect(G_OBJECT(_csel), "changed",
-                         G_CALLBACK(sp_color_picker_color_mod), &_cpp);
-
-    show();
-} 
 
-ColorPickerWindow::~ColorPickerWindow()
-{
-    _csel = 0;
-}
-    
-void
-ColorPickerWindow::setRgba32 (guint32 rgba)
-{
-    if (_csel) 
-    {
-        SPColor color;
-        sp_color_set_rgb_rgba32(&color, rgba);
-        _csel->base->setColorAlpha(color, SP_RGBA32_A_F(rgba));
-    }
-}
+}//namespace Widget
+}//namespace UI
+}//namespace Inkscape
 
-}}}
 
 /*
   Local Variables: