Add render-related options to dataview sample

To more easily expose problems add options to the dataview sample
related to rendering of items (applying mostly to the MyListModel page
only):

* Use left/centre/right alignment (Ctrl+1/2/3)
* Use top/centre/bottom alignment (Ctrl+4/5/6)
* Toggle tall row usage (Ctrl+7)
* Toggle keep on using small wx logo, regardless of row size (Ctrl+8)
* Toggle multi-line text usage (Ctrl+9)
This commit is contained in:
Dimitri Schoolwerth
2021-02-02 00:01:25 +01:00
parent 771ebfa9a9
commit d04dfd6f22
3 changed files with 155 additions and 12 deletions

View File

@@ -71,7 +71,8 @@ public:
void BuildDataViewCtrl(wxPanel* parent,
unsigned int nPanel,
unsigned long style = 0);
unsigned long style = 0,
int modelFlags = wxALIGN_CENTRE);
private:
// event handlers
@@ -167,6 +168,13 @@ private:
enum Lang { Lang_English, Lang_French };
void FillIndexList(Lang lang);
// Helper for checking ModelFlags of current panel (either currently
// building or selected one).
bool HasModelFlag(int flag) const
{
return (m_modelFlags[m_currentPanel] & flag) != 0;
}
// HasValue page.
void OnHasValueValueChanged(wxDataViewEvent& event);
@@ -186,7 +194,9 @@ private:
Page_Max
};
unsigned int m_currentPanel;
wxDataViewCtrl* m_ctrl[Page_Max];
int m_modelFlags[Page_Max];
// Some of the models associated with the controls:
@@ -406,6 +416,18 @@ enum
ID_HORIZ_RULES,
ID_VERT_RULES,
ID_ALIGN_LEFT,
ID_ALIGN_CENTRE_H,
ID_ALIGN_RIGHT,
ID_ALIGN_TOP,
ID_ALIGN_CENTRE_V,
ID_ALIGN_BOTTOM,
ID_TOGGLE_USE_TALL_ROWS,
ID_TOGGLE_KEEP_LOGO_SMALL,
ID_TOGGLE_USE_MULTI_LINE_TEXT,
ID_EXIT = wxID_EXIT,
// about menu
@@ -449,7 +471,8 @@ enum
};
wxBEGIN_EVENT_TABLE(MyFrame, wxFrame)
EVT_MENU_RANGE( ID_MULTIPLE, ID_VERT_RULES, MyFrame::OnStyleChange )
EVT_MENU_RANGE( ID_MULTIPLE, ID_TOGGLE_USE_MULTI_LINE_TEXT,
MyFrame::OnStyleChange )
EVT_MENU( ID_EXIT, MyFrame::OnQuit )
EVT_MENU( ID_ABOUT, MyFrame::OnAbout )
EVT_MENU( ID_CLEARLOG, MyFrame::OnClearLog )
@@ -552,6 +575,23 @@ MyFrame::MyFrame(wxFrame *frame, const wxString &title, int x, int y, int w, int
style_menu->AppendCheckItem(ID_HORIZ_RULES, "Display horizontal rules");
style_menu->AppendCheckItem(ID_VERT_RULES, "Display vertical rules");
wxMenu* align_menu = new wxMenu;
align_menu->AppendRadioItem(ID_ALIGN_LEFT, "Left\tCtrl-1");
align_menu->AppendRadioItem(ID_ALIGN_CENTRE_H, "Centre Horizontal\tCtrl-2");
align_menu->AppendRadioItem(ID_ALIGN_RIGHT, "Right\tCtrl-3");
align_menu->AppendSeparator();
align_menu->AppendRadioItem(ID_ALIGN_TOP, "Top\tCtrl-4");
align_menu->AppendRadioItem(ID_ALIGN_CENTRE_V, "Centre Vertical\tCtrl-5");
align_menu->AppendRadioItem(ID_ALIGN_BOTTOM, "Bottom\tCtrl-6");
wxMenu* size_menu = new wxMenu;
size_menu->AppendCheckItem(ID_TOGGLE_USE_TALL_ROWS,
"Use Tall Rows\tCtrl-7");
size_menu->AppendCheckItem(ID_TOGGLE_KEEP_LOGO_SMALL,
"Keep Logo Size Small\tCtrl-8");
size_menu->AppendCheckItem(ID_TOGGLE_USE_MULTI_LINE_TEXT,
"Use Multi-line Text\tCtrl-9");
wxMenu *file_menu = new wxMenu;
file_menu->Append(ID_CLEARLOG, "&Clear log\tCtrl-L");
file_menu->Append(ID_GET_PAGE_INFO, "Show current &page info");
@@ -563,6 +603,8 @@ MyFrame::MyFrame(wxFrame *frame, const wxString &title, int x, int y, int w, int
file_menu->AppendCheckItem(ID_CUSTOM_HEADER_HEIGHT, "Custom header &height");
#endif // wxHAS_GENERIC_DATAVIEWCTRL
file_menu->Append(ID_STYLE_MENU, "&Style", style_menu);
file_menu->Append(wxID_ANY, "&Alignment", align_menu);
file_menu->Append(wxID_ANY, "Si&ze", size_menu);
file_menu->Append(ID_INC_INDENT, "&Increase indent\tCtrl-I");
file_menu->Append(ID_DEC_INDENT, "&Decrease indent\tShift-Ctrl-I");
file_menu->AppendSeparator();
@@ -749,10 +791,14 @@ MyFrame::~MyFrame()
delete wxLog::SetActiveTarget(m_logOld);
}
void MyFrame::BuildDataViewCtrl(wxPanel* parent, unsigned int nPanel, unsigned long style)
void MyFrame::BuildDataViewCtrl(wxPanel* parent, unsigned int nPanel,
unsigned long style, int modelFlags)
{
wxASSERT(!m_ctrl[nPanel]); // should only be initialized once
m_currentPanel = nPanel;
m_modelFlags[nPanel] = modelFlags;
switch (nPanel)
{
case Page_Music:
@@ -844,7 +890,7 @@ void MyFrame::BuildDataViewCtrl(wxPanel* parent, unsigned int nPanel, unsigned l
m_ctrl[Page_List] = new wxDataViewCtrl( parent, ID_ATTR_CTRL, wxDefaultPosition,
wxDefaultSize, style );
m_list_model = new MyListModel;
m_list_model = new MyListModel(modelFlags);
m_ctrl[Page_List]->AssociateModel( m_list_model.get() );
wxDataViewColumn* const colCheckIconText = new wxDataViewColumn
@@ -855,13 +901,17 @@ void MyFrame::BuildDataViewCtrl(wxPanel* parent, unsigned int nPanel, unsigned l
wxCOL_WIDTH_AUTOSIZE
);
m_ctrl[Page_List]->AppendColumn(colCheckIconText);
const int alignment = modelFlags & wxALIGN_MASK;
colCheckIconText->GetRenderer()->SetAlignment(alignment);
m_ctrl[Page_List]->AppendTextColumn("editable string",
wxDataViewColumn* const colEditable =
m_ctrl[Page_List]->AppendTextColumn("editable string",
MyListModel::Col_EditableText,
wxDATAVIEW_CELL_EDITABLE,
wxCOL_WIDTH_AUTOSIZE,
wxALIGN_NOT,
wxDATAVIEW_COL_SORTABLE);
colEditable->GetRenderer()->SetAlignment(alignment);
m_ctrl[Page_List]->AppendDateColumn("date",
MyListModel::Col_Date);
@@ -936,7 +986,11 @@ void MyFrame::BuildDataViewCtrl(wxPanel* parent, unsigned int nPanel, unsigned l
wxDefaultSize, style | wxDV_NO_HEADER );
m_ctrl[Page_TreeStore] = tc;
wxImageList *ilist = new wxImageList( 16, 16 );
const bool useDefaultSize = !HasModelFlag(MODEL_USE_TALL_ROWS)
|| HasModelFlag(MODEL_KEEP_LOGO_SMALL);
const int imageSize = useDefaultSize ? 16 : 32;
wxImageList *ilist = new wxImageList( imageSize, imageSize );
ilist->Add( wxIcon(wx_small_xpm) );
tc->AssignImageList( ilist );
@@ -1045,6 +1099,8 @@ void MyFrame::BuildDataViewCtrl(wxPanel* parent, unsigned int nPanel, unsigned l
break;
}
if ( HasModelFlag(MODEL_USE_TALL_ROWS) )
m_ctrl[nPanel]->SetRowHeight(32);
}
@@ -1158,6 +1214,7 @@ void MyFrame::OnDecIndent(wxCommandEvent& WXUNUSED(event))
void MyFrame::OnPageChanged( wxBookCtrlEvent& WXUNUSED(event) )
{
unsigned int nPanel = m_notebook->GetSelection();
m_currentPanel = nPanel;
GetMenuBar()->FindItem(ID_STYLE_MENU)->SetItemLabel(
wxString::Format("Style of panel #%d", nPanel+1));
@@ -1189,6 +1246,49 @@ void MyFrame::OnPageChanged( wxBookCtrlEvent& WXUNUSED(event) )
GetMenuBar()->FindItem(id)->Check( m_ctrl[nPanel]->HasFlag(style) );
}
const int modelFlags = m_modelFlags[nPanel];
for (unsigned int id = ID_ALIGN_LEFT; id <= ID_ALIGN_BOTTOM; ++id)
{
int align = wxALIGN_NOT;
bool check = false;
switch (id)
{
case ID_ALIGN_LEFT:
check = !(modelFlags & (wxALIGN_CENTRE_HORIZONTAL | wxALIGN_RIGHT));
break;
case ID_ALIGN_CENTRE_H:
align = wxALIGN_CENTRE_HORIZONTAL;
break;
case ID_ALIGN_RIGHT:
align = wxALIGN_RIGHT;
break;
case ID_ALIGN_TOP:
check = !(modelFlags & (wxALIGN_CENTRE_VERTICAL | wxALIGN_BOTTOM));
break;
case ID_ALIGN_CENTRE_V:
align = wxALIGN_CENTRE_VERTICAL;
break;
case ID_ALIGN_BOTTOM:
align = wxALIGN_BOTTOM;
break;
default:
wxFAIL;
}
if ( align != wxALIGN_NOT )
check = (modelFlags & align) != 0;
GetMenuBar()->FindItem(id)->Check(check);
}
GetMenuBar()->FindItem(ID_TOGGLE_USE_TALL_ROWS)->Check(
HasModelFlag(MODEL_USE_TALL_ROWS));
GetMenuBar()->FindItem(ID_TOGGLE_KEEP_LOGO_SMALL)->Check(
HasModelFlag(MODEL_KEEP_LOGO_SMALL));
GetMenuBar()->FindItem(ID_TOGGLE_USE_MULTI_LINE_TEXT)->Check(
HasModelFlag(MODEL_USE_MULTI_LINE_TEXT));
GetMenuBar()->FindItem(ID_DISABLE)->Check(!m_ctrl[nPanel]->IsEnabled());
}
@@ -1223,8 +1323,26 @@ void MyFrame::OnStyleChange( wxCommandEvent& WXUNUSED(event) )
else if (nPanel == 4)
m_long_music_model.reset(NULL);
int flags = 0;
if ( GetMenuBar()->FindItem(ID_ALIGN_CENTRE_H)->IsChecked() )
flags |= wxALIGN_CENTRE_HORIZONTAL;
if ( GetMenuBar()->FindItem(ID_ALIGN_RIGHT)->IsChecked() )
flags |= wxALIGN_RIGHT;
if ( GetMenuBar()->FindItem(ID_ALIGN_CENTRE_V)->IsChecked() )
flags |= wxALIGN_CENTRE_VERTICAL;
if ( GetMenuBar()->FindItem(ID_ALIGN_BOTTOM)->IsChecked() )
flags |= wxALIGN_BOTTOM;
if ( GetMenuBar()->FindItem(ID_TOGGLE_USE_TALL_ROWS)->IsChecked() )
flags |= MODEL_USE_TALL_ROWS;
if ( GetMenuBar()->FindItem(ID_TOGGLE_KEEP_LOGO_SMALL)->IsChecked() )
flags |= MODEL_KEEP_LOGO_SMALL;
if ( GetMenuBar()->FindItem(ID_TOGGLE_USE_MULTI_LINE_TEXT)->IsChecked() )
flags |= MODEL_USE_MULTI_LINE_TEXT;
// rebuild the DVC for the selected panel:
BuildDataViewCtrl((wxPanel*)m_notebook->GetPage(nPanel), nPanel, style);
BuildDataViewCtrl((wxPanel*)m_notebook->GetPage(nPanel),
nPanel, style, flags);
sz->Prepend(m_ctrl[nPanel], 1, wxGROW|wxALL, 5);
sz->Layout();

View File

@@ -339,9 +339,12 @@ static int my_sort( int *v1, int *v2 )
#define INITIAL_NUMBER_OF_ITEMS 10000
MyListModel::MyListModel() :
MyListModel::MyListModel(int modelFlags) :
wxDataViewVirtualListModel( INITIAL_NUMBER_OF_ITEMS )
{
const wxString multiLineText = L"top (\u1ED6)\ncentre\nbottom (g)";
const bool useMultiLine = (modelFlags & MODEL_USE_MULTI_LINE_TEXT) != 0;
// the first 100 items are really stored in this model;
// all the others are synthesized on request
static const unsigned NUMBER_REAL_ITEMS = 100;
@@ -349,17 +352,32 @@ MyListModel::MyListModel() :
m_toggleColValues.reserve(NUMBER_REAL_ITEMS);
m_textColValues.reserve(NUMBER_REAL_ITEMS);
m_toggleColValues.push_back(false);
m_textColValues.push_back("first row with long label to test ellipsization");
m_textColValues.push_back(useMultiLine
? multiLineText
: wxString("first row with long label to test ellipsization"));
for (unsigned int i = 1; i < NUMBER_REAL_ITEMS; i++)
{
m_toggleColValues.push_back(false);
m_textColValues.push_back(wxString::Format("real row %d", i));
}
m_iconColValues.assign(NUMBER_REAL_ITEMS, "test");
m_iconColValues.assign(NUMBER_REAL_ITEMS,
useMultiLine ? multiLineText : wxString("test"));
m_icon[0] = wxIcon( null_xpm );
m_icon[1] = wxIcon( wx_small_xpm );
const int newSize = m_icon[0].GetWidth() * 2;
const bool useTallRows = (modelFlags & MODEL_USE_TALL_ROWS) != 0;
if ( useTallRows )
m_icon[0].CopyFromBitmap(
wxImage(null_xpm).Rescale(newSize, newSize));
if ( !useTallRows || (modelFlags & MODEL_KEEP_LOGO_SMALL) )
m_icon[1] = wxIcon( wx_small_xpm );
else
m_icon[1].CopyFromBitmap(
wxImage(wx_small_xpm).Rescale(newSize, newSize));
}
void MyListModel::Prepend( const wxString &text )

View File

@@ -216,7 +216,7 @@ public:
Col_Max
};
MyListModel();
MyListModel(int modelFlags);
// helper methods to change the model
@@ -310,3 +310,10 @@ private:
wxDECLARE_NO_COPY_CLASS(MyIndexListModel);
};
enum ModelFlags
{
MODEL_USE_TALL_ROWS = 1 << 0,
MODEL_KEEP_LOGO_SMALL = 1 << 1,
MODEL_USE_MULTI_LINE_TEXT = 1 << 2
};