GG

ColorDlg.h

Go to the documentation of this file.
00001 // -*- C++ -*-
00002 /* GG is a GUI for SDL and OpenGL.
00003    Copyright (C) 2003-2008 T. Zachary Laine
00004 
00005    This library is free software; you can redistribute it and/or
00006    modify it under the terms of the GNU Lesser General Public License
00007    as published by the Free Software Foundation; either version 2.1
00008    of the License, or (at your option) any later version.
00009    
00010    This library is distributed in the hope that it will be useful,
00011    but WITHOUT ANY WARRANTY; without even the implied warranty of
00012    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00013    Lesser General Public License for more details.
00014     
00015    You should have received a copy of the GNU Lesser General Public
00016    License along with this library; if not, write to the Free
00017    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
00018    02111-1307 USA
00019 
00020    If you do not wish to comply with the terms of the LGPL please
00021    contact the author as other terms are available for a fee.
00022     
00023    Zach Laine
00024    whatwasthataddress@gmail.com */
00025 
00029 #ifndef _GG_ColorDlg_h_
00030 #define _GG_ColorDlg_h_
00031 
00032 #include <GG/Button.h>
00033 #include <GG/ClrConstants.h>
00034 
00035 
00036 namespace GG {
00037 
00038 class Font;
00039 class Slider;
00040     
00044 struct GG_API HSVClr
00045 {
00046     HSVClr(); 
00047     HSVClr(double h_, double s_, double v_, GLubyte a_ = 255); 
00048     double  h;   
00049     double  s;   
00050     double  v;   
00051     GLubyte a;   
00052 
00053     template <class Archive>
00054     void serialize(Archive& ar, const unsigned int version);
00055 };
00056 
00060 class GG_API HueSaturationPicker : public Control
00061 {
00062 public: 
00064     typedef boost::signal<void (double, double)> ChangedSignalType; 
00065 
00066  
00068     HueSaturationPicker(X x, Y y, X w, Y h); 
00069 
00070  
00072     virtual void Render();
00073     virtual void LButtonDown(const Pt& pt, Flags<ModKey> mod_keys);
00074     virtual void LDrag(const Pt& pt, const Pt& move, Flags<ModKey> mod_keys);
00075 
00076     void SetHueSaturation(double hue, double saturation); 
00077 
00078 
00079     mutable ChangedSignalType ChangedSignal; 
00080 
00081 protected: 
00083     HueSaturationPicker(); 
00084 
00085 
00086 private:
00087     void SetHueSaturationFromPt(Pt pt);
00088 
00089     double m_hue;
00090     double m_saturation;
00091     std::vector<std::vector<std::pair<double, double> > >  m_vertices;
00092     std::vector<std::vector<Clr> > m_colors;
00093 
00094     friend class boost::serialization::access;
00095     template <class Archive>
00096     void serialize(Archive& ar, const unsigned int version);
00097 };
00098 
00099 
00102 class GG_API ValuePicker : public Control
00103 {
00104 public: 
00106     typedef boost::signal<void (double)> ChangedSignalType; 
00107 
00108  
00110     ValuePicker(X x, Y y, X w, Y h, Clr arrow_color); 
00111 
00112  
00114     virtual void Render();
00115     virtual void LButtonDown(const Pt& pt, Flags<ModKey> mod_keys);
00116     virtual void LDrag(const Pt& pt, const Pt& move, Flags<ModKey> mod_keys);
00117 
00120     void SetHueSaturation(double hue, double saturation);
00121     void SetValue(double value); 
00122 
00123 
00124     mutable ChangedSignalType ChangedSignal; 
00125 
00126 protected: 
00128     ValuePicker(); 
00129 
00130 
00131 private:
00132     void SetValueFromPt(Pt pt);
00133 
00134     double  m_hue;
00135     double  m_saturation;
00136     double  m_value;
00137 
00138     Clr m_arrow_color;
00139 
00140     friend class boost::serialization::access;
00141     template <class Archive>
00142     void serialize(Archive& ar, const unsigned int version);
00143 };
00144 
00145 
00153 class GG_API ColorDlg : public Wnd
00154 {
00155 public:
00157     class GG_API ColorButton : public Button
00158     {
00159     public: 
00161         ColorButton(const Clr& color);
00163  
00165 
00166         Clr RepresentedColor() const;
00168  
00170 
00171         void SetRepresentedColor(const Clr& color);
00173 
00174     protected: 
00176         ColorButton(); 
00177 
00178  
00180         virtual void RenderUnpressed();
00181         virtual void RenderPressed();
00182         virtual void RenderRollover();
00184 
00185     private:
00186         Clr m_represented_color;
00187 
00188         friend class boost::serialization::access;
00189         template <class Archive>
00190         void serialize(Archive& ar, const unsigned int version);
00191     };
00192 
00199     class GG_API ColorDisplay : public Control
00200     {
00201     public: 
00203         ColorDisplay(Clr color); 
00204 
00205  
00207         virtual void Render();
00209 
00210     protected: 
00212         ColorDisplay(); 
00213 
00214 
00215     private:
00216         friend class boost::serialization::access;
00217         template <class Archive>
00218         void serialize(Archive& ar, const unsigned int version);
00219     };
00220  
00222 
00223     ColorDlg(X x, Y y, const boost::shared_ptr<Font>& font,
00224              Clr dialog_color, Clr border_color, Clr text_color = CLR_BLACK);
00225 
00227     ColorDlg(X x, Y y, Clr original_color, const boost::shared_ptr<Font>& font,
00228              Clr dialog_color, Clr border_color, Clr text_color = CLR_BLACK);
00230  
00232 
00235     bool ColorWasSelected() const;
00236 
00238     Clr Result() const;
00239 
00240     const std::string& NewString(const std::string& str) const;        
00241     const std::string& OldString(const std::string& str) const;        
00242     const std::string& RedString(const std::string& str) const;        
00243     const std::string& GreenString(const std::string& str) const;      
00244     const std::string& BlueString(const std::string& str) const;       
00245     const std::string& HueString(const std::string& str) const;        
00246     const std::string& SaturationString(const std::string& str) const; 
00247     const std::string& ValueString(const std::string& str) const;      
00248     const std::string& AlphaString(const std::string& str) const;      
00249     const std::string& OkString(const std::string& str) const;         
00250     const std::string& CancelString(const std::string& str) const;     
00251 
00252  
00254     void SetNewString(const std::string& str);        
00255     void SetOldString(const std::string& str);        
00256     void SetRedString(const std::string& str);        
00257     void SetGreenString(const std::string& str);      
00258     void SetBlueString(const std::string& str);       
00259     void SetHueString(const std::string& str);        
00260     void SetSaturationString(const std::string& str); 
00261     void SetValueString(const std::string& str);      
00262     void SetAlphaString(const std::string& str);      
00263     void SetOkString(const std::string& str);         
00264     void SetCancelString(const std::string& str);     
00265 
00266     virtual void Render();
00267     virtual void KeyPress(Key key, boost::uint32_t key_code_point, Flags<ModKey> mod_keys);
00269 
00270     static const std::size_t INVALID_COLOR_BUTTON;
00271 
00272 protected: 
00274     ColorDlg(); 
00275 
00276 
00277 private:
00278     struct ColorButtonClickFunctor
00279     {
00280         ColorButtonClickFunctor(std::size_t id, ColorDlg* picker_);
00281         void operator()();
00282         const std::size_t button_id;
00283         ColorDlg* picker;
00284     };
00285 
00286     enum {R, G, B, A, H, S, V};
00287 
00288     void Init(const boost::shared_ptr<Font>& font);
00289     void ConnectSignals();
00290     void ColorChanged(HSVClr color);
00291     void HueSaturationPickerChanged(double hue, double saturation);
00292     void ValuePickerChanged(double value);
00293     void UpdateRGBSliders();
00294     void UpdateHSVSliders();
00295     void ColorChangeFromRGBSlider();
00296     void ColorButtonClicked(std::size_t i);
00297     void RedSliderChanged(int value, int low, int high);
00298     void GreenSliderChanged(int value, int low, int high);
00299     void BlueSliderChanged(int value, int low, int high);
00300     void AlphaSliderChanged(int value, int low, int high);
00301     void HueSliderChanged(int value, int low, int high);
00302     void SaturationSliderChanged(int value, int low, int high);
00303     void ValueSliderChanged(int value, int low, int high);
00304     void OkClicked();
00305     void CancelClicked();
00306 
00307     HSVClr                    m_current_color;
00308     Clr                       m_original_color;
00309     bool                      m_original_color_specified;
00310     bool                      m_color_was_picked;
00311 
00312     std::string               m_new_str;
00313     std::string               m_old_str;
00314     std::string               m_red_str;
00315     std::string               m_green_str;
00316     std::string               m_blue_str;
00317     std::string               m_hue_str;
00318     std::string               m_saturation_str;
00319     std::string               m_value_str;
00320     std::string               m_alpha_str;
00321     std::string               m_ok_str;
00322     std::string               m_cancel_str;
00323 
00324     HueSaturationPicker*      m_hue_saturation_picker;
00325     ValuePicker*              m_value_picker;
00326     Layout*                   m_pickers_layout;
00327     ColorDisplay*             m_new_color_square;
00328     ColorDisplay*             m_old_color_square;
00329     TextControl*              m_new_color_square_text;
00330     TextControl*              m_old_color_square_text;
00331     Layout*                   m_color_squares_layout;
00332     std::vector<ColorButton*> m_color_buttons;
00333     Layout*                   m_color_buttons_layout;
00334     std::size_t               m_current_color_button;
00335     std::vector<TextControl*> m_slider_labels;
00336     std::vector<TextControl*> m_slider_values;
00337     std::vector<Slider*>      m_sliders;
00338     Button*                   m_ok;
00339     Button*                   m_cancel;
00340     Layout*                   m_sliders_ok_cancel_layout;
00341 
00342     Clr                       m_color;
00343     Clr                       m_border_color;
00344     Clr                       m_text_color;
00345 
00346     static std::vector<Clr>   s_custom_colors;
00347 
00348     friend struct ColorButtonClickFunctor;
00349 
00350     friend class boost::serialization::access;
00351     template <class Archive>
00352     void serialize(Archive& ar, const unsigned int version);
00353 };
00354 
00355 } // namespace GG
00356 
00357 // template implementations
00358 template <class Archive>
00359 void GG::HSVClr::serialize(Archive& ar, const unsigned int version)
00360 {
00361     ar  & BOOST_SERIALIZATION_NVP(h)
00362         & BOOST_SERIALIZATION_NVP(s)
00363         & BOOST_SERIALIZATION_NVP(v)
00364         & BOOST_SERIALIZATION_NVP(a);
00365 }
00366 
00367 template <class Archive>
00368 void GG::HueSaturationPicker::serialize(Archive& ar, const unsigned int version)
00369 {
00370     ar  & BOOST_SERIALIZATION_BASE_OBJECT_NVP(Control)
00371         & BOOST_SERIALIZATION_NVP(m_hue)
00372         & BOOST_SERIALIZATION_NVP(m_saturation)
00373         & BOOST_SERIALIZATION_NVP(m_vertices)
00374         & BOOST_SERIALIZATION_NVP(m_colors);
00375 }
00376 
00377 template <class Archive>
00378 void GG::ValuePicker::serialize(Archive& ar, const unsigned int version)
00379 {
00380     ar  & BOOST_SERIALIZATION_BASE_OBJECT_NVP(Control)
00381         & BOOST_SERIALIZATION_NVP(m_hue)
00382         & BOOST_SERIALIZATION_NVP(m_saturation)
00383         & BOOST_SERIALIZATION_NVP(m_value)
00384         & BOOST_SERIALIZATION_NVP(m_arrow_color);
00385 }
00386 
00387 template <class Archive>
00388 void GG::ColorDlg::ColorButton::serialize(Archive& ar, const unsigned int version)
00389 {
00390     ar  & BOOST_SERIALIZATION_BASE_OBJECT_NVP(Button)
00391         & BOOST_SERIALIZATION_NVP(m_represented_color);
00392 }
00393 
00394 template <class Archive>
00395 void GG::ColorDlg::ColorDisplay::serialize(Archive& ar, const unsigned int version)
00396 {
00397     ar  & BOOST_SERIALIZATION_BASE_OBJECT_NVP(Control);
00398 }
00399 
00400 template <class Archive>
00401 void GG::ColorDlg::serialize(Archive& ar, const unsigned int version)
00402 {
00403     ar  & BOOST_SERIALIZATION_BASE_OBJECT_NVP(Wnd)
00404         & BOOST_SERIALIZATION_NVP(m_current_color)
00405         & BOOST_SERIALIZATION_NVP(m_original_color)
00406         & BOOST_SERIALIZATION_NVP(m_original_color_specified)
00407         & BOOST_SERIALIZATION_NVP(m_color_was_picked)
00408         & BOOST_SERIALIZATION_NVP(m_new_str)
00409         & BOOST_SERIALIZATION_NVP(m_old_str)
00410         & BOOST_SERIALIZATION_NVP(m_red_str)
00411         & BOOST_SERIALIZATION_NVP(m_green_str)
00412         & BOOST_SERIALIZATION_NVP(m_blue_str)
00413         & BOOST_SERIALIZATION_NVP(m_hue_str)
00414         & BOOST_SERIALIZATION_NVP(m_saturation_str)
00415         & BOOST_SERIALIZATION_NVP(m_value_str)
00416         & BOOST_SERIALIZATION_NVP(m_alpha_str)
00417         & BOOST_SERIALIZATION_NVP(m_ok_str)
00418         & BOOST_SERIALIZATION_NVP(m_cancel_str)
00419         & BOOST_SERIALIZATION_NVP(m_hue_saturation_picker)
00420         & BOOST_SERIALIZATION_NVP(m_value_picker)
00421         & BOOST_SERIALIZATION_NVP(m_pickers_layout)
00422         & BOOST_SERIALIZATION_NVP(m_new_color_square)
00423         & BOOST_SERIALIZATION_NVP(m_old_color_square)
00424         & BOOST_SERIALIZATION_NVP(m_new_color_square_text)
00425         & BOOST_SERIALIZATION_NVP(m_old_color_square_text)
00426         & BOOST_SERIALIZATION_NVP(m_color_squares_layout)
00427         & BOOST_SERIALIZATION_NVP(m_color_buttons)
00428         & BOOST_SERIALIZATION_NVP(m_color_buttons_layout)
00429         & BOOST_SERIALIZATION_NVP(m_current_color_button)
00430         & BOOST_SERIALIZATION_NVP(m_slider_labels)
00431         & BOOST_SERIALIZATION_NVP(m_slider_values)
00432         & BOOST_SERIALIZATION_NVP(m_sliders)
00433         & BOOST_SERIALIZATION_NVP(m_ok)
00434         & BOOST_SERIALIZATION_NVP(m_cancel)
00435         & BOOST_SERIALIZATION_NVP(m_sliders_ok_cancel_layout)
00436         & BOOST_SERIALIZATION_NVP(m_color)
00437         & BOOST_SERIALIZATION_NVP(m_border_color)
00438         & BOOST_SERIALIZATION_NVP(m_text_color);
00439 
00440     if (Archive::is_loading::value)
00441         ConnectSignals();
00442 }
00443 
00444 #endif // _GG_ColorDlg_h_