Added support for keyboard shortcuts to Fl_Input_ derived widgets (STR #1770). Code added for Fluid. Documentation updated.

This commit must be considered partial because there is no shortcut handling for Fl_Text_Display derived widgets or Fl_Value_Input which is derived form Fl_Valuator.

git-svn-id: file:///fltk/svn/fltk/branches/branch-1.3@6109 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
This commit is contained in:
Matthias Melcher 2008-04-22 23:33:17 +00:00
parent 6a143b1f61
commit 8198e51799
10 changed files with 82 additions and 8 deletions

View File

@ -1,5 +1,7 @@
CHANGES IN FLTK 1.3.0
- added support for shortcuts for Fl_Input_ derived
widgets (STR #1770)
- initial setup (STR #1904)
CHANGES IN FLTK 1.1.9

View File

@ -58,6 +58,7 @@ class FL_EXPORT Fl_Input_ : public Fl_Widget {
int xscroll_, yscroll_;
int mu_p;
int maximum_size_;
int shortcut_;
uchar erase_cursor_only;
uchar textfont_;
@ -119,6 +120,9 @@ public:
int undo();
int copy_cuts();
int shortcut() const {return shortcut_;}
void shortcut(int s) {shortcut_ = s;}
Fl_Font textfont() const {return (Fl_Font)textfont_;}
void textfont(uchar s) {textfont_ = s;}
uchar textsize() const {return textsize_;}

View File

@ -87,6 +87,7 @@ setting <TT>type()</TT> to one of the following values:</P>
</UL>
</TD><TD align="left" valign="top">
<UL>
<LI><A href="#Fl_Input_.shortcut">shortcut</A></LI>
<LI><A href="#Fl_Input_.undo">undo</A></LI>
<LI><A href="#Fl_Input_.up_down_position">up_down_position</A></LI>
<LI><A href="#Fl_Input_.wrap">wrap</A></LI>
@ -255,6 +256,23 @@ information to the clipboard. This is used to make ^K work.
<P>Gets or sets the read-only state of the input field.
<H4><A name="Fl_Input_.shortcut">ulong Fl_Input_::shortcut() const
<BR> void Fl_Input_::shortcut(ulong key)</A></H4>
The first form returns the current shortcut key for the Input.
<P>The second form sets the shortcut key to <TT>key</TT>. Setting this
overrides the use of '&amp;' in the <TT>label()</TT>. The value is a bitwise
OR of a key and a set of shift flags, for example <CODE>FL_ALT | 'a'</CODE>
, <CODE>FL_ALT | (FL_F + 10)</CODE>, or just <CODE>'a'</CODE>. A value
of 0 disables the shortcut. </P>
<P>The key can be any value returned by <A href="Fl.html#Fl.event_key">
<TT>Fl::event_key()</TT></A>, but will usually be an ASCII letter. Use
a lower-case letter unless you require the shift key to be held down. </P>
<P>The shift flags can be any set of values accepted by <A href="Fl.html#Fl.event_state">
<TT>Fl::event_state()</TT></A>. If the bit is on that shift key must
be pushed. Meta, Alt, Ctrl, and Shift must be off if they are not in
the shift flags (zero for the other bits indicates a &quot;don't care&quot;
setting). </P>
<H4><A name="Fl_Input_.wrap">int Fl_Input_::wrap() const
<BR>void Fl_Input_::wrap(int)</A></H4>

View File

@ -589,9 +589,14 @@ int Shortcut_Button::handle(int e) {
void shortcut_in_cb(Shortcut_Button* i, void* v) {
if (v == LOAD) {
if (!current_widget->is_button()) {i->hide(); return;}
if ( !current_widget->is_button() && !current_widget->is_input() ) {
i->hide(); return;
}
i->show();
i->svalue = ((Fl_Button*)(current_widget->o))->shortcut();
if (current_widget->is_button())
i->svalue = ((Fl_Button*)(current_widget->o))->shortcut();
else if (current_widget->is_input())
i->svalue = ((Fl_Input_*)(current_widget->o))->shortcut();
i->redraw();
} else {
int mod = 0;
@ -602,6 +607,11 @@ void shortcut_in_cb(Shortcut_Button* i, void* v) {
b->shortcut(i->svalue);
if (o->is_menu_item()) ((Fl_Widget_Type*)o)->redraw();
}
else if (o->selected && o->is_input()) {
Fl_Input_* b = (Fl_Input_*)(((Fl_Widget_Type*)o)->o);
if (b->shortcut()!=i->svalue) mod = 1;
b->shortcut(i->svalue);
}
if (mod) set_modflag(1);
}
}

View File

@ -628,6 +628,7 @@ int Fl_Type::is_widget() const {return 0;}
int Fl_Type::is_valuator() const {return 0;}
int Fl_Type::is_spinner() const {return 0;}
int Fl_Type::is_button() const {return 0;}
int Fl_Type::is_input() const {return 0;}
int Fl_Type::is_menu_item() const {return 0;}
int Fl_Type::is_menu_button() const {return 0;}
int Fl_Type::is_group() const {return 0;}

View File

@ -131,6 +131,7 @@ public:
virtual int is_parent() const;
virtual int is_widget() const;
virtual int is_button() const;
virtual int is_input() const;
virtual int is_valuator() const;
virtual int is_spinner() const;
virtual int is_menu_item() const;

View File

@ -2162,6 +2162,17 @@ void Fl_Widget_Type::write_widget_code() {
write_c("%s%s->type(%d);\n", indent(), var, o->type());
if (o->box() != tplate->box() || subclass())
write_c("%s%s->box(FL_%s);\n", indent(), var, boxname(o->box()));
if (is_input()) {
Fl_Input_* b = (Fl_Input_*)o;
if (b->shortcut()) {
int s = b->shortcut();
if (use_FL_COMMAND && (s & (FL_CTRL|FL_META))) {
write_c("%s%s->shortcut(FL_COMMAND|0x%x);\n", indent(), var, s & ~(FL_CTRL|FL_META));
} else {
write_c("%s%s->shortcut(0x%x);\n", indent(), var, s);
}
}
}
if (is_button()) {
Fl_Button* b = (Fl_Button*)o;
if (b->down_box()) write_c("%s%s->down_box(FL_%s);\n", indent(), var,
@ -2333,6 +2344,10 @@ void Fl_Widget_Type::write_properties() {
}
if (o->box() != tplate->box()) {
write_string("box"); write_word(boxname(o->box()));}
if (is_input()) {
Fl_Input_* b = (Fl_Input_*)o;
if (b->shortcut()) write_string("shortcut 0x%x", b->shortcut());
}
if (is_button()) {
Fl_Button* b = (Fl_Button*)o;
if (b->down_box()) {
@ -2524,6 +2539,8 @@ void Fl_Widget_Type::read_property(const char *c) {
subclass(read_word());
} else if (is_button() && !strcmp(c,"shortcut")) {
((Fl_Button*)o)->shortcut(strtol(read_word(),0,0));
} else if (is_input() && !strcmp(c,"shortcut")) {
((Fl_Input_*)o)->shortcut(strtol(read_word(),0,0));
} else {
if (!strncmp(c,"code",4)) {
int n = atoi(c+4);
@ -2694,6 +2711,12 @@ void Fl_Widget_Type::copy_properties() {
d->value(s->value());
}
// copy all attributes specific to widgets derived from Fl_Input_
if (is_input()) {
Fl_Input_* d = (Fl_Input_*)live_widget, *s = (Fl_Input_*)o;
d->shortcut(s->shortcut());
}
// copy all attributes specific to Fl_Valuator and derived classes
if (is_valuator()) {
Fl_Valuator* d = (Fl_Valuator*)live_widget, *s = (Fl_Valuator*)o;

View File

@ -442,6 +442,7 @@ public:
if (w < 15) w = 15;
}
virtual const char *type_name() {return "Fl_Input";}
int is_input() const {return 1;}
Fl_Widget *widget(int x,int y,int w,int h) {
Fl_Input *myo = new Fl_Input(x,y,w,h,"input:");
myo->value("Text Input");
@ -455,6 +456,7 @@ public:
d->textfont(s->textfont());
d->textsize(s->textsize());
d->textcolor(s->textcolor());
d->shortcut(s->shortcut());
}
};
static Fl_Input_Type Fl_Input_type;
@ -489,6 +491,7 @@ public:
if (w < 50) w = 50;
}
virtual const char *type_name() {return "Fl_File_Input";}
int is_input() const {return 1;}
Fl_Widget *widget(int x,int y,int w,int h) {
Fl_File_Input *myo = new Fl_File_Input(x,y,w,h,"file:");
myo->value("/now/is/the/time/for/a/filename.ext");
@ -788,6 +791,7 @@ public:
if (w < 15) w = 15;
}
virtual const char *type_name() {return "Fl_Value_Input";}
int is_input() const {return 1;}
int textstuff(int w, Fl_Font& f, int& s, Fl_Color& c);
int is_valuator() const {return 1;}
Fl_Widget *widget(int x,int y,int w,int h) {

View File

@ -788,6 +788,13 @@ int Fl_Input_::handletext(int event, int X, int Y, int W, int H) {
}
return replace(position(), mark(), t, e-t);}
case FL_SHORTCUT:
if (!(shortcut() ? Fl::test_shortcut(shortcut()) : test_shortcut()))
return 0;
if (Fl::visible_focus() && handle(FL_FOCUS))
Fl::focus(this);
return 1;
default:
return 0;
}
@ -810,6 +817,8 @@ Fl_Input_::Fl_Input_(int X, int Y, int W, int H, const char* l)
value_ = "";
xscroll_ = yscroll_ = 0;
maximum_size_ = 32767;
shortcut_ = 0;
set_flag(SHORTCUT_LABEL);
}
void Fl_Input_::put_in_buffer(int len) {

View File

@ -88,13 +88,15 @@ int main(int argc, char **argv) {
// input[0]->maximum_size(20);
// input[0]->static_value("this is a testgarbage");
input[1] = new Fl_Float_Input(70,y,300,30,"Float:"); y += 35;
input[1]->tooltip("Input field for floating-point number");
input[1]->tooltip("Input field for floating-point number (F1)");
input[1]->shortcut(FL_F+1);
input[2] = new Fl_Int_Input(70,y,300,30,"Int:"); y += 35;
input[2]->tooltip("Input field for integer number");
input[3] = new Fl_Secret_Input(70,y,300,30,"Secret:"); y += 35;
input[3]->tooltip("Input field for password");
input[4] = new Fl_Multiline_Input(70,y,300,100,"Multiline:"); y += 105;
input[4]->tooltip("Input field for short text with newlines");
input[2]->tooltip("Input field for integer number (F2)");
input[2]->shortcut(FL_F+2);
input[3] = new Fl_Secret_Input(70,y,300,30,"&Secret:"); y += 35;
input[3]->tooltip("Input field for password (Alt-S)");
input[4] = new Fl_Multiline_Input(70,y,300,100,"&Multiline:"); y += 105;
input[4]->tooltip("Input field for short text with newlines (Alt-M)");
input[4]->wrap(1);
for (int i = 0; i < 4; i++) {