summaryrefslogtreecommitdiff
path: root/fluid
diff options
context:
space:
mode:
authorMatthias Melcher <fltk@matthiasm.com>2008-04-22 23:33:17 +0000
committerMatthias Melcher <fltk@matthiasm.com>2008-04-22 23:33:17 +0000
commit8198e51799ba715d27e82b276b93cb39918d3361 (patch)
treeb21114724d43324e86450d6d43ca56527b14ff7c /fluid
parent6a143b1f61533c03ef20a8f2b82d2c90180055bc (diff)
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
Diffstat (limited to 'fluid')
-rw-r--r--fluid/Fl_Menu_Type.cxx14
-rw-r--r--fluid/Fl_Type.cxx1
-rw-r--r--fluid/Fl_Type.h1
-rw-r--r--fluid/Fl_Widget_Type.cxx23
-rw-r--r--fluid/factory.cxx4
5 files changed, 41 insertions, 2 deletions
diff --git a/fluid/Fl_Menu_Type.cxx b/fluid/Fl_Menu_Type.cxx
index 94bd160e7..8055bf312 100644
--- a/fluid/Fl_Menu_Type.cxx
+++ b/fluid/Fl_Menu_Type.cxx
@@ -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);
}
}
diff --git a/fluid/Fl_Type.cxx b/fluid/Fl_Type.cxx
index d2ae60ca7..621650f82 100644
--- a/fluid/Fl_Type.cxx
+++ b/fluid/Fl_Type.cxx
@@ -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;}
diff --git a/fluid/Fl_Type.h b/fluid/Fl_Type.h
index a35fc6201..04c159c13 100644
--- a/fluid/Fl_Type.h
+++ b/fluid/Fl_Type.h
@@ -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;
diff --git a/fluid/Fl_Widget_Type.cxx b/fluid/Fl_Widget_Type.cxx
index cae00ab0c..c67bb6438 100644
--- a/fluid/Fl_Widget_Type.cxx
+++ b/fluid/Fl_Widget_Type.cxx
@@ -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;
diff --git a/fluid/factory.cxx b/fluid/factory.cxx
index 78723a167..6e061cc5a 100644
--- a/fluid/factory.cxx
+++ b/fluid/factory.cxx
@@ -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) {