|
|
|
@ -25,6 +25,7 @@
|
|
|
|
|
#include <wx/progdlg.h>
|
|
|
|
|
#include <wx/settings.h>
|
|
|
|
|
#include <wx/tipwin.h>
|
|
|
|
|
#include <wx/wxcrt.h>
|
|
|
|
|
|
|
|
|
|
#include "Common/CDUtils.h"
|
|
|
|
|
#include "Common/CommonPaths.h"
|
|
|
|
@ -95,10 +96,19 @@ static int CompareGameListItems(const GameListItem* iso1, const GameListItem* is
|
|
|
|
|
return t * (iso1->GetRevision() > iso2->GetRevision() ? 1 : -1);
|
|
|
|
|
if (iso1->GetDiscNumber() != iso2->GetDiscNumber())
|
|
|
|
|
return t * (iso1->GetDiscNumber() > iso2->GetDiscNumber() ? 1 : -1);
|
|
|
|
|
|
|
|
|
|
wxString iso1_filename = wxFileNameFromPath(iso1->GetFileName());
|
|
|
|
|
wxString iso2_filename = wxFileNameFromPath(iso2->GetFileName());
|
|
|
|
|
|
|
|
|
|
if (iso1_filename != iso2_filename)
|
|
|
|
|
return t * wxStricmp(iso1_filename, iso2_filename);
|
|
|
|
|
}
|
|
|
|
|
return strcasecmp(iso1->GetName().c_str(), iso2->GetName().c_str()) * t;
|
|
|
|
|
case CGameListCtrl::COLUMN_MAKER:
|
|
|
|
|
return strcasecmp(iso1->GetCompany().c_str(), iso2->GetCompany().c_str()) * t;
|
|
|
|
|
case CGameListCtrl::COLUMN_FILENAME:
|
|
|
|
|
return wxStricmp(wxFileNameFromPath(iso1->GetFileName()),
|
|
|
|
|
wxFileNameFromPath(iso2->GetFileName())) * t;
|
|
|
|
|
case CGameListCtrl::COLUMN_ID:
|
|
|
|
|
return strcasecmp(iso1->GetUniqueID().c_str(), iso2->GetUniqueID().c_str()) * t;
|
|
|
|
|
case CGameListCtrl::COLUMN_COUNTRY:
|
|
|
|
@ -265,6 +275,7 @@ void CGameListCtrl::Update()
|
|
|
|
|
InsertColumn(COLUMN_TITLE, _("Title"));
|
|
|
|
|
|
|
|
|
|
InsertColumn(COLUMN_MAKER, _("Maker"));
|
|
|
|
|
InsertColumn(COLUMN_FILENAME, _("File"));
|
|
|
|
|
InsertColumn(COLUMN_ID, _("ID"));
|
|
|
|
|
InsertColumn(COLUMN_COUNTRY, "");
|
|
|
|
|
InsertColumn(COLUMN_SIZE, _("Size"));
|
|
|
|
@ -282,6 +293,7 @@ void CGameListCtrl::Update()
|
|
|
|
|
SetColumnWidth(COLUMN_BANNER, SConfig::GetInstance().m_showBannerColumn ? 96 + platform_padding : 0);
|
|
|
|
|
SetColumnWidth(COLUMN_TITLE, 175 + platform_padding);
|
|
|
|
|
SetColumnWidth(COLUMN_MAKER, SConfig::GetInstance().m_showMakerColumn ? 150 + platform_padding : 0);
|
|
|
|
|
SetColumnWidth(COLUMN_FILENAME, SConfig::GetInstance().m_showFileNameColumn ? 100 + platform_padding : 0);
|
|
|
|
|
SetColumnWidth(COLUMN_ID, SConfig::GetInstance().m_showIDColumn ? 75 + platform_padding : 0);
|
|
|
|
|
SetColumnWidth(COLUMN_COUNTRY, SConfig::GetInstance().m_showRegionColumn ? 32 + platform_padding : 0);
|
|
|
|
|
SetColumnWidth(COLUMN_EMULATION_STATE, SConfig::GetInstance().m_showStateColumn ? 50 + platform_padding : 0);
|
|
|
|
@ -361,52 +373,85 @@ static wxString NiceSizeFormat(u64 _size)
|
|
|
|
|
return StrToWxStr(StringFromFormat("%s %s", value.c_str(), unit_symbols[unit]));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Update the column content of the item at _Index
|
|
|
|
|
void CGameListCtrl::UpdateItemAtColumn(long _Index, int column)
|
|
|
|
|
{
|
|
|
|
|
GameListItem& rISOFile = *m_ISOFiles[_Index];
|
|
|
|
|
|
|
|
|
|
switch(column)
|
|
|
|
|
{
|
|
|
|
|
case COLUMN_PLATFORM:
|
|
|
|
|
{
|
|
|
|
|
SetItemColumnImage(_Index, COLUMN_PLATFORM,
|
|
|
|
|
m_PlatformImageIndex[rISOFile.GetPlatform()]);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
case COLUMN_BANNER:
|
|
|
|
|
{
|
|
|
|
|
int ImageIndex = -1;
|
|
|
|
|
|
|
|
|
|
if (rISOFile.GetBitmap().IsOk())
|
|
|
|
|
ImageIndex = m_imageListSmall->Add(rISOFile.GetBitmap());
|
|
|
|
|
|
|
|
|
|
SetItemColumnImage(_Index, COLUMN_BANNER, ImageIndex);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
case COLUMN_TITLE:
|
|
|
|
|
{
|
|
|
|
|
wxString name = StrToWxStr(rISOFile.GetName());
|
|
|
|
|
int disc_number = rISOFile.GetDiscNumber() + 1;
|
|
|
|
|
|
|
|
|
|
if (disc_number > 1 &&
|
|
|
|
|
name.Lower().find(wxString::Format("disc %i", disc_number)) == std::string::npos &&
|
|
|
|
|
name.Lower().find(wxString::Format("disc%i", disc_number)) == std::string::npos)
|
|
|
|
|
{
|
|
|
|
|
name = wxString::Format(_("%s (Disc %i)"), name.c_str(), disc_number);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
SetItem(_Index, COLUMN_TITLE, name, -1);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
case COLUMN_MAKER:
|
|
|
|
|
SetItem(_Index, COLUMN_MAKER, StrToWxStr(rISOFile.GetCompany()), -1);
|
|
|
|
|
break;
|
|
|
|
|
case COLUMN_FILENAME:
|
|
|
|
|
SetItem(_Index, COLUMN_FILENAME,
|
|
|
|
|
wxFileNameFromPath(rISOFile.GetFileName()), -1);
|
|
|
|
|
break;
|
|
|
|
|
case COLUMN_EMULATION_STATE:
|
|
|
|
|
SetItemColumnImage(_Index, COLUMN_EMULATION_STATE,
|
|
|
|
|
m_EmuStateImageIndex[rISOFile.GetEmuState()]);
|
|
|
|
|
break;
|
|
|
|
|
case COLUMN_COUNTRY:
|
|
|
|
|
SetItemColumnImage(_Index, COLUMN_COUNTRY,
|
|
|
|
|
m_FlagImageIndex[rISOFile.GetCountry()]);
|
|
|
|
|
break;
|
|
|
|
|
case COLUMN_SIZE:
|
|
|
|
|
SetItem(_Index, COLUMN_SIZE, NiceSizeFormat(rISOFile.GetFileSize()), -1);
|
|
|
|
|
break;
|
|
|
|
|
case COLUMN_ID:
|
|
|
|
|
SetItem(_Index, COLUMN_ID, rISOFile.GetUniqueID(), -1);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void CGameListCtrl::InsertItemInReportView(long _Index)
|
|
|
|
|
{
|
|
|
|
|
// When using wxListCtrl, there is no hope of per-column text colors.
|
|
|
|
|
// But for reference, here are the old colors that were used: (BGR)
|
|
|
|
|
// title: 0xFF0000
|
|
|
|
|
// company: 0x007030
|
|
|
|
|
int ImageIndex = -1;
|
|
|
|
|
|
|
|
|
|
GameListItem& rISOFile = *m_ISOFiles[_Index];
|
|
|
|
|
|
|
|
|
|
// Insert a first row with nothing in it, that will be used as the Index
|
|
|
|
|
long ItemIndex = InsertItem(_Index, wxEmptyString);
|
|
|
|
|
|
|
|
|
|
// Insert the platform's image in the first (visible) column
|
|
|
|
|
SetItemColumnImage(_Index, COLUMN_PLATFORM, m_PlatformImageIndex[rISOFile.GetPlatform()]);
|
|
|
|
|
|
|
|
|
|
if (rISOFile.GetBitmap().IsOk())
|
|
|
|
|
ImageIndex = m_imageListSmall->Add(rISOFile.GetBitmap());
|
|
|
|
|
|
|
|
|
|
// Set the game's banner in the second column
|
|
|
|
|
SetItemColumnImage(_Index, COLUMN_BANNER, ImageIndex);
|
|
|
|
|
|
|
|
|
|
wxString name = StrToWxStr(rISOFile.GetName());
|
|
|
|
|
|
|
|
|
|
int disc_number = rISOFile.GetDiscNumber() + 1;
|
|
|
|
|
if (disc_number > 1 && name.Lower().find(wxString::Format("disc %i", disc_number)) == std::string::npos
|
|
|
|
|
&& name.Lower().find(wxString::Format("disc%i", disc_number)) == std::string::npos)
|
|
|
|
|
// Iterate over all columns and fill them with content if they are visible
|
|
|
|
|
for (int i = 1; i < NUMBER_OF_COLUMN; i++)
|
|
|
|
|
{
|
|
|
|
|
name = wxString::Format(_("%s (Disc %i)"), name.c_str(), disc_number);
|
|
|
|
|
if (GetColumnWidth(i) != 0)
|
|
|
|
|
UpdateItemAtColumn(_Index, i);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
SetItem(_Index, COLUMN_TITLE, name, -1);
|
|
|
|
|
SetItem(_Index, COLUMN_MAKER, StrToWxStr(rISOFile.GetCompany()), -1);
|
|
|
|
|
|
|
|
|
|
// Emulation state
|
|
|
|
|
SetItemColumnImage(_Index, COLUMN_EMULATION_STATE, m_EmuStateImageIndex[rISOFile.GetEmuState()]);
|
|
|
|
|
|
|
|
|
|
// Country
|
|
|
|
|
SetItemColumnImage(_Index, COLUMN_COUNTRY, m_FlagImageIndex[rISOFile.GetCountry()]);
|
|
|
|
|
|
|
|
|
|
// File size
|
|
|
|
|
SetItem(_Index, COLUMN_SIZE, NiceSizeFormat(rISOFile.GetFileSize()), -1);
|
|
|
|
|
|
|
|
|
|
// Game ID
|
|
|
|
|
SetItem(_Index, COLUMN_ID, rISOFile.GetUniqueID(), -1);
|
|
|
|
|
|
|
|
|
|
// Background color
|
|
|
|
|
SetBackgroundColor();
|
|
|
|
|
|
|
|
|
@ -615,7 +660,9 @@ void CGameListCtrl::ScanForISOs()
|
|
|
|
|
|
|
|
|
|
void CGameListCtrl::OnColBeginDrag(wxListEvent& event)
|
|
|
|
|
{
|
|
|
|
|
if (event.GetColumn() != COLUMN_TITLE && event.GetColumn() != COLUMN_MAKER)
|
|
|
|
|
const int column_id = event.GetColumn();
|
|
|
|
|
|
|
|
|
|
if (column_id != COLUMN_TITLE && column_id != COLUMN_MAKER && column_id != COLUMN_FILENAME)
|
|
|
|
|
event.Veto();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -1273,12 +1320,27 @@ void CGameListCtrl::AutomaticColumnWidth()
|
|
|
|
|
+ GetColumnWidth(COLUMN_EMULATION_STATE));
|
|
|
|
|
|
|
|
|
|
// We hide the Maker column if the window is too small
|
|
|
|
|
if (resizable > 400)
|
|
|
|
|
// Use ShowColumn() instead of SetColumnWidth because
|
|
|
|
|
// the maker column may have been autohidden and the
|
|
|
|
|
// therefore the content needs to be restored.
|
|
|
|
|
if (resizable > 425)
|
|
|
|
|
{
|
|
|
|
|
if (SConfig::GetInstance().m_showMakerColumn)
|
|
|
|
|
if (SConfig::GetInstance().m_showMakerColumn &&
|
|
|
|
|
SConfig::GetInstance().m_showFileNameColumn)
|
|
|
|
|
{
|
|
|
|
|
SetColumnWidth(COLUMN_TITLE, resizable / 3);
|
|
|
|
|
ShowColumn(COLUMN_MAKER, resizable / 3);
|
|
|
|
|
SetColumnWidth(COLUMN_FILENAME, resizable / 3);
|
|
|
|
|
}
|
|
|
|
|
else if (SConfig::GetInstance().m_showMakerColumn)
|
|
|
|
|
{
|
|
|
|
|
SetColumnWidth(COLUMN_TITLE, resizable / 2);
|
|
|
|
|
SetColumnWidth(COLUMN_MAKER, resizable / 2);
|
|
|
|
|
ShowColumn(COLUMN_MAKER, resizable / 2);
|
|
|
|
|
}
|
|
|
|
|
else if (SConfig::GetInstance().m_showFileNameColumn)
|
|
|
|
|
{
|
|
|
|
|
SetColumnWidth(COLUMN_TITLE, resizable / 2);
|
|
|
|
|
SetColumnWidth(COLUMN_FILENAME, resizable / 2);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
@ -1286,13 +1348,55 @@ void CGameListCtrl::AutomaticColumnWidth()
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
if (SConfig::GetInstance().m_showFileNameColumn)
|
|
|
|
|
{
|
|
|
|
|
SetColumnWidth(COLUMN_TITLE, resizable / 2);
|
|
|
|
|
SetColumnWidth(COLUMN_FILENAME, resizable / 2);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
SetColumnWidth(COLUMN_TITLE, resizable);
|
|
|
|
|
SetColumnWidth(COLUMN_MAKER, 0);
|
|
|
|
|
}
|
|
|
|
|
HideColumn(COLUMN_MAKER);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Fills a previously hidden column with items. Acts
|
|
|
|
|
// as a SetColumnWidth if width is nonzero.
|
|
|
|
|
void CGameListCtrl::ShowColumn(int column, int width)
|
|
|
|
|
{
|
|
|
|
|
// Fill the column with items if it was hidden
|
|
|
|
|
if (GetColumnWidth(column) == 0)
|
|
|
|
|
{
|
|
|
|
|
for (int i = 0; i < GetItemCount(); i++)
|
|
|
|
|
{
|
|
|
|
|
UpdateItemAtColumn(i, column);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
SetColumnWidth(column, width);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Hide the passed column from the gamelist.
|
|
|
|
|
// It is not enough to set the width to zero because this leads to
|
|
|
|
|
// graphical glitches where the content of the hidden column is
|
|
|
|
|
// squeezed into the next column. Therefore we need to clear the
|
|
|
|
|
// items, too.
|
|
|
|
|
void CGameListCtrl::HideColumn(int column)
|
|
|
|
|
{
|
|
|
|
|
// Do nothing if the column is already hidden
|
|
|
|
|
if (GetColumnWidth(column) == 0)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
// Remove the items from the column
|
|
|
|
|
for (int i = 0; i < GetItemCount(); i++)
|
|
|
|
|
{
|
|
|
|
|
SetItem(i, column, "", -1);
|
|
|
|
|
}
|
|
|
|
|
SetColumnWidth(column, 0);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void CGameListCtrl::UnselectAll()
|
|
|
|
|
{
|
|
|
|
|
for (int i = 0; i < GetItemCount(); i++)
|
|
|
|
|