diff --git a/Mods/vcmi/config/vcmi/english.json b/Mods/vcmi/config/vcmi/english.json index d2d264574..34e9e36b6 100644 --- a/Mods/vcmi/config/vcmi/english.json +++ b/Mods/vcmi/config/vcmi/english.json @@ -87,6 +87,8 @@ "vcmi.adventureOptions.showGrid.help" : "{Show Grid}\n\nShow the grid overlay, highlighting the borders between adventure map tiles.", "vcmi.adventureOptions.borderScroll.hover" : "Border Scrolling", "vcmi.adventureOptions.borderScroll.help" : "{Border Scrolling}\n\nScroll adventure map when cursor is adjacent to window edge. Can be disabled by holding down CTRL key.", + "vcmi.adventureOptions.leftButtonDrag.hover" : "Left Click Drag Map", + "vcmi.adventureOptions.leftButtonDrag.help" : "{Left Click Drag Map}\n\nWhen enabled, moving mouse with left button pressed will drag adventure map view", "vcmi.adventureOptions.mapScrollSpeed1.hover": "", "vcmi.adventureOptions.mapScrollSpeed5.hover": "", "vcmi.adventureOptions.mapScrollSpeed6.hover": "", diff --git a/Mods/vcmi/config/vcmi/ukrainian.json b/Mods/vcmi/config/vcmi/ukrainian.json index 01a0bb956..31915f101 100644 --- a/Mods/vcmi/config/vcmi/ukrainian.json +++ b/Mods/vcmi/config/vcmi/ukrainian.json @@ -68,6 +68,8 @@ "vcmi.adventureOptions.showGrid.help" : "{Показувати сітку}\n\n Відображає сітку, що показує межі між клітинками на мапі пригод.", "vcmi.adventureOptions.borderScroll.hover" : "Прокрутка по краю", "vcmi.adventureOptions.borderScroll.help" : "{{Прокрутка по краю}\n\nПрокручувати мапу пригод, коли курсор знаходиться біля краю вікна. Цю функцію можна вимкнути, утримуючи клавішу CTRL.", + "vcmi.adventureOptions.leftButtonDrag.hover" : "Переміщення мапи лівою кнопкою", + "vcmi.adventureOptions.leftButtonDrag.help" : "{Переміщення мапи лівою кнопкою}\n\nЯкщо увімкнено, переміщення миші з натиснутою лівою кнопкою буде перетягувати мапу пригод", "vcmi.adventureOptions.mapScrollSpeed1.hover": "", "vcmi.adventureOptions.mapScrollSpeed5.hover": "", "vcmi.adventureOptions.mapScrollSpeed6.hover": "", diff --git a/client/mapView/MapViewActions.cpp b/client/mapView/MapViewActions.cpp index bb35f0fc9..b1cd6c240 100644 --- a/client/mapView/MapViewActions.cpp +++ b/client/mapView/MapViewActions.cpp @@ -29,11 +29,12 @@ MapViewActions::MapViewActions(MapView & owner, const std::shared_ptrgetPixelsVisibleDimensions().x; pos.h = model->getPixelsVisibleDimensions().y; - addUsedEvents(LCLICK | SHOW_POPUP | GESTURE | HOVER | MOVE | WHEEL); + addUsedEvents(LCLICK | SHOW_POPUP | DRAG | GESTURE | HOVER | MOVE | WHEEL); } void MapViewActions::setContext(const std::shared_ptr & context) @@ -43,10 +44,32 @@ void MapViewActions::setContext(const std::shared_ptr & con void MapViewActions::clickPressed(const Point & cursorPosition) { - int3 tile = model->getTileAtPoint(cursorPosition - pos.topLeft()); + if (!settings["adventure"]["leftButtonDrag"].Bool()) + { + int3 tile = model->getTileAtPoint(cursorPosition - pos.topLeft()); - if(context->isInMap(tile)) - adventureInt->onTileLeftClicked(tile); + if(context->isInMap(tile)) + adventureInt->onTileLeftClicked(tile); + } +} + +void MapViewActions::clickReleased(const Point & cursorPosition) +{ + if (!dragActive && settings["adventure"]["leftButtonDrag"].Bool()) + { + int3 tile = model->getTileAtPoint(cursorPosition - pos.topLeft()); + + if(context->isInMap(tile)) + adventureInt->onTileLeftClicked(tile); + } + dragActive = false; + dragDistance = Point(0,0); +} + +void MapViewActions::clickCancel(const Point & cursorPosition) +{ + dragActive = false; + dragDistance = Point(0,0); } void MapViewActions::showPopupWindow(const Point & cursorPosition) @@ -67,6 +90,17 @@ void MapViewActions::wheelScrolled(int distance) adventureInt->hotkeyZoom(distance * 4); } +void MapViewActions::mouseDragged(const Point & cursorPosition, const Point & lastUpdateDistance) +{ + dragDistance += lastUpdateDistance; + + if (dragDistance.length() > 16) + dragActive = true; + + if (dragActive && settings["adventure"]["leftButtonDrag"].Bool()) + owner.onMapSwiped(lastUpdateDistance); +} + void MapViewActions::gesturePanning(const Point & initialPosition, const Point & currentPosition, const Point & lastUpdateDistance) { owner.onMapSwiped(lastUpdateDistance); diff --git a/client/mapView/MapViewActions.h b/client/mapView/MapViewActions.h index 9f6ca11d2..de6158f43 100644 --- a/client/mapView/MapViewActions.h +++ b/client/mapView/MapViewActions.h @@ -22,7 +22,9 @@ class MapViewActions : public CIntObject std::shared_ptr model; std::shared_ptr context; + Point dragDistance; double pinchZoomFactor; + bool dragActive; void handleHover(const Point & cursorPosition); @@ -32,11 +34,14 @@ public: void setContext(const std::shared_ptr & context); void clickPressed(const Point & cursorPosition) override; + void clickReleased(const Point & cursorPosition) override; + void clickCancel(const Point & cursorPosition) override; void showPopupWindow(const Point & cursorPosition) override; void gesturePanning(const Point & initialPosition, const Point & currentPosition, const Point & lastUpdateDistance) override; void gesturePinch(const Point & centerPosition, double lastUpdateFactor) override; void hover(bool on) override; void gesture(bool on, const Point & initialPosition, const Point & finalPosition) override; void mouseMoved(const Point & cursorPosition, const Point & lastUpdateDistance) override; + void mouseDragged(const Point & cursorPosition, const Point & lastUpdateDistance) override; void wheelScrolled(int distance) override; }; diff --git a/client/windows/settings/AdventureOptionsTab.cpp b/client/windows/settings/AdventureOptionsTab.cpp index c22d16e7a..6d212ed29 100644 --- a/client/windows/settings/AdventureOptionsTab.cpp +++ b/client/windows/settings/AdventureOptionsTab.cpp @@ -36,6 +36,14 @@ AdventureOptionsTab::AdventureOptionsTab() OBJ_CONSTRUCTION_CAPTURING_ALL_NO_DISPOSE; setRedrawParent(true); +#ifdef VCMI_MOBILE + addConditional("mobile", true); + addConditional("desktop", false); +#else + addConditional("mobile", false); + addConditional("desktop", true); +#endif + const JsonNode config(ResourceID("config/widgets/settings/adventureOptionsTab.json")); addCallback("playerHeroSpeedChanged", [this](int value) { @@ -110,6 +118,10 @@ AdventureOptionsTab::AdventureOptionsTab() { return setBoolSetting("adventure", "borderScroll", value); }); + addCallback("leftButtonDragChanged", [](bool value) + { + return setBoolSetting("adventure", "leftButtonDrag", value); + }); build(config); std::shared_ptr playerHeroSpeedToggle = widget("heroMovementSpeedPicker"); @@ -141,4 +153,8 @@ AdventureOptionsTab::AdventureOptionsTab() std::shared_ptr borderScrollCheckbox = widget("borderScrollCheckbox"); borderScrollCheckbox->setSelected(settings["adventure"]["borderScroll"].Bool()); + + std::shared_ptr leftButtonDragCheckbox = widget("leftButtonDragCheckbox"); + if (leftButtonDragCheckbox) + leftButtonDragCheckbox->setSelected(settings["adventure"]["leftButtonDrag"].Bool()); } diff --git a/config/schemas/settings.json b/config/schemas/settings.json index b3dbd1651..0f0d253f2 100644 --- a/config/schemas/settings.json +++ b/config/schemas/settings.json @@ -191,7 +191,7 @@ "type" : "object", "additionalProperties" : false, "default" : {}, - "required" : [ "heroMoveTime", "enemyMoveTime", "scrollSpeedPixels", "heroReminder", "quickCombat", "objectAnimation", "terrainAnimation", "alwaysSkipCombat", "borderScroll" ], + "required" : [ "heroMoveTime", "enemyMoveTime", "scrollSpeedPixels", "heroReminder", "quickCombat", "objectAnimation", "terrainAnimation", "alwaysSkipCombat", "borderScroll", "leftButtonDrag" ], "properties" : { "heroMoveTime" : { "type" : "number", @@ -231,6 +231,10 @@ "defaultIOS" : false, "defaultAndroid" : false, "default" : true + }, + "leftButtonDrag" : { + "type" : "boolean", + "default" : false } } }, diff --git a/config/widgets/settings/adventureOptionsTab.json b/config/widgets/settings/adventureOptionsTab.json index fdce6d5bc..358d9aeef 100644 --- a/config/widgets/settings/adventureOptionsTab.json +++ b/config/widgets/settings/adventureOptionsTab.json @@ -340,6 +340,10 @@ }, { "text": "vcmi.adventureOptions.borderScroll.hover" + }, + { + "text": "vcmi.adventureOptions.leftButtonDrag.hover", + "created" : "desktop" } ] }, @@ -373,6 +377,12 @@ "name": "borderScrollCheckbox", "help": "vcmi.adventureOptions.borderScroll", "callback": "borderScrollChanged" + }, + { + "name": "leftButtonDragCheckbox", + "help": "vcmi.adventureOptions.leftButtonDrag", + "callback": "leftButtonDragChanged", + "created" : "desktop" } ] }