Веб-сайт самохостера Lotigara

summaryrefslogtreecommitdiff
path: root/source/windowing
diff options
context:
space:
mode:
authorKae <80987908+Novaenia@users.noreply.github.com>2024-03-27 16:00:13 +1100
committerKae <80987908+Novaenia@users.noreply.github.com>2024-03-27 16:00:13 +1100
commit888cde79ef8f6d1b008e86207b41e1fd686c7636 (patch)
tree576e23c94d227f76bec06cd0357809c703dc4c53 /source/windowing
parentc484fab32dcac655164f082805d1d55d1d058f2f (diff)
feat: middle click objects in the inventory to open their interface
makes carrying around shop objects easier might need to restrict the allowed interaction types more, as some may break due to the source entity being the player
Diffstat (limited to 'source/windowing')
-rw-r--r--source/windowing/StarItemGridWidget.cpp10
-rw-r--r--source/windowing/StarItemGridWidget.hpp2
-rw-r--r--source/windowing/StarItemSlotWidget.cpp10
-rw-r--r--source/windowing/StarItemSlotWidget.hpp2
-rw-r--r--source/windowing/StarWidgetParsing.cpp59
5 files changed, 54 insertions, 29 deletions
diff --git a/source/windowing/StarItemGridWidget.cpp b/source/windowing/StarItemGridWidget.cpp
index 3302ca6..be1cc42 100644
--- a/source/windowing/StarItemGridWidget.cpp
+++ b/source/windowing/StarItemGridWidget.cpp
@@ -106,7 +106,9 @@ Vec2I ItemGridWidget::positionOfSlot(size_t slotNumber) {
bool ItemGridWidget::sendEvent(InputEvent const& event) {
if (m_visible) {
if (auto mouseButton = event.ptr<MouseButtonDownEvent>()) {
- if (mouseButton->mouseButton == MouseButton::Left || (m_rightClickCallback && mouseButton->mouseButton == MouseButton::Right)) {
+ if (mouseButton->mouseButton == MouseButton::Left
+ || (m_rightClickCallback && mouseButton->mouseButton == MouseButton::Right)
+ || (m_middleClickCallback && mouseButton->mouseButton == MouseButton::Middle)) {
Vec2I mousePos = *context()->mousePosition(event);
for (size_t i = 0; i < (m_bag->size() - m_bagOffset) && i < unsigned(m_dimensions[0] * m_dimensions[1]); ++i) {
Vec2I loc = locOfItemSlot(i);
@@ -116,6 +118,8 @@ bool ItemGridWidget::sendEvent(InputEvent const& event) {
m_selectedIndex = i;
if (mouseButton->mouseButton == MouseButton::Right)
m_rightClickCallback(this);
+ else if (mouseButton->mouseButton == MouseButton::Middle)
+ m_middleClickCallback(this);
else
m_callback(this);
return true;
@@ -145,6 +149,10 @@ void ItemGridWidget::setRightClickCallback(WidgetCallbackFunc callback) {
m_rightClickCallback = callback;
}
+void ItemGridWidget::setMiddleClickCallback(WidgetCallbackFunc callback) {
+ m_middleClickCallback = callback;
+}
+
void ItemGridWidget::setItemBag(ItemBagConstPtr bag) {
m_bag = bag;
diff --git a/source/windowing/StarItemGridWidget.hpp b/source/windowing/StarItemGridWidget.hpp
index 79c0469..11a78b3 100644
--- a/source/windowing/StarItemGridWidget.hpp
+++ b/source/windowing/StarItemGridWidget.hpp
@@ -41,6 +41,7 @@ public:
bool sendEvent(InputEvent const& event) override;
void setCallback(WidgetCallbackFunc callback);
void setRightClickCallback(WidgetCallbackFunc callback);
+ void setMiddleClickCallback(WidgetCallbackFunc callback);
void setItemBag(ItemBagConstPtr bag);
void setProgress(float progress);
@@ -93,6 +94,7 @@ private:
unsigned m_selectedIndex;
WidgetCallbackFunc m_callback;
WidgetCallbackFunc m_rightClickCallback;
+ WidgetCallbackFunc m_middleClickCallback;
};
}
diff --git a/source/windowing/StarItemSlotWidget.cpp b/source/windowing/StarItemSlotWidget.cpp
index 2958957..93d95d3 100644
--- a/source/windowing/StarItemSlotWidget.cpp
+++ b/source/windowing/StarItemSlotWidget.cpp
@@ -67,12 +67,16 @@ void ItemSlotWidget::update(float dt) {
bool ItemSlotWidget::sendEvent(InputEvent const& event) {
if (m_visible) {
if (auto mouseButton = event.ptr<MouseButtonDownEvent>()) {
- if (mouseButton->mouseButton == MouseButton::Left || (m_rightClickCallback && mouseButton->mouseButton == MouseButton::Right)) {
+ if (mouseButton->mouseButton == MouseButton::Left
+ || (m_rightClickCallback && mouseButton->mouseButton == MouseButton::Right)
+ || (m_middleClickCallback && mouseButton->mouseButton == MouseButton::Middle)) {
Vec2I mousePos = *context()->mousePosition(event);
RectI itemArea = m_itemDraggableArea.translated(screenPosition());
if (itemArea.contains(mousePos)) {
if (mouseButton->mouseButton == MouseButton::Right)
m_rightClickCallback(this);
+ else if (mouseButton->mouseButton == MouseButton::Middle)
+ m_middleClickCallback(this);
else
m_callback(this);
return true;
@@ -92,6 +96,10 @@ void ItemSlotWidget::setRightClickCallback(WidgetCallbackFunc callback) {
m_rightClickCallback = callback;
}
+void ItemSlotWidget::setMiddleClickCallback(WidgetCallbackFunc callback) {
+ m_middleClickCallback = callback;
+}
+
void ItemSlotWidget::setItem(ItemPtr const& item) {
m_item = item;
}
diff --git a/source/windowing/StarItemSlotWidget.hpp b/source/windowing/StarItemSlotWidget.hpp
index 9e8772d..aaa4c9c 100644
--- a/source/windowing/StarItemSlotWidget.hpp
+++ b/source/windowing/StarItemSlotWidget.hpp
@@ -19,6 +19,7 @@ public:
bool sendEvent(InputEvent const& event) override;
void setCallback(WidgetCallbackFunc callback);
void setRightClickCallback(WidgetCallbackFunc callback);
+ void setMiddleClickCallback(WidgetCallbackFunc callback);
void setItem(ItemPtr const& item);
ItemPtr item() const;
void setProgress(float progress);
@@ -61,6 +62,7 @@ private:
WidgetCallbackFunc m_callback;
WidgetCallbackFunc m_rightClickCallback;
+ WidgetCallbackFunc m_middleClickCallback;
float m_progress;
ProgressWidgetPtr m_durabilityBar;
diff --git a/source/windowing/StarWidgetParsing.cpp b/source/windowing/StarWidgetParsing.cpp
index b45294b..7a9ea4a 100644
--- a/source/windowing/StarWidgetParsing.cpp
+++ b/source/windowing/StarWidgetParsing.cpp
@@ -471,23 +471,27 @@ WidgetConstructResult WidgetParser::itemSlotHandler(String const& name, Json con
String backingImage = config.getString("backingImage", "");
String callback = config.getString("callback", name);
- String rightClickCallback;
- if (callback.equals("null"))
- rightClickCallback = callback;
- else
- rightClickCallback = callback + ".right";
+ String rightClickCallback = callback.equals("null") ? callback : callback + ".right";
rightClickCallback = config.getString("rightClickCallback", rightClickCallback);
+ String middleClickCallback = callback.equals("null") ? callback : callback + ".middle";
+ middleClickCallback = config.getString("middleClickCallback", middleClickCallback);
+
auto itemSlot = make_shared<ItemSlotWidget>(ItemPtr(), backingImage);
- if (!m_callbacks.contains(callback))
- throw WidgetParserException::format("Failed to find itemSlot callback named: '{}'", callback);
- itemSlot->setCallback(m_callbacks.get(callback));
+ if (auto leftClickCallback = m_callbacks.ptr(callback))
+ itemSlot->setCallback(*leftClickCallback);
+ else
+ throw WidgetParserException::format("Failed to find ItemSlot callback named: '{}'", callback);
- if (!m_callbacks.contains(rightClickCallback))
- throw WidgetParserException::format("Failed to find itemslot rightClickCallback named: '{}'", rightClickCallback);
+ if (auto callback = m_callbacks.ptr(rightClickCallback))
+ itemSlot->setRightClickCallback(*callback);
+ else
+ throw WidgetParserException::format("Failed to find ItemSlot rightClickCallback named: '{}'", rightClickCallback);
+
+ if (auto callback = m_callbacks.ptr(middleClickCallback))
+ itemSlot->setMiddleClickCallback(*callback);
- itemSlot->setRightClickCallback(m_callbacks.get(rightClickCallback));
itemSlot->setBackingImageAffinity(config.getBool("showBackingImageWhenFull", false), config.getBool("showBackingImageWhenEmpty", true));
itemSlot->showDurability(config.getBool("showDurability", false));
itemSlot->showCount(config.getBool("showCount", true));
@@ -515,33 +519,34 @@ WidgetConstructResult WidgetParser::itemGridHandler(String const& name, Json con
} catch (MapException const& e) {
throw WidgetParserException::format("Malformed gui json, missing a required value in the map. {}", outputException(e, false));
}
-
- String backingImage = config.getString("backingImage", "");
+
String callback = config.getString("callback", name);
- String rightClickCallback;
- if (callback.equals("null"))
- rightClickCallback = callback;
- else
- rightClickCallback = callback + ".right";
+ String rightClickCallback = callback.equals("null") ? callback : callback + ".right";
rightClickCallback = config.getString("rightClickCallback", rightClickCallback);
+ String middleClickCallback = callback.equals("null") ? callback : callback + ".middle";
+ middleClickCallback = config.getString("middleClickCallback", middleClickCallback);
unsigned slotOffset = config.getInt("slotOffset", 0);
+ String backingImage = config.getString("backingImage", "");
auto itemGrid = make_shared<ItemGridWidget>(ItemBagConstPtr(), dimensions, rowSpacing, columnSpacing, backingImage, slotOffset);
- if (!m_callbacks.contains(callback))
- throw WidgetParserException::format("Failed to find itemgrid callback named: '{}'", callback);
-
- itemGrid->setCallback(m_callbacks.get(callback));
-
itemGrid->setBackingImageAffinity(
- config.getBool("showBackingImageWhenFull", false), config.getBool("showBackingImageWhenEmpty", true));
+ config.getBool("showBackingImageWhenFull", false), config.getBool("showBackingImageWhenEmpty", true));
itemGrid->showDurability(config.getBool("showDurability", false));
- if (!m_callbacks.contains(rightClickCallback))
- throw WidgetParserException::format("Failed to find itemgrid rightClickCallback named: '{}'", rightClickCallback);
+ if (auto leftClickCallback = m_callbacks.ptr(callback))
+ itemGrid->setCallback(*leftClickCallback);
+ else
+ throw WidgetParserException::format("Failed to find ItemGrid callback named: '{}'", callback);
+
+ if (auto callback = m_callbacks.ptr(rightClickCallback))
+ itemGrid->setRightClickCallback(*callback);
+ else
+ throw WidgetParserException::format("Failed to find ItemGrid rightClickCallback named: '{}'", rightClickCallback);
- itemGrid->setRightClickCallback(m_callbacks.get(rightClickCallback));
+ if (auto callback = m_callbacks.ptr(middleClickCallback))
+ itemGrid->setMiddleClickCallback(*callback);
common(itemGrid, config);