Merge branch 'listctrl-fixes'

Various generic wxListCtrl fixes and improvements.

Closes https://github.com/wxWidgets/wxWidgets/pull/2340
This commit is contained in:
Vadim Zeitlin
2021-04-27 14:05:12 +02:00
10 changed files with 106 additions and 82 deletions

View File

@@ -68,6 +68,14 @@ public:
bool SetColumn( int col, const wxListItem& item ) wxOVERRIDE;
int GetColumnWidth( int col ) const wxOVERRIDE;
bool SetColumnWidth( int col, int width) wxOVERRIDE;
// Column ordering functions
int GetColumnOrder(int col) const wxOVERRIDE;
int GetColumnIndexFromOrder(int order) const wxOVERRIDE;
wxArrayInt GetColumnsOrder() const wxOVERRIDE;
bool SetColumnsOrder(const wxArrayInt& orders) wxOVERRIDE;
int GetCountPerPage() const; // not the same in wxGLC as in Windows, I think
wxRect GetViewRect() const;

View File

@@ -190,9 +190,9 @@ public:
wxT("width can only be increased") );
m_rectAll.width = w;
m_rectLabel.x = m_rectAll.x + (w - m_rectLabel.width) / 2;
m_rectIcon.x = m_rectAll.x + (w - m_rectIcon.width) / 2;
m_rectHighlight.x = m_rectAll.x + (w - m_rectHighlight.width) / 2;
m_rectLabel.x += (w - m_rectLabel.width) / 2;
m_rectIcon.x += (w - m_rectIcon.width) / 2;
m_rectHighlight.x += (w - m_rectHighlight.width) / 2;
}
}
*m_gi;

View File

@@ -399,6 +399,14 @@ public:
virtual int GetColumnWidth(int col) const = 0;
virtual bool SetColumnWidth(int col, int width) = 0;
// Column ordering functions
virtual int GetColumnOrder(int col) const = 0;
virtual int GetColumnIndexFromOrder(int order) const = 0;
virtual wxArrayInt GetColumnsOrder() const = 0;
virtual bool SetColumnsOrder(const wxArrayInt& orders) = 0;
// Other miscellaneous accessors.
// ------------------------------

View File

@@ -129,14 +129,14 @@ public:
// Gets the column order from its index or index from its order
int GetColumnOrder(int col) const;
int GetColumnIndexFromOrder(int order) const;
int GetColumnOrder(int col) const wxOVERRIDE;
int GetColumnIndexFromOrder(int order) const wxOVERRIDE;
// Gets the column order for all columns
wxArrayInt GetColumnsOrder() const;
wxArrayInt GetColumnsOrder() const wxOVERRIDE;
// Sets the column order for all columns
bool SetColumnsOrder(const wxArrayInt& orders);
bool SetColumnsOrder(const wxArrayInt& orders) wxOVERRIDE;
// Gets the number of items that can fit vertically in the

View File

@@ -60,14 +60,14 @@ public:
// Gets the column order from its index or index from its order
int GetColumnOrder(int col) const;
int GetColumnIndexFromOrder(int order) const;
int GetColumnOrder(int col) const wxOVERRIDE;
int GetColumnIndexFromOrder(int order) const wxOVERRIDE;
// Gets the column order for all columns
wxArrayInt GetColumnsOrder() const;
wxArrayInt GetColumnsOrder() const wxOVERRIDE;
// Sets the column order for all columns
bool SetColumnsOrder(const wxArrayInt& orders);
bool SetColumnsOrder(const wxArrayInt& orders) wxOVERRIDE;
// Gets the number of items that can fit vertically in the

View File

@@ -147,10 +147,43 @@ enum
To intercept events from a list control, use the event table macros described
in wxListEvent.
<b>wxMac Note</b>: Starting with wxWidgets 2.8, wxListCtrl uses a native
implementation for report mode, and uses a generic implementation for other
modes. You can use the generic implementation for report mode as well by setting
the @c mac.listctrl.always_use_generic system option (see wxSystemOptions) to 1.
@note The native wxOSX implementation for report mode that was added in wxWidgets
2.8 was removed in wxWidgets 3.1, meaning for wxWidgets 3.1+ wxOSX uses the generic
implementation for all modes.
@subsection column_order Column Ordering
By default, the columns of a list control appear on the screen in order
of their indices, i.e. column 0 appears first, then column 1 next,
and so on. However this can be changed by using the SetColumnsOrder() function
to arbitrarily reorder the columns visual order.
The user can also rearrange the columns interactively by dragging them.
In this case, the index of the column is not the same as its order and
the functions GetColumnOrder() and GetColumnIndexFromOrder() should be
used to translate between them.
@note All the other functions still work with the column indices,
i.e. the visual positioning of the columns on screen doesn't affect the
code setting or getting their values for example.
Example of reordering columns:
@code
wxListCtrl *list = new wxListCtrl(...);
for ( int i = 0; i < 3; i++ )
list->InsertColumn(i, wxString::Format("Column %d", i));
wxArrayInt order(3);
order[0] = 2;
order[1] = 0;
order[2] = 1;
list->SetColumnsOrder(order);
// now list->GetColumnsOrder() will return order and
// list->GetColumnIndexFromOrder(n) will return order[n] and
// list->GetColumnOrder() will return 1, 2 and 0 for the column 0,
// 1 and 2 respectively
@endcode
@beginStyleTable
@@ -538,8 +571,10 @@ public:
corresponds to the value of the element number @a pos in the array
returned by GetColumnsOrder().
Please see SetColumnsOrder() documentation for an example and
additional remarks about the columns ordering.
@note This function makes sense for report view only and currently is only
implemented in the wxMSW port. Use @c wxHAS_LISTCTRL_COLUMN_ORDER to guard uses
of this function so that they will start working under the other platforms when
support for the column reordering is added there.
@see GetColumnOrder()
*/
@@ -552,8 +587,10 @@ public:
given visual position, e.g. calling it with @a col equal to 0 returns
the index of the first shown column.
Please see SetColumnsOrder() documentation for an example and
additional remarks about the columns ordering.
@note This function makes sense for report view only and currently is only
implemented in the wxMSW port. Use @c wxHAS_LISTCTRL_COLUMN_ORDER to guard uses
of this function so that they will start working under the other platforms when
support for the column reordering is added there.
@see GetColumnsOrder(), GetColumnIndexFromOrder()
*/
@@ -569,8 +606,10 @@ public:
On error, an empty array is returned.
Please see SetColumnsOrder() documentation for an example and
additional remarks about the columns ordering.
@note This function makes sense for report view only and currently is only
implemented in the wxMSW port. Use @c wxHAS_LISTCTRL_COLUMN_ORDER to guard uses
of this function so that they will start working under the other platforms when
support for the column reordering is added there.
@see GetColumnOrder(), GetColumnIndexFromOrder()
*/
@@ -1027,17 +1066,6 @@ public:
/**
Changes the order in which the columns are shown.
By default, the columns of a list control appear on the screen in order
of their indices, i.e. the column 0 appears first, the column 1 next
and so on. However by using this function it is possible to arbitrarily
reorder the columns visual order and the user can also rearrange the
columns interactively by dragging them. In this case, the index of the
column is not the same as its order and the functions GetColumnOrder()
and GetColumnIndexFromOrder() should be used to translate between them.
Notice that all the other functions still work with the column indices,
i.e. the visual positioning of the columns on screen doesn't affect the
code setting or getting their values for example.
The @a orders array must have the same number elements as the number of
columns and contain each position exactly once. Its n-th element
contains the index of the column to be shown in n-th position, so for a
@@ -1045,28 +1073,9 @@ public:
results in the third column being displayed first, the first one next
and the second one last.
Example of using it:
@code
wxListCtrl *list = new wxListCtrl(...);
for ( int i = 0; i < 3; i++ )
list->InsertColumn(i, wxString::Format("Column %d", i));
wxArrayInt order(3);
order[0] = 2;
order[1] = 0;
order[2] = 1;
list->SetColumnsOrder(order);
// now list->GetColumnsOrder() will return order and
// list->GetColumnIndexFromOrder(n) will return order[n] and
// list->GetColumnOrder() will return 1, 2 and 0 for the column 0,
// 1 and 2 respectively
@endcode
Please notice that this function makes sense for report view only and
currently is only implemented in wxMSW port. To avoid explicit tests
for @c __WXMSW__ in your code, please use @c wxHAS_LISTCTRL_COLUMN_ORDER
as this will allow it to start working under the other platforms when
@note This function makes sense for report view only and currently is only
implemented in the wxMSW port. Use @c wxHAS_LISTCTRL_COLUMN_ORDER to guard uses
of this function so that they will start working under the other platforms when
support for the column reordering is added there.
@see GetColumnsOrder()

View File

@@ -105,9 +105,6 @@
@flag{window-default-variant}
The default variant used by windows (cast to integer from the wxWindowVariant enum).
Also known as wxWINDOW_DEFAULT_VARIANT.
@flag{mac.listctrl.always_use_generic}
Tells wxListCtrl to use the generic control even when it is capable of
using the native control instead. Also known as wxMAC_ALWAYS_USE_GENERIC_LISTCTRL.
@flag{mac.textcontrol-use-spell-checker}
If 1 activates the spell checking in wxTextCtrl.
@flag{osx.openfiledialog.always-show-types}

View File

@@ -150,9 +150,6 @@ wxBEGIN_EVENT_TABLE(MyFrame, wxFrame)
EVT_MENU(LIST_TOGGLE_HEADER, MyFrame::OnToggleHeader)
EVT_MENU(LIST_TOGGLE_BELL, MyFrame::OnToggleBell)
EVT_MENU(LIST_CHECKVISIBILITY, MyFrame::OnCheckVisibility)
#ifdef __WXOSX__
EVT_MENU(LIST_MAC_USE_GENERIC, MyFrame::OnToggleMacUseGeneric)
#endif // __WXOSX__
EVT_MENU(LIST_FIND, MyFrame::OnFind)
EVT_MENU(LIST_TOGGLE_CHECKBOX, MyFrame::OnToggleItemCheckBox)
EVT_MENU(LIST_GET_CHECKBOX, MyFrame::OnGetItemCheckBox)
@@ -229,10 +226,6 @@ MyFrame::MyFrame(const wxString& title)
menuView->Append(LIST_SMALL_VIRTUAL_VIEW, "Small virtual vie&w\tF8");
menuView->AppendSeparator();
menuView->Append(LIST_SET_ITEMS_COUNT, "Set &number of items");
#ifdef __WXOSX__
menuView->AppendSeparator();
menuView->AppendCheckItem(LIST_MAC_USE_GENERIC, "Mac: Use Generic Control");
#endif
wxMenu *menuList = new wxMenu;
menuList->Append(LIST_GOTO, "&Go to item #3\tCtrl-3");
@@ -391,15 +384,6 @@ void MyFrame::OnCheckVisibility(wxCommandEvent& WXUNUSED(event))
wxLogMessage( "Line 9 is not visible" );
}
#ifdef __WXOSX__
void MyFrame::OnToggleMacUseGeneric(wxCommandEvent& event)
{
wxSystemOptions::SetOption("mac.listctrl.always_use_generic", event.IsChecked());
}
#endif // __WXOSX__
void MyFrame::OnGoTo(wxCommandEvent& WXUNUSED(event))
{
if ( m_listCtrl->IsEmpty() )

View File

@@ -148,9 +148,6 @@ protected:
void OnToggleLines(wxCommandEvent& event);
void OnToggleHeader(wxCommandEvent& event);
void OnToggleBell(wxCommandEvent& event);
#ifdef __WXOSX__
void OnToggleMacUseGeneric(wxCommandEvent& event);
#endif // __WXOSX__
void OnFind(wxCommandEvent& event);
void OnToggleItemCheckBox(wxCommandEvent& event);
void OnGetItemCheckBox(wxCommandEvent& event);
@@ -245,9 +242,6 @@ enum
LIST_FREEZE,
LIST_THAW,
LIST_TOGGLE_LINES,
#ifdef __WXOSX__
LIST_MAC_USE_GENERIC,
#endif
LIST_CHECKVISIBILITY,
LIST_CTRL = 1000
};

View File

@@ -552,8 +552,7 @@ void wxListLineData::SetPosition( int x, int y, int spacing )
if ( item->HasImage() )
{
m_gi->m_rectIcon.x = m_gi->m_rectAll.x + 4 +
(m_gi->m_rectAll.width - m_gi->m_rectIcon.width) / 2;
m_gi->m_rectIcon.x = m_gi->m_rectAll.x + 4;
m_gi->m_rectIcon.y = m_gi->m_rectAll.y + 4;
}
@@ -5163,6 +5162,31 @@ bool wxGenericListCtrl::SetColumnWidth( int col, int width )
return true;
}
// Column ordering functions
int wxGenericListCtrl::GetColumnOrder(int col) const
{
// TODO: Implement this on generic port
return col;
}
int wxGenericListCtrl::GetColumnIndexFromOrder(int order) const
{
// TODO: Implement this on generic port
return order;
}
wxArrayInt wxGenericListCtrl::GetColumnsOrder() const
{
// TODO: Implement this on generic port
return wxArrayInt();
}
bool wxGenericListCtrl::SetColumnsOrder(const wxArrayInt& WXUNUSED(orders))
{
// TODO: Implement this on generic port
return false;
}
int wxGenericListCtrl::GetCountPerPage() const
{
return m_mainWin->GetCountPerPage(); // different from Windows ?