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
|
||||
void OnMouseMove(wxMouseEvent& event);
|
||||
|
||||
// set m_clicked value from here
|
||||
void OnLeftUp(wxMouseEvent& event);
|
||||
|
||||
// called whenever the user selects or activates a listbox item
|
||||
void OnSelect(wxCommandEvent& event);
|
||||
|
||||
@@ -145,6 +148,9 @@ protected:
|
||||
const wxString& strArg);
|
||||
|
||||
private:
|
||||
// has the mouse been released on this control?
|
||||
bool m_clicked;
|
||||
|
||||
DECLARE_EVENT_TABLE()
|
||||
};
|
||||
|
||||
@@ -183,6 +189,7 @@ BEGIN_EVENT_TABLE(wxComboListBox, wxListBox)
|
||||
EVT_LISTBOX(-1, wxComboListBox::OnSelect)
|
||||
EVT_LISTBOX_DCLICK(-1, wxComboListBox::OnSelect)
|
||||
EVT_MOTION(wxComboListBox::OnMouseMove)
|
||||
EVT_LEFT_UP(wxComboListBox::OnLeftUp)
|
||||
END_EVENT_TABLE()
|
||||
|
||||
BEGIN_EVENT_TABLE(wxComboControl, wxControl)
|
||||
@@ -341,7 +348,7 @@ bool wxComboControl::Show(bool show)
|
||||
|
||||
if (m_btn)
|
||||
m_btn->Show(show);
|
||||
|
||||
|
||||
if (m_text)
|
||||
m_text->Show(show);
|
||||
|
||||
@@ -382,6 +389,7 @@ void wxComboControl::ShowPopup()
|
||||
m_winPopup->PositionNearCombo();
|
||||
|
||||
// show it
|
||||
m_popup->OnShow();
|
||||
m_winPopup->Popup(m_text);
|
||||
m_text->SelectAll();
|
||||
m_popup->SetSelection(m_text->GetValue());
|
||||
@@ -521,22 +529,28 @@ bool wxComboListBox::SetSelection(const wxString& value)
|
||||
|
||||
void wxComboListBox::OnSelect(wxCommandEvent& event)
|
||||
{
|
||||
// first update the combo and close the listbox
|
||||
m_combo->OnSelect(event.GetString());
|
||||
if ( m_clicked )
|
||||
{
|
||||
// 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
|
||||
// type and send it to the combo
|
||||
wxCommandEvent event2 = event;
|
||||
event2.SetEventType(wxEVT_COMMAND_COMBOBOX_SELECTED);
|
||||
event2.SetEventObject(m_combo);
|
||||
event2.SetId(m_combo->GetId());
|
||||
m_combo->ProcessEvent(event2);
|
||||
// all fields are already filled by the listbox, just change the event
|
||||
// type and send it to the combo
|
||||
wxCommandEvent event2 = event;
|
||||
event2.SetEventType(wxEVT_COMMAND_COMBOBOX_SELECTED);
|
||||
event2.SetEventObject(m_combo);
|
||||
event2.SetId(m_combo->GetId());
|
||||
m_combo->ProcessEvent(event2);
|
||||
}
|
||||
//else: ignore the events resultign from just moving the mouse initially
|
||||
}
|
||||
|
||||
void wxComboListBox::OnShow()
|
||||
{
|
||||
// nobody clicked us yet
|
||||
m_clicked = FALSE;
|
||||
}
|
||||
|
||||
bool wxComboListBox::PerformAction(const wxControlAction& action,
|
||||
@@ -555,6 +569,14 @@ bool wxComboListBox::PerformAction(const wxControlAction& action,
|
||||
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)
|
||||
{
|
||||
// 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)
|
||||
{
|
||||
// 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);
|
||||
event.SetEventObject(this);
|
||||
|
||||
@@ -1054,6 +1049,19 @@ void wxListBox::Activate(int item)
|
||||
// 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,
|
||||
long numArg,
|
||||
const wxString& strArg)
|
||||
@@ -1081,7 +1089,11 @@ bool wxListBox::PerformAction(const wxControlAction& action,
|
||||
else if ( action == wxACTION_LISTBOX_SELECT )
|
||||
{
|
||||
DeselectAll(item);
|
||||
SelectAndNotify(item);
|
||||
|
||||
if ( strArg.empty() )
|
||||
SelectAndNotify(item);
|
||||
else
|
||||
Select(TRUE, item);
|
||||
}
|
||||
else if ( action == wxACTION_LISTBOX_SELECTADD )
|
||||
Select(TRUE, item);
|
||||
@@ -1257,14 +1269,33 @@ bool wxStdListboxInputHandler::HandleKey(wxInputConsumer *consumer,
|
||||
switch ( keycode )
|
||||
{
|
||||
// movement
|
||||
case WXK_UP: action = wxACTION_LISTBOX_MOVEUP; break;
|
||||
case WXK_DOWN: action = wxACTION_LISTBOX_MOVEDOWN; break;
|
||||
case WXK_UP:
|
||||
action = wxACTION_LISTBOX_MOVEUP;
|
||||
break;
|
||||
|
||||
case WXK_DOWN:
|
||||
action = wxACTION_LISTBOX_MOVEDOWN;
|
||||
break;
|
||||
|
||||
case WXK_PAGEUP:
|
||||
case WXK_PRIOR: action = wxACTION_LISTBOX_PAGEUP; break;
|
||||
|
||||
case WXK_PRIOR:
|
||||
action = wxACTION_LISTBOX_PAGEUP;
|
||||
break;
|
||||
|
||||
case WXK_PAGEDOWN:
|
||||
case WXK_NEXT: action = wxACTION_LISTBOX_PAGEDOWN; break;
|
||||
case WXK_HOME: action = wxACTION_LISTBOX_START; break;
|
||||
case WXK_END: action = wxACTION_LISTBOX_END; break;
|
||||
|
||||
case WXK_NEXT:
|
||||
action = wxACTION_LISTBOX_PAGEDOWN;
|
||||
break;
|
||||
|
||||
case WXK_HOME:
|
||||
action = wxACTION_LISTBOX_START;
|
||||
break;
|
||||
|
||||
case WXK_END:
|
||||
action = wxACTION_LISTBOX_END;
|
||||
break;
|
||||
|
||||
// selection
|
||||
case WXK_SPACE:
|
||||
@@ -1346,7 +1377,6 @@ bool wxStdListboxInputHandler::HandleMouse(wxInputConsumer *consumer,
|
||||
winCapture->ReleaseMouse();
|
||||
m_btnCapture = 0;
|
||||
|
||||
// generate the last event to triiger sending the selection event
|
||||
action = m_actionMouse;
|
||||
}
|
||||
//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) )
|
||||
{
|
||||
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
|
||||
}
|
||||
|
Reference in New Issue
Block a user