ENH: TabCtrl: support arrow key events

Change-Id: I16423d542246925e2469541b1d634d6c4373af69
This commit is contained in:
chunmao.guo 2022-08-09 14:35:58 +08:00 committed by Lane.Wei
parent 43cd7c8315
commit 85ffeb291d
3 changed files with 38 additions and 4 deletions

View file

@ -206,7 +206,7 @@ void ComboBox::DoSetItemClientData(unsigned int n, void *data)
void ComboBox::mouseDown(wxMouseEvent &event) void ComboBox::mouseDown(wxMouseEvent &event)
{ {
//SetFocus(); SetFocus();
if (drop_down) { if (drop_down) {
drop.Hide(); drop.Hide();
} else if (drop.HasDismissLongTime()) { } else if (drop.HasDismissLongTime()) {
@ -230,7 +230,8 @@ void ComboBox::mouseWheelMoved(wxMouseEvent &event)
} }
} }
void ComboBox::keyDown(wxKeyEvent& event) { void ComboBox::keyDown(wxKeyEvent& event)
{
switch (event.GetKeyCode()) { switch (event.GetKeyCode()) {
case WXK_RETURN: case WXK_RETURN:
case WXK_SPACE: case WXK_SPACE:

View file

@ -5,7 +5,8 @@ wxDEFINE_EVENT( wxEVT_TAB_SEL_CHANGED, wxCommandEvent );
BEGIN_EVENT_TABLE(TabCtrl, StaticBox) BEGIN_EVENT_TABLE(TabCtrl, StaticBox)
// catch paint events EVT_KEY_DOWN(TabCtrl::keyDown)
END_EVENT_TABLE() END_EVENT_TABLE()
/* /*
@ -201,6 +202,16 @@ void TabCtrl::DoSetSize(int x, int y, int width, int height, int sizeFlags)
relayout(); relayout();
} }
#ifdef __WIN32__
WXLRESULT TabCtrl::MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam)
{
if (nMsg == WM_GETDLGCODE) { return DLGC_WANTARROWS; }
return wxWindow::MSWWindowProc(nMsg, wParam, lParam);
}
#endif
void TabCtrl::relayout() void TabCtrl::relayout()
{ {
int offset = 10; int offset = 10;
@ -243,11 +254,28 @@ void TabCtrl::relayout()
void TabCtrl::buttonClicked(wxCommandEvent &event) void TabCtrl::buttonClicked(wxCommandEvent &event)
{ {
auto btn = event.GetEventObject(); SetFocus();
auto btn = event.GetEventObject();
auto iter = std::find(btns.begin(), btns.end(), btn); auto iter = std::find(btns.begin(), btns.end(), btn);
SelectItem(iter == btns.end() ? -1 : iter - btns.begin()); SelectItem(iter == btns.end() ? -1 : iter - btns.begin());
} }
void TabCtrl::keyDown(wxKeyEvent &event)
{
switch (event.GetKeyCode()) {
case WXK_UP:
case WXK_DOWN:
case WXK_LEFT:
case WXK_RIGHT:
if ((event.GetKeyCode() == WXK_UP || event.GetKeyCode() == WXK_LEFT) && GetSelection() > 0) {
SelectItem(GetSelection() - 1);
} else if ((event.GetKeyCode() == WXK_DOWN || event.GetKeyCode() == WXK_RIGHT) && GetSelection() + 1 < btns.size()) {
SelectItem(GetSelection() + 1);
}
break;
}
}
void TabCtrl::doRender(wxDC& dc) void TabCtrl::doRender(wxDC& dc)
{ {
wxSize size = GetSize(); wxSize size = GetSize();

View file

@ -65,9 +65,14 @@ public:
private: private:
virtual void DoSetSize(int x, int y, int width, int height, int sizeFlags = wxSIZE_AUTO); virtual void DoSetSize(int x, int y, int width, int height, int sizeFlags = wxSIZE_AUTO);
#ifdef __WIN32__
WXLRESULT MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam) override;
#endif
void relayout(); void relayout();
void buttonClicked(wxCommandEvent & event); void buttonClicked(wxCommandEvent & event);
void keyDown(wxKeyEvent &event);
void doRender(wxDC & dc) override; void doRender(wxDC & dc) override;