Skip to content

Commit e33601a

Browse files
authored
[Application] Add back navigation (#148)
* [Application] Add back button in top bar * [Application] Preserve approved layout when returning to review * [Application] Make back button go to previous screen * [Application] Add back navigation on layout review and clean up run back UI
1 parent b27617a commit e33601a

12 files changed

Lines changed: 115 additions & 48 deletions

src/application/LayoutReviewWidget.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -381,6 +381,7 @@ LayoutReviewWidget::LayoutReviewWidget(
381381
: QWidget(parent),
382382
projectName_(projectName),
383383
importResult_(importResult),
384+
openProjectHandler_(std::move(openProjectHandler)),
384385
approvalHandler_(std::move(approvalHandler)) {
385386
auto* layout = new QVBoxLayout(this);
386387
layout->setContentsMargins(0, 0, 0, 0);
@@ -404,7 +405,8 @@ LayoutReviewWidget::LayoutReviewWidget(
404405

405406
shell_->setTools({"Project", "Tool"});
406407
shell_->setSaveProjectHandler(std::move(saveProjectHandler));
407-
shell_->setOpenProjectHandler(std::move(openProjectHandler));
408+
shell_->setOpenProjectHandler(openProjectHandler_);
409+
shell_->setBackHandler(openProjectHandler_);
408410
shell_->setCanvas(preview_);
409411
shell_->setReviewPanel(reviewPanel);
410412

src/application/LayoutReviewWidget.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ class LayoutReviewWidget : public QWidget {
5050

5151
QString projectName_{};
5252
safecrowd::domain::ImportResult importResult_{};
53+
std::function<void()> openProjectHandler_{};
5354
std::function<void(const safecrowd::domain::ImportResult&)> approvalHandler_{};
5455
std::vector<safecrowd::domain::FacilityLayout2D> undoHistory_{};
5556
WorkspaceShell* shell_{nullptr};

src/application/MainWindow.cpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,7 @@ void MainWindow::saveCurrentProject() {
161161
void MainWindow::showLayoutReview(const ProjectMetadata& metadata) {
162162
currentProject_ = metadata;
163163
hasCurrentProject_ = true;
164+
lastApprovedImportResult_.reset();
164165

165166
auto importResult = metadata.isBuiltInDemo()
166167
? makeDemoImportResult()
@@ -177,6 +178,13 @@ void MainWindow::showLayoutReview(const ProjectMetadata& metadata) {
177178

178179
applySavedReviewState(metadata, &importResult);
179180

181+
showLayoutReview(metadata, std::move(importResult));
182+
}
183+
184+
void MainWindow::showLayoutReview(const ProjectMetadata& metadata, safecrowd::domain::ImportResult importResult) {
185+
currentProject_ = metadata;
186+
hasCurrentProject_ = true;
187+
180188
setCentralWidget(new LayoutReviewWidget(
181189
metadata.name,
182190
importResult,
@@ -189,6 +197,7 @@ void MainWindow::showLayoutReview(const ProjectMetadata& metadata) {
189197
showProjectNavigator();
190198
},
191199
[this](const safecrowd::domain::ImportResult& approvedImportResult) {
200+
lastApprovedImportResult_ = approvedImportResult;
192201
showScenarioAuthoring(approvedImportResult);
193202
},
194203
this));
@@ -200,6 +209,8 @@ void MainWindow::showScenarioAuthoring(const safecrowd::domain::ImportResult& im
200209
return;
201210
}
202211

212+
lastApprovedImportResult_ = importResult;
213+
203214
setCentralWidget(new ScenarioAuthoringWidget(
204215
currentProject_.name,
205216
*importResult.layout,
@@ -211,6 +222,13 @@ void MainWindow::showScenarioAuthoring(const safecrowd::domain::ImportResult& im
211222
currentProject_ = {};
212223
showProjectNavigator();
213224
},
225+
[this]() {
226+
if (lastApprovedImportResult_.has_value()) {
227+
showLayoutReview(currentProject_, *lastApprovedImportResult_);
228+
} else {
229+
showLayoutReview(currentProject_);
230+
}
231+
},
214232
this));
215233
}
216234

src/application/MainWindow.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
#pragma once
22

3+
#include <optional>
4+
35
#include <QMainWindow>
46

57
#include "application/ProjectMetadata.h"
@@ -26,11 +28,13 @@ class MainWindow : public QMainWindow {
2628
void openProject(const ProjectMetadata& metadata);
2729
void saveCurrentProject();
2830
void showLayoutReview(const ProjectMetadata& metadata);
31+
void showLayoutReview(const ProjectMetadata& metadata, safecrowd::domain::ImportResult importResult);
2932
void showScenarioAuthoring(const safecrowd::domain::ImportResult& importResult);
3033

3134
safecrowd::domain::SafeCrowdDomain& domain_;
3235
ProjectMetadata currentProject_{};
3336
bool hasCurrentProject_{false};
37+
std::optional<safecrowd::domain::ImportResult> lastApprovedImportResult_{};
3438
};
3539

3640
} // namespace safecrowd::application

src/application/ScenarioAuthoringWidget.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -246,12 +246,14 @@ ScenarioAuthoringWidget::ScenarioAuthoringWidget(
246246
const safecrowd::domain::FacilityLayout2D& layout,
247247
std::function<void()> saveProjectHandler,
248248
std::function<void()> openProjectHandler,
249+
std::function<void()> backToLayoutReviewHandler,
249250
QWidget* parent)
250251
: QWidget(parent),
251252
projectName_(projectName),
252253
layout_(layout),
253254
saveProjectHandler_(std::move(saveProjectHandler)),
254-
openProjectHandler_(std::move(openProjectHandler)) {
255+
openProjectHandler_(std::move(openProjectHandler)),
256+
backToLayoutReviewHandler_(std::move(backToLayoutReviewHandler)) {
255257
initializeUi(true);
256258
}
257259

@@ -261,12 +263,14 @@ ScenarioAuthoringWidget::ScenarioAuthoringWidget(
261263
InitialState initialState,
262264
std::function<void()> saveProjectHandler,
263265
std::function<void()> openProjectHandler,
266+
std::function<void()> backToLayoutReviewHandler,
264267
QWidget* parent)
265268
: QWidget(parent),
266269
projectName_(projectName),
267270
layout_(layout),
268271
saveProjectHandler_(std::move(saveProjectHandler)),
269272
openProjectHandler_(std::move(openProjectHandler)),
273+
backToLayoutReviewHandler_(std::move(backToLayoutReviewHandler)),
270274
scenarios_(std::move(initialState.scenarios)),
271275
currentScenarioIndex_(initialState.currentScenarioIndex),
272276
navigationView_(initialState.navigationView),
@@ -283,6 +287,7 @@ void ScenarioAuthoringWidget::initializeUi(bool promptForScenario) {
283287
shell_->setTools({"Project"});
284288
shell_->setSaveProjectHandler(saveProjectHandler_);
285289
shell_->setOpenProjectHandler(openProjectHandler_);
290+
shell_->setBackHandler(backToLayoutReviewHandler_);
286291
shell_->setTopBarTrailingWidget(createTopBarTogglePanel());
287292
refreshRightPanel();
288293
rootLayout->addWidget(shell_);
@@ -541,6 +546,7 @@ void ScenarioAuthoringWidget::runFirstStagedBaselineScenario() {
541546
scenario->draft,
542547
saveProjectHandler_,
543548
openProjectHandler_,
549+
backToLayoutReviewHandler_,
544550
this);
545551
rootLayout->replaceWidget(shell_, runWidget);
546552
shell_->hide();

src/application/ScenarioAuthoringWidget.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ class ScenarioAuthoringWidget : public QWidget {
2525
const safecrowd::domain::FacilityLayout2D& layout,
2626
std::function<void()> saveProjectHandler,
2727
std::function<void()> openProjectHandler,
28+
std::function<void()> backToLayoutReviewHandler,
2829
QWidget* parent = nullptr);
2930

3031
enum class NavigationView {
@@ -62,6 +63,7 @@ class ScenarioAuthoringWidget : public QWidget {
6263
InitialState initialState,
6364
std::function<void()> saveProjectHandler,
6465
std::function<void()> openProjectHandler,
66+
std::function<void()> backToLayoutReviewHandler,
6567
QWidget* parent = nullptr);
6668

6769
private:
@@ -92,6 +94,7 @@ class ScenarioAuthoringWidget : public QWidget {
9294
safecrowd::domain::FacilityLayout2D layout_{};
9395
std::function<void()> saveProjectHandler_{};
9496
std::function<void()> openProjectHandler_{};
97+
std::function<void()> backToLayoutReviewHandler_{};
9598
std::vector<ScenarioState> scenarios_{};
9699
int currentScenarioIndex_{-1};
97100
NavigationView navigationView_{NavigationView::Layout};

src/application/ScenarioResultWidget.cpp

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -468,6 +468,7 @@ ScenarioResultWidget::ScenarioResultWidget(
468468
safecrowd::domain::ScenarioResultArtifacts artifacts,
469469
std::function<void()> saveProjectHandler,
470470
std::function<void()> openProjectHandler,
471+
std::function<void()> backToLayoutReviewHandler,
471472
QWidget* parent)
472473
: QWidget(parent),
473474
projectName_(std::move(projectName)),
@@ -477,7 +478,8 @@ ScenarioResultWidget::ScenarioResultWidget(
477478
risk_(std::move(risk)),
478479
artifacts_(std::move(artifacts)),
479480
saveProjectHandler_(std::move(saveProjectHandler)),
480-
openProjectHandler_(std::move(openProjectHandler)) {
481+
openProjectHandler_(std::move(openProjectHandler)),
482+
backToLayoutReviewHandler_(std::move(backToLayoutReviewHandler)) {
481483
auto* rootLayout = new QVBoxLayout(this);
482484
rootLayout->setContentsMargins(0, 0, 0, 0);
483485
rootLayout->setSpacing(0);
@@ -491,6 +493,9 @@ ScenarioResultWidget::ScenarioResultWidget(
491493
shell_->setTools({"Project"});
492494
shell_->setSaveProjectHandler(saveProjectHandler_);
493495
shell_->setOpenProjectHandler(openProjectHandler_);
496+
shell_->setBackHandler([this]() {
497+
navigateToAuthoring(true);
498+
});
494499

495500
auto* canvas = new SimulationCanvasWidget(layout_, shell_);
496501
canvas->setFrame(frame_);
@@ -541,6 +546,7 @@ void ScenarioResultWidget::rerunScenario() {
541546
scenario_,
542547
saveProjectHandler_,
543548
openProjectHandler_,
549+
backToLayoutReviewHandler_,
544550
this);
545551

546552
rootLayout->replaceWidget(shell_, runWidget);
@@ -569,6 +575,7 @@ void ScenarioResultWidget::navigateToAuthoring(bool showRunPanel) {
569575
std::move(initial),
570576
saveProjectHandler_,
571577
openProjectHandler_,
578+
backToLayoutReviewHandler_,
572579
this);
573580

574581
rootLayout->replaceWidget(shell_, authoringWidget);

src/application/ScenarioResultWidget.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ class ScenarioResultWidget : public QWidget {
2626
safecrowd::domain::ScenarioResultArtifacts artifacts,
2727
std::function<void()> saveProjectHandler,
2828
std::function<void()> openProjectHandler,
29+
std::function<void()> backToLayoutReviewHandler,
2930
QWidget* parent = nullptr);
3031

3132
private:
@@ -40,6 +41,7 @@ class ScenarioResultWidget : public QWidget {
4041
safecrowd::domain::ScenarioResultArtifacts artifacts_{};
4142
std::function<void()> saveProjectHandler_{};
4243
std::function<void()> openProjectHandler_{};
44+
std::function<void()> backToLayoutReviewHandler_{};
4345
WorkspaceShell* shell_{nullptr};
4446
};
4547

src/application/ScenarioRunWidget.cpp

Lines changed: 8 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -168,14 +168,16 @@ ScenarioRunWidget::ScenarioRunWidget(
168168
const safecrowd::domain::ScenarioDraft& scenario,
169169
std::function<void()> saveProjectHandler,
170170
std::function<void()> openProjectHandler,
171+
std::function<void()> backToLayoutReviewHandler,
171172
QWidget* parent)
172173
: QWidget(parent),
173174
projectName_(projectName),
174175
layout_(layout),
175176
scenario_(scenario),
176177
runner_(layout_, scenario_),
177178
saveProjectHandler_(std::move(saveProjectHandler)),
178-
openProjectHandler_(std::move(openProjectHandler)) {
179+
openProjectHandler_(std::move(openProjectHandler)),
180+
backToLayoutReviewHandler_(std::move(backToLayoutReviewHandler)) {
179181
auto* rootLayout = new QVBoxLayout(this);
180182
rootLayout->setContentsMargins(0, 0, 0, 0);
181183
rootLayout->setSpacing(0);
@@ -189,13 +191,15 @@ ScenarioRunWidget::ScenarioRunWidget(
189191
shell_->setTools({"Project"});
190192
shell_->setSaveProjectHandler(saveProjectHandler_);
191193
shell_->setOpenProjectHandler(openProjectHandler_);
194+
shell_->setBackHandler([this]() {
195+
returnToAuthoring();
196+
});
192197
canvas_ = new SimulationCanvasWidget(layout_, shell_);
193198
canvas_->setFrame(runner_.frame());
194199
shell_->setCanvas(canvas_);
195200
shell_->setReviewPanel(createRunPanel());
196201
shell_->setReviewPanelVisible(true);
197202
rootLayout->addWidget(shell_);
198-
addBackToAuthoringButton();
199203

200204
timer_ = new QTimer(this);
201205
timer_->setInterval(33);
@@ -282,36 +286,6 @@ QWidget* ScenarioRunWidget::createRunPanel() {
282286
return panel;
283287
}
284288

285-
void ScenarioRunWidget::addBackToAuthoringButton() {
286-
if (canvas_ == nullptr) {
287-
return;
288-
}
289-
290-
auto* button = new QPushButton("<", canvas_);
291-
button->setToolTip("Back to scenario editor");
292-
button->setAccessibleName("Back to scenario editor");
293-
button->setFixedSize(40, 36);
294-
button->move(16, 16);
295-
button->raise();
296-
button->setStyleSheet(
297-
"QPushButton {"
298-
" background: rgba(255, 255, 255, 232);"
299-
" border: 1px solid #c9d5e2;"
300-
" border-radius: 10px;"
301-
" color: #16202b;"
302-
" font-size: 18px;"
303-
" font-weight: 700;"
304-
" padding-bottom: 2px;"
305-
"}"
306-
"QPushButton:hover {"
307-
" background: #eef3f8;"
308-
" border-color: #b8c6d6;"
309-
"}");
310-
connect(button, &QPushButton::clicked, this, [this]() {
311-
returnToAuthoring();
312-
});
313-
}
314-
315289
void ScenarioRunWidget::returnToAuthoring() {
316290
if (timer_ != nullptr) {
317291
timer_->stop();
@@ -334,6 +308,7 @@ void ScenarioRunWidget::returnToAuthoring() {
334308
std::move(initial),
335309
saveProjectHandler_,
336310
openProjectHandler_,
311+
backToLayoutReviewHandler_,
337312
this);
338313

339314
rootLayout->replaceWidget(shell_, authoringWidget);
@@ -451,6 +426,7 @@ void ScenarioRunWidget::showResults() {
451426
openProjectHandler_();
452427
}
453428
},
429+
backToLayoutReviewHandler_,
454430
this);
455431
rootLayout->replaceWidget(shell_, resultWidget);
456432
shell_->hide();

src/application/ScenarioRunWidget.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,11 @@ class ScenarioRunWidget : public QWidget {
2727
const safecrowd::domain::ScenarioDraft& scenario,
2828
std::function<void()> saveProjectHandler,
2929
std::function<void()> openProjectHandler,
30+
std::function<void()> backToLayoutReviewHandler,
3031
QWidget* parent = nullptr);
3132

3233
private:
3334
QWidget* createRunPanel();
34-
void addBackToAuthoringButton();
3535
void returnToAuthoring();
3636
void refreshStatus();
3737
void showResults();
@@ -44,6 +44,7 @@ class ScenarioRunWidget : public QWidget {
4444
safecrowd::domain::ScenarioSimulationRunner runner_{};
4545
std::function<void()> saveProjectHandler_{};
4646
std::function<void()> openProjectHandler_{};
47+
std::function<void()> backToLayoutReviewHandler_{};
4748
WorkspaceShell* shell_{nullptr};
4849
SimulationCanvasWidget* canvas_{nullptr};
4950
QTimer* timer_{nullptr};

0 commit comments

Comments
 (0)