-
Notifications
You must be signed in to change notification settings - Fork 47
/
DifficultyDialog.cpp
168 lines (134 loc) · 4.53 KB
/
DifficultyDialog.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
#include "DifficultyDialog.h"
#include "i18n.h"
#include "iundo.h"
#include "imainframe.h"
#include "iscenegraph.h"
#include "gamelib.h"
#include "registry/registry.h"
#include "string/string.h"
#include "wxutil/dialog/Dialog.h"
#include "wxutil/EntryAbortedException.h"
#include <iostream>
#include <wx/notebook.h>
#include <wx/panel.h>
#include <wx/artprov.h>
#include <wx/sizer.h>
#include <wx/button.h>
namespace ui
{
namespace
{
const char* const WINDOW_TITLE = N_("Difficulty Editor");
}
DifficultyDialog::DifficultyDialog() :
DialogBase(_(WINDOW_TITLE))
{
// Load the settings
_settingsManager.loadSettings();
// Create the widgets
populateWindow();
}
void DifficultyDialog::createDifficultyEditors()
{
int numLevels = game::current::getValue<int>(GKEY_DIFFICULTY_LEVELS);
for (int i = 0; i < numLevels; i++)
{
// Acquire the settings object
difficulty::DifficultySettingsPtr settings = _settingsManager.getSettings(i);
if (settings)
{
// Construct the editor for this difficulty level and add it to our
// internal list of editors
std::string diffName = _settingsManager.getDifficultyName(i);
auto editor = std::make_shared<DifficultyEditor>(_notebook,
settings);
_editors.push_back(editor);
// Insert the editor's widget as a new page in the choicebook
wxWindow* editorWidget = editor->getWidget();
editorWidget->Reparent(_notebook);
_notebook->AddPage(editorWidget, diffName, false);
}
}
}
void DifficultyDialog::populateWindow()
{
SetSizer(new wxBoxSizer(wxVERTICAL));
// Create the notebook and add it to the vbox
_notebook = new wxChoicebook(this, wxID_ANY);
_notebook->SetMinClientSize(wxSize(800, 400));
// Add the edit button alongside the dropdown
wxSizer* choiceSizer = _notebook->GetControlSizer();
wxButton* editBtn = new wxButton(
_notebook, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize,
wxBU_EXACTFIT | wxBU_NOTEXT
);
editBtn->Bind(wxEVT_BUTTON,
[&] (wxCommandEvent&) { editCurrentDifficultyName(); });
editBtn->SetBitmap(wxArtProvider::GetBitmap("darkradiant:edit.png"));
choiceSizer->Add(editBtn, 0, wxEXPAND | wxLEFT, 6);
// Create and pack the editors
createDifficultyEditors();
GetSizer()->Add(_notebook, 1, wxEXPAND | wxALL, 12);
wxButton* okButton = new wxButton(this, wxID_OK);
wxButton* cancelButton = new wxButton(this, wxID_CANCEL);
okButton->Bind(wxEVT_BUTTON, [&] (wxCommandEvent&) { EndModal(wxID_OK); });
cancelButton->Bind(wxEVT_BUTTON, [&] (wxCommandEvent&) { EndModal(wxID_CANCEL); });
wxBoxSizer* buttonSizer = new wxBoxSizer(wxHORIZONTAL);
buttonSizer->Add(cancelButton);
buttonSizer->AddSpacer(6);
buttonSizer->Add(okButton);
GetSizer()->Add(buttonSizer, 0, wxALIGN_RIGHT | wxALL, 12);
Layout();
Fit();
}
void DifficultyDialog::editCurrentDifficultyName()
{
// Initialise an EditNameDialog with the current tab text as the initial
// name to edit
int curDiffLevel = _notebook->GetSelection(); // assume tabs numbered from 0
try
{
std::string oldName = _notebook->GetPageText(curDiffLevel).ToStdString();
std::string newName = wxutil::Dialog::TextEntryDialog(
_("Difficulty name"), _("New name:"),
oldName, this
);
// Don't allow setting it to an empty name
if (!newName.empty() && oldName != newName)
{
// Change the difficulty name in the map
_settingsManager.setDifficultyName(curDiffLevel, newName);
// Change the displayed name in the dialog
_notebook->SetPageText(curDiffLevel, newName);
}
}
catch (wxutil::EntryAbortedException&)
{
// do nothing in case the user hit cancel
}
}
void DifficultyDialog::save()
{
// Consistency check can go here
// Scoped undo object
UndoableCommand command("editDifficulty");
// Save the working set to the entity
_settingsManager.saveSettings();
}
int DifficultyDialog::ShowModal()
{
int returnCode = DialogBase::ShowModal();
if (returnCode == wxID_OK)
{
save();
}
return returnCode;
}
// Static command target
void DifficultyDialog::ShowDialog(const cmd::ArgumentList& args)
{
// Construct a new instance and enter the main loop
DifficultyDialog editor;
editor.ShowModal();
}
} // namespace ui