Add wxArtProvider::Get[Native]DIPSizeHint()

Also add "wxWindow* win = NULL" argument to the existing functions to
convert from DIPs using the given window instead of the default DPI
scaling factor.

Closes #22022.
This commit is contained in:
Vadim Zeitlin 2022-03-24 00:31:23 +01:00
parent 506f292be2
commit 108108e54e
7 changed files with 74 additions and 30 deletions

View File

@ -19,6 +19,8 @@
class WXDLLIMPEXP_FWD_CORE wxArtProvidersList;
class WXDLLIMPEXP_FWD_CORE wxArtProviderCache;
class WXDLLIMPEXP_FWD_CORE wxWindow;
class wxArtProviderModule;
// ----------------------------------------------------------------------------
@ -196,12 +198,15 @@ public:
const wxArtClient& client = wxASCII_STR(wxART_OTHER));
// Gets native size for given 'client' or wxDefaultSize if it doesn't
// have native equivalent
static wxSize GetNativeSizeHint(const wxArtClient& client);
// have native equivalent. The first version returns the size in logical
// pixels while the second one returns it in DIPs.
static wxSize GetNativeSizeHint(const wxArtClient& client, wxWindow* win = NULL);
static wxSize GetNativeDIPSizeHint(const wxArtClient& client);
// Get the size hint of an icon from a specific wxArtClient from the
// topmost (i.e. first used) provider.
static wxSize GetSizeHint(const wxArtClient& client);
static wxSize GetSizeHint(const wxArtClient& client, wxWindow* win = NULL);
static wxSize GetDIPSizeHint(const wxArtClient& client);
#if WXWIN_COMPATIBILITY_3_0
wxDEPRECATED_MSG("use GetSizeHint() without bool argument or GetNativeSizeHint()")
@ -226,7 +231,10 @@ protected:
// Destroy caches & all providers
static void CleanUpProviders();
// Get the default size of an icon for a specific client
// Get the default size of an icon for a specific client.
//
// Although this function doesn't have "DIP" in its name, it should return
// the size in DIPs.
virtual wxSize DoGetSizeHint(const wxArtClient& client);
// Derived classes must override at least one of the CreateXXX() functions

View File

@ -333,7 +333,7 @@ public:
const wxSize& size = wxDefaultSize);
/**
Returns native icon size for use specified by @a client hint.
Returns native icon size for use specified by @a client hint in DIPs.
If the platform has no commonly used default for this use or if
@a client is not recognized, returns wxDefaultSize.
@ -343,20 +343,42 @@ public:
In that case, this method returns only one of them, picked
reasonably.
@since 2.9.0
@since 3.1.6
*/
static wxSize GetNativeSizeHint(const wxArtClient& client);
static wxSize GetNativeDIPSizeHint(const wxArtClient& client);
/**
Returns a suitable size hint for the given @e wxArtClient.
Returns native icon size for use specified by @a client hint.
This function does the same thing as GetNativeDIPSizeHint(), but uses
@a win to convert the returned value to logical pixels. If @a win is
@NULL, default DPI scaling (i.e. that of the primary display) is used.
@since 2.9.0 (@a win parameter is available only since 3.1.6)
*/
static wxSize GetNativeSizeHint(const wxArtClient& client, wxWindow* win = NULL);
/**
Returns a suitable size hint for the given @e wxArtClient in DIPs.
Return the size used by the topmost wxArtProvider for the given @a
client. @e wxDefaultSize may be returned if the client doesn't have a
specified size, like wxART_OTHER for example.
@see GetNativeSizeHint()
@see GetNativeDIPSizeHint()
*/
static wxSize GetSizeHint(const wxArtClient& client);
static wxSize GetDIPSizeHint(const wxArtClient& client);
/**
Returns a suitable size hint for the given @e wxArtClient.
This function does the same thing as GetDIPSizeHint(), but uses @a win
to convert the returned value to logical pixels. If @a win is @NULL,
default DPI scaling (i.e. that of the primary display) is used.
Note that @a win parameter is only available since wxWidgets 3.1.6.
*/
static wxSize GetSizeHint(const wxArtClient& client, wxWindow* win = NULL);
/**
Query registered providers for icon bundle with given ID.
@ -442,7 +464,9 @@ protected:
Derived art provider classes may override this method to return the
size of the images used by this provider.
The default implementation returns the result of GetNativeSizeHint().
Note that the returned size should be in DPI-independent pixels, i.e.
DIPs. The default implementation returns the result of
GetNativeDIPSizeHint().
*/
virtual wxSize DoGetSizeHint(const wxArtClient& client);

View File

