From d8737c5841818281541ab59060257fc5af70a57e Mon Sep 17 00:00:00 2001 From: past-due <30942300+past-due@users.noreply.github.com> Date: Mon, 28 Aug 2023 20:13:09 -0400 Subject: [PATCH] DynamicIntFancyButton: Add synthesized secondary click on primary click-and-hold Exposes the ability to access the secondary click functionality even when a right mouse button might not be available (for example, when using a touch screen) clickSecondary() can handle this differently from a true secondary click, if desired --- src/hci/build.cpp | 4 ++-- src/hci/commander.cpp | 2 +- src/hci/groups.cpp | 2 +- src/hci/manufacture.cpp | 4 ++-- src/hci/objects_stats.cpp | 12 +++++++++++- src/hci/objects_stats.h | 5 +++-- src/hci/research.cpp | 2 +- 7 files changed, 21 insertions(+), 10 deletions(-) diff --git a/src/hci/build.cpp b/src/hci/build.cpp index 8d60d265095..2cbf86bb244 100644 --- a/src/hci/build.cpp +++ b/src/hci/build.cpp @@ -403,7 +403,7 @@ class BuildStatsButton: public StatsButton BaseStatsController::scheduleDisplayStatsForm(controller); } - void clickSecondary() override + void clickSecondary(bool synthesizedFromHold) override { auto droid = controller->getObjectAt(objectIndex); ASSERT_NOT_NULLPTR_OR_RETURN(, droid); @@ -495,7 +495,7 @@ class BuildOptionButton: public StatsFormButton }); } - void clickSecondary() override + void clickSecondary(bool synthesizedFromHold) override { auto clickedStats = controller->getStatsAt(buildOptionIndex); ASSERT_NOT_NULLPTR_OR_RETURN(, clickedStats); diff --git a/src/hci/commander.cpp b/src/hci/commander.cpp index 0e68a781621..b2eda0d6763 100644 --- a/src/hci/commander.cpp +++ b/src/hci/commander.cpp @@ -294,7 +294,7 @@ class CommanderStatsButton: public StatsButton controller->displayOrderForm(); } - void clickSecondary() override + void clickSecondary(bool synthesizedFromHold) override { auto droid = controller->getObjectAt(objectIndex); ASSERT_NOT_NULLPTR_OR_RETURN(, droid); diff --git a/src/hci/groups.cpp b/src/hci/groups.cpp index 2ee178b9c85..5a7e55a37c1 100644 --- a/src/hci/groups.cpp +++ b/src/hci/groups.cpp @@ -132,7 +132,7 @@ class GroupButton : public DynamicIntFancyButton controller->selectGroup(groupNumber); } - void clickSecondary() override + void clickSecondary(bool synthesizedFromHold) override { controller->assignSelectedDroidsToGroup(groupNumber); } diff --git a/src/hci/manufacture.cpp b/src/hci/manufacture.cpp index def4627400c..90a7d6aa88f 100644 --- a/src/hci/manufacture.cpp +++ b/src/hci/manufacture.cpp @@ -455,7 +455,7 @@ class ManufactureStatsButton: public StatsButton BaseStatsController::scheduleDisplayStatsForm(controller); } - void clickSecondary() override + void clickSecondary(bool synthesizedFromHold) override { auto factory = controller->getObjectAt(objectIndex); ASSERT_NOT_NULLPTR_OR_RETURN(, factory); @@ -559,7 +559,7 @@ class ManufactureOptionButton: public StatsFormButton adjustFactoryProduction(true); } - void clickSecondary() override + void clickSecondary(bool synthesizedFromHold) override { adjustFactoryProduction(false); } diff --git a/src/hci/objects_stats.cpp b/src/hci/objects_stats.cpp index 1842dfca995..8292bcdef72 100644 --- a/src/hci/objects_stats.cpp +++ b/src/hci/objects_stats.cpp @@ -156,10 +156,20 @@ void DynamicIntFancyButton::released(W_CONTEXT *context, WIDGET_KEY mouseButton) } else if (mouseButton == WKEY_SECONDARY) { - clickSecondary(); + clickSecondary(false); } } +bool DynamicIntFancyButton::clickHeld(W_CONTEXT *psContext, WIDGET_KEY key) +{ + if (key == WKEY_PRIMARY) + { + clickSecondary(true); + return true; + } + return false; +} + void StatsButton::addProgressBar() { auto init = W_BARINIT(); diff --git a/src/hci/objects_stats.h b/src/hci/objects_stats.h index 16c391f5dcc..71dac6aa829 100644 --- a/src/hci/objects_stats.h +++ b/src/hci/objects_stats.h @@ -118,8 +118,9 @@ class DynamicIntFancyButton: public IntFancyButton virtual void updateLayout(); void updateHighlight(); virtual void clickPrimary() {} - virtual void clickSecondary() {} + virtual void clickSecondary(bool synthesizedFromHold) {} void released(W_CONTEXT *context, WIDGET_KEY mouseButton = WKEY_PRIMARY) override; + bool clickHeld(W_CONTEXT *psContext, WIDGET_KEY key) override; public: DynamicIntFancyButton(); }; @@ -156,7 +157,7 @@ class ObjectButton : public DynamicIntFancyButton virtual BaseObjectsController &getController() const = 0; virtual void jump(); - void clickSecondary() override + void clickSecondary(bool synthesizedFromHold) override { jump(); } diff --git a/src/hci/research.cpp b/src/hci/research.cpp index bbeafebeee5..9890b346334 100644 --- a/src/hci/research.cpp +++ b/src/hci/research.cpp @@ -470,7 +470,7 @@ class ResearchStatsButton: public StatsButton controller->refresh(); } - void clickSecondary() override + void clickSecondary(bool synthesizedFromHold) override { auto facility = controller->getObjectAt(objectIndex); ASSERT_NOT_NULLPTR_OR_RETURN(, facility);