00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
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 }
00356
00357
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_