feat(modulo): submit forms by just pressing Enter when possible, and also add help label. Fix #709
This commit is contained in:
parent
b470aaad8a
commit
3034dbe122
|
@ -89,11 +89,16 @@ public:
|
|||
std::vector<void *> fields;
|
||||
std::unordered_map<const char *, std::unique_ptr<FieldWrapper>> idMap;
|
||||
wxButton *submit;
|
||||
wxStaticText *helpText;
|
||||
bool hasFocusedMultilineControl;
|
||||
private:
|
||||
void AddComponent(wxPanel *parent, wxBoxSizer *sizer, FieldMetadata meta);
|
||||
void Submit();
|
||||
void OnSubmitBtn(wxCommandEvent& event);
|
||||
void OnEscape(wxKeyEvent& event);
|
||||
void OnCharHook(wxKeyEvent& event);
|
||||
void UpdateHelpText();
|
||||
void HandleNormalFocus(wxFocusEvent& event);
|
||||
void HandleMultilineFocus(wxFocusEvent& event);
|
||||
};
|
||||
enum
|
||||
{
|
||||
|
@ -113,6 +118,8 @@ bool FormApp::OnInit()
|
|||
FormFrame::FormFrame(const wxString& title, const wxPoint& pos, const wxSize& size)
|
||||
: wxFrame(NULL, wxID_ANY, title, pos, size, DEFAULT_STYLE)
|
||||
{
|
||||
hasFocusedMultilineControl = false;
|
||||
|
||||
panel = new wxPanel(this, wxID_ANY);
|
||||
wxBoxSizer *vbox = new wxBoxSizer(wxVERTICAL);
|
||||
panel->SetSizer(vbox);
|
||||
|
@ -125,8 +132,15 @@ FormFrame::FormFrame(const wxString& title, const wxPoint& pos, const wxSize& si
|
|||
submit = new wxButton(panel, ID_Submit, "Submit");
|
||||
vbox->Add(submit, 1, wxEXPAND | wxALL, PADDING);
|
||||
|
||||
helpText = new wxStaticText(panel, wxID_ANY, "", wxDefaultPosition, wxDefaultSize);
|
||||
wxFont helpFont = helpText->GetFont();
|
||||
helpFont.SetPointSize(8);
|
||||
helpText->SetFont(helpFont);
|
||||
vbox->Add(helpText, 0, wxLEFT | wxRIGHT | wxBOTTOM, PADDING);
|
||||
UpdateHelpText();
|
||||
|
||||
Bind(wxEVT_BUTTON, &FormFrame::OnSubmitBtn, this, ID_Submit);
|
||||
Bind(wxEVT_CHAR_HOOK, &FormFrame::OnEscape, this, wxID_ANY);
|
||||
Bind(wxEVT_CHAR_HOOK, &FormFrame::OnCharHook, this, wxID_ANY);
|
||||
// TODO: register ESC click handler: https://forums.wxwidgets.org/viewtopic.php?t=41926
|
||||
|
||||
this->SetClientSize(panel->GetBestSize());
|
||||
|
@ -157,6 +171,9 @@ void FormFrame::AddComponent(wxPanel *parent, wxBoxSizer *sizer, FieldMetadata m
|
|||
|
||||
if (textMeta->multiline) {
|
||||
textControl->SetMinSize(wxSize(MULTILINE_MIN_WIDTH, MULTILINE_MIN_HEIGHT));
|
||||
textControl->Bind(wxEVT_SET_FOCUS, &FormFrame::HandleMultilineFocus, this, wxID_ANY);
|
||||
} else {
|
||||
textControl->Bind(wxEVT_SET_FOCUS, &FormFrame::HandleNormalFocus, this, wxID_ANY);
|
||||
}
|
||||
|
||||
// Create the field wrapper
|
||||
|
@ -188,6 +205,8 @@ void FormFrame::AddComponent(wxPanel *parent, wxBoxSizer *sizer, FieldMetadata m
|
|||
((wxChoice*)choice)->SetSelection(selectedItem);
|
||||
}
|
||||
|
||||
((wxChoice*)choice)->Bind(wxEVT_SET_FOCUS, &FormFrame::HandleNormalFocus, this, wxID_ANY);
|
||||
|
||||
// Create the field wrapper
|
||||
std::unique_ptr<FieldWrapper> field((FieldWrapper*) new ChoiceFieldWrapper((wxChoice*) choice));
|
||||
idMap[meta.id] = std::move(field);
|
||||
|
@ -197,14 +216,14 @@ void FormFrame::AddComponent(wxPanel *parent, wxBoxSizer *sizer, FieldMetadata m
|
|||
if (selectedItem >= 0) {
|
||||
((wxListBox*)choice)->SetSelection(selectedItem);
|
||||
}
|
||||
|
||||
((wxListBox*)choice)->Bind(wxEVT_SET_FOCUS, &FormFrame::HandleNormalFocus, this, wxID_ANY);
|
||||
|
||||
// Create the field wrapper
|
||||
std::unique_ptr<FieldWrapper> field((FieldWrapper*) new ListFieldWrapper((wxListBox*) choice));
|
||||
idMap[meta.id] = std::move(field);
|
||||
}
|
||||
|
||||
|
||||
|
||||
control = choice;
|
||||
fields.push_back(choice);
|
||||
break;
|
||||
|
@ -253,15 +272,40 @@ void FormFrame::Submit() {
|
|||
Close(true);
|
||||
}
|
||||
|
||||
void FormFrame::HandleNormalFocus(wxFocusEvent& event) {
|
||||
hasFocusedMultilineControl = false;
|
||||
UpdateHelpText();
|
||||
event.Skip();
|
||||
}
|
||||
|
||||
void FormFrame::HandleMultilineFocus(wxFocusEvent& event) {
|
||||
hasFocusedMultilineControl = true;
|
||||
UpdateHelpText();
|
||||
event.Skip();
|
||||
}
|
||||
|
||||
void FormFrame::UpdateHelpText() {
|
||||
if (hasFocusedMultilineControl) {
|
||||
helpText->SetLabel("(or press CTRL+Enter to submit, ESC to cancel)");
|
||||
} else {
|
||||
helpText->SetLabel("(or press Enter to submit, ESC to cancel)");
|
||||
}
|
||||
this->SetClientSize(panel->GetBestSize());
|
||||
}
|
||||
|
||||
void FormFrame::OnSubmitBtn(wxCommandEvent &event) {
|
||||
Submit();
|
||||
}
|
||||
|
||||
void FormFrame::OnEscape(wxKeyEvent& event) {
|
||||
void FormFrame::OnCharHook(wxKeyEvent& event) {
|
||||
if (event.GetKeyCode() == WXK_ESCAPE) {
|
||||
Close(true);
|
||||
}else if(event.GetKeyCode() == WXK_RETURN && wxGetKeyState(WXK_RAW_CONTROL)) {
|
||||
Submit();
|
||||
}else if(event.GetKeyCode() == WXK_RETURN) {
|
||||
if (!hasFocusedMultilineControl || wxGetKeyState(WXK_RAW_CONTROL)) {
|
||||
Submit();
|
||||
} else {
|
||||
event.Skip();
|
||||
}
|
||||
}else{
|
||||
event.Skip();
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue
Block a user