Adding keyboard shortcut to Fl_Value_Input and Fl_Text_Editor

git-svn-id: file:///fltk/svn/fltk/branches/branch-1.3@6111 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
This commit is contained in:
Matthias Melcher 2008-04-23 14:19:58 +00:00
parent 8d6b757bfe
commit 8683ea2c81
13 changed files with 121 additions and 29 deletions

View File

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

View File

@ -119,6 +119,9 @@ class FL_EXPORT Fl_Text_Display: public Fl_Group {
int position_style(int lineStartPos, int lineLen, int lineIndex,
int dispIndex);
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_;}
@ -280,6 +283,8 @@ class FL_EXPORT Fl_Text_Display: public Fl_Group {
int display_insert_position_hint;
struct { int x, y, w, h; } text_area;
int shortcut_;
uchar textfont_;
uchar textsize_;
unsigned textcolor_;

View File

@ -47,6 +47,9 @@ public:
void soft(char s) {soft_ = s;}
char soft() const {return soft_;}
int shortcut() const {return input.shortcut();}
void shortcut(int s) {input.shortcut(s);}
Fl_Font textfont() const {return input.textfont();}
void textfont(uchar s) {input.textfont(s);}
uchar textsize() const {return input.textsize();}

View File

@ -78,6 +78,7 @@ class.
<LI><A HREF="#Fl_Text_Editor.kf_up">kf_up</A></LI>
<LI><A HREF="#Fl_Text_Editor.remove_all_key_bindings">remove_all_key_bindings</A></LI>
<LI><A HREF="#Fl_Text_Editor.remove_key_binding">remove_key_binding</A></LI>
<LI><A href="#Fl_Text_Editor.shortcut">shortcut</A></LI>
</UL></TD></TR>
</TABLE>
@ -217,5 +218,10 @@ void remove_key_binding(int key, int state);</A></H4>
<P>Removes a single key binding from the text editor or list.
<H4><A name="Fl_Text_Editor.shortcut">ulong Fl_Text_Editor::shortcut() const
<BR> void Fl_Text_Editor::shortcut(ulong key)</A></H4>
The first form returns the current shortcut key for the editor.
<P>The second form sets the shortcut key to <TT>key</TT>.
</BODY>
</HTML>

View File

@ -59,6 +59,7 @@ ALT="Fl_Value_Input widget."></P>
<LI><A href="#Fl_Value_Input.Fl_Value_Input">Fl_Value_Input</A></LI>
<LI><A href="#Fl_Value_Input.~Fl_Value_Input">~Fl_Value_Input</A></LI>
<LI><A href="#Fl_Value_Input.cursor_color">cursor_color</A></LI>
<LI><A href="#Fl_Value_Input.shortcut">shortcut</A></LI>
<LI><A href="#Fl_Value_Input.soft">soft</A></LI>
<LI><A href="#Fl_Value_Input.textcolor">textcolor</A></LI>
<LI><A href="#Fl_Value_Input.textfont">textfont</A></LI>
@ -85,6 +86,23 @@ void Fl_Value_Input::cursor_color(Fl_Color)</A></H4>
<P>Get or set the color of the text cursor. The text cursor is
black by default.
<H4><A name="Fl_Value_Input.shortcut">ulong Fl_Value_Input::shortcut() const
<BR> void Fl_Value_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_Value_Input.soft">uchar Fl_Value_Input::soft() const<BR>
void Fl_Value_Input::soft(uchar)</A></H4>

View File

@ -37,6 +37,8 @@
#include <FL/fl_message.H>
#include <FL/Fl_Menu_.H>
#include <FL/Fl_Button.H>
#include <FL/Fl_Value_Input.H>
#include <FL/Fl_Text_Display.H>
#include "../src/flstring.h"
#include <stdio.h>
#include <stdlib.h>
@ -589,14 +591,19 @@ int Shortcut_Button::handle(int e) {
void shortcut_in_cb(Shortcut_Button* i, void* v) {
if (v == LOAD) {
if ( !current_widget->is_button() && !current_widget->is_input() ) {
i->hide(); return;
}
i->show();
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();
else if (current_widget->is_value_input())
i->svalue = ((Fl_Value_Input*)(current_widget->o))->shortcut();
else if (current_widget->is_text_display())
i->svalue = ((Fl_Text_Display*)(current_widget->o))->shortcut();
else {
i->hide();
return;
}
i->show();
i->redraw();
} else {
int mod = 0;
@ -606,11 +613,18 @@ void shortcut_in_cb(Shortcut_Button* i, void* v) {
if (b->shortcut()!=i->svalue) mod = 1;
b->shortcut(i->svalue);
if (o->is_menu_item()) ((Fl_Widget_Type*)o)->redraw();
}
else if (o->selected && o->is_input()) {
} 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);
} else if (o->selected && o->is_value_input()) {
Fl_Value_Input* b = (Fl_Value_Input*)(((Fl_Widget_Type*)o)->o);
if (b->shortcut()!=i->svalue) mod = 1;
b->shortcut(i->svalue);
} else if (o->selected && o->is_text_display()) {
Fl_Text_Display* b = (Fl_Text_Display*)(((Fl_Widget_Type*)o)->o);
if (b->shortcut()!=i->svalue) mod = 1;
b->shortcut(i->svalue);
}
if (mod) set_modflag(1);
}

View File

@ -629,6 +629,8 @@ 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_value_input() const {return 0;}
int Fl_Type::is_text_display() 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

@ -132,6 +132,8 @@ public:
virtual int is_widget() const;
virtual int is_button() const;
virtual int is_input() const;
virtual int is_value_input() const;
virtual int is_text_display() const;
virtual int is_valuator() const;
virtual int is_spinner() const;
virtual int is_menu_item() const;

View File

@ -2162,30 +2162,26 @@ 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);
}
}
// write shortcut command if needed
int shortcut = 0;
if (is_button()) shortcut = ((Fl_Button*)o)->shortcut();
else if (is_input()) shortcut = ((Fl_Input_*)o)->shortcut();
else if (is_value_input()) shortcut = ((Fl_Value_Input*)o)->shortcut();
else if (is_text_display()) shortcut = ((Fl_Text_Display*)o)->shortcut();
if (shortcut) {
if (use_FL_COMMAND && (shortcut & (FL_CTRL|FL_META))) {
write_c("%s%s->shortcut(FL_COMMAND|0x%x);\n", indent(), var, shortcut & ~(FL_CTRL|FL_META));
} else {
write_c("%s%s->shortcut(0x%x);\n", indent(), var, shortcut);
}
}
if (is_button()) {
Fl_Button* b = (Fl_Button*)o;
if (b->down_box()) write_c("%s%s->down_box(FL_%s);\n", indent(), var,
boxname(b->down_box()));
if (b->value()) write_c("%s%s->value(1);\n", indent(), var);
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);
}
}
} else if (!strcmp(type_name(), "Fl_Input_Choice")) {
Fl_Input_Choice* b = (Fl_Input_Choice*)o;
if (b->down_box()) write_c("%s%s->down_box(FL_%s);\n", indent(), var,
@ -2348,6 +2344,14 @@ void Fl_Widget_Type::write_properties() {
Fl_Input_* b = (Fl_Input_*)o;
if (b->shortcut()) write_string("shortcut 0x%x", b->shortcut());
}
if (is_value_input()) {
Fl_Value_Input* b = (Fl_Value_Input*)o;
if (b->shortcut()) write_string("shortcut 0x%x", b->shortcut());
}
if (is_text_display()) {
Fl_Text_Display* b = (Fl_Text_Display*)o;
if (b->shortcut()) write_string("shortcut 0x%x", b->shortcut());
}
if (is_button()) {
Fl_Button* b = (Fl_Button*)o;
if (b->down_box()) {
@ -2537,10 +2541,12 @@ void Fl_Widget_Type::read_property(const char *c) {
hotspot(1);
} else if (!strcmp(c,"class")) {
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 (!strcmp(c,"shortcut")) {
int shortcut = strtol(read_word(),0,0);
if (is_button()) ((Fl_Button*)o)->shortcut(shortcut);
else if (is_input()) ((Fl_Input_*)o)->shortcut(shortcut);
else if (is_value_input()) ((Fl_Value_Input*)o)->shortcut(shortcut);
else if (is_text_display()) ((Fl_Text_Display*)o)->shortcut(shortcut);
} else {
if (!strncmp(c,"code",4)) {
int n = atoi(c+4);
@ -2717,6 +2723,18 @@ void Fl_Widget_Type::copy_properties() {
d->shortcut(s->shortcut());
}
// copy all attributes specific to widgets derived from Fl_Value_Input
if (is_value_input()) {
Fl_Value_Input* d = (Fl_Value_Input*)live_widget, *s = (Fl_Value_Input*)o;
d->shortcut(s->shortcut());
}
// copy all attributes specific to widgets derived from Fl_Text_Display
if (is_text_display()) {
Fl_Text_Display* d = (Fl_Text_Display*)live_widget, *s = (Fl_Text_Display*)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

@ -533,6 +533,7 @@ public:
if (w < 50) w = 50;
}
virtual const char *type_name() {return "Fl_Text_Display";}
int is_text_display() const {return 1;}
Fl_Widget *widget(int x,int y,int w,int h) {
Fl_Text_Display *myo = new Fl_Text_Display(x,y,w,h);
return myo;
@ -573,6 +574,7 @@ public:
if (w < 50) w = 50;
}
virtual const char *type_name() {return "Fl_Text_Editor";}
int is_text_display() const {return 1;}
Fl_Widget *widget(int x,int y,int w,int h) {
Fl_Text_Editor *myo = new Fl_Text_Editor(x,y,w,h);
return myo;
@ -793,6 +795,7 @@ public:
virtual const char *type_name() {return "Fl_Value_Input";}
int textstuff(int w, Fl_Font& f, int& s, Fl_Color& c);
int is_valuator() const {return 1;}
int is_value_input() const {return 1;}
Fl_Widget *widget(int x,int y,int w,int h) {
Fl_Value_Input *myo = new Fl_Value_Input(x,y,w,h,"value:");
return myo;

View File

@ -85,12 +85,14 @@ Fl_Text_Display::Fl_Text_Display(int X, int Y, int W, int H, const char* l)
damage_range2_start = damage_range2_end = -1;
dragPos = dragType = dragging = 0;
display_insert_position_hint = 0;
shortcut_ = 0;
color(FL_BACKGROUND2_COLOR, FL_SELECTION_COLOR);
box(FL_DOWN_FRAME);
textsize((uchar)FL_NORMAL_SIZE);
textcolor(FL_FOREGROUND_COLOR);
textfont(FL_HELVETICA);
set_flag(SHORTCUT_LABEL);
text_area.x = 0;
text_area.y = 0;
@ -3261,6 +3263,14 @@ int Fl_Text_Display::handle(int event) {
if (mHScrollBar->handle(event)) return 1;
break;
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;
}
return 0;

View File

@ -482,6 +482,13 @@ int Fl_Text_Editor::handle(int event) {
return 1;
}
break;
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;
}
return Fl_Text_Display::handle(event);

View File

@ -106,6 +106,8 @@ int Fl_Value_Input::handle(int event) {
return 1;
case FL_FOCUS:
return input.take_focus();
case FL_SHORTCUT:
return input.handle(event);
default:
DEFAULT:
input.type(((step() - floor(step()))>0.0 || step() == 0.0) ? FL_FLOAT_INPUT : FL_INT_INPUT);
@ -126,6 +128,7 @@ Fl_Value_Input::Fl_Value_Input(int X, int Y, int W, int H, const char* l)
selection_color(input.selection_color());
align(FL_ALIGN_LEFT);
value_damage();
set_flag(SHORTCUT_LABEL);
}
//