Use GetClientRect in the GameListCtrl OnSize function, but removed the +5 padding. This seems to look best on windows and linux. Unfortunately wxWidgets on linux doesn't account for visibility of the vertical scrollbar in this or any calculation I have found.

Also fixed an issue with the saving of the log/console window size.


git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@6013 8ced0084-cf51-0410-be5f-012b33b47a6e
This commit is contained in:
Glenn Rice 2010-07-31 14:14:01 +00:00
parent c88689381f
commit 840bd3613f
4 changed files with 358 additions and 260 deletions

View File

@ -597,7 +597,7 @@ void CFrame::OnDropDownToolbarSelect(wxCommandEvent& event)
Tmp.Name = dlg.GetValue().mb_str();
Tmp.Perspective = m_Mgr->SavePerspective();
ActivePerspective = Perspectives.size();
ActivePerspective = (u32)Perspectives.size();
Perspectives.push_back(Tmp);
UpdateCurrentPerspective();

View File

@ -60,32 +60,50 @@ bool operator < (const GameListItem &one, const GameListItem &other)
switch (one.GetCountry())
{
case DiscIO::IVolume::COUNTRY_JAPAN:;
case DiscIO::IVolume::COUNTRY_USA:indexOne = 0; break;
default: indexOne = (int)SConfig::GetInstance().m_InterfaceLanguage;
case DiscIO::IVolume::COUNTRY_JAPAN:
case DiscIO::IVolume::COUNTRY_USA:
indexOne = 0;
break;
default:
indexOne = SConfig::GetInstance().m_InterfaceLanguage;
}
switch (other.GetCountry())
{
case DiscIO::IVolume::COUNTRY_JAPAN:;
case DiscIO::IVolume::COUNTRY_USA:indexOther = 0; break;
default: indexOther = (int)SConfig::GetInstance().m_InterfaceLanguage;
case DiscIO::IVolume::COUNTRY_JAPAN:
case DiscIO::IVolume::COUNTRY_USA:
indexOther = 0;
break;
default:
indexOther = SConfig::GetInstance().m_InterfaceLanguage;
}
switch(currentColumn)
{
case CGameListCtrl::COLUMN_TITLE: return strcasecmp(one.GetName(indexOne).c_str(), other.GetName(indexOther).c_str()) < 0;
case CGameListCtrl::COLUMN_NOTES:
{
// On Gamecube we show the company string, while it's empty on other platforms, so we show the description instead
std::string cmp1 = (one.GetPlatform() == GameListItem::GAMECUBE_DISC) ? one.GetCompany() : one.GetDescription(indexOne);
std::string cmp2 = (other.GetPlatform() == GameListItem::GAMECUBE_DISC) ? other.GetCompany() : other.GetDescription(indexOther);
return strcasecmp(cmp1.c_str(), cmp2.c_str()) < 0;
}
case CGameListCtrl::COLUMN_COUNTRY: return (one.GetCountry() < other.GetCountry());
case CGameListCtrl::COLUMN_SIZE: return (one.GetFileSize() < other.GetFileSize());
case CGameListCtrl::COLUMN_PLATFORM: return (one.GetPlatform() < other.GetPlatform());
default: return strcasecmp(one.GetName(indexOne).c_str(), other.GetName(indexOther).c_str()) < 0;
case CGameListCtrl::COLUMN_TITLE:
return strcasecmp(one.GetName(indexOne).c_str(),
other.GetName(indexOther).c_str()) < 0;
case CGameListCtrl::COLUMN_NOTES:
{
// On Gamecube we show the company string, while it's empty on
// other platforms, so we show the description instead
std::string cmp1 =
(one.GetPlatform() == GameListItem::GAMECUBE_DISC) ?
one.GetCompany() : one.GetDescription(indexOne);
std::string cmp2 =
(other.GetPlatform() == GameListItem::GAMECUBE_DISC) ?
other.GetCompany() : other.GetDescription(indexOther);
return strcasecmp(cmp1.c_str(), cmp2.c_str()) < 0;
}
case CGameListCtrl::COLUMN_COUNTRY:
return (one.GetCountry() < other.GetCountry());
case CGameListCtrl::COLUMN_SIZE:
return (one.GetFileSize() < other.GetFileSize());
case CGameListCtrl::COLUMN_PLATFORM:
return (one.GetPlatform() < other.GetPlatform());
default:
return strcasecmp(one.GetName(indexOne).c_str(),
other.GetName(indexOther).c_str()) < 0;
}
}
@ -118,7 +136,8 @@ BEGIN_EVENT_TABLE(CGameListCtrl, wxListCtrl)
END_EVENT_TABLE()
CGameListCtrl::CGameListCtrl(wxWindow* parent, const wxWindowID id, const wxPoint& pos, const wxSize& size, long style)
CGameListCtrl::CGameListCtrl(wxWindow* parent, const wxWindowID id, const
wxPoint& pos, const wxSize& size, long style)
: wxListCtrl(parent, id, pos, size, style), toolTip(0)
{
}
@ -183,14 +202,15 @@ void CGameListCtrl::BrowseForDirectory()
wxGetHomeDir(&dirHome);
// browse
wxDirDialog dialog(this, _("Browse for a directory to add"), dirHome, wxDD_DEFAULT_STYLE | wxDD_DIR_MUST_EXIST);
wxDirDialog dialog(this, _("Browse for a directory to add"), dirHome,
wxDD_DEFAULT_STYLE | wxDD_DIR_MUST_EXIST);
if (dialog.ShowModal() == wxID_OK)
{
std::string sPath(dialog.GetPath().mb_str());
std::vector<std::string>::iterator itResult = std::find(
SConfig::GetInstance().m_ISOFolder.begin(), SConfig::GetInstance().m_ISOFolder.end(), sPath
);
SConfig::GetInstance().m_ISOFolder.begin(),
SConfig::GetInstance().m_ISOFolder.end(), sPath);
if (itResult == SConfig::GetInstance().m_ISOFolder.end())
{
@ -234,8 +254,9 @@ void CGameListCtrl::Update()
InsertColumn(COLUMN_BANNER, _("Banner"));
InsertColumn(COLUMN_TITLE, _("Title"));
// Instead of showing the notes + the company, which is unknown with wii titles
// We show in the same column : company for GC games and description for wii/wad games
// Instead of showing the notes + the company, which is unknown with
// wii titles We show in the same column : company for GC games and
// description for wii/wad games
InsertColumn(COLUMN_NOTES, _("Notes"));
InsertColumn(COLUMN_COUNTRY, _(""));
InsertColumn(COLUMN_SIZE, _("Size"));
@ -268,8 +289,9 @@ void CGameListCtrl::Update()
else
{
wxString errorString;
// We just check for one hide setting to be enabled, as we may only have GC games
// for example, and hide them, so we should show the second message instead
// We just check for one hide setting to be enabled, as we may only
// have GC games for example, and hide them, so we should show the
// second message instead
if ((SConfig::GetInstance().m_ListGC &&
SConfig::GetInstance().m_ListWii &&
SConfig::GetInstance().m_ListWad) &&
@ -277,11 +299,13 @@ void CGameListCtrl::Update()
SConfig::GetInstance().m_ListUsa &&
SConfig::GetInstance().m_ListPal))
{
errorString = _("Dolphin could not find any GC/Wii ISOs. Doubleclick here to browse for files...");
errorString = wxT("Dolphin could not find any GC/Wii ISOs. ")
wxT("Doubleclick here to browse for files...");
}
else
{
errorString = _("Dolphin is currently set to hide all games. Doubleclick here to show all games...");
errorString = wxT("Dolphin is currently set to hide all games. ")
wxT("Doubleclick here to show all games...");
}
InsertColumn(0, _("No ISOs or WADS found"));
long index = InsertItem(0, errorString);
@ -342,7 +366,8 @@ void CGameListCtrl::OnPaintDrawImages(wxPaintEvent& event)
{
// Retrieve the topmost shown item and get drawing offsets
long top = GetTopItem();
int flagOffset = GetColumnWidth(0) + GetColumnWidth(1) + GetColumnWidth(2) + GetColumnWidth(3);
int flagOffset = GetColumnWidth(0) + GetColumnWidth(1) +
GetColumnWidth(2) + GetColumnWidth(3);
int stateOffset = flagOffset + GetColumnWidth(4) + GetColumnWidth(5);
// Only redraw shown lines
@ -353,12 +378,16 @@ void CGameListCtrl::OnPaintDrawImages(wxPaintEvent& event)
int itemY = itemRect.GetTop();
const GameListItem& rISOFile = m_ISOFiles[GetItemData(i)];
m_imageListSmall->Draw(m_PlatformImageIndex[rISOFile.GetPlatform()], dc, itemRect.GetX()+3, itemY);
m_imageListSmall->Draw(m_FlagImageIndex[rISOFile.GetCountry()], dc, flagOffset, itemY);
m_imageListSmall->Draw(m_PlatformImageIndex[rISOFile.GetPlatform()],
dc, itemRect.GetX()+3, itemY);
m_imageListSmall->Draw(m_FlagImageIndex[rISOFile.GetCountry()],
dc, flagOffset, itemY);
ini.Load((std::string(File::GetUserPath(D_GAMECONFIG_IDX)) + (rISOFile.GetUniqueID()) + ".ini").c_str());
ini.Load((std::string(File::GetUserPath(D_GAMECONFIG_IDX)) +
(rISOFile.GetUniqueID()) + ".ini").c_str());
ini.Get("EmuState", "EmulationStateId", &nState);
m_imageListSmall->Draw(m_EmuStateImageIndex[nState], dc, stateOffset, itemY);
m_imageListSmall->Draw(m_EmuStateImageIndex[nState],
dc, stateOffset, itemY);
}
}
}
@ -382,7 +411,8 @@ void CGameListCtrl::InsertItemInReportView(long _Index)
// Insert a first row with the platform image, that will be used as the Index
#ifndef _WIN32
long ItemIndex = InsertItem(_Index, wxEmptyString, m_PlatformImageIndex[rISOFile.GetPlatform()]);
long ItemIndex = InsertItem(_Index, wxEmptyString,
m_PlatformImageIndex[rISOFile.GetPlatform()]);
#else
long ItemIndex = InsertItem(_Index, wxEmptyString, -1);
#endif
@ -408,9 +438,11 @@ void CGameListCtrl::InsertItemInReportView(long _Index)
case DiscIO::IVolume::COUNTRY_JAPAN:
{
wxString name = wxString(rISOFile.GetName(0).c_str(), SJISConv);
m_gameList.append(StringFromFormat("%s (J)\n", (const char*)name.c_str()));
m_gameList.append(StringFromFormat("%s (J)\n", name.c_str()));
SetItem(_Index, COLUMN_TITLE, name, -1);
SetItem(_Index, COLUMN_NOTES, wxString(company.size() ? company.c_str() : rISOFile.GetDescription(0).c_str(), SJISConv), -1);
SetItem(_Index, COLUMN_NOTES, wxString(company.size() ?
company.c_str() : rISOFile.GetDescription(0).c_str(),
SJISConv), -1);
}
break;
case DiscIO::IVolume::COUNTRY_USA:
@ -418,28 +450,38 @@ void CGameListCtrl::InsertItemInReportView(long _Index)
SetItem(_Index, COLUMN_TITLE,
wxString::From8BitData(rISOFile.GetName(0).c_str()), -1);
SetItem(_Index, COLUMN_NOTES,
wxString::From8BitData(company.size() ? company.c_str() : rISOFile.GetDescription(0).c_str()), -1);
wxString::From8BitData(company.size() ?
company.c_str() : rISOFile.GetDescription(0).c_str()), -1);
break;
default:
m_gameList.append(StringFromFormat("%s (E)\n", rISOFile.GetName((int)SConfig::GetInstance().m_InterfaceLanguage).c_str()));
m_gameList.append(StringFromFormat("%s (E)\n",
rISOFile.GetName(SConfig::GetInstance().m_InterfaceLanguage).c_str()));
SetItem(_Index, COLUMN_TITLE,
wxString::From8BitData(rISOFile.GetName((int)SConfig::GetInstance().m_InterfaceLanguage).c_str()), -1);
SetItem(_Index, COLUMN_NOTES, wxString::From8BitData(
company.size() ? company.c_str() : rISOFile.GetDescription((int)SConfig::GetInstance().m_InterfaceLanguage).c_str()), -1);
wxString::From8BitData(
rISOFile.GetName(SConfig::GetInstance().m_InterfaceLanguage).c_str()),
-1);
SetItem(_Index, COLUMN_NOTES,
wxString::From8BitData(company.size() ?
company.c_str() :
rISOFile.GetDescription(SConfig::GetInstance().m_InterfaceLanguage).c_str()),
-1);
break;
}
}
else // It's a Wad file
{
m_gameList.append(StringFromFormat("%s (WAD)\n", rISOFile.GetName(0).c_str()));
SetItem(_Index, COLUMN_TITLE, wxString(rISOFile.GetName(0).c_str(), SJISConv), -1);
SetItem(_Index, COLUMN_NOTES, wxString(rISOFile.GetDescription(0).c_str(), SJISConv), -1);
SetItem(_Index, COLUMN_TITLE,
wxString(rISOFile.GetName(0).c_str(), SJISConv), -1);
SetItem(_Index, COLUMN_NOTES,
wxString(rISOFile.GetDescription(0).c_str(), SJISConv), -1);
}
#ifndef _WIN32
// Load the INI file for columns that read from it
IniFile ini;
ini.Load((std::string(File::GetUserPath(D_GAMECONFIG_IDX)) + (rISOFile.GetUniqueID()) + ".ini").c_str());
ini.Load((std::string(File::GetUserPath(D_GAMECONFIG_IDX)) +
(rISOFile.GetUniqueID()) + ".ini").c_str());
// Emulation status
int nState;
@ -476,7 +518,10 @@ void CGameListCtrl::SetBackgroundColor()
{
for(long i = 0; i < GetItemCount(); i++)
{
wxColour color = (i & 1) ? blend50(wxSystemSettings::GetColour(wxSYS_COLOUR_3DLIGHT), wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW)) : wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW);
wxColour color = (i & 1) ?
blend50(wxSystemSettings::GetColour(wxSYS_COLOUR_3DLIGHT),
wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW)) :
wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW);
CGameListCtrl::SetItemBackgroundColour(i, color);
}
}
@ -501,14 +546,16 @@ void CGameListCtrl::ScanForISOs()
for (u32 k = 0; k < Directories.size(); k++)
{
NormalizeDirSep(&Directories.at(k));
if (strcmp(Directories.at(k).c_str(), FST_Temp.children.at(j).physicalName.c_str()) == 0)
if (strcmp(Directories.at(k).c_str(),
FST_Temp.children.at(j).physicalName.c_str()) == 0)
{
duplicate = true;
break;
}
}
if (!duplicate)
Directories.push_back(FST_Temp.children.at(j).physicalName.c_str());
Directories.push_back(
FST_Temp.children.at(j).physicalName.c_str());
}
}
}
@ -536,7 +583,6 @@ void CGameListCtrl::ScanForISOs()
(int)rFilenames.size(), // range
this, // parent
wxPD_APP_MODAL |
// wxPD_AUTO_HIDE | -- try this as well
wxPD_ELAPSED_TIME |
wxPD_ESTIMATED_TIME |
wxPD_REMAINING_TIME |
@ -559,9 +605,7 @@ void CGameListCtrl::ScanForISOs()
// Update with the progress (i) and the message (msg)
bool Cont = dialog.Update(i, msg);
if (!Cont)
{
break;
}
#endif
GameListItem ISOFile(rFilenames[i]);
if (ISOFile.IsValid())
@ -570,52 +614,53 @@ void CGameListCtrl::ScanForISOs()
switch(ISOFile.GetPlatform())
{
case GameListItem::WII_DISC:
if (!SConfig::GetInstance().m_ListWii)
list = false;
break;
case GameListItem::WII_WAD:
if (!SConfig::GetInstance().m_ListWad)
list = false;
break;
default:
if (!SConfig::GetInstance().m_ListGC)
list = false;
break;
case GameListItem::WII_DISC:
if (!SConfig::GetInstance().m_ListWii)
list = false;
break;
case GameListItem::WII_WAD:
if (!SConfig::GetInstance().m_ListWad)
list = false;
break;
default:
if (!SConfig::GetInstance().m_ListGC)
list = false;
break;
}
switch(ISOFile.GetCountry())
{
case DiscIO::IVolume::COUNTRY_TAIWAN:
if (!SConfig::GetInstance().m_ListTaiwan)
list = false;
case DiscIO::IVolume::COUNTRY_KOREA:
if (!SConfig::GetInstance().m_ListKorea)
list = false;
break;
case DiscIO::IVolume::COUNTRY_JAPAN:
if (!SConfig::GetInstance().m_ListJap)
list = false;
break;
case DiscIO::IVolume::COUNTRY_USA:
if (!SConfig::GetInstance().m_ListUsa)
list = false;
break;
case DiscIO::IVolume::COUNTRY_FRANCE:
if (!SConfig::GetInstance().m_ListFrance)
list = false;
break;
case DiscIO::IVolume::COUNTRY_ITALY:
if (!SConfig::GetInstance().m_ListItaly)
list = false;
break;
default:
if (!SConfig::GetInstance().m_ListPal)
list = false;
break;
case DiscIO::IVolume::COUNTRY_TAIWAN:
if (!SConfig::GetInstance().m_ListTaiwan)
list = false;
case DiscIO::IVolume::COUNTRY_KOREA:
if (!SConfig::GetInstance().m_ListKorea)
list = false;
break;
case DiscIO::IVolume::COUNTRY_JAPAN:
if (!SConfig::GetInstance().m_ListJap)
list = false;
break;
case DiscIO::IVolume::COUNTRY_USA:
if (!SConfig::GetInstance().m_ListUsa)
list = false;
break;
case DiscIO::IVolume::COUNTRY_FRANCE:
if (!SConfig::GetInstance().m_ListFrance)
list = false;
break;
case DiscIO::IVolume::COUNTRY_ITALY:
if (!SConfig::GetInstance().m_ListItaly)
list = false;
break;
default:
if (!SConfig::GetInstance().m_ListPal)
list = false;
break;
}
if (list) m_ISOFiles.push_back(ISOFile);
if (list)
m_ISOFiles.push_back(ISOFile);
}
}
}
@ -628,7 +673,8 @@ void CGameListCtrl::ScanForISOs()
for (u32 i = 0; i < drives.size() && i < 24; i++)
{
Drive[i] = new GameListItem(drives[i].c_str());
if (Drive[i]->IsValid()) m_ISOFiles.push_back(*Drive[i]);
if (Drive[i]->IsValid())
m_ISOFiles.push_back(*Drive[i]);
}
}
@ -649,9 +695,9 @@ const GameListItem *CGameListCtrl::GetISO(int index) const
CGameListCtrl *caller;
int wxCALLBACK wxListCompare(long item1, long item2, long sortData)
{
//return 1 if item1 > item2
//return -1 if item1 < item2
//0 for identity
// return 1 if item1 > item2
// return -1 if item1 < item2
// return 0 for identity
const GameListItem *iso1 = caller->GetISO(item1);
const GameListItem *iso2 = caller->GetISO(item2);
@ -668,53 +714,75 @@ int wxCALLBACK wxListCompare(long item1, long item2, long sortData)
switch (iso1->GetCountry())
{
case DiscIO::IVolume::COUNTRY_JAPAN:;
case DiscIO::IVolume::COUNTRY_USA:indexOne = 0; break;
default: indexOne = (int)SConfig::GetInstance().m_InterfaceLanguage;
case DiscIO::IVolume::COUNTRY_JAPAN:
case DiscIO::IVolume::COUNTRY_USA:
indexOne = 0;
break;
default:
indexOne = SConfig::GetInstance().m_InterfaceLanguage;
}
switch (iso2->GetCountry())
{
case DiscIO::IVolume::COUNTRY_JAPAN:;
case DiscIO::IVolume::COUNTRY_USA:indexOther = 0; break;
default: indexOther = (int)SConfig::GetInstance().m_InterfaceLanguage;
case DiscIO::IVolume::COUNTRY_JAPAN:
case DiscIO::IVolume::COUNTRY_USA:
indexOther = 0;
break;
default:
indexOther = SConfig::GetInstance().m_InterfaceLanguage;
}
switch(sortData)
{
case CGameListCtrl::COLUMN_TITLE:
return strcasecmp(iso1->GetName(indexOne).c_str(),iso2->GetName(indexOther).c_str()) *t;
case CGameListCtrl::COLUMN_NOTES:
{
std::string cmp1 = (iso1->GetPlatform() == GameListItem::GAMECUBE_DISC) ? iso1->GetCompany() : iso1->GetDescription(indexOne);
std::string cmp2 = (iso2->GetPlatform() == GameListItem::GAMECUBE_DISC) ? iso2->GetCompany() : iso2->GetDescription(indexOther);
return strcasecmp(cmp1.c_str(), cmp2.c_str()) *t;
}
case CGameListCtrl::COLUMN_COUNTRY:
if(iso1->GetCountry() > iso2->GetCountry()) return 1 *t;
if(iso1->GetCountry() < iso2->GetCountry()) return -1 *t;
return 0;
case CGameListCtrl::COLUMN_SIZE:
if (iso1->GetFileSize() > iso2->GetFileSize()) return 1 *t;
if (iso1->GetFileSize() < iso2->GetFileSize()) return -1 *t;
return 0;
case CGameListCtrl::COLUMN_PLATFORM:
if(iso1->GetPlatform() > iso2->GetPlatform()) return 1 *t;
if(iso1->GetPlatform() < iso2->GetPlatform()) return -1 *t;
return 0;
case CGameListCtrl::COLUMN_EMULATION_STATE:
IniFile ini; int nState1 = 0, nState2 = 0;
std::string GameIni1 = std::string(File::GetUserPath(D_GAMECONFIG_IDX)) + iso1->GetUniqueID() + ".ini";
std::string GameIni2 = std::string(File::GetUserPath(D_GAMECONFIG_IDX)) + iso2->GetUniqueID() + ".ini";
case CGameListCtrl::COLUMN_TITLE:
return strcasecmp(iso1->GetName(indexOne).c_str(),
iso2->GetName(indexOther).c_str()) * t;
case CGameListCtrl::COLUMN_NOTES:
{
std::string cmp1 =
(iso1->GetPlatform() == GameListItem::GAMECUBE_DISC) ?
iso1->GetCompany() : iso1->GetDescription(indexOne);
std::string cmp2 =
(iso2->GetPlatform() == GameListItem::GAMECUBE_DISC) ?
iso2->GetCompany() : iso2->GetDescription(indexOther);
return strcasecmp(cmp1.c_str(), cmp2.c_str()) * t;
}
case CGameListCtrl::COLUMN_COUNTRY:
if(iso1->GetCountry() > iso2->GetCountry())
return 1 * t;
if(iso1->GetCountry() < iso2->GetCountry())
return -1 * t;
return 0;
case CGameListCtrl::COLUMN_SIZE:
if (iso1->GetFileSize() > iso2->GetFileSize())
return 1 * t;
if (iso1->GetFileSize() < iso2->GetFileSize())
return -1 * t;
return 0;
case CGameListCtrl::COLUMN_PLATFORM:
if(iso1->GetPlatform() > iso2->GetPlatform())
return 1 * t;
if(iso1->GetPlatform() < iso2->GetPlatform())
return -1 * t;
return 0;
case CGameListCtrl::COLUMN_EMULATION_STATE:
IniFile ini;
int nState1 = 0, nState2 = 0;
std::string GameIni1 = std::string(File::GetUserPath(D_GAMECONFIG_IDX)) +
iso1->GetUniqueID() + ".ini";
std::string GameIni2 = std::string(File::GetUserPath(D_GAMECONFIG_IDX)) +
iso2->GetUniqueID() + ".ini";
ini.Load(GameIni1.c_str());
ini.Get("EmuState", "EmulationStateId", &nState1);
ini.Load(GameIni2.c_str());
ini.Get("EmuState", "EmulationStateId", &nState2);
ini.Load(GameIni1.c_str());
ini.Get("EmuState", "EmulationStateId", &nState1);
ini.Load(GameIni2.c_str());
ini.Get("EmuState", "EmulationStateId", &nState2);
if(nState1 > nState2) return 1 *t;
if(nState1 < nState2) return -1 *t;
return 0;
if(nState1 > nState2)
return 1 * t;
if(nState1 < nState2)
return -1 * t;
return 0;
}
return 0;
@ -778,12 +846,14 @@ void CGameListCtrl::OnKeyPress(wxListEvent& event)
sLoop++;
UnselectAll();
SetItemState(i, wxLIST_STATE_SELECTED|wxLIST_STATE_FOCUSED, wxLIST_STATE_SELECTED|wxLIST_STATE_FOCUSED);
SetItemState(i, wxLIST_STATE_SELECTED|wxLIST_STATE_FOCUSED,
wxLIST_STATE_SELECTED|wxLIST_STATE_FOCUSED);
EnsureVisible(i);
break;
}
// If we get past the last game in the list, we'll have to go back to the first one.
// If we get past the last game in the list,
// we'll have to go back to the first one.
if (i+1 == (int)m_ISOFiles.size() && sLoop > 0 && Loop > 0)
i = -1;
}
@ -794,7 +864,8 @@ void CGameListCtrl::OnKeyPress(wxListEvent& event)
// This shows a little tooltip with the current Game's emulation state
void CGameListCtrl::OnMouseMotion(wxMouseEvent& event)
{
int flags; long subitem = 0;
int flags;
long subitem = 0;
long item = HitTest(event.GetPosition(), flags, &subitem);
static int lastItem = -1;
@ -802,7 +873,8 @@ void CGameListCtrl::OnMouseMotion(wxMouseEvent& event)
{
if (subitem == COLUMN_EMULATION_STATE)
{
if (toolTip || lastItem == item || this != FindFocus()) {
if (toolTip || lastItem == item || this != FindFocus())
{
event.Skip();
return;
}
@ -810,10 +882,18 @@ void CGameListCtrl::OnMouseMotion(wxMouseEvent& event)
const GameListItem& rISO = m_ISOFiles[GetItemData(item)];
IniFile ini;
ini.Load((std::string(File::GetUserPath(D_GAMECONFIG_IDX)) + (rISO.GetUniqueID()) + ".ini").c_str());
ini.Load((std::string(File::GetUserPath(D_GAMECONFIG_IDX)) +
(rISO.GetUniqueID()) + ".ini").c_str());
// Emulation status
std::string emuState[5] = {"Broken", "Intro", "In-Game", "Playable", "Perfect"}, issues;
std::string emuState[5] = {
"Broken",
"Intro",
"In-Game",
"Playable",
"Perfect"
};
std::string issues;
int nState;
ini.Get("EmuState", "EmulationStateId", &nState);
@ -830,14 +910,17 @@ void CGameListCtrl::OnMouseMotion(wxMouseEvent& event)
if (nState > 0 && nState < 6)
{
char temp[2048];
sprintf(temp, "^ %s%s%s", emuState[nState -1].c_str(), issues.size() > 0 ? " :\n" : "", issues.c_str());
sprintf(temp, "^ %s%s%s", emuState[nState -1].c_str(),
issues.size() > 0 ? " :\n" : "", issues.c_str());
toolTip = new wxEmuStateTip(this, wxString(temp, *wxConvCurrent), &toolTip);
}
else
toolTip = new wxEmuStateTip(this, wxT("Not Set"), &toolTip);
toolTip->SetBoundingRect(wxRect(mx - GetColumnWidth(subitem), my, GetColumnWidth(subitem), Rect.GetHeight()));
toolTip->SetPosition(wxPoint(mx - GetColumnWidth(subitem), my - 5 + Rect.GetHeight()));
toolTip->SetBoundingRect(wxRect(mx - GetColumnWidth(subitem),
my, GetColumnWidth(subitem), Rect.GetHeight()));
toolTip->SetPosition(wxPoint(mx - GetColumnWidth(subitem),
my - 5 + Rect.GetHeight()));
lastItem = item;
}
@ -850,8 +933,9 @@ void CGameListCtrl::OnLeftClick(wxMouseEvent& event)
{
// Focus the clicked item.
int flags;
long item = HitTest(event.GetPosition(), flags);
if ((item != wxNOT_FOUND) && (GetSelectedItemCount() == 0) && (!event.ControlDown()) && (!event.ShiftDown()))
long item = HitTest(event.GetPosition(), flags);
if ((item != wxNOT_FOUND) && (GetSelectedItemCount() == 0) &&
(!event.ControlDown()) && (!event.ShiftDown()))
{
SetItemState(item, wxLIST_STATE_SELECTED, wxLIST_STATE_SELECTED );
SetItemState(item, wxLIST_STATE_FOCUSED, wxLIST_STATE_FOCUSED);
@ -865,7 +949,7 @@ void CGameListCtrl::OnRightClick(wxMouseEvent& event)
{
// Focus the clicked item.
int flags;
long item = HitTest(event.GetPosition(), flags);
long item = HitTest(event.GetPosition(), flags);
if (item != wxNOT_FOUND)
{
if (GetItemState(item, wxLIST_STATE_SELECTED) != wxLIST_STATE_SELECTED)
@ -927,13 +1011,9 @@ void CGameListCtrl::OnRightClick(wxMouseEvent& event)
const GameListItem * CGameListCtrl::GetSelectedISO()
{
if (m_ISOFiles.size() == 0)
{
return NULL;
}
else if (GetSelectedItemCount() == 0)
{
return NULL;
}
else
{
long item = GetNextItem(-1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
@ -991,27 +1071,26 @@ void CGameListCtrl::OnExportSave(wxCommandEvent& WXUNUSED (event))
}
}
// =======================================================
// Save this file as the default file
// -------------
void CGameListCtrl::OnSetDefaultGCM(wxCommandEvent& event)
{
const GameListItem *iso = GetSelectedISO();
if (!iso) return;
if (event.IsChecked()) // Write the new default value and save it the ini file
if (event.IsChecked())
{
SConfig::GetInstance().m_LocalCoreStartupParameter.m_strDefaultGCM = iso->GetFileName();
// Write the new default value and save it the ini file
SConfig::GetInstance().m_LocalCoreStartupParameter.m_strDefaultGCM =
iso->GetFileName();
SConfig::GetInstance().SaveSettings();
}
else // Othwerise blank the value and save it
else
{
// Othwerise blank the value and save it
SConfig::GetInstance().m_LocalCoreStartupParameter.m_strDefaultGCM = "";
SConfig::GetInstance().SaveSettings();
}
}
// =============
void CGameListCtrl::OnDeleteGCM(wxCommandEvent& WXUNUSED (event))
{
@ -1020,8 +1099,9 @@ void CGameListCtrl::OnDeleteGCM(wxCommandEvent& WXUNUSED (event))
const GameListItem *iso = GetSelectedISO();
if (!iso)
return;
if (wxMessageBox(_("Are you sure you want to delete this file?\nIt will be gone forever!"),
wxMessageBoxCaptionStr, wxYES_NO | wxICON_EXCLAMATION) == wxYES)
if (wxMessageBox(wxT("Are you sure you want to delete this file?\n")
wxT("It will be gone forever!"),
wxMessageBoxCaptionStr, wxYES_NO | wxICON_EXCLAMATION) == wxYES)
{
File::Delete(iso->GetFileName().c_str());
Update();
@ -1029,8 +1109,9 @@ void CGameListCtrl::OnDeleteGCM(wxCommandEvent& WXUNUSED (event))
}
else
{
if (wxMessageBox(_("Are you sure you want to delete these files?\nThey will be gone forever!"),
wxMessageBoxCaptionStr, wxYES_NO | wxICON_EXCLAMATION) == wxYES)
if (wxMessageBox(wxT("Are you sure you want to delete these files?\n")
wxT("They will be gone forever!"),
wxMessageBoxCaptionStr, wxYES_NO | wxICON_EXCLAMATION) == wxYES)
{
int selected = GetSelectedItemCount();
@ -1066,7 +1147,6 @@ void CGameListCtrl::OnInstallWAD(wxCommandEvent& WXUNUSED (event))
1000, // range
this, // parent
wxPD_APP_MODAL |
// wxPD_AUTO_HIDE | -- try this as well
wxPD_ELAPSED_TIME |
wxPD_ESTIMATED_TIME |
wxPD_REMAINING_TIME |
@ -1081,9 +1161,11 @@ void CGameListCtrl::OnInstallWAD(wxCommandEvent& WXUNUSED (event))
void CGameListCtrl::MultiCompressCB(const char* text, float percent, void* arg)
{
percent = (((float)m_currentItem) + percent) / (float)m_numberItem;
wxString textString(StringFromFormat("%s (%i/%i) - %s", m_currentFilename.c_str(), (int)m_currentItem+1, (int)m_numberItem, text).c_str(), *wxConvCurrent);
wxString textString(StringFromFormat("%s (%i/%i) - %s",
m_currentFilename.c_str(), (int)m_currentItem+1,
(int)m_numberItem, text).c_str(), *wxConvCurrent);
((wxProgressDialog*)arg)->Update((int)(percent*1000), textString);
((wxProgressDialog*)arg)->Update((int)(percent*1000), textString);
}
void CGameListCtrl::OnMultiCompressGCM(wxCommandEvent& /*event*/)
@ -1101,21 +1183,22 @@ void CGameListCtrl::CompressSelection(bool _compress)
wxString dirHome;
wxGetHomeDir(&dirHome);
wxDirDialog browseDialog(this, _("Browse for output directory"), dirHome, wxDD_DEFAULT_STYLE | wxDD_DIR_MUST_EXIST);
wxDirDialog browseDialog(this, _("Browse for output directory"), dirHome,
wxDD_DEFAULT_STYLE | wxDD_DIR_MUST_EXIST);
if (browseDialog.ShowModal() != wxID_OK)
return;
wxProgressDialog progressDialog(_compress ? _("Compressing ISO") : _("Decompressing ISO"),
_("Working..."),
1000, // range
this, // parent
wxPD_APP_MODAL |
// wxPD_AUTO_HIDE | -- try this as well
wxPD_ELAPSED_TIME |
wxPD_ESTIMATED_TIME |
wxPD_REMAINING_TIME |
wxPD_SMOOTH // - makes indeterminate mode bar on WinXP very small
);
wxProgressDialog progressDialog(_compress ?
_("Compressing ISO") : _("Decompressing ISO"),
_("Working..."),
1000, // range
this, // parent
wxPD_APP_MODAL |
wxPD_ELAPSED_TIME |
wxPD_ESTIMATED_TIME |
wxPD_REMAINING_TIME |
wxPD_SMOOTH // - makes indeterminate mode bar on WinXP very small
);
progressDialog.SetSize(wxSize(600, 180));
progressDialog.CenterOnParent();
@ -1134,9 +1217,14 @@ void CGameListCtrl::CompressSelection(bool _compress)
FileName.append(".gcz");
std::string OutputFileName;
BuildCompleteFilename(OutputFileName, (const char *)browseDialog.GetPath().mb_str(wxConvUTF8), FileName);
BuildCompleteFilename(OutputFileName,
(const char *)browseDialog.GetPath().mb_str(wxConvUTF8),
FileName);
DiscIO::CompressFileToBlob(iso->GetFileName().c_str(), OutputFileName.c_str(), (iso->GetPlatform() == GameListItem::WII_DISC) ? 1 : 0, 16384, &MultiCompressCB, &progressDialog);
DiscIO::CompressFileToBlob(iso->GetFileName().c_str(),
OutputFileName.c_str(),
(iso->GetPlatform() == GameListItem::WII_DISC) ? 1 : 0,
16384, &MultiCompressCB, &progressDialog);
}
else if (iso->IsCompressed() && !_compress)
{
@ -1144,18 +1232,17 @@ void CGameListCtrl::CompressSelection(bool _compress)
SplitPath(iso->GetFileName(), NULL, &FileName, NULL);
m_currentFilename = FileName;
if (iso->GetPlatform() == GameListItem::WII_DISC)
{
FileName.append(".iso");
}
else
{
FileName.append(".gcm");
}
std::string OutputFileName;
BuildCompleteFilename(OutputFileName, (const char *)browseDialog.GetPath().mb_str(wxConvUTF8), FileName);
BuildCompleteFilename(OutputFileName,
(const char *)browseDialog.GetPath().mb_str(wxConvUTF8),
FileName);
DiscIO::DecompressBlobToFile(iso->GetFileName().c_str(), OutputFileName.c_str(), &MultiCompressCB, &progressDialog);
DiscIO::DecompressBlobToFile(iso->GetFileName().c_str(),
OutputFileName.c_str(), &MultiCompressCB, &progressDialog);
}
m_currentItem++;
}
@ -1164,7 +1251,8 @@ void CGameListCtrl::CompressSelection(bool _compress)
void CGameListCtrl::CompressCB(const char* text, float percent, void* arg)
{
((wxProgressDialog*)arg)->Update((int)(percent*1000), wxString(text, *wxConvCurrent));
((wxProgressDialog*)arg)->
Update((int)(percent*1000), wxString(text, *wxConvCurrent));
}
void CGameListCtrl::OnCompressGCM(wxCommandEvent& WXUNUSED (event))
@ -1181,31 +1269,26 @@ void CGameListCtrl::OnCompressGCM(wxCommandEvent& WXUNUSED (event))
if (iso->IsCompressed())
{
if (iso->GetPlatform() == GameListItem::WII_DISC)
{
Ext = wxT("*.iso");
}
else
{
Ext = wxT("*.gcm");
}
path = wxFileSelector(
_T("Save decompressed ISO"),
wxEmptyString, wxString(FileName.c_str(), *wxConvCurrent), wxEmptyString,
wxString::Format
(
_T("All GC/Wii ISO files (%s)|%s|All files (%s)|%s"),
(char *)Ext.After('.').char_str(wxConvUTF8),
(char *)Ext.char_str(wxConvUTF8),
wxFileSelectorDefaultWildcardStr,
wxFileSelectorDefaultWildcardStr
),
wxFD_SAVE,
this);
path = wxFileSelector(
_T("Save decompressed ISO"),
wxEmptyString, wxString(FileName.c_str(), *wxConvCurrent), wxEmptyString,
wxString::Format
(
_T("All GC/Wii ISO files (%s)|%s|All files (%s)|%s"),
(char *)Ext.After('.').char_str(wxConvUTF8),
(char *)Ext.char_str(wxConvUTF8),
wxFileSelectorDefaultWildcardStr,
wxFileSelectorDefaultWildcardStr
),
wxFD_SAVE,
this);
if (!path)
{
return;
}
}
else
{
@ -1214,38 +1297,40 @@ void CGameListCtrl::OnCompressGCM(wxCommandEvent& WXUNUSED (event))
wxEmptyString, wxString(FileName.c_str(), *wxConvCurrent), wxEmptyString,
wxString::Format
(
_T("All compressed GC/Wii ISO files (gcz)|*.gcz|All files (%s)|%s"),
wxFileSelectorDefaultWildcardStr,
wxFileSelectorDefaultWildcardStr
_T("All compressed GC/Wii ISO files (gcz)|*.gcz|All files (%s)|%s"),
wxFileSelectorDefaultWildcardStr,
wxFileSelectorDefaultWildcardStr
),
wxFD_SAVE,
this);
if (!path)
{
return;
}
}
wxProgressDialog dialog(iso->IsCompressed() ? _T("Decompressing ISO") : _T("Compressing ISO"),
_T("Working..."),
1000, // range
this, // parent
wxPD_APP_MODAL |
// wxPD_AUTO_HIDE | -- try this as well
wxPD_ELAPSED_TIME |
wxPD_ESTIMATED_TIME |
wxPD_REMAINING_TIME |
wxPD_SMOOTH // - makes indeterminate mode bar on WinXP very small
);
wxProgressDialog dialog(iso->IsCompressed() ?
_T("Decompressing ISO") : _T("Compressing ISO"),
_T("Working..."),
1000, // range
this, // parent
wxPD_APP_MODAL |
wxPD_ELAPSED_TIME |
wxPD_ESTIMATED_TIME |
wxPD_REMAINING_TIME |
wxPD_SMOOTH // - makes indeterminate mode bar on WinXP very small
);
dialog.SetSize(wxSize(280, 180));
dialog.CenterOnParent();
if (iso->IsCompressed())
DiscIO::DecompressBlobToFile(iso->GetFileName().c_str(), path.char_str(), &CompressCB, &dialog);
DiscIO::DecompressBlobToFile(iso->GetFileName().c_str(),
path.char_str(), &CompressCB, &dialog);
else
DiscIO::CompressFileToBlob(iso->GetFileName().c_str(), path.char_str(), (iso->GetPlatform() == GameListItem::WII_DISC) ? 1 : 0, 16384, &CompressCB, &dialog);
DiscIO::CompressFileToBlob(iso->GetFileName().c_str(),
path.char_str(),
(iso->GetPlatform() == GameListItem::WII_DISC) ? 1 : 0,
16384, &CompressCB, &dialog);
Update();
}
@ -1261,12 +1346,10 @@ void CGameListCtrl::OnSize(wxSizeEvent& event)
void CGameListCtrl::AutomaticColumnWidth()
{
wxRect rc(GetParent()->GetRect());
wxRect rc(GetClientRect());
if (GetColumnCount() == 1)
{
SetColumnWidth(0, rc.GetWidth());
}
else if (GetColumnCount() > 4)
{
int resizable = rc.GetWidth() - (
@ -1274,11 +1357,10 @@ void CGameListCtrl::AutomaticColumnWidth()
+ GetColumnWidth(COLUMN_COUNTRY)
+ GetColumnWidth(COLUMN_SIZE)
+ GetColumnWidth(COLUMN_EMULATION_STATE)
+ GetColumnWidth(COLUMN_PLATFORM)
+ 5); // some pad to keep the horizontal scrollbar away :)
+ GetColumnWidth(COLUMN_PLATFORM));
// We hide the Company column if the window is too small
if (resizable / 2 > 200)
// We hide the Notes column if the window is too small
if (resizable > 400)
{
SetColumnWidth(COLUMN_TITLE, resizable / 2);
SetColumnWidth(COLUMN_NOTES, resizable / 2);

View File

@ -46,6 +46,7 @@ BEGIN_EVENT_TABLE(CLogWindow, wxPanel)
EVT_CHECKBOX(IDM_WRITEWINDOW, CLogWindow::OnOptionsCheck)
EVT_CHECKLISTBOX(IDM_LOGCHECKS, CLogWindow::OnLogCheck)
EVT_TIMER(IDTM_UPDATELOG, CLogWindow::OnLogTimer)
EVT_SIZE(CLogWindow::OnSize)
END_EVENT_TABLE()
CLogWindow::CLogWindow(CFrame *parent, wxWindowID id, const wxPoint& pos,
@ -170,14 +171,28 @@ void CLogWindow::OnClose(wxCloseEvent& event)
event.Skip();
}
void CLogWindow::OnSize(wxSizeEvent& event)
{
if (!Parent->g_pCodeWindow &&
Parent->m_Mgr->GetPane(wxT("Pane 1")).IsShown())
{
x = Parent->m_Mgr->GetPane(wxT("Pane 1")).rect.GetWidth();
y = Parent->m_Mgr->GetPane(wxT("Pane 1")).rect.GetHeight();
winpos = Parent->m_Mgr->GetPane(wxT("Pane 1")).dock_direction;
}
event.Skip();
}
void CLogWindow::SaveSettings()
{
IniFile ini;
ini.Load(File::GetUserPath(F_LOGGERCONFIG_IDX));
if (!Parent->g_pCodeWindow)
{
ini.Set("LogWindow", "x", Parent->m_Mgr->GetPane(wxT("Pane 1")).rect.GetWidth());
ini.Set("LogWindow", "y", Parent->m_Mgr->GetPane(wxT("Pane 1")).rect.GetHeight());
ini.Set("LogWindow", "pos", Parent->m_Mgr->GetPane(wxT("Pane 1")).dock_direction);
ini.Set("LogWindow", "x", x);
ini.Set("LogWindow", "y", y);
ini.Set("LogWindow", "pos", winpos);
}
ini.Set("Options", "Verbosity", m_verbosity->GetSelection() + 1);
ini.Set("Options", "Font", m_FontChoice->GetSelection());

View File

@ -97,6 +97,7 @@ private:
void CreateGUIControls();
void PopulateRight(); void UnPopulateRight();
void OnClose(wxCloseEvent& event);
void OnSize(wxSizeEvent& event);
void OnSubmit(wxCommandEvent& event);
void OnOptionsCheck(wxCommandEvent& event);
void OnLogCheck(wxCommandEvent& event);