Skip to content

Commit 217c29e

Browse files
authored
Merge pull request #1553 from Flamefire/invert_mouse
Add option to invert the mouse movement when moving the map
2 parents fe98150 + cf56fd9 commit 217c29e

7 files changed

Lines changed: 143 additions & 100 deletions

File tree

libs/s25main/Settings.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ void Settings::LoadDefaults()
139139
// interface
140140
// {
141141
interface.autosave_interval = 0;
142-
interface.revert_mouse = false;
142+
interface.invertMouse = false;
143143
interface.enableWindowPinning = false;
144144
interface.windowSnapDistance = 8;
145145
// }
@@ -299,7 +299,7 @@ void Settings::Load()
299299
// interface
300300
// {
301301
interface.autosave_interval = iniInterface->getIntValue("autosave_interval");
302-
interface.revert_mouse = iniInterface->getBoolValue("revert_mouse");
302+
interface.invertMouse = iniInterface->getValue("invert_mouse", false);
303303
interface.enableWindowPinning = iniInterface->getValue("enable_window_pinning", false);
304304
interface.windowSnapDistance = iniInterface->getValue("window_snap_distance", 8);
305305
// }
@@ -463,7 +463,7 @@ void Settings::Save()
463463
// interface
464464
// {
465465
iniInterface->setValue("autosave_interval", interface.autosave_interval);
466-
iniInterface->setValue("revert_mouse", interface.revert_mouse);
466+
iniInterface->setValue("invert_mouse", interface.invertMouse);
467467
iniInterface->setValue("enable_window_pinning", interface.enableWindowPinning);
468468
iniInterface->setValue("window_snap_distance", interface.windowSnapDistance);
469469
// }

libs/s25main/Settings.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ class Settings : public Singleton<Settings, SingletonPolicies::WithLongevity>
105105
struct
106106
{
107107
unsigned autosave_interval;
108-
bool revert_mouse;
108+
bool invertMouse;
109109
bool enableWindowPinning;
110110
unsigned windowSnapDistance;
111111
} interface;

libs/s25main/desktops/dskGameInterface.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -691,7 +691,7 @@ bool dskGameInterface::Msg_MouseMove(const MouseCoords& mc)
691691

692692
int acceleration = SETTINGS.global.smartCursor ? 2 : 3;
693693

694-
if(SETTINGS.interface.revert_mouse)
694+
if(SETTINGS.interface.invertMouse)
695695
acceleration = -acceleration;
696696

697697
gwv.MoveBy((mc.GetPos() - startScrollPt) * acceleration);

libs/s25main/desktops/dskOptions.cpp

Lines changed: 24 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,8 @@ enum
6565
ID_grpDebugData,
6666
ID_txtUPNP,
6767
ID_grpUPNP,
68+
ID_txtInvertScroll,
69+
ID_grpInvertScroll,
6870
ID_txtSmartCursor,
6971
ID_grpSmartCursor,
7072
ID_txtGFInfo,
@@ -199,8 +201,8 @@ dskOptions::dskOptions() : Desktop(LOADER.GetImageN("setup013", 0))
199201
groupAllgemein->AddText(ID_txtIpv6, curPos, _("Use IPv6:"), COLOR_YELLOW, FontStyle{}, NormalFont);
200202

201203
ctrlOptionGroup* ipv6 = groupAllgemein->AddOptionGroup(ID_grpIpv6, GroupSelectType::Check);
202-
ipv6->AddTextButton(ID_btOn, curPos + ctrlOffset2, ctrlSize, TextureColor::Grey, _("IPv6"), NormalFont);
203-
ipv6->AddTextButton(ID_btOff, curPos + ctrlOffset, ctrlSize, TextureColor::Grey, _("IPv4"), NormalFont);
204+
ipv6->AddTextButton(ID_btOn, curPos + ctrlOffset, ctrlSize, TextureColor::Grey, _("IPv6"), NormalFont);
205+
ipv6->AddTextButton(ID_btOff, curPos + ctrlOffset2, ctrlSize, TextureColor::Grey, _("IPv4"), NormalFont);
204206
ipv6->SetSelection(SETTINGS.server.ipv6);
205207
// ipv6-feld ggf (de-)aktivieren
206208
ipv6->GetCtrl<ctrlButton>(1)->SetEnabled(SETTINGS.proxy.type != ProxyType::Socks5); //-V807
@@ -219,8 +221,8 @@ dskOptions::dskOptions() : Desktop(LOADER.GetImageN("setup013", 0))
219221

