GG
|
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_