From e59f7a4ef5e64c60569b012d4781bbad51c4826c Mon Sep 17 00:00:00 2001 From: Angus Leeming Date: Wed, 23 Jul 2003 15:36:40 +0000 Subject: [PATCH] A color picker for xforms. git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@7352 a592a061-630c-0410-9148-cb99ea01b6c8 --- src/frontends/xforms/ChangeLog | 8 + src/frontends/xforms/Dialogs2.C | 1 + src/frontends/xforms/FormColorpicker.C | 369 ++++++++++++++++++ src/frontends/xforms/FormColorpicker.h | 89 +++++ src/frontends/xforms/FormPreferences.C | 237 +---------- src/frontends/xforms/FormPreferences.h | 13 +- src/frontends/xforms/Makefile.am | 2 + src/frontends/xforms/forms/Makefile.am | 1 + .../xforms/forms/form_colorpicker.fd | 286 ++++++++++++++ .../xforms/forms/form_preferences.fd | 226 +---------- 10 files changed, 783 insertions(+), 449 deletions(-) create mode 100644 src/frontends/xforms/FormColorpicker.C create mode 100644 src/frontends/xforms/FormColorpicker.h create mode 100644 src/frontends/xforms/forms/form_colorpicker.fd diff --git a/src/frontends/xforms/ChangeLog b/src/frontends/xforms/ChangeLog index b7dbd42fa5..691b9a15b4 100644 --- a/src/frontends/xforms/ChangeLog +++ b/src/frontends/xforms/ChangeLog @@ -1,3 +1,11 @@ +2003-07-23 Angus Leeming + + * FormColorpicker.[Ch] + * forms/form_colorpicker.fd: new files. A color picker for xforms. + + * FormPreferences.[Ch] + * forms/form_preferences.fd: use it. + 2003-07-23 Angus Leeming * FormExternal.C (apply, update): diff --git a/src/frontends/xforms/Dialogs2.C b/src/frontends/xforms/Dialogs2.C index 9b47ea8d9a..b36b22c136 100644 --- a/src/frontends/xforms/Dialogs2.C +++ b/src/frontends/xforms/Dialogs2.C @@ -32,6 +32,7 @@ #include "ControlPrefs.h" #include "FormPreferences.h" +#include "FormColorpicker.h" #include "forms/form_preferences.h" #include "ControlPrint.h" diff --git a/src/frontends/xforms/FormColorpicker.C b/src/frontends/xforms/FormColorpicker.C new file mode 100644 index 0000000000..77d808ea81 --- /dev/null +++ b/src/frontends/xforms/FormColorpicker.C @@ -0,0 +1,369 @@ +/** + * \file FormColorpicker.C + * This file is part of LyX, the document processor. + * Licence details can be found in the file COPYING. + * + * \author Angus Leeming + * + * Full author contact details are available in file CREDITS + */ + +#include + +#include "FormColorpicker.h" +#include "forms/form_colorpicker.h" + +#include "xforms_resize.h" +#include "Tooltips.h" +#include "Color.h" + +#include "gettext.h" +#include "lyxrc.h" + +#include "support/LAssert.h" +#include "support/filetools.h" // LibFileSearch +#include "support/tostr.h" + +#include "lyx_forms.h" + +#include "Lsstream.h" +#include + + +namespace { + +enum GuiColors { + GUI_COLOR_CHOICE = FL_FREE_COL13, + GUI_COLOR_HUE_DIAL = FL_FREE_COL14, +}; + + +string const fillLabel(RGBColor const & rgb) +{ + return tostr(rgb.r) + ", " + tostr(rgb.g) + ", " + tostr(rgb.b); +} + + +string const fillLabel(HSVColor const & hsv) +{ + int const h = int(hsv.h); + int const s = int(100.0 * hsv.s); + int const v = int(100.0 * hsv.v); + + return tostr(h) + ", " + tostr(s) + ", " + tostr(v); +} + +} // namespace anon + + +extern "C" { + +// Callback function invoked by xforms when the dialog is closed by the +// window manager. +static int C_WMHideCB(FL_FORM * form, void *); + +} // extern "C" + + +FormColorpicker::FormColorpicker() + : minw_(0), minh_(0), + title_(_("Select Color")), + finished_(true), + icon_pixmap_(0), icon_mask_(0), + tooltips_(new Tooltips) +{} + + +FormColorpicker::~FormColorpicker() +{ + if (icon_pixmap_) + XFreePixmap(fl_get_display(), icon_pixmap_); +} + + +RGBColor const & FormColorpicker::requestColor(RGBColor const & color) +{ + input_color_ = color; + color_ = color; + + show(); + + fl_deactivate_all_forms(); + fl_activate_form(form()); + + finished_ = false; + while (!finished_) + fl_check_forms(); + + fl_activate_all_forms(); + return color_; +} + + +void FormColorpicker::show() +{ + if (!form()) { + build(); + prepare_to_show(); + } + + // make sure the form is up to date. + fl_freeze_form(form()); + update(); + fl_unfreeze_form(form()); + + if (form()->visible) { + fl_raise_form(form()); + /* This XMapWindow() will hopefully ensure that + * iconified dialogs are de-iconified. Mad props + * out to those crazy Xlib guys for forgetting a + * XDeiconifyWindow(). At least WindowMaker, when + * being notified of the redirected MapRequest will + * specifically de-iconify. From source, fvwm2 seems + * to do the same. + */ + XMapWindow(fl_get_display(), form()->window); + } else { + // calls to fl_set_form_minsize/maxsize apply only to the next + // fl_show_form(), so this comes first. + fl_set_form_minsize(form(), minw_, minh_); + + string const maximize_title = "LyX: " + title_; + int const iconify_policy = + lyxrc.dialogs_iconify_with_main ? FL_TRANSIENT : 0; + + fl_show_form(form(), + FL_PLACE_MOUSE | FL_FREE_SIZE, + iconify_policy, + maximize_title.c_str()); + } +} + + +void FormColorpicker::hide() const +{ + // xforms sometimes tries to process a hint-type MotionNotify, and + // use XQueryPointer, without verifying if the window still exists. + // So we try to clear out motion events in the queue before the + // DestroyNotify + XSync(fl_get_display(), false); + + if (form() && form()->visible) + fl_hide_form(form()); +} + + +void FormColorpicker::build() +{ + dialog_.reset(build_colorpicker(this)); + rgb_.reset(build_colorpicker_rgb(this)); + hsv_.reset(build_colorpicker_hsv(this)); + + fl_set_object_color(dialog_->button_color, + GUI_COLOR_CHOICE, GUI_COLOR_CHOICE); + + fl_set_object_color(hsv_->dial_hue, GUI_COLOR_HUE_DIAL, FL_BLACK); + fl_set_dial_bounds(hsv_->dial_hue, 0.0, 360.0); + fl_set_dial_step(hsv_->dial_hue, 1.0); + fl_set_dial_return(hsv_->dial_hue, FL_RETURN_CHANGED); + + fl_set_slider_bounds(hsv_->slider_saturation, 0.0, 1.0); + fl_set_slider_step(hsv_->slider_saturation, 0.01); + fl_set_slider_return(hsv_->slider_saturation, FL_RETURN_CHANGED); + + fl_set_slider_bounds(hsv_->slider_value, 0.0, 1.0); + fl_set_slider_step(hsv_->slider_value, 0.01); + fl_set_slider_return(hsv_->slider_value, FL_RETURN_CHANGED); + + fl_set_slider_bounds(rgb_->slider_red, 0.0, 255.0); + fl_set_slider_step(rgb_->slider_red, 1.0); + fl_set_slider_return(rgb_->slider_red, FL_RETURN_CHANGED); + + fl_set_slider_bounds(rgb_->slider_green, 0.0, 255.0); + fl_set_slider_step(rgb_->slider_green, 1.0); + fl_set_slider_return(rgb_->slider_green, FL_RETURN_CHANGED); + + fl_set_slider_bounds(rgb_->slider_blue, 0.0, 255.0); + fl_set_slider_step(rgb_->slider_blue, 1.0); + fl_set_slider_return(rgb_->slider_blue, FL_RETURN_CHANGED); + + // Stack tabs + fl_addto_tabfolder(dialog_->tabfolder,_("RGB").c_str(), rgb_->form); + fl_addto_tabfolder(dialog_->tabfolder,_("HSV").c_str(), hsv_->form); +} + + +void FormColorpicker::update() const +{ + fl_mapcolor(GUI_COLOR_CHOICE, color_.r, color_.g, color_.b); + + FL_FORM * folder = fl_get_active_folder(dialog_->tabfolder); + + if (!folder) + folder = rgb_->form; + + if (folder == rgb_->form) { + fl_set_slider_value(rgb_->slider_red, color_.r); + fl_set_slider_value(rgb_->slider_green, color_.g); + fl_set_slider_value(rgb_->slider_blue, color_.b); + + fl_set_object_label(dialog_->text_color_values, + fillLabel(color_).c_str()); + + } else if (folder == hsv_->form) { + HSVColor hsv = HSVColor(color_); + hsv.h = std::max(hsv.h, 0.0); + + fl_set_dial_value(hsv_->dial_hue, hsv.h); + fl_set_slider_value(hsv_->slider_saturation, hsv.s); + fl_set_slider_value(hsv_->slider_value, hsv.v); + + fl_set_object_label(dialog_->text_color_values, + fillLabel(hsv).c_str()); + + RGBColor col = HSVColor(hsv.h, 1.0, 1.0); + col.r = std::max(col.r, 0u); + fl_mapcolor(GUI_COLOR_HUE_DIAL, col.r, col.g, col.b); + fl_redraw_object(hsv_->dial_hue); + } +} + + +void FormColorpicker::input(FL_OBJECT * ob, long) +{ + if (ob == dialog_->tabfolder) { + update(); + + } else if (ob == hsv_->dial_hue || + ob == hsv_->slider_saturation || + ob == hsv_->slider_value) { + InputHSV(); + + } else if (ob == rgb_->slider_red || + ob == rgb_->slider_green || + ob == rgb_->slider_blue) { + InputRGB(); + + } else if (ob == dialog_->button_ok) { + hide(); + finished_ = true; + + } else if (ob == dialog_->button_close || ob == 0) { + color_ = input_color_; + hide(); + finished_ = true; + } +} + + +FL_FORM * FormColorpicker::form() const +{ + return dialog_.get() ? dialog_->form : 0; +} + + +Tooltips & FormColorpicker::tooltips() const +{ + return *tooltips_; +} + + +void FormColorpicker::prepare_to_show() +{ + double const scale = get_scale_to_fit(form()); + if (scale > 1.001) + scale_form_horizontally(form(), scale); + + // work around dumb xforms sizing bug + minw_ = form()->w; + minh_ = form()->h; + + fl_set_form_atclose(form(), C_WMHideCB, 0); + + // set the title for the minimized form + if (!lyxrc.dialogs_iconify_with_main) + fl_winicontitle(form()->window, title_.c_str()); + + // assign an icon to the form + string const iconname = + lyx::support::LibFileSearch("images", "lyx", "xpm"); + + if (!iconname.empty()) { + unsigned int w, h; + icon_pixmap_ = fl_read_pixmapfile(fl_root, + iconname.c_str(), + &w, + &h, + &icon_mask_, + 0, 0, 0); + fl_set_form_icon(form(), icon_pixmap_, icon_mask_); + } +} + + +void FormColorpicker::InputRGB() +{ + int const red = int(fl_get_slider_value(rgb_->slider_red)); + int const green = int(fl_get_slider_value(rgb_->slider_green)); + int const blue = int(fl_get_slider_value(rgb_->slider_blue)); + + color_ = RGBColor(red, green, blue); + + fl_freeze_form(dialog_->form); + + fl_set_object_label(dialog_->text_color_values, + fillLabel(color_).c_str()); + + fl_mapcolor(GUI_COLOR_CHOICE, color_.r, color_.g, color_.b); + fl_redraw_object(dialog_->button_color); + + fl_unfreeze_form(dialog_->form); +} + + +void FormColorpicker::InputHSV() +{ + double const hue = fl_get_dial_value(hsv_->dial_hue); + double const sat = fl_get_slider_value(hsv_->slider_saturation); + double const val = fl_get_slider_value(hsv_->slider_value); + + HSVColor hsv = HSVColor(hue, sat, val); + color_ = hsv; + + fl_freeze_form(dialog_->form); + + fl_set_object_label(dialog_->text_color_values, fillLabel(hsv).c_str()); + + fl_mapcolor(GUI_COLOR_CHOICE, color_.r, color_.g, color_.b); + fl_redraw_object(dialog_->button_color); + + RGBColor col = HSVColor(hue, 1.0, 1.0); + col.r = std::max(col.r, 0u); + fl_mapcolor(GUI_COLOR_HUE_DIAL, col.r, col.g, col.b); + fl_redraw_object(hsv_->dial_hue); + + fl_unfreeze_form(dialog_->form); +} + + +extern "C" { + +void C_FormColorpickerInputCB(FL_OBJECT * ob, long d) +{ + lyx::support::Assert(ob && ob->form && ob->form->u_vdata); + FormColorpicker * ptr = + static_cast(ob->form->u_vdata); + ptr->input(ob, d); +} + + +static int C_WMHideCB(FL_FORM * form, void *) +{ + // Close the dialog cleanly, even if the WM is used to do so. + lyx::support::Assert(form && form->u_vdata); + FormColorpicker * ptr = static_cast(form->u_vdata); + ptr->input(0, 0); + return FL_CANCEL; +} + +} // extern "C" diff --git a/src/frontends/xforms/FormColorpicker.h b/src/frontends/xforms/FormColorpicker.h new file mode 100644 index 0000000000..c1eb3b89d3 --- /dev/null +++ b/src/frontends/xforms/FormColorpicker.h @@ -0,0 +1,89 @@ +// -*- C++ -*- +/** + * \file FormColorpicker.h + * This file is part of LyX, the document processor. + * Licence details can be found in the file COPYING. + * + * \author Angus Leeming + * + * Full author contact details are available in file CREDITS + */ + +#ifndef FORMCOLORPICKER_H +#define FORMCOLORPICKER_H + +#include "Color.h" +#include "forms_fwd.h" + +#include "LString.h" +#include +#include // for Pixmap + + +class Tooltips; +class FD_colorpicker; +class FD_colorpicker_rgb; +class FD_colorpicker_hsv; + + +class FormColorpicker +{ +public: + FormColorpicker(); + ~FormColorpicker(); + + /** Launch the color picker. All other dialogs are frozen till + a color is chosen (or the dialog is closed). + \param color the color used to initialise the dialog. + */ + RGBColor const & requestColor(RGBColor const & color); + + /** Input callback function. + * Invoked only by the xforms callback interface + */ + void input(FL_OBJECT *, long); + +private: + /// Build the dialog + void build(); + /// Hide the dialog. + void hide() const; + /// Create the dialog if necessary, update it and display it. + void show(); + /// Update dialog before/whilst showing it. + void update() const; + + Tooltips & tooltips() const; + /// Pointer to the actual instantiation of xform's form + FL_FORM * form() const; + + /** Called on the first show() request, initialising various bits and + * pieces. + */ + void prepare_to_show(); + + void InputRGB(); + void InputHSV(); + + /// The dialog's minimum allowable dimensions. + int minw_; + int minh_; + + /// The title displayed by the Window Manager. + string title_; + + RGBColor input_color_; + RGBColor color_; + bool finished_; + + /// Passed to the window manager to give a pretty little symbol ;-) + Pixmap icon_pixmap_; + Pixmap icon_mask_; + + boost::scoped_ptr tooltips_; + boost::scoped_ptr dialog_; + boost::scoped_ptr rgb_; + boost::scoped_ptr hsv_; +}; + +#endif // FORMCOLORPICKER_H diff --git a/src/frontends/xforms/FormPreferences.C b/src/frontends/xforms/FormPreferences.C index 082dee34b1..b80e30eca8 100644 --- a/src/frontends/xforms/FormPreferences.C +++ b/src/frontends/xforms/FormPreferences.C @@ -16,6 +16,7 @@ #include "xformsBC.h" #include "ButtonController.h" +#include "FormColorpicker.h" #include "Color.h" #include "input_validators.h" #include "forms_gettext.h" @@ -506,48 +507,16 @@ void FormPreferences::Colors::apply() void FormPreferences::Colors::build() { + picker_.reset(new FormColorpicker); dialog_.reset(build_preferences_colors(&parent_)); fl_set_object_color(dialog_->button_color, GUI_COLOR_CHOICE, GUI_COLOR_CHOICE); - fl_set_object_color(dialog_->dial_hue, GUI_COLOR_HUE_DIAL, FL_BLACK); - fl_set_dial_bounds(dialog_->dial_hue, 0.0, 360.0); - fl_set_dial_step(dialog_->dial_hue, 1.0); - fl_set_dial_return(dialog_->dial_hue, FL_RETURN_CHANGED); - - fl_set_slider_bounds(dialog_->slider_saturation, 0.0, 1.0); - fl_set_slider_step(dialog_->slider_saturation, 0.01); - fl_set_slider_return(dialog_->slider_saturation, FL_RETURN_CHANGED); - - fl_set_slider_bounds(dialog_->slider_value, 0.0, 1.0); - fl_set_slider_step(dialog_->slider_value, 0.01); - fl_set_slider_return(dialog_->slider_value, FL_RETURN_CHANGED); - - fl_set_slider_bounds(dialog_->slider_red, 0.0, 255.0); - fl_set_slider_step(dialog_->slider_red, 1.0); - fl_set_slider_return(dialog_->slider_red, FL_RETURN_CHANGED); - - fl_set_slider_bounds(dialog_->slider_green, 0.0, 255.0); - fl_set_slider_step(dialog_->slider_green, 1.0); - fl_set_slider_return(dialog_->slider_green, FL_RETURN_CHANGED); - - fl_set_slider_bounds(dialog_->slider_blue, 0.0, 255.0); - fl_set_slider_step(dialog_->slider_blue, 1.0); - fl_set_slider_return(dialog_->slider_blue, FL_RETURN_CHANGED); - // set up the feedback mechanism setPrehandler(dialog_->browser_lyx_objs); setPrehandler(dialog_->button_color); setPrehandler(dialog_->button_modify); - setPrehandler(dialog_->dial_hue); - setPrehandler(dialog_->slider_saturation); - setPrehandler(dialog_->slider_value); - setPrehandler(dialog_->slider_red); - setPrehandler(dialog_->slider_green); - setPrehandler(dialog_->slider_blue); - setPrehandler(dialog_->radio_rgb); - setPrehandler(dialog_->radio_hsv); } @@ -560,17 +529,6 @@ FormPreferences::Colors::feedback(FL_OBJECT const * const ob) const if (ob == dialog_->button_modify) return _("Modify the LyX object's color. Note: you must then \"Apply\" the change."); - if (ob == dialog_->dial_hue || - ob == dialog_->slider_saturation || - ob == dialog_->slider_value || - ob == dialog_->slider_red || - ob == dialog_->slider_green || - ob == dialog_->slider_blue) - return _("Find a new color."); - - if (ob == dialog_->radio_rgb || ob == dialog_->radio_hsv) - return _("Toggle between RGB and HSV color spaces."); - return string(); } @@ -580,20 +538,6 @@ void FormPreferences::Colors::input(FL_OBJECT const * const ob) if (ob == dialog_->browser_lyx_objs) { InputBrowserLyX(); - } else if (ob == dialog_->dial_hue || - ob == dialog_->slider_saturation || - ob == dialog_->slider_value) { - InputHSV(); - - } else if (ob == dialog_->slider_red || - ob == dialog_->slider_green || - ob == dialog_->slider_blue) { - InputRGB(); - - } else if (ob == dialog_->radio_rgb || - ob == dialog_->radio_hsv) { - SwitchColorSpace(); - } else if (ob == dialog_->button_modify) { Modify(); } @@ -640,105 +584,7 @@ void FormPreferences::Colors::InputBrowserLyX() const fl_mapcolor(GUI_COLOR_CHOICE, col.r, col.g, col.b); fl_redraw_object(dialog_->button_color); - // Display either RGB or HSV but not both! - SwitchColorSpace(); - - // Deactivate the modify button to begin with... - setEnabled(dialog_->button_modify, false); - - fl_unfreeze_form(dialog_->form); -} - - -void FormPreferences::Colors::InputHSV() -{ - double const hue = fl_get_dial_value(dialog_->dial_hue); - double const sat = fl_get_slider_value(dialog_->slider_saturation); - double const val = fl_get_slider_value(dialog_->slider_value); - - int const h = int(hue); - int const s = int(100.0 * sat); - int const v = int(100.0 * val); - - string const label = tostr(h) + ", " + tostr(s) + ", " + tostr(v); - fl_set_object_label(dialog_->text_color_values, label.c_str()); - - RGBColor col = HSVColor(hue, sat, val); - - fl_freeze_form(dialog_->form); - - fl_mapcolor(GUI_COLOR_CHOICE, col.r, col.g, col.b); - fl_redraw_object(dialog_->button_color); - - col = HSVColor(hue, 1.0, 1.0); - col.r = max(col.r, 0u); - fl_mapcolor(GUI_COLOR_HUE_DIAL, col.r, col.g, col.b); - fl_redraw_object(dialog_->dial_hue); - - // Ascertain whether to activate the Modify button. - vector::size_type const selLyX = - fl_get_browser(dialog_->browser_lyx_objs); - fl_unfreeze_form(dialog_->form); - if (selLyX < 1) return; - - fl_getmcolor(GUI_COLOR_CHOICE, &col.r, &col.g, &col.b); - bool modify = false; - - // Is the choice an Xforms color... - if (selLyX - 1 < xformsColorDB.size()) { - vector::size_type const i = selLyX - 1; - modify = (xformsColorDB[i].color() != col); - } - // or a LyX Logical color? - else { - vector::size_type const i = selLyX - 1 - - xformsColorDB.size(); - modify = (lyxColorDB[i].color() != col); - } - - setEnabled(dialog_->button_modify, modify); -} - - -void FormPreferences::Colors::InputRGB() -{ - int const red = int(fl_get_slider_value(dialog_->slider_red)); - int const green = int(fl_get_slider_value(dialog_->slider_green)); - int const blue = int(fl_get_slider_value(dialog_->slider_blue)); - - string const label = tostr(red) + string(", ") + tostr(green) + - string(", ") + tostr(blue); - fl_set_object_label(dialog_->text_color_values, label.c_str()); - - fl_freeze_form(dialog_->form); - - RGBColor col = RGBColor(red, green, blue); - fl_mapcolor(GUI_COLOR_CHOICE, col.r, col.g, col.b); - fl_redraw_object(dialog_->button_color); - - // Ascertain whether to activate the Modify button. - vector::size_type const selLyX = - fl_get_browser(dialog_->browser_lyx_objs); - - fl_unfreeze_form(dialog_->form); - if (selLyX < 1) return; - - bool modify = false; - - // Is the choice an Xforms color... - if (selLyX - 1 < xformsColorDB.size()) { - vector::size_type const i = selLyX - 1; - modify = (xformsColorDB[i].color() != col); - } - // or a LyX Logical color? - else { - vector::size_type const i = selLyX - 1 - - xformsColorDB.size(); - modify = (lyxColorDB[i].color() != col); - } - - setEnabled(dialog_->button_modify, modify); } @@ -851,8 +697,15 @@ void FormPreferences::Colors::Modify() if (selLyX < 1) return; - RGBColor col; - fl_getmcolor(GUI_COLOR_CHOICE, &col.r, &col.g, &col.b); + RGBColor before; + fl_getmcolor(GUI_COLOR_CHOICE, &before.r, &before.g, &before.b); + + RGBColor col = picker_->requestColor(before); + if (before == col) + return; + + fl_mapcolor(GUI_COLOR_CHOICE, col.r, col.g, col.b); + fl_redraw_object(dialog_->button_color); // Is the choice an Xforms color... if (selLyX - 1 < xformsColorDB.size()) { @@ -869,74 +722,6 @@ void FormPreferences::Colors::Modify() lyxColorDB[i].g = col.g; lyxColorDB[i].b = col.b; } - - fl_freeze_form(dialog_->form); - setEnabled(dialog_->button_modify, false); - fl_unfreeze_form(dialog_->form); -} - - -void FormPreferences::Colors::SwitchColorSpace() const -{ - bool const hsv = fl_get_button(dialog_->radio_hsv); - - RGBColor col; - fl_getmcolor(GUI_COLOR_CHOICE, &col.r, &col.g, &col.b); - - fl_freeze_form(dialog_->form); - - if (hsv) { - fl_hide_object(dialog_->slider_red); - fl_hide_object(dialog_->slider_blue); - fl_hide_object(dialog_->slider_green); - fl_show_object(dialog_->dial_hue); - fl_show_object(dialog_->slider_saturation); - fl_show_object(dialog_->slider_value); - - HSVColor hsv = HSVColor(col); - hsv.h = max(hsv.h, 0.0); - - fl_set_dial_value(dialog_->dial_hue, hsv.h); - fl_set_slider_value(dialog_->slider_saturation, hsv.s); - fl_set_slider_value(dialog_->slider_value, hsv.v); - - col = HSVColor(hsv.h, 1.0, 1.0); - col.r = max(col.r, 0u); - fl_mapcolor(GUI_COLOR_HUE_DIAL, col.r, col.g, col.b); - fl_redraw_object(dialog_->dial_hue); - - // Adjust the label a bit, but not the actual values. - // Means that toggling from one space to the other has no - // effect on the final color. - int const h = int(hsv.h); - int const s = int(100 * hsv.s); - int const v = int(100 * hsv.v); - string const label = tostr(h) + ", " + tostr(s) + - ", " + tostr(v); - fl_set_object_label(dialog_->text_color_values, label.c_str()); - - } else { - fl_show_object(dialog_->slider_red); - fl_show_object(dialog_->slider_blue); - fl_show_object(dialog_->slider_green); - fl_hide_object(dialog_->dial_hue); - fl_hide_object(dialog_->slider_saturation); - fl_hide_object(dialog_->slider_value); - - fl_set_slider_value(dialog_->slider_red, col.r); - fl_set_slider_value(dialog_->slider_green, col.g); - fl_set_slider_value(dialog_->slider_blue, col.b); - - // Adjust the label a bit. Same reasoning as above. - int const r = int(col.r); - int const g = int(col.g); - int const b = int(col.b); - string const label = tostr(r) + ", " + tostr(g) + - ", " + tostr(b); - fl_set_object_label(dialog_->text_color_values, label.c_str()); - } - - fl_unfreeze_form(dialog_->form); } diff --git a/src/frontends/xforms/FormPreferences.h b/src/frontends/xforms/FormPreferences.h index 5a81542a80..6a44c26b4e 100644 --- a/src/frontends/xforms/FormPreferences.h +++ b/src/frontends/xforms/FormPreferences.h @@ -28,6 +28,8 @@ class ControlPrefs; class Dialogs; class LyXView; class RGBColor; +class FormColorpicker; + struct FD_preferences; struct FD_preferences_colors; struct FD_preferences_converters; @@ -87,8 +89,7 @@ private: public: /// enum GuiColors { - GUI_COLOR_CHOICE = FL_FREE_COL14, - GUI_COLOR_HUE_DIAL = FL_FREE_COL15, + GUI_COLOR_CHOICE = FL_FREE_COL15, GUI_COLOR_CURSOR = FL_FREE_COL16 }; /// @@ -115,20 +116,16 @@ private: /// void InputBrowserLyX() const; /// - void InputHSV(); - /// - void InputRGB(); - /// void LoadBrowserLyX(); /// void Modify(); - /// - void SwitchColorSpace() const; /// FormPreferences & parent_; /// boost::scoped_ptr dialog_; + /// + boost::scoped_ptr picker_; /// A vector of LyX LColor GUI name and associated RGB color. std::vector lyxColorDB; diff --git a/src/frontends/xforms/Makefile.am b/src/frontends/xforms/Makefile.am index 138ccb1674..fa80744323 100644 --- a/src/frontends/xforms/Makefile.am +++ b/src/frontends/xforms/Makefile.am @@ -77,6 +77,8 @@ libxforms_la_SOURCES = \ FormCharacter.h \ FormCitation.C \ FormCitation.h \ + FormColorpicker.C \ + FormColorpicker.h \ FormDocument.C \ FormDocument.h \ FormErrorList.C \ diff --git a/src/frontends/xforms/forms/Makefile.am b/src/frontends/xforms/forms/Makefile.am index 0c4f98274b..cfffa65b98 100644 --- a/src/frontends/xforms/forms/Makefile.am +++ b/src/frontends/xforms/forms/Makefile.am @@ -16,6 +16,7 @@ SRCS = form_aboutlyx.fd \ form_changes.fd \ form_character.fd \ form_citation.fd \ + form_colorpicker.fd \ form_document.fd \ form_errorlist.fd \ form_ert.fd \ diff --git a/src/frontends/xforms/forms/form_colorpicker.fd b/src/frontends/xforms/forms/form_colorpicker.fd new file mode 100644 index 0000000000..cd95cfae60 --- /dev/null +++ b/src/frontends/xforms/forms/form_colorpicker.fd @@ -0,0 +1,286 @@ +Magic: 13000 + +Internal Form Definition File + (do not change) + +Number of forms: 3 +Unit of measure: FL_COORD_PIXEL +SnapGrid: 5 + +=============== FORM =============== +Name: form_colorpicker +Width: 270 +Height: 360 +Number of Objects: 6 + +-------------------- +class: FL_BOX +type: UP_BOX +box: 0 0 270 360 +boxtype: FL_FLAT_BOX +colors: FL_COL1 FL_COL1 +alignment: FL_ALIGN_CENTER +style: FL_NORMAL_STYLE +size: FL_DEFAULT_SIZE +lcol: FL_BLACK +label: +shortcut: +resize: FL_RESIZE_ALL +gravity: FL_NoGravity FL_NoGravity +name: +callback: +argument: + +-------------------- +class: FL_TABFOLDER +type: TOP_TABFOLDER +box: 10 25 255 235 +boxtype: FL_FRAME_BOX +colors: FL_COL1 FL_COL1 +alignment: FL_ALIGN_TOP_LEFT +style: FL_NORMAL_STYLE +size: FL_NORMAL_SIZE +lcol: FL_BLACK +label: tabbed folder +shortcut: +resize: FL_RESIZE_NONE +gravity: FL_NorthWest FL_SouthEast +name: tabfolder +callback: C_FormColorpickerInputCB +argument: 0 + +-------------------- +class: FL_BUTTON +type: NORMAL_BUTTON +box: 10 280 100 30 +boxtype: FL_BORDER_BOX +colors: FL_WHITE FL_COL1 +alignment: FL_ALIGN_CENTER +style: FL_NORMAL_STYLE +size: FL_DEFAULT_SIZE +lcol: FL_BLACK +label: +shortcut: +resize: FL_RESIZE_ALL +gravity: FL_NoGravity FL_NoGravity +name: button_color +callback: +argument: + +-------------------- +class: FL_TEXT +type: NORMAL_TEXT +box: 115 280 150 30 +boxtype: FL_DOWN_BOX +colors: FL_COL1 FL_MCOL +alignment: FL_ALIGN_LEFT|FL_ALIGN_INSIDE +style: FL_NORMAL_STYLE +size: FL_DEFAULT_SIZE +lcol: FL_BLACK +label: +shortcut: +resize: FL_RESIZE_ALL +gravity: FL_NoGravity FL_NoGravity +name: text_color_values +callback: +argument: + +-------------------- +class: FL_BUTTON +type: RETURN_BUTTON +box: 80 330 90 25 +boxtype: FL_UP_BOX +colors: FL_COL1 FL_COL1 +alignment: FL_ALIGN_CENTER +style: FL_NORMAL_STYLE +size: FL_NORMAL_SIZE +lcol: FL_BLACK +label: OK +shortcut: ^M +resize: FL_RESIZE_ALL +gravity: FL_SouthEast FL_SouthEast +name: button_ok +callback: C_FormColorpickerInputCB +argument: 0 + +-------------------- +class: FL_BUTTON +type: NORMAL_BUTTON +box: 175 330 90 25 +boxtype: FL_UP_BOX +colors: FL_COL1 FL_COL1 +alignment: FL_ALIGN_CENTER +style: FL_NORMAL_STYLE +size: FL_NORMAL_SIZE +lcol: FL_BLACK +label: Cancel|^[ +shortcut: +resize: FL_RESIZE_ALL +gravity: FL_SouthEast FL_SouthEast +name: button_close +callback: C_FormColorpickerInputCB +argument: 0 + +=============== FORM =============== +Name: form_colorpicker_rgb +Width: 255 +Height: 220 +Number of Objects: 4 + +-------------------- +class: FL_BOX +type: UP_BOX +box: 0 0 255 220 +boxtype: FL_UP_BOX +colors: FL_COL1 FL_COL1 +alignment: FL_ALIGN_CENTER +style: FL_NORMAL_STYLE +size: FL_DEFAULT_SIZE +lcol: FL_BLACK +label: +shortcut: +resize: FL_RESIZE_ALL +gravity: FL_NoGravity FL_NoGravity +name: +callback: +argument: + +-------------------- +class: FL_SLIDER +type: VERT_FILL_SLIDER +box: 55 30 40 140 +boxtype: FL_DOWN_BOX +colors: FL_COL1 FL_RED +alignment: FL_ALIGN_BOTTOM +style: FL_NORMAL_STYLE +size: FL_NORMAL_SIZE +lcol: FL_BLACK +label: R|#R +shortcut: +resize: FL_RESIZE_ALL +gravity: FL_NoGravity FL_NoGravity +name: slider_red +callback: C_FormColorpickerInputCB +argument: 0 + slsize: 0.15 + +-------------------- +class: FL_SLIDER +type: VERT_FILL_SLIDER +box: 110 30 40 140 +boxtype: FL_DOWN_BOX +colors: FL_COL1 FL_GREEN +alignment: FL_ALIGN_BOTTOM +style: FL_NORMAL_STYLE +size: FL_NORMAL_SIZE +lcol: FL_BLACK +label: G|#G +shortcut: +resize: FL_RESIZE_ALL +gravity: FL_NoGravity FL_NoGravity +name: slider_green +callback: C_FormColorpickerInputCB +argument: 0 + slsize: 0.15 + +-------------------- +class: FL_SLIDER +type: VERT_FILL_SLIDER +box: 165 30 40 140 +boxtype: FL_DOWN_BOX +colors: FL_COL1 FL_BLUE +alignment: FL_ALIGN_BOTTOM +style: FL_NORMAL_STYLE +size: FL_NORMAL_SIZE +lcol: FL_BLACK +label: B|#B +shortcut: +resize: FL_RESIZE_ALL +gravity: FL_NoGravity FL_NoGravity +name: slider_blue +callback: C_FormColorpickerInputCB +argument: 0 + slsize: 0.15 + +=============== FORM =============== +Name: form_colorpicker_hsv +Width: 255 +Height: 220 +Number of Objects: 4 + +-------------------- +class: FL_BOX +type: UP_BOX +box: 0 0 255 220 +boxtype: FL_UP_BOX +colors: FL_COL1 FL_COL1 +alignment: FL_ALIGN_CENTER +style: FL_NORMAL_STYLE +size: FL_DEFAULT_SIZE +lcol: FL_BLACK +label: +shortcut: +resize: FL_RESIZE_ALL +gravity: FL_NoGravity FL_NoGravity +name: +callback: +argument: + +-------------------- +class: FL_DIAL +type: NORMAL_DIAL +box: 91 8 100 100 +boxtype: FL_FLAT_BOX +colors: FL_COL1 FL_RIGHT_BCOL +alignment: FL_ALIGN_CENTER +style: FL_NORMAL_STYLE +size: FL_DEFAULT_SIZE +lcol: FL_BLACK +label: H|#H +shortcut: +resize: FL_RESIZE_ALL +gravity: FL_NoGravity FL_NoGravity +name: dial_hue +callback: C_FormColorpickerInputCB +argument: 0 + +-------------------- +class: FL_SLIDER +type: HOR_NICE_SLIDER +box: 65 115 150 30 +boxtype: FL_DOWN_BOX +colors: FL_COL1 FL_COL1 +alignment: FL_ALIGN_LEFT +style: FL_NORMAL_STYLE +size: FL_NORMAL_SIZE +lcol: FL_BLACK +label: S|#S +shortcut: +resize: FL_RESIZE_ALL +gravity: FL_NoGravity FL_NoGravity +name: slider_saturation +callback: C_FormColorpickerInputCB +argument: 0 + slsize: 0.15 + +-------------------- +class: FL_SLIDER +type: HOR_NICE_SLIDER +box: 65 155 150 30 +boxtype: FL_DOWN_BOX +colors: FL_COL1 FL_COL1 +alignment: FL_ALIGN_LEFT +style: FL_NORMAL_STYLE +size: FL_NORMAL_SIZE +lcol: FL_BLACK +label: V|#V +shortcut: +resize: FL_RESIZE_ALL +gravity: FL_NoGravity FL_NoGravity +name: slider_value +callback: C_FormColorpickerInputCB +argument: 0 + slsize: 0.15 + +============================== +create_the_forms diff --git a/src/frontends/xforms/forms/form_preferences.fd b/src/frontends/xforms/forms/form_preferences.fd index fb30e66632..eea380d9d8 100644 --- a/src/frontends/xforms/forms/form_preferences.fd +++ b/src/frontends/xforms/forms/form_preferences.fd @@ -782,7 +782,7 @@ argument: 0 Name: form_preferences_colors Width: 450 Height: 360 -Number of Objects: 15 +Number of Objects: 4 -------------------- class: FL_BOX @@ -820,214 +820,10 @@ name: browser_lyx_objs callback: C_FormBaseInputCB argument: 0 --------------------- -class: FL_DIAL -type: NORMAL_DIAL -box: 276 23 100 100 -boxtype: FL_FLAT_BOX -colors: FL_COL1 FL_RIGHT_BCOL -alignment: FL_ALIGN_CENTER -style: FL_NORMAL_STYLE -size: FL_DEFAULT_SIZE -lcol: FL_BLACK -label: H|#H -shortcut: -resize: FL_RESIZE_ALL -gravity: FL_NoGravity FL_NoGravity -name: dial_hue -callback: C_FormBaseInputCB -argument: 0 - --------------------- -class: FL_SLIDER -type: HOR_NICE_SLIDER -box: 251 135 150 30 -boxtype: FL_DOWN_BOX -colors: FL_COL1 FL_COL1 -alignment: FL_ALIGN_LEFT -style: FL_NORMAL_STYLE -size: FL_NORMAL_SIZE -lcol: FL_BLACK -label: S|#S -shortcut: -resize: FL_RESIZE_ALL -gravity: FL_NoGravity FL_NoGravity -name: slider_saturation -callback: C_FormBaseInputCB -argument: 0 - slsize: 0.15 - --------------------- -class: FL_SLIDER -type: HOR_NICE_SLIDER -box: 251 175 150 30 -boxtype: FL_DOWN_BOX -colors: FL_COL1 FL_COL1 -alignment: FL_ALIGN_LEFT -style: FL_NORMAL_STYLE -size: FL_NORMAL_SIZE -lcol: FL_BLACK -label: V|#V -shortcut: -resize: FL_RESIZE_ALL -gravity: FL_NoGravity FL_NoGravity -name: slider_value -callback: C_FormBaseInputCB -argument: 0 - slsize: 0.15 - --------------------- -class: FL_SLIDER -type: VERT_FILL_SLIDER -box: 250 25 40 180 -boxtype: FL_DOWN_BOX -colors: FL_COL1 FL_RED -alignment: FL_ALIGN_BOTTOM -style: FL_NORMAL_STYLE -size: FL_NORMAL_SIZE -lcol: FL_BLACK -label: R|#R -shortcut: -resize: FL_RESIZE_ALL -gravity: FL_NoGravity FL_NoGravity -name: slider_red -callback: C_FormBaseInputCB -argument: 0 - slsize: 0.15 - --------------------- -class: FL_SLIDER -type: VERT_FILL_SLIDER -box: 305 25 40 180 -boxtype: FL_DOWN_BOX -colors: FL_COL1 FL_GREEN -alignment: FL_ALIGN_BOTTOM -style: FL_NORMAL_STYLE -size: FL_NORMAL_SIZE -lcol: FL_BLACK -label: G|#G -shortcut: -resize: FL_RESIZE_ALL -gravity: FL_NoGravity FL_NoGravity -name: slider_green -callback: C_FormBaseInputCB -argument: 0 - slsize: 0.15 - --------------------- -class: FL_SLIDER -type: VERT_FILL_SLIDER -box: 360 25 40 180 -boxtype: FL_DOWN_BOX -colors: FL_COL1 FL_BLUE -alignment: FL_ALIGN_BOTTOM -style: FL_NORMAL_STYLE -size: FL_NORMAL_SIZE -lcol: FL_BLACK -label: B|#B -shortcut: -resize: FL_RESIZE_ALL -gravity: FL_NoGravity FL_NoGravity -name: slider_blue -callback: C_FormBaseInputCB -argument: 0 - slsize: 0.15 - --------------------- -class: FL_BEGIN_GROUP -type: 0 -box: 0 10 10 0 -boxtype: FL_NO_BOX -colors: FL_COL1 FL_MCOL -alignment: FL_ALIGN_CENTER -style: FL_NORMAL_STYLE -size: FL_DEFAULT_SIZE -lcol: FL_BLACK -label: -shortcut: -resize: FL_RESIZE_ALL -gravity: FL_NoGravity FL_NoGravity -name: -callback: -argument: - --------------------- -class: FL_ROUND3DBUTTON -type: RADIO_BUTTON -box: 250 220 30 30 -boxtype: FL_NO_BOX -colors: FL_COL1 FL_YELLOW -alignment: FL_ALIGN_RIGHT -style: FL_NORMAL_STYLE -size: FL_DEFAULT_SIZE -lcol: FL_BLACK -label: HSV -shortcut: -resize: FL_RESIZE_ALL -gravity: FL_NoGravity FL_NoGravity -name: radio_hsv -callback: C_FormBaseInputCB -argument: 0 - --------------------- -class: FL_ROUND3DBUTTON -type: RADIO_BUTTON -box: 335 220 30 30 -boxtype: FL_NO_BOX -colors: FL_COL1 FL_YELLOW -alignment: FL_ALIGN_RIGHT -style: FL_NORMAL_STYLE -size: FL_DEFAULT_SIZE -lcol: FL_BLACK -label: RGB -shortcut: -resize: FL_RESIZE_ALL -gravity: FL_NoGravity FL_NoGravity -name: radio_rgb -callback: C_FormBaseInputCB -argument: 0 - value: 1 - --------------------- -class: FL_END_GROUP -type: 0 -box: 0 0 0 0 -boxtype: FL_NO_BOX -colors: FL_COL1 FL_MCOL -alignment: FL_ALIGN_CENTER -style: FL_NORMAL_STYLE -size: FL_DEFAULT_SIZE -lcol: FL_BLACK -label: -shortcut: -resize: FL_RESIZE_ALL -gravity: FL_NoGravity FL_NoGravity -name: -callback: -argument: - --------------------- -class: FL_TEXT -type: NORMAL_TEXT -box: 250 250 150 30 -boxtype: FL_DOWN_BOX -colors: FL_COL1 FL_MCOL -alignment: FL_ALIGN_LEFT|FL_ALIGN_INSIDE -style: FL_NORMAL_STYLE -size: FL_DEFAULT_SIZE -lcol: FL_BLACK -label: -shortcut: -resize: FL_RESIZE_ALL -gravity: FL_NoGravity FL_NoGravity -name: text_color_values -callback: -argument: - -------------------- class: FL_BUTTON type: NORMAL_BUTTON -box: 250 285 60 30 +box: 245 155 60 30 boxtype: FL_BORDER_BOX colors: FL_WHITE FL_COL1 alignment: FL_ALIGN_CENTER @@ -1045,7 +841,7 @@ argument: -------------------- class: FL_BUTTON type: NORMAL_BUTTON -box: 310 285 90 30 +box: 310 155 90 30 boxtype: FL_UP_BOX colors: FL_COL1 FL_COL1 alignment: FL_ALIGN_CENTER @@ -1238,13 +1034,13 @@ alignment: FL_ALIGN_CENTER style: FL_NORMAL_STYLE size: FL_DEFAULT_SIZE lcol: FL_BLACK -label: -shortcut: +label: +shortcut: resize: FL_RESIZE_ALL gravity: FL_NoGravity FL_NoGravity -name: -callback: -argument: +name: +callback: +argument: -------------------- class: FL_INPUT @@ -1257,7 +1053,7 @@ style: FL_NORMAL_STYLE size: FL_DEFAULT_SIZE lcol: FL_BLACK label: Real name : |#R -shortcut: +shortcut: resize: FL_RESIZE_ALL gravity: FL_NoGravity FL_NoGravity name: input_user_name @@ -1275,13 +1071,13 @@ style: FL_NORMAL_STYLE size: FL_DEFAULT_SIZE lcol: FL_BLACK label: Email address : |#E -shortcut: +shortcut: resize: FL_RESIZE_ALL gravity: FL_NoGravity FL_NoGravity name: input_user_email callback: C_FormBaseInputCB argument: 0 - + =============== FORM =============== Name: form_preferences_spelloptions Width: 450 -- 2.39.2