Fix broken icon layout when loading Cemu on Gnome (#171)

The icon view was all broken from having entries inserted with non
loaded icons, resulting in a layout that had the wrong size and no
obvious way to trigger a resizing without incurring a costly window
redraw.

Solution: When the icon is not yet loaded insert a transparent
placeholder icon.
This commit is contained in:
bitscher 2022-09-05 05:51:24 -07:00 committed by GitHub
parent 0ed4fdcd78
commit 917b80941e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -51,11 +51,18 @@ wxGameList::wxGameList(wxWindow* parent, wxWindowID id)
: wxListCtrl(parent, id, wxDefaultPosition, wxDefaultSize, GetStyleFlags(Style::kList)), m_style(Style::kList) : wxListCtrl(parent, id, wxDefaultPosition, wxDefaultSize, GetStyleFlags(Style::kList)), m_style(Style::kList)
{ {
CreateListColumns(); CreateListColumns();
const char transparent_bitmap[kIconWidth * kIconWidth * 4] = {0};
wxBitmap blank(transparent_bitmap, kIconWidth, kIconWidth);
blank.UseAlpha(true);
m_image_list = new wxImageList(kIconWidth, kIconWidth); m_image_list = new wxImageList(kIconWidth, kIconWidth);
m_image_list->Add(blank);
wxListCtrl::SetImageList(m_image_list, wxIMAGE_LIST_NORMAL); wxListCtrl::SetImageList(m_image_list, wxIMAGE_LIST_NORMAL);
m_image_list_small = new wxImageList(kListIconWidth, kListIconWidth); m_image_list_small = new wxImageList(kListIconWidth, kListIconWidth);
wxBitmap::Rescale(blank, {kListIconWidth, kListIconWidth});
m_image_list_small->Add(blank);
wxListCtrl::SetImageList(m_image_list_small, wxIMAGE_LIST_SMALL); wxListCtrl::SetImageList(m_image_list_small, wxIMAGE_LIST_SMALL);
m_tooltip_window = new wxPanel(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxNO_BORDER); m_tooltip_window = new wxPanel(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxNO_BORDER);
@ -857,15 +864,14 @@ void wxGameList::OnGameEntryUpdatedByTitleId(wxTitleIdEvent& event)
isNewEntry = true; isNewEntry = true;
} }
int icon = 0; int icon = 0; /* 0 is the default empty icon */
int icon_small = 0; int icon_small = 0; /* 0 is the default empty icon */
bool hasIcon = QueryIconForTitle(baseTitleId, icon, icon_small); QueryIconForTitle(baseTitleId, icon, icon_small);
if (m_style == Style::kList) if (m_style == Style::kList)
{ {
if(hasIcon) SetItemColumnImage(index, ColumnIcon, icon_small);
SetItemColumnImage(index, ColumnIcon, icon_small);
SetItem(index, ColumnName, wxHelper::FromUtf8(GetNameByTitleId(baseTitleId))); SetItem(index, ColumnName, wxHelper::FromUtf8(GetNameByTitleId(baseTitleId)));
SetItem(index, ColumnVersion, fmt::format("{}", gameInfo.GetVersion())); SetItem(index, ColumnVersion, fmt::format("{}", gameInfo.GetVersion()));
@ -912,13 +918,11 @@ void wxGameList::OnGameEntryUpdatedByTitleId(wxTitleIdEvent& event)
} }
else if (m_style == Style::kIcons) else if (m_style == Style::kIcons)
{ {
if(hasIcon) SetItemImage(index, icon);
SetItemImage(index, icon);
} }
else if (m_style == Style::kSmallIcons) else if (m_style == Style::kSmallIcons)
{ {
if (hasIcon) SetItemImage(index, icon_small);
SetItemImage(index, icon_small);
} }
if (isNewEntry) if (isNewEntry)
UpdateItemColors(index); UpdateItemColors(index);