Implemented seed controls on random pack panel;

seed settings and pack amounts are stored in settings

git-svn-id: svn://svn.code.sf.net/p/magicseteditor/code/trunk@1044 0fc631ac-6414-0410-93d0-97cfa31319b6
This commit is contained in:
twanvl
2008-08-03 22:46:53 +00:00
parent d969ae96bd
commit 0cb872a0d3
6 changed files with 113 additions and 16 deletions
+86 -16
View File
@@ -13,7 +13,10 @@
#include <gui/control/filtered_card_list.hpp>
#include <data/game.hpp>
#include <data/pack.hpp>
#include <data/settings.hpp>
#include <util/window_id.hpp>
#include <wx/spinctrl.h>
#include <boost/random/mersenne_twister.hpp>
DECLARE_TYPEOF_COLLECTION(PackTypeP);
DECLARE_TYPEOF_COLLECTION(CardP);
@@ -71,9 +74,9 @@ RandomPackPanel::RandomPackPanel(Window* parent, int id)
// init controls
preview = new CardViewer(this, wxID_ANY);
card_list = new FilteredCardList(this, wxID_ANY);
wxButton* generate = new wxButton(this, wxID_ANY, _BUTTON_("generate pack"));
wxRadioButton* seed_random = new wxRadioButton(this, wxID_ANY, _BUTTON_("random seed"));
wxRadioButton* seed_fixed = new wxRadioButton(this, wxID_ANY, _BUTTON_("fixed seed"));
generate_button = new wxButton(this, ID_GENERATE_PACK, _BUTTON_("generate pack"));
seed_random = new wxRadioButton(this, ID_SEED_RANDOM, _BUTTON_("random seed"));
seed_fixed = new wxRadioButton(this, ID_SEED_FIXED, _BUTTON_("fixed seed"));
seed = new wxTextCtrl(this, wxID_ANY);
static_cast<SetWindow*>(parent)->setControlStatusText(seed_random, _HELP_("random seed"));
static_cast<SetWindow*>(parent)->setControlStatusText(seed_fixed, _HELP_("fixed seed"));
@@ -100,8 +103,8 @@ RandomPackPanel::RandomPackPanel(Window* parent, int id)
s7->Add(s8, 0, wxALL & ~wxTOP, 4);
s6->Add(s7, 0, 0, 8);
//s6->AddStretchSpacer();
//s6->Add(generate, 0, wxTOP | wxALIGN_RIGHT, 8);
s6->Add(generate, 1, wxTOP | wxEXPAND, 8);
//s6->Add(generate_button, 0, wxTOP | wxALIGN_RIGHT, 8);
s6->Add(generate_button, 1, wxTOP | wxEXPAND, 8);
s3->Add(s6, 0, wxEXPAND | wxLEFT, 8);
s2->Add(s3, 0, wxEXPAND | wxALL & ~wxTOP, 4);
s2->Add(card_list, 1, wxEXPAND);
@@ -110,7 +113,12 @@ RandomPackPanel::RandomPackPanel(Window* parent, int id)
SetSizer(s);
}
RandomPackPanel::~RandomPackPanel() {
storeSettings();
}
void RandomPackPanel::onChangeSet() {
storeSettings();
preview ->setSet(set);
card_list->setSet(set);
@@ -128,36 +136,98 @@ void RandomPackPanel::onChangeSet() {
PackItem i;
i.pack = pack;
i.label = new wxStaticText(this, wxID_ANY, pack->name);
i.value = new wxSpinCtrl(this, wxID_ANY, _("0"), wxDefaultPosition, wxSize(50,-1));
i.value = new wxSpinCtrl(this, ID_PACK_AMOUNT, _("0"), wxDefaultPosition, wxSize(50,-1));
packsSizer->Add(i.label, 0, wxALIGN_CENTER_VERTICAL);
packsSizer->Add(i.value, 0, wxEXPAND | wxALIGN_CENTER);
packs.push_back(i);
}
Layout();
// settings
GameSettings& gs = settings.gameSettingsFor(*set->game);
seed_random->SetValue(gs.pack_seed_random);
seed_fixed ->SetValue(!gs.pack_seed_random);
seed->Enable(!gs.pack_seed_random);
setSeed(gs.pack_seed);
FOR_EACH(i, packs) {
i.value->SetValue(gs.pack_amounts[i.pack->name]);
}
updateTotals();
}
void RandomPackPanel::storeSettings() {
GameSettings& gs = settings.gameSettingsFor(*set->game);
gs.pack_seed_random = seed_random->GetValue();
FOR_EACH(i, packs) {
gs.pack_amounts[i.pack->name] = i.value->GetValue();
}
}
// ----------------------------------------------------------------------------- : UI
void RandomPackPanel::initUI(wxToolBar* tb, wxMenuBar* mb) {
// ?
}
void RandomPackPanel::initUI(wxToolBar* tb, wxMenuBar* mb) {}
void RandomPackPanel::destroyUI(wxToolBar* tb, wxMenuBar* mb) {
// ?
}
void RandomPackPanel::destroyUI(wxToolBar* tb, wxMenuBar* mb) {}
void RandomPackPanel::onUpdateUI(wxUpdateUIEvent& ev) {
// ?
}
void RandomPackPanel::onUpdateUI(wxUpdateUIEvent& ev) {}
void RandomPackPanel::onCommand(int id) {
// ?
switch (id) {
case ID_PACK_AMOUNT: {
updateTotals();
break;
}
case ID_GENERATE_PACK: {
generate();
break;
}
case ID_SEED_RANDOM: case ID_SEED_FIXED: {
seed->Enable(seed_fixed->GetValue());
break;
}
}
}
// ----------------------------------------------------------------------------- : Generating
void RandomPackPanel::updateTotals() {
total_packs = 0;
FOR_EACH(i,packs) {
total_packs += i.value->GetValue();
}
// update UI
generate_button->Enable(total_packs > 0);
}
int RandomPackPanel::getSeed() {
// determine seed value
int seed = 0;
if (seed_random->GetValue()) {
// use the C rand() function to get a seed
seed = rand() % 1000 * 1000
+ clock() % 1000;
} else {
// convert *any* string to a number
String s = this->seed->GetValue();
FOR_EACH_CONST(c,s) {
seed *= 10;
seed += abs(c - '0') + 123456789*(abs(c - '0')/10);
}
}
setSeed(seed);
return seed;
}
void RandomPackPanel::setSeed(int seed) {
seed %= 1000000;
this->seed->SetValue(wxString::Format(_("%06d"),seed));
GameSettings& gs = settings.gameSettingsFor(*set->game);
gs.pack_seed = seed;
}
void RandomPackPanel::generate() {
boost::mt19937 random((unsigned)getSeed());
//set->game->pack_types[0].generate()
}
+11
View File
@@ -23,6 +23,7 @@ DECLARE_POINTER_TYPE(PackType);
class RandomPackPanel : public SetWindowPanel {
public:
RandomPackPanel(Window* parent, int id);
~RandomPackPanel();
// --------------------------------------------------- : UI
@@ -44,6 +45,8 @@ class RandomPackPanel : public SetWindowPanel {
wxTextCtrl* seed; ///< Seed value
wxFlexGridSizer* packsSizer;
wxFlexGridSizer* totalsSizer;
wxButton* generate_button;
wxRadioButton* seed_random, *seed_fixed;
struct PackItem {
PackTypeP pack;
@@ -55,9 +58,17 @@ class RandomPackPanel : public SetWindowPanel {
struct TotalItem {
};
vector<TotalItem> totals;
int total_packs;
/// Update the total count of each card type
void updateTotals();
/// Get a seed value
int getSeed();
void setSeed(int seed);
/// Generate the cards
void generate();
/// Store the settings
void storeSettings();
public:
typedef PackItem PackItem_for_typeof;
};
+2
View File
@@ -771,6 +771,8 @@ BEGIN_EVENT_TABLE(SetWindow, wxFrame)
EVT_MENU (ID_HELP_ABOUT, SetWindow::onHelpAbout)
EVT_TOOL_RANGE (ID_CHILD_MIN, ID_CHILD_MAX, SetWindow::onChildMenu)
EVT_COMMAND_RANGE (ID_CHILD_MIN, ID_CHILD_MAX, wxEVT_COMMAND_BUTTON_CLICKED, SetWindow::onChildMenu)
EVT_COMMAND_RANGE (ID_CHILD_MIN, ID_CHILD_MAX, wxEVT_COMMAND_SPINCTRL_UPDATED, SetWindow::onChildMenu)
EVT_COMMAND_RANGE (ID_CHILD_MIN, ID_CHILD_MAX, wxEVT_COMMAND_RADIOBUTTON_SELECTED, SetWindow::onChildMenu)
EVT_GALLERY_SELECT (ID_FIELD_LIST, SetWindow::onChildMenu) // for StatsPanel, because it is not a EVT_TOOL
EVT_UPDATE_UI (wxID_ANY, SetWindow::onUpdateUI)