diff --git a/samples/dataview/dataview.cpp b/samples/dataview/dataview.cpp index 742002aab2..eb847cb6e0 100644 --- a/samples/dataview/dataview.cpp +++ b/samples/dataview/dataview.cpp @@ -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(); diff --git a/samples/dataview/mymodels.cpp b/samples/dataview/mymodels.cpp index 2a312d8a12..418de7d886 100644 --- a/samples/dataview/mymodels.cpp +++ b/samples/dataview/mymodels.cpp @@ -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 ) diff --git a/samples/dataview/mymodels.h b/samples/dataview/mymodels.h index d2a1963448..a81c82e28c 100644 --- a/samples/dataview/mymodels.h +++ b/samples/dataview/mymodels.h @@ -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 +};