Skip to content

Commit fb8cb3a

Browse files
jw098Developer-Butters
authored andcommitted
lazy initialization of ProgramResourceDownloadTableWidget (PokemonAutomation#1324)
1 parent 4e6799a commit fb8cb3a

6 files changed

Lines changed: 95 additions & 58 deletions

File tree

SerialPrograms/Source/ComputerPrograms/Framework/ComputerProgramWidget.cpp

Lines changed: 24 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,8 @@ ComputerProgramWidget::ComputerProgramWidget(
4040
, m_holder(holder)
4141
, m_session(option)
4242
{
43-
QVBoxLayout* layout = new QVBoxLayout(this);
44-
layout->setContentsMargins(0, 0, 0, 0);
43+
m_layout = new QVBoxLayout(this);
44+
m_layout->setContentsMargins(0, 0, 0, 0);
4545

4646
const ComputerProgramDescriptor& descriptor = option.descriptor();
4747

@@ -51,12 +51,12 @@ ComputerProgramWidget::ComputerProgramWidget(
5151
descriptor.doc_link(),
5252
descriptor.description()
5353
);
54-
layout->addWidget(header);
54+
m_layout->addWidget(header);
5555

5656

5757
{
5858
QScrollArea* scroll_outer = new QScrollArea(this);
59-
layout->addWidget(scroll_outer);
59+
m_layout->addWidget(scroll_outer);
6060
scroll_outer->setWidgetResizable(true);
6161

6262
QWidget* scroll_inner = new QWidget(scroll_outer);
@@ -72,14 +72,11 @@ ComputerProgramWidget::ComputerProgramWidget(
7272

7373
m_stats_bar = new StatsBar(*this);
7474
m_stats_bar->set_stats("", m_session.historical_stats());
75-
layout->addWidget(m_stats_bar);
75+
m_layout->addWidget(m_stats_bar);
7676

7777
m_actions_bar = new RunnablePanelActionBar(*this, m_session.current_state());
78-
layout->addWidget(m_actions_bar);
78+
m_layout->addWidget(m_actions_bar);
7979

80-
m_downloads_table = new ProgramResourceDownloadTableWidget(*this);
81-
m_downloads_table->setVisible(false);
82-
layout->addWidget(m_downloads_table);
8380

8481
connect(
8582
m_actions_bar, &RunnablePanelActionBar::start_clicked,
@@ -122,23 +119,23 @@ void ComputerProgramWidget::state_change(ProgramState state){
122119
}
123120

124121
if(state == ProgramState::STOPPING){
125-
m_downloads_table->remove_all_downloads();
122+
ensure_downloads_table()->remove_all_downloads();
126123
}
127-
});
124+
}, Qt::QueuedConnection);
128125
}
129126
void ComputerProgramWidget::stats_update(const StatsTracker* current_stats, const StatsTracker* historical_stats){
130127
QMetaObject::invokeMethod(this, [this, current_stats, historical_stats]{
131128
m_stats_bar->set_stats(
132129
current_stats == nullptr ? "" : current_stats->to_str(StatsTracker::DISPLAY_ON_SCREEN),
133130
historical_stats == nullptr ? "" : historical_stats->to_str(StatsTracker::DISPLAY_ON_SCREEN)
134131
);
135-
});
132+
}, Qt::QueuedConnection);
136133
}
137134
void ComputerProgramWidget::error(const std::string& message){
138135
QMetaObject::invokeMethod(this, [message]{
139136
QMessageBox box;
140137
box.critical(nullptr, "Error", QString::fromStdString(message));
141-
});
138+
}, Qt::QueuedConnection);
142139
}
143140

144141
void ComputerProgramWidget::download_error(const std::string& message){
@@ -148,20 +145,29 @@ void ComputerProgramWidget::download_error(const std::string& message){
148145
QMetaObject::invokeMethod(this, [message]{
149146
QMessageBox box;
150147
box.critical(nullptr, "Error", QString::fromStdString(message));
151-
});
148+
}, Qt::QueuedConnection);
152149
m_popup_is_open.store(false);
153150
}
154151

