X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/6f23f80b721b35435c4310483aa69b09a31dec15..890defb4f3a0012a296c69949bf5f93075743e8f:/src/common/artprov.cpp?ds=sidebyside diff --git a/src/common/artprov.cpp b/src/common/artprov.cpp index 299c5a669f..ff278ac39f 100644 --- a/src/common/artprov.cpp +++ b/src/common/artprov.cpp @@ -108,7 +108,7 @@ void wxArtProviderCache::Clear() wxArtProviderCache::ConstructHashID(const wxArtID& id, const wxArtClient& client) { - return id + _T('-') + client; + return id + wxT('-') + client; } @@ -117,8 +117,8 @@ wxArtProviderCache::ConstructHashID(const wxArtID& id, const wxArtClient& client, const wxSize& size) { - return ConstructHashID(id, client) + _T('-') + - wxString::Format(_T("%d-%d"), size.x, size.y); + return ConstructHashID(id, client) + wxT('-') + + wxString::Format(wxT("%d-%d"), size.x, size.y); } // ============================================================================ @@ -168,8 +168,8 @@ wxArtProvider::~wxArtProvider() /*static*/ bool wxArtProvider::Pop() { - wxCHECK_MSG( sm_providers, false, _T("no wxArtProvider exists") ); - wxCHECK_MSG( !sm_providers->empty(), false, _T("wxArtProviders stack is empty") ); + wxCHECK_MSG( sm_providers, false, wxT("no wxArtProvider exists") ); + wxCHECK_MSG( !sm_providers->empty(), false, wxT("wxArtProviders stack is empty") ); delete sm_providers->GetFirst()->GetData(); sm_cache->Clear(); @@ -178,7 +178,7 @@ wxArtProvider::~wxArtProvider() /*static*/ bool wxArtProvider::Remove(wxArtProvider *provider) { - wxCHECK_MSG( sm_providers, false, _T("no wxArtProvider exists") ); + wxCHECK_MSG( sm_providers, false, wxT("no wxArtProvider exists") ); if ( sm_providers->DeleteObject(provider) ) { @@ -221,9 +221,9 @@ wxArtProvider::~wxArtProvider() const wxSize& size) { // safety-check against writing client,id,size instead of id,client,size: - wxASSERT_MSG( client.Last() == _T('C'), _T("invalid 'client' parameter") ); + wxASSERT_MSG( client.Last() == wxT('C'), wxT("invalid 'client' parameter") ); - wxCHECK_MSG( sm_providers, wxNullBitmap, _T("no wxArtProvider exists") ); + wxCHECK_MSG( sm_providers, wxNullBitmap, wxT("no wxArtProvider exists") ); wxString hashId = wxArtProviderCache::ConstructHashID(id, client, size); @@ -235,33 +235,68 @@ wxArtProvider::~wxArtProvider() { bmp = node->GetData()->CreateBitmap(id, client, size); if ( bmp.Ok() ) + break; + } + + if ( !bmp.Ok() ) + { + // no bitmap created -- as a fallback, try if we can find desired + // icon in a bundle + wxIconBundle iconBundle = DoGetIconBundle(id, client); + if ( iconBundle.IsOk() ) { + wxSize sz(size != wxDefaultSize + ? size + : GetNativeSizeHint(client)); + wxIcon icon(iconBundle.GetIcon(sz)); + if ( icon.IsOk() ) + bmp.CopyFromIcon(icon); + } + } + + if ( bmp.IsOk() ) + { + // if we didn't get the correct size, resize the bitmap #if wxUSE_IMAGE && (!defined(__WXMSW__) || wxUSE_WXDIB) - if ( size != wxDefaultSize && - (bmp.GetWidth() != size.x || bmp.GetHeight() != size.y) ) - { - wxImage img = bmp.ConvertToImage(); - img.Rescale(size.x, size.y); - bmp = wxBitmap(img); - } -#endif - break; + if ( size != wxDefaultSize && + (bmp.GetWidth() != size.x || bmp.GetHeight() != size.y) ) + { + wxImage img = bmp.ConvertToImage(); + img.Rescale(size.x, size.y); + bmp = wxBitmap(img); } - // We could try the IconBundles here and convert what we find - // to a bitmap. +#endif } + sm_cache->PutBitmap(hashId, bmp); - } + } return bmp; } -/*static*/ wxIconBundle wxArtProvider::GetIconBundle(const wxArtID& id, const wxArtClient& client) +/*static*/ +wxIconBundle wxArtProvider::GetIconBundle(const wxArtID& id, const wxArtClient& client) +{ + wxIconBundle iconbundle(DoGetIconBundle(id, client)); + + if ( iconbundle.IsOk() ) + { + return iconbundle; + } + else + { + // fall back to single-icon bundle + return wxIconBundle(GetIcon(id, client)); + } +} + +/*static*/ +wxIconBundle wxArtProvider::DoGetIconBundle(const wxArtID& id, const wxArtClient& client) { // safety-check against writing client,id,size instead of id,client,size: - wxASSERT_MSG( client.Last() == _T('C'), _T("invalid 'client' parameter") ); + wxASSERT_MSG( client.Last() == wxT('C'), wxT("invalid 'client' parameter") ); - wxCHECK_MSG( sm_providers, wxNullIconBundle, _T("no wxArtProvider exists") ); + wxCHECK_MSG( sm_providers, wxNullIconBundle, wxT("no wxArtProvider exists") ); wxString hashId = wxArtProviderCache::ConstructHashID(id, client); @@ -286,16 +321,9 @@ wxArtProvider::~wxArtProvider() const wxArtClient& client, const wxSize& size) { - wxCHECK_MSG( sm_providers, wxNullIcon, _T("no wxArtProvider exists") ); - - // First look for an appropriate icon bundle - this will give us the best icon - wxIconBundle iconBundle = GetIconBundle(id, client); - if ( iconBundle.IsOk() ) - return iconBundle.GetIcon(size); - - // If there is no icon bundle then look for a bitmap wxBitmap bmp = GetBitmap(id, client, size); - if ( !bmp.Ok() ) + + if ( !bmp.IsOk() ) return wxNullIcon; wxIcon icon; @@ -310,7 +338,7 @@ wxIcon wxArtProvider::GetMessageBoxIcon(int flags) switch ( flags & wxICON_MASK ) { default: - wxFAIL_MSG(_T("incorrect message box icon flags")); + wxFAIL_MSG(wxT("incorrect message box icon flags")); // fall through case wxICON_ERROR: