Added an 'Options' dialog (replacing test/preferences) that can be used to set system wide or user real options like Visible Focus.
git-svn-id: file:///fltk/svn/fltk/branches/branch-1.3@8018 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
This commit is contained in:
parent
495b3b5af5
commit
318b3dea57
1
CHANGES
1
CHANGES
@ -1,5 +1,6 @@
|
||||
CHANGES IN FLTK 1.3.0
|
||||
|
||||
- Added general Options dialog (STR #2471)
|
||||
- Fixed Compiling with mingw-w64 (STR #2308).
|
||||
- Fixed crashes when detecting illegal utf 8 sequences
|
||||
in Fl_Text_* widgets (STR #2348)
|
||||
|
||||
59
FL/Fl.H
59
FL/Fl.H
@ -137,8 +137,6 @@ public: // should be private!
|
||||
static Fl_Window* modal_;
|
||||
static Fl_Window* grab_;
|
||||
static int compose_state;
|
||||
static int visible_focus_;
|
||||
static int dnd_text_ops_;
|
||||
#endif
|
||||
/**
|
||||
If true then flush() will do something.
|
||||
@ -147,14 +145,35 @@ public: // should be private!
|
||||
|
||||
public:
|
||||
typedef enum {
|
||||
/// If set, the arrow keys can change focus from a text widget to another
|
||||
/// widget. If clear, only Tab and BackTab can.
|
||||
/// When switched on, moving the text cursor beyond the start or end of
|
||||
/// a text in a text widget will change focus to the next text widgt.
|
||||
/// When switched off, the cursor will stop at the end of the text.
|
||||
/// Pressing Tab or Ctrl-Tab will advance the keyboard focus.
|
||||
OPTION_ARROW_FOCUS = 0,
|
||||
/// If set, calls to fl_file_chooser will open the native file chooser.
|
||||
/// If clear, the FLTK file chooser will open instead.
|
||||
/// \todo Fl::OPTION_NATIVE_FILECHOOSER not yet supported
|
||||
OPTION_NATIVE_FILECHOOSER,
|
||||
// don't change this, leave it always as the last element
|
||||
// When switched on, FLTK will use the file chooser dialog that comes
|
||||
// with your operating system whenever possible. When switched off, FLTK
|
||||
// will present its own file chooser.
|
||||
// \todo implement me
|
||||
// OPTION_NATIVE_FILECHOOSER,
|
||||
// When Filechooser Preview is enabled, the FLTK or native file chooser
|
||||
// will show a preview of a selected file (if possible) before the user
|
||||
// decides to choose the file.
|
||||
// \todo implement me
|
||||
//OPTION_FILECHOOSER_PREVIEW,
|
||||
/// If visible focus is switched on, FLTK will draw a dotted rectangle
|
||||
/// inside the widget that will receive the next keystroke. If switched
|
||||
/// off, no such indicator will be drawn and keyboard navigation
|
||||
/// is disabled.
|
||||
OPTION_VISIBLE_FOCUS,
|
||||
/// If text drag-and-drop is enabled, the user can select and drag text
|
||||
/// from any text widget. If disabled, no dragging is possible, however
|
||||
/// dropping text from other applications still works.
|
||||
OPTION_DND_TEXT,
|
||||
/// If tooltips are enabled, hovering the mouse over a widget with a
|
||||
/// tooltip text will open a little tootip window until the mouse leaves
|
||||
/// the widget. If disabled, no tooltip is shown.
|
||||
OPTION_SHOW_TOOLTIPS,
|
||||
// don't change this, leave it always as the last element
|
||||
OPTION_LAST
|
||||
} Fl_Option;
|
||||
|
||||
@ -163,15 +182,17 @@ private:
|
||||
static unsigned char options_read_;
|
||||
|
||||
public:
|
||||
/**
|
||||
Return a global setting for all FLTK applications, possibly overridden
|
||||
by a setting specifically for this application.
|
||||
|
||||
\param opt
|
||||
\returns true or false
|
||||
/*
|
||||
Return a global setting for all FLTK applications, possibly overridden
|
||||
by a setting specifically for this application.
|
||||
*/
|
||||
static bool option(Fl_Option opt);
|
||||
|
||||
/*
|
||||
Override an option while the application is running.
|
||||
*/
|
||||
static void option(Fl_Option opt, bool val);
|
||||
|
||||
/**
|
||||
The currently executing idle callback function: DO NOT USE THIS DIRECTLY!
|
||||
|
||||
@ -913,13 +934,13 @@ public:
|
||||
non-text widgets. The default mode is to enable keyboard focus
|
||||
for all widgets.
|
||||
*/
|
||||
static void visible_focus(int v) { visible_focus_ = v; }
|
||||
static void visible_focus(int v) { option(OPTION_VISIBLE_FOCUS, v); }
|
||||
/**
|
||||
Gets or sets the visible keyboard focus on buttons and other
|
||||
non-text widgets. The default mode is to enable keyboard focus
|
||||
for all widgets.
|
||||
*/
|
||||
static int visible_focus() { return visible_focus_; }
|
||||
static int visible_focus() { return option(OPTION_VISIBLE_FOCUS); }
|
||||
|
||||
// Drag-n-drop text operation methods...
|
||||
/**
|
||||
@ -928,14 +949,14 @@ public:
|
||||
be dragged from text fields or dragged within a text field as a
|
||||
cut/paste shortcut.
|
||||
*/
|
||||
static void dnd_text_ops(int v) { dnd_text_ops_ = v; }
|
||||
static void dnd_text_ops(int v) { option(OPTION_DND_TEXT, v); }
|
||||
/**
|
||||
Gets or sets whether drag and drop text operations are
|
||||
supported. This specifically affects whether selected text can
|
||||
be dragged from text fields or dragged within a text field as a
|
||||
cut/paste shortcut.
|
||||
*/
|
||||
static int dnd_text_ops() { return dnd_text_ops_; }
|
||||
static int dnd_text_ops() { return option(OPTION_DND_TEXT); }
|
||||
/** \defgroup fl_multithread Multithreading support functions
|
||||
fl multithreading support functions declared in <FL/Fl.H>
|
||||
@{ */
|
||||
|
||||
@ -55,11 +55,11 @@ public:
|
||||
*/
|
||||
static void hoverdelay(float f) { hoverdelay_ = f; }
|
||||
/** Returns non-zero if tooltips are enabled. */
|
||||
static int enabled() { return enabled_; }
|
||||
static int enabled() { return Fl::option(Fl::OPTION_SHOW_TOOLTIPS); }
|
||||
/** Enables tooltips on all widgets (or disables if <i>b</i> is false). */
|
||||
static void enable(int b = 1) { enabled_ = b;}
|
||||
static void enable(int b = 1) { Fl::option(Fl::OPTION_SHOW_TOOLTIPS, b);}
|
||||
/** Same as enable(0), disables tooltips on all widgets. */
|
||||
static void disable() { enabled_ = 0; }
|
||||
static void disable() { enable(0); }
|
||||
static void (*enter)(Fl_Widget* w);
|
||||
static void enter_area(Fl_Widget* w, int X, int Y, int W, int H, const char* tip);
|
||||
static void (*exit)(Fl_Widget *w);
|
||||
@ -100,7 +100,6 @@ private:
|
||||
private:
|
||||
static float delay_; //!< delay before a tooltip is shown
|
||||
static float hoverdelay_; //!< delay between tooltips
|
||||
static int enabled_;
|
||||
static Fl_Color color_;
|
||||
static Fl_Color textcolor_;
|
||||
static Fl_Font font_;
|
||||
|
||||
@ -5449,6 +5449,7 @@
|
||||
2DE25DB4CE986C1857B5ECF7 /* Fl_Native_File_Chooser.cxx */,
|
||||
D1C792936D427CC48581BFAE /* Fl_Overlay_Window.cxx */,
|
||||
813C830680D031C1B2FCF9B6 /* Fl_Pack.cxx */,
|
||||
6C1C9A4F054C48CDD6A2DE44 /* Fl_Paged_Device.cxx */,
|
||||
D79D3910F834D4B78FED92F3 /* Fl_Pixmap.cxx */,
|
||||
05BBBFE4BED0452E5D6A81F7 /* Fl_Positioner.cxx */,
|
||||
B4CAFA162560925C4591997A /* Fl_Printer.cxx */,
|
||||
@ -5558,7 +5559,6 @@
|
||||
FB7A9EFB3C7CDAE324E9544F /* case.c */,
|
||||
6B30F6EA5CA69E305D2B82EE /* is_right2left.c */,
|
||||
5AE1F936F1C186E18C1B9C28 /* is_spacing.c */,
|
||||
6C1C9A4F054C48CDD6A2DE44 /* Fl_Paged_Device.cxx */,
|
||||
);
|
||||
name = fltk;
|
||||
sourceTree = "<group>";
|
||||
|
||||
64
src/Fl.cxx
64
src/Fl.cxx
@ -90,8 +90,6 @@ int Fl::damage_,
|
||||
|
||||
char *Fl::e_text = (char *)"";
|
||||
int Fl::e_length;
|
||||
int Fl::visible_focus_ = 1,
|
||||
Fl::dnd_text_ops_ = 1;
|
||||
|
||||
unsigned char Fl::options_[] = { 0, 0 };
|
||||
unsigned char Fl::options_read_ = 0;
|
||||
@ -1760,7 +1758,7 @@ void Fl::clear_widget_pointer(Fl_Widget const *w)
|
||||
|
||||
|
||||
/**
|
||||
\brief User interface options management.
|
||||
\brief FLTK library options management.
|
||||
|
||||
This function needs to be documented in more detail. It can be used for more
|
||||
optional settings, such as using a native file chooser instead of the FLTK one
|
||||
@ -1771,6 +1769,10 @@ void Fl::clear_widget_pointer(Fl_Widget const *w)
|
||||
|
||||
There should be an application that manages options system wide, per user, and
|
||||
per application.
|
||||
|
||||
\param opt which option
|
||||
\return true or false
|
||||
\see Fl_Option
|
||||
*/
|
||||
bool Fl::option(Fl_Option opt)
|
||||
{
|
||||
@ -1779,15 +1781,35 @@ bool Fl::option(Fl_Option opt)
|
||||
{ // first, read the system wide preferences
|
||||
Fl_Preferences prefs(Fl_Preferences::SYSTEM, "fltk.org", "fltk");
|
||||
Fl_Preferences opt_prefs(prefs, "options");
|
||||
opt_prefs.get("ArrowFocus", tmp, 0); options_[OPTION_ARROW_FOCUS] = tmp;
|
||||
opt_prefs.get("NativeFilechooser", tmp, 0); options_[OPTION_NATIVE_FILECHOOSER] = tmp;
|
||||
opt_prefs.get("ArrowFocus", tmp, 0); // default: off
|
||||
options_[OPTION_ARROW_FOCUS] = tmp;
|
||||
//opt_prefs.get("NativeFilechooser", tmp, 1); // default: on
|
||||
//options_[OPTION_NATIVE_FILECHOOSER] = tmp;
|
||||
//opt_prefs.get("FilechooserPreview", tmp, 1); // default: on
|
||||
//options_[OPTION_FILECHOOSER_PREVIEW] = tmp;
|
||||
opt_prefs.get("VisibleFocus", tmp, 1); // default: on
|
||||
options_[OPTION_VISIBLE_FOCUS] = tmp;
|
||||
opt_prefs.get("DNDText", tmp, 1); // default: on
|
||||
options_[OPTION_DND_TEXT] = tmp;
|
||||
opt_prefs.get("ShowTooltips", tmp, 1); // default: on
|
||||
options_[OPTION_SHOW_TOOLTIPS] = tmp;
|
||||
}
|
||||
{ // next, check the user preferences
|
||||
// override system options only, if the option is set ( >= 0 )
|
||||
Fl_Preferences prefs(Fl_Preferences::USER, "fltk.org", "fltk");
|
||||
Fl_Preferences opt_prefs(prefs, "options");
|
||||
opt_prefs.get("ArrowFocus", tmp, -1); if (tmp >= 0) options_[OPTION_ARROW_FOCUS] = tmp;
|
||||
opt_prefs.get("NativeFilechooser", tmp, -1); if (tmp >= 0) options_[OPTION_NATIVE_FILECHOOSER] = tmp;
|
||||
opt_prefs.get("ArrowFocus", tmp, -1);
|
||||
if (tmp >= 0) options_[OPTION_ARROW_FOCUS] = tmp;
|
||||
//opt_prefs.get("NativeFilechooser", tmp, -1);
|
||||
//if (tmp >= 0) options_[OPTION_NATIVE_FILECHOOSER] = tmp;
|
||||
//opt_prefs.get("FilechooserPreview", tmp, -1);
|
||||
//if (tmp >= 0) options_[OPTION_FILECHOOSER_PREVIEW] = tmp;
|
||||
opt_prefs.get("VisibleFocus", tmp, -1);
|
||||
if (tmp >= 0) options_[OPTION_VISIBLE_FOCUS] = tmp;
|
||||
opt_prefs.get("DNDText", tmp, -1);
|
||||
if (tmp >= 0) options_[OPTION_DND_TEXT] = tmp;
|
||||
opt_prefs.get("ShowTooltips", tmp, -1);
|
||||
if (tmp >= 0) options_[OPTION_SHOW_TOOLTIPS] = tmp;
|
||||
}
|
||||
{ // now, if the developer has registered this app, we could as for per-application preferences
|
||||
}
|
||||
@ -1798,14 +1820,34 @@ bool Fl::option(Fl_Option opt)
|
||||
return (bool)options_[opt];
|
||||
}
|
||||
|
||||
/**
|
||||
\brief Override an option while the application is running.
|
||||
|
||||
This function does not change any system or user settings.
|
||||
|
||||
\param opt which option
|
||||
\param val set to true or false
|
||||
\see Fl_Option
|
||||
*/
|
||||
void Fl::option(Fl_Option opt, bool val)
|
||||
{
|
||||
if (opt<0 || opt>=OPTION_LAST)
|
||||
return;
|
||||
if (!options_read_) {
|
||||
// first read this option, so we don't override our setting later
|
||||
option(opt);
|
||||
}
|
||||
options_[opt] = val;
|
||||
}
|
||||
|
||||
|
||||
// Helper class Fl_Widget_Tracker
|
||||
|
||||
/**
|
||||
The constructor adds a widget to the watch list.
|
||||
*/
|
||||
Fl_Widget_Tracker::Fl_Widget_Tracker(Fl_Widget *wi) {
|
||||
|
||||
Fl_Widget_Tracker::Fl_Widget_Tracker(Fl_Widget *wi)
|
||||
{
|
||||
wp_ = wi;
|
||||
Fl::watch_widget_pointer(wp_); // add pointer to watch list
|
||||
}
|
||||
@ -1813,8 +1855,8 @@ Fl_Widget_Tracker::Fl_Widget_Tracker(Fl_Widget *wi) {
|
||||
/**
|
||||
The destructor removes a widget from the watch list.
|
||||
*/
|
||||
Fl_Widget_Tracker::~Fl_Widget_Tracker() {
|
||||
|
||||
Fl_Widget_Tracker::~Fl_Widget_Tracker()
|
||||
{
|
||||
Fl::release_widget_pointer(wp_); // remove pointer from watch list
|
||||
}
|
||||
|
||||
|
||||
@ -3609,7 +3609,7 @@ int Fl_Text_Display::handle(int event) {
|
||||
if (dragType==DRAG_NONE)
|
||||
return 1;
|
||||
if (dragType==DRAG_START_DND) {
|
||||
if (!Fl::event_is_click()) {
|
||||
if (!Fl::event_is_click() && Fl::dnd_text_ops()) {
|
||||
const char* copy = buffer()->selection_text();
|
||||
Fl::dnd();
|
||||
free((void*)copy);
|
||||
|
||||
@ -34,13 +34,12 @@
|
||||
|
||||
float Fl_Tooltip::delay_ = 1.0f;
|
||||
float Fl_Tooltip::hoverdelay_ = 0.2f;
|
||||
int Fl_Tooltip::enabled_ = 1;
|
||||
Fl_Color Fl_Tooltip::color_ = fl_color_cube(FL_NUM_RED - 1,
|
||||
FL_NUM_GREEN - 1,
|
||||
FL_NUM_BLUE - 2);
|
||||
Fl_Color Fl_Tooltip::textcolor_ = FL_BLACK;
|
||||
Fl_Font Fl_Tooltip::font_ = FL_HELVETICA;
|
||||
Fl_Fontsize Fl_Tooltip::size_ = FL_NORMAL_SIZE;
|
||||
Fl_Fontsize Fl_Tooltip::size_ = FL_NORMAL_SIZE;
|
||||
|
||||
#define MAX_WIDTH 400
|
||||
|
||||
|
||||
@ -17,312 +17,226 @@ decl {\#include <FL/filename.H>} {private local
|
||||
decl {\#include <FL/fl_ask.H>} {private local
|
||||
}
|
||||
|
||||
decl {void readPrefs();} {public local
|
||||
decl {int opt[10][2];} {
|
||||
comment {Copy of all options in user and system mode} private local
|
||||
}
|
||||
|
||||
decl {void writePrefs();} {public local
|
||||
}
|
||||
|
||||
Function {closeWindowCB( Fl_Widget*, void* )} {open private return_type void
|
||||
Function {refreshUI()} {
|
||||
comment {Update the UI using the values in the opt array} return_type void
|
||||
} {
|
||||
code {Fl::delete_widget(myWindow);} {}
|
||||
code {int mode = wUserOrSystem->value();
|
||||
wVisibleFocus->value(opt[Fl::OPTION_VISIBLE_FOCUS][mode]);
|
||||
wArrowFocus->value(opt[Fl::OPTION_ARROW_FOCUS][mode]);
|
||||
wShowTooltips->value(opt[Fl::OPTION_SHOW_TOOLTIPS][mode]);
|
||||
wDNDText->value(opt[Fl::OPTION_DND_TEXT][mode]);} {}
|
||||
}
|
||||
|
||||
Function {saveAndCloseWindowCB( Fl_Widget*, void* )} {open private return_type void
|
||||
Function {readPrefs()} {
|
||||
comment {read all preferences and refresh the GUI} return_type void
|
||||
} {
|
||||
code {writePrefs();
|
||||
Fl::delete_widget(myWindow);} {}
|
||||
code {// read all preferences and refresh the GUI
|
||||
{
|
||||
Fl_Preferences prefs(Fl_Preferences::SYSTEM, "fltk.org", "fltk");
|
||||
Fl_Preferences opt_prefs(prefs, "options");
|
||||
opt_prefs.get("ArrowFocus", opt[Fl::OPTION_ARROW_FOCUS][1], 2);
|
||||
opt_prefs.get("VisibleFocus", opt[Fl::OPTION_VISIBLE_FOCUS][1], 2);
|
||||
opt_prefs.get("DNDText", opt[Fl::OPTION_DND_TEXT][1], 2);
|
||||
opt_prefs.get("ShowTooltips", opt[Fl::OPTION_SHOW_TOOLTIPS][1], 2);
|
||||
}
|
||||
{
|
||||
Fl_Preferences prefs(Fl_Preferences::USER, "fltk.org", "fltk");
|
||||
Fl_Preferences opt_prefs(prefs, "options");
|
||||
opt_prefs.get("ArrowFocus", opt[Fl::OPTION_ARROW_FOCUS][0], 2);
|
||||
opt_prefs.get("VisibleFocus", opt[Fl::OPTION_VISIBLE_FOCUS][0], 2);
|
||||
opt_prefs.get("DNDText", opt[Fl::OPTION_DND_TEXT][0], 2);
|
||||
opt_prefs.get("ShowTooltips", opt[Fl::OPTION_SHOW_TOOLTIPS][0], 2);
|
||||
}
|
||||
refreshUI();} {}
|
||||
}
|
||||
|
||||
Function {} {open return_type int
|
||||
Function {writePrefs()} {
|
||||
comment {write all preferences using the array} return_type void
|
||||
} {
|
||||
code {// write all preferences using the array
|
||||
{
|
||||
Fl_Preferences prefs(Fl_Preferences::SYSTEM, "fltk.org", "fltk");
|
||||
Fl_Preferences opt_prefs(prefs, "options");
|
||||
if (opt[Fl::OPTION_ARROW_FOCUS][1]==2) opt_prefs.deleteEntry("ArrowFocus");
|
||||
else opt_prefs.set("ArrowFocus", opt[Fl::OPTION_ARROW_FOCUS][1]);
|
||||
if (opt[Fl::OPTION_VISIBLE_FOCUS][1]==2) opt_prefs.deleteEntry("VisibleFocus");
|
||||
else opt_prefs.set("VisibleFocus", opt[Fl::OPTION_VISIBLE_FOCUS][1]);
|
||||
if (opt[Fl::OPTION_DND_TEXT][1]==2) opt_prefs.deleteEntry("DNDText");
|
||||
else opt_prefs.set("DNDText", opt[Fl::OPTION_DND_TEXT][1]);
|
||||
if (opt[Fl::OPTION_SHOW_TOOLTIPS][1]==2) opt_prefs.deleteEntry("ShowTooltips");
|
||||
else opt_prefs.set("ShowTooltips", opt[Fl::OPTION_SHOW_TOOLTIPS][1]);
|
||||
}
|
||||
{
|
||||
Fl_Preferences prefs(Fl_Preferences::USER, "fltk.org", "fltk");
|
||||
Fl_Preferences opt_prefs(prefs, "options");
|
||||
if (opt[Fl::OPTION_ARROW_FOCUS][0]==2) opt_prefs.deleteEntry("ArrowFocus");
|
||||
else opt_prefs.set("ArrowFocus", opt[Fl::OPTION_ARROW_FOCUS][0]);
|
||||
if (opt[Fl::OPTION_VISIBLE_FOCUS][0]==2) opt_prefs.deleteEntry("VisibleFocus");
|
||||
else opt_prefs.set("VisibleFocus", opt[Fl::OPTION_VISIBLE_FOCUS][0]);
|
||||
if (opt[Fl::OPTION_DND_TEXT][0]==2) opt_prefs.deleteEntry("DNDText");
|
||||
else opt_prefs.set("DNDText", opt[Fl::OPTION_DND_TEXT][0]);
|
||||
if (opt[Fl::OPTION_SHOW_TOOLTIPS][0]==2) opt_prefs.deleteEntry("ShowTooltips");
|
||||
else opt_prefs.set("ShowTooltips", opt[Fl::OPTION_SHOW_TOOLTIPS][0]);
|
||||
}} {}
|
||||
}
|
||||
|
||||
Function {} {
|
||||
comment {create the user interface and launch} selected return_type int
|
||||
} {
|
||||
Fl_Window myWindow {
|
||||
label {My Preferences}
|
||||
callback closeWindowCB open
|
||||
xywh {394 64 298 311} type Double visible
|
||||
label {FLTK Preferences}
|
||||
callback {Fl::delete_widget(myWindow);} open
|
||||
xywh {424 200 403 317} type Double color 50 visible
|
||||
} {
|
||||
Fl_Group {} {
|
||||
label {Keyboard Focus Options} open
|
||||
xywh {10 10 380 100} box GTK_DOWN_BOX labelfont 2 align 21
|
||||
} {
|
||||
Fl_Choice wVisibleFocus {
|
||||
label {Visible Keyboard Focus:}
|
||||
callback {int mode = wUserOrSystem->value();
|
||||
opt[Fl::OPTION_VISIBLE_FOCUS][mode] = wVisibleFocus->value();} open
|
||||
tooltip {OPTION_VISIBLE_FOCUS
|
||||
|
||||
If visible focus is switched on, FLTK will draw a dotted rectangle inside the widget that will receive the next keystroke. If switched off, no such indicator will be drawn and keyboard navigation is disabled.
|
||||
|
||||
On by default.} xywh {245 40 100 25} down_box BORDER_BOX
|
||||
} {
|
||||
MenuItem {} {
|
||||
label off
|
||||
user_data 0 user_data_type long
|
||||
xywh {10 10 31 20}
|
||||
}
|
||||
MenuItem {} {
|
||||
label on
|
||||
user_data 1 user_data_type long
|
||||
xywh {10 10 31 20} divider
|
||||
}
|
||||
MenuItem {} {
|
||||
label default
|
||||
user_data 2 user_data_type long
|
||||
xywh {10 10 31 20}
|
||||
}
|
||||
}
|
||||
Fl_Choice wArrowFocus {
|
||||
label {Arrow Keys move Focus:}
|
||||
callback {int mode = wUserOrSystem->value();
|
||||
opt[Fl::OPTION_ARROW_FOCUS][mode] = wArrowFocus->value();} open
|
||||
tooltip {OPTION_ARROW_FOCUS
|
||||
|
||||
When switched on, moving the text cursor beyond the start or end of a text in a text widget will change focus to the next text widgt. When switched off, the cursor will stop at the end of the text. Pressing Tab or Ctrl-Tab will advance the keyboard focus.
|
||||
|
||||
Default is off.} xywh {245 75 100 25} down_box BORDER_BOX
|
||||
} {
|
||||
MenuItem {} {
|
||||
label off
|
||||
user_data 0 user_data_type long
|
||||
xywh {0 0 31 20}
|
||||
}
|
||||
MenuItem {} {
|
||||
label on
|
||||
user_data 1 user_data_type long
|
||||
xywh {0 0 31 20} divider
|
||||
}
|
||||
MenuItem {} {
|
||||
label default
|
||||
user_data 2 user_data_type long
|
||||
xywh {0 0 31 20}
|
||||
}
|
||||
}
|
||||
}
|
||||
Fl_Group {} {
|
||||
label {Tooltip Options} open
|
||||
xywh {10 120 380 65} box GTK_DOWN_BOX labelfont 2 align 21
|
||||
} {
|
||||
Fl_Choice wShowTooltips {
|
||||
label {Show Tooltips:}
|
||||
callback {int mode = wUserOrSystem->value();
|
||||
opt[Fl::OPTION_SHOW_TOOLTIPS][mode] = wShowTooltips->value();} open
|
||||
tooltip {OPTION_SHOW_TOOLTIPS
|
||||
|
||||
If tooltips are enabled, hovering the mouse over a widget with a tooltip text will open a little tootip window until the mouse leaves the widget. If disabled, no tooltip is shown.
|
||||
|
||||
Default is on.} xywh {245 150 100 25} down_box BORDER_BOX
|
||||
} {
|
||||
MenuItem {} {
|
||||
label off
|
||||
user_data 0 user_data_type long
|
||||
xywh {10 10 31 20}
|
||||
}
|
||||
MenuItem {} {
|
||||
label on
|
||||
user_data 1 user_data_type long
|
||||
xywh {10 10 31 20} divider
|
||||
}
|
||||
MenuItem {} {
|
||||
label default
|
||||
user_data 2 user_data_type long
|
||||
xywh {10 10 31 20}
|
||||
}
|
||||
}
|
||||
}
|
||||
Fl_Group {} {
|
||||
label {Drag And Drop Options} open
|
||||
xywh {10 194 380 66} box GTK_DOWN_BOX labelfont 2 align 21
|
||||
} {
|
||||
Fl_Choice wDNDText {
|
||||
label {Allow dragging Text:}
|
||||
callback {int mode = wUserOrSystem->value();
|
||||
opt[Fl::OPTION_DND_TEXT][mode] = wDNDText->value();} open
|
||||
tooltip {OPTION_DND_TEXT
|
||||
|
||||
If text drag-and-drop is enabled, the user can select and drag text from any text widget. If disabled, no dragging is possible, however dropping text from other applications still works.
|
||||
|
||||
Default is on.} xywh {245 225 100 25} down_box BORDER_BOX
|
||||
} {
|
||||
MenuItem {} {
|
||||
label off
|
||||
user_data 0 user_data_type long
|
||||
xywh {30 30 31 20}
|
||||
}
|
||||
MenuItem {} {
|
||||
label on
|
||||
user_data 1 user_data_type long
|
||||
xywh {30 30 31 20} divider
|
||||
}
|
||||
MenuItem {} {
|
||||
label default
|
||||
user_data 2 user_data_type long
|
||||
xywh {30 30 31 20}
|
||||
}
|
||||
}
|
||||
}
|
||||
Fl_Choice wUserOrSystem {
|
||||
callback {refreshUI();} open
|
||||
tooltip {Change settings for the current user, or for all users of this computer.} xywh {14 275 141 25} down_box BORDER_BOX
|
||||
} {
|
||||
MenuItem {} {
|
||||
label {User Settings}
|
||||
user_data 0 user_data_type long
|
||||
xywh {0 0 31 20}
|
||||
}
|
||||
MenuItem {} {
|
||||
label {System Settings}
|
||||
user_data 1 user_data_type long
|
||||
xywh {0 0 31 20}
|
||||
}
|
||||
}
|
||||
Fl_Button {} {
|
||||
label Cancel
|
||||
callback closeWindowCB
|
||||
xywh {210 275 75 25}
|
||||
callback {Fl::delete_widget(myWindow);}
|
||||
xywh {230 275 75 25}
|
||||
}
|
||||
Fl_Button {} {
|
||||
label OK
|
||||
callback saveAndCloseWindowCB
|
||||
xywh {125 275 75 25}
|
||||
}
|
||||
Fl_Group {} {
|
||||
label {Get Up:} open
|
||||
xywh {20 30 115 225} box ENGRAVED_FRAME align 5
|
||||
} {
|
||||
Fl_Input wAlarm {
|
||||
label {Alarm at:}
|
||||
xywh {25 55 45 20} align 5
|
||||
}
|
||||
Fl_Choice wAmPm {open
|
||||
xywh {75 55 55 20} down_box BORDER_BOX
|
||||
} {
|
||||
MenuItem {} {
|
||||
label {a.m.}
|
||||
xywh {0 0 100 20}
|
||||
}
|
||||
MenuItem {} {
|
||||
label {p.m.}
|
||||
xywh {0 0 100 20}
|
||||
}
|
||||
}
|
||||
Fl_Choice wWear {
|
||||
label {Wear:} open
|
||||
xywh {25 100 105 20} down_box BORDER_BOX align 5
|
||||
} {
|
||||
MenuItem {} {
|
||||
label shoes
|
||||
xywh {0 0 100 20}
|
||||
}
|
||||
MenuItem {} {
|
||||
label sandals
|
||||
xywh {0 0 100 20}
|
||||
}
|
||||
MenuItem {} {
|
||||
label {flip flops}
|
||||
xywh {0 0 100 20}
|
||||
}
|
||||
MenuItem {} {
|
||||
label {bare foot}
|
||||
xywh {0 0 100 20}
|
||||
}
|
||||
}
|
||||
Fl_Group {} {open
|
||||
xywh {35 120 98 60}
|
||||
} {
|
||||
Fl_Round_Button wLeft {
|
||||
label {left side}
|
||||
xywh {35 120 95 25} type Radio down_box ROUND_DOWN_BOX
|
||||
}
|
||||
Fl_Round_Button wRight {
|
||||
label {right side}
|
||||
xywh {35 140 95 25} type Radio down_box ROUND_DOWN_BOX
|
||||
}
|
||||
Fl_Box {} {
|
||||
label {of the bed}
|
||||
xywh {38 160 95 20}
|
||||
}
|
||||
}
|
||||
Fl_Check_Button wShower {
|
||||
label shower
|
||||
xywh {25 180 105 25} down_box DOWN_BOX
|
||||
}
|
||||
Fl_Check_Button wShave {
|
||||
label shave
|
||||
xywh {25 200 105 25} down_box DOWN_BOX
|
||||
}
|
||||
Fl_Check_Button wBrush {
|
||||
label {brush teeth}
|
||||
xywh {25 220 105 25} down_box DOWN_BOX
|
||||
}
|
||||
}
|
||||
Fl_Group {} {
|
||||
label {Breakfast::} open
|
||||
xywh {160 30 115 225} box ENGRAVED_FRAME align 5
|
||||
} {
|
||||
Fl_Choice wDrink {
|
||||
label {Drink:} open
|
||||
xywh {165 50 105 20} down_box BORDER_BOX align 5
|
||||
} {
|
||||
MenuItem {} {
|
||||
label coffee
|
||||
xywh {10 10 100 20}
|
||||
}
|
||||
MenuItem {} {
|
||||
label tea
|
||||
xywh {10 10 100 20}
|
||||
}
|
||||
MenuItem {} {
|
||||
label juice
|
||||
xywh {10 10 100 20}
|
||||
}
|
||||
}
|
||||
Fl_Check_Button wMilk {
|
||||
label {with milk}
|
||||
xywh {170 70 100 25} down_box DOWN_BOX
|
||||
}
|
||||
Fl_Choice wBread {
|
||||
label {Bread:} open
|
||||
xywh {165 110 105 20} down_box BORDER_BOX align 5
|
||||
} {
|
||||
MenuItem {} {
|
||||
label wheat
|
||||
xywh {0 0 100 20}
|
||||
}
|
||||
MenuItem {} {
|
||||
label white
|
||||
xywh {0 0 100 20}
|
||||
}
|
||||
MenuItem {} {
|
||||
label rye
|
||||
xywh {0 0 100 20}
|
||||
}
|
||||
MenuItem {} {
|
||||
label {sour doh}
|
||||
xywh {0 0 100 20}
|
||||
}
|
||||
}
|
||||
Fl_Check_Button wButter {
|
||||
label {with butter}
|
||||
xywh {170 130 100 25} down_box DOWN_BOX
|
||||
}
|
||||
Fl_Input wEggs {
|
||||
label eggs
|
||||
xywh {165 163 30 20} type Int align 8
|
||||
}
|
||||
Fl_Value_Slider wMinutes {
|
||||
label {min.}
|
||||
xywh {175 185 70 20} type Horizontal align 8 minimum 2 maximum 6 value 3.1
|
||||
}
|
||||
Fl_Input wPaper {
|
||||
label {Newspaper:}
|
||||
xywh {165 225 105 20} align 5
|
||||
}
|
||||
callback {writePrefs();
|
||||
Fl::delete_widget(myWindow);}
|
||||
xywh {315 275 75 25}
|
||||
}
|
||||
}
|
||||
code {readPrefs();} {}
|
||||
}
|
||||
|
||||
Function {readPrefs()} {open return_type void
|
||||
} {
|
||||
code {int boolValue;
|
||||
int intValue;
|
||||
char buffer[80];
|
||||
double doubleValue;
|
||||
|
||||
Fl_Preferences app( Fl_Preferences::USER, "fltk.org", "test/preferences" );
|
||||
|
||||
char path[ FL_PATH_MAX ];
|
||||
app.getUserdataPath( path, sizeof(path) );
|
||||
|
||||
Fl_Preferences bed( app, "Bed" );
|
||||
bed.get( "alarm", buffer, "8:00", 79 );
|
||||
wAlarm->value( buffer );
|
||||
|
||||
bed.get( "ampm", intValue, 0 );
|
||||
wAmPm->value( intValue );
|
||||
|
||||
bed.get( "wear", intValue, 1 );
|
||||
wWear->value( intValue );
|
||||
|
||||
int side;
|
||||
bed.get( "side", side, 2 );
|
||||
if ( side == 1 ) wLeft->value( 1 );
|
||||
if ( side == 2 ) wRight->value( 1 );
|
||||
|
||||
int tasks;
|
||||
bed.get( "taskFlags", tasks, 0x05 );
|
||||
if ( tasks & 0x01 ) wShower->value( 1 );
|
||||
if ( tasks & 0x02 ) wShave->value( 1 );
|
||||
if ( tasks & 0x04 ) wBrush->value( 1 );
|
||||
|
||||
Fl_Preferences eat( app, "Breakfast" );
|
||||
|
||||
eat.get( "drink", intValue, 1 );
|
||||
wDrink->value( intValue );
|
||||
|
||||
eat.get( "wMilk", boolValue, 0 );
|
||||
wMilk->value( boolValue );
|
||||
|
||||
eat.get( "bread", intValue, 0 );
|
||||
wBread->value( intValue );
|
||||
|
||||
eat.get( "wButter", boolValue, 1 );
|
||||
wButter->value( boolValue );
|
||||
|
||||
eat.get( "nEggs", intValue, 2 );
|
||||
sprintf( buffer, "%d", intValue );
|
||||
wEggs->value( buffer );
|
||||
|
||||
eat.get( "minutes", doubleValue, 3.2 );
|
||||
wMinutes->value( doubleValue );
|
||||
|
||||
char *flexBuffer;
|
||||
eat.get( "newspaper", flexBuffer, "NY Tymes" );
|
||||
wPaper->value( flexBuffer );
|
||||
if ( flexBuffer ) free( flexBuffer );
|
||||
|
||||
eat.get( "foo", buffer, "bar", 80 );
|
||||
|
||||
/** sample code only:
|
||||
Fl_Preferences prev( app, "PreviousStarts" );
|
||||
{
|
||||
int i, n;
|
||||
prev.get( "n", n, 0 );
|
||||
for ( i=0; i<n; i++ )
|
||||
prev.get( Fl_Preferences::Name( i ), flexBuffer, "" );
|
||||
}
|
||||
|
||||
unsigned int hex;
|
||||
eat.get( "binFoo", (void*)&hex, 0, 0, sizeof( unsigned int ) );
|
||||
void *data;
|
||||
eat.get( "binFoo2", data, 0, 0 );
|
||||
**/} {}
|
||||
}
|
||||
|
||||
Function {writePrefs()} {open return_type void
|
||||
} {
|
||||
code {Fl_Preferences app( Fl_Preferences::USER, "fltk.org", "test/preferences" );
|
||||
|
||||
Fl_Preferences bed( app, "Bed" );
|
||||
|
||||
bed.set( "alarm", wAlarm->value() );
|
||||
bed.set( "ampm", wAmPm->value() );
|
||||
|
||||
bed.set( "wear", wWear->value() );
|
||||
|
||||
int side = 0;
|
||||
if ( wLeft->value() ) side = 1;
|
||||
if ( wRight->value() ) side = 2;
|
||||
bed.set( "side", side );
|
||||
|
||||
int tasks = 0;
|
||||
if ( wShower->value() ) tasks |= 0x01;
|
||||
if ( wShave->value() ) tasks |= 0x02;
|
||||
if ( wBrush->value() ) tasks |= 0x04;
|
||||
bed.set( "taskFlags", tasks );
|
||||
|
||||
Fl_Preferences eat( app, "Breakfast" );
|
||||
|
||||
eat.set( "drink", wDrink->value() );
|
||||
eat.set( "wMilk", wMilk->value() );
|
||||
eat.set( "bread", wBread->value() );
|
||||
eat.set( "wButter", wButter->value() );
|
||||
|
||||
eat.set( "nEggs", wEggs->value() );
|
||||
eat.set( "minutes", wMinutes->value() );
|
||||
|
||||
eat.set( "newspaper", wPaper->value() );
|
||||
|
||||
eat.set( "foo", "bar\\nfly\\rBackslash: \\\\ and bell: \\007 and delete: \\177\\n" );
|
||||
|
||||
eat.set( Fl_Preferences::Name( 3 ), "Test3" );
|
||||
|
||||
/* sample: create a sub-sub-group */
|
||||
Fl_Preferences eatMore( eat, "More" );
|
||||
|
||||
eatMore.set( "more", "stuff" );
|
||||
|
||||
/* all the following searches should return 1 */
|
||||
int sum = 0;
|
||||
sum += app.groupExists( "Breakfast" ); /* find 'eat' relative to 'app' */
|
||||
sum += app.groupExists( "Breakfast/More" ); /* find 'eat.eatMore' relative to 'app' */
|
||||
sum += app.groupExists( "./Breakfast/More" ); /* find 'eat.eatMore' relative to Preferences */
|
||||
sum += eat.groupExists( "More" ); /* find 'eatMore' relative to 'eat' */
|
||||
sum += eat.groupExists( "./Breakfast/More" ); /* find 'eat.eatMore' relative to Preferences */
|
||||
sum += eat.groupExists( "." ); /* find myself ('eat') */
|
||||
sum += eat.groupExists( "./" ); /* find the topmost group ('app') */
|
||||
if ( sum != 7 )
|
||||
fl_message( "Assertion failed:\\nNot all group entries were found!" );
|
||||
|
||||
/* sample code only: */
|
||||
unsigned int hex = 0x2387efcd;
|
||||
eat.set( "binFoo", (void*)&hex, sizeof( unsigned int ) );
|
||||
eat.set( "binFoo2", (void*)&writePrefs, 256 );} {selected
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user