From 10a8368fd4e4a5deb6c54f2afa876e78346811dc Mon Sep 17 00:00:00 2001 From: Silversupplier Date: Thu, 30 Apr 2026 17:19:07 +0900 Subject: [PATCH] =?UTF-8?q?[Application]=20Sprint=201=20Empty/Error=20?= =?UTF-8?q?=EC=83=81=ED=83=9C=20=EA=B0=9C=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - ProjectListWidget: '저장된 프로젝트 없음' 화면에 New Project 안내 힌트 추가 - ScenarioAuthoringWidget Run 패널: Staged scenario 없을 때 다음 행동 안내 문구 + Run 버튼 비활성 tooltip 추가 - ScenarioAuthoringWidget: Stage Scenario 버튼 상태별 tooltip 추가 (시나리오 미생성/스테이징 토글) - LayoutReviewWidget: Approve Layout 버튼 비활성 tooltip + 상태 라벨 문구 정리 - NewProjectWidget: DXF 입력 placeholder 명확화 + Done 버튼 필수 입력 tooltip --- src/application/LayoutReviewWidget.cpp | 5 ++++- src/application/NewProjectWidget.cpp | 3 ++- src/application/ProjectListWidget.cpp | 5 +++++ src/application/ScenarioAuthoringWidget.cpp | 17 +++++++++++++++-- 4 files changed, 26 insertions(+), 4 deletions(-) diff --git a/src/application/LayoutReviewWidget.cpp b/src/application/LayoutReviewWidget.cpp index fea327b..3e8e596 100644 --- a/src/application/LayoutReviewWidget.cpp +++ b/src/application/LayoutReviewWidget.cpp @@ -494,6 +494,9 @@ void LayoutReviewWidget::refreshApprovalState() { if (approveButton_ != nullptr) { approveButton_->setEnabled(!hasBlocking); + approveButton_->setToolTip(hasBlocking + ? "Resolve all blocking issues in the Issues panel before approving" + : "Approve this layout and proceed to Scenario Authoring"); } if (approvalStatusLabel_ == nullptr) { @@ -501,7 +504,7 @@ void LayoutReviewWidget::refreshApprovalState() { } if (hasBlocking) { - approvalStatusLabel_->setText("Resolve blocking issues first"); + approvalStatusLabel_->setText("Resolve blocking issues to approve"); return; } diff --git a/src/application/NewProjectWidget.cpp b/src/application/NewProjectWidget.cpp index 522decc..13f1093 100644 --- a/src/application/NewProjectWidget.cpp +++ b/src/application/NewProjectWidget.cpp @@ -77,7 +77,7 @@ NewProjectWidget::NewProjectWidget(QWidget* parent) layoutRow->setSpacing(12); auto* layoutBrowseButton = createOutlinedButton("Browse", this); layoutPathEdit_ = createTextInput(this); - layoutPathEdit_->setPlaceholderText("DXF file"); + layoutPathEdit_->setPlaceholderText("Select a DXF file using Browse"); layoutPathEdit_->setReadOnly(true); layoutPathEdit_->setStyleSheet(ui::textFieldStyleSheet(true)); layoutPathEdit_->setMaximumWidth(760); @@ -113,6 +113,7 @@ NewProjectWidget::NewProjectWidget(QWidget* parent) auto* cancelButton = createOutlinedButton("Cancel", this); auto* doneButton = createOutlinedButton("Done", this); doneButton->setStyleSheet(ui::primaryButtonStyleSheet()); + doneButton->setToolTip("Project name, DXF layout file, and folder are all required"); actionLayout->addWidget(cancelButton); actionLayout->addWidget(doneButton); cardLayout->addLayout(actionLayout); diff --git a/src/application/ProjectListWidget.cpp b/src/application/ProjectListWidget.cpp index d093e4e..89611ef 100644 --- a/src/application/ProjectListWidget.cpp +++ b/src/application/ProjectListWidget.cpp @@ -65,6 +65,11 @@ ProjectListWidget::ProjectListWidget(const QList& projects, QWi emptyLabel->setFont(ui::font(ui::FontRole::Body)); emptyLabel->setStyleSheet(ui::mutedTextStyleSheet()); layout->addWidget(emptyLabel); + auto* hintLabel = new QLabel("Use + New Project to create your first project.", this); + hintLabel->setFont(ui::font(ui::FontRole::Caption)); + hintLabel->setStyleSheet(ui::subtleTextStyleSheet()); + hintLabel->setWordWrap(true); + layout->addWidget(hintLabel); } else { for (const auto& project : projects) { addProjectRow(project); diff --git a/src/application/ScenarioAuthoringWidget.cpp b/src/application/ScenarioAuthoringWidget.cpp index 6cd05cb..ca1bc74 100644 --- a/src/application/ScenarioAuthoringWidget.cpp +++ b/src/application/ScenarioAuthoringWidget.cpp @@ -451,7 +451,16 @@ void ScenarioAuthoringWidget::refreshInspector() { } if (stageScenarioButton_ != nullptr) { stageScenarioButton_->setEnabled(hasScenario); - stageScenarioButton_->setText(hasScenario && scenario->stagedForRun ? "Staged for Run" : "Stage Scenario"); + if (!hasScenario) { + stageScenarioButton_->setText("Stage Scenario"); + stageScenarioButton_->setToolTip("Create a scenario first to enable staging"); + } else if (scenario->stagedForRun) { + stageScenarioButton_->setText("Staged for Run"); + stageScenarioButton_->setToolTip("Click to remove this scenario from the staged list"); + } else { + stageScenarioButton_->setText("Stage Scenario"); + stageScenarioButton_->setToolTip("Mark this scenario to be included in the next Run"); + } } } @@ -679,7 +688,8 @@ QWidget* ScenarioAuthoringWidget::createRunPanel() { return scenario.stagedForRun; }); if (stagedCount == 0) { - lines << "No staged scenarios"; + lines << "No scenarios staged for run."; + lines << "Select a scenario and click Stage Scenario to continue."; } else { lines << "Staged scenarios"; for (const auto& scenario : scenarios_) { @@ -698,6 +708,9 @@ QWidget* ScenarioAuthoringWidget::createRunPanel() { executeRunButton_->setFont(ui::font(ui::FontRole::Body)); executeRunButton_->setStyleSheet(ui::primaryButtonStyleSheet()); executeRunButton_->setEnabled(stagedCount > 0); + executeRunButton_->setToolTip(stagedCount > 0 + ? "Start simulation for all staged scenarios" + : "Stage at least one baseline scenario before running"); layout->addWidget(executeRunButton_); connect(executeRunButton_, &QPushButton::clicked, this, [this]() { runFirstStagedBaselineScenario();