@ -363,9 +363,9 @@ MyFrame::~MyFrame()
void MyFrame::InitImageList()
{
wxSize iconSize = wxArtProvider::GetSizeHint(wxART_LIST);
wxSize iconSize = wxArtProvider::GetSizeHint(wxART_LIST, this);
if ( iconSize == wxDefaultSize )
iconSize = wxSize(16, 16);
iconSize = FromDIP(wxSize(16, 16));
m_imageList = new wxImageList(iconSize.x, iconSize.y);

View File

@ -24,6 +24,7 @@
#include "wx/hashmap.h"
#include "wx/image.h"
#include "wx/module.h"
#include "wx/window.h"
#endif
// ===========================================================================
@ -538,23 +539,35 @@ wxArtID wxArtProvider::GetMessageBoxIconId(int flags)
}
#endif // WXWIN_COMPATIBILITY_3_0
/*static*/ wxSize wxArtProvider::GetSizeHint(const wxArtClient& client)
/*static*/ wxSize wxArtProvider::GetDIPSizeHint(const wxArtClient& client)
{
wxArtProvidersList::compatibility_iterator node = sm_providers->GetFirst();
if (node)
return node->GetData()->DoGetSizeHint(client);
return GetNativeSizeHint(client);
return GetNativeDIPSizeHint(client);
}
/*static*/
wxSize wxArtProvider::GetSizeHint(const wxArtClient& client, wxWindow* win)
{
return wxWindow::FromDIP(GetDIPSizeHint(client), win);
}
wxSize wxArtProvider::DoGetSizeHint(const wxArtClient& client)
{
return GetNativeSizeHint(client);
return GetNativeDIPSizeHint(client);
}
/*static*/
wxSize wxArtProvider::GetNativeSizeHint(const wxArtClient& client, wxWindow* win)
{
return wxWindow::FromDIP(GetNativeDIPSizeHint(client), win);
}
#ifndef wxHAS_NATIVE_ART_PROVIDER_IMPL
/*static*/
wxSize wxArtProvider::GetNativeSizeHint(const wxArtClient& WXUNUSED(client))
wxSize wxArtProvider::GetNativeDIPSizeHint(const wxArtClient& WXUNUSED(client))
{
// rather than returning some arbitrary value that doesn't make much
// sense (as 2.8 used to do), tell the caller that we don't have a clue:

View File

@ -388,7 +388,7 @@ wxGTK2ArtProvider::CreateIconBundle(const wxArtID& id,
// ----------------------------------------------------------------------------
/*static*/
wxSize wxArtProvider::GetNativeSizeHint(const wxArtClient& client)
wxSize wxArtProvider::GetNativeDIPSizeHint(const wxArtClient& client)
{
// Gtk has specific sizes for each client, see artgtk.cpp
GtkIconSize gtk_size = ArtClientToIconSize(client);

View File

@ -324,35 +324,34 @@ wxBitmap wxWindowsArtProvider::CreateBitmap(const wxArtID& id,
// ----------------------------------------------------------------------------
/*static*/
wxSize wxArtProvider::GetNativeSizeHint(const wxArtClient& client)
wxSize wxArtProvider::GetNativeDIPSizeHint(const wxArtClient& client)
{
const wxWindow* win = wxApp::GetMainTopWindow();
if ( client == wxART_TOOLBAR )
{
return wxWindow::FromDIP(wxSize(24, 24), win);
return wxSize(24, 24);
}
else if ( client == wxART_MENU )
{
return wxWindow::FromDIP(wxSize(16, 16), win);
return wxSize(16, 16);
}
else if ( client == wxART_FRAME_ICON )
{
return wxSize(wxGetSystemMetrics(SM_CXSMICON, win),
wxGetSystemMetrics(SM_CYSMICON, win));
return wxSize(::GetSystemMetrics(SM_CXSMICON),
::GetSystemMetrics(SM_CYSMICON));
}
else if ( client == wxART_CMN_DIALOG ||
client == wxART_MESSAGE_BOX )
{
return wxSize(wxGetSystemMetrics(SM_CXICON, win),
wxGetSystemMetrics(SM_CYICON, win));
return wxSize(::GetSystemMetrics(SM_CXICON),
::GetSystemMetrics(SM_CYICON));
}
else if (client == wxART_BUTTON)
{
return wxWindow::FromDIP(wxSize(16, 16), win);
return wxSize(16, 16);
}
else if (client == wxART_LIST)
{
return wxWindow::FromDIP(wxSize(16, 16), win);
return wxSize(16, 16);
}
return wxDefaultSize;

View File

@ -116,11 +116,11 @@ wxIconBundle wxMacArtProvider::CreateIconBundle(const wxArtID& id, const wxArtCl
#endif
// ----------------------------------------------------------------------------
// wxArtProvider::GetNativeSizeHint()
// wxArtProvider::GetNativeDIPSizeHint()
// ----------------------------------------------------------------------------
/*static*/
wxSize wxArtProvider::GetNativeSizeHint(const wxArtClient& client)
wxSize wxArtProvider::GetNativeDIPSizeHint(const wxArtClient& client)
{
if ( client == wxART_TOOLBAR )
{