diff --git a/Source/Core/DolphinWX/Src/FilesystemViewer.cpp b/Source/Core/DolphinWX/Src/FilesystemViewer.cpp new file mode 100644 index 0000000000..d0f1fda455 --- /dev/null +++ b/Source/Core/DolphinWX/Src/FilesystemViewer.cpp @@ -0,0 +1,202 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#include "Globals.h" + +//#include "VolumeCreator.h" +//#include "Filesystem.h" +//#include "BannerLoader.h" +#include "FilesystemViewer.h" + +BEGIN_EVENT_TABLE(CFilesystemViewer, wxDialog) + EVT_CLOSE(CFilesystemViewer::OnClose) + EVT_RIGHT_DOWN(CFilesystemViewer::OnRightClick) + EVT_TREE_ITEM_RIGHT_CLICK(ID_TREECTRL,CFilesystemViewer::OnRightClickOnTree) + EVT_BUTTON(ID_CLOSE,CFilesystemViewer::OnCloseClick) + EVT_BUTTON(ID_SAVEBNR,CFilesystemViewer::OnSaveBNRClick) + EVT_MENU(IDM_BNRSAVEAS, CFilesystemViewer::OnBannerImageSave) + EVT_MENU(IDM_EXTRACTFILE, CFilesystemViewer::OnExtractFile) + EVT_MENU(IDM_REPLACEFILE, CFilesystemViewer::OnReplaceFile) + EVT_MENU(IDM_RENAMEFILE, CFilesystemViewer::OnRenameFile) +END_EVENT_TABLE() + +CFilesystemViewer::CFilesystemViewer(const std::string fileName, wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& position, const wxSize& size, long style) + : wxDialog(parent, id, title, position, size, style) +{ + /*DiscIO::IVolume* pVolume = DiscIO::CreateVolumeFromFilename(fileName); + DiscIO::IFileSystem* pFileSystem = DiscIO::CreateFileSystem(*pVolume); + pFileSystem->*/ + CreateGUIControls(); +} + +CFilesystemViewer::~CFilesystemViewer() +{ +} + +void CFilesystemViewer::CreateGUIControls() +{ + m_Close = new wxButton(this, ID_CLOSE, wxT("Close"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator); + + // ISO Details + sbISODetails = new wxStaticBoxSizer(wxVERTICAL, this, wxT("ISO Details:")); + sISODetails = new wxGridBagSizer(0, 0); + m_NameText = new wxStaticText(this, ID_NAME_TEXT, wxT("Name:"), wxDefaultPosition, wxDefaultSize); + m_Name = new wxTextCtrl(this, ID_NAME, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_READONLY); + m_SerialText = new wxStaticText(this, ID_SERIAL_TEXT, wxT("Serial:"), wxDefaultPosition, wxDefaultSize); + m_Serial = new wxTextCtrl(this, ID_SERIAL, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_READONLY); + m_CountryText = new wxStaticText(this, ID_COUNTRY_TEXT, wxT("Country:"), wxDefaultPosition, wxDefaultSize); + m_Country = new wxTextCtrl(this, ID_COUNTRY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_READONLY); + m_MakerIDText = new wxStaticText(this, ID_MAKERID_TEXT, wxT("Maker ID:"), wxDefaultPosition, wxDefaultSize); + m_MakerID = new wxTextCtrl(this, ID_MAKERID, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_READONLY); + m_DateText = new wxStaticText(this, ID_DATE_TEXT, wxT("Date:"), wxDefaultPosition, wxDefaultSize); + m_Date = new wxTextCtrl(this, ID_DATE, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_READONLY); + m_TOCText = new wxStaticText(this, ID_TOC_TEXT, wxT("TOC Size:"), wxDefaultPosition, wxDefaultSize); + m_TOC = new wxTextCtrl(this, ID_TOC, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_READONLY); + + sISODetails->Add(m_NameText, wxGBPosition(0, 0), wxGBSpan(1, 1), wxALL, 5); + sISODetails->Add(m_Name, wxGBPosition(0, 1), wxGBSpan(1, 1), wxEXPAND|wxALL, 5); + sISODetails->Add(m_SerialText, wxGBPosition(1, 0), wxGBSpan(1, 1), wxALL, 5); + sISODetails->Add(m_Serial, wxGBPosition(1, 1), wxGBSpan(1, 1), wxEXPAND|wxALL, 5); + sISODetails->Add(m_CountryText, wxGBPosition(2, 0), wxGBSpan(1, 1), wxALL, 5); + sISODetails->Add(m_Country, wxGBPosition(2, 1), wxGBSpan(1, 1), wxEXPAND|wxALL, 5); + sISODetails->Add(m_MakerIDText, wxGBPosition(3, 0), wxGBSpan(1, 1), wxALL, 5); + sISODetails->Add(m_MakerID, wxGBPosition(3, 1), wxGBSpan(1, 1), wxEXPAND|wxALL, 5); + sISODetails->Add(m_DateText, wxGBPosition(4, 0), wxGBSpan(1, 1), wxALL, 5); + sISODetails->Add(m_Date, wxGBPosition(4, 1), wxGBSpan(1, 1), wxEXPAND|wxALL, 5); + sISODetails->Add(m_TOCText, wxGBPosition(5, 0), wxGBSpan(1, 1), wxALL, 5); + sISODetails->Add(m_TOC, wxGBPosition(5, 1), wxGBSpan(1, 1), wxEXPAND|wxALL, 5); + + sbISODetails->Add(sISODetails, 0, wxEXPAND, 5); + + // Banner Details + wxArrayString arrayStringFor_Lang; + sbBannerDetails = new wxStaticBoxSizer(wxVERTICAL, this, wxT("Banner Details:")); + sBannerDetails = new wxGridBagSizer(0, 0); + m_VersionText = new wxStaticText(this, ID_VERSION_TEXT, wxT("Version:"), wxDefaultPosition, wxDefaultSize); + m_Version = new wxTextCtrl(this, ID_VERSION, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_READONLY); + m_LangText = new wxStaticText(this, ID_LANG_TEXT, wxT("Show Language:"), wxDefaultPosition, wxDefaultSize); + m_Lang = new wxChoice(this, ID_LANG, wxDefaultPosition, wxDefaultSize, arrayStringFor_Lang, 0, wxDefaultValidator); + m_ShortText = new wxStaticText(this, ID_SHORTNAME_TEXT, wxT("Short Name:"), wxDefaultPosition, wxDefaultSize); + m_ShortName = new wxTextCtrl(this, ID_SHORTNAME, wxEmptyString, wxDefaultPosition, wxDefaultSize); + m_LongText = new wxStaticText(this, ID_LONGNAME_TEXT, wxT("Long Name:"), wxDefaultPosition, wxDefaultSize); + m_LongName = new wxTextCtrl(this, ID_LONGNAME, wxEmptyString, wxDefaultPosition, wxDefaultSize); + m_MakerText = new wxStaticText(this, ID_MAKER_TEXT, wxT("Maker:"), wxDefaultPosition, wxDefaultSize); + m_Maker = new wxTextCtrl(this, ID_MAKER, wxEmptyString, wxDefaultPosition, wxDefaultSize); + m_CommentText = new wxStaticText(this, ID_COMMENT_TEXT, wxT("Comment:"), wxDefaultPosition, wxDefaultSize); + m_Comment = new wxTextCtrl(this, ID_COMMENT, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE); + m_BannerText = new wxStaticText(this, ID_BANNER_TEXT, wxT("Banner:"), wxDefaultPosition, wxDefaultSize); + //needs to be image: + m_Banner = new wxTextCtrl(this, ID_BANNER, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE); + m_SaveBNR = new wxButton(this, ID_SAVEBNR, wxT("Save Changes to BNR"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator); + m_SaveBNR->Disable(); + + sBannerDetails->Add(m_VersionText, wxGBPosition(0, 0), wxGBSpan(1, 1), wxALL, 5); + sBannerDetails->Add(m_Version, wxGBPosition(0, 1), wxGBSpan(1, 1), wxEXPAND|wxALL, 5); + sBannerDetails->Add(m_LangText, wxGBPosition(0, 2), wxGBSpan(1, 1), wxALL, 5); + sBannerDetails->Add(m_Lang, wxGBPosition(0, 3), wxGBSpan(1, 1), wxEXPAND|wxALL, 5); + sBannerDetails->Add(m_ShortText, wxGBPosition(1, 0), wxGBSpan(1, 1), wxALL, 5); + sBannerDetails->Add(m_ShortName, wxGBPosition(1, 1), wxGBSpan(1, 3), wxEXPAND|wxALL, 5); + sBannerDetails->Add(m_LongText, wxGBPosition(2, 0), wxGBSpan(1, 1), wxALL, 5); + sBannerDetails->Add(m_LongName, wxGBPosition(2, 1), wxGBSpan(1, 3), wxEXPAND|wxALL, 5); + sBannerDetails->Add(m_MakerText, wxGBPosition(3, 0), wxGBSpan(1, 1), wxALL, 5); + sBannerDetails->Add(m_Maker, wxGBPosition(3, 1), wxGBSpan(1, 3), wxEXPAND|wxALL, 5); + sBannerDetails->Add(m_CommentText, wxGBPosition(4, 0), wxGBSpan(1, 1), wxALL, 5); + sBannerDetails->Add(m_Comment, wxGBPosition(4, 1), wxGBSpan(1, 3), wxEXPAND|wxALL, 5); + sBannerDetails->Add(m_BannerText, wxGBPosition(5, 0), wxGBSpan(1, 1), wxALL, 5); + sBannerDetails->Add(m_Banner, wxGBPosition(5, 1), wxGBSpan(1, 1), wxEXPAND|wxALL, 5); + sBannerDetails->Add(m_SaveBNR, wxGBPosition(5, 2), wxGBSpan(1, 2), wxEXPAND|wxALL, 5); + + sbBannerDetails->Add(sBannerDetails, 0, wxEXPAND, 0); + + // Filesystem tree + sbTreectrl = new wxStaticBoxSizer(wxVERTICAL, this, wxT("Filesytem:")); + m_Treectrl = new wxTreeCtrl(this, ID_TREECTRL, wxDefaultPosition, wxSize(350, 450)/*wxDefaultSize*/, wxTR_DEFAULT_STYLE, wxDefaultValidator); + sbTreectrl->Add(m_Treectrl, 1, wxEXPAND); + + m_Treectrl->AddRoot(wxT("Root"), -1, -1, 0); + + ///////////// + wxGridBagSizer* sMain; + sMain = new wxGridBagSizer(0, 0); + sMain->Add(sbISODetails, wxGBPosition(0, 0), wxGBSpan(1, 1), wxEXPAND|wxALL, 5); + sMain->Add(sbBannerDetails, wxGBPosition(1, 0), wxGBSpan(1, 1), wxEXPAND|wxALL, 5); + sMain->Add(sbTreectrl, wxGBPosition(0, 1), wxGBSpan(2, 1), wxALL, 5); + sMain->Add(m_Close, wxGBPosition(2, 1), wxGBSpan(1, 1), wxALL|wxALIGN_RIGHT, 5); + + this->SetSizer(sMain); + this->Layout(); + Fit(); +} + +void CFilesystemViewer::OnClose(wxCloseEvent& WXUNUSED (event)) +{ + Destroy(); +} + +void CFilesystemViewer::OnCloseClick(wxCommandEvent& WXUNUSED (event)) +{ + Close(); +} + +void CFilesystemViewer::OnRightClick(wxMouseEvent& WXUNUSED (event)) +{ + //check for right click on banner image + //if(event.GetId() == ID_SAVEBNR) + //{ + // //on banner then save as. + // wxMenu popupMenu; + // popupMenu.Append(IDM_BNRSAVEAS, wxString::FromAscii("Save as...")); + // PopupMenu(&popupMenu); + //} + //event.Skip(); +} + +void CFilesystemViewer::OnRightClickOnTree(wxTreeEvent& event) +{ + wxMenu popupMenu; + popupMenu.Append(IDM_EXTRACTFILE, wxString::FromAscii("Extract File...")); + popupMenu.Append(IDM_REPLACEFILE, wxString::FromAscii("Replace File...")); + popupMenu.Append(IDM_RENAMEFILE, wxString::FromAscii("Rename File...")); + PopupMenu(&popupMenu); + + event.Skip(); +} + +void CFilesystemViewer::OnSaveBNRClick(wxCommandEvent& WXUNUSED (event)) +{ + +} + +void CFilesystemViewer::OnBannerImageSave(wxCommandEvent& WXUNUSED (event)) +{ + +} + +void CFilesystemViewer::OnExtractFile(wxCommandEvent& WXUNUSED (event)) +{ + +} + +void CFilesystemViewer::OnReplaceFile(wxCommandEvent& WXUNUSED (event)) +{ + +} + +void CFilesystemViewer::OnRenameFile(wxCommandEvent& WXUNUSED (event)) +{ + +} diff --git a/Source/Core/DolphinWX/Src/FilesystemViewer.h b/Source/Core/DolphinWX/Src/FilesystemViewer.h new file mode 100644 index 0000000000..b1c649480d --- /dev/null +++ b/Source/Core/DolphinWX/Src/FilesystemViewer.h @@ -0,0 +1,136 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#ifndef __FILESYSTEM_VIEWER_h__ +#define __FILESYSTEM_VIEWER_h__ + +#include +#include +#include +#include +#include +#include + +#undef FILESYSTEM_VIEWER_STYLE +#define FILESYSTEM_VIEWER_STYLE wxCAPTION | wxSYSTEM_MENU | wxDIALOG_NO_PARENT | wxCLOSE_BOX + +class CFilesystemViewer : public wxDialog +{ + public: + + CFilesystemViewer(const std::string fileName, wxWindow* parent, wxWindowID id = 1, const wxString& title = wxT("Filesystem Viewer"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = FILESYSTEM_VIEWER_STYLE); + virtual ~CFilesystemViewer(); + + private: + + DECLARE_EVENT_TABLE(); + + wxStaticBoxSizer *sbISODetails; + wxGridBagSizer *sISODetails; + wxStaticBoxSizer *sbBannerDetails; + wxGridBagSizer *sBannerDetails; + wxStaticBoxSizer *sbTreectrl; + + + wxTreeCtrl *m_Treectrl; + wxButton *m_Close; + + wxStaticText *m_NameText; + wxStaticText *m_SerialText; + wxStaticText *m_CountryText; + wxStaticText *m_MakerIDText; + wxStaticText *m_DateText; + wxStaticText *m_TOCText; + wxStaticText *m_VersionText; + wxStaticText *m_LangText; + wxStaticText *m_ShortText; + wxStaticText *m_LongText; + wxStaticText *m_MakerText; + wxStaticText *m_CommentText; + wxStaticText *m_BannerText; + + wxTextCtrl *m_Name; + wxTextCtrl *m_Serial; + wxTextCtrl *m_Country; + wxTextCtrl *m_MakerID; + wxTextCtrl *m_Date; + wxTextCtrl *m_TOC; + wxTextCtrl *m_Version; + wxTextCtrl *m_ShortName; + wxTextCtrl *m_LongName; + wxTextCtrl *m_Maker; + wxTextCtrl *m_Comment; + wxTextCtrl *m_Banner; + + wxChoice *m_Lang; + wxButton *m_SaveBNR; + + enum + { + ID_CLOSE = 1000, + ID_TREECTRL, + + ID_NAME_TEXT, + ID_SERIAL_TEXT, + ID_COUNTRY_TEXT, + ID_MAKERID_TEXT, + ID_DATE_TEXT, + ID_TOC_TEXT, + ID_VERSION_TEXT, + ID_LANG_TEXT, + ID_SHORTNAME_TEXT, + ID_LONGNAME_TEXT, + ID_MAKER_TEXT, + ID_COMMENT_TEXT, + ID_BANNER_TEXT, + + ID_NAME, + ID_SERIAL, + ID_COUNTRY, + ID_MAKERID, + ID_DATE, + ID_TOC, + ID_VERSION, + ID_LANG, + ID_SHORTNAME, + ID_LONGNAME, + ID_MAKER, + ID_COMMENT, + ID_BANNER, + + ID_SAVEBNR, + + IDM_EXTRACTFILE, + IDM_REPLACEFILE, + IDM_RENAMEFILE, + IDM_BNRSAVEAS, + ID_DUMMY_VALUE_ //don't remove this value unless you have other enum values + }; + + void CreateGUIControls(); + void OnClose(wxCloseEvent& event); + void OnCloseClick(wxCommandEvent& event); + void OnRightClick(wxMouseEvent& event); + void OnRightClickOnTree(wxTreeEvent& event); + void OnSaveBNRClick(wxCommandEvent& event); + void OnBannerImageSave(wxCommandEvent& event); + void OnExtractFile(wxCommandEvent& event); + void OnReplaceFile(wxCommandEvent& event); + void OnRenameFile(wxCommandEvent& event); +}; + +#endif diff --git a/Source/Core/DolphinWX/Src/Frame.cpp b/Source/Core/DolphinWX/Src/Frame.cpp index a246ea58ed..4ebee0c255 100644 --- a/Source/Core/DolphinWX/Src/Frame.cpp +++ b/Source/Core/DolphinWX/Src/Frame.cpp @@ -86,7 +86,6 @@ EVT_MENU(IDM_HELPGOOGLECODE, CFrame::OnHelp) EVT_MENU(IDM_HELPABOUT, CFrame::OnHelp) EVT_MENU(wxID_REFRESH, CFrame::OnRefresh) EVT_MENU(IDM_PLAY, CFrame::OnPlay) -EVT_MENU(IDM_PAUSE, CFrame::OnPlay) EVT_MENU(IDM_STOP, CFrame::OnStop) EVT_MENU(IDM_PLUGIN_OPTIONS, CFrame::OnPluginOptions) EVT_MENU(IDM_CONFIG_GFX_PLUGIN, CFrame::OnPluginGFX) diff --git a/Source/Core/DolphinWX/Src/GameListCtrl.cpp b/Source/Core/DolphinWX/Src/GameListCtrl.cpp index fb426aa4f2..b99f269142 100644 --- a/Source/Core/DolphinWX/Src/GameListCtrl.cpp +++ b/Source/Core/DolphinWX/Src/GameListCtrl.cpp @@ -27,6 +27,7 @@ #include "Config.h" #include "GameListCtrl.h" #include "Blob.h" +#include "FilesystemViewer.h" #if USE_XPM_BITMAPS #include "../resources/Flag_Europe.xpm" @@ -35,6 +36,22 @@ #include "../resources/Flag_USA.xpm" #endif // USE_XPM_BITMAPS +///////////////////////////////// +int currentColumn ; +bool operator < (const CISOFile &one, const CISOFile &other) +{ + switch(currentColumn) + { + case CGameListCtrl::COLUMN_TITLE: return strcasecmp(one.GetName().c_str(), other.GetName().c_str()) < 0; + case CGameListCtrl::COLUMN_COMPANY: return strcasecmp(one.GetCompany().c_str(), other.GetCompany().c_str()) < 0; + case CGameListCtrl::COLUMN_NOTES: return strcasecmp(one.GetDescription().c_str(), other.GetDescription().c_str()) < 0; + case CGameListCtrl::COLUMN_COUNTRY: return (one.GetCountry() < other.GetCountry()); + case CGameListCtrl::COLUMN_SIZE: return (one.GetFileSize() < other.GetFileSize()); + default: return strcasecmp(one.GetName().c_str(), other.GetName().c_str()) < 0; + } +} +///////////////////////////////// + BEGIN_EVENT_TABLE(CGameListCtrl, wxListCtrl) EVT_SIZE(CGameListCtrl::OnSize) @@ -42,10 +59,12 @@ EVT_RIGHT_DOWN(CGameListCtrl::OnRightClick) EVT_LIST_COL_BEGIN_DRAG(LIST_CTRL, CGameListCtrl::OnColBeginDrag) EVT_LIST_ITEM_SELECTED(LIST_CTRL, CGameListCtrl::OnSelected) EVT_LIST_ITEM_ACTIVATED(LIST_CTRL, CGameListCtrl::OnActivated) +EVT_LIST_COL_CLICK(LIST_CTRL, CGameListCtrl::OnColumnClick) EVT_LIST_COL_END_DRAG(LIST_CTRL, CGameListCtrl::OnColEndDrag) EVT_MENU(IDM_EDITPATCHFILE, CGameListCtrl::OnEditPatchFile) EVT_MENU(IDM_OPENCONTAININGFOLDER, CGameListCtrl::OnOpenContainingFolder) EVT_MENU(IDM_SETDEFAULTGCM, CGameListCtrl::OnSetDefaultGCM) +EVT_MENU(IDM_FILESYSTEMVIEWER, CGameListCtrl::OnFilesystemViewer) EVT_MENU(IDM_COMPRESSGCM, CGameListCtrl::OnCompressGCM) END_EVENT_TABLE() @@ -142,13 +161,6 @@ void CGameListCtrl::Update() Show(); } -#ifdef _WIN32 -wxColour blend50(const wxColour& c1, const wxColour& c2) -{ - return(((c1.GetPixel() & 0xFEFEFE) >> 1) + ((c2.GetPixel() & 0xFEFEFE) >> 1) + 0x010101); -} -#endif - wxString NiceSizeFormat(s64 _size) { const char* sizes[] = {"b", "KB", "MB", "GB", "TB", "PB", "EB"}; @@ -185,18 +197,15 @@ void CGameListCtrl::InsertItemInReportView(long _Index) // data wxString buf; long ItemIndex = InsertItem(_Index, buf, ImageIndex); -#ifdef _WIN32 - wxColour color = (_Index & 1) ? blend50(GetSysColor(COLOR_3DLIGHT), GetSysColor(COLOR_WINDOW)) : GetSysColor(COLOR_WINDOW); -#else - wxColour color = (_Index & 1) ? 0xFFFFFF : 0xEEEEEE; -#endif + // background color - { + SetBackgroundColor(); //temp fix so we can colorize background after sorting + /*{ wxListItem item; item.SetId(ItemIndex); item.SetBackgroundColour(color); SetItem(item); - } + }*/ // title { @@ -259,6 +268,50 @@ void CGameListCtrl::InsertItemInReportView(long _Index) SetItemData(ItemIndex, _Index); } +bool CGameListCtrl::MSWDrawSubItem(wxPaintDC& rPaintDC, int item, int subitem) +{ + bool Result = false; +#ifdef __WXMSW__ + switch (subitem) + { + case COLUMN_COUNTRY: + { + size_t Index = GetItemData(item); + + if (Index < m_ISOFiles.size()) + { + const CISOFile& rISO = m_ISOFiles[Index]; + wxRect SubItemRect; + this->GetSubItemRect(item, subitem, SubItemRect); + m_imageListSmall->Draw(m_FlagImageIndex[rISO.GetCountry()], rPaintDC, SubItemRect.GetLeft(), SubItemRect.GetTop()); + } + } + } +#endif + + return(Result); +} + +#ifdef _WIN32 +wxColour blend50(const wxColour& c1, const wxColour& c2) +{ + return(((c1.GetPixel() & 0xFEFEFE) >> 1) + ((c2.GetPixel() & 0xFEFEFE) >> 1) + 0x010101); +} +#endif + +void CGameListCtrl::SetBackgroundColor() +{ + for(long i = 0; i <= GetItemCount(); i++) + { +#ifdef _WIN32 + wxColour color = (i & 1) ? blend50(GetSysColor(COLOR_3DLIGHT), GetSysColor(COLOR_WINDOW)) : GetSysColor(COLOR_WINDOW); +#else + wxColour color = (i & 1) ? 0xFFFFFF : 0xEEEEEE; +#endif + CGameListCtrl::SetItemBackgroundColour(i, color); + } +} + void CGameListCtrl::ScanForISOs() { m_ISOFiles.clear(); @@ -325,6 +378,74 @@ void CGameListCtrl::OnColBeginDrag(wxListEvent& event) event.Veto(); } +const CISOFile * CGameListCtrl::GetISO(int index) const +{ + return &m_ISOFiles[index]; +} + +CGameListCtrl *caller; +int wxCALLBACK wxListCompare(long item1, long item2, long sortData) +{ + //return 1 if item1 > item2 + //return -1 if item1 < item2 + //0 for identity + const CISOFile *iso1 = caller->GetISO(item1); + const CISOFile *iso2 = caller->GetISO(item2); + + int t = 1; + + if(sortData<0) + { + t=-1; + sortData = -sortData; + } + + switch(sortData) + { + case CGameListCtrl::COLUMN_TITLE: + return strcasecmp(iso1->GetName().c_str(),iso2->GetName().c_str()) *t; + case CGameListCtrl::COLUMN_COMPANY: + return strcasecmp(iso1->GetCompany().c_str(),iso2->GetCompany().c_str()) *t; + case CGameListCtrl::COLUMN_NOTES: + return strcasecmp(iso1->GetDescription().c_str(),iso2->GetDescription().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; + } + + return 0; +} + +void CGameListCtrl::OnColumnClick(wxListEvent& event) +{ + if(event.GetColumn() != COLUMN_BANNER && event.GetColumn() != COLUMN_EMULATION_STATE) + { + int current_column = event.GetColumn(); + + if(last_column == current_column) + { + last_sort = -last_sort; + } + else + { + last_column = current_column; + last_sort = current_column; + } + + caller = this; + SortItems(wxListCompare, last_sort); + } + + SetBackgroundColor(); + + event.Skip(); +} + void CGameListCtrl::OnColEndDrag(wxListEvent& WXUNUSED (event)) { } @@ -346,9 +467,10 @@ void CGameListCtrl::OnRightClick(wxMouseEvent& event) popupMenu.Append(IDM_EDITPATCHFILE, wxString::FromAscii(menu_text.c_str())); //Pretty much everything in wxwidgets is a wxString, try to convert to those first! popupMenu.Append(IDM_OPENCONTAININGFOLDER, wxString::FromAscii("Open &containing folder")); popupMenu.Append(IDM_SETDEFAULTGCM, wxString::FromAscii("Set as &default ISO")); + //popupMenu.Append(IDM_FILESYSTEMVIEWER, wxString::FromAscii("Open in ISO viewer/dumper")); - /* F|RES: compression doesn't work and will be rewritten ... if it is done reactivated this code the gui is ready :D - if (selected_iso->IsCompressed()) + // F|RES: compression doesn't work and will be rewritten ... if it is fixed the gui is ready :D + /*if (selected_iso->IsCompressed()) popupMenu.Append(IDM_COMPRESSGCM, wxString::FromAscii("Decompress ISO... (UNTESTED)")); else popupMenu.Append(IDM_COMPRESSGCM, wxString::FromAscii("Compress ISO... (UNTESTED)")); @@ -401,6 +523,14 @@ void CGameListCtrl::OnSetDefaultGCM(wxCommandEvent& WXUNUSED (event)) { SConfig::GetInstance().SaveSettings(); } +void CGameListCtrl::OnFilesystemViewer(wxCommandEvent& WXUNUSED (event)) { + const CISOFile *iso = GetSelectedISO(); + if (!iso) + return; + CFilesystemViewer FSViewer(iso->GetFileName(), this); + FSViewer.ShowModal(); +} + void CGameListCtrl::CompressCB(const char* text, float percent, void* arg) { wxProgressDialog* pDialog = (wxProgressDialog*)arg; @@ -505,30 +635,6 @@ void CGameListCtrl::OnSize(wxSizeEvent& event) event.Skip(); } -bool CGameListCtrl::MSWDrawSubItem(wxPaintDC& rPaintDC, int item, int subitem) -{ - bool Result = false; -#ifdef __WXMSW__ - switch (subitem) - { - case COLUMN_COUNTRY: - { - size_t Index = GetItemData(item); - - if (Index < m_ISOFiles.size()) - { - const CISOFile& rISO = m_ISOFiles[Index]; - wxRect SubItemRect; - this->GetSubItemRect(item, subitem, SubItemRect); - m_imageListSmall->Draw(m_FlagImageIndex[rISO.GetCountry()], rPaintDC, SubItemRect.GetLeft(), SubItemRect.GetTop()); - } - } - } -#endif - - return(Result); -} - void CGameListCtrl::AutomaticColumnWidth() { wxRect rc(GetClientRect()); diff --git a/Source/Core/DolphinWX/Src/GameListCtrl.h b/Source/Core/DolphinWX/Src/GameListCtrl.h index 6c6ae894e0..e8710e8a27 100644 --- a/Source/Core/DolphinWX/Src/GameListCtrl.h +++ b/Source/Core/DolphinWX/Src/GameListCtrl.h @@ -32,8 +32,7 @@ class CGameListCtrl : public wxListCtrl void Update(); void BrowseForDirectory(); const CISOFile *GetSelectedISO() const; - - private: + const CISOFile *GetISO(int index) const; enum { @@ -47,20 +46,24 @@ class CGameListCtrl : public wxListCtrl NUMBER_OF_COLUMN }; - std::vectorm_FlagImageIndex; + private: - bool m_test; + std::vectorm_FlagImageIndex; std::vector m_ISOFiles; + int last_column; + int last_sort; + void InitBitmaps(); void InsertItemInReportView(long _Index); + void SetBackgroundColor(); void ScanForISOs(); DECLARE_EVENT_TABLE() // events void OnRightClick(wxMouseEvent& event); - + void OnColumnClick(wxListEvent& event); void OnColBeginDrag(wxListEvent& event); void OnColEndDrag(wxListEvent& event); void OnSelected(wxListEvent& event); @@ -70,6 +73,7 @@ class CGameListCtrl : public wxListCtrl void OnOpenContainingFolder(wxCommandEvent& event); void OnSetDefaultGCM(wxCommandEvent& event); void OnCompressGCM(wxCommandEvent& event); + void OnFilesystemViewer(wxCommandEvent& event); virtual bool MSWDrawSubItem(wxPaintDC& rPaintDC, int item, int subitem); diff --git a/Source/Core/DolphinWX/Src/Globals.h b/Source/Core/DolphinWX/Src/Globals.h index 2759025d90..0e5dbd529c 100644 --- a/Source/Core/DolphinWX/Src/Globals.h +++ b/Source/Core/DolphinWX/Src/Globals.h @@ -43,13 +43,13 @@ enum IDM_LOADSLOT9, IDM_LOADSLOT10, IDM_PLAY, - IDM_PAUSE, IDM_STOP, IDM_BROWSE, IDM_MEMCARD, IDM_EDITPATCHFILE, IDM_OPENCONTAININGFOLDER, IDM_SETDEFAULTGCM, + IDM_FILESYSTEMVIEWER, IDM_COMPRESSGCM, IDM_PLUGIN_OPTIONS, IDM_CONFIG_GFX_PLUGIN, diff --git a/Source/Core/DolphinWX/Src/ISOFile.h b/Source/Core/DolphinWX/Src/ISOFile.h index 66b5306c32..2e199f4685 100644 --- a/Source/Core/DolphinWX/Src/ISOFile.h +++ b/Source/Core/DolphinWX/Src/ISOFile.h @@ -47,11 +47,6 @@ class CISOFile const wxImage& GetImage() const {return(m_Image);} - bool operator < (const CISOFile &other) const { - // HACK - they end up in reverse order in the list view - return strcasecmp(m_Name.c_str(), other.m_Name.c_str()) < 0; - } - private: std::string m_FileName; diff --git a/Source/PluginSpecs/PluginSpecs.h b/Source/PluginSpecs/PluginSpecs.h index 4699e825d1..cbe2e60ddd 100644 --- a/Source/PluginSpecs/PluginSpecs.h +++ b/Source/PluginSpecs/PluginSpecs.h @@ -46,13 +46,13 @@ extern "C" { #endif // plugin types -#define PLUGIN_TYPE_VIDEO 1 -#define PLUGIN_TYPE_DVD 2 -#define PLUGIN_TYPE_PAD 3 -#define PLUGIN_TYPE_AUDIO 4 -#define PLUGIN_TYPE_COMPILER 5 -#define PLUGIN_TYPE_DSP 6 -#define PLUGIN_TYPE_WIIMOTE 7 +#define PLUGIN_TYPE_VIDEO 1 +#define PLUGIN_TYPE_DVD 2 +#define PLUGIN_TYPE_PAD 3 +#define PLUGIN_TYPE_AUDIO 4 +#define PLUGIN_TYPE_COMPILER 5 +#define PLUGIN_TYPE_DSP 6 +#define PLUGIN_TYPE_WIIMOTE 7 #define STATE_MODE_READ 1 #define STATE_MODE_WRITE 2 @@ -61,9 +61,9 @@ extern "C" { typedef struct { - u16 Version; // Set to 0x0100 - u16 Type; // Set to PLUGIN_TYPE_DVD - char Name[100]; // Name of the DLL + u16 Version; // Set to 0x0100 + u16 Type; // Set to PLUGIN_TYPE_DVD + char Name[100]; // Name of the DLL } PLUGIN_INFO; typedef struct