implement wxListBox::EnsureVisible() in wxGTK; add a test for it to the widgets sample
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@51659 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -73,6 +73,8 @@ public:
|
|||||||
virtual int GetSelection() const;
|
virtual int GetSelection() const;
|
||||||
virtual int GetSelections(wxArrayInt& aSelections) const;
|
virtual int GetSelections(wxArrayInt& aSelections) const;
|
||||||
|
|
||||||
|
virtual void EnsureVisible(int n);
|
||||||
|
|
||||||
static wxVisualAttributes
|
static wxVisualAttributes
|
||||||
GetClassDefaultAttributes(wxWindowVariant variant = wxWINDOW_VARIANT_NORMAL);
|
GetClassDefaultAttributes(wxWindowVariant variant = wxWINDOW_VARIANT_NORMAL);
|
||||||
|
|
||||||
@@ -124,6 +126,9 @@ protected:
|
|||||||
// set the specified item
|
// set the specified item
|
||||||
void GtkSetItem(_GtkTreeIter& iter, const _GtkTreeEntry *entry);
|
void GtkSetItem(_GtkTreeIter& iter, const _GtkTreeEntry *entry);
|
||||||
|
|
||||||
|
// common part of DoSetFirstItem() and EnsureVisible()
|
||||||
|
void DoScrollToCell(int n, float alignY, float alignX);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void Init(); //common construction
|
void Init(); //common construction
|
||||||
|
|
||||||
|
@@ -68,6 +68,8 @@ enum
|
|||||||
ListboxPage_DeleteText,
|
ListboxPage_DeleteText,
|
||||||
ListboxPage_DeleteSel,
|
ListboxPage_DeleteSel,
|
||||||
ListboxPage_Listbox,
|
ListboxPage_Listbox,
|
||||||
|
ListboxPage_EnsureVisible,
|
||||||
|
ListboxPage_EnsureVisibleText,
|
||||||
ListboxPage_ContainerTests
|
ListboxPage_ContainerTests
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -91,6 +93,7 @@ protected:
|
|||||||
// event handlers
|
// event handlers
|
||||||
void OnButtonReset(wxCommandEvent& event);
|
void OnButtonReset(wxCommandEvent& event);
|
||||||
void OnButtonChange(wxCommandEvent& event);
|
void OnButtonChange(wxCommandEvent& event);
|
||||||
|
void OnButtonEnsureVisible(wxCommandEvent& event);
|
||||||
void OnButtonDelete(wxCommandEvent& event);
|
void OnButtonDelete(wxCommandEvent& event);
|
||||||
void OnButtonDeleteSel(wxCommandEvent& event);
|
void OnButtonDeleteSel(wxCommandEvent& event);
|
||||||
void OnButtonClear(wxCommandEvent& event);
|
void OnButtonClear(wxCommandEvent& event);
|
||||||
@@ -106,6 +109,7 @@ protected:
|
|||||||
|
|
||||||
void OnUpdateUIAddSeveral(wxUpdateUIEvent& event);
|
void OnUpdateUIAddSeveral(wxUpdateUIEvent& event);
|
||||||
void OnUpdateUIClearButton(wxUpdateUIEvent& event);
|
void OnUpdateUIClearButton(wxUpdateUIEvent& event);
|
||||||
|
void OnUpdateUIEnsureVisibleButton(wxUpdateUIEvent& event);
|
||||||
void OnUpdateUIDeleteButton(wxUpdateUIEvent& event);
|
void OnUpdateUIDeleteButton(wxUpdateUIEvent& event);
|
||||||
void OnUpdateUIDeleteSelButton(wxUpdateUIEvent& event);
|
void OnUpdateUIDeleteSelButton(wxUpdateUIEvent& event);
|
||||||
void OnUpdateUIResetButton(wxUpdateUIEvent& event);
|
void OnUpdateUIResetButton(wxUpdateUIEvent& event);
|
||||||
@@ -116,6 +120,11 @@ protected:
|
|||||||
// (re)create the listbox
|
// (re)create the listbox
|
||||||
void CreateLbox();
|
void CreateLbox();
|
||||||
|
|
||||||
|
// read the value of a listbox item index from the given control, return
|
||||||
|
// false if it's invalid
|
||||||
|
bool GetValidIndexFromText(const wxTextCtrl *text, int *n = NULL) const;
|
||||||
|
|
||||||
|
|
||||||
// listbox parameters
|
// listbox parameters
|
||||||
// ------------------
|
// ------------------
|
||||||
|
|
||||||
@@ -160,6 +169,7 @@ protected:
|
|||||||
// the text entries for "Add/change string" and "Delete" buttons
|
// the text entries for "Add/change string" and "Delete" buttons
|
||||||
wxTextCtrl *m_textAdd,
|
wxTextCtrl *m_textAdd,
|
||||||
*m_textChange,
|
*m_textChange,
|
||||||
|
*m_textEnsureVisible,
|
||||||
*m_textDelete;
|
*m_textDelete;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@@ -176,6 +186,7 @@ BEGIN_EVENT_TABLE(ListboxWidgetsPage, WidgetsPage)
|
|||||||
EVT_BUTTON(ListboxPage_Change, ListboxWidgetsPage::OnButtonChange)
|
EVT_BUTTON(ListboxPage_Change, ListboxWidgetsPage::OnButtonChange)
|
||||||
EVT_BUTTON(ListboxPage_Delete, ListboxWidgetsPage::OnButtonDelete)
|
EVT_BUTTON(ListboxPage_Delete, ListboxWidgetsPage::OnButtonDelete)
|
||||||
EVT_BUTTON(ListboxPage_DeleteSel, ListboxWidgetsPage::OnButtonDeleteSel)
|
EVT_BUTTON(ListboxPage_DeleteSel, ListboxWidgetsPage::OnButtonDeleteSel)
|
||||||
|
EVT_BUTTON(ListboxPage_EnsureVisible, ListboxWidgetsPage::OnButtonEnsureVisible)
|
||||||
EVT_BUTTON(ListboxPage_Clear, ListboxWidgetsPage::OnButtonClear)
|
EVT_BUTTON(ListboxPage_Clear, ListboxWidgetsPage::OnButtonClear)
|
||||||
EVT_BUTTON(ListboxPage_Add, ListboxWidgetsPage::OnButtonAdd)
|
EVT_BUTTON(ListboxPage_Add, ListboxWidgetsPage::OnButtonAdd)
|
||||||
EVT_BUTTON(ListboxPage_AddSeveral, ListboxWidgetsPage::OnButtonAddSeveral)
|
EVT_BUTTON(ListboxPage_AddSeveral, ListboxWidgetsPage::OnButtonAddSeveral)
|
||||||
@@ -184,6 +195,7 @@ BEGIN_EVENT_TABLE(ListboxWidgetsPage, WidgetsPage)
|
|||||||
|
|
||||||
EVT_TEXT_ENTER(ListboxPage_AddText, ListboxWidgetsPage::OnButtonAdd)
|
EVT_TEXT_ENTER(ListboxPage_AddText, ListboxWidgetsPage::OnButtonAdd)
|
||||||
EVT_TEXT_ENTER(ListboxPage_DeleteText, ListboxWidgetsPage::OnButtonDelete)
|
EVT_TEXT_ENTER(ListboxPage_DeleteText, ListboxWidgetsPage::OnButtonDelete)
|
||||||
|
EVT_TEXT_ENTER(ListboxPage_EnsureVisibleText, ListboxWidgetsPage::OnButtonEnsureVisible)
|
||||||
|
|
||||||
EVT_UPDATE_UI(ListboxPage_Reset, ListboxWidgetsPage::OnUpdateUIResetButton)
|
EVT_UPDATE_UI(ListboxPage_Reset, ListboxWidgetsPage::OnUpdateUIResetButton)
|
||||||
EVT_UPDATE_UI(ListboxPage_AddSeveral, ListboxWidgetsPage::OnUpdateUIAddSeveral)
|
EVT_UPDATE_UI(ListboxPage_AddSeveral, ListboxWidgetsPage::OnUpdateUIAddSeveral)
|
||||||
@@ -193,6 +205,7 @@ BEGIN_EVENT_TABLE(ListboxWidgetsPage, WidgetsPage)
|
|||||||
EVT_UPDATE_UI(ListboxPage_Change, ListboxWidgetsPage::OnUpdateUIDeleteSelButton)
|
EVT_UPDATE_UI(ListboxPage_Change, ListboxWidgetsPage::OnUpdateUIDeleteSelButton)
|
||||||
EVT_UPDATE_UI(ListboxPage_ChangeText, ListboxWidgetsPage::OnUpdateUIDeleteSelButton)
|
EVT_UPDATE_UI(ListboxPage_ChangeText, ListboxWidgetsPage::OnUpdateUIDeleteSelButton)
|
||||||
EVT_UPDATE_UI(ListboxPage_DeleteSel, ListboxWidgetsPage::OnUpdateUIDeleteSelButton)
|
EVT_UPDATE_UI(ListboxPage_DeleteSel, ListboxWidgetsPage::OnUpdateUIDeleteSelButton)
|
||||||
|
EVT_UPDATE_UI(ListboxPage_EnsureVisible, ListboxWidgetsPage::OnUpdateUIEnsureVisibleButton)
|
||||||
|
|
||||||
EVT_LISTBOX(ListboxPage_Listbox, ListboxWidgetsPage::OnListbox)
|
EVT_LISTBOX(ListboxPage_Listbox, ListboxWidgetsPage::OnListbox)
|
||||||
EVT_LISTBOX_DCLICK(ListboxPage_Listbox, ListboxWidgetsPage::OnListboxDClick)
|
EVT_LISTBOX_DCLICK(ListboxPage_Listbox, ListboxWidgetsPage::OnListboxDClick)
|
||||||
@@ -306,6 +319,13 @@ void ListboxWidgetsPage::CreateContent()
|
|||||||
sizerRow->Add(m_textChange, 1, wxLEFT, 5);
|
sizerRow->Add(m_textChange, 1, wxLEFT, 5);
|
||||||
sizerMiddle->Add(sizerRow, 0, wxALL | wxGROW, 5);
|
sizerMiddle->Add(sizerRow, 0, wxALL | wxGROW, 5);
|
||||||
|
|
||||||
|
sizerRow = new wxBoxSizer(wxHORIZONTAL);
|
||||||
|
btn = new wxButton(this, ListboxPage_EnsureVisible, _T("Make item &visible"));
|
||||||
|
m_textEnsureVisible = new wxTextCtrl(this, ListboxPage_EnsureVisibleText, wxEmptyString);
|
||||||
|
sizerRow->Add(btn, 0, wxRIGHT, 5);
|
||||||
|
sizerRow->Add(m_textEnsureVisible, 1, wxLEFT, 5);
|
||||||
|
sizerMiddle->Add(sizerRow, 0, wxALL | wxGROW, 5);
|
||||||
|
|
||||||
sizerRow = new wxBoxSizer(wxHORIZONTAL);
|
sizerRow = new wxBoxSizer(wxHORIZONTAL);
|
||||||
btn = new wxButton(this, ListboxPage_Delete, _T("&Delete this item"));
|
btn = new wxButton(this, ListboxPage_Delete, _T("&Delete this item"));
|
||||||
m_textDelete = new wxTextCtrl(this, ListboxPage_DeleteText, wxEmptyString);
|
m_textDelete = new wxTextCtrl(this, ListboxPage_DeleteText, wxEmptyString);
|
||||||
@@ -414,6 +434,30 @@ void ListboxWidgetsPage::CreateLbox()
|
|||||||
m_sizerLbox->Layout();
|
m_sizerLbox->Layout();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// miscellaneous helpers
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
bool
|
||||||
|
ListboxWidgetsPage::GetValidIndexFromText(const wxTextCtrl *text, int *n) const
|
||||||
|
{
|
||||||
|
unsigned long idx;
|
||||||
|
if ( !text->GetValue().ToULong(&idx) || (idx >= m_lbox->GetCount()) )
|
||||||
|
{
|
||||||
|
// don't give the warning if we're just testing but do give it if we
|
||||||
|
// want to retrieve the value as this is only done in answer to a user
|
||||||
|
// action
|
||||||
|
if ( n )
|
||||||
|
wxLogWarning("Invalid index \"%s\"", text->GetValue());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( n )
|
||||||
|
*n = idx;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
// event handlers
|
// event handlers
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
@@ -436,11 +480,21 @@ void ListboxWidgetsPage::OnButtonChange(wxCommandEvent& WXUNUSED(event))
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ListboxWidgetsPage::OnButtonEnsureVisible(wxCommandEvent& WXUNUSED(event))
|
||||||
|
{
|
||||||
|
int n;
|
||||||
|
if ( !GetValidIndexFromText(m_textEnsureVisible, &n) )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_lbox->EnsureVisible(n);
|
||||||
|
}
|
||||||
|
|
||||||
void ListboxWidgetsPage::OnButtonDelete(wxCommandEvent& WXUNUSED(event))
|
void ListboxWidgetsPage::OnButtonDelete(wxCommandEvent& WXUNUSED(event))
|
||||||
{
|
{
|
||||||
unsigned long n;
|
int n;
|
||||||
if ( !m_textDelete->GetValue().ToULong(&n) ||
|
if ( !GetValidIndexFromText(m_textDelete, &n) )
|
||||||
(n >= (unsigned)m_lbox->GetCount()) )
|
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -504,11 +558,14 @@ void ListboxWidgetsPage::OnUpdateUIResetButton(wxUpdateUIEvent& event)
|
|||||||
m_chkVScroll->GetValue() );
|
m_chkVScroll->GetValue() );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ListboxWidgetsPage::OnUpdateUIEnsureVisibleButton(wxUpdateUIEvent& event)
|
||||||
|
{
|
||||||
|
event.Enable(GetValidIndexFromText(m_textEnsureVisible));
|
||||||
|
}
|
||||||
|
|
||||||
void ListboxWidgetsPage::OnUpdateUIDeleteButton(wxUpdateUIEvent& event)
|
void ListboxWidgetsPage::OnUpdateUIDeleteButton(wxUpdateUIEvent& event)
|
||||||
{
|
{
|
||||||
unsigned long n;
|
event.Enable(GetValidIndexFromText(m_textDelete));
|
||||||
event.Enable(m_textDelete->GetValue().ToULong(&n) &&
|
|
||||||
(n < (unsigned)m_lbox->GetCount()));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ListboxWidgetsPage::OnUpdateUIDeleteSelButton(wxUpdateUIEvent& event)
|
void ListboxWidgetsPage::OnUpdateUIDeleteSelButton(wxUpdateUIEvent& event)
|
||||||
|
@@ -846,7 +846,7 @@ void wxListBox::GtkSetSelection(int n, const bool select, const bool blockEvent)
|
|||||||
m_blockEvent = false;
|
m_blockEvent = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void wxListBox::DoSetFirstItem( int n )
|
void wxListBox::DoScrollToCell(int n, float alignY, float alignX)
|
||||||
{
|
{
|
||||||
wxCHECK_RET( m_treeview, wxT("invalid listbox") );
|
wxCHECK_RET( m_treeview, wxT("invalid listbox") );
|
||||||
wxCHECK_RET( IsValid(n), wxT("invalid index"));
|
wxCHECK_RET( IsValid(n), wxT("invalid index"));
|
||||||
@@ -864,11 +864,21 @@ void wxListBox::DoSetFirstItem( int n )
|
|||||||
|
|
||||||
// Scroll to the desired cell (0.0 == topleft alignment)
|
// Scroll to the desired cell (0.0 == topleft alignment)
|
||||||
gtk_tree_view_scroll_to_cell(m_treeview, path, NULL,
|
gtk_tree_view_scroll_to_cell(m_treeview, path, NULL,
|
||||||
TRUE, 0.0f, 0.0f);
|
TRUE, alignY, alignX);
|
||||||
|
|
||||||
gtk_tree_path_free(path);
|
gtk_tree_path_free(path);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void wxListBox::DoSetFirstItem(int n)
|
||||||
|
{
|
||||||
|
DoScrollToCell(n, 0, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxListBox::EnsureVisible(int n)
|
||||||
|
{
|
||||||
|
DoScrollToCell(n, 0.5, 0);
|
||||||
|
}
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
// hittest
|
// hittest
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
Reference in New Issue
Block a user