MainFrame: add active slot tracking.

Can't do more because the variable that controls the slot gets removed
from the profile save if slot 0 is chosen in the game.
This commit is contained in:
Guillaume Jacquemin 2020-01-10 22:50:41 +01:00
parent c8eca7cd7f
commit 802c0db2de
2 changed files with 34 additions and 10 deletions

View file

@ -42,6 +42,8 @@ constexpr unsigned char mass_name_locator[] = { 'N', 'a', 'm', 'e', '_', '4', '5
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' }; 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' };
constexpr unsigned char active_slot_locator[] = { 'A', 'c', 't', 'i', 'v', 'e', 'F', 'r', 'a', 'm', 'e', 'S', 'l', 'o', 't', '\0', 0x0C, '\0', '\0', '\0', 'I', 'n', 't', 'P', 'r', 'o', 'p', 'e', 'r', 't', 'y', '\0' };
EvtMainFrame::EvtMainFrame(wxWindow* parent): MainFrame(parent) { EvtMainFrame::EvtMainFrame(wxWindow* parent): MainFrame(parent) {
SetIcon(wxIcon("MAINICON")); SetIcon(wxIcon("MAINICON"));
@ -64,7 +66,7 @@ EvtMainFrame::EvtMainFrame(wxWindow* parent): MainFrame(parent) {
_watcher.Connect(wxEVT_FSWATCHER, wxFileSystemWatcherEventHandler(EvtMainFrame::fileUpdateEvent), nullptr, this); _watcher.Connect(wxEVT_FSWATCHER, wxFileSystemWatcherEventHandler(EvtMainFrame::fileUpdateEvent), nullptr, this);
_watcher.AddTree(wxFileName(Utility::Directory::toNativeSeparators(_saveDirectory), wxPATH_WIN), _watcher.AddTree(wxFileName(Utility::Directory::toNativeSeparators(_saveDirectory), wxPATH_WIN),
wxFSW_EVENT_CREATE|wxFSW_EVENT_DELETE|wxFSW_EVENT_MODIFY|wxFSW_EVENT_RENAME, wxString::Format("Unit??%s.sav", _localSteamId)); wxFSW_EVENT_CREATE|wxFSW_EVENT_DELETE|wxFSW_EVENT_MODIFY|wxFSW_EVENT_RENAME, wxString::Format("*%s.sav", _localSteamId));
_gameCheckTimer.Start(3000); _gameCheckTimer.Start(3000);
} }
@ -210,22 +212,28 @@ void EvtMainFrame::fileUpdateEvent(wxFileSystemWatcherEvent& event) {
_lastWatcherEventType = event_type; _lastWatcherEventType = event_type;
std::string event_file =(Utility::Directory::fromNativeSeparators(event.GetNewPath().GetFullName().ToStdString())); wxString event_file = event.GetNewPath().GetFullName();
if(!Utility::String::endsWith(event_file, ".sav")) { if(!event_file.EndsWith(".sav")) {
return; return;
} }
long slot; wxMilliSleep(50);
try { if(event_file == wxString::Format("Profile%s.sav", _localSteamId)) {
slot = std::stol(std::string(event_file.data() + 4, 2)); getActiveSlot();
}
catch(const std::invalid_argument&) {
return;
} }
else {
wxRegEx regex(wxString::Format("Unit([0-3][0-9])%s.sav", _localSteamId), wxRE_ADVANCED);
_installedListView->SetItem(slot, 1, getSlotMassName(slot)); if(regex.Matches(event_file)) {
long slot;
if(regex.GetMatch(event_file, 1).ToLong(&slot)) {
_installedListView->SetItem(slot, 1, getSlotMassName(slot));
}
}
}
updateCommandsState(); updateCommandsState();
} }
@ -276,6 +284,8 @@ void EvtMainFrame::initialiseListView() {
_installedListView->InsertItem(i, wxString::Format("%.2i", i + 1)); _installedListView->InsertItem(i, wxString::Format("%.2i", i + 1));
} }
getActiveSlot();
_installedListView->SetColumnWidth(0, wxLIST_AUTOSIZE_USEHEADER); _installedListView->SetColumnWidth(0, wxLIST_AUTOSIZE_USEHEADER);
_installedListView->SetColumnWidth(1, wxLIST_AUTOSIZE_USEHEADER); _installedListView->SetColumnWidth(1, wxLIST_AUTOSIZE_USEHEADER);
@ -328,6 +338,18 @@ void EvtMainFrame::refreshListView() {
updateCommandsState(); updateCommandsState();
} }
void EvtMainFrame::getActiveSlot() {
auto mmap = Utility::Directory::mapRead(Utility::formatString("{}/Profile{}.sav", _saveDirectory, _localSteamId));
auto iter = std::search(mmap.begin(), mmap.end(), &active_slot_locator[0], &active_slot_locator[31]);
wxFont tmp_font = _installedListView->GetItemFont(_activeSlot);
tmp_font.SetWeight(wxFONTWEIGHT_NORMAL);
_installedListView->SetItemFont(_activeSlot, tmp_font);
_activeSlot = (iter == mmap.end() && std::strncmp(&mmap[0x3F6], "Credit", 6) == 0) ? 0 : *(iter + 41);
_installedListView->SetItemFont(_activeSlot, _installedListView->GetItemFont(_activeSlot).Bold());
}
void EvtMainFrame::updateCommandsState() { void EvtMainFrame::updateCommandsState() {
long selection = _installedListView->GetFirstSelected(); long selection = _installedListView->GetFirstSelected();
wxString state = ""; wxString state = "";

View file

@ -44,6 +44,7 @@ class EvtMainFrame: public MainFrame {
void initialiseListView(); void initialiseListView();
void isGameRunning(); void isGameRunning();
void refreshListView(); void refreshListView();
void getActiveSlot();
void updateCommandsState(); void updateCommandsState();
std::string getSlotMassName(int index); std::string getSlotMassName(int index);
std::string getMassName(const std::string& filename); std::string getMassName(const std::string& filename);
@ -55,6 +56,7 @@ class EvtMainFrame: public MainFrame {
std::string _saveDirectory; std::string _saveDirectory;
std::string _localSteamId; std::string _localSteamId;
bool _isGameRunning = false; bool _isGameRunning = false;
char _activeSlot = 0;
wxFileSystemWatcher _watcher; wxFileSystemWatcher _watcher;
int _lastWatcherEventType = 0; int _lastWatcherEventType = 0;