ColorDlg.h

Go to the documentation of this file.
00001 // -*- C++ -*-
00002 /* GG is a GUI for SDL and OpenGL.
00003    Copyright (C) 2003 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@hotmail.com */
00025 
00029 #ifndef _GG_ColorDlg_h_
00030 #define _GG_ColorDlg_h_
00031 
00032 #include <GG/Button.h>
00033 
00034 
00035 namespace GG {
00036 
00037 class Font;
00038 class Slider;
00039     
00042 struct GG_API HSVClr
00043 {
00044     HSVClr(); 
00045     HSVClr(double h_, double s_, double v_, GLubyte a_ = 255); 
00046     double  h;   
00047     double  s;   
00048     double  v;   
00049     GLubyte a;   
00050 
00051     template <class Archive>
00052     void serialize(Archive& ar, const unsigned int version);
00053 };
00054 
00057 class GG_API HueSaturationPicker : public Control
00058 {
00059 public: 
00061     typedef boost::signal<void (double, double)> ChangedSignalType; 
00062 
00063  
00065     typedef ChangedSignalType::slot_type         ChangedSlotType;   
00066 
00067  
00069     HueSaturationPicker(int x, int y, int w, int h); 
00070 
00071  
00073     virtual void Render();
00074     virtual void LButtonDown(const Pt& pt, Flags<ModKey> mod_keys);
00075     virtual void LDrag(const Pt& pt, const Pt& move, Flags<ModKey> mod_keys);
00076 
00077     void SetHueSaturation(double hue, double saturation); 
00078 
00079 
00080     mutable ChangedSignalType ChangedSignal; 
00081 
00082 protected: 
00084     HueSaturationPicker(); 
00085 
00086 
00087 private:
00088     void SetHueSaturationFromPt(Pt pt);
00089 
00090     double m_hue;
00091     double m_saturation;
00092     std::vector<std::vector<std::pair<double, double> > >  m_vertices;
00093     std::vector<std::vector<Clr> > m_colors;
00094 
00095     friend class boost::serialization::access;
00096     template <class Archive>
00097     void serialize(Archive& ar, const unsigned int version);
00098 };
00099 
00100 
00103 class GG_API ValuePicker : public Control
00104 {
00105 public: 
00107     typedef boost::signal<void (double)> ChangedSignalType; 
00108 
00109  
00111     typedef ChangedSignalType::slot_type ChangedSlotType;   
00112 
00113  
00115     ValuePicker(int x, int y, int w, int h, Clr arrow_color); 
00116 
00117  
00119     virtual void Render();
00120     virtual void LButtonDown(const Pt& pt, Flags<ModKey> mod_keys);
00121     virtual void LDrag(const Pt& pt, const Pt& move, Flags<ModKey> mod_keys);
00122 
00125     void SetHueSaturation(double hue, double saturation);
00126     void SetValue(double value); 
00127 
00128 
00129     mutable ChangedSignalType ChangedSignal; 
00130 
00131 protected: 
00133     ValuePicker(); 
00134 
00135 
00136 private:
00137     void SetValueFromPt(Pt pt);
00138 
00139     double  m_hue;
00140     double  m_saturation;
00141     double  m_value;
00142 
00143     Clr m_arrow_color;
00144 
00145     friend class boost::serialization::access;
00146     template <class Archive>
00147     void serialize(Archive& ar, const unsigned int version);
00148 };
00149 
00150 
00155 class GG_API ColorDlg : public Wnd
00156 {
00157 public:
00159     class GG_API ColorButton : public Button
00160     {
00161     public: 
00163         ColorButton(const Clr& color);
00165  
00167 
00168         Clr RepresentedColor() const;
00170  
00172 
00173         void SetRepresentedColor(const Clr& color);
00175 
00176     protected: 
00178         ColorButton(); 
00179 
00180  
00182         virtual void RenderUnpressed();
00183         virtual void RenderPressed();
00184         virtual void RenderRollover();
00186 
00187     private:
00188         Clr m_represented_color;
00189 
00190         friend class boost::serialization::access;
00191         template <class Archive>
00192         void serialize(Archive& ar, const unsigned int version);
00193     };
00194 
00198     class GG_API ColorDisplay : public Control
00199     {
00200     public: 
00202         ColorDisplay(Clr color); 
00203 
00204  
00206         virtual void Render();
00208 
00209     protected: 
00211         ColorDisplay(); 
00212 
00213 
00214     private:
00215         friend class boost::serialization::access;
00216         template <class Archive>
00217         void serialize(Archive& ar, const unsigned int version);
00218     };
00219  
00221 
00222     ColorDlg(int x, int y, const boost::shared_ptr<Font>& font,
00223              Clr dialog_color, Clr border_color, Clr text_color = CLR_BLACK);
00224 
00226     ColorDlg(int x, int y, Clr original_color, const boost::shared_ptr<Font>& font,
00227              Clr dialog_color, Clr border_color, Clr text_color = CLR_BLACK);
00229  
00231 
00233     bool ColorWasSelected() const;
00234 
00236     Clr Result() const;
00237 
00238     const std::string& NewString(const std::string& str) const;        
00239     const std::string& OldString(const std::string& str) const;        
00240     const std::string& RedString(const std::string& str) const;        
00241     const std::string& GreenString(const std::string& str) const;      
00242     const std::string& BlueString(const std::string& str) const;       
00243     const std::string& HueString(const std::string& str) const;        
00244     const std::string& SaturationString(const std::string& str) const; 
00245     const std::string& ValueString(const std::string& str) const;      
00246     const std::string& AlphaString(const std::string& str) const;      
00247     const std::string& OkString(const std::string& str) const;         
00248     const std::string& CancelString(const std::string& str) const;     
00249 
00250  
00252     void SetNewString(const std::string& str);        
00253     void SetOldString(const std::string& str);        
00254     void SetRedString(const std::string& str);        
00255     void SetGreenString(const std::string& str);      
00256     void SetBlueString(const std::string& str);       
00257     void SetHueString(const std::string& str);        
00258     void SetSaturationString(const std::string& str); 
00259     void SetValueString(const std::string& str);      
00260     void SetAlphaString(const std::string& str);      
00261     void SetOkString(const std::string& str);         
00262     void SetCancelString(const std::string& str);     
00263 
00264     virtual void Render();
00265     virtual void KeyPress(Key key, Flags<ModKey> mod_keys);
00267 
00268 protected: 
00270     ColorDlg(); 
00271 
00272 
00273 private:
00274     struct ColorButtonClickFunctor
00275     {
00276         ColorButtonClickFunctor(int id, ColorDlg* picker_);
00277         void operator()();
00278         const int button_id;
00279         ColorDlg* picker;
00280     };
00281 
00282     enum {R, G, B, A, H, S, V};
00283 
00284     void Init(const boost::shared_ptr<Font>& font);
00285     void ConnectSignals();
00286     void ColorChanged(HSVClr color);
00287     void HueSaturationPickerChanged(double hue, double saturation);
00288     void ValuePickerChanged(double value);
00289     void UpdateRGBSliders();
00290     void UpdateHSVSliders();
00291     void ColorChangeFromRGBSlider();
00292     void ColorButtonClicked(int i);
00293     void RedSliderChanged(int value, int low, int high);
00294     void GreenSliderChanged(int value, int low, int high);
00295     void BlueSliderChanged(int value, int low, int high);
00296     void AlphaSliderChanged(int value, int low, int high);
00297     void HueSliderChanged(int value, int low, int high);
00298     void SaturationSliderChanged(int value, int low, int high);
00299     void ValueSliderChanged(int value, int low, int high);
00300     void OkClicked();
00301     void CancelClicked();
00302 
00303     HSVClr                    m_current_color;
00304     Clr                       m_original_color;
00305     bool                      m_original_color_specified;
00306     bool                      m_color_was_picked;
00307 
00308     std::string               m_new_str;
00309     std::string               m_old_str;
00310     std::string               m_red_str;
00311     std::string               m_green_str;
00312     std::string               m_blue_str;
00313     std::string               m_hue_str;
00314     std::string               m_saturation_str;
00315     std::string               m_value_str;
00316     std::string               m_alpha_str;
00317     std::string               m_ok_str;
00318     std::string               m_cancel_str;
00319 
00320     HueSaturationPicker*      m_hue_saturation_picker;
00321     ValuePicker*              m_value_picker;
00322     Layout*                   m_pickers_layout;
00323     ColorDisplay*             m_new_color_square;
00324     ColorDisplay*             m_old_color_square;
00325     TextControl*              m_new_color_square_text;
00326     TextControl*              m_old_color_square_text;
00327     Layout*                   m_color_squares_layout;
00328     std::vector<ColorButton*> m_color_buttons;
00329     Layout*                   m_color_buttons_layout;
00330     int                       m_current_color_button;
00331     std::vector<TextControl*> m_slider_labels;
00332     std::vector<TextControl*> m_slider_values;
00333     std::vector<Slider*>      m_sliders;
00334     bool                      m_ignore_sliders;
00335     Button*                   m_ok;
00336     Button*                   m_cancel;
00337     Layout*                   m_sliders_ok_cancel_layout;
00338 
00339     Clr                       m_color;
00340     Clr                       m_border_color;
00341     Clr                       m_text_color;
00342 
00343     static std::vector<Clr>   s_custom_colors;
00344 
00345     friend struct ColorButtonClickFunctor;
00346 
00347     friend class boost::serialization::access;
00348     template <class Archive>
00349     void serialize(Archive& ar, const unsigned int version);
00350 };
00351 
00352 } // namespace GG
00353 
00354 // template implementations
00355 template <class Archive>
00356 void GG::HSVClr::serialize(Archive& ar, const unsigned int version)
00357 {
00358     ar  & BOOST_SERIALIZATION_NVP(h)
00359         & BOOST_SERIALIZATION_NVP(s)
00360         & BOOST_SERIALIZATION_NVP(v)
00361         & BOOST_SERIALIZATION_NVP(a);
00362 }
00363 
00364 template <class Archive>
00365 void GG::HueSaturationPicker::serialize(Archive& ar, const unsigned int version)
00366 {
00367     ar  & BOOST_SERIALIZATION_BASE_OBJECT_NVP(Control)
00368         & BOOST_SERIALIZATION_NVP(m_hue)
00369         & BOOST_SERIALIZATION_NVP(m_saturation)
00370         & BOOST_SERIALIZATION_NVP(m_vertices)
00371         & BOOST_SERIALIZATION_NVP(m_colors);
00372 }
00373 
00374 template <class Archive>
00375 void GG::ValuePicker::serialize(Archive& ar, const unsigned int version)
00376 {
00377     ar  & BOOST_SERIALIZATION_BASE_OBJECT_NVP(Control)
00378         & BOOST_SERIALIZATION_NVP(m_hue)
00379         & BOOST_SERIALIZATION_NVP(m_saturation)
00380         & BOOST_SERIALIZATION_NVP(m_value)
00381         & BOOST_SERIALIZATION_NVP(m_arrow_color);
00382 }
00383 
00384 template <class Archive>
00385 void GG::ColorDlg::ColorButton::serialize(Archive& ar, const unsigned int version)
00386 {
00387     ar  & BOOST_SERIALIZATION_BASE_OBJECT_NVP(Button)
00388         & BOOST_SERIALIZATION_NVP(m_represented_color);
00389 }
00390 
00391 template <class Archive>
00392 void GG::ColorDlg::ColorDisplay::serialize(Archive& ar, const unsigned int version)
00393 {
00394     ar  & BOOST_SERIALIZATION_BASE_OBJECT_NVP(Control);
00395 }
00396 
00397 template <class Archive>
00398 void GG::ColorDlg::serialize(Archive& ar, const unsigned int version)
00399 {
00400     ar  & BOOST_SERIALIZATION_BASE_OBJECT_NVP(Wnd)
00401         & BOOST_SERIALIZATION_NVP(m_current_color)
00402         & BOOST_SERIALIZATION_NVP(m_original_color)
00403         & BOOST_SERIALIZATION_NVP(m_original_color_specified)
00404         & BOOST_SERIALIZATION_NVP(m_color_was_picked)
00405         & BOOST_SERIALIZATION_NVP(m_new_str)
00406         & BOOST_SERIALIZATION_NVP(m_old_str)
00407         & BOOST_SERIALIZATION_NVP(m_red_str)
00408         & BOOST_SERIALIZATION_NVP(m_green_str)
00409         & BOOST_SERIALIZATION_NVP(m_blue_str)
00410         & BOOST_SERIALIZATION_NVP(m_hue_str)
00411         & BOOST_SERIALIZATION_NVP(m_saturation_str)
00412         & BOOST_SERIALIZATION_NVP(m_value_str)
00413         & BOOST_SERIALIZATION_NVP(m_alpha_str)
00414         & BOOST_SERIALIZATION_NVP(m_ok_str)
00415         & BOOST_SERIALIZATION_NVP(m_cancel_str)
00416         & BOOST_SERIALIZATION_NVP(m_hue_saturation_picker)
00417         & BOOST_SERIALIZATION_NVP(m_value_picker)
00418         & BOOST_SERIALIZATION_NVP(m_pickers_layout)
00419         & BOOST_SERIALIZATION_NVP(m_new_color_square)
00420         & BOOST_SERIALIZATION_NVP(m_old_color_square)
00421         & BOOST_SERIALIZATION_NVP(m_new_color_square_text)
00422         & BOOST_SERIALIZATION_NVP(m_old_color_square_text)
00423         & BOOST_SERIALIZATION_NVP(m_color_squares_layout)
00424         & BOOST_SERIALIZATION_NVP(m_color_buttons)
00425         & BOOST_SERIALIZATION_NVP(m_color_buttons_layout)
00426         & BOOST_SERIALIZATION_NVP(m_current_color_button)
00427         & BOOST_SERIALIZATION_NVP(m_slider_labels)
00428         & BOOST_SERIALIZATION_NVP(m_slider_values)
00429         & BOOST_SERIALIZATION_NVP(m_sliders)
00430         & BOOST_SERIALIZATION_NVP(m_ignore_sliders)
00431         & BOOST_SERIALIZATION_NVP(m_ok)
00432         & BOOST_SERIALIZATION_NVP(m_cancel)
00433         & BOOST_SERIALIZATION_NVP(m_sliders_ok_cancel_layout)
00434         & BOOST_SERIALIZATION_NVP(m_color)
00435         & BOOST_SERIALIZATION_NVP(m_border_color)
00436         & BOOST_SERIALIZATION_NVP(m_text_color);
00437 
00438     if (Archive::is_loading::value)
00439         ConnectSignals();
00440 }
00441 
00442 #endif // _GG_ColorDlg_h_

Generated on Wed Mar 26 14:35:41 2008 for GG by  doxygen 1.5.2