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 "ui/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
|