fixed selecting the items in the combobox with a simple (not double) click
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@14609 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -136,6 +136,9 @@ protected:
|
|||||||
// filter mouse move events happening outside the list box
|
// filter mouse move events happening outside the list box
|
||||||
void OnMouseMove(wxMouseEvent& event);
|
void OnMouseMove(wxMouseEvent& event);
|
||||||
|
|
||||||
|
// set m_clicked value from here
|
||||||
|
void OnLeftUp(wxMouseEvent& event);
|
||||||
|
|
||||||
// called whenever the user selects or activates a listbox item
|
// called whenever the user selects or activates a listbox item
|
||||||
void OnSelect(wxCommandEvent& event);
|
void OnSelect(wxCommandEvent& event);
|
||||||
|
|
||||||
@@ -145,6 +148,9 @@ protected:
|
|||||||
const wxString& strArg);
|
const wxString& strArg);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
// has the mouse been released on this control?
|
||||||
|
bool m_clicked;
|
||||||
|
|
||||||
DECLARE_EVENT_TABLE()
|
DECLARE_EVENT_TABLE()
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -183,6 +189,7 @@ BEGIN_EVENT_TABLE(wxComboListBox, wxListBox)
|
|||||||
EVT_LISTBOX(-1, wxComboListBox::OnSelect)
|
EVT_LISTBOX(-1, wxComboListBox::OnSelect)
|
||||||
EVT_LISTBOX_DCLICK(-1, wxComboListBox::OnSelect)
|
EVT_LISTBOX_DCLICK(-1, wxComboListBox::OnSelect)
|
||||||
EVT_MOTION(wxComboListBox::OnMouseMove)
|
EVT_MOTION(wxComboListBox::OnMouseMove)
|
||||||
|
EVT_LEFT_UP(wxComboListBox::OnLeftUp)
|
||||||
END_EVENT_TABLE()
|
END_EVENT_TABLE()
|
||||||
|
|
||||||
BEGIN_EVENT_TABLE(wxComboControl, wxControl)
|
BEGIN_EVENT_TABLE(wxComboControl, wxControl)
|
||||||
@@ -341,7 +348,7 @@ bool wxComboControl::Show(bool show)
|
|||||||
|
|
||||||
if (m_btn)
|
if (m_btn)
|
||||||
m_btn->Show(show);
|
m_btn->Show(show);
|
||||||
|
|
||||||
if (m_text)
|
if (m_text)
|
||||||
m_text->Show(show);
|
m_text->Show(show);
|
||||||
|
|
||||||
@@ -382,6 +389,7 @@ void wxComboControl::ShowPopup()
|
|||||||
m_winPopup->PositionNearCombo();
|
m_winPopup->PositionNearCombo();
|
||||||
|
|
||||||
// show it
|
// show it
|
||||||
|
m_popup->OnShow();
|
||||||
m_winPopup->Popup(m_text);
|
m_winPopup->Popup(m_text);
|
||||||
m_text->SelectAll();
|
m_text->SelectAll();
|
||||||
m_popup->SetSelection(m_text->GetValue());
|
m_popup->SetSelection(m_text->GetValue());
|
||||||
@@ -521,22 +529,28 @@ bool wxComboListBox::SetSelection(const wxString& value)
|
|||||||
|
|
||||||
void wxComboListBox::OnSelect(wxCommandEvent& event)
|
void wxComboListBox::OnSelect(wxCommandEvent& event)
|
||||||
{
|
{
|
||||||
// first update the combo and close the listbox
|
if ( m_clicked )
|
||||||
m_combo->OnSelect(event.GetString());
|
{
|
||||||
|
// first update the combo and close the listbox
|
||||||
|
m_combo->OnSelect(event.GetString());
|
||||||
|
|
||||||
// next let the user code have the event
|
// next let the user code have the event
|
||||||
|
|
||||||
// all fields are already filled by the listbox, just change the event
|
// all fields are already filled by the listbox, just change the event
|
||||||
// type and send it to the combo
|
// type and send it to the combo
|
||||||
wxCommandEvent event2 = event;
|
wxCommandEvent event2 = event;
|
||||||
event2.SetEventType(wxEVT_COMMAND_COMBOBOX_SELECTED);
|
event2.SetEventType(wxEVT_COMMAND_COMBOBOX_SELECTED);
|
||||||
event2.SetEventObject(m_combo);
|
event2.SetEventObject(m_combo);
|
||||||
event2.SetId(m_combo->GetId());
|
event2.SetId(m_combo->GetId());
|
||||||
m_combo->ProcessEvent(event2);
|
m_combo->ProcessEvent(event2);
|
||||||
|
}
|
||||||
|
//else: ignore the events resultign from just moving the mouse initially
|
||||||
}
|
}
|
||||||
|
|
||||||
void wxComboListBox::OnShow()
|
void wxComboListBox::OnShow()
|
||||||
{
|
{
|
||||||
|
// nobody clicked us yet
|
||||||
|
m_clicked = FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool wxComboListBox::PerformAction(const wxControlAction& action,
|
bool wxComboListBox::PerformAction(const wxControlAction& action,
|
||||||
@@ -555,6 +569,14 @@ bool wxComboListBox::PerformAction(const wxControlAction& action,
|
|||||||
return wxListBox::PerformAction(action, numArg, strArg);
|
return wxListBox::PerformAction(action, numArg, strArg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void wxComboListBox::OnLeftUp(wxMouseEvent& event)
|
||||||
|
{
|
||||||
|
// we should dismiss the combo now
|
||||||
|
m_clicked = TRUE;
|
||||||
|
|
||||||
|
event.Skip();
|
||||||
|
}
|
||||||
|
|
||||||
void wxComboListBox::OnMouseMove(wxMouseEvent& event)
|
void wxComboListBox::OnMouseMove(wxMouseEvent& event)
|
||||||
{
|
{
|
||||||
// while a wxComboListBox is shown, it always has capture, so if it doesn't
|
// while a wxComboListBox is shown, it always has capture, so if it doesn't
|
||||||
|
@@ -805,11 +805,6 @@ wxSize wxListBox::DoGetBestClientSize() const
|
|||||||
|
|
||||||
bool wxListBox::SendEvent(wxEventType type, int item)
|
bool wxListBox::SendEvent(wxEventType type, int item)
|
||||||
{
|
{
|
||||||
// don't generate select events while the mouse is captured, we will only
|
|
||||||
// send them once it is released
|
|
||||||
if ( (type == wxEVT_COMMAND_LISTBOX_SELECTED) && (GetCapture() == this) )
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
wxCommandEvent event(type, m_windowId);
|
wxCommandEvent event(type, m_windowId);
|
||||||
event.SetEventObject(this);
|
event.SetEventObject(this);
|
||||||
|
|
||||||
@@ -1054,6 +1049,19 @@ void wxListBox::Activate(int item)
|
|||||||
// input handling
|
// input handling
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/*
|
||||||
|
The numArg here is the listbox item index while the strArg is used
|
||||||
|
differently for the different actions:
|
||||||
|
|
||||||
|
a) for wxACTION_LISTBOX_FIND it has the natural meaning: this is the string
|
||||||
|
to find
|
||||||
|
|
||||||
|
b) for wxACTION_LISTBOX_SELECT and wxACTION_LISTBOX_EXTENDSEL it is used
|
||||||
|
to decide if the listbox should send the notification event (it is empty)
|
||||||
|
or not (it is not): this allows us to reuse the same action for when the
|
||||||
|
user is dragging the mouse when it has been released although in the
|
||||||
|
first case no notification is sent while in the second it is sent.
|
||||||
|
*/
|
||||||
bool wxListBox::PerformAction(const wxControlAction& action,
|
bool wxListBox::PerformAction(const wxControlAction& action,
|
||||||
long numArg,
|
long numArg,
|
||||||
const wxString& strArg)
|
const wxString& strArg)
|
||||||
@@ -1081,7 +1089,11 @@ bool wxListBox::PerformAction(const wxControlAction& action,
|
|||||||
else if ( action == wxACTION_LISTBOX_SELECT )
|
else if ( action == wxACTION_LISTBOX_SELECT )
|
||||||
{
|
{
|
||||||
DeselectAll(item);
|
DeselectAll(item);
|
||||||
SelectAndNotify(item);
|
|
||||||
|
if ( strArg.empty() )
|
||||||
|
SelectAndNotify(item);
|
||||||
|
else
|
||||||
|
Select(TRUE, item);
|
||||||
}
|
}
|
||||||
else if ( action == wxACTION_LISTBOX_SELECTADD )
|
else if ( action == wxACTION_LISTBOX_SELECTADD )
|
||||||
Select(TRUE, item);
|
Select(TRUE, item);
|
||||||
@@ -1257,14 +1269,33 @@ bool wxStdListboxInputHandler::HandleKey(wxInputConsumer *consumer,
|
|||||||
switch ( keycode )
|
switch ( keycode )
|
||||||
{
|
{
|
||||||
// movement
|
// movement
|
||||||
case WXK_UP: action = wxACTION_LISTBOX_MOVEUP; break;
|
case WXK_UP:
|
||||||
case WXK_DOWN: action = wxACTION_LISTBOX_MOVEDOWN; break;
|
action = wxACTION_LISTBOX_MOVEUP;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case WXK_DOWN:
|
||||||
|
action = wxACTION_LISTBOX_MOVEDOWN;
|
||||||
|
break;
|
||||||
|
|
||||||
case WXK_PAGEUP:
|
case WXK_PAGEUP:
|
||||||
case WXK_PRIOR: action = wxACTION_LISTBOX_PAGEUP; break;
|
|
||||||
|
case WXK_PRIOR:
|
||||||
|
action = wxACTION_LISTBOX_PAGEUP;
|
||||||
|
break;
|
||||||
|
|
||||||
case WXK_PAGEDOWN:
|
case WXK_PAGEDOWN:
|
||||||
case WXK_NEXT: action = wxACTION_LISTBOX_PAGEDOWN; break;
|
|
||||||
case WXK_HOME: action = wxACTION_LISTBOX_START; break;
|
case WXK_NEXT:
|
||||||
case WXK_END: action = wxACTION_LISTBOX_END; break;
|
action = wxACTION_LISTBOX_PAGEDOWN;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case WXK_HOME:
|
||||||
|
action = wxACTION_LISTBOX_START;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case WXK_END:
|
||||||
|
action = wxACTION_LISTBOX_END;
|
||||||
|
break;
|
||||||
|
|
||||||
// selection
|
// selection
|
||||||
case WXK_SPACE:
|
case WXK_SPACE:
|
||||||
@@ -1346,7 +1377,6 @@ bool wxStdListboxInputHandler::HandleMouse(wxInputConsumer *consumer,
|
|||||||
winCapture->ReleaseMouse();
|
winCapture->ReleaseMouse();
|
||||||
m_btnCapture = 0;
|
m_btnCapture = 0;
|
||||||
|
|
||||||
// generate the last event to triiger sending the selection event
|
|
||||||
action = m_actionMouse;
|
action = m_actionMouse;
|
||||||
}
|
}
|
||||||
//else: the mouse wasn't presed over the listbox, only released here
|
//else: the mouse wasn't presed over the listbox, only released here
|
||||||
@@ -1396,7 +1426,9 @@ bool wxStdListboxInputHandler::HandleMouseMove(wxInputConsumer *consumer,
|
|||||||
|
|
||||||
if ( IsValidIndex(lbox, item) )
|
if ( IsValidIndex(lbox, item) )
|
||||||
{
|
{
|
||||||
lbox->PerformAction(m_actionMouse, item);
|
// pass something into strArg to tell the listbox that it shouldn't
|
||||||
|
// send the notification message: see PerformAction() above
|
||||||
|
lbox->PerformAction(m_actionMouse, item, _T("no"));
|
||||||
}
|
}
|
||||||
// else: don't pass invalid index to the listbox
|
// else: don't pass invalid index to the listbox
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user