Try and cleanup the input focus/key event a little

This commit is contained in:
Marek Roszko 2021-07-05 19:47:03 -04:00
parent b0c07a28b3
commit 1fb42c5e43
3 changed files with 43 additions and 19 deletions

View File

@ -520,17 +520,9 @@ void TOOL_DISPATCHER::DispatchWxEvent( wxEvent& aEvent )
keyIsEscape = ( ke->GetKeyCode() == WXK_ESCAPE );
wxTextEntry* textEntry = dynamic_cast<wxTextEntry*>( focus );
wxStyledTextCtrl* styledText = dynamic_cast<wxStyledTextCtrl*>( focus );
if( KIUI::IsInputControlFocused() )
if( KIUI::IsInputControlFocused( focus ) )
{
bool enabled = true;
if( textEntry )
enabled = textEntry->IsEditable();
else if( styledText )
enabled = styledText->IsEditable();
bool enabled = KIUI::IsInputControlEditable( focus );
// Never process key events for tools when a text entry has focus
if( enabled )

View File

@ -168,26 +168,29 @@ void KIUI::SelectReferenceNumber( wxTextEntry* aTextEntry )
}
bool KIUI::IsInputControlFocused()
bool KIUI::IsInputControlFocused( wxWindow* aFocus )
{
wxWindow* focus = wxWindow::FindFocus();
if( aFocus == nullptr )
{
aFocus = wxWindow::FindFocus();
}
if( !focus )
if( !aFocus )
{
return false;
}
wxTextEntry* textEntry = dynamic_cast<wxTextEntry*>( focus );
wxStyledTextCtrl* styledText = dynamic_cast<wxStyledTextCtrl*>( focus );
wxListBox* listBox = dynamic_cast<wxListBox*>( focus );
wxSearchCtrl* searchCtrl = dynamic_cast<wxSearchCtrl*>( focus );
wxTextEntry* textEntry = dynamic_cast<wxTextEntry*>( aFocus );
wxStyledTextCtrl* styledText = dynamic_cast<wxStyledTextCtrl*>( aFocus );
wxListBox* listBox = dynamic_cast<wxListBox*>( aFocus );
wxSearchCtrl* searchCtrl = dynamic_cast<wxSearchCtrl*>( aFocus );
// Data view control is annoying, the focus is on a "wxDataViewCtrlMainWindow"
// class that is not formerly exported via the header.
// However, we can test the parent is wxDataViewCtrl instead
wxDataViewCtrl* dataViewCtrl = nullptr;
wxWindow* parent = focus->GetParent();
wxWindow* parent = aFocus->GetParent();
if( parent )
{
@ -198,6 +201,24 @@ bool KIUI::IsInputControlFocused()
}
bool KIUI::IsInputControlEditable( wxWindow* aFocus )
{
wxTextEntry* textEntry = dynamic_cast<wxTextEntry*>( aFocus );
wxStyledTextCtrl* styledText = dynamic_cast<wxStyledTextCtrl*>( aFocus );
wxSearchCtrl* searchCtrl = dynamic_cast<wxSearchCtrl*>( aFocus );
wxListBox* listBox = dynamic_cast<wxListBox*>( aFocus );
if( textEntry )
return textEntry->IsEditable();
else if( styledText )
return styledText->IsEditable();
else if( searchCtrl )
return searchCtrl->IsEditable();
return true; // Must return true if we can't determine the state, intentionally true for non inputs as well
}
bool KIUI::IsModalDialogFocused()
{
return Pgm().m_ModalDialogCount > 0;

View File

@ -76,8 +76,19 @@ void SelectReferenceNumber( wxTextEntry* aTextEntry );
/**
* Checks if a input control has focus
*
* @param aFocus Control that has focus, if null, wxWidgets will be queried
*/
bool IsInputControlFocused();
bool IsInputControlFocused( wxWindow* aFocus = nullptr );
/**
* Checks if a input control has focus
*
* @param aFocus Control that test if editable
*
* @return True if control is input and editable OR control is not a input. False if control is input and not editable.
*/
bool IsInputControlEditable( wxWindow* aControl );
bool IsModalDialogFocused();