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
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 }
00353
00354
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_