220222
groupAllgemein->AddText(ID_txtUPNP, curPos, _("Use UPnP"), COLOR_YELLOW, FontStyle{}, NormalFont);
221223
ctrlOptionGroup* upnp = groupAllgemein->AddOptionGroup(ID_grpUPNP, GroupSelectType::Check);
222-
upnp->AddTextButton(ID_btOff, curPos + ctrlOffset, ctrlSize, TextureColor::Grey, _("Off"), NormalFont);
223-
upnp->AddTextButton(ID_btOn, curPos + ctrlOffset2, ctrlSize, TextureColor::Grey, _("On"), NormalFont);
224+
upnp->AddTextButton(ID_btOn, curPos + ctrlOffset, ctrlSize, TextureColor::Grey, _("On"), NormalFont);
225+
upnp->AddTextButton(ID_btOff, curPos + ctrlOffset2, ctrlSize, TextureColor::Grey, _("Off"), NormalFont);
224226
upnp->SetSelection(SETTINGS.global.use_upnp);
225227
curPos.y += 30;
226228

@@ -241,21 +243,30 @@ dskOptions::dskOptions() : Desktop(LOADER.GetImageN("setup013", 0))
241243
}
242244
curPos.y += 50;
243245

246+
groupAllgemein->AddText(ID_txtInvertScroll, curPos, _("Invert Mouse Pan:"), COLOR_YELLOW, FontStyle{}, NormalFont);
247+
ctrlOptionGroup* invertScroll = groupAllgemein->AddOptionGroup(ID_grpInvertScroll, GroupSelectType::Check);
248+
invertScroll->AddTextButton(ID_btOn, curPos + ctrlOffset, ctrlSize, TextureColor::Grey, _("On"), NormalFont,
249+
_("Map moves in the opposite direction the mouse is moved when scrolling/panning."));
250+
invertScroll->AddTextButton(ID_btOff, curPos + ctrlOffset2, ctrlSize, TextureColor::Grey, _("Off"), NormalFont,
251+
_("Map moves in the same direction the mouse is moved when scrolling/panning."));
252+
invertScroll->SetSelection(SETTINGS.interface.invertMouse);
253+
curPos.y += 30;
254+
244255
groupAllgemein->AddText(ID_txtSmartCursor, curPos, _("Smart Cursor"), COLOR_YELLOW, FontStyle{}, NormalFont);
245256
ctrlOptionGroup* smartCursor = groupAllgemein->AddOptionGroup(ID_grpSmartCursor, GroupSelectType::Check);
257+
smartCursor->AddTextButton(ID_btOn, curPos + ctrlOffset, ctrlSize, TextureColor::Grey, _("On"), NormalFont,
258+
_("Place cursor on default button for new dialogs / action windows (default)"));
246259
smartCursor->AddTextButton(
247-
ID_btOff, curPos + ctrlOffset, ctrlSize, TextureColor::Grey, _("Off"), NormalFont,
260+
ID_btOff, curPos + ctrlOffset2, ctrlSize, TextureColor::Grey, _("Off"), NormalFont,
248261
_("Don't move cursor automatically\nUseful e.g. for split-screen / dual-mice multiplayer (see wiki)"));
249-
smartCursor->AddTextButton(ID_btOn, curPos + ctrlOffset2, ctrlSize, TextureColor::Grey, _("On"), NormalFont,
250-
_("Place cursor on default button for new dialogs / action windows (default)"));
251262
smartCursor->SetSelection(SETTINGS.global.smartCursor);
252263
curPos.y += 50;
253264

