Compare commits
11 commits
master
...
staging-ar
Author | SHA1 | Date | |
---|---|---|---|
5a51a70ec8 | |||
8bf2866a17 | |||
6d0c988487 | |||
31cd8058b5 | |||
678ba8fd23 | |||
27a57494dc | |||
fcf005d5a3 | |||
d968f26dab | |||
cb608ab29f | |||
3d53f90099 | |||
4c8c614000 |
8 changed files with 786 additions and 174 deletions
|
@ -32,6 +32,8 @@ 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")
|
||||
|
||||
set_directory_properties(PROPERTIES CORRADE_USE_PEDANTIC_FLAGS ON)
|
||||
|
||||
add_executable(wxMASSManager WIN32
|
||||
main.cpp
|
||||
GUI/MainFrame.fbp
|
||||
|
|
|
@ -51,6 +51,13 @@ EvtMainFrame::EvtMainFrame(wxWindow* parent): MainFrame(parent) {
|
|||
_watcher.Connect(wxEVT_FSWATCHER, wxFileSystemWatcherEventHandler(EvtMainFrame::fileUpdateEvent), nullptr, this);
|
||||
_watcher.AddTree(wxFileName(Utility::Directory::toNativeSeparators(_manager.saveDirectory()), wxPATH_WIN),
|
||||
wxFSW_EVENT_CREATE|wxFSW_EVENT_DELETE|wxFSW_EVENT_MODIFY|wxFSW_EVENT_RENAME, wxString::Format("*%s.sav", _manager.steamId()));
|
||||
_watcher.AddTree(wxFileName(Utility::Directory::toNativeSeparators(_manager.stagingAreaDirectory()), wxPATH_WIN),
|
||||
wxFSW_EVENT_CREATE|wxFSW_EVENT_DELETE|wxFSW_EVENT_MODIFY|wxFSW_EVENT_RENAME, wxString::Format("*.sav"));
|
||||
|
||||
std::vector<std::string> v = _manager.initialiseStagingArea();
|
||||
for(const std::string& s : v) {
|
||||
_stagingList->Append(s);
|
||||
}
|
||||
|
||||
_gameCheckTimer.Start(3000);
|
||||
}
|
||||
|
@ -73,30 +80,21 @@ void EvtMainFrame::importEvent(wxCommandEvent&) {
|
|||
long selected_hangar = _installedListView->GetFirstSelected();
|
||||
HangarState hangar_state = _manager.hangarState(selected_hangar);
|
||||
|
||||
if(hangar_state == HangarState::Filled &&
|
||||
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 ?",
|
||||
selected_hangar + 1, *(_manager.massName(selected_hangar))),
|
||||
"Question", wxYES_NO|wxCENTRE|wxICON_QUESTION, this) == wxNO) {
|
||||
return;
|
||||
int staged_selection = _stagingList->GetSelection();
|
||||
|
||||
int confirmation;
|
||||
|
||||
if(hangar_state == HangarState::Filled) {
|
||||
confirmation = wxMessageBox(wxString::Format("Hangar %.2d is already occupied by the M.A.S.S. named \"%s\". Are you sure you want to import the M.A.S.S. named \"%s\" to this hangar ?",
|
||||
selected_hangar + 1, *(_manager.massName(selected_hangar)), _manager.stagedMassName(staged_selection)),
|
||||
"Question", wxYES_NO|wxCENTRE|wxICON_QUESTION, this);
|
||||
}
|
||||
else {
|
||||
confirmation = wxMessageBox(wxString::Format("Are you sure you want to import the M.A.S.S. named \"%s\" to hangar %.2d ?", _manager.stagedMassName(staged_selection), selected_hangar + 1),
|
||||
"Question", wxYES_NO|wxCENTRE|wxICON_QUESTION, this);
|
||||
}
|
||||
|
||||
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();
|
||||
|
||||
Containers::Optional<std::string> mass_name = _manager.getMassName(source_file);
|
||||
|
||||
if(!mass_name) {
|
||||
errorMessage(error_prefix + _manager.lastError());
|
||||
return;
|
||||
}
|
||||
|
||||
if(wxMessageBox(wxString::Format("Are you sure you want to import the M.A.S.S. named \"%s\" to hangar %.2d ?", *mass_name, selected_hangar + 1),
|
||||
"Question", wxYES_NO|wxCENTRE|wxICON_QUESTION, this) == wxNO) {
|
||||
if(confirmation == wxNO) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -105,7 +103,7 @@ void EvtMainFrame::importEvent(wxCommandEvent&) {
|
|||
errorMessage(error_prefix + "For security reasons, importing is disabled if the game's status is unknown.");
|
||||
break;
|
||||
case GameState::NotRunning:
|
||||
if(!_manager.importMass(source_file, selected_hangar)) {
|
||||
if(!_manager.importMass(staged_selection, selected_hangar)) {
|
||||
errorMessage(error_prefix + _manager.lastError());
|
||||
}
|
||||
break;
|
||||
|
@ -115,6 +113,16 @@ void EvtMainFrame::importEvent(wxCommandEvent&) {
|
|||
}
|
||||
}
|
||||
|
||||
void EvtMainFrame::exportEvent(wxCommandEvent&) {
|
||||
const static std::string error_prefix = "Export failed:\n\n";
|
||||
|
||||
long slot = _installedListView->GetFirstSelected();
|
||||
|
||||
if(!_manager.exportMass(slot)) {
|
||||
errorMessage(error_prefix + _manager.lastError());
|
||||
}
|
||||
}
|
||||
|
||||
void EvtMainFrame::moveEvent(wxCommandEvent&) {
|
||||
const static std::string error_prefix = "Move failed:\n\n";
|
||||
|
||||
|
@ -191,6 +199,22 @@ void EvtMainFrame::openSaveDirEvent(wxCommandEvent&) {
|
|||
wxExecute("explorer.exe " + Utility::Directory::toNativeSeparators(_manager.saveDirectory()));
|
||||
}
|
||||
|
||||
void EvtMainFrame::stagingSelectionEvent(wxCommandEvent&) {
|
||||
updateCommandsState();
|
||||
}
|
||||
|
||||
void EvtMainFrame::deleteStagedEvent(wxCommandEvent&) {
|
||||
int selection = _stagingList->GetSelection();
|
||||
|
||||
if(selection != wxNOT_FOUND) {
|
||||
_manager.deleteStagedMass(selection);
|
||||
}
|
||||
}
|
||||
|
||||
void EvtMainFrame::stagingButtonEvent(wxCommandEvent&) {
|
||||
wxExecute("explorer.exe " + Utility::Directory::toNativeSeparators(_manager.stagingAreaDirectory()));
|
||||
}
|
||||
|
||||
void EvtMainFrame::installedSelectionEvent(wxListEvent&) {
|
||||
updateCommandsState();
|
||||
}
|
||||
|
@ -210,28 +234,12 @@ void EvtMainFrame::fileUpdateEvent(wxFileSystemWatcherEvent& event) {
|
|||
|
||||
wxMilliSleep(50);
|
||||
|
||||
wxRegEx regex;
|
||||
if(event.GetPath().GetPath(wxPATH_GET_VOLUME, wxPATH_WIN) == Utility::Directory::toNativeSeparators(_manager.saveDirectory())) {
|
||||
wxRegEx regex;
|
||||
|
||||
switch (event_type) {
|
||||
case wxFSW_EVENT_CREATE:
|
||||
case wxFSW_EVENT_DELETE:
|
||||
regex.Compile(wxString::Format("Unit([0-3][0-9])%s\\.sav", _manager.steamId()), wxRE_ADVANCED);
|
||||
if(regex.Matches(event_file)) {
|
||||
long slot;
|
||||
|
||||
if(regex.GetMatch(event_file, 1).ToLong(&slot) && slot >= 0 && slot < 32) {
|
||||
refreshHangar(slot);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case wxFSW_EVENT_MODIFY:
|
||||
if(_lastWatcherEventType == wxFSW_EVENT_RENAME) {
|
||||
break;
|
||||
}
|
||||
if(event_file == _manager.profileSaveName()) {
|
||||
getActiveSlot();
|
||||
}
|
||||
else {
|
||||
switch (event_type) {
|
||||
case wxFSW_EVENT_CREATE:
|
||||
case wxFSW_EVENT_DELETE:
|
||||
regex.Compile(wxString::Format("Unit([0-3][0-9])%s\\.sav", _manager.steamId()), wxRE_ADVANCED);
|
||||
if(regex.Matches(event_file)) {
|
||||
long slot;
|
||||
|
@ -240,28 +248,80 @@ void EvtMainFrame::fileUpdateEvent(wxFileSystemWatcherEvent& event) {
|
|||
refreshHangar(slot);
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
case wxFSW_EVENT_RENAME:
|
||||
wxString new_name = event.GetNewPath().GetFullName();
|
||||
|
||||
long slot;
|
||||
if(regex.Compile(wxString::Format("Unit([0-3][0-9])%s\\.sav\\.tmp", _manager.steamId()), wxRE_ADVANCED), regex.Matches(new_name)) {
|
||||
if(regex.GetMatch(new_name, 1).ToLong(&slot) && slot >= 0 && slot < 32) {
|
||||
refreshHangar(slot);
|
||||
break;
|
||||
case wxFSW_EVENT_MODIFY:
|
||||
if(_lastWatcherEventType == wxFSW_EVENT_RENAME) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
else if(regex.Compile(wxString::Format("Unit([0-3][0-9])%s\\.sav", _manager.steamId()), wxRE_ADVANCED), regex.Matches(new_name)) {
|
||||
if(regex.GetMatch(new_name, 1).ToLong(&slot) && slot >= 0 && slot < 32) {
|
||||
refreshHangar(slot);
|
||||
if(event_file == _manager.profileSaveName()) {
|
||||
getActiveSlot();
|
||||
}
|
||||
else {
|
||||
regex.Compile(wxString::Format("Unit([0-3][0-9])%s\\.sav", _manager.steamId()), wxRE_ADVANCED);
|
||||
if(regex.Matches(event_file)) {
|
||||
long slot;
|
||||
|
||||
if(regex.GetMatch(event_file, 1).ToLong(&slot) && slot >= 0 && slot < 32) {
|
||||
refreshHangar(slot);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
break;
|
||||
case wxFSW_EVENT_RENAME:
|
||||
wxString new_name = event.GetNewPath().GetFullName();
|
||||
|
||||
long slot;
|
||||
if(regex.Compile(wxString::Format("Unit([0-3][0-9])%s\\.sav\\.tmp", _manager.steamId()), wxRE_ADVANCED), regex.Matches(new_name)) {
|
||||
if(regex.GetMatch(new_name, 1).ToLong(&slot) && slot >= 0 && slot < 32) {
|
||||
refreshHangar(slot);
|
||||
}
|
||||
}
|
||||
else if(regex.Compile(wxString::Format("Unit([0-3][0-9])%s\\.sav", _manager.steamId()), wxRE_ADVANCED), regex.Matches(new_name)) {
|
||||
if(regex.GetMatch(new_name, 1).ToLong(&slot) && slot >= 0 && slot < 32) {
|
||||
refreshHangar(slot);
|
||||
if(regex.Matches(event_file)) {
|
||||
if(regex.GetMatch(event_file, 1).ToLong(&slot) && slot >= 0 && slot < 32) {
|
||||
refreshHangar(slot);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
else if(event.GetPath().GetPath(wxPATH_GET_VOLUME, wxPATH_WIN) == Utility::Directory::toNativeSeparators(_manager.stagingAreaDirectory())) {
|
||||
int index;
|
||||
|
||||
switch(event_type) {
|
||||
case wxFSW_EVENT_CREATE:
|
||||
index = _manager.updateStagedMass(event_file.ToUTF8().data());
|
||||
if(index != -1) {
|
||||
_stagingList->Insert(wxString::Format("%s (%s)", _manager.stagedMassName(index), event_file), index);
|
||||
}
|
||||
break;
|
||||
case wxFSW_EVENT_DELETE:
|
||||
index = _manager.removeStagedMass(event_file.ToUTF8().data());
|
||||
if(index != -1) {
|
||||
_stagingList->Delete(index);
|
||||
}
|
||||
break;
|
||||
case wxFSW_EVENT_MODIFY:
|
||||
index = _manager.updateStagedMass(event_file.ToUTF8().data());
|
||||
if(index != -1) {
|
||||
_stagingList->SetString(index, wxString::Format("%s (%s)", _manager.stagedMassName(index), event_file));
|
||||
}
|
||||
break;
|
||||
case wxFSW_EVENT_RENAME:
|
||||
index = _manager.removeStagedMass(event_file.ToUTF8().data());
|
||||
if(index != -1) {
|
||||
_stagingList->Delete(index);
|
||||
}
|
||||
index = _manager.updateStagedMass(event.GetNewPath().GetFullName().ToUTF8().data());
|
||||
if(index != -1) {
|
||||
_stagingList->Insert(wxString::Format("%s (%s)", _manager.stagedMassName(index), event.GetNewPath().GetFullName()), index);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
_lastWatcherEventType = event_type;
|
||||
|
@ -331,10 +391,12 @@ void EvtMainFrame::getActiveSlot() {
|
|||
|
||||
void EvtMainFrame::updateCommandsState() {
|
||||
long selection = _installedListView->GetFirstSelected();
|
||||
int staged_selection = _stagingList->GetSelection();
|
||||
GameState game_state = _manager.gameState();
|
||||
HangarState hangar_state = _manager.hangarState(selection);
|
||||
|
||||
_importButton->Enable(selection != -1 && game_state != GameState::Running);
|
||||
_importButton->Enable(selection != -1 && staged_selection != -1 && game_state != GameState::Running);
|
||||
_exportButton->Enable(selection != -1);
|
||||
_moveButton->Enable(selection != -1 && game_state != GameState::Running && hangar_state != HangarState::Empty && hangar_state != HangarState::Invalid);
|
||||
_deleteButton->Enable(selection != -1 && game_state != GameState::Running && hangar_state != HangarState::Empty);
|
||||
}
|
||||
|
|
|
@ -34,10 +34,14 @@ class EvtMainFrame: public MainFrame {
|
|||
|
||||
protected:
|
||||
void importEvent(wxCommandEvent&);
|
||||
void exportEvent(wxCommandEvent&);
|
||||
void moveEvent(wxCommandEvent&);
|
||||
void deleteEvent(wxCommandEvent&);
|
||||
void backupEvent(wxCommandEvent&);
|
||||
void openSaveDirEvent(wxCommandEvent&);
|
||||
void stagingSelectionEvent(wxCommandEvent&);
|
||||
void deleteStagedEvent(wxCommandEvent&);
|
||||
void stagingButtonEvent(wxCommandEvent&);
|
||||
void installedSelectionEvent(wxListEvent&);
|
||||
void listColumnDragEvent(wxListEvent&);
|
||||
void fileUpdateEvent(wxFileSystemWatcherEvent& event);
|
||||
|
|
|
@ -31,9 +31,6 @@ MainFrame::MainFrame( wxWindow* parent, wxWindowID id, const wxString& title, co
|
|||
wxStaticBoxSizer* sbSizerButtons;
|
||||
sbSizerButtons = new wxStaticBoxSizer( new wxStaticBox( sbSizerInstalled->GetStaticBox(), wxID_ANY, wxT("Hangar actions") ), wxHORIZONTAL );
|
||||
|
||||
_importButton = new wxButton( sbSizerButtons->GetStaticBox(), wxID_ANY, wxT("Import"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
sbSizerButtons->Add( _importButton, 1, wxALL|wxEXPAND, 5 );
|
||||
|
||||
_moveButton = new wxButton( sbSizerButtons->GetStaticBox(), wxID_ANY, wxT("Move"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
sbSizerButtons->Add( _moveButton, 1, wxALL|wxEXPAND, 5 );
|
||||
|
||||
|
@ -46,9 +43,6 @@ MainFrame::MainFrame( wxWindow* parent, wxWindowID id, const wxString& title, co
|
|||
wxBoxSizer* bSizerSecondRow;
|
||||
bSizerSecondRow = new wxBoxSizer( wxHORIZONTAL );
|
||||
|
||||
|
||||
bSizerSecondRow->Add( 0, 0, 1, wxEXPAND, 5 );
|
||||
|
||||
_zipButton = new wxButton( sbSizerInstalled->GetStaticBox(), wxID_ANY, wxT("Backup save files"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
bSizerSecondRow->Add( _zipButton, 2, wxALL|wxEXPAND, 5 );
|
||||
|
||||
|
@ -56,14 +50,43 @@ MainFrame::MainFrame( wxWindow* parent, wxWindowID id, const wxString& title, co
|
|||
bSizerSecondRow->Add( _openSaveDirButton, 2, wxEXPAND|wxALL, 5 );
|
||||
|
||||
|
||||
bSizerSecondRow->Add( 0, 0, 1, wxEXPAND, 5 );
|
||||
|
||||
|
||||
sbSizerInstalled->Add( bSizerSecondRow, 0, wxEXPAND, 5 );
|
||||
sbSizerInstalled->Add( bSizerSecondRow, 0, wxEXPAND|wxRIGHT|wxLEFT, 5 );
|
||||
|
||||
|
||||
bSizerMainUi->Add( sbSizerInstalled, 1, wxEXPAND|wxALL, 5 );
|
||||
|
||||
wxBoxSizer* bSizerImportExport;
|
||||
bSizerImportExport = new wxBoxSizer( wxVERTICAL );
|
||||
|
||||
_importButton = new wxButton( this, wxID_ANY, wxT("Import"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
|
||||
_importButton->SetBitmap( wxArtProvider::GetBitmap( wxART_GO_BACK, wxART_BUTTON ) );
|
||||
bSizerImportExport->Add( _importButton, 1, wxALL|wxEXPAND, 5 );
|
||||
|
||||
_exportButton = new wxButton( this, wxID_ANY, wxT("Export"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
|
||||
_exportButton->SetBitmap( wxArtProvider::GetBitmap( wxART_GO_FORWARD, wxART_BUTTON ) );
|
||||
_exportButton->SetBitmapPosition( wxRIGHT );
|
||||
bSizerImportExport->Add( _exportButton, 0, wxALL|wxEXPAND, 5 );
|
||||
|
||||
|
||||
bSizerMainUi->Add( bSizerImportExport, 0, wxALIGN_CENTER_VERTICAL, 5 );
|
||||
|
||||
wxStaticBoxSizer* sbSizerStagingArea;
|
||||
sbSizerStagingArea = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, wxT("Staging area") ), wxVERTICAL );
|
||||
|
||||
_stagingList = new wxListBox( sbSizerStagingArea->GetStaticBox(), wxID_ANY, wxDefaultPosition, wxDefaultSize, 0, NULL, wxLB_NEEDED_SB|wxLB_SINGLE );
|
||||
sbSizerStagingArea->Add( _stagingList, 1, wxALL|wxEXPAND, 5 );
|
||||
|
||||
_deleteStagedButton = new wxButton( sbSizerStagingArea->GetStaticBox(), wxID_ANY, wxT("Delete staged M.A.S.S."), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
sbSizerStagingArea->Add( _deleteStagedButton, 0, wxALL|wxEXPAND, 5 );
|
||||
|
||||
_stagingAreaButton = new wxButton( sbSizerStagingArea->GetStaticBox(), wxID_ANY, wxT("Open staging area directory"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
sbSizerStagingArea->Add( _stagingAreaButton, 0, wxALL|wxEXPAND, 5 );
|
||||
|
||||
|
||||
bSizerMainUi->Add( sbSizerStagingArea, 1, wxEXPAND|wxALL, 5 );
|
||||
|
||||
|
||||
bSizerMain->Add( bSizerMainUi, 1, wxEXPAND, 5 );
|
||||
|
||||
|
@ -104,22 +127,30 @@ MainFrame::MainFrame( wxWindow* parent, wxWindowID id, const wxString& title, co
|
|||
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 );
|
||||
_zipButton->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainFrame::backupEvent ), NULL, this );
|
||||
_openSaveDirButton->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainFrame::openSaveDirEvent ), NULL, this );
|
||||
_importButton->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainFrame::importEvent ), NULL, this );
|
||||
_exportButton->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainFrame::exportEvent ), NULL, this );
|
||||
_stagingList->Connect( wxEVT_COMMAND_LISTBOX_SELECTED, wxCommandEventHandler( MainFrame::stagingSelectionEvent ), NULL, this );
|
||||
_deleteStagedButton->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainFrame::deleteStagedEvent ), NULL, this );
|
||||
_stagingAreaButton->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainFrame::stagingButtonEvent ), NULL, this );
|
||||
this->Connect( wxID_ANY, wxEVT_TIMER, wxTimerEventHandler( MainFrame::gameCheckTimerEvent ) );
|
||||
}
|
||||
|
||||
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 );
|
||||
_zipButton->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainFrame::backupEvent ), NULL, this );
|
||||
_openSaveDirButton->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainFrame::openSaveDirEvent ), NULL, this );
|
||||
_importButton->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainFrame::importEvent ), NULL, this );
|
||||
_exportButton->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainFrame::exportEvent ), NULL, this );
|
||||
_stagingList->Disconnect( wxEVT_COMMAND_LISTBOX_SELECTED, wxCommandEventHandler( MainFrame::stagingSelectionEvent ), NULL, this );
|
||||
_deleteStagedButton->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainFrame::deleteStagedEvent ), NULL, this );
|
||||
_stagingAreaButton->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainFrame::stagingButtonEvent ), NULL, this );
|
||||
this->Disconnect( wxID_ANY, wxEVT_TIMER, wxTimerEventHandler( MainFrame::gameCheckTimerEvent ) );
|
||||
|
||||
}
|
||||
|
|
|
@ -48,7 +48,7 @@
|
|||
<property name="size">-1,-1</property>
|
||||
<property name="style">wxCAPTION|wxCLOSE_BOX|wxMINIMIZE_BOX|wxSYSTEM_MENU</property>
|
||||
<property name="subclass">; ; forward_declare</property>
|
||||
<property name="title">M.A.S.S. Manager 0.2.0</property>
|
||||
<property name="title">M.A.S.S. Manager 1.0.0-pre</property>
|
||||
<property name="tooltip"></property>
|
||||
<property name="window_extra_style"></property>
|
||||
<property name="window_name"></property>
|
||||
|
@ -154,79 +154,6 @@
|
|||
<property name="orient">wxHORIZONTAL</property>
|
||||
<property name="parent">1</property>
|
||||
<property name="permission">none</property>
|
||||
<object class="sizeritem" expanded="1">
|
||||
<property name="border">5</property>
|
||||
<property name="flag">wxALL|wxEXPAND</property>
|
||||
<property name="proportion">1</property>
|
||||
<object class="wxButton" expanded="1">
|
||||
<property name="BottomDockable">1</property>
|
||||
<property name="LeftDockable">1</property>
|
||||
<property name="RightDockable">1</property>
|
||||
<property name="TopDockable">1</property>
|
||||
<property name="aui_layer"></property>
|
||||
<property name="aui_name"></property>
|
||||
<property name="aui_position"></property>
|
||||
<property name="aui_row"></property>
|
||||
<property name="best_size"></property>
|
||||
<property name="bg"></property>
|
||||
<property name="bitmap"></property>
|
||||
<property name="caption"></property>
|
||||
<property name="caption_visible">1</property>
|
||||
<property name="center_pane">0</property>
|
||||
<property name="close_button">1</property>
|
||||
<property name="context_help"></property>
|
||||
<property name="context_menu">1</property>
|
||||
<property name="current"></property>
|
||||
<property name="default">0</property>
|
||||
<property name="default_pane">0</property>
|
||||
<property name="disabled"></property>
|
||||
<property name="dock">Dock</property>
|
||||
<property name="dock_fixed">0</property>
|
||||
<property name="docking">Left</property>
|
||||
<property name="enabled">1</property>
|
||||
<property name="fg"></property>
|
||||
<property name="floatable">1</property>
|
||||
<property name="focus"></property>
|
||||
<property name="font"></property>
|
||||
<property name="gripper">0</property>
|
||||
<property name="hidden">0</property>
|
||||
<property name="id">wxID_ANY</property>
|
||||
<property name="label">Import</property>
|
||||
<property name="margins"></property>
|
||||
<property name="markup">0</property>
|
||||
<property name="max_size"></property>
|
||||
<property name="maximize_button">0</property>
|
||||
<property name="maximum_size"></property>
|
||||
<property name="min_size"></property>
|
||||
<property name="minimize_button">0</property>
|
||||
<property name="minimum_size"></property>
|
||||
<property name="moveable">1</property>
|
||||
<property name="name">_importButton</property>
|
||||
<property name="pane_border">1</property>
|
||||
<property name="pane_position"></property>
|
||||
<property name="pane_size"></property>
|
||||
<property name="permission">protected</property>
|
||||
<property name="pin_button">1</property>
|
||||
<property name="pos"></property>
|
||||
<property name="position"></property>
|
||||
<property name="pressed"></property>
|
||||
<property name="resize">Resizable</property>
|
||||
<property name="show">1</property>
|
||||
<property name="size"></property>
|
||||
<property name="style"></property>
|
||||
<property name="subclass">; ; forward_declare</property>
|
||||
<property name="toolbar_pane">0</property>
|
||||
<property name="tooltip"></property>
|
||||
<property name="validator_data_type"></property>
|
||||
<property name="validator_style">wxFILTER_NONE</property>
|
||||
<property name="validator_type">wxDefaultValidator</property>
|
||||
<property name="validator_variable"></property>
|
||||
<property name="window_extra_style"></property>
|
||||
<property name="window_name"></property>
|
||||
<property name="window_style"></property>
|
||||
<event name="OnButtonClick">importEvent</event>
|
||||
</object>
|
||||
</object>
|
||||
<object class="sizeritem" expanded="1">
|
||||
<property name="border">5</property>
|
||||
<property name="flag">wxALL|wxEXPAND</property>
|
||||
|
@ -377,23 +304,13 @@
|
|||
</object>
|
||||
<object class="sizeritem" expanded="1">
|
||||
<property name="border">5</property>
|
||||
<property name="flag">wxEXPAND</property>
|
||||
<property name="flag">wxEXPAND|wxRIGHT|wxLEFT</property>
|
||||
<property name="proportion">0</property>
|
||||
<object class="wxBoxSizer" expanded="1">
|
||||
<property name="minimum_size"></property>
|
||||
<property name="name">bSizerSecondRow</property>
|
||||
<property name="orient">wxHORIZONTAL</property>
|
||||
<property name="permission">none</property>
|
||||
<object class="sizeritem" expanded="1">
|
||||
<property name="border">5</property>
|
||||
<property name="flag">wxEXPAND</property>
|
||||
<property name="proportion">1</property>
|
||||
<object class="spacer" expanded="1">
|
||||
<property name="height">0</property>
|
||||
<property name="permission">protected</property>
|
||||
<property name="width">0</property>
|
||||
</object>
|
||||
</object>
|
||||
<object class="sizeritem" expanded="1">
|
||||
<property name="border">5</property>
|
||||
<property name="flag">wxALL|wxEXPAND</property>
|
||||
|
@ -540,16 +457,387 @@
|
|||
<event name="OnButtonClick">openSaveDirEvent</event>
|
||||
</object>
|
||||
</object>
|
||||
<object class="sizeritem" expanded="1">
|
||||
<property name="border">5</property>
|
||||
<property name="flag">wxEXPAND</property>
|
||||
<property name="proportion">1</property>
|
||||
<object class="spacer" expanded="1">
|
||||
<property name="height">0</property>
|
||||
<property name="permission">protected</property>
|
||||
<property name="width">0</property>
|
||||
</object>
|
||||
</object>
|
||||
</object>
|
||||
</object>
|
||||
</object>
|
||||
</object>
|
||||
<object class="sizeritem" expanded="1">
|
||||
<property name="border">5</property>
|
||||
<property name="flag">wxALIGN_CENTER_VERTICAL</property>
|
||||
<property name="proportion">0</property>
|
||||
<object class="wxBoxSizer" expanded="1">
|
||||
<property name="minimum_size"></property>
|
||||
<property name="name">bSizerImportExport</property>
|
||||
<property name="orient">wxVERTICAL</property>
|
||||
<property name="permission">none</property>
|
||||
<object class="sizeritem" expanded="1">
|
||||
<property name="border">5</property>
|
||||
<property name="flag">wxALL|wxEXPAND</property>
|
||||
<property name="proportion">1</property>
|
||||
<object class="wxButton" expanded="1">
|
||||
<property name="BottomDockable">1</property>
|
||||
<property name="LeftDockable">1</property>
|
||||
<property name="RightDockable">1</property>
|
||||
<property name="TopDockable">1</property>
|
||||
<property name="aui_layer"></property>
|
||||
<property name="aui_name"></property>
|
||||
<property name="aui_position"></property>
|
||||
<property name="aui_row"></property>
|
||||
<property name="best_size"></property>
|
||||
<property name="bg"></property>
|
||||
<property name="bitmap">Load From Art Provider; wxART_GO_BACK; wxART_BUTTON</property>
|
||||
<property name="caption"></property>
|
||||
<property name="caption_visible">1</property>
|
||||
<property name="center_pane">0</property>
|
||||
<property name="close_button">1</property>
|
||||
<property name="context_help"></property>
|
||||
<property name="context_menu">1</property>
|
||||
<property name="current"></property>
|
||||
<property name="default">0</property>
|
||||
<property name="default_pane">0</property>
|
||||
<property name="disabled"></property>
|
||||
<property name="dock">Dock</property>
|
||||
<property name="dock_fixed">0</property>
|
||||
<property name="docking">Left</property>
|
||||
<property name="enabled">1</property>
|
||||
<property name="fg"></property>
|
||||
<property name="floatable">1</property>
|
||||
<property name="focus"></property>
|
||||
<property name="font"></property>
|
||||
<property name="gripper">0</property>
|
||||
<property name="hidden">0</property>
|
||||
<property name="id">wxID_ANY</property>
|
||||
<property name="label">Import</property>
|
||||
<property name="margins"></property>
|
||||
<property name="markup">0</property>
|
||||
<property name="max_size"></property>
|
||||
<property name="maximize_button">0</property>
|
||||
<property name="maximum_size"></property>
|
||||
<property name="min_size"></property>
|
||||
<property name="minimize_button">0</property>
|
||||
<property name="minimum_size"></property>
|
||||
<property name="moveable">1</property>
|
||||
<property name="name">_importButton</property>
|
||||
<property name="pane_border">1</property>
|
||||
<property name="pane_position"></property>
|
||||
<property name="pane_size"></property>
|
||||
<property name="permission">protected</property>
|
||||
<property name="pin_button">1</property>
|
||||
<property name="pos"></property>
|
||||
<property name="position"></property>
|
||||
<property name="pressed"></property>
|
||||
<property name="resize">Resizable</property>
|
||||
<property name="show">1</property>
|
||||
<property name="size"></property>
|
||||
<property name="style"></property>
|
||||
<property name="subclass">; ; forward_declare</property>
|
||||
<property name="toolbar_pane">0</property>
|
||||
<property name="tooltip"></property>
|
||||
<property name="validator_data_type"></property>
|
||||
<property name="validator_style">wxFILTER_NONE</property>
|
||||
<property name="validator_type">wxDefaultValidator</property>
|
||||
<property name="validator_variable"></property>
|
||||
<property name="window_extra_style"></property>
|
||||
<property name="window_name"></property>
|
||||
<property name="window_style"></property>
|
||||
<event name="OnButtonClick">importEvent</event>
|
||||
</object>
|
||||
</object>
|
||||
<object class="sizeritem" expanded="1">
|
||||
<property name="border">5</property>
|
||||
<property name="flag">wxALL|wxEXPAND</property>
|
||||
<property name="proportion">0</property>
|
||||
<object class="wxButton" expanded="1">
|
||||
<property name="BottomDockable">1</property>
|
||||
<property name="LeftDockable">1</property>
|
||||
<property name="RightDockable">1</property>
|
||||
<property name="TopDockable">1</property>
|
||||
<property name="aui_layer"></property>
|
||||
<property name="aui_name"></property>
|
||||
<property name="aui_position"></property>
|
||||
<property name="aui_row"></property>
|
||||
<property name="best_size"></property>
|
||||
<property name="bg"></property>
|
||||
<property name="bitmap">Load From Art Provider; wxART_GO_FORWARD; wxART_BUTTON</property>
|
||||
<property name="caption"></property>
|
||||
<property name="caption_visible">1</property>
|
||||
<property name="center_pane">0</property>
|
||||
<property name="close_button">1</property>
|
||||
<property name="context_help"></property>
|
||||
<property name="context_menu">1</property>
|
||||
<property name="current"></property>
|
||||
<property name="default">0</property>
|
||||
<property name="default_pane">0</property>
|
||||
<property name="disabled"></property>
|
||||
<property name="dock">Dock</property>
|
||||
<property name="dock_fixed">0</property>
|
||||
<property name="docking">Left</property>
|
||||
<property name="enabled">1</property>
|
||||
<property name="fg"></property>
|
||||
<property name="floatable">1</property>
|
||||
<property name="focus"></property>
|
||||
<property name="font"></property>
|
||||
<property name="gripper">0</property>
|
||||
<property name="hidden">0</property>
|
||||
<property name="id">wxID_ANY</property>
|
||||
<property name="label">Export</property>
|
||||
<property name="margins"></property>
|
||||
<property name="markup">0</property>
|
||||
<property name="max_size"></property>
|
||||
<property name="maximize_button">0</property>
|
||||
<property name="maximum_size"></property>
|
||||
<property name="min_size"></property>
|
||||
<property name="minimize_button">0</property>
|
||||
<property name="minimum_size"></property>
|
||||
<property name="moveable">1</property>
|
||||
<property name="name">_exportButton</property>
|
||||
<property name="pane_border">1</property>
|
||||
<property name="pane_position"></property>
|
||||
<property name="pane_size"></property>
|
||||
<property name="permission">protected</property>
|
||||
<property name="pin_button">1</property>
|
||||
<property name="pos"></property>
|
||||
<property name="position">wxRIGHT</property>
|
||||
<property name="pressed"></property>
|
||||
<property name="resize">Resizable</property>
|
||||
<property name="show">1</property>
|
||||
<property name="size"></property>
|
||||
<property name="style"></property>
|
||||
<property name="subclass">; ; forward_declare</property>
|
||||
<property name="toolbar_pane">0</property>
|
||||
<property name="tooltip"></property>
|
||||
<property name="validator_data_type"></property>
|
||||
<property name="validator_style">wxFILTER_NONE</property>
|
||||
<property name="validator_type">wxDefaultValidator</property>
|
||||
<property name="validator_variable"></property>
|
||||
<property name="window_extra_style"></property>
|
||||
<property name="window_name"></property>
|
||||
<property name="window_style"></property>
|
||||
<event name="OnButtonClick">exportEvent</event>
|
||||
</object>
|
||||
</object>
|
||||
</object>
|
||||
</object>
|
||||
<object class="sizeritem" expanded="1">
|
||||
<property name="border">5</property>
|
||||
<property name="flag">wxEXPAND|wxALL</property>
|
||||
<property name="proportion">1</property>
|
||||
<object class="wxStaticBoxSizer" expanded="1">
|
||||
<property name="id">wxID_ANY</property>
|
||||
<property name="label">Staging area</property>
|
||||
<property name="minimum_size"></property>
|
||||
<property name="name">sbSizerStagingArea</property>
|
||||
<property name="orient">wxVERTICAL</property>
|
||||
<property name="parent">1</property>
|
||||
<property name="permission">none</property>
|
||||
<object class="sizeritem" expanded="1">
|
||||
<property name="border">5</property>
|
||||
<property name="flag">wxALL|wxEXPAND</property>
|
||||
<property name="proportion">1</property>
|
||||
<object class="wxListBox" expanded="1">
|
||||
<property name="BottomDockable">1</property>
|
||||
<property name="LeftDockable">1</property>
|
||||
<property name="RightDockable">1</property>
|
||||
<property name="TopDockable">1</property>
|
||||
<property name="aui_layer"></property>
|
||||
<property name="aui_name"></property>
|
||||
<property name="aui_position"></property>
|
||||
<property name="aui_row"></property>
|
||||
<property name="best_size"></property>
|
||||
<property name="bg"></property>
|
||||
<property name="caption"></property>
|
||||
<property name="caption_visible">1</property>
|
||||
<property name="center_pane">0</property>
|
||||
<property name="choices"></property>
|
||||
<property name="close_button">1</property>
|
||||
<property name="context_help"></property>
|
||||
<property name="context_menu">1</property>
|
||||
<property name="default_pane">0</property>
|
||||
<property name="dock">Dock</property>
|
||||
<property name="dock_fixed">0</property>
|
||||
<property name="docking">Left</property>
|
||||
<property name="enabled">1</property>
|
||||
<property name="fg"></property>
|
||||
<property name="floatable">1</property>
|
||||
<property name="font"></property>
|
||||
<property name="gripper">0</property>
|
||||
<property name="hidden">0</property>
|
||||
<property name="id">wxID_ANY</property>
|
||||
<property name="max_size"></property>
|
||||
<property name="maximize_button">0</property>
|
||||
<property name="maximum_size"></property>
|
||||
<property name="min_size"></property>
|
||||
<property name="minimize_button">0</property>
|
||||
<property name="minimum_size"></property>
|
||||
<property name="moveable">1</property>
|
||||
<property name="name">_stagingList</property>
|
||||
<property name="pane_border">1</property>
|
||||
<property name="pane_position"></property>
|
||||
<property name="pane_size"></property>
|
||||
<property name="permission">protected</property>
|
||||
<property name="pin_button">1</property>
|
||||
<property name="pos"></property>
|
||||
<property name="resize">Resizable</property>
|
||||
<property name="show">1</property>
|
||||
<property name="size"></property>
|
||||
<property name="style">wxLB_NEEDED_SB|wxLB_SINGLE</property>
|
||||
<property name="subclass">; ; forward_declare</property>
|
||||
<property name="toolbar_pane">0</property>
|
||||
<property name="tooltip"></property>
|
||||
<property name="validator_data_type"></property>
|
||||
<property name="validator_style">wxFILTER_NONE</property>
|
||||
<property name="validator_type">wxDefaultValidator</property>
|
||||
<property name="validator_variable"></property>
|
||||
<property name="window_extra_style"></property>
|
||||
<property name="window_name"></property>
|
||||
<property name="window_style"></property>
|
||||
<event name="OnListBox">stagingSelectionEvent</event>
|
||||
</object>
|
||||
</object>
|
||||
<object class="sizeritem" expanded="1">
|
||||
<property name="border">5</property>
|
||||
<property name="flag">wxALL|wxEXPAND</property>
|
||||
<property name="proportion">0</property>
|
||||
<object class="wxButton" expanded="1">
|
||||
<property name="BottomDockable">1</property>
|
||||
<property name="LeftDockable">1</property>
|
||||
<property name="RightDockable">1</property>
|
||||
<property name="TopDockable">1</property>
|
||||
<property name="aui_layer"></property>
|
||||
<property name="aui_name"></property>
|
||||
<property name="aui_position"></property>
|
||||
<property name="aui_row"></property>
|
||||
<property name="best_size"></property>
|
||||
<property name="bg"></property>
|
||||
<property name="bitmap"></property>
|
||||
<property name="caption"></property>
|
||||
<property name="caption_visible">1</property>
|
||||
<property name="center_pane">0</property>
|
||||
<property name="close_button">1</property>
|
||||
<property name="context_help"></property>
|
||||
<property name="context_menu">1</property>
|
||||
<property name="current"></property>
|
||||
<property name="default">0</property>
|
||||
<property name="default_pane">0</property>
|
||||
<property name="disabled"></property>
|
||||
<property name="dock">Dock</property>
|
||||
<property name="dock_fixed">0</property>
|
||||
<property name="docking">Left</property>
|
||||
<property name="enabled">1</property>
|
||||
<property name="fg"></property>
|
||||
<property name="floatable">1</property>
|
||||
<property name="focus"></property>
|
||||
<property name="font"></property>
|
||||
<property name="gripper">0</property>
|
||||
<property name="hidden">0</property>
|
||||
<property name="id">wxID_ANY</property>
|
||||
<property name="label">Delete staged M.A.S.S.</property>
|
||||
<property name="margins"></property>
|
||||
<property name="markup">0</property>
|
||||
<property name="max_size"></property>
|
||||
<property name="maximize_button">0</property>
|
||||
<property name="maximum_size"></property>
|
||||
<property name="min_size"></property>
|
||||
<property name="minimize_button">0</property>
|
||||
<property name="minimum_size"></property>
|
||||
<property name="moveable">1</property>
|
||||
<property name="name">_deleteStagedButton</property>
|
||||
<property name="pane_border">1</property>
|
||||
<property name="pane_position"></property>
|
||||
<property name="pane_size"></property>
|
||||
<property name="permission">protected</property>
|
||||
<property name="pin_button">1</property>
|
||||
<property name="pos"></property>
|
||||
<property name="position"></property>
|
||||
<property name="pressed"></property>
|
||||
<property name="resize">Resizable</property>
|
||||
<property name="show">1</property>
|
||||
<property name="size"></property>
|
||||
<property name="style"></property>
|
||||
<property name="subclass">; ; forward_declare</property>
|
||||
<property name="toolbar_pane">0</property>
|
||||
<property name="tooltip"></property>
|
||||
<property name="validator_data_type"></property>
|
||||
<property name="validator_style">wxFILTER_NONE</property>
|
||||
<property name="validator_type">wxDefaultValidator</property>
|
||||
<property name="validator_variable"></property>
|
||||
<property name="window_extra_style"></property>
|
||||
<property name="window_name"></property>
|
||||
<property name="window_style"></property>
|
||||
<event name="OnButtonClick">deleteStagedEvent</event>
|
||||
</object>
|
||||
</object>
|
||||
<object class="sizeritem" expanded="1">
|
||||
<property name="border">5</property>
|
||||
<property name="flag">wxALL|wxEXPAND</property>
|
||||
<property name="proportion">0</property>
|
||||
<object class="wxButton" expanded="1">
|
||||
<property name="BottomDockable">1</property>
|
||||
<property name="LeftDockable">1</property>
|
||||
<property name="RightDockable">1</property>
|
||||
<property name="TopDockable">1</property>
|
||||
<property name="aui_layer"></property>
|
||||
<property name="aui_name"></property>
|
||||
<property name="aui_position"></property>
|
||||
<property name="aui_row"></property>
|
||||
<property name="best_size"></property>
|
||||
<property name="bg"></property>
|
||||
<property name="bitmap"></property>
|
||||
<property name="caption"></property>
|
||||
<property name="caption_visible">1</property>
|
||||
<property name="center_pane">0</property>
|
||||
<property name="close_button">1</property>
|
||||
<property name="context_help"></property>
|
||||
<property name="context_menu">1</property>
|
||||
<property name="current"></property>
|
||||
<property name="default">0</property>
|
||||
<property name="default_pane">0</property>
|
||||
<property name="disabled"></property>
|
||||
<property name="dock">Dock</property>
|
||||
<property name="dock_fixed">0</property>
|
||||
<property name="docking">Left</property>
|
||||
<property name="enabled">1</property>
|
||||
<property name="fg"></property>
|
||||
<property name="floatable">1</property>
|
||||
<property name="focus"></property>
|
||||
<property name="font"></property>
|
||||
<property name="gripper">0</property>
|
||||
<property name="hidden">0</property>
|
||||
<property name="id">wxID_ANY</property>
|
||||
<property name="label">Open staging area directory</property>
|
||||
<property name="margins"></property>
|
||||
<property name="markup">0</property>
|
||||
<property name="max_size"></property>
|
||||
<property name="maximize_button">0</property>
|
||||
<property name="maximum_size"></property>
|
||||
<property name="min_size"></property>
|
||||
<property name="minimize_button">0</property>
|
||||
<property name="minimum_size"></property>
|
||||
<property name="moveable">1</property>
|
||||
<property name="name">_stagingAreaButton</property>
|
||||
<property name="pane_border">1</property>
|
||||
<property name="pane_position"></property>
|
||||
<property name="pane_size"></property>
|
||||
<property name="permission">protected</property>
|
||||
<property name="pin_button">1</property>
|
||||
<property name="pos"></property>
|
||||
<property name="position"></property>
|
||||
<property name="pressed"></property>
|
||||
<property name="resize">Resizable</property>
|
||||
<property name="show">1</property>
|
||||
<property name="size"></property>
|
||||
<property name="style"></property>
|
||||
<property name="subclass">; ; forward_declare</property>
|
||||
<property name="toolbar_pane">0</property>
|
||||
<property name="tooltip"></property>
|
||||
<property name="validator_data_type"></property>
|
||||
<property name="validator_style">wxFILTER_NONE</property>
|
||||
<property name="validator_type">wxDefaultValidator</property>
|
||||
<property name="validator_variable"></property>
|
||||
<property name="window_extra_style"></property>
|
||||
<property name="window_name"></property>
|
||||
<property name="window_style"></property>
|
||||
<event name="OnButtonClick">stagingButtonEvent</event>
|
||||
</object>
|
||||
</object>
|
||||
</object>
|
||||
|
|
|
@ -21,6 +21,7 @@
|
|||
#include <wx/button.h>
|
||||
#include <wx/sizer.h>
|
||||
#include <wx/statbox.h>
|
||||
#include <wx/listbox.h>
|
||||
#include <wx/stattext.h>
|
||||
#include <wx/timer.h>
|
||||
#include <wx/frame.h>
|
||||
|
@ -37,11 +38,15 @@ class MainFrame : public wxFrame
|
|||
|
||||
protected:
|
||||
wxListView* _installedListView;
|
||||
wxButton* _importButton;
|
||||
wxButton* _moveButton;
|
||||
wxButton* _deleteButton;
|
||||
wxButton* _zipButton;
|
||||
wxButton* _openSaveDirButton;
|
||||
wxButton* _importButton;
|
||||
wxButton* _exportButton;
|
||||
wxListBox* _stagingList;
|
||||
wxButton* _deleteStagedButton;
|
||||
wxButton* _stagingAreaButton;
|
||||
wxStaticText* _riskLabel;
|
||||
wxStaticText* _gameStatusLabel;
|
||||
wxStaticText* _gameStatus;
|
||||
|
@ -49,17 +54,21 @@ class MainFrame : public wxFrame
|
|||
wxTimer _gameCheckTimer;
|
||||
|
||||
// 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 backupEvent( wxCommandEvent& event ) { event.Skip(); }
|
||||
virtual void openSaveDirEvent( wxCommandEvent& event ) { event.Skip(); }
|
||||
virtual void importEvent( wxCommandEvent& event ) { event.Skip(); }
|
||||
virtual void exportEvent( wxCommandEvent& event ) { event.Skip(); }
|
||||
virtual void stagingSelectionEvent( wxCommandEvent& event ) { event.Skip(); }
|
||||
virtual void deleteStagedEvent( wxCommandEvent& event ) { event.Skip(); }
|
||||
virtual void stagingButtonEvent( wxCommandEvent& event ) { event.Skip(); }
|
||||
virtual void gameCheckTimerEvent( wxTimerEvent& event ) { event.Skip(); }
|
||||
|
||||
|
||||
public:
|
||||
|
||||
MainFrame( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = wxT("M.A.S.S. Manager 0.2.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( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = wxT("M.A.S.S. Manager 1.0.0-pre"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxCAPTION|wxCLOSE_BOX|wxMINIMIZE_BOX|wxSYSTEM_MENU|wxCLIP_CHILDREN|wxTAB_TRAVERSAL );
|
||||
|
||||
~MainFrame();
|
||||
|
||||
|
|
|
@ -17,13 +17,11 @@
|
|||
#include <cstring>
|
||||
|
||||
#include <algorithm>
|
||||
#include <vector>
|
||||
|
||||
#include <wx/regex.h>
|
||||
#include <wx/wfstream.h>
|
||||
#include <wx/zipstrm.h>
|
||||
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#include <shlobj.h>
|
||||
#include <wtsapi32.h>
|
||||
|
||||
|
@ -48,12 +46,18 @@ MassManager::MassManager() {
|
|||
return;
|
||||
}
|
||||
|
||||
_executableLocation = Utility::Directory::path(Utility::Directory::executableLocation());
|
||||
|
||||
_stagingAreaDirectory = Utility::Directory::join(_executableLocation, "staging");
|
||||
|
||||
_profileSaveName = Utility::formatString("Profile{}.sav", _steamId);
|
||||
|
||||
for(int i = 0; i < 32; ++i) {
|
||||
_hangars[i]._filename = Utility::formatString("Unit{:.2d}{}.sav", i, _steamId);
|
||||
refreshHangar(i);
|
||||
}
|
||||
|
||||
initialiseStagingArea();
|
||||
}
|
||||
|
||||
auto MassManager::ready() -> bool {
|
||||
|
@ -68,6 +72,10 @@ auto MassManager::saveDirectory() -> std::string const& {
|
|||
return _saveDirectory;
|
||||
}
|
||||
|
||||
auto MassManager::stagingAreaDirectory() -> std::string const& {
|
||||
return _stagingAreaDirectory;
|
||||
}
|
||||
|
||||
auto MassManager::steamId() -> std::string const& {
|
||||
return _steamId;
|
||||
}
|
||||
|
@ -171,6 +179,87 @@ auto MassManager::importMass(const std::string& source, int hangar) -> bool {
|
|||
return true;
|
||||
}
|
||||
|
||||
auto MassManager::importMass(int staged_index, int hangar) -> bool {
|
||||
if(hangar < 0 && hangar >= 32) {
|
||||
_lastError = "Hangar out of range in MassManager::importMass()";
|
||||
return false;
|
||||
}
|
||||
|
||||
int i = 0;
|
||||
for(const auto& mass_info : _stagedMasses) {
|
||||
if(i != staged_index) {
|
||||
++i;
|
||||
continue;
|
||||
}
|
||||
|
||||
std::string source = Utility::Directory::join(_stagingAreaDirectory, mass_info.first);
|
||||
|
||||
Utility::Directory::copy(source, source + ".tmp");
|
||||
|
||||
{
|
||||
auto mmap = Utility::Directory::map(source + ".tmp");
|
||||
|
||||
auto iter = std::search(mmap.begin(), mmap.end(), &steamid_locator[0], &steamid_locator[23]);
|
||||
|
||||
if(iter == mmap.end()) {
|
||||
_lastError = "The M.A.S.S. file at " + source + " seems to be corrupt.";
|
||||
Utility::Directory::rm(source + ".tmp");
|
||||
return false;
|
||||
}
|
||||
|
||||
iter += 37;
|
||||
|
||||
if(std::strncmp(iter, _steamId.c_str(), _steamId.length()) != 0) {
|
||||
for(int i = 0; i < 17; ++i) {
|
||||
*(iter + i) = _steamId[i];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const std::string dest = Utility::Directory::join(_saveDirectory, _hangars[hangar]._filename);
|
||||
|
||||
if(Utility::Directory::exists(dest)) {
|
||||
Utility::Directory::rm(dest);
|
||||
}
|
||||
|
||||
Utility::Directory::move(source + ".tmp", dest);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
_lastError = "";
|
||||
return false;
|
||||
}
|
||||
|
||||
auto MassManager::exportMass(int hangar) -> bool {
|
||||
if(hangar < 0 && hangar >= 32) {
|
||||
_lastError = "Hangar out of range in MassManager::exportMass()";
|
||||
return false;
|
||||
}
|
||||
|
||||
if(_hangars[hangar]._state == HangarState::Empty ||
|
||||
_hangars[hangar]._state == HangarState::Invalid) {
|
||||
_lastError = Utility::formatString("There is no valid data to export in hangar {:.2d}", hangar);
|
||||
}
|
||||
|
||||
auto name = _hangars[hangar]._massName;
|
||||
|
||||
if(!name) {
|
||||
_lastError = "There was an unexpected error in MassManager::exportMass()";
|
||||
return false;
|
||||
}
|
||||
|
||||
std::string source = Utility::Directory::join(_saveDirectory, _hangars[hangar]._filename);
|
||||
std::string dest = Utility::Directory::join(_stagingAreaDirectory, Utility::formatString("{}_{}.sav", _steamId, *(_hangars[hangar]._massName)));
|
||||
|
||||
if(!Utility::Directory::copy(source, dest)) {
|
||||
_lastError = Utility::formatString("Couldn't export data from hangar {:.2d} to {}", hangar, dest);
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
auto MassManager::moveMass(int source, int destination) -> bool {
|
||||
if(source < 0 && source >= 32) {
|
||||
_lastError = "Source hangar out of range in MassManager::moveMass()";
|
||||
|
@ -206,7 +295,7 @@ auto MassManager::moveMass(int source, int destination) -> bool {
|
|||
return true;
|
||||
}
|
||||
|
||||
bool MassManager::deleteMass(int hangar) {
|
||||
auto MassManager::deleteMass(int hangar) -> bool {
|
||||
if(hangar < 0 && hangar >= 32) {
|
||||
_lastError = "Hangar number out of range in MassManager::deleteMass()";
|
||||
return false;
|
||||
|
@ -309,6 +398,113 @@ auto MassManager::getMassName(const std::string& filename) -> Containers::Option
|
|||
return name;
|
||||
}
|
||||
|
||||
auto MassManager::initialiseStagingArea() -> std::vector<std::string> {
|
||||
if(!Utility::Directory::exists(_stagingAreaDirectory)) {
|
||||
Utility::Directory::mkpath(_stagingAreaDirectory);
|
||||
}
|
||||
|
||||
using Utility::Directory::Flag;
|
||||
std::vector<std::string> file_list = Utility::Directory::list(_stagingAreaDirectory, Flag::SkipSpecial|Flag::SkipDirectories|Flag::SkipDotAndDotDot);
|
||||
|
||||
auto iter = std::remove_if(file_list.begin(), file_list.end(), [](std::string& file){
|
||||
return !Utility::String::endsWith(file, ".sav");
|
||||
});
|
||||
|
||||
file_list.erase(iter, file_list.end());
|
||||
|
||||
std::vector<std::string> mass_names;
|
||||
mass_names.reserve(file_list.size());
|
||||
|
||||
for(const std::string& file : file_list) {
|
||||
auto name = getMassName(Utility::Directory::join(_stagingAreaDirectory, file));
|
||||
|
||||
if(name) {
|
||||
mass_names.push_back(Utility::formatString("{} ({})", *name, file));
|
||||
_stagedMasses[file] = *name;
|
||||
}
|
||||
}
|
||||
|
||||
mass_names.shrink_to_fit();
|
||||
|
||||
return std::move(mass_names);
|
||||
}
|
||||
|
||||
auto MassManager::updateStagedMass(const std::string& filename) -> int {
|
||||
std::string file = Utility::Directory::join(_stagingAreaDirectory, filename);
|
||||
|
||||
if(!Utility::Directory::exists(file)) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
auto name = getMassName(file);
|
||||
|
||||
if(!name) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
_stagedMasses[filename] = *name;
|
||||
|
||||
int index = 0;
|
||||
|
||||
for(const auto& mass: _stagedMasses) {
|
||||
if(mass.first != filename) {
|
||||
++index;
|
||||
continue;
|
||||
}
|
||||
|
||||
return index;
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
auto MassManager::removeStagedMass(const std::string& filename) -> int {
|
||||
int index = 0;
|
||||
|
||||
for(auto it = _stagedMasses.begin(); it != _stagedMasses.end(); ++it, ++index) {
|
||||
if(it->first == filename) {
|
||||
_stagedMasses.erase(it);
|
||||
return index;
|
||||
}
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
void MassManager::deleteStagedMass(int index) {
|
||||
int i = 0;
|
||||
for(auto it = _stagedMasses.begin(); it != _stagedMasses.end(); ++it, ++i) {
|
||||
if(i == index) {
|
||||
Utility::Directory::rm(Utility::Directory::join(_stagingAreaDirectory, it->first));
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
std::string MassManager::stagedMassName(int index) {
|
||||
int i = 0;
|
||||
for(const auto& mass_info : _stagedMasses) {
|
||||
if(i != index) {
|
||||
++i;
|
||||
continue;
|
||||
}
|
||||
|
||||
return mass_info.second;
|
||||
}
|
||||
|
||||
return "";
|
||||
}
|
||||
|
||||
auto MassManager::stagedMassName(const std::string& filename) -> std::string {
|
||||
auto iter = _stagedMasses.find(filename);
|
||||
|
||||
if(iter == _stagedMasses.end()) {
|
||||
return "";
|
||||
}
|
||||
|
||||
return iter->second;
|
||||
}
|
||||
|
||||
auto MassManager::findSaveDirectory() -> bool {
|
||||
wchar_t h[MAX_PATH];
|
||||
if(!SUCCEEDED(SHGetFolderPathW(nullptr, CSIDL_LOCAL_APPDATA, nullptr, 0, h))) {
|
||||
|
|
|
@ -17,7 +17,9 @@
|
|||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
#include <map>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
#include <Corrade/Containers/StaticArray.h>
|
||||
#include <Corrade/Containers/Optional.h>
|
||||
|
@ -40,6 +42,7 @@ class MassManager {
|
|||
auto lastError() -> std::string const&;
|
||||
|
||||
auto saveDirectory() -> std::string const&;
|
||||
auto stagingAreaDirectory() -> std::string const&;
|
||||
auto steamId() -> std::string const&;
|
||||
auto profileSaveName() -> std::string const&;
|
||||
|
||||
|
@ -50,6 +53,9 @@ class MassManager {
|
|||
auto activeSlot() -> char;
|
||||
|
||||
auto importMass(const std::string& source, int hangar) -> bool;
|
||||
auto importMass(int staged_index, int hangar) -> bool;
|
||||
|
||||
auto exportMass(int hangar) -> bool;
|
||||
|
||||
auto moveMass(int source, int destination) -> bool;
|
||||
|
||||
|
@ -63,14 +69,26 @@ class MassManager {
|
|||
|
||||
auto getMassName(const std::string& filename) -> Containers::Optional<std::string>;
|
||||
|
||||
auto initialiseStagingArea() -> std::vector<std::string>;
|
||||
|
||||
auto updateStagedMass(const std::string& filename) -> int;
|
||||
auto removeStagedMass(const std::string& filename) -> int;
|
||||
|
||||
void deleteStagedMass(int index);
|
||||
|
||||
auto stagedMassName(int index) -> std::string;
|
||||
auto stagedMassName(const std::string& filename) -> std::string;
|
||||
|
||||
private:
|
||||
auto findSaveDirectory() -> bool;
|
||||
auto findSteamId() -> bool;
|
||||
|
||||
bool _ready;
|
||||
bool _ready = false;
|
||||
|
||||
std::string _lastError = "";
|
||||
|
||||
std::string _executableLocation = "";
|
||||
std::string _stagingAreaDirectory = "";
|
||||
std::string _saveDirectory = "";
|
||||
std::string _steamId = "";
|
||||
std::string _profileSaveName = "";
|
||||
|
@ -86,6 +104,8 @@ class MassManager {
|
|||
};
|
||||
|
||||
Containers::StaticArray<32, Hangar> _hangars{Containers::ValueInit};
|
||||
|
||||
std::map<std::string, std::string> _stagedMasses;
|
||||
};
|
||||
|
||||
#endif //MASSMANAGER_H
|
||||
|
|
Loading…
Reference in a new issue