mirror of
https://github.com/loot/libloot.git
synced 2026-07-27 14:16:01 -07:00
Updated how games are handled in settings window.
* Game menu now gets updated when settings are changed to reflect any changes in games available. * The current game can no longer be deleted in the settings window. * Changing game settings updates rather than replaces existing entries (fixes #199). Also removed a few unused wxIDs.
This commit is contained in:
@@ -310,6 +310,10 @@ namespace loot {
|
||||
return (boost::iequals(_name, rhs.Name()) || boost::iequals(lootFolderName, rhs.FolderName()));
|
||||
}
|
||||
|
||||
bool Game::operator == (const std::string& nameOrFolderName) const {
|
||||
return (boost::iequals(_name, nameOrFolderName) || boost::iequals(lootFolderName, nameOrFolderName));
|
||||
}
|
||||
|
||||
unsigned int Game::Id() const {
|
||||
return id;
|
||||
}
|
||||
|
||||
@@ -95,6 +95,7 @@ namespace loot {
|
||||
bool IsInstalled() const;
|
||||
|
||||
bool operator == (const Game& rhs) const; //Compares names and folder names.
|
||||
bool operator == (const std::string& nameOrFolderName) const;
|
||||
|
||||
unsigned int Id() const;
|
||||
std::string Name() const; //Returns the game's name, eg. "TES IV: Oblivion".
|
||||
|
||||
+1
-4
@@ -69,12 +69,9 @@ enum {
|
||||
MENU_CopyMetadata,
|
||||
MENU_ClearPluginMetadata,
|
||||
MENU_ClearAllMetadata,
|
||||
CHECKBOX_Filter,
|
||||
//Main window - dynamically created IDs.
|
||||
MENU_LowestDynamicGameID,
|
||||
LIST_LoadOrder,
|
||||
BUTTON_MoveUp,
|
||||
BUTTON_MoveDown,
|
||||
CHECKBOX_Filter
|
||||
};
|
||||
|
||||
wxString translate(const std::string& str);
|
||||
|
||||
+18
-1
@@ -482,7 +482,7 @@ void Launcher::OnOpenSettings(wxCommandEvent& event) {
|
||||
GetWindowSizePos(_settings["windows"]["settings"], pos, size);
|
||||
}
|
||||
|
||||
SettingsFrame settings = SettingsFrame(this, translate("LOOT: Settings"), _settings, _games, pos, size);
|
||||
SettingsFrame settings = SettingsFrame(this, translate("LOOT: Settings"), _settings, _games, _currentGame, pos, size);
|
||||
BOOST_LOG_TRIVIAL(debug) << "Settings window opened.";
|
||||
settings.ShowModal();
|
||||
|
||||
@@ -494,6 +494,23 @@ void Launcher::OnOpenSettings(wxCommandEvent& event) {
|
||||
node["yPos"] = settings.GetPosition().y;
|
||||
|
||||
_settings["windows"]["settings"] = node;
|
||||
|
||||
// Clear existing games menu items.
|
||||
for (size_t i = 0, max = GameMenu->GetMenuItemCount(); i < max; ++i) {
|
||||
GameMenu->Delete(MENU_LowestDynamicGameID + i);
|
||||
}
|
||||
// Fill games list again.
|
||||
for (size_t i = 0, max = _games.size(); i < max; ++i) {
|
||||
wxMenuItem * item = GameMenu->AppendRadioItem(MENU_LowestDynamicGameID + i, FromUTF8(_games[i].Name()));
|
||||
if (_games[_currentGame] == _games[i])
|
||||
item->Check();
|
||||
|
||||
if (_games[i].IsInstalled())
|
||||
Bind(wxEVT_MENU, &Launcher::OnGameChange, this, MENU_LowestDynamicGameID + i);
|
||||
else
|
||||
item->Enable(false);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void Launcher::OnGameChange(wxCommandEvent& event) {
|
||||
|
||||
+37
-14
@@ -34,7 +34,7 @@
|
||||
|
||||
using namespace std;
|
||||
|
||||
SettingsFrame::SettingsFrame(wxWindow *parent, const wxString& title, YAML::Node& settings, std::vector<loot::Game>& games, wxPoint pos, wxSize size) : wxDialog(parent, wxID_ANY, title, pos, size, wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER), _settings(settings), _games(games) {
|
||||
SettingsFrame::SettingsFrame(wxWindow *parent, const wxString& title, YAML::Node& settings, std::vector<loot::Game>& games, size_t currentGameIndex, wxPoint pos, wxSize size) : wxDialog(parent, wxID_ANY, title, pos, size, wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER), _settings(settings), _games(games), _currentGameIndex(currentGameIndex) {
|
||||
|
||||
//Initialise drop-down list contents.
|
||||
wxString DebugVerbosity[] = {
|
||||
@@ -224,19 +224,25 @@ void SettingsFrame::OnQuit(wxCommandEvent& event) {
|
||||
|
||||
_settings["Update Masterlist"] = UpdateMasterlistBox->IsChecked();
|
||||
|
||||
_games.clear();
|
||||
unordered_set<string> newGameFolders;
|
||||
for (size_t i=0,max=gamesList->GetItemCount(); i < max; ++i) {
|
||||
string name, folder, master, repo, branch, path, registry;
|
||||
/* We want to avoid overwriting existing game objects as doing so
|
||||
clears the game caches. Instead, recognise that game folder names
|
||||
must be unique. Therefore, use Game::SetDetails() to set
|
||||
the settings for each existing game, and add new games on.
|
||||
For any games that have been deleted, check against the newGameNames
|
||||
hashset and remove any not in it.
|
||||
*/
|
||||
|
||||
string name = gamesList->GetItemText(i, 0).ToUTF8();
|
||||
string folder = gamesList->GetItemText(i, 2).ToUTF8();
|
||||
string master = gamesList->GetItemText(i, 3).ToUTF8();
|
||||
string repo = gamesList->GetItemText(i, 4).ToUTF8();
|
||||
string branch = gamesList->GetItemText(i, 5).ToUTF8();
|
||||
string path = gamesList->GetItemText(i, 6).ToUTF8();
|
||||
string registry = gamesList->GetItemText(i, 7).ToUTF8();
|
||||
|
||||
unsigned int id;
|
||||
|
||||
name = gamesList->GetItemText(i, 0).ToUTF8();
|
||||
folder = gamesList->GetItemText(i, 2).ToUTF8();
|
||||
master = gamesList->GetItemText(i, 3).ToUTF8();
|
||||
repo = gamesList->GetItemText(i, 4).ToUTF8();
|
||||
branch = gamesList->GetItemText(i, 5).ToUTF8();
|
||||
path = gamesList->GetItemText(i, 6).ToUTF8();
|
||||
registry = gamesList->GetItemText(i, 7).ToUTF8();
|
||||
|
||||
if (gamesList->GetItemText(i, 1).ToUTF8() == loot::Game(loot::Game::tes4).FolderName())
|
||||
id = loot::Game::tes4;
|
||||
else if (gamesList->GetItemText(i, 1).ToUTF8() == loot::Game(loot::Game::tes5).FolderName())
|
||||
@@ -246,7 +252,23 @@ void SettingsFrame::OnQuit(wxCommandEvent& event) {
|
||||
else
|
||||
id = loot::Game::fonv;
|
||||
|
||||
_games.push_back(loot::Game(id, folder).SetDetails(name, master, repo, branch, path, registry));
|
||||
auto pos = find(_games.begin(), _games.end(), folder);
|
||||
|
||||
if (pos != _games.end()) {
|
||||
pos->SetDetails(name, master, repo, branch, path, registry);
|
||||
}
|
||||
else {
|
||||
_games.push_back(loot::Game(id, folder).SetDetails(name, master, repo, branch, path, registry));
|
||||
}
|
||||
|
||||
newGameFolders.insert(folder);
|
||||
}
|
||||
|
||||
for (auto it = _games.begin(); it != _games.end();) {
|
||||
if (newGameFolders.find(it->FolderName()) == newGameFolders.end())
|
||||
it = _games.erase(it);
|
||||
else
|
||||
++it;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -258,7 +280,8 @@ void SettingsFrame::OnGameSelect(wxListEvent& event) {
|
||||
if (name == loot::Game(loot::Game::tes4).Name()
|
||||
|| name == loot::Game(loot::Game::tes5).Name()
|
||||
|| name == loot::Game(loot::Game::fo3).Name()
|
||||
|| name == loot::Game(loot::Game::fonv).Name()) {
|
||||
|| name == loot::Game(loot::Game::fonv).Name()
|
||||
|| event.GetIndex() == _currentGameIndex) {
|
||||
removeBtn->Enable(false);
|
||||
} else {
|
||||
removeBtn->Enable(true);
|
||||
|
||||
+2
-1
@@ -33,7 +33,7 @@
|
||||
|
||||
class SettingsFrame : public wxDialog {
|
||||
public:
|
||||
SettingsFrame(wxWindow *parent, const wxString& title, YAML::Node& settings, std::vector<loot::Game>& games, wxPoint pos, wxSize size);
|
||||
SettingsFrame(wxWindow *parent, const wxString& title, YAML::Node& settings, std::vector<loot::Game>& games, size_t currentGameIndex, wxPoint pos, wxSize size);
|
||||
|
||||
void OnQuit(wxCommandEvent& event);
|
||||
void OnGameSelect(wxListEvent& event);
|
||||
@@ -55,6 +55,7 @@ private:
|
||||
|
||||
YAML::Node& _settings;
|
||||
std::vector<loot::Game>& _games;
|
||||
size_t _currentGameIndex;
|
||||
};
|
||||
|
||||
class GameEditDialog : public wxDialog {
|
||||
|
||||
Reference in New Issue
Block a user