254265
groupAllgemein->AddText(ID_txtDebugData, curPos, _("Submit debug data:"), COLOR_YELLOW, FontStyle{}, NormalFont);
255266
optiongroup = groupAllgemein->AddOptionGroup(ID_grpDebugData, GroupSelectType::Check);
256-
optiongroup->AddTextButton(ID_btSubmitDebugOn, curPos + ctrlOffset2, ctrlSize, TextureColor::Grey, _("On"),
267+
optiongroup->AddTextButton(ID_btSubmitDebugOn, curPos + ctrlOffset, ctrlSize, TextureColor::Grey, _("On"),
257268
NormalFont);
258-
optiongroup->AddTextButton(ID_btSubmitDebugAsk, curPos + ctrlOffset, ctrlSize, TextureColor::Grey, _("Ask always"),
269+
optiongroup->AddTextButton(ID_btSubmitDebugAsk, curPos + ctrlOffset2, ctrlSize, TextureColor::Grey, _("Ask always"),
259270
NormalFont);
260271

261272
optiongroup->SetSelection((SETTINGS.global.submit_debug_data == 1) ? ID_btSubmitDebugOn :
@@ -264,8 +275,8 @@ dskOptions::dskOptions() : Desktop(LOADER.GetImageN("setup013", 0))
264275

265276
groupAllgemein->AddText(ID_txtGFInfo, curPos, _("Show GameFrame Info:"), COLOR_YELLOW, FontStyle{}, NormalFont);
266277
optiongroup = groupAllgemein->AddOptionGroup(ID_grpGFInfo, GroupSelectType::Check);
267-
optiongroup->AddTextButton(ID_btOn, curPos + ctrlOffset2, ctrlSize, TextureColor::Grey, _("On"), NormalFont);
268-
optiongroup->AddTextButton(ID_btOff, curPos + ctrlOffset, ctrlSize, TextureColor::Grey, _("Off"), NormalFont);
278+
optiongroup->AddTextButton(ID_btOn, curPos + ctrlOffset, ctrlSize, TextureColor::Grey, _("On"), NormalFont);
279+
optiongroup->AddTextButton(ID_btOff, curPos + ctrlOffset2, ctrlSize, TextureColor::Grey, _("Off"), NormalFont);
269280

270281
optiongroup->SetSelection(SETTINGS.global.showGFInfo);
271282

@@ -278,9 +289,8 @@ dskOptions::dskOptions() : Desktop(LOADER.GetImageN("setup013", 0))
278289
// "Vollbild"
279290
groupGrafik->AddText(ID_txtFullscreen, curPos, _("Mode:"), COLOR_YELLOW, FontStyle{}, NormalFont);
280291
optiongroup = groupGrafik->AddOptionGroup(ID_grpFullscreen, GroupSelectType::Check);
281-
optiongroup->AddTextButton(ID_btOn, curPos + ctrlOffset2, ctrlSize, TextureColor::Grey, _("Fullscreen"),
282-
NormalFont);
283-
optiongroup->AddTextButton(ID_btOff, curPos + ctrlOffset, ctrlSize, TextureColor::Grey, _("Windowed"), NormalFont);
292+
optiongroup->AddTextButton(ID_btOn, curPos + ctrlOffset, ctrlSize, TextureColor::Grey, _("Fullscreen"), NormalFont);
293+
optiongroup->AddTextButton(ID_btOff, curPos + ctrlOffset2, ctrlSize, TextureColor::Grey, _("Windowed"), NormalFont);
284294
curPos.y += 50;
285295

286296
// "VSync"

libs/s25main/ingameWindows/iwObservate.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -231,7 +231,7 @@ bool iwObservate::Msg_MouseMove(const MouseCoords& mc)
231231
{
232232
int acceleration = SETTINGS.global.smartCursor ? 2 : 3;
233233

234-
if(SETTINGS.interface.revert_mouse)
234+
if(SETTINGS.interface.invertMouse)
235235
acceleration = -acceleration;
236236

237237
view->MoveBy((mc.GetPos() - scrollOrigin) * acceleration);

libs/s25main/ingameWindows/iwSettings.cpp

Lines changed: 37 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -15,52 +15,64 @@
1515
#include "gameData/const_gui_ids.h"
1616
#include "s25util/colors.h"
1717

18+
namespace {
19+
enum
20+
{
21+
ID_txtResolution,
22+
ID_txtFullScreen,
23+
ID_grpFullscreen,
24+
ID_cbResolution,
25+
ID_cbInvertMouse,
26+
ID_cbStatisticScale,
27+
};
28+
constexpr auto ID_btOn = 1;
29+
constexpr auto ID_btOff = 0;
30+
} // namespace
31+
1832
iwSettings::iwSettings()
1933
: IngameWindow(CGI_SETTINGS, IngameWindow::posLastOrCenter, Extent(370, 172), _("Settings"),
2034
LOADER.GetImageN("resource", 41))
2135
{
22-
AddText(46, DrawPoint(15, 40), _("Fullscreen resolution:"), COLOR_YELLOW, FontStyle{}, NormalFont);
23-
AddText(47, DrawPoint(15, 85), _("Mode:"), COLOR_YELLOW, FontStyle{}, NormalFont);
24-
AddCheckBox(4, DrawPoint(200, 124), Extent(150, 26), TextureColor::Grey, _("Statistics Scale"), NormalFont, false);
25-
GetCtrl<ctrlCheck>(4)->setChecked(SETTINGS.ingame.scale_statistics);
26-
27-
// "Vollbild"
28-
ctrlOptionGroup* optiongroup = AddOptionGroup(3, GroupSelectType::Check);
29-
optiongroup->AddTextButton(1, DrawPoint(200, 70), Extent(150, 22), TextureColor::Grey, _("Fullscreen"), NormalFont);
30-
optiongroup->AddTextButton(2, DrawPoint(200, 95), Extent(150, 22), TextureColor::Grey, _("Windowed"), NormalFont);
36+
AddText(ID_txtResolution, DrawPoint(15, 40), _("Fullscreen resolution:"), COLOR_YELLOW, FontStyle{}, NormalFont);
37+
auto* cbResolution =
38+
AddComboBox(ID_cbResolution, DrawPoint(200, 35), Extent(150, 22), TextureColor::Grey, NormalFont, 110);
3139

32-
// "Vollbild" setzen
33-
optiongroup = GetCtrl<ctrlOptionGroup>(3);
34-
optiongroup->SetSelection((SETTINGS.video.fullscreen ? 1 : 2)); //-V807
3540
VIDEODRIVER.ListVideoModes(video_modes);
36-
37-
// "Auflösung"
38-
AddComboBox(0, DrawPoint(200, 35), Extent(150, 22), TextureColor::Grey, NormalFont, 110);
39-
40-
// Und zu der Combobox hinzufügen
4141
for(unsigned i = 0; i < video_modes.size(); ++i)
4242
{
4343
// >=800x600, alles andere macht keinen Sinn
4444
if(video_modes[i].width >= 800 && video_modes[i].height >= 600)
4545
{
46-
GetCtrl<ctrlComboBox>(0)->AddString(helpers::format("%ux%u", video_modes[i].width, video_modes[i].height));
47-
48-
// Ist das die aktuelle Auflösung? Dann selektieren
46+
cbResolution->AddString(helpers::format("%ux%u", video_modes[i].width, video_modes[i].height));
4947
if(video_modes[i] == SETTINGS.video.fullscreenSize)
50-
GetCtrl<ctrlComboBox>(0)->SetSelection(i);
48+
cbResolution->SetSelection(i);
5149
} else
5250
{
5351
video_modes.erase(video_modes.begin() + i);
5452
--i;
5553
}
5654
}
55+
AddText(ID_txtFullScreen, DrawPoint(15, 85), _("Mode:"), COLOR_YELLOW, FontStyle{}, NormalFont);
56+
ctrlOptionGroup* optiongroup = AddOptionGroup(ID_grpFullscreen, GroupSelectType::Check);
57+
optiongroup->AddTextButton(ID_btOn, DrawPoint(200, 70), Extent(150, 22), TextureColor::Grey, _("Fullscreen"),
58+
NormalFont);
59+
optiongroup->AddTextButton(ID_btOff, DrawPoint(200, 95), Extent(150, 22), TextureColor::Grey, _("Windowed"),
60+
NormalFont);
61+
optiongroup->SetSelection(SETTINGS.video.fullscreen); //-V807
62+
63+
AddCheckBox(ID_cbInvertMouse, DrawPoint(15, 124), Extent(150, 26), TextureColor::Grey, _("Invert Mouse Pan"),
64+
NormalFont, false)
65+
->setChecked(SETTINGS.interface.invertMouse);
66+
AddCheckBox(ID_cbStatisticScale, DrawPoint(200, 124), Extent(150, 26), TextureColor::Grey, _("Statistics Scale"),
67+
NormalFont, false)
68+
->setChecked(SETTINGS.ingame.scale_statistics);
5769
}
5870

5971
iwSettings::~iwSettings()
6072
{
6173
try
6274
{
63-
auto* SizeCombo = GetCtrl<ctrlComboBox>(0);
75+
auto* SizeCombo = GetCtrl<ctrlComboBox>(ID_cbResolution);
6476
SETTINGS.video.fullscreenSize = video_modes[SizeCombo->GetSelection().get()];
6577

6678
if((SETTINGS.video.fullscreen && SETTINGS.video.fullscreenSize != VIDEODRIVER.GetWindowSize())
@@ -85,18 +97,15 @@ void iwSettings::Msg_OptionGroupChange(const unsigned ctrl_id, const unsigned se
8597
{
8698
switch(ctrl_id)
8799
{
88-
case 3: SETTINGS.video.fullscreen = (selection == 1); break;
100+
case ID_grpFullscreen: SETTINGS.video.fullscreen = selection == ID_btOn; break;
89101
}
90102
}
91103

92104
void iwSettings::Msg_CheckboxChange(const unsigned ctrl_id, const bool checked)
93105
{
94106
switch(ctrl_id)
95107
{
96-
case 4:
97-
{
98-
SETTINGS.ingame.scale_statistics = checked;
99-
break;
100-
}
108+
case ID_cbInvertMouse: SETTINGS.interface.invertMouse = checked; break;
109+
case ID_cbStatisticScale: SETTINGS.ingame.scale_statistics = checked; break;
101110
}
102111
}

tests/s25Main/integration/testDskGameInterface.cpp

Lines changed: 76 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
#include "GamePlayer.h"
66
#include "PointOutput.h"
7+
#include "Settings.h"
78
#include "WindowManager.h"
89
#include "buildings/nobBaseWarehouse.h"
910
#include "desktops/dskGameInterface.h"
@@ -66,63 +67,86 @@ void checkNotScrolling(const GameWorldView& view, Cursor cursor = Cursor::Hand)
6667
BOOST_FIXTURE_TEST_CASE(Scrolling, GameInterfaceFixture)
6768
{
6869
const int acceleration = 2;
70+
SETTINGS.interface.invertMouse = false;
71+
6972
Position startPos(10, 15);
7073
MouseCoords mouse(startPos, false, true);
7174
// Regular scrolling: Right down, 2 moves, right up
72-
WINDOWMANAGER.Msg_RightDown(mouse);
73-
BOOST_TEST_REQUIRE(WINDOWMANAGER.GetCursor() == Cursor::Scroll);
74-
DrawPoint pos = view->GetOffset();
75-
mouse.pos = startPos + Position(4, 3);
76-
WINDOWMANAGER.Msg_MouseMove(mouse);
77-
pos += acceleration * Position(4, 3);
78-
BOOST_TEST_REQUIRE(WINDOWMANAGER.GetCursor() == Cursor::Scroll);
79-
BOOST_TEST_REQUIRE(view->GetOffset() == pos);
80-
mouse.pos = startPos + Position(-6, 7);
81-
WINDOWMANAGER.Msg_MouseMove(mouse);
82-
pos += acceleration * Position(-6, 7);
83-
BOOST_TEST_REQUIRE(WINDOWMANAGER.GetCursor() == Cursor::Scroll);
84-
BOOST_TEST_REQUIRE(view->GetOffset() == pos);
85-
mouse.rdown = false;
86-
WINDOWMANAGER.Msg_RightUp(mouse);
87-
BOOST_TEST_REQUIRE(WINDOWMANAGER.GetCursor() == Cursor::Hand);
88-
BOOST_TEST_REQUIRE(view->GetOffset() == pos);
89-
checkNotScrolling(*view);
75+
{
76+
WINDOWMANAGER.Msg_RightDown(mouse);
77+
BOOST_TEST_REQUIRE(WINDOWMANAGER.GetCursor() == Cursor::Scroll);
78+
DrawPoint pos = view->GetOffset();
79+
mouse.pos = startPos + Position(4, 3);
80+
WINDOWMANAGER.Msg_MouseMove(mouse);
81+
pos += acceleration * Position(4, 3);
82+
BOOST_TEST_REQUIRE(WINDOWMANAGER.GetCursor() == Cursor::Scroll);
83+
BOOST_TEST_REQUIRE(view->GetOffset() == pos);
84+
mouse.pos = startPos + Position(-6, 7);
85+
WINDOWMANAGER.Msg_MouseMove(mouse);
86+
pos += acceleration * Position(-6, 7);
87+
BOOST_TEST_REQUIRE(WINDOWMANAGER.GetCursor() == Cursor::Scroll);
88+
BOOST_TEST_REQUIRE(view->GetOffset() == pos);
89+
mouse.rdown = false;
90+
WINDOWMANAGER.Msg_RightUp(mouse);
91+
BOOST_TEST_REQUIRE(WINDOWMANAGER.GetCursor() == Cursor::Hand);
92+
BOOST_TEST_REQUIRE(view->GetOffset() == pos);
93+
checkNotScrolling(*view);
94+
}
95+
96+
// Inverted scrolling
97+
{
98+
SETTINGS.interface.invertMouse = true;
99+
WINDOWMANAGER.Msg_RightDown(mouse);
100+
startPos = mouse.pos;
101+
BOOST_TEST_REQUIRE(WINDOWMANAGER.GetCursor() == Cursor::Scroll);
102+
const DrawPoint pos = view->GetOffset();
103+
mouse.pos = startPos + Position(4, 3);
104+
WINDOWMANAGER.Msg_MouseMove(mouse);
105+
BOOST_TEST_REQUIRE(WINDOWMANAGER.GetCursor() == Cursor::Scroll);
106+
BOOST_TEST_REQUIRE(view->GetOffset() == pos - acceleration * Position(4, 3));
107+
mouse.rdown = false;
108+
WINDOWMANAGER.Msg_RightUp(mouse);
109+
SETTINGS.interface.invertMouse = false;
110+
}
90111

91112
// Opening a window does not cancel scrolling
92-
mouse.rdown = true;
93-
WINDOWMANAGER.Msg_RightDown(mouse);
94-
startPos = mouse.pos;
95-
KeyEvent key;
96-
key.kt = KeyType::Char;
97-
key.c = 'm';
98-
key.ctrl = key.alt = key.shift = false;
99-
WINDOWMANAGER.Msg_KeyDown(key);
100-
BOOST_TEST_REQUIRE(WINDOWMANAGER.GetTopMostWindow());
101-
BOOST_TEST_REQUIRE(WINDOWMANAGER.GetCursor() == Cursor::Scroll);
102-
mouse.pos = startPos + Position(-6, 7);
103-
WINDOWMANAGER.Msg_MouseMove(mouse);
104-
pos += acceleration * Position(-6, 7);
105-
BOOST_TEST_REQUIRE(WINDOWMANAGER.GetCursor() == Cursor::Scroll);
106-
BOOST_TEST_REQUIRE(view->GetOffset() == pos);
107-
// Closing it doesn't either
108-
WINDOWMANAGER.Msg_KeyDown(key);
109-
WINDOWMANAGER.Draw();
110-
BOOST_TEST_REQUIRE(gameDesktop->IsActive());
111-
BOOST_TEST_REQUIRE(!WINDOWMANAGER.GetTopMostWindow());
112-
BOOST_TEST_REQUIRE(WINDOWMANAGER.GetCursor() == Cursor::Scroll);
113-
mouse.pos = startPos + Position(-6, 7);
114-
WINDOWMANAGER.Msg_MouseMove(mouse);
115-
pos += acceleration * Position(-6, 7);
116-
BOOST_TEST_REQUIRE(WINDOWMANAGER.GetCursor() == Cursor::Scroll);
117-
BOOST_TEST_REQUIRE(view->GetOffset() == pos);
118-
// Left click does cancel it
119-
mouse.ldown = true;
120-
WINDOWMANAGER.Msg_LeftDown(mouse);
121-
mouse.ldown = false;
122-
WINDOWMANAGER.Msg_LeftUp(mouse);
123-
BOOST_TEST_REQUIRE(WINDOWMANAGER.GetCursor() == Cursor::Hand);
124-
BOOST_TEST_REQUIRE(view->GetOffset() == pos);
125-
checkNotScrolling(*view);
113+
{
114+
mouse.rdown = true;
115+
WINDOWMANAGER.Msg_RightDown(mouse);
116+
startPos = mouse.pos;
117+
DrawPoint pos = view->GetOffset();
118+
KeyEvent key;
119+
key.kt = KeyType::Char;
120+
key.c = 'm';
121+
key.ctrl = key.alt = key.shift = false;
122+
WINDOWMANAGER.Msg_KeyDown(key);
123+
BOOST_TEST_REQUIRE(WINDOWMANAGER.GetTopMostWindow());
124+
BOOST_TEST_REQUIRE(WINDOWMANAGER.GetCursor() == Cursor::Scroll);
125+
mouse.pos = startPos + Position(-6, 7);
126+
WINDOWMANAGER.Msg_MouseMove(mouse);
127+
pos += acceleration * Position(-6, 7);
128+
BOOST_TEST_REQUIRE(WINDOWMANAGER.GetCursor() == Cursor::Scroll);
129+
BOOST_TEST_REQUIRE(view->GetOffset() == pos);
130+
// Closing it doesn't either
131+
WINDOWMANAGER.Msg_KeyDown(key);
132+
WINDOWMANAGER.Draw();
133+
BOOST_TEST_REQUIRE(gameDesktop->IsActive());
134+
BOOST_TEST_REQUIRE(!WINDOWMANAGER.GetTopMostWindow());
135+
BOOST_TEST_REQUIRE(WINDOWMANAGER.GetCursor() == Cursor::Scroll);
136+
mouse.pos = startPos + Position(-6, 7);
137+
WINDOWMANAGER.Msg_MouseMove(mouse);
138+
pos += acceleration * Position(-6, 7);
139+
BOOST_TEST_REQUIRE(WINDOWMANAGER.GetCursor() == Cursor::Scroll);
140+
BOOST_TEST_REQUIRE(view->GetOffset() == pos);
141+
// Left click does cancel it
142+
mouse.ldown = true;
143+
WINDOWMANAGER.Msg_LeftDown(mouse);
144+
mouse.ldown = false;
145+
WINDOWMANAGER.Msg_LeftUp(mouse);
146+
BOOST_TEST_REQUIRE(WINDOWMANAGER.GetCursor() == Cursor::Hand);
147+
BOOST_TEST_REQUIRE(view->GetOffset() == pos);
148+
checkNotScrolling(*view);
149+
}
126150
}
127151

128152
BOOST_FIXTURE_TEST_CASE(ScrollingWhileRoadBuilding, GameInterfaceFixture)

0 commit comments

Comments
 (0)