From dab71d01c15b10f0576b0fcdf7740923ef8d84a2 Mon Sep 17 00:00:00 2001 From: Blaypeg Date: Sun, 1 Jun 2014 19:36:08 +0100 Subject: [PATCH] Add Remove Game option to Gameviewer Can right click game to remove from list and installation --- rpcs3/Gui/GameViewer.cpp | 75 +++++++++++++++++++++++++++++++++++++++- rpcs3/Gui/GameViewer.h | 7 ++-- 2 files changed, 79 insertions(+), 3 deletions(-) diff --git a/rpcs3/Gui/GameViewer.cpp b/rpcs3/Gui/GameViewer.cpp index 7f79afc6cf..bf63a00ef7 100644 --- a/rpcs3/Gui/GameViewer.cpp +++ b/rpcs3/Gui/GameViewer.cpp @@ -10,8 +10,12 @@ GameViewer::GameViewer(wxWindow* parent) : wxListView(parent) m_path = "/dev_hdd0/game/"; + m_popup = new wxMenu(); + m_popup->Append(0, _T("Remove Game")); + Bind(wxEVT_LIST_ITEM_ACTIVATED, &GameViewer::DClick, this); Bind(wxEVT_LIST_COL_CLICK, &GameViewer::OnColClick, this); + Bind(wxEVT_LIST_ITEM_RIGHT_CLICK, &GameViewer::RightClick, this); Refresh(); } @@ -36,7 +40,7 @@ int wxCALLBACK ListItemCompare(wxIntPtr item1, wxIntPtr item2, wxIntPtr sortinfo long index2 = pGameViewer->FindItem(-1, item2); wxString string1 = pGameViewer->GetItemText(index1, Column); wxString string2 = pGameViewer->GetItemText(index2, Column); - + if (string1.Cmp(string2) < 0) { return SortAscending ? -1 : 1; @@ -84,6 +88,7 @@ void GameViewer::LoadGames() m_games.push_back(info->name); } } + dir.Close(); //ConLog.Write("path: %s", m_path.wx_str()); //ConLog.Write("folders count: %d", m_games.GetCount()); @@ -163,3 +168,71 @@ void GameViewer::DClick(wxListEvent& event) } Emu.Run(); } + +void GameViewer::RightClick(wxListEvent& event) +{ + m_popup->Destroy(m_popup->FindItemByPosition(0)); + + wxMenuItem *pMenuItemA = m_popup->Append(event.GetIndex(), _T("Remove Game")); + Bind(wxEVT_MENU, &GameViewer::RemoveGame, this, event.GetIndex()); + PopupMenu(m_popup, event.GetPoint()); +} + +class WxDirDeleteTraverser : public wxDirTraverser +{ +public: + virtual wxDirTraverseResult OnFile(const wxString& filename) + { + if (!wxRemoveFile(filename)){ + ConLog.Error("Couldn't delete File: %s", fmt::ToUTF8(filename).c_str()); + } + return wxDIR_CONTINUE; + } + virtual wxDirTraverseResult OnDir(const wxString& dirname) + { + wxDir dir(dirname); + dir.Traverse(*this); + if (!wxRmDir(dirname)){ + //this get triggered a few times while clearing folders + //but if this gets reimplented we should probably warn + //if directories can't be removed + } + return wxDIR_CONTINUE; + } +}; + +void GameViewer::RemoveGame(wxCommandEvent& event) +{ + wxString GameName = this->GetItemText(event.GetId(), 5); + + Emu.GetVFS().Init(m_path); + vfsDir dir(m_path); + if (!dir.IsOpened()) return; + + std::string sPath = dir.GetPath(); + std::string sGameFolder = GameName.mb_str().data(); + + Emu.GetVFS().UnMountAll(); + + sPath.erase(0, 1); + + RemoveFolder(sPath + sGameFolder); + + Refresh(); + +} + +bool GameViewer::RemoveFolder(std::string localPath) +{ + //TODO: replace wxWidgetsSpecific filesystem stuff + if (wxDirExists(fmt::FromUTF8(localPath))){ + WxDirDeleteTraverser deleter; + wxDir dir(localPath); + dir.Traverse(deleter); + return TRUE; + } + else{ + return FALSE; + } + +} \ No newline at end of file diff --git a/rpcs3/Gui/GameViewer.h b/rpcs3/Gui/GameViewer.h index d78c241e0f..c503c830b0 100644 --- a/rpcs3/Gui/GameViewer.h +++ b/rpcs3/Gui/GameViewer.h @@ -242,7 +242,7 @@ class GameViewer : public wxListView std::vector m_games; std::vector m_game_data; ColumnsArr m_columns; - + wxMenu* m_popup; public: ListSortInfo SortInfo; @@ -260,7 +260,10 @@ public: void LoadSettings(); void Refresh(); + void RemoveGame(wxCommandEvent& event); + bool RemoveFolder(std::string localPath); private: virtual void DClick(wxListEvent& event); - void OnColClick(wxListEvent& event); + virtual void OnColClick(wxListEvent& event); + virtual void RightClick(wxListEvent& event); };