From e6bf7f5ec54cd322147e4e654d5f6fe97cb975ed Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Thu, 11 Nov 2021 22:05:59 +0000 Subject: [PATCH 1/7] Remove unnecessary HasImageList() checks in wxDataViewTreeCtrl These checks don't seem to make any sense at all, even though they were there ever since this classes was added in a75124d0da (Added wxDataViewTreeCtrl, 2007-12-01), and, in fact, were clearly harmful until they were fixed in e6a2aa5ae3 (Show correct icon for branch nodes in wxDataViewTreeCtrl, 2018-09-12). But it seems that even this wasn't the right thing to do, as there doesn't seem to be any reason to not call ItemChanged() even for the controls not using images, so just remove them completely. --- src/common/datavcmn.cpp | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/common/datavcmn.cpp b/src/common/datavcmn.cpp index d7fb08aea4..9c0ec6aef6 100644 --- a/src/common/datavcmn.cpp +++ b/src/common/datavcmn.cpp @@ -3180,8 +3180,6 @@ void wxDataViewTreeCtrl::DeleteAllItems() void wxDataViewTreeCtrl::OnExpanded( wxDataViewEvent &event ) { - if (!HasImageList()) return; - wxDataViewTreeStoreContainerNode* container = GetStore()->FindContainerNode( event.GetItem() ); if (!container) return; @@ -3192,8 +3190,6 @@ void wxDataViewTreeCtrl::OnExpanded( wxDataViewEvent &event ) void wxDataViewTreeCtrl::OnCollapsed( wxDataViewEvent &event ) { - if (!HasImageList()) return; - wxDataViewTreeStoreContainerNode* container = GetStore()->FindContainerNode( event.GetItem() ); if (!container) return; From 2c18e772c2132c68b7522829b684c0576fda0c5d Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Thu, 20 Jan 2022 03:24:51 +0000 Subject: [PATCH 2/7] Fix wxDataViewCheckIconTextRenderer icon size under Mac too The change of dcdcbbe078 (Fix wxDataViewCheckIconTextRenderer icon size with GTK3, 2020-09-17) should really apply to all platforms, especially those with DPI-independent pixels (a.k.a. really logical pixels), such as Mac, to have the correct icon sizes in high DPI. --- src/common/datavcmn.cpp | 8 -------- 1 file changed, 8 deletions(-) diff --git a/src/common/datavcmn.cpp b/src/common/datavcmn.cpp index 9c0ec6aef6..6ffd745dda 100644 --- a/src/common/datavcmn.cpp +++ b/src/common/datavcmn.cpp @@ -2184,11 +2184,7 @@ wxSize wxDataViewCheckIconTextRenderer::GetSize() const if ( m_value.GetIcon().IsOk() ) { -#ifdef __WXGTK3__ const wxSize sizeIcon = m_value.GetIcon().GetLogicalSize(); -#else - const wxSize sizeIcon = m_value.GetIcon().GetSize(); -#endif if ( sizeIcon.y > size.y ) size.y = sizeIcon.y; @@ -2225,11 +2221,7 @@ bool wxDataViewCheckIconTextRenderer::Render(wxRect cell, wxDC* dc, int state) const bool drawIcon = icon.IsOk(); if ( drawIcon ) { -#ifdef __WXGTK3__ const wxSize sizeIcon = icon.GetLogicalSize(); -#else - const wxSize sizeIcon = icon.GetSize(); -#endif rectIcon = wxRect(cell.GetPosition(), sizeIcon); rectIcon.x += xoffset; rectIcon = rectIcon.CentreIn(cell, wxVERTICAL); From 1a1c02804b49f16052dfdefbbee5be080a207bf5 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Sat, 22 Jan 2022 17:08:11 +0000 Subject: [PATCH 3/7] Add more FromDIP() calls to generic wxDataViewCtrl renderers Some of them had been already updated to return the values scaled appropriately for the current DPI in 56fab0aabb (Improve wxDataView on DPI change, 2019-01-10), but not all, so add the missing calls to wxDataView{Progress,IconText}Renderer too. --- src/generic/datavgen.cpp | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/generic/datavgen.cpp b/src/generic/datavgen.cpp index abed9c48d1..fcad65c5de 100644 --- a/src/generic/datavgen.cpp +++ b/src/generic/datavgen.cpp @@ -1514,7 +1514,7 @@ wxSize wxDataViewProgressRenderer::GetSize() const // renderers, it doesn't have a "good" width for the content. This makes it // grow to the whole column, which is pretty much always the desired // behaviour. Keep the height fixed so that the progress bar isn't too fat. - return wxSize(-1, 12); + return GetView()->FromDIP(wxSize(-1, 12)); } // --------------------------------------------------------- @@ -1557,7 +1557,7 @@ bool wxDataViewIconTextRenderer::Render(wxRect rect, wxDC *dc, int state) if ( icon.IsOk() ) { dc->DrawIcon(icon, rect.x, rect.y + (rect.height - icon.GetHeight())/2); - xoffset = icon.GetWidth()+4; + xoffset = icon.GetWidth() + GetView()->FromDIP(4); } RenderText(m_value.GetText(), xoffset, rect, dc, state); @@ -1567,15 +1567,17 @@ bool wxDataViewIconTextRenderer::Render(wxRect rect, wxDC *dc, int state) wxSize wxDataViewIconTextRenderer::GetSize() const { + wxWindow* const dvc = GetView(); + if (!m_value.GetText().empty()) { wxSize size = GetTextExtent(m_value.GetText()); if (m_value.GetIcon().IsOk()) - size.x += m_value.GetIcon().GetWidth() + 4; + size.x += m_value.GetIcon().GetWidth() + dvc->FromDIP(4); return size; } - return wxSize(80,20); + return dvc->FromDIP(wxSize(80,20)); } wxWindow* wxDataViewIconTextRenderer::CreateEditorCtrl(wxWindow *parent, wxRect labelRect, const wxVariant& value) @@ -1588,7 +1590,9 @@ wxWindow* wxDataViewIconTextRenderer::CreateEditorCtrl(wxWindow *parent, wxRect // adjust the label rect to take the width of the icon into account if (iconText.GetIcon().IsOk()) { - int w = iconText.GetIcon().GetWidth() + 4; + wxWindow* const dvc = GetView(); + + int w = iconText.GetIcon().GetWidth() + dvc->FromDIP(4); labelRect.x += w; labelRect.width -= w; } From 906808b8e5e2ec467b9b39d83827b51eaacb0d7c Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Sat, 22 Jan 2022 17:14:48 +0000 Subject: [PATCH 4/7] Fix wxDataViewCtrl default row height in high DPI Use FromDIP() to ensure that it is not too small when using DPI scaling. Also make the code slightly more clear by using a meaningful variable name instead of a (duplicated) comment. --- src/generic/datavgen.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/generic/datavgen.cpp b/src/generic/datavgen.cpp index fcad65c5de..bfb70d2a55 100644 --- a/src/generic/datavgen.cpp +++ b/src/generic/datavgen.cpp @@ -2117,14 +2117,16 @@ wxDataViewMainWindow::~wxDataViewMainWindow() int wxDataViewMainWindow::GetDefaultRowHeight() const { + const int SMALL_ICON_HEIGHT = FromDIP(16); + #ifdef __WXMSW__ // We would like to use the same line height that Explorer uses. This is // different from standard ListView control since Vista. if ( wxGetWinVersion() >= wxWinVersion_Vista ) - return wxMax(16, GetCharHeight()) + 6; // 16 = mini icon height + return wxMax(SMALL_ICON_HEIGHT, GetCharHeight()) + FromDIP(6); else #endif // __WXMSW__ - return wxMax(16, GetCharHeight()) + 1; // 16 = mini icon height + return wxMax(SMALL_ICON_HEIGHT, GetCharHeight()) + FromDIP(1); } From e6addf11281aeb9e342debdcff6f5e75d8828d59 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Sat, 22 Jan 2022 17:16:24 +0000 Subject: [PATCH 5/7] Take DPI scaling into account for wxDataViewCtrl scroll rate Use FromDIP() to make scrolling work visually the same in high DPI as in normal one. --- src/generic/datavgen.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/generic/datavgen.cpp b/src/generic/datavgen.cpp index bfb70d2a55..2c1c894eea 100644 --- a/src/generic/datavgen.cpp +++ b/src/generic/datavgen.cpp @@ -3387,7 +3387,7 @@ void wxDataViewMainWindow::RecalculateDisplay() int height = GetLineStart( GetRowCount() ); SetVirtualSize( width, height ); - GetOwner()->SetScrollRate( 10, m_lineHeight ); + GetOwner()->SetScrollRate( FromDIP(10), m_lineHeight ); UpdateColumnSizes(); Refresh(); From 90bbde87773337ba471fa584df3aee72e43364ee Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Sat, 22 Jan 2022 23:37:09 +0000 Subject: [PATCH 6/7] Fix "tall row" height in the dataview sample in high DPI Add missing FromDIP() to ensure that the rows are really tall. --- samples/dataview/dataview.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/dataview/dataview.cpp b/samples/dataview/dataview.cpp index 3e66aa0155..3ebbccc6f1 100644 --- a/samples/dataview/dataview.cpp +++ b/samples/dataview/dataview.cpp @@ -1106,7 +1106,7 @@ void MyFrame::BuildDataViewCtrl(wxPanel* parent, unsigned int nPanel, } if ( HasModelFlag(MODEL_USE_TALL_ROWS) ) - m_ctrl[nPanel]->SetRowHeight(32); + m_ctrl[nPanel]->SetRowHeight(FromDIP(32)); } From 4073f3b9bf885d347bf10b8174e854be3f66c7ab Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Sun, 23 Jan 2022 00:52:45 +0000 Subject: [PATCH 7/7] Use wxBitmapBundle in wxDataViewCtrl-related classes Extend the existing use of wxIcon in wxDataViewIconText, wxDataViewCheckIconText, the corresponding renderers and wxDataViewTreeCtrl to wxBitmapBundle. As with the other classes, the existing setters have been preserved as they remain almost entirely compatible with the existing code and the return type of the existing getters was preserved, with new getters being introduced for returning wxBitmapBundle only where they're really required. Update the sample to use wxBitmapBundle with its wxDataViewTreeCtrl. --- include/wx/dataview.h | 69 ++++++++++++++++++++++++----------- include/wx/dvrenderers.h | 19 ++++++---- interface/wx/dataview.h | 63 ++++++++++++++++++++++---------- samples/dataview/dataview.cpp | 14 +++---- samples/dataview/mymodels.cpp | 25 ++----------- samples/dataview/mymodels.h | 11 +++++- samples/dataview/null.xpm | 30 --------------- samples/dataview/wx_small.xpm | 28 -------------- src/common/datavcmn.cpp | 68 +++++++++++++++++++--------------- src/generic/datavgen.cpp | 20 ++++++---- 10 files changed, 173 insertions(+), 174 deletions(-) delete mode 100644 samples/dataview/null.xpm delete mode 100644 samples/dataview/wx_small.xpm diff --git a/include/wx/dataview.h b/include/wx/dataview.h index c3676c0a88..6016d8b8c4 100644 --- a/include/wx/dataview.h +++ b/include/wx/dataview.h @@ -1235,17 +1235,21 @@ class WXDLLIMPEXP_CORE wxDataViewTreeStoreNode { public: wxDataViewTreeStoreNode( wxDataViewTreeStoreNode *parent, - const wxString &text, const wxIcon &icon = wxNullIcon, wxClientData *data = NULL ); + const wxString &text, + const wxBitmapBundle &icon = wxBitmapBundle(), + wxClientData *data = NULL ); virtual ~wxDataViewTreeStoreNode(); void SetText( const wxString &text ) { m_text = text; } wxString GetText() const { return m_text; } - void SetIcon( const wxIcon &icon ) + void SetIcon( const wxBitmapBundle &icon ) { m_icon = icon; } - const wxIcon &GetIcon() const + const wxBitmapBundle& GetBitmapBundle() const { return m_icon; } + wxIcon GetIcon() const + { return m_icon.GetIcon(wxDefaultSize); } void SetData( wxClientData *data ) { delete m_data; m_data = data; } wxClientData *GetData() const @@ -1263,7 +1267,7 @@ public: private: wxDataViewTreeStoreNode *m_parent; wxString m_text; - wxIcon m_icon; + wxBitmapBundle m_icon; wxClientData *m_data; }; @@ -1273,7 +1277,9 @@ class WXDLLIMPEXP_CORE wxDataViewTreeStoreContainerNode: public wxDataViewTreeSt { public: wxDataViewTreeStoreContainerNode( wxDataViewTreeStoreNode *parent, - const wxString &text, const wxIcon &icon = wxNullIcon, const wxIcon &expanded = wxNullIcon, + const wxString &text, + const wxBitmapBundle &icon = wxBitmapBundle(), + const wxBitmapBundle &expanded = wxBitmapBundle(), wxClientData *data = NULL ); virtual ~wxDataViewTreeStoreContainerNode(); @@ -1284,10 +1290,12 @@ public: wxDataViewTreeStoreNodes::iterator FindChild(wxDataViewTreeStoreNode* node); - void SetExpandedIcon( const wxIcon &icon ) + void SetExpandedIcon( const wxBitmapBundle &icon ) { m_iconExpanded = icon; } - const wxIcon &GetExpandedIcon() const + const wxBitmapBundle& GetExpandedBitmapBundle() const { return m_iconExpanded; } + wxIcon GetExpandedIcon() const + { return m_iconExpanded.GetIcon(wxDefaultSize); } void SetExpanded( bool expanded = true ) { m_isExpanded = expanded; } @@ -1301,7 +1309,7 @@ public: private: wxDataViewTreeStoreNodes m_children; - wxIcon m_iconExpanded; + wxBitmapBundle m_iconExpanded; bool m_isExpanded; }; @@ -1314,20 +1322,32 @@ public: ~wxDataViewTreeStore(); wxDataViewItem AppendItem( const wxDataViewItem& parent, - const wxString &text, const wxIcon &icon = wxNullIcon, wxClientData *data = NULL ); + const wxString &text, + const wxBitmapBundle &icon = wxBitmapBundle(), + wxClientData *data = NULL ); wxDataViewItem PrependItem( const wxDataViewItem& parent, - const wxString &text, const wxIcon &icon = wxNullIcon, wxClientData *data = NULL ); + const wxString &text, + const wxBitmapBundle &icon = wxBitmapBundle(), + wxClientData *data = NULL ); wxDataViewItem InsertItem( const wxDataViewItem& parent, const wxDataViewItem& previous, - const wxString &text, const wxIcon &icon = wxNullIcon, wxClientData *data = NULL ); + const wxString &text, + const wxBitmapBundle &icon = wxBitmapBundle(), + wxClientData *data = NULL ); wxDataViewItem PrependContainer( const wxDataViewItem& parent, - const wxString &text, const wxIcon &icon = wxNullIcon, const wxIcon &expanded = wxNullIcon, + const wxString &text, + const wxBitmapBundle &icon = wxBitmapBundle(), + const wxBitmapBundle &expanded = wxBitmapBundle(), wxClientData *data = NULL ); wxDataViewItem AppendContainer( const wxDataViewItem& parent, - const wxString &text, const wxIcon &icon = wxNullIcon, const wxIcon &expanded = wxNullIcon, + const wxString &text, + const wxBitmapBundle &icon = wxBitmapBundle(), + const wxBitmapBundle &expanded = wxBitmapBundle(), wxClientData *data = NULL ); wxDataViewItem InsertContainer( const wxDataViewItem& parent, const wxDataViewItem& previous, - const wxString &text, const wxIcon &icon = wxNullIcon, const wxIcon &expanded = wxNullIcon, + const wxString &text, + const wxBitmapBundle &icon = wxBitmapBundle(), + const wxBitmapBundle &expanded = wxBitmapBundle(), wxClientData *data = NULL ); wxDataViewItem GetNthChild( const wxDataViewItem& parent, unsigned int pos ) const; @@ -1335,10 +1355,12 @@ public: void SetItemText( const wxDataViewItem& item, const wxString &text ); wxString GetItemText( const wxDataViewItem& item ) const; - void SetItemIcon( const wxDataViewItem& item, const wxIcon &icon ); - const wxIcon &GetItemIcon( const wxDataViewItem& item ) const; - void SetItemExpandedIcon( const wxDataViewItem& item, const wxIcon &icon ); - const wxIcon &GetItemExpandedIcon( const wxDataViewItem& item ) const; + void SetItemIcon( const wxDataViewItem& item, const wxBitmapBundle &icon ); + wxBitmapBundle GetItemBitmapBundle( const wxDataViewItem& item ) const; + wxIcon GetItemIcon( const wxDataViewItem& item ) const; + void SetItemExpandedIcon( const wxDataViewItem& item, const wxBitmapBundle &icon ); + wxBitmapBundle GetItemExpandedBitmapBundle( const wxDataViewItem& item ) const; + wxIcon GetItemExpandedIcon( const wxDataViewItem& item ) const; void SetItemData( const wxDataViewItem& item, wxClientData *data ); wxClientData *GetItemData( const wxDataViewItem& item ) const; @@ -1433,11 +1455,11 @@ public: void SetItemText( const wxDataViewItem& item, const wxString &text ); wxString GetItemText( const wxDataViewItem& item ) const { return GetStore()->GetItemText(item); } - void SetItemIcon( const wxDataViewItem& item, const wxIcon &icon ); - const wxIcon &GetItemIcon( const wxDataViewItem& item ) const + void SetItemIcon( const wxDataViewItem& item, const wxBitmapBundle &icon ); + wxIcon GetItemIcon( const wxDataViewItem& item ) const { return GetStore()->GetItemIcon(item); } - void SetItemExpandedIcon( const wxDataViewItem& item, const wxIcon &icon ); - const wxIcon &GetItemExpandedIcon( const wxDataViewItem& item ) const + void SetItemExpandedIcon( const wxDataViewItem& item, const wxBitmapBundle &icon ); + wxIcon GetItemExpandedIcon( const wxDataViewItem& item ) const { return GetStore()->GetItemExpandedIcon(item); } void SetItemData( const wxDataViewItem& item, wxClientData *data ) { GetStore()->SetItemData(item,data); } @@ -1452,6 +1474,9 @@ public: void OnCollapsed( wxDataViewEvent &event ); void OnSize( wxSizeEvent &event ); +protected: + virtual void OnImagesChanged() wxOVERRIDE; + private: wxDECLARE_EVENT_TABLE(); wxDECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxDataViewTreeCtrl); diff --git a/include/wx/dvrenderers.h b/include/wx/dvrenderers.h index 3b6857e971..4de42f3b14 100644 --- a/include/wx/dvrenderers.h +++ b/include/wx/dvrenderers.h @@ -37,19 +37,24 @@ class WXDLLIMPEXP_CORE wxDataViewIconText : public wxObject { public: wxDataViewIconText( const wxString &text = wxEmptyString, - const wxIcon& icon = wxNullIcon ) + const wxBitmapBundle& bitmap = wxBitmapBundle() ) : m_text(text), - m_icon(icon) + m_bitmap(bitmap) { } void SetText( const wxString &text ) { m_text = text; } wxString GetText() const { return m_text; } - void SetIcon( const wxIcon &icon ) { m_icon = icon; } - const wxIcon &GetIcon() const { return m_icon; } + + void SetBitmapBundle(const wxBitmapBundle& bitmap) { m_bitmap = bitmap; } + const wxBitmapBundle& GetBitmapBundle() const { return m_bitmap; } + + // These methods exist for compatibility, prefer using the methods above. + void SetIcon( const wxIcon &icon ) { m_bitmap = wxBitmapBundle(icon); } + wxIcon GetIcon() const { return m_bitmap.GetIcon(wxDefaultSize); } bool IsSameAs(const wxDataViewIconText& other) const { - return m_text == other.m_text && m_icon.IsSameAs(other.m_icon); + return m_text == other.m_text && m_bitmap.IsSameAs(other.m_bitmap); } bool operator==(const wxDataViewIconText& other) const @@ -64,7 +69,7 @@ public: private: wxString m_text; - wxIcon m_icon; + wxBitmapBundle m_bitmap; wxDECLARE_DYNAMIC_CLASS(wxDataViewIconText); }; @@ -79,7 +84,7 @@ class WXDLLIMPEXP_CORE wxDataViewCheckIconText : public wxDataViewIconText { public: wxDataViewCheckIconText(const wxString& text = wxString(), - const wxIcon& icon = wxNullIcon, + const wxBitmapBundle& icon = wxBitmapBundle(), wxCheckBoxState checkedState = wxCHK_UNDETERMINED) : wxDataViewIconText(text, icon), m_checkedState(checkedState) diff --git a/interface/wx/dataview.h b/interface/wx/dataview.h index 38ae713493..fa26279b2c 100644 --- a/interface/wx/dataview.h +++ b/interface/wx/dataview.h @@ -3294,12 +3294,12 @@ public: /** Calls the identical method from wxDataViewTreeStore. */ - const wxIcon& GetItemExpandedIcon(const wxDataViewItem& item) const; + wxIcon GetItemExpandedIcon(const wxDataViewItem& item) const; /** Calls the identical method from wxDataViewTreeStore. */ - const wxIcon& GetItemIcon(const wxDataViewItem& item) const; + wxIcon GetItemIcon(const wxDataViewItem& item) const; /** Returns the item's parent. @@ -3386,12 +3386,12 @@ public: Calls the identical method from wxDataViewTreeStore. */ void SetItemExpandedIcon(const wxDataViewItem& item, - const wxIcon& icon); + const wxBitmapBundle& icon); /** Calls the identical method from wxDataViewTreeStore. */ - void SetItemIcon(const wxDataViewItem& item, const wxIcon& icon); + void SetItemIcon(const wxDataViewItem& item, const wxBitmapBundle& icon); /** Calls the identical method from wxDataViewTreeStore. @@ -3589,8 +3589,8 @@ public: */ wxDataViewItem AppendContainer(const wxDataViewItem& parent, const wxString& text, - const wxIcon& icon = wxNullIcon, - const wxIcon& expanded = wxNullIcon, + const wxBitmapBundle& icon = wxBitmapBundle(), + const wxBitmapBundle& expanded = wxBitmapBundle(), wxClientData* data = NULL); /** @@ -3598,7 +3598,7 @@ public: */ wxDataViewItem AppendItem(const wxDataViewItem& parent, const wxString& text, - const wxIcon& icon = wxNullIcon, + const wxBitmapBundle& icon = wxBitmapBundle(), wxClientData* data = NULL); /** @@ -3629,12 +3629,12 @@ public: /** Returns the icon to display in expanded containers. */ - const wxIcon& GetItemExpandedIcon(const wxDataViewItem& item) const; + wxIcon GetItemExpandedIcon(const wxDataViewItem& item) const; /** Returns the icon of the item. */ - const wxIcon& GetItemIcon(const wxDataViewItem& item) const; + wxIcon GetItemIcon(const wxDataViewItem& item) const; /** Returns the text of the item. @@ -3653,8 +3653,8 @@ public: wxDataViewItem InsertContainer(const wxDataViewItem& parent, const wxDataViewItem& previous, const wxString& text, - const wxIcon& icon = wxNullIcon, - const wxIcon& expanded = wxNullIcon, + const wxBitmapBundle& icon = wxBitmapBundle(), + const wxBitmapBundle& expanded = wxBitmapBundle(), wxClientData* data = NULL); /** @@ -3663,7 +3663,7 @@ public: wxDataViewItem InsertItem(const wxDataViewItem& parent, const wxDataViewItem& previous, const wxString& text, - const wxIcon& icon = wxNullIcon, + const wxBitmapBundle& icon = wxBitmapBundle(), wxClientData* data = NULL); /** @@ -3671,8 +3671,8 @@ public: */ wxDataViewItem PrependContainer(const wxDataViewItem& parent, const wxString& text, - const wxIcon& icon = wxNullIcon, - const wxIcon& expanded = wxNullIcon, + const wxBitmapBundle& icon = wxBitmapBundle(), + const wxBitmapBundle& expanded = wxBitmapBundle(), wxClientData* data = NULL); /** @@ -3680,7 +3680,7 @@ public: */ wxDataViewItem PrependItem(const wxDataViewItem& parent, const wxString& text, - const wxIcon& icon = wxNullIcon, + const wxBitmapBundle& icon = wxBitmapBundle(), wxClientData* data = NULL); /** @@ -3692,12 +3692,12 @@ public: Sets the expanded icon for the item. */ void SetItemExpandedIcon(const wxDataViewItem& item, - const wxIcon& icon); + const wxBitmapBundle& icon); /** Sets the icon for the item. */ - void SetItemIcon(const wxDataViewItem& item, const wxIcon& icon); + void SetItemIcon(const wxDataViewItem& item, const wxBitmapBundle& icon); }; @@ -3718,22 +3718,47 @@ public: Constructor. */ wxDataViewIconText(const wxString& text = wxEmptyString, - const wxIcon& icon = wxNullIcon); + const wxBitmapBundle& bitmap = wxBitmapBundle()); wxDataViewIconText(const wxDataViewIconText& other); //@} + /** + Gets the associated image. + + @since 3.1.6 + */ + const wxBitmapBundle& GetBitmapBundle() const; + /** Gets the icon. + + This function can only return the icon in the size appropriate for the + standard 100% DPI scaling, use GetBitmapBundle() to retrieve image + representation suitable for another DPI scaling value. */ - const wxIcon& GetIcon() const; + wxIcon GetIcon() const; /** Gets the text. */ wxString GetText() const; + /** + Sets the associated image. + + This function allows to provide several representations of the same + image, so that the most appropriate one for the current DPI scaling + could be used, and so should be preferred to SetIcon(). + + @since 3.1.6 + */ + void SetBitmapBundle(const wxBitmapBundle& bitmap); + /** Set the icon. + + Use SetBitmapBundle() instead to allow specifying different image + representations for different DPI scaling values. */ void SetIcon(const wxIcon& icon); diff --git a/samples/dataview/dataview.cpp b/samples/dataview/dataview.cpp index 3ebbccc6f1..d67bac239b 100644 --- a/samples/dataview/dataview.cpp +++ b/samples/dataview/dataview.cpp @@ -47,8 +47,6 @@ #include "../sample.xpm" #endif -#include "wx_small.xpm" - // ---------------------------------------------------------------------------- // MyApp // ---------------------------------------------------------------------------- @@ -992,13 +990,13 @@ void MyFrame::BuildDataViewCtrl(wxPanel* parent, unsigned int nPanel, wxDefaultSize, style | wxDV_NO_HEADER ); m_ctrl[Page_TreeStore] = tc; - 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 ); + const wxSize size = GetIconSizeFromModelFlags(m_modelFlags[nPanel]); - ilist->Add( wxIcon(wx_small_xpm) ); - tc->AssignImageList( ilist ); + wxDataViewTreeCtrl::Images images; + images.push_back( + wxArtProvider::GetBitmapBundle(wxART_WX_LOGO, wxART_LIST, size) + ); + tc->SetImages(images); const wxDataViewItem root = tc->AppendContainer( wxDataViewItem(0), "The Root", 0 ); diff --git a/samples/dataview/mymodels.cpp b/samples/dataview/mymodels.cpp index d6a4149459..fa19b6cd2e 100644 --- a/samples/dataview/mymodels.cpp +++ b/samples/dataview/mymodels.cpp @@ -17,17 +17,10 @@ #include "wx/wx.h" #endif +#include "wx/artprov.h" #include "wx/dataview.h" #include "mymodels.h" -// ---------------------------------------------------------------------------- -// resources -// ---------------------------------------------------------------------------- - -#include "null.xpm" -#include "wx_small.xpm" - - // ---------------------------------------------------------------------------- // MyMusicTreeModel // ---------------------------------------------------------------------------- @@ -378,20 +371,10 @@ MyListModel::MyListModel(int modelFlags) : m_iconColValues.assign(NUMBER_REAL_ITEMS, useMultiLine ? multiLineText : wxString("test")); - m_icon[0] = wxIcon( null_xpm ); + const wxSize size = GetIconSizeFromModelFlags(modelFlags); - 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)); + m_icon[0] = wxArtProvider::GetBitmapBundle(wxART_QUESTION, wxART_LIST, size); + m_icon[1] = wxArtProvider::GetBitmapBundle(wxART_WX_LOGO, wxART_LIST, size); } void MyListModel::Prepend( const wxString &text ) diff --git a/samples/dataview/mymodels.h b/samples/dataview/mymodels.h index 59733ac61c..ebdd36f821 100644 --- a/samples/dataview/mymodels.h +++ b/samples/dataview/mymodels.h @@ -253,7 +253,7 @@ private: wxArrayString m_textColValues; wxArrayString m_iconColValues; IntToStringMap m_customColValues; - wxIcon m_icon[2]; + wxBitmapBundle m_icon[2]; }; // ---------------------------------------------------------------------------- @@ -317,3 +317,12 @@ enum ModelFlags MODEL_KEEP_LOGO_SMALL = 1 << 1, MODEL_USE_MULTI_LINE_TEXT = 1 << 2 }; + +inline wxSize GetIconSizeFromModelFlags(int modelFlags) +{ + wxSize size(16, 16); + if ( (modelFlags & MODEL_USE_TALL_ROWS) && !(modelFlags & MODEL_KEEP_LOGO_SMALL) ) + size *= 2; + + return size; +} diff --git a/samples/dataview/null.xpm b/samples/dataview/null.xpm deleted file mode 100644 index bb54efbbfe..0000000000 --- a/samples/dataview/null.xpm +++ /dev/null @@ -1,30 +0,0 @@ -/* XPM */ -static const char *const null_xpm[] = { -"16 16 11 1", -" c None", -". c #000000", -"+ c #FFFFFF", -"@ c #FDE4E4", -"# c #F45C5C", -"$ c #EF0B0B", -"% c #F12727", -"& c #F67878", -"* c #FAAEAE", -"= c #FBC9C9", -"- c #F89393", -"................", -".++++++++++++++.", -".++++++++++++++.", -".++++@#$$%&++++.", -".+++@%$$$$$&+++.", -".+++&$$#*%$$+++.", -".+++=-#+@%$%+++.", -".++++++@%$$*+++.", -".++++++%$%@++++.", -".+++++*$$*+++++.", -".+++++@**@+++++.", -".+++++*$$*+++++.", -".+++++*$$*+++++.", -".+++++@**@+++++.", -".++++++++++++++.", -"................"}; diff --git a/samples/dataview/wx_small.xpm b/samples/dataview/wx_small.xpm deleted file mode 100644 index 115a048c1c..0000000000 --- a/samples/dataview/wx_small.xpm +++ /dev/null @@ -1,28 +0,0 @@ -/* XPM */ -static const char *wx_small_xpm[] = { -/* columns rows colors chars-per-pixel */ -"16 16 6 1", -". c Black", -"o c #FFFFFF", -"X c #000080", -"O c #FFFF00", -" c None", -"+ c #FF0000", -/* pixels */ -" ", -" ", -" ", -" ....... ", -" .XXXXX. ", -" .oXXXX. ", -" .oXXX.......", -".....oXXX.OOOOO.", -".+++.XXXX.oOOOO.", -".o++......oOOOO.", -".o++++. .oOOOO.", -".o++++. .OOOOO.", -".+++++. .......", -"....... ", -" ", -" " -}; diff --git a/src/common/datavcmn.cpp b/src/common/datavcmn.cpp index 6ffd745dda..027b460223 100644 --- a/src/common/datavcmn.cpp +++ b/src/common/datavcmn.cpp @@ -2217,11 +2217,11 @@ bool wxDataViewCheckIconTextRenderer::Render(wxRect cell, wxDC* dc, int state) int xoffset = sizeCheck.x + MARGIN_CHECK_ICON; wxRect rectIcon; - const wxIcon& icon = m_value.GetIcon(); - const bool drawIcon = icon.IsOk(); + const wxBitmapBundle& bb = m_value.GetBitmapBundle(); + const bool drawIcon = bb.IsOk(); if ( drawIcon ) { - const wxSize sizeIcon = icon.GetLogicalSize(); + const wxSize sizeIcon = bb.GetPreferredSizeFor(GetView()); rectIcon = wxRect(cell.GetPosition(), sizeIcon); rectIcon.x += xoffset; rectIcon = rectIcon.CentreIn(cell, wxVERTICAL); @@ -2260,7 +2260,7 @@ bool wxDataViewCheckIconTextRenderer::Render(wxRect cell, wxDC* dc, int state) // Finally draw the icon, if any. if ( drawIcon ) - dc->DrawIcon(icon, rectIcon.GetPosition()); + dc->DrawIcon(bb.GetIconFor(GetView()), rectIcon.GetPosition()); return true; } @@ -2583,7 +2583,7 @@ wxDataViewColumn *wxDataViewListCtrl::AppendIconTextColumn( const wxString &labe wxDataViewTreeStoreNode::wxDataViewTreeStoreNode( wxDataViewTreeStoreNode *parent, - const wxString &text, const wxIcon &icon, wxClientData *data ) + const wxString &text, const wxBitmapBundle &icon, wxClientData *data ) : m_text(text) , m_icon(icon) { @@ -2598,7 +2598,7 @@ wxDataViewTreeStoreNode::~wxDataViewTreeStoreNode() wxDataViewTreeStoreContainerNode::wxDataViewTreeStoreContainerNode( wxDataViewTreeStoreNode *parent, const wxString &text, - const wxIcon &icon, const wxIcon &expanded, wxClientData *data ) + const wxBitmapBundle &icon, const wxBitmapBundle &expanded, wxClientData *data ) : wxDataViewTreeStoreNode( parent, text, icon, data ) , m_iconExpanded(expanded) { @@ -2647,7 +2647,7 @@ wxDataViewTreeStore::~wxDataViewTreeStore() } wxDataViewItem wxDataViewTreeStore::AppendItem( const wxDataViewItem& parent, - const wxString &text, const wxIcon &icon, wxClientData *data ) + const wxString &text, const wxBitmapBundle &icon, wxClientData *data ) { wxDataViewTreeStoreContainerNode *parent_node = FindContainerNode( parent ); if (!parent_node) return wxDataViewItem(0); @@ -2660,7 +2660,7 @@ wxDataViewItem wxDataViewTreeStore::AppendItem( const wxDataViewItem& parent, } wxDataViewItem wxDataViewTreeStore::PrependItem( const wxDataViewItem& parent, - const wxString &text, const wxIcon &icon, wxClientData *data ) + const wxString &text, const wxBitmapBundle &icon, wxClientData *data ) { wxDataViewTreeStoreContainerNode *parent_node = FindContainerNode( parent ); if (!parent_node) return wxDataViewItem(0); @@ -2677,7 +2677,7 @@ wxDataViewItem wxDataViewTreeStore::InsertItem(const wxDataViewItem& parent, const wxDataViewItem& previous, const wxString& text, - const wxIcon& icon, + const wxBitmapBundle& icon, wxClientData *data) { wxDataViewTreeStoreContainerNode *parent_node = FindContainerNode( parent ); @@ -2696,7 +2696,7 @@ wxDataViewTreeStore::InsertItem(const wxDataViewItem& parent, } wxDataViewItem wxDataViewTreeStore::PrependContainer( const wxDataViewItem& parent, - const wxString &text, const wxIcon &icon, const wxIcon &expanded, + const wxString &text, const wxBitmapBundle &icon, const wxBitmapBundle &expanded, wxClientData *data ) { wxDataViewTreeStoreContainerNode *parent_node = FindContainerNode( parent ); @@ -2713,8 +2713,8 @@ wxDataViewItem wxDataViewTreeStore::PrependContainer( const wxDataViewItem& pare wxDataViewItem wxDataViewTreeStore::AppendContainer(const wxDataViewItem& parent, const wxString &text, - const wxIcon& icon, - const wxIcon& expanded, + const wxBitmapBundle& icon, + const wxBitmapBundle& expanded, wxClientData * data) { wxDataViewTreeStoreContainerNode *parent_node = FindContainerNode( parent ); @@ -2731,8 +2731,8 @@ wxDataViewItem wxDataViewTreeStore::InsertContainer(const wxDataViewItem& parent, const wxDataViewItem& previous, const wxString& text, - const wxIcon& icon, - const wxIcon& expanded, + const wxBitmapBundle& icon, + const wxBitmapBundle& expanded, wxClientData * data) { wxDataViewTreeStoreContainerNode *parent_node = FindContainerNode( parent ); @@ -2798,7 +2798,7 @@ wxString wxDataViewTreeStore::GetItemText( const wxDataViewItem& item ) const return node->GetText(); } -void wxDataViewTreeStore::SetItemIcon( const wxDataViewItem& item, const wxIcon &icon ) +void wxDataViewTreeStore::SetItemIcon( const wxDataViewItem& item, const wxBitmapBundle &icon ) { wxDataViewTreeStoreNode *node = FindNode( item ); if (!node) return; @@ -2806,7 +2806,7 @@ void wxDataViewTreeStore::SetItemIcon( const wxDataViewItem& item, const wxIcon node->SetIcon( icon ); } -const wxIcon &wxDataViewTreeStore::GetItemIcon( const wxDataViewItem& item ) const +wxIcon wxDataViewTreeStore::GetItemIcon( const wxDataViewItem& item ) const { wxDataViewTreeStoreNode *node = FindNode( item ); if (!node) return wxNullIcon; @@ -2814,7 +2814,7 @@ const wxIcon &wxDataViewTreeStore::GetItemIcon( const wxDataViewItem& item ) con return node->GetIcon(); } -void wxDataViewTreeStore::SetItemExpandedIcon( const wxDataViewItem& item, const wxIcon &icon ) +void wxDataViewTreeStore::SetItemExpandedIcon( const wxDataViewItem& item, const wxBitmapBundle &icon ) { wxDataViewTreeStoreContainerNode *node = FindContainerNode( item ); if (!node) return; @@ -2822,7 +2822,7 @@ void wxDataViewTreeStore::SetItemExpandedIcon( const wxDataViewItem& item, const node->SetExpandedIcon( icon ); } -const wxIcon &wxDataViewTreeStore::GetItemExpandedIcon( const wxDataViewItem& item ) const +wxIcon wxDataViewTreeStore::GetItemExpandedIcon( const wxDataViewItem& item ) const { wxDataViewTreeStoreContainerNode *node = FindContainerNode( item ); if (!node) return wxNullIcon; @@ -2887,15 +2887,18 @@ wxDataViewTreeStore::GetValue(wxVariant &variant, wxDataViewTreeStoreNode *node = FindNode( item ); if (!node) return; - wxIcon icon( node->GetIcon()); + wxBitmapBundle bb; if (node->IsContainer()) { wxDataViewTreeStoreContainerNode *container = (wxDataViewTreeStoreContainerNode*) node; - if (container->IsExpanded() && container->GetExpandedIcon().IsOk()) - icon = container->GetExpandedIcon(); + if (container->IsExpanded()) + bb = container->GetExpandedBitmapBundle(); } - wxDataViewIconText data( node->GetText(), icon ); + if (!bb.IsOk()) + bb = node->GetBitmapBundle(); + + wxDataViewIconText data( node->GetText(), bb ); variant << data; } @@ -3045,7 +3048,7 @@ wxDataViewItem wxDataViewTreeCtrl::AppendItem( const wxDataViewItem& parent, const wxString &text, int iconIndex, wxClientData *data ) { wxDataViewItem res = GetStore()-> - AppendItem( parent, text, GetImage(iconIndex), data ); + AppendItem( parent, text, GetBitmapBundle(iconIndex), data ); GetStore()->ItemAdded( parent, res ); @@ -3056,7 +3059,7 @@ wxDataViewItem wxDataViewTreeCtrl::PrependItem( const wxDataViewItem& parent, const wxString &text, int iconIndex, wxClientData *data ) { wxDataViewItem res = GetStore()-> - PrependItem( parent, text, GetImage(iconIndex), data ); + PrependItem( parent, text, GetBitmapBundle(iconIndex), data ); GetStore()->ItemAdded( parent, res ); @@ -3067,7 +3070,7 @@ wxDataViewItem wxDataViewTreeCtrl::InsertItem( const wxDataViewItem& parent, con const wxString &text, int iconIndex, wxClientData *data ) { wxDataViewItem res = GetStore()-> - InsertItem( parent, previous, text, GetImage(iconIndex), data ); + InsertItem( parent, previous, text, GetBitmapBundle(iconIndex), data ); GetStore()->ItemAdded( parent, res ); @@ -3079,7 +3082,7 @@ wxDataViewItem wxDataViewTreeCtrl::PrependContainer( const wxDataViewItem& paren { wxDataViewItem res = GetStore()-> PrependContainer( parent, text, - GetImage(iconIndex), GetImage(expandedIndex), data ); + GetBitmapBundle(iconIndex), GetBitmapBundle(expandedIndex), data ); GetStore()->ItemAdded( parent, res ); @@ -3091,7 +3094,7 @@ wxDataViewItem wxDataViewTreeCtrl::AppendContainer( const wxDataViewItem& parent { wxDataViewItem res = GetStore()-> AppendContainer( parent, text, - GetImage(iconIndex), GetImage(expandedIndex), data ); + GetBitmapBundle(iconIndex), GetBitmapBundle(expandedIndex), data ); GetStore()->ItemAdded( parent, res ); @@ -3103,7 +3106,7 @@ wxDataViewItem wxDataViewTreeCtrl::InsertContainer( const wxDataViewItem& parent { wxDataViewItem res = GetStore()-> InsertContainer( parent, previous, text, - GetImage(iconIndex), GetImage(expandedIndex), data ); + GetBitmapBundle(iconIndex), GetBitmapBundle(expandedIndex), data ); GetStore()->ItemAdded( parent, res ); @@ -3118,7 +3121,7 @@ void wxDataViewTreeCtrl::SetItemText( const wxDataViewItem& item, const wxString GetStore()->ValueChanged( item, 0 ); } -void wxDataViewTreeCtrl::SetItemIcon( const wxDataViewItem& item, const wxIcon &icon ) +void wxDataViewTreeCtrl::SetItemIcon( const wxDataViewItem& item, const wxBitmapBundle &icon ) { GetStore()->SetItemIcon(item,icon); @@ -3126,7 +3129,7 @@ void wxDataViewTreeCtrl::SetItemIcon( const wxDataViewItem& item, const wxIcon & GetStore()->ValueChanged( item, 0 ); } -void wxDataViewTreeCtrl::SetItemExpandedIcon( const wxDataViewItem& item, const wxIcon &icon ) +void wxDataViewTreeCtrl::SetItemExpandedIcon( const wxDataViewItem& item, const wxBitmapBundle &icon ) { GetStore()->SetItemExpandedIcon(item,icon); @@ -3203,4 +3206,9 @@ void wxDataViewTreeCtrl::OnSize( wxSizeEvent &event ) event.Skip( true ); } +void wxDataViewTreeCtrl::OnImagesChanged() +{ + Refresh(); +} + #endif // wxUSE_DATAVIEWCTRL diff --git a/src/generic/datavgen.cpp b/src/generic/datavgen.cpp index 2c1c894eea..bcc624b81b 100644 --- a/src/generic/datavgen.cpp +++ b/src/generic/datavgen.cpp @@ -1553,11 +1553,13 @@ bool wxDataViewIconTextRenderer::Render(wxRect rect, wxDC *dc, int state) { int xoffset = 0; - const wxIcon& icon = m_value.GetIcon(); - if ( icon.IsOk() ) + const wxBitmapBundle& bb = m_value.GetBitmapBundle(); + if ( bb.IsOk() ) { - dc->DrawIcon(icon, rect.x, rect.y + (rect.height - icon.GetHeight())/2); - xoffset = icon.GetWidth() + GetView()->FromDIP(4); + wxWindow* const dvc = GetView(); + const wxIcon& icon = bb.GetIconFor(dvc); + dc->DrawIcon(icon, rect.x, rect.y + (rect.height - icon.GetLogicalHeight())/2); + xoffset = icon.GetLogicalWidth() + dvc->FromDIP(4); } RenderText(m_value.GetText(), xoffset, rect, dc, state); @@ -1573,8 +1575,9 @@ wxSize wxDataViewIconTextRenderer::GetSize() const { wxSize size = GetTextExtent(m_value.GetText()); - if (m_value.GetIcon().IsOk()) - size.x += m_value.GetIcon().GetWidth() + dvc->FromDIP(4); + const wxBitmapBundle& bb = m_value.GetBitmapBundle(); + if (bb.IsOk()) + size.x += bb.GetPreferredSizeFor(dvc).x + dvc->FromDIP(4); return size; } return dvc->FromDIP(wxSize(80,20)); @@ -1588,11 +1591,12 @@ wxWindow* wxDataViewIconTextRenderer::CreateEditorCtrl(wxWindow *parent, wxRect wxString text = iconText.GetText(); // adjust the label rect to take the width of the icon into account - if (iconText.GetIcon().IsOk()) + const wxBitmapBundle& bb = iconText.GetBitmapBundle(); + if (bb.IsOk()) { wxWindow* const dvc = GetView(); - int w = iconText.GetIcon().GetWidth() + dvc->FromDIP(4); + int w = bb.GetPreferredSizeFor(dvc).x + dvc->FromDIP(4); labelRect.x += w; labelRect.width -= w; }