Implement T hotkey for temporary blueprint from selection
Add a TemporaryBlueprintRequestedEvent emitted by GameWorldView on the T key. BlueprintPanel handles it by building a blueprint from the current selection (reusing createBlueprintFromSelection) and entering placement mode via BlueprintPlacementRequestedEvent, without adding it to the list or persisting it. Right-click exits and discards the temporary blueprint through the existing exit path. No-op when nothing placeable is selected. Implements REQ-UI-BLUEPRINT-TEMP. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VGNNLeFWhVzvxkK9qVXP2K
This commit is contained in:
@@ -22,6 +22,7 @@ SET(HDRS
|
|||||||
${CMAKE_CURRENT_SOURCE_DIR}/DemolishModeToggleRequestedEvent.h
|
${CMAKE_CURRENT_SOURCE_DIR}/DemolishModeToggleRequestedEvent.h
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/BlueprintPlacementRequestedEvent.h
|
${CMAKE_CURRENT_SOURCE_DIR}/BlueprintPlacementRequestedEvent.h
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/ExitBlueprintModeRequestedEvent.h
|
${CMAKE_CURRENT_SOURCE_DIR}/ExitBlueprintModeRequestedEvent.h
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/TemporaryBlueprintRequestedEvent.h
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/SpeedChangeRequestedEvent.h
|
${CMAKE_CURRENT_SOURCE_DIR}/SpeedChangeRequestedEvent.h
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/LayoutDialogRequestedEvent.h
|
${CMAKE_CURRENT_SOURCE_DIR}/LayoutDialogRequestedEvent.h
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/RecipeSelectionRequestedEvent.h
|
${CMAKE_CURRENT_SOURCE_DIR}/RecipeSelectionRequestedEvent.h
|
||||||
|
|||||||
@@ -0,0 +1,9 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "Event.h"
|
||||||
|
|
||||||
|
// Emitted when the player presses the temporary-blueprint hotkey (REQ-UI-BLUEPRINT-TEMP).
|
||||||
|
// Carries no payload: the blueprint is built from the current selection by the receiver.
|
||||||
|
class TemporaryBlueprintRequestedEvent : public Event
|
||||||
|
{
|
||||||
|
};
|
||||||
@@ -339,3 +339,17 @@ void BlueprintPanel::handleEvent(std::shared_ptr<const BlueprintModeExitedEvent>
|
|||||||
{
|
{
|
||||||
clearActiveBlueprintButton();
|
clearActiveBlueprintButton();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void BlueprintPanel::handleEvent(std::shared_ptr<const TemporaryBlueprintRequestedEvent> /*event*/)
|
||||||
|
{
|
||||||
|
// Temporary blueprint (REQ-UI-BLUEPRINT-TEMP): build from the current selection and
|
||||||
|
// enter placement mode without adding it to the list or persisting it. If nothing
|
||||||
|
// player-placeable is selected, do nothing.
|
||||||
|
Blueprint bp = createBlueprintFromSelection();
|
||||||
|
if (bp.buildings.empty()) { return; }
|
||||||
|
|
||||||
|
// No saved blueprint is active while a temporary one is being placed.
|
||||||
|
clearActiveBlueprintButton();
|
||||||
|
EventManager::getInstance()->sendEventImmediately(
|
||||||
|
std::make_shared<BlueprintPlacementRequestedEvent>(std::move(bp)));
|
||||||
|
}
|
||||||
|
|||||||
@@ -11,6 +11,7 @@
|
|||||||
#include "EventHandler.h"
|
#include "EventHandler.h"
|
||||||
#include "GameConfig.h"
|
#include "GameConfig.h"
|
||||||
#include "SelectionChangedEvent.h"
|
#include "SelectionChangedEvent.h"
|
||||||
|
#include "TemporaryBlueprintRequestedEvent.h"
|
||||||
#include "Tick.h"
|
#include "Tick.h"
|
||||||
|
|
||||||
class Simulation;
|
class Simulation;
|
||||||
@@ -21,7 +22,8 @@ class QVBoxLayout;
|
|||||||
class BlueprintPanel : public QWidget,
|
class BlueprintPanel : public QWidget,
|
||||||
public CombinedEventHandler<BuildingBlocksChangedEvent,
|
public CombinedEventHandler<BuildingBlocksChangedEvent,
|
||||||
SelectionChangedEvent,
|
SelectionChangedEvent,
|
||||||
BlueprintModeExitedEvent>
|
BlueprintModeExitedEvent,
|
||||||
|
TemporaryBlueprintRequestedEvent>
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
@@ -33,6 +35,7 @@ private:
|
|||||||
void handleEvent(std::shared_ptr<const BuildingBlocksChangedEvent> event) override;
|
void handleEvent(std::shared_ptr<const BuildingBlocksChangedEvent> event) override;
|
||||||
void handleEvent(std::shared_ptr<const SelectionChangedEvent> event) override;
|
void handleEvent(std::shared_ptr<const SelectionChangedEvent> event) override;
|
||||||
void handleEvent(std::shared_ptr<const BlueprintModeExitedEvent> event) override;
|
void handleEvent(std::shared_ptr<const BlueprintModeExitedEvent> event) override;
|
||||||
|
void handleEvent(std::shared_ptr<const TemporaryBlueprintRequestedEvent> event) override;
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void onCreateClicked();
|
void onCreateClicked();
|
||||||
|
|||||||
@@ -56,6 +56,7 @@
|
|||||||
#include "EscapeMenuRequestedEvent.h"
|
#include "EscapeMenuRequestedEvent.h"
|
||||||
#include "TracePrintRequestedEvent.h"
|
#include "TracePrintRequestedEvent.h"
|
||||||
#include "BuildHotkeyPressedEvent.h"
|
#include "BuildHotkeyPressedEvent.h"
|
||||||
|
#include "TemporaryBlueprintRequestedEvent.h"
|
||||||
#include "BossWaveUpdatedEvent.h"
|
#include "BossWaveUpdatedEvent.h"
|
||||||
#include "BuilderModeExitedEvent.h"
|
#include "BuilderModeExitedEvent.h"
|
||||||
#include "BlueprintModeExitedEvent.h"
|
#include "BlueprintModeExitedEvent.h"
|
||||||
@@ -1582,6 +1583,13 @@ void GameWorldView::keyPressEvent(QKeyEvent* event)
|
|||||||
else if (m_blueprintMode.has_value()) { exitBlueprintMode(); }
|
else if (m_blueprintMode.has_value()) { exitBlueprintMode(); }
|
||||||
else { toggleDemolishMode(); }
|
else { toggleDemolishMode(); }
|
||||||
break;
|
break;
|
||||||
|
case Qt::Key_T:
|
||||||
|
// Request a temporary blueprint from the current selection (REQ-UI-BLUEPRINT-TEMP).
|
||||||
|
// The BlueprintPanel owns the selection and blueprint-capture logic; it decides
|
||||||
|
// whether anything placeable is selected and drives placement mode from there.
|
||||||
|
EventManager::getInstance()->sendEventImmediately(
|
||||||
|
std::make_shared<TemporaryBlueprintRequestedEvent>());
|
||||||
|
break;
|
||||||
case Qt::Key_Escape:
|
case Qt::Key_Escape:
|
||||||
EventManager::getInstance()->sendEventImmediately(
|
EventManager::getInstance()->sendEventImmediately(
|
||||||
std::make_shared<EscapeMenuRequestedEvent>());
|
std::make_shared<EscapeMenuRequestedEvent>());
|
||||||
|
|||||||
Reference in New Issue
Block a user