155152
void ComputerProgramWidget::download_added(std::shared_ptr<ResourceDownload> download_ptr){
156153
QMetaObject::invokeMethod(this, [this, download_ptr = std::move(download_ptr)]() mutable{
157-
this->m_downloads_table->add_download(std::move(download_ptr));
158-
});
154+
this->ensure_downloads_table()->add_download(std::move(download_ptr));
155+
}, Qt::QueuedConnection);
159156
}
160157

161158
void ComputerProgramWidget::all_downloads_done(){
162159
QMetaObject::invokeMethod(this, [this]{
163-
this->m_downloads_table->remove_all_downloads();
164-
});
160+
this->ensure_downloads_table()->remove_all_downloads();
161+
}, Qt::QueuedConnection);
162+
}
163+
164+
ProgramResourceDownloadTableWidget* ComputerProgramWidget::ensure_downloads_table() {
165+
if (!m_internal_lazy_downloads_table) {
166+
m_internal_lazy_downloads_table = new ProgramResourceDownloadTableWidget(*this);
167+
m_internal_lazy_downloads_table->setVisible(false);
168+
m_layout->addWidget(m_internal_lazy_downloads_table);
169+
}
170+
return m_internal_lazy_downloads_table;
165171
}
166172

167173

SerialPrograms/Source/ComputerPrograms/Framework/ComputerProgramWidget.h

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
#include "ComputerPrograms/Framework/ComputerProgramSession.h"
2424
#include "ComputerProgramSession.h"
2525

26+
QT_FORWARD_DECLARE_CLASS(QVBoxLayout)
2627
namespace PokemonAutomation{
2728

2829
class ProgramResourceDownloadTableWidget;
@@ -46,13 +47,18 @@ class ComputerProgramWidget : public QWidget, private ProgramSession::Listener{
4647
virtual void download_added(std::shared_ptr<ResourceDownload> download_ptr) override;
4748
virtual void all_downloads_done() override;
4849

50+
ProgramResourceDownloadTableWidget* ensure_downloads_table();
51+
4952
private:
5053
PanelHolder& m_holder;
5154
ComputerProgramSession m_session;
55+
QVBoxLayout* m_layout;
5256
ConfigWidget* m_options;
5357
StatsBar* m_stats_bar;
5458
RunnablePanelActionBar* m_actions_bar;
55-
ProgramResourceDownloadTableWidget* m_downloads_table;
59+
60+
// WARNING: Do not use directly. Always use ensure_downloads_table().
61+
ProgramResourceDownloadTableWidget* m_internal_lazy_downloads_table = nullptr;
5662
std::atomic<bool> m_popup_is_open{false};
5763
};
5864

SerialPrograms/Source/NintendoSwitch/Framework/UI/NintendoSwitch_MultiSwitchProgramWidget.cpp

Lines changed: 26 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,8 @@ MultiSwitchProgramWidget2::MultiSwitchProgramWidget2(
5151
, m_session(option)
5252
, m_sanitizer("MultiSwitchProgramWidget2")
5353
{
54-
QVBoxLayout* layout = new QVBoxLayout(this);
55-
layout->setContentsMargins(0, 0, 0, 0);
54+
m_layout = new QVBoxLayout(this);
55+
m_layout->setContentsMargins(0, 0, 0, 0);
5656

5757
const MultiSwitchProgramDescriptor& descriptor = option.descriptor();
5858

@@ -63,7 +63,7 @@ MultiSwitchProgramWidget2::MultiSwitchProgramWidget2(
6363
descriptor.description(),
6464
descriptor.color_class()
6565
);
66-
layout->addWidget(header);
66+
m_layout->addWidget(header);
6767

6868
if (descriptor.deprecated()){
6969
QMessageBox box;
@@ -80,7 +80,7 @@ MultiSwitchProgramWidget2::MultiSwitchProgramWidget2(
8080

8181
{
8282
QScrollArea* scroll_outer = new QScrollArea(this);
83-
layout->addWidget(scroll_outer);
83+
m_layout->addWidget(scroll_outer);
8484
scroll_outer->setWidgetResizable(true);
8585

8686
QWidget* scroll_inner = new QWidget(scroll_outer);
@@ -99,14 +99,12 @@ MultiSwitchProgramWidget2::MultiSwitchProgramWidget2(
9999

100100
m_stats_bar = new StatsBar(*this);
101101
m_stats_bar->set_stats("", m_session.historical_stats());
102-
layout->addWidget(m_stats_bar);
102+
m_layout->addWidget(m_stats_bar);
103103

104104
m_actions_bar = new RunnablePanelActionBar(*this, m_session.current_state());
105-
layout->addWidget(m_actions_bar);
105+
m_layout->addWidget(m_actions_bar);
106+
106107

107-
m_downloads_table = new ProgramResourceDownloadTableWidget(*this);
108-
m_downloads_table->setVisible(false);
109-
layout->addWidget(m_downloads_table);
110108

111109
connect(
112110
m_actions_bar, &RunnablePanelActionBar::start_clicked,
@@ -160,9 +158,9 @@ void MultiSwitchProgramWidget2::state_change(ProgramState state){
160158
}
161159

162160
if(state == ProgramState::STOPPING){
163-
m_downloads_table->remove_all_downloads();
161+
ensure_downloads_table()->remove_all_downloads();
164162
}
165-
});
163+
}, Qt::QueuedConnection);
166164
}
167165
void MultiSwitchProgramWidget2::stats_update(const StatsTracker* current_stats, const StatsTracker* historical_stats){
168166
auto ScopeCheck = m_sanitizer.check_scope();
@@ -171,14 +169,14 @@ void MultiSwitchProgramWidget2::stats_update(const StatsTracker* current_stats,
171169
current_stats == nullptr ? "" : current_stats->to_str(StatsTracker::DISPLAY_ON_SCREEN),
172170
historical_stats == nullptr ? "" : historical_stats->to_str(StatsTracker::DISPLAY_ON_SCREEN)
173171
);
174-
});
172+
}, Qt::QueuedConnection);
175173
}
176174
void MultiSwitchProgramWidget2::error(const std::string& message){
177175
auto ScopeCheck = m_sanitizer.check_scope();
178176
QMetaObject::invokeMethod(this, [message]{
179177
QMessageBox box;
180178
box.critical(nullptr, "Error", QString::fromStdString(message));
181-
});
179+
}, Qt::QueuedConnection);
182180
}
183181

184182
void MultiSwitchProgramWidget2::download_error(const std::string& message){
@@ -189,31 +187,40 @@ void MultiSwitchProgramWidget2::download_error(const std::string& message){
189187
QMetaObject::invokeMethod(this, [message]{
190188
QMessageBox box;
191189
box.critical(nullptr, "Error", QString::fromStdString(message));
192-
});
190+
}, Qt::QueuedConnection);
193191
m_popup_is_open.store(false);
194192
}
195193

196194
void MultiSwitchProgramWidget2::download_added(std::shared_ptr<ResourceDownload> download_ptr){
197195
QMetaObject::invokeMethod(this, [this, download_ptr = std::move(download_ptr)]() mutable{
198-
this->m_downloads_table->add_download(std::move(download_ptr));
199-
});
196+
this->ensure_downloads_table()->add_download(std::move(download_ptr));
197+
}, Qt::QueuedConnection);
200198
}
201199

202200
void MultiSwitchProgramWidget2::all_downloads_done(){
203201
QMetaObject::invokeMethod(this, [this]{
204-
this->m_downloads_table->remove_all_downloads();
205-
});
202+
this->ensure_downloads_table()->remove_all_downloads();
203+
}, Qt::QueuedConnection);
206204
}
207205

208206

209207
void MultiSwitchProgramWidget2::redraw_options(){
210208
auto ScopeCheck = m_sanitizer.check_scope();
211209
QMetaObject::invokeMethod(this, [this]{
212210
m_options->update_all(false);
213-
});
211+
}, Qt::QueuedConnection);
214212
}
215213

216214

215+
ProgramResourceDownloadTableWidget* MultiSwitchProgramWidget2::ensure_downloads_table() {
216+
if (!m_internal_lazy_downloads_table) {
217+
m_internal_lazy_downloads_table = new ProgramResourceDownloadTableWidget(*this);
218+
m_internal_lazy_downloads_table->setVisible(false);
219+
m_layout->addWidget(m_internal_lazy_downloads_table);
220+
}
221+
return m_internal_lazy_downloads_table;
222+
}
223+
217224

218225

219226

SerialPrograms/Source/NintendoSwitch/Framework/UI/NintendoSwitch_MultiSwitchProgramWidget.h

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
#include "NintendoSwitch/Framework/NintendoSwitch_MultiSwitchProgramSession.h"
2424
#include "NintendoSwitch_MultiSwitchSystemWidget.h"
2525

26+
QT_FORWARD_DECLARE_CLASS(QVBoxLayout)
2627
namespace PokemonAutomation{
2728
struct PanelHolder;
2829
class ProgramResourceDownloadTableWidget;
@@ -49,14 +50,19 @@ class MultiSwitchProgramWidget2 : public QWidget, private ProgramSession::Listen
4950

5051
virtual void redraw_options() override;
5152

53+
ProgramResourceDownloadTableWidget* ensure_downloads_table();
54+
5255
private:
5356
PanelHolder& m_holder;
5457
MultiSwitchProgramSession m_session;
58+
QVBoxLayout* m_layout;
5559
MultiSwitchSystemWidget* m_system;
5660
ConfigWidget* m_options;
5761
StatsBar* m_stats_bar;
5862
RunnablePanelActionBar* m_actions_bar;
59-
ProgramResourceDownloadTableWidget* m_downloads_table;
63+
64+
// WARNING: Do not use directly. Always use ensure_downloads_table().
65+
ProgramResourceDownloadTableWidget* m_internal_lazy_downloads_table = nullptr;
6066
std::atomic<bool> m_popup_is_open{false};
6167

6268
LifetimeSanitizer m_sanitizer;

SerialPrograms/Source/NintendoSwitch/Framework/UI/NintendoSwitch_SingleSwitchProgramWidget.cpp

Lines changed: 24 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,8 @@ SingleSwitchProgramWidget2::SingleSwitchProgramWidget2(
5050
, m_holder(holder)
5151
, m_session(option, 0)
5252
{
53-
QVBoxLayout* layout = new QVBoxLayout(this);
54-
layout->setContentsMargins(0, 0, 0, 0);
53+
m_layout = new QVBoxLayout(this);
54+
m_layout->setContentsMargins(0, 0, 0, 0);
5555

5656
const SingleSwitchProgramDescriptor& descriptor = option.descriptor();
5757

@@ -62,7 +62,7 @@ SingleSwitchProgramWidget2::SingleSwitchProgramWidget2(
6262
descriptor.description(),
6363
descriptor.color_class()
6464
);
65-
layout->addWidget(header);
65+
m_layout->addWidget(header);
6666

6767
if (descriptor.deprecated()){
6868
QMessageBox box;
@@ -79,7 +79,7 @@ SingleSwitchProgramWidget2::SingleSwitchProgramWidget2(
7979

8080
{
8181
QScrollArea* scroll_outer = new QScrollArea(this);
82-
layout->addWidget(scroll_outer);
82+
m_layout->addWidget(scroll_outer);
8383
scroll_outer->setWidgetResizable(true);
8484

8585
QWidget* scroll_inner = new QWidget(scroll_outer);
@@ -102,14 +102,11 @@ SingleSwitchProgramWidget2::SingleSwitchProgramWidget2(
102102

103103
m_stats_bar = new StatsBar(*this);
104104
m_stats_bar->set_stats("", m_session.historical_stats());
105-
layout->addWidget(m_stats_bar);
105+
m_layout->addWidget(m_stats_bar);
106106

107107
m_actions_bar = new RunnablePanelActionBar(*this, m_session.current_state());
108-
layout->addWidget(m_actions_bar);
108+
m_layout->addWidget(m_actions_bar);
109109

110-
m_downloads_table = new ProgramResourceDownloadTableWidget(*this);
111-
m_downloads_table->setVisible(false);
112-
layout->addWidget(m_downloads_table);
113110

114111
connect(
115112
m_actions_bar, &RunnablePanelActionBar::start_clicked,
@@ -158,23 +155,23 @@ void SingleSwitchProgramWidget2::state_change(ProgramState state){
158155
}
159156

160157
if(state == ProgramState::STOPPING){
161-
m_downloads_table->remove_all_downloads();
158+
ensure_downloads_table()->remove_all_downloads();
162159
}
163-
});
160+
}, Qt::QueuedConnection);
164161
}
165162
void SingleSwitchProgramWidget2::stats_update(const StatsTracker* current_stats, const StatsTracker* historical_stats){
166163
QMetaObject::invokeMethod(this, [this, current_stats, historical_stats]{
167164
m_stats_bar->set_stats(
168165
current_stats == nullptr ? "" : current_stats->to_str(StatsTracker::DISPLAY_ON_SCREEN),
169166
historical_stats == nullptr ? "" : historical_stats->to_str(StatsTracker::DISPLAY_ON_SCREEN)
170167
);
171-
});
168+
}, Qt::QueuedConnection);
172169
}
173170
void SingleSwitchProgramWidget2::error(const std::string& message){
174171
QMetaObject::invokeMethod(this, [message]{
175172
QMessageBox box;
176173
box.critical(nullptr, "Error", QString::fromStdString(message));
177-
});
174+
}, Qt::QueuedConnection);
178175
}
179176
void SingleSwitchProgramWidget2::download_error(const std::string& message){
180177
if (m_popup_is_open.exchange(true)){ // only show popups if one isn't already open
@@ -184,23 +181,32 @@ void SingleSwitchProgramWidget2::download_error(const std::string& message){
184181
QMetaObject::invokeMethod(this, [message]{
185182
QMessageBox box;
186183
box.critical(nullptr, "Error", QString::fromStdString(message));
187-
});
184+
}, Qt::QueuedConnection);
188185
m_popup_is_open.store(false);
189186
}
190187

191188
void SingleSwitchProgramWidget2::download_added(std::shared_ptr<ResourceDownload> download_ptr){
192189
QMetaObject::invokeMethod(this, [this, download_ptr = std::move(download_ptr)]() mutable{
193-
this->m_downloads_table->add_download(std::move(download_ptr));
194-
});
190+
this->ensure_downloads_table()->add_download(std::move(download_ptr));
191+
}, Qt::QueuedConnection);
195192
}
196193

197194
void SingleSwitchProgramWidget2::all_downloads_done(){
198195
QMetaObject::invokeMethod(this, [this]{
199-
this->m_downloads_table->remove_all_downloads();
200-
});
196+
this->ensure_downloads_table()->remove_all_downloads();
197+
}, Qt::QueuedConnection);
201198
}
202199

203200

201+
ProgramResourceDownloadTableWidget* SingleSwitchProgramWidget2::ensure_downloads_table() {
202+
if (!m_internal_lazy_downloads_table) {
203+
m_internal_lazy_downloads_table = new ProgramResourceDownloadTableWidget(*this);
204+
m_internal_lazy_downloads_table->setVisible(false);
205+
m_layout->addWidget(m_internal_lazy_downloads_table);
206+
}
207+
return m_internal_lazy_downloads_table;
208+
}
209+
204210

205211

206212

0 commit comments

Comments
 (0)