From 573eb089e4db33121bf638040d109ed901330d9d Mon Sep 17 00:00:00 2001 From: William JCM Date: Thu, 9 Jan 2020 13:59:19 +0100 Subject: [PATCH] Add files and update README.md. --- Application.manifest | 22 ++ CMakeLists.txt | 48 ++++ GUI/EvtMainFrame.cpp | 295 +++++++++++++++++++++ GUI/EvtMainFrame.h | 55 ++++ GUI/MainFrame.cpp | 103 ++++++++ GUI/MainFrame.fbp | 617 +++++++++++++++++++++++++++++++++++++++++++ GUI/MainFrame.h | 63 +++++ README.md | 13 +- main.cpp | 31 +++ mb.ico | Bin 0 -> 498184 bytes resource.rc | 19 ++ 11 files changed, 1264 insertions(+), 2 deletions(-) create mode 100644 Application.manifest create mode 100644 CMakeLists.txt create mode 100644 GUI/EvtMainFrame.cpp create mode 100644 GUI/EvtMainFrame.h create mode 100644 GUI/MainFrame.cpp create mode 100644 GUI/MainFrame.fbp create mode 100644 GUI/MainFrame.h create mode 100644 main.cpp create mode 100644 mb.ico create mode 100644 resource.rc diff --git a/Application.manifest b/Application.manifest new file mode 100644 index 0000000..9106b8c --- /dev/null +++ b/Application.manifest @@ -0,0 +1,22 @@ + + + + true/pm + + + permonitorv2, permonitor, system + + + + + + + + \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..e68a3b0 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,48 @@ +# wxMASSManager +# Copyright (C) 2020 Guillaume Jacquemin +# +# 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, either version 3 of the License, or +# (at your option) any later version. +# +# 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 for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +cmake_minimum_required(VERSION 3.5) + +project(wxMASSManager LANGUAGES CXX) + +set(CMAKE_CXX_STANDARD 11) +set(CMAKE_CXX_STANDARD_REQUIRED ON) +set(CMAKE_CXX_EXTENSIONS ON) + +set(WITH_INTERCONNECT OFF CACHE BOOL "" FORCE) +set(WITH_PLUGINMANAGER OFF CACHE BOOL "" FORCE) +set(WITH_TESTSUITE OFF CACHE BOOL "" FORCE) +add_subdirectory(corrade) + +find_package(Corrade REQUIRED Containers Utility) + +include_directories(SYSTEM "C:/msys64/mingw64/lib/wx/include/msw-unicode-3.0") +include_directories(SYSTEM "C:/msys64/mingw64/include/wx-3.0") + +add_executable(wxMASSManager WIN32 + main.cpp + GUI/MainFrame.fbp + GUI/MainFrame.h + GUI/MainFrame.cpp + GUI/EvtMainFrame.h + GUI/EvtMainFrame.cpp + resource.rc) + +target_link_libraries(wxMASSManager PRIVATE + Corrade::Containers + Corrade::Utility + wx_baseu-3.0 + wx_mswu_core-3.0) diff --git a/GUI/EvtMainFrame.cpp b/GUI/EvtMainFrame.cpp new file mode 100644 index 0000000..ed02237 --- /dev/null +++ b/GUI/EvtMainFrame.cpp @@ -0,0 +1,295 @@ +// wxMASSManager +// Copyright (C) 2020 Guillaume Jacquemin +// +// 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, either version 3 of the License, or +// (at your option) any later version. +// +// 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 for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +#include +#include + +#include +#include +#include +#include + +#include +#include +#include + +#include "EvtMainFrame.h" + +using namespace Corrade; + +constexpr unsigned char mass_name_locator[] = { 'N', 'a', 'm', 'e', '_', '4', '5', '_', 'A', '0', '3', '7', 'C', '5', 'D', '5', '4', 'E', '5', '3', '4', '5', '6', '4', '0', '7', 'B', 'D', 'F', '0', '9', '1', '3', '4', '4', '5', '2', '9', 'B', 'B', '\0', 0x0C, '\0', '\0', '\0', 'S', 't', 'r', 'P', 'r', 'o', 'p', 'e', 'r', 't', 'y', '\0' }; + +constexpr unsigned char steamid_locator[] = { 'A', 'c', 'c', 'o', 'u', 'n', 't', '\0', 0x0C, '\0', '\0', '\0', 'S', 't', 'r', 'P', 'r', 'o', 'p', 'e', 'r', 't', 'y', '\0' }; + +EvtMainFrame::EvtMainFrame(wxWindow* parent): MainFrame(parent) { + SetIcon(wxIcon("MAINICON")); + + getSaveDirectory(); + getLocalSteamId(); + initialiseListView(); + + _installedListView->Connect(wxEVT_LIST_ITEM_SELECTED, wxListEventHandler(EvtMainFrame::installedSelectionEvent), nullptr, this); + _installedListView->Connect(wxEVT_LIST_ITEM_DESELECTED, wxListEventHandler(EvtMainFrame::installedSelectionEvent), nullptr, this); + _installedListView->Connect(wxEVT_LIST_BEGIN_DRAG, wxListEventHandler(EvtMainFrame::listColumnDragEvent), nullptr, this); + _installedListView->Connect(wxEVT_LIST_COL_BEGIN_DRAG, wxListEventHandler(EvtMainFrame::listColumnDragEvent), nullptr, this); + + warningMessage(wxString::FromUTF8("Before you start using this app, a few things you should know:\n\n" + "For this application to work properly, Steam Cloud syncing needs to be disabled for the game.\nTo disable it, right-click the game in your Steam library, click \"Properties\", go to the \"Updates\" tab, and uncheck \"Enable Steam Cloud synchronization for M.A.S.S. Builder\".\n\n" + "Please avoid using this application while the game is running. Bad Thingsā„¢ could happen to your data.\n\n" + "DISCLAIMER: The developer of this application cannot be held responsible for data loss or corruption. PLEASE USE AT YOUR OWN RISK!\n\n" + "Last but not least, this application is released under the terms of the GNU General Public Licence version 3. Please see the COPYING file for more details.")); +} + +EvtMainFrame::~EvtMainFrame() { + _installedListView->Disconnect(wxEVT_LIST_ITEM_SELECTED, wxListEventHandler(EvtMainFrame::installedSelectionEvent), nullptr, this); + _installedListView->Disconnect(wxEVT_LIST_ITEM_DESELECTED, wxListEventHandler(EvtMainFrame::installedSelectionEvent), nullptr, this); + _installedListView->Disconnect(wxEVT_LIST_BEGIN_DRAG, wxListEventHandler(EvtMainFrame::listColumnDragEvent), nullptr, this); + _installedListView->Disconnect(wxEVT_LIST_COL_BEGIN_DRAG, wxListEventHandler(EvtMainFrame::listColumnDragEvent), nullptr, this); +} + +void EvtMainFrame::importEvent(wxCommandEvent&) { + std::string slot_state = _installedListView->GetItemText(_installedListView->GetFirstSelected(), 1).ToStdString(); + + if(slot_state != "" && slot_state != "" && + wxMessageBox(wxString::Format("Hangar %.2d is already occupied by the M.A.S.S. named \"%s\". Are you sure you want to import a M.A.S.S. to this hangar ?", _installedListView->GetFirstSelected() + 1, slot_state), + "Question", wxYES_NO|wxCENTRE|wxICON_QUESTION, this) == wxNO) { + return; + } + + wxFileDialog dialog(this, "Select a unit file", wxEmptyString, wxEmptyString, "M.A.S.S. Builder unit files (*.sav)|*.sav", wxFD_OPEN|wxFD_FILE_MUST_EXIST); + + if(dialog.ShowModal() == wxID_CANCEL) { + return; + } + + const std::string source_file = dialog.GetPath().ToUTF8().data(); + + const std::string mass_name = getMassName(source_file); + + if(mass_name == "") { + return; + } + + if(wxMessageBox(wxString::Format("Are you sure you want to import the M.A.S.S. named \"%s\" to hangar %.2d ?", mass_name, _installedListView->GetFirstSelected() + 1), + "Question", wxYES_NO|wxCENTRE|wxICON_QUESTION, this) == wxNO) { + return; + } + + const std::string dest_file = _saveDirectory + Utility::formatString("/Unit{:.2d}{}.sav", _installedListView->GetFirstSelected(), _localSteamId); + + if(Utility::Directory::exists(dest_file)) { + Utility::Directory::rm(dest_file); + } + + Utility::Directory::copy(source_file, dest_file); + + { + auto mmap = Utility::Directory::map(dest_file); + + auto iter = std::search(mmap.begin(), mmap.end(), &steamid_locator[0], &steamid_locator[23]); + + if(iter == mmap.end()) { + errorMessage("Couldn't find the SteamID in the unit file at " + source_file + ". Aborting..."); + Utility::Directory::rm(dest_file); + return; + } + + iter += 37; + + for(int i = 0; i < 17; ++i) { + *(iter + i) = _localSteamId[i]; + } + } + + refreshListView(); +} + +void EvtMainFrame::moveEvent(wxCommandEvent&) { + long source_slot = _installedListView->GetFirstSelected(); + + long choice = wxGetNumberFromUser(wxString::Format("Which hangar do you want to move the M.A.S.S. named \"%s\" to ?\nNotes:\n- If the destination hangar is the same as the source, nothing will happen.\n- If the destination already contains a M.A.S.S., the two will be swapped.\n- If the destination contains invalid data, it will be cleared first.", _installedListView->GetItemText(source_slot, 1)), + "Slot", "Choose a slot", source_slot + 1, 1, 32, this) - 1; + + if(choice == -1 || choice == source_slot) { + return; + } + + std::string orig_file = Utility::formatString("{}/Unit{:.2d}{}.sav", _saveDirectory, source_slot, _localSteamId); + std::string dest_status = _installedListView->GetItemText(choice, 1).ToStdString(); + std::string dest_file = Utility::formatString("{}/Unit{:.2d}{}.sav", _saveDirectory, choice, _localSteamId); + + if(dest_status == "") { + Utility::Directory::rm(dest_file); + } + else if(dest_status != "") { + Utility::Directory::move(dest_file, dest_file + ".tmp"); + } + + Utility::Directory::move(orig_file, dest_file); + + if(dest_status != "") { + Utility::Directory::move(dest_file + ".tmp", orig_file); + } + + refreshListView(); +} + +void EvtMainFrame::deleteEvent(wxCommandEvent&) { + if(wxMessageBox(wxString::Format("Are you sure you want to delete the data in hangar %.2d ? This operation cannot be undone.", _installedListView->GetFirstSelected() + 1), + "Are you sure ?", wxYES_NO|wxCENTRE|wxICON_QUESTION, this) == wxNO) { + return; + } + + std::string file = Utility::formatString("{}/Unit{:.2d}{}.sav", _saveDirectory, _installedListView->GetFirstSelected(), _localSteamId); + + if(Utility::Directory::exists(file)) { + Utility::Directory::rm(file); + } + + refreshListView(); +} + +void EvtMainFrame::openSaveDirEvent(wxCommandEvent&) { + wxExecute("explorer.exe " + Utility::Directory::toNativeSeparators(_saveDirectory)); +} + +void EvtMainFrame::installedSelectionEvent(wxListEvent&) { + updateCommandsState(); +} + +void EvtMainFrame::listColumnDragEvent(wxListEvent& event) { + event.Veto(); +} + +void EvtMainFrame::timerEvent(wxTimerEvent&) { + refreshListView(); +} + +void EvtMainFrame::getSaveDirectory() { + _saveDirectory = Utility::Directory::path(Utility::Directory::home()) + "/AppData/Local/MASS_Builder/Saved/SaveGames"; + + if(!Utility::Directory::exists(_saveDirectory)) { + errorMessage("Couldn't find the M.A.S.S. Builder save directory at " + _saveDirectory + ". Please run the game at least once to create it."); + Close(); + } +} + +void EvtMainFrame::getLocalSteamId() { + std::vector listing = Utility::Directory::list(_saveDirectory); + + wxRegEx regex; + if(!regex.Compile("Profile([0-9]{17}).sav", wxRE_ADVANCED)) { + errorMessage("Couldn't compile the regex."); + Close(); + return; + } + + for(const std::string& s : listing) { + if(regex.Matches(s)) { + _localSteamId = regex.GetMatch(s, 1); + return; + } + } + + errorMessage("Couldn't find your save files. Please play at least once."); + Close(); +} + +void EvtMainFrame::initialiseListView() { + for(long i = 0; i < 32; i++) { + _installedListView->InsertItem(i, wxString::Format("%.2i", i + 1)); + } + + _installedListView->SetColumnWidth(0, wxLIST_AUTOSIZE_USEHEADER); + _installedListView->SetColumnWidth(1, wxLIST_AUTOSIZE_USEHEADER); + + refreshListView(); + + updateCommandsState(); + + _refreshTimer.Start(1000); +} + +void EvtMainFrame::refreshListView() { + for(long i = 0; i < 32; i++) { + _installedListView->SetItem(i, 1, getSlotMassName(i)); + } + + updateCommandsState(); +} + +void EvtMainFrame::updateCommandsState() { + long selection = _installedListView->GetFirstSelected(); + + if(selection != -1) { + _importButton->Enable(); + + wxString state = _installedListView->GetItemText(selection, 1); + if(state != "" && state != "") { + _moveButton->Enable(); + } + else { + _moveButton->Disable(); + } + + if(state != "") { + _deleteButton->Enable(); + } + else { + _deleteButton->Disable(); + } + } + else { + _importButton->Disable(); + _moveButton->Disable(); + _deleteButton->Disable(); + } +} + +std::string EvtMainFrame::getSlotMassName(int index) { + std::string unit_file = Utility::formatString("{}/Unit{:.2d}{}.sav", _saveDirectory, index, _localSteamId); + if(Utility::Directory::exists(unit_file)) { + std::string mass_name = getMassName(unit_file); + return (mass_name == "" ? "" : mass_name); + } + else { + return ""; + } +} + +std::string EvtMainFrame::getMassName(const std::string& filename) { + auto mmap = Utility::Directory::mapRead(filename); + + auto iter = std::search(mmap.begin(), mmap.end(), &mass_name_locator[0], &mass_name_locator[56]); + + if(iter == mmap.end()) { + return ""; + } + + return iter + 70; +} + +void EvtMainFrame::infoMessage(const wxString& message) { + wxMessageBox(message, "Information", wxOK|wxCENTRE|wxICON_INFORMATION, this); +} + +void EvtMainFrame::warningMessage(const wxString& message) { + wxMessageBox(message, "Warning", wxOK|wxCENTRE|wxICON_WARNING, this); +} + +void EvtMainFrame::errorMessage(const wxString& message) { + wxMessageBox(message, "Error", wxOK|wxCENTRE|wxICON_ERROR, this); +} diff --git a/GUI/EvtMainFrame.h b/GUI/EvtMainFrame.h new file mode 100644 index 0000000..1e21857 --- /dev/null +++ b/GUI/EvtMainFrame.h @@ -0,0 +1,55 @@ +#ifndef __EvtMainFrame__ +#define __EvtMainFrame__ + +// wxMASSManager +// Copyright (C) 2020 Guillaume Jacquemin +// +// 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, either version 3 of the License, or +// (at your option) any later version. +// +// 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 for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +#include + +#include "MainFrame.h" + +class EvtMainFrame: public MainFrame { + public: + EvtMainFrame(wxWindow* parent); + ~EvtMainFrame(); + + protected: + void importEvent(wxCommandEvent&); + void moveEvent(wxCommandEvent&); + void deleteEvent(wxCommandEvent&); + void openSaveDirEvent(wxCommandEvent&); + void installedSelectionEvent(wxListEvent&); + void listColumnDragEvent(wxListEvent&); + void timerEvent(wxTimerEvent&); + + private: + void getSaveDirectory(); + void getLocalSteamId(); + void initialiseListView(); + void refreshListView(); + void updateCommandsState(); + std::string getSlotMassName(int index); + std::string getMassName(const std::string& filename); + + void infoMessage(const wxString& message); + void warningMessage(const wxString& message); + void errorMessage(const wxString& message); + + std::string _saveDirectory; + std::string _localSteamId; +}; + +#endif // __EvtMainFrame__ diff --git a/GUI/MainFrame.cpp b/GUI/MainFrame.cpp new file mode 100644 index 0000000..1795ed2 --- /dev/null +++ b/GUI/MainFrame.cpp @@ -0,0 +1,103 @@ +/////////////////////////////////////////////////////////////////////////// +// C++ code generated with wxFormBuilder (version Oct 26 2018) +// http://www.wxformbuilder.org/ +// +// PLEASE DO *NOT* EDIT THIS FILE! +/////////////////////////////////////////////////////////////////////////// + +#include "MainFrame.h" + +/////////////////////////////////////////////////////////////////////////// + +MainFrame::MainFrame( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxFrame( parent, id, title, pos, size, style ) +{ + this->SetSizeHints( wxSize( -1,600 ), wxDefaultSize ); + this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); + + wxBoxSizer* bSizerMain; + bSizerMain = new wxBoxSizer( wxVERTICAL ); + + wxBoxSizer* bSizerMainUi; + bSizerMainUi = new wxBoxSizer( wxHORIZONTAL ); + + wxStaticBoxSizer* sbSizerInstalled; + sbSizerInstalled = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, wxT("Installed M.A.S.S.es") ), wxVERTICAL ); + + _installedListView = new wxListView(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLC_REPORT|wxLC_SINGLE_SEL|wxLC_HRULES); + _installedListView->AppendColumn("Hangar", wxLIST_FORMAT_LEFT); + _installedListView->AppendColumn("M.A.S.S. name", wxLIST_FORMAT_LEFT); + sbSizerInstalled->Add( _installedListView, 1, wxALL|wxEXPAND, 5 ); + + wxBoxSizer* bSizerInstalledButtons; + bSizerInstalledButtons = new wxBoxSizer( wxHORIZONTAL ); + + _importButton = new wxButton( sbSizerInstalled->GetStaticBox(), wxID_ANY, wxT("Import"), wxDefaultPosition, wxDefaultSize, 0 ); + bSizerInstalledButtons->Add( _importButton, 1, wxALL|wxEXPAND, 5 ); + + _moveButton = new wxButton( sbSizerInstalled->GetStaticBox(), wxID_ANY, wxT("Move"), wxDefaultPosition, wxDefaultSize, 0 ); + bSizerInstalledButtons->Add( _moveButton, 1, wxALL|wxEXPAND, 5 ); + + _deleteButton = new wxButton( sbSizerInstalled->GetStaticBox(), wxID_ANY, wxT("Delete"), wxDefaultPosition, wxDefaultSize, 0 ); + bSizerInstalledButtons->Add( _deleteButton, 1, wxALL|wxEXPAND, 5 ); + + + sbSizerInstalled->Add( bSizerInstalledButtons, 0, wxEXPAND, 5 ); + + wxBoxSizer* bSizerSecondRow; + bSizerSecondRow = new wxBoxSizer( wxHORIZONTAL ); + + + bSizerSecondRow->Add( 0, 0, 1, wxEXPAND, 5 ); + + _openSaveDirButton = new wxButton( sbSizerInstalled->GetStaticBox(), wxID_ANY, wxT("Open save directory"), wxDefaultPosition, wxDefaultSize, 0 ); + bSizerSecondRow->Add( _openSaveDirButton, 1, wxALL|wxEXPAND, 5 ); + + + bSizerSecondRow->Add( 0, 0, 1, wxEXPAND, 5 ); + + + sbSizerInstalled->Add( bSizerSecondRow, 0, wxEXPAND, 5 ); + + + bSizerMainUi->Add( sbSizerInstalled, 1, wxEXPAND|wxALL, 5 ); + + + bSizerMain->Add( bSizerMainUi, 1, wxEXPAND, 5 ); + + _riskLabel = new wxStaticText( this, wxID_ANY, wxT("USE THIS TOOL AT YOUR OWN RISK!"), wxDefaultPosition, wxDefaultSize, wxALIGN_CENTER_HORIZONTAL ); + _riskLabel->Wrap( -1 ); + _riskLabel->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); + _riskLabel->SetForegroundColour( wxColour( 255, 0, 0 ) ); + + bSizerMain->Add( _riskLabel, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND|wxTOP|wxRIGHT|wxLEFT, 5 ); + + _aboutText = new wxStaticText( this, wxID_ANY, wxT("This version of the application was tested on M.A.S.S. Builder early access version 0.2.4.\nIt may or may not work with other versions of the game.\nMade for the M.A.S.S. Builder community by Guillaume Jacquemin.\nhttps://github.com/williamjcm/wxMASSManager"), wxDefaultPosition, wxDefaultSize, wxALIGN_CENTER_HORIZONTAL ); + _aboutText->Wrap( -1 ); + bSizerMain->Add( _aboutText, 0, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 ); + + + this->SetSizer( bSizerMain ); + this->Layout(); + bSizerMain->Fit( this ); + _refreshTimer.SetOwner( this, wxID_ANY ); + + this->Centre( wxBOTH ); + + // Connect Events + _importButton->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainFrame::importEvent ), NULL, this ); + _moveButton->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainFrame::moveEvent ), NULL, this ); + _deleteButton->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainFrame::deleteEvent ), NULL, this ); + _openSaveDirButton->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainFrame::openSaveDirEvent ), NULL, this ); + this->Connect( wxID_ANY, wxEVT_TIMER, wxTimerEventHandler( MainFrame::timerEvent ) ); +} + +MainFrame::~MainFrame() +{ + // Disconnect Events + _importButton->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainFrame::importEvent ), NULL, this ); + _moveButton->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainFrame::moveEvent ), NULL, this ); + _deleteButton->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainFrame::deleteEvent ), NULL, this ); + _openSaveDirButton->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainFrame::openSaveDirEvent ), NULL, this ); + this->Disconnect( wxID_ANY, wxEVT_TIMER, wxTimerEventHandler( MainFrame::timerEvent ) ); + +} diff --git a/GUI/MainFrame.fbp b/GUI/MainFrame.fbp new file mode 100644 index 0000000..d5b5f7f --- /dev/null +++ b/GUI/MainFrame.fbp @@ -0,0 +1,617 @@ + + + + + ; + C++ + 1 + source_name + 0 + 0 + res + UTF-8 + connect + MainFrame + 1000 + none + + 0 + Evt + + . + + 1 + 1 + 1 + 1 + UI + 0 + 0 + + 0 + wxAUI_MGR_DEFAULT + wxSYS_COLOUR_WINDOW + wxBOTH + + 1 + 1 + impl_virtual + + + + 0 + wxID_ANY + + -1,600 + MainFrame + + -1,-1 + wxCAPTION|wxCLOSE_BOX|wxMINIMIZE_BOX|wxSYSTEM_MENU + ; ; forward_declare + M.A.S.S. Manager 0.1.0 + + + + wxCLIP_CHILDREN|wxTAB_TRAVERSAL + 1 + + + bSizerMain + wxVERTICAL + none + + 5 + wxEXPAND + 1 + + + bSizerMainUi + wxHORIZONTAL + none + + 5 + wxEXPAND|wxALL + 1 + + wxID_ANY + Installed M.A.S.S.es + + sbSizerInstalled + wxVERTICAL + 1 + none + + 5 + wxALL|wxEXPAND + 1 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + + 1 + _installedListView = new wxListView(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLC_REPORT|wxLC_SINGLE_SEL|wxLC_HRULES); + + 1 + wxListView* _installedListView; + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + #include <wx/listctrl.h> + + 0 + + + 0 + + 1 + _installedListView + 1 + + + protected + 1 + + Resizable + _installedListView->AppendColumn("Hangar", wxLIST_FORMAT_LEFT); _installedListView->AppendColumn("M.A.S.S. name", wxLIST_FORMAT_LEFT); + 1 + + ; ; forward_declare + 0 + + + + + + + + 5 + wxEXPAND + 0 + + + bSizerInstalledButtons + wxHORIZONTAL + none + + 5 + wxALL|wxEXPAND + 1 + + 1 + 1 + 1 + 1 + + + + + + + + + 1 + 0 + 1 + + 1 + + 0 + 0 + + Dock + 0 + Left + 1 + + 1 + + + 0 + 0 + wxID_ANY + Import + + 0 + + 0 + + + 0 + + 1 + _importButton + 1 + + + protected + 1 + + + + Resizable + 1 + + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + importEvent + + + + 5 + wxALL|wxEXPAND + 1 + + 1 + 1 + 1 + 1 + + + + + + + + + 1 + 0 + 1 + + 1 + + 0 + 0 + + Dock + 0 + Left + 1 + + 1 + + + 0 + 0 + wxID_ANY + Move + + 0 + + 0 + + + 0 + + 1 + _moveButton + 1 + + + protected + 1 + + + + Resizable + 1 + + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + moveEvent + + + + 5 + wxALL|wxEXPAND + 1 + + 1 + 1 + 1 + 1 + + + + + + + + + 1 + 0 + 1 + + 1 + + 0 + 0 + + Dock + 0 + Left + 1 + + 1 + + + 0 + 0 + wxID_ANY + Delete + + 0 + + 0 + + + 0 + + 1 + _deleteButton + 1 + + + protected + 1 + + + + Resizable + 1 + + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + deleteEvent + + + + + + 5 + wxEXPAND + 0 + + + bSizerSecondRow + wxHORIZONTAL + none + + 5 + wxEXPAND + 1 + + 0 + protected + 0 + + + + 5 + wxALL|wxEXPAND + 1 + + 1 + 1 + 1 + 1 + + + + + + + + + 1 + 0 + 1 + + 1 + + 0 + 0 + + Dock + 0 + Left + 1 + + 1 + + + 0 + 0 + wxID_ANY + Open save directory + + 0 + + 0 + + + 0 + + 1 + _openSaveDirButton + 1 + + + protected + 1 + + + + Resizable + 1 + + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + openSaveDirEvent + + + + 5 + wxEXPAND + 1 + + 0 + protected + 0 + + + + + + + + + + 5 + wxALIGN_CENTER_HORIZONTAL|wxEXPAND|wxTOP|wxRIGHT|wxLEFT + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + 255,0,0 + 1 + ,90,92,-1,70,0 + 0 + 0 + wxID_ANY + USE THIS TOOL AT YOUR OWN RISK! + 0 + + 0 + + + 0 + + 1 + _riskLabel + 1 + + + protected + 1 + + Resizable + 1 + + wxALIGN_CENTER_HORIZONTAL + ; ; forward_declare + 0 + + + + + -1 + + + + 5 + wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + This version of the application was tested on M.A.S.S. Builder early access version 0.2.4. It may or may not work with other versions of the game. Made for the M.A.S.S. Builder community by Guillaume Jacquemin. https://github.com/williamjcm/wxMASSManager + 0 + + 0 + + + 0 + + 1 + _aboutText + 1 + + + protected + 1 + + Resizable + 1 + + wxALIGN_CENTER_HORIZONTAL + ; ; forward_declare + 0 + + + + + -1 + + + + + 0 + wxID_ANY + _refreshTimer + 0 + 1000 + protected + timerEvent + + + + diff --git a/GUI/MainFrame.h b/GUI/MainFrame.h new file mode 100644 index 0000000..039b307 --- /dev/null +++ b/GUI/MainFrame.h @@ -0,0 +1,63 @@ +/////////////////////////////////////////////////////////////////////////// +// C++ code generated with wxFormBuilder (version Oct 26 2018) +// http://www.wxformbuilder.org/ +// +// PLEASE DO *NOT* EDIT THIS FILE! +/////////////////////////////////////////////////////////////////////////// + +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/////////////////////////////////////////////////////////////////////////// + + +/////////////////////////////////////////////////////////////////////////////// +/// Class MainFrame +/////////////////////////////////////////////////////////////////////////////// +class MainFrame : public wxFrame +{ + private: + + protected: + wxListView* _installedListView; + wxButton* _importButton; + wxButton* _moveButton; + wxButton* _deleteButton; + wxButton* _openSaveDirButton; + wxStaticText* _riskLabel; + wxStaticText* _aboutText; + wxTimer _refreshTimer; + + // Virtual event handlers, overide them in your derived class + virtual void importEvent( wxCommandEvent& event ) { event.Skip(); } + virtual void moveEvent( wxCommandEvent& event ) { event.Skip(); } + virtual void deleteEvent( wxCommandEvent& event ) { event.Skip(); } + virtual void openSaveDirEvent( wxCommandEvent& event ) { event.Skip(); } + virtual void timerEvent( wxTimerEvent& event ) { event.Skip(); } + + + public: + + MainFrame( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = wxT("M.A.S.S. Manager 0.1.0"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxCAPTION|wxCLOSE_BOX|wxMINIMIZE_BOX|wxSYSTEM_MENU|wxCLIP_CHILDREN|wxTAB_TRAVERSAL ); + + ~MainFrame(); + +}; + diff --git a/README.md b/README.md index df51597..f99c414 100644 --- a/README.md +++ b/README.md @@ -4,8 +4,17 @@ A manager for M.A.S.S. save files, to facilitate sharing of M.A.S.S.es between u ## Installing -TODO +Get the `wxMASSManager-win64.zip` file from the Releases page, and extract it somewhere. Then, open the `wxMASSManager` folder and launch `wxMASSManager.exe`. ## Building on MSYS2 -TODO \ No newline at end of file +1. Install the 64-bit (`x86_64`) version of [MSYS2](https://www.msys2.org/) in its default path (`C:\msys64`), and update it fully. +2. Run `pacman -S git mingw-w64-x86_64-toolchain mingw-w64-x86_64-cmake mingw-w64-x86_64-ninja mingw64/mingw-w64-x86_64-wxWidgets`. +3. In a `MINGW64` shell, type `git clone https://github.com/williamjcm/wxMASSManager`. +4. Type `cd wxMASSManager && git submodule init && git submodule update && mkdir build && cd build`. +5. Type `cmake -GNinja -DCMAKE_BUILD_TYPE=Release ..` +6. Type `ninja` +7. ... +8. Profit! + +You'll be able to find the executable in `build/Release/bin`. diff --git a/main.cpp b/main.cpp new file mode 100644 index 0000000..cc0cf98 --- /dev/null +++ b/main.cpp @@ -0,0 +1,31 @@ +// wxMASSManager +// Copyright (C) 2020 Guillaume Jacquemin +// +// 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, either version 3 of the License, or +// (at your option) any later version. +// +// 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 for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +#include + +#include "GUI/EvtMainFrame.h" + +class MyApp: public wxApp { + public: + bool OnInit() { + EvtMainFrame* main_frame = new EvtMainFrame(nullptr); + main_frame->Show(); + + return true; + } +}; + +wxIMPLEMENT_APP(MyApp); diff --git a/mb.ico b/mb.ico new file mode 100644 index 0000000000000000000000000000000000000000..79338f72ecd56d6938220c057b44aaad44db1e8d GIT binary patch literal 498184 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

u=0|Wa0|LnbK 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