diff --git a/src/gui/set/keywords_panel.cpp b/src/gui/set/keywords_panel.cpp index fbab9459..40cda59c 100644 --- a/src/gui/set/keywords_panel.cpp +++ b/src/gui/set/keywords_panel.cpp @@ -31,7 +31,12 @@ DECLARE_TYPEOF_COLLECTION(KeywordModeP); KeywordsPanel::KeywordsPanel(Window* parent, int id) : SetWindowPanel(parent, id) + , menuKeyword(nullptr) { + // delayed initialization by initControls() +} + +void KeywordsPanel::initControls() { // init controls splitter = new wxSplitterWindow(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL); list = new KeywordList(splitter, ID_KEYWORD_LIST); @@ -118,6 +123,12 @@ KeywordsPanel::~KeywordsPanel() { void KeywordsPanel::initUI(wxToolBar* tb, wxMenuBar* mb) { + // Controls + if (!isInitialized()) { + wxBusyCursor busy; + initControls(); + onChangeSet(); + } // Toolbar tb->AddTool(ID_KEYWORD_ADD, _(""), load_resource_tool_image(_("keyword_add")), wxNullBitmap, wxITEM_NORMAL,_TOOLTIP_("add keyword"), _HELP_("add keyword")); tb->AddTool(ID_KEYWORD_REMOVE, _(""), load_resource_tool_image(_("keyword_del")), wxNullBitmap, wxITEM_NORMAL,_TOOLTIP_("remove keyword"),_HELP_("remove keyword")); @@ -138,6 +149,7 @@ void KeywordsPanel::destroyUI(wxToolBar* tb, wxMenuBar* mb) { } void KeywordsPanel::onUpdateUI(wxUpdateUIEvent& ev) { + if (!isInitialized()) return; switch (ev.GetId()) { case ID_KEYWORD_PREV: ev.Enable(list->canSelectPrevious()); break; case ID_KEYWORD_NEXT: ev.Enable(list->canSelectNext()); break; @@ -146,6 +158,7 @@ void KeywordsPanel::onUpdateUI(wxUpdateUIEvent& ev) { } void KeywordsPanel::onCommand(int id) { + if (!isInitialized()) return; switch (id) { case ID_KEYWORD_PREV: list->selectPrevious(); @@ -230,6 +243,7 @@ String KeywordsPanel::runRefScript(int find_i) { // determine what control to use for clipboard actions #define CUT_COPY_PASTE(op,return,check) \ + if (!isInitialized()) return false; \ int id = focused_control(this); \ if (id == ID_KEYWORD_LIST && keyword ->IsEnabled()) { return list ->op(); } \ else if (check) { return false; } \ @@ -249,6 +263,7 @@ void KeywordsPanel::doPaste() { CUT_COPY_PASTE(doPaste, return (void), ! // ----------------------------------------------------------------------------- : Events void KeywordsPanel::onChangeSet() { + if (!isInitialized()) return; list->setSet(set); // warning label (depends on game name) fixedL->SetLabel(_LABEL_1_("standard keyword", set->game->short_name)); @@ -280,6 +295,7 @@ void KeywordsPanel::onChangeSet() { } void KeywordsPanel::onAction(const Action& action, bool undone) { + if (!isInitialized()) return; TYPE_CASE(action, ValueAction) { if (!action.card) { { diff --git a/src/gui/set/keywords_panel.hpp b/src/gui/set/keywords_panel.hpp index 9423fd5b..7c91f84c 100644 --- a/src/gui/set/keywords_panel.hpp +++ b/src/gui/set/keywords_panel.hpp @@ -50,6 +50,9 @@ class KeywordsPanel : public SetWindowPanel { /// Find the code to insert based on the ref_scripts for the parameters of the current keyword String runRefScript(int i); + /// Actual intialization of the controls + void initControls(); + // --------------------------------------------------- : Controls wxSplitterWindow* splitter; wxPanel* panel; diff --git a/src/gui/set/panel.cpp b/src/gui/set/panel.cpp index 38ddb030..2887d67c 100644 --- a/src/gui/set/panel.cpp +++ b/src/gui/set/panel.cpp @@ -19,3 +19,7 @@ SetWindowPanel::SetWindowPanel(Window* parent, int id, bool autoTabbing) CardP SetWindowPanel::selectedCard() const { return CardP(); } + +bool SetWindowPanel::isInitialized() const { + return !GetChildren().IsEmpty(); +} diff --git a/src/gui/set/panel.hpp b/src/gui/set/panel.hpp index 0386a5e7..5230bca4 100644 --- a/src/gui/set/panel.hpp +++ b/src/gui/set/panel.hpp @@ -71,6 +71,10 @@ class SetWindowPanel : public wxPanel, public SetView { virtual void selectCard(const CardP& card) {} ///< Switch the view to another card, can be null virtual void selectFirstCard() {} ///< Switch the view to the first card virtual void selectionChoices(ExportCardSelectionChoices& out) {} ///< Card subsets that can be exported from this panel + + protected: + /// Have any controls been created? + bool isInitialized() const; }; // ----------------------------------------------------------------------------- : EOF diff --git a/src/gui/set/random_pack_panel.cpp b/src/gui/set/random_pack_panel.cpp index c8e85c4d..6f06addc 100644 --- a/src/gui/set/random_pack_panel.cpp +++ b/src/gui/set/random_pack_panel.cpp @@ -155,6 +155,10 @@ END_EVENT_TABLE() RandomPackPanel::RandomPackPanel(Window* parent, int id) : SetWindowPanel(parent, id) { + // delayed initialization by initControls() +} + +void RandomPackPanel::initControls() { // init controls preview = new CardViewer(this, wxID_ANY); card_list = new RandomCardList(this, wxID_ANY); @@ -163,9 +167,9 @@ RandomPackPanel::RandomPackPanel(Window* parent, int id) seed_fixed = new wxRadioButton(this, ID_SEED_FIXED, _BUTTON_("fixed seed")); seed = new wxTextCtrl(this, wxID_ANY); totals = new PackTotalsPanel(this, wxID_ANY); - static_cast(parent)->setControlStatusText(seed_random, _HELP_("random seed")); - static_cast(parent)->setControlStatusText(seed_fixed, _HELP_("fixed seed")); - static_cast(parent)->setControlStatusText(seed, _HELP_("seed")); + static_cast(GetParent())->setControlStatusText(seed_random, _HELP_("random seed")); + static_cast(GetParent())->setControlStatusText(seed_fixed, _HELP_("fixed seed")); + static_cast(GetParent())->setControlStatusText(seed, _HELP_("seed")); // init sizer wxSizer* s = new wxBoxSizer(wxHORIZONTAL); s->Add(preview, 0, wxRIGHT, 2); @@ -209,6 +213,7 @@ void RandomPackPanel::onBeforeChangeSet() { } } void RandomPackPanel::onChangeSet() { + if (!isInitialized()) return; preview ->setSet(set); card_list->setSet(set); totals ->setGame(set->game); @@ -249,6 +254,7 @@ void RandomPackPanel::onChangeSet() { } void RandomPackPanel::storeSettings() { + if (!isInitialized()) return; GameSettings& gs = settings.gameSettingsFor(*set->game); gs.pack_seed_random = seed_random->GetValue(); FOR_EACH(i, packs) { @@ -258,13 +264,21 @@ void RandomPackPanel::storeSettings() { // ----------------------------------------------------------------------------- : UI -void RandomPackPanel::initUI(wxToolBar* tb, wxMenuBar* mb) {} +void RandomPackPanel::initUI(wxToolBar* tb, wxMenuBar* mb) { + // Init controls? + if (!isInitialized()) { + wxBusyCursor busy; + initControls(); + onChangeSet(); + } +} void RandomPackPanel::destroyUI(wxToolBar* tb, wxMenuBar* mb) {} void RandomPackPanel::onUpdateUI(wxUpdateUIEvent& ev) {} void RandomPackPanel::onCommand(int id) { + if (!isInitialized()) return; switch (id) { case ID_PACK_AMOUNT: { updateTotals(); @@ -339,6 +353,7 @@ void RandomPackPanel::generate() { // ----------------------------------------------------------------------------- : Selection CardP RandomPackPanel::selectedCard() const { + if (!isInitialized()) return CardP(); return card_list->getCard(); } @@ -352,6 +367,7 @@ void RandomPackPanel::onCardSelect(CardSelectEvent& ev) { } void RandomPackPanel::selectionChoices(ExportCardSelectionChoices& out) { + if (!isInitialized()) return; out.push_back(new_intrusive2( _BUTTON_("export generated packs"), card_list->getCardsPtr() @@ -366,5 +382,5 @@ END_EVENT_TABLE () // ----------------------------------------------------------------------------- : Clipboard -bool RandomPackPanel::canCopy() const { return card_list->canCopy(); } -void RandomPackPanel::doCopy() { card_list->doCopy(); } +bool RandomPackPanel::canCopy() const { return isInitialized() && card_list->canCopy(); } +void RandomPackPanel::doCopy() { isInitialized() && card_list->doCopy(); } diff --git a/src/gui/set/random_pack_panel.hpp b/src/gui/set/random_pack_panel.hpp index 63b3e969..d3bb6f2f 100644 --- a/src/gui/set/random_pack_panel.hpp +++ b/src/gui/set/random_pack_panel.hpp @@ -68,6 +68,9 @@ class RandomPackPanel : public SetWindowPanel { int total_packs; + /// Actual intialization of the controls + void initControls(); + /// Update the total count of each card type void updateTotals(); /// Get a seed value diff --git a/src/gui/set/stats_panel.cpp b/src/gui/set/stats_panel.cpp index d913c233..dfeda81a 100644 --- a/src/gui/set/stats_panel.cpp +++ b/src/gui/set/stats_panel.cpp @@ -277,8 +277,13 @@ void StatDimensionList::drawItem(DC& dc, int x, int y, size_t item) { StatsPanel::StatsPanel(Window* parent, int id) : SetWindowPanel(parent, id) + , menuGraph(nullptr) , up_to_date(true), active(false) { + // delayed initialization by initControls() +} + +void StatsPanel::initControls() { // init controls wxSplitterWindow* splitter; #if USE_SEPARATE_DIMENSION_LISTS @@ -328,6 +333,7 @@ StatsPanel::~StatsPanel() { } void StatsPanel::onChangeSet() { + if (!isInitialized()) return; card_list->setSet(set); #if USE_SEPARATE_DIMENSION_LISTS for (int i = 0 ; i < 3 ; ++i) dimensions[i]->show(set->game); @@ -336,10 +342,12 @@ void StatsPanel::onChangeSet() { #else categories->show(set->game); #endif + card = CardP(); onChange(); } void StatsPanel::onAction(const Action& action, bool undone) { + if (!isInitialized()) return; TYPE_CASE_(action, ScriptValueEvent) { // ignore style only stuff } else { @@ -348,6 +356,15 @@ void StatsPanel::onAction(const Action& action, bool undone) { } void StatsPanel::initUI (wxToolBar* tb, wxMenuBar* mb) { + // Controls + if (!isInitialized()) { + wxBusyCursor busy; + initControls(); + CardP cur_card = card; + onChangeSet(); + selectCard(cur_card); + } + // we are active active = true; if (!up_to_date) showCategory(); // Toolbar @@ -377,6 +394,7 @@ void StatsPanel::destroyUI(wxToolBar* tb, wxMenuBar* mb) { } void StatsPanel::onUpdateUI(wxUpdateUIEvent& ev) { + if (!isInitialized()) return; switch (ev.GetId()) { case ID_GRAPH_PIE: case ID_GRAPH_BAR: case ID_GRAPH_STACK: case ID_GRAPH_SCATTER: case ID_GRAPH_SCATTER_PIE: { GraphType type = (GraphType)(ev.GetId() - ID_GRAPH_PIE); @@ -390,6 +408,7 @@ void StatsPanel::onUpdateUI(wxUpdateUIEvent& ev) { } void StatsPanel::onCommand(int id) { + if (!isInitialized()) return; switch (id) { case ID_FIELD_LIST: { onChange(); @@ -537,9 +556,12 @@ END_EVENT_TABLE() // ----------------------------------------------------------------------------- : Selection CardP StatsPanel::selectedCard() const { + if (!isInitialized()) return CardP(); return card_list->getCard(); } void StatsPanel::selectCard(const CardP& card) { + this->card = card; + if (!isInitialized()) return; card_list->setCard(card); } diff --git a/src/gui/set/stats_panel.hpp b/src/gui/set/stats_panel.hpp index f6a66914..abaa752b 100644 --- a/src/gui/set/stats_panel.hpp +++ b/src/gui/set/stats_panel.hpp @@ -60,9 +60,12 @@ class StatsPanel : public SetWindowPanel { FilteredCardList* card_list; IconMenu* menuGraph; + CardP card; ///< Selected card bool up_to_date; ///< Are the graph and card list up to date? bool active; ///< Is this panel selected? + void initControls(); + void onChange(); void onGraphSelect(wxCommandEvent&); void showCategory(const GraphType* prefer_layout = nullptr); diff --git a/src/gui/set/style_panel.cpp b/src/gui/set/style_panel.cpp index 418e45a9..0bf8a87e 100644 --- a/src/gui/set/style_panel.cpp +++ b/src/gui/set/style_panel.cpp @@ -23,11 +23,15 @@ DECLARE_TYPEOF_COLLECTION(FieldP); -// ----------------------------------------------------------------------------- : StylePanel +// ----------------------------------------------------------------------------- : StylePanel : initialization StylePanel::StylePanel(Window* parent, int id) : SetWindowPanel(parent, id) { + // delayed initialization by initControls() +} + +void StylePanel::initControls() { // init controls preview = new CardViewer (this, wxID_ANY); list = new PackageList (this, wxID_ANY); @@ -48,7 +52,19 @@ StylePanel::StylePanel(Window* parent, int id) s->SetSizeHints(this); SetSizer(s); } + +void StylePanel::initUI(wxToolBar* tb, wxMenuBar* mb) { + if (!isInitialized()) { + wxBusyCursor busy; + initControls(); + CardP cur_card = card; + onChangeSet(); + selectCard(cur_card); + } +} + void StylePanel::updateListSize() { + if (!isInitialized()) return; // how many columns fit? size_t fit_columns = (size_t)((GetSize().y - 400) / 152); // we only need enough columns to show all items @@ -66,7 +82,10 @@ bool StylePanel::Layout() { return SetWindowPanel::Layout(); } +// ----------------------------------------------------------------------------- : StylePanel + void StylePanel::onChangeSet() { + if (!isInitialized()) return; list->showData(set->game->name() + _("-*")); list->select(set->stylesheet->name(), false); editor->setSet(set); @@ -76,6 +95,7 @@ void StylePanel::onChangeSet() { } void StylePanel::onAction(const Action& action, bool undone) { + if (!isInitialized()) return; TYPE_CASE_(action, ChangeSetStyleAction) { list->select(set->stylesheetFor(card).name(), false); editor->showCard(card); @@ -113,6 +133,7 @@ void StylePanel::onAction(const Action& action, bool undone) { void StylePanel::selectCard(const CardP& card) { this->card = card; + if (!isInitialized()) return; preview->setCard(card); editor->showStylesheet(set->stylesheetForP(card)); editor->showCard(card); @@ -126,6 +147,7 @@ void StylePanel::selectCard(const CardP& card) { // determine what control to use for clipboard actions #define CUT_COPY_PASTE(op,return) \ + if (!isInitialized()) return false; \ int id = focused_control(this); \ if (id == ID_EDITOR) { return editor->op(); } \ else { return false; } diff --git a/src/gui/set/style_panel.hpp b/src/gui/set/style_panel.hpp index 6e802d1d..45f58328 100644 --- a/src/gui/set/style_panel.hpp +++ b/src/gui/set/style_panel.hpp @@ -26,6 +26,10 @@ class StylePanel : public SetWindowPanel { virtual void onChangeSet(); virtual void onAction(const Action&, bool undone); + // --------------------------------------------------- : UI + + virtual void initUI(wxToolBar*, wxMenuBar*); + // --------------------------------------------------- : Clipboard virtual bool canCut() const; virtual bool canCopy() const; @@ -54,6 +58,9 @@ class StylePanel : public SetWindowPanel { /// Determine the best size for the list of stylesheets based on available space void updateListSize(); virtual bool Layout(); + + /// Actual intialization of the controls + void initControls(); }; // ----------------------------------------------------------------------------- : EOF