Allow disabling hiding columns when using wxHeaderCtrl in wxGrid

Add wxGrid::DisableHidingColumns() method which can be used to prevent
wxHeaderCtrl from allowing the user to hide columns interactively, which
is something it allows to do by default, unlike the "built-in" wxGrid
header.

Also add EnableHidingColumns() and CanHideColumns() for consistency with
the other similar methods.

Closes https://github.com/wxWidgets/wxWidgets/pull/1554
This commit is contained in:
Ilya Sinitsyn
2019-09-16 23:14:25 +07:00
committed by Vadim Zeitlin
parent 4302c6b8ba
commit e26d90028b
6 changed files with 72 additions and 1 deletions

View File

@@ -1359,6 +1359,11 @@ public:
void DisableDragColMove() { EnableDragColMove( false ); } void DisableDragColMove() { EnableDragColMove( false ); }
bool CanDragColMove() const { return m_canDragColMove; } bool CanDragColMove() const { return m_canDragColMove; }
// interactive column hiding (enabled by default, works only for native header)
bool EnableHidingColumns( bool enable = true );
void DisableHidingColumns() { EnableHidingColumns(false); }
bool CanHideColumns() { return m_canHideColumns; }
// interactive resizing of grid cells (enabled by default) // interactive resizing of grid cells (enabled by default)
void EnableDragGridSize(bool enable = true); void EnableDragGridSize(bool enable = true);
void DisableDragGridSize() { EnableDragGridSize(false); } void DisableDragGridSize() { EnableDragGridSize(false); }
@@ -2172,6 +2177,7 @@ protected:
bool m_canDragRowSize; bool m_canDragRowSize;
bool m_canDragColSize; bool m_canDragColSize;
bool m_canDragColMove; bool m_canDragColMove;
bool m_canHideColumns;
bool m_canDragGridSize; bool m_canDragGridSize;
bool m_canDragCell; bool m_canDragCell;

View File

@@ -147,7 +147,7 @@ public:
wxID_ANY, wxID_ANY,
wxDefaultPosition, wxDefaultPosition,
wxDefaultSize, wxDefaultSize,
wxHD_ALLOW_HIDE | (owner->CanHideColumns() ? wxHD_ALLOW_HIDE : 0) |
(owner->CanDragColMove() ? wxHD_ALLOW_REORDER : 0)) (owner->CanDragColMove() ? wxHD_ALLOW_REORDER : 0))
{ {
} }

View File

@@ -3707,6 +3707,13 @@ public:
*/ */
bool CanDragRowSize(int row) const; bool CanDragRowSize(int row) const;
/**
Returns @true if columns can be hidden from the popup menu of the native header.
@since 3.1.3
*/
bool CanHideColumns() const;
/** /**
Disable interactive resizing of the specified column. Disable interactive resizing of the specified column.
@@ -3765,6 +3772,15 @@ public:
*/ */
void DisableDragRowSize(); void DisableDragRowSize();
/**
Disables column hiding from the header popup menu.
Equivalent to passing @false to EnableHidingColumns().
@since 3.1.3
*/
void DisableHidingColumns();
/** /**
Enables or disables cell dragging with the mouse. Enables or disables cell dragging with the mouse.
*/ */
@@ -3801,6 +3817,28 @@ public:
*/ */
void EnableDragRowSize(bool enable = true); void EnableDragRowSize(bool enable = true);
/**
Enables or disables column hiding from the header popup menu.
Note that currently the popup menu can only be shown when using
wxHeaderCtrl, i.e. if UseNativeColHeader() had been called.
If the native header is not used, this method always simply returns
@false without doing anything, as hiding columns is not supported
anyhow. If @a enable value is the same as CanHideColumns(), it also
returns @false to indicate that nothing was done. Otherwise, it returns
@true to indicate that the value of this option was successfully
changed.
The main use case for this method is to disallow hiding the columns
interactively when using the native header.
@since 3.1.3
@see DisableHidingColumns()
*/
bool EnableHidingColumns(bool enable = true);
/** /**
Returns the column ID of the specified column position. Returns the column ID of the specified column position.
*/ */

View File

@@ -154,6 +154,7 @@ wxBEGIN_EVENT_TABLE( GridFrame, wxFrame )
EVT_MENU( ID_TOGGLEROWSIZING, GridFrame::ToggleRowSizing ) EVT_MENU( ID_TOGGLEROWSIZING, GridFrame::ToggleRowSizing )
EVT_MENU( ID_TOGGLECOLSIZING, GridFrame::ToggleColSizing ) EVT_MENU( ID_TOGGLECOLSIZING, GridFrame::ToggleColSizing )
EVT_MENU( ID_TOGGLECOLMOVING, GridFrame::ToggleColMoving ) EVT_MENU( ID_TOGGLECOLMOVING, GridFrame::ToggleColMoving )
EVT_MENU( ID_TOGGLECOLHIDING, GridFrame::ToggleColHiding )
EVT_MENU( ID_TOGGLEGRIDSIZING, GridFrame::ToggleGridSizing ) EVT_MENU( ID_TOGGLEGRIDSIZING, GridFrame::ToggleGridSizing )
EVT_MENU( ID_TOGGLEGRIDDRAGCELL, GridFrame::ToggleGridDragCell ) EVT_MENU( ID_TOGGLEGRIDDRAGCELL, GridFrame::ToggleGridDragCell )
EVT_MENU( ID_COLNATIVEHEADER, GridFrame::SetNativeColHeader ) EVT_MENU( ID_COLNATIVEHEADER, GridFrame::SetNativeColHeader )
@@ -298,6 +299,7 @@ GridFrame::GridFrame()
viewMenu->AppendCheckItem(ID_TOGGLEROWSIZING, "Ro&w drag-resize"); viewMenu->AppendCheckItem(ID_TOGGLEROWSIZING, "Ro&w drag-resize");
viewMenu->AppendCheckItem(ID_TOGGLECOLSIZING, "C&ol drag-resize"); viewMenu->AppendCheckItem(ID_TOGGLECOLSIZING, "C&ol drag-resize");
viewMenu->AppendCheckItem(ID_TOGGLECOLMOVING, "Col drag-&move"); viewMenu->AppendCheckItem(ID_TOGGLECOLMOVING, "Col drag-&move");
viewMenu->AppendCheckItem(ID_TOGGLECOLHIDING, "Col hiding popup menu");
viewMenu->AppendCheckItem(ID_TOGGLEGRIDSIZING, "&Grid drag-resize"); viewMenu->AppendCheckItem(ID_TOGGLEGRIDSIZING, "&Grid drag-resize");
viewMenu->AppendCheckItem(ID_TOGGLEGRIDDRAGCELL, "&Grid drag-cell"); viewMenu->AppendCheckItem(ID_TOGGLEGRIDDRAGCELL, "&Grid drag-cell");
viewMenu->AppendCheckItem(ID_TOGGLEGRIDLINES, "&Grid Lines"); viewMenu->AppendCheckItem(ID_TOGGLEGRIDLINES, "&Grid Lines");
@@ -634,6 +636,7 @@ void GridFrame::SetDefaults()
GetMenuBar()->Check( ID_TOGGLEROWSIZING, true ); GetMenuBar()->Check( ID_TOGGLEROWSIZING, true );
GetMenuBar()->Check( ID_TOGGLECOLSIZING, true ); GetMenuBar()->Check( ID_TOGGLECOLSIZING, true );
GetMenuBar()->Check( ID_TOGGLECOLMOVING, false ); GetMenuBar()->Check( ID_TOGGLECOLMOVING, false );
GetMenuBar()->Check( ID_TOGGLECOLHIDING, true );
GetMenuBar()->Check( ID_TOGGLEGRIDSIZING, true ); GetMenuBar()->Check( ID_TOGGLEGRIDSIZING, true );
GetMenuBar()->Check( ID_TOGGLEGRIDDRAGCELL, false ); GetMenuBar()->Check( ID_TOGGLEGRIDDRAGCELL, false );
GetMenuBar()->Check( ID_TOGGLEGRIDLINES, true ); GetMenuBar()->Check( ID_TOGGLEGRIDLINES, true );
@@ -693,6 +696,15 @@ void GridFrame::ToggleColMoving( wxCommandEvent& WXUNUSED(ev) )
GetMenuBar()->IsChecked( ID_TOGGLECOLMOVING ) ); GetMenuBar()->IsChecked( ID_TOGGLECOLMOVING ) );
} }
void GridFrame::ToggleColHiding( wxCommandEvent& WXUNUSED(ev) )
{
if ( !grid->EnableHidingColumns(
GetMenuBar()->IsChecked( ID_TOGGLECOLHIDING ) ) )
{
GetMenuBar()->Check( ID_TOGGLECOLHIDING, grid->CanHideColumns() );
}
}
void GridFrame::ToggleGridSizing( wxCommandEvent& WXUNUSED(ev) ) void GridFrame::ToggleGridSizing( wxCommandEvent& WXUNUSED(ev) )
{ {
grid->EnableDragGridSize( grid->EnableDragGridSize(

View File

@@ -36,6 +36,7 @@ class GridFrame : public wxFrame
void ToggleRowSizing( wxCommandEvent& ); void ToggleRowSizing( wxCommandEvent& );
void ToggleColSizing( wxCommandEvent& ); void ToggleColSizing( wxCommandEvent& );
void ToggleColMoving( wxCommandEvent& ); void ToggleColMoving( wxCommandEvent& );
void ToggleColHiding( wxCommandEvent& );
void ToggleGridSizing( wxCommandEvent& ); void ToggleGridSizing( wxCommandEvent& );
void ToggleGridDragCell ( wxCommandEvent& ); void ToggleGridDragCell ( wxCommandEvent& );
void SetNativeColHeader ( wxCommandEvent& ); void SetNativeColHeader ( wxCommandEvent& );
@@ -140,6 +141,7 @@ public:
ID_TOGGLEROWSIZING, ID_TOGGLEROWSIZING,
ID_TOGGLECOLSIZING, ID_TOGGLECOLSIZING,
ID_TOGGLECOLMOVING, ID_TOGGLECOLMOVING,
ID_TOGGLECOLHIDING,
ID_TOGGLEGRIDSIZING, ID_TOGGLEGRIDSIZING,
ID_TOGGLEGRIDDRAGCELL, ID_TOGGLEGRIDDRAGCELL,
ID_TOGGLEGRIDLINES, ID_TOGGLEGRIDLINES,

View File

@@ -2607,6 +2607,7 @@ void wxGrid::Init()
m_gridFrozenBorderPenWidth = 2; m_gridFrozenBorderPenWidth = 2;
m_canDragColMove = false; m_canDragColMove = false;
m_canHideColumns = true;
m_cursorMode = WXGRID_CURSOR_SELECT_CELL; m_cursorMode = WXGRID_CURSOR_SELECT_CELL;
m_winCapture = NULL; m_winCapture = NULL;
@@ -4829,6 +4830,18 @@ bool wxGrid::EnableDragColMove( bool enable )
return true; return true;
} }
bool wxGrid::EnableHidingColumns(bool enable)
{
if ( m_canHideColumns == enable || !m_useNativeHeader )
return false;
GetGridColHeader()->ToggleWindowStyle(wxHD_ALLOW_HIDE);
m_canHideColumns = enable;
return true;
}
void wxGrid::InitializeFrozenWindows() void wxGrid::InitializeFrozenWindows()
{ {
// frozen row windows // frozen row windows