diff --git a/rts/Game/SelectedUnitsHandler.cpp b/rts/Game/SelectedUnitsHandler.cpp index f0d7e5cfe80..4f07562e11c 100644 --- a/rts/Game/SelectedUnitsHandler.cpp +++ b/rts/Game/SelectedUnitsHandler.cpp @@ -291,7 +291,7 @@ void CSelectedUnitsHandler::HandleUnitBoxSelection(const float4& planeRight, con } -void CSelectedUnitsHandler::HandleSingleUnitClickSelection(CUnit* unit, bool doInViewTest) +void CSelectedUnitsHandler::HandleSingleUnitClickSelection(CUnit* unit, bool doInViewTest, bool selectType) { //FIXME make modular? const CMouseHandler::ButtonPressEvt& bp = mouse->buttons[SDL_BUTTON_LEFT]; @@ -301,7 +301,7 @@ void CSelectedUnitsHandler::HandleSingleUnitClickSelection(CUnit* unit, bool doI if (unit->team != gu->myTeam && !gu->spectatingFullSelect && !gs->godMode) return; - if (bp.lastRelease < (gu->gameTime - mouse->doubleClickTime)) { + if (!selectType) { if (KeyInput::GetKeyModState(KMOD_CTRL) && (selectedUnits.find(unit) != selectedUnits.end())) { RemoveUnit(unit); } else { diff --git a/rts/Game/SelectedUnitsHandler.h b/rts/Game/SelectedUnitsHandler.h index e10f917f6f4..7eeec91413a 100644 --- a/rts/Game/SelectedUnitsHandler.h +++ b/rts/Game/SelectedUnitsHandler.h @@ -40,7 +40,7 @@ class CSelectedUnitsHandler : public CObject /// used by MouseHandler.cpp & MiniMap.cpp void HandleUnitBoxSelection(const float4& planeRight, const float4& planeLeft, const float4& planeTop, const float4& planeBottom); - void HandleSingleUnitClickSelection(CUnit* unit, bool doInViewTest); + void HandleSingleUnitClickSelection(CUnit* unit, bool doInViewTest, bool selectType); void ToggleBuildIconsFirst(); bool BuildIconsFirst() const { return buildIconsFirst; } diff --git a/rts/Game/UI/MiniMap.cpp b/rts/Game/UI/MiniMap.cpp index 064076a6875..7e38565ec54 100644 --- a/rts/Game/UI/MiniMap.cpp +++ b/rts/Game/UI/MiniMap.cpp @@ -95,6 +95,7 @@ CMiniMap::CMiniMap() , renderToTexture(true) , multisampledFBO(false) , minimapTex(0) + , lastClicked(nullptr) { lastWindowSizeX = globalRendering->viewSizeX; lastWindowSizeY = globalRendering->viewSizeY; @@ -475,8 +476,10 @@ void CMiniMap::MoveView(int x, int y) } -void CMiniMap::SelectUnits(int x, int y) const +void CMiniMap::SelectUnits(int x, int y) { + const CUnit *_lastClicked = lastClicked; + lastClicked = nullptr; if (!KeyInput::GetKeyModState(KMOD_SHIFT) && !KeyInput::GetKeyModState(KMOD_CTRL)) { selectedUnitsHandler.ClearSelected(); } @@ -510,9 +513,13 @@ void CMiniMap::SelectUnits(int x, int y) const } else { unit = CGameHelper::GetClosestFriendlyUnit(NULL, pos, size, gu->myAllyTeam); } + lastClicked = unit; + const bool selectType = bp.lastRelease >= (gu->gameTime - mouse->doubleClickTime) && unit == _lastClicked; - selectedUnitsHandler.HandleSingleUnitClickSelection(unit, false); + selectedUnitsHandler.HandleSingleUnitClickSelection(unit, false, selectType); } + + bp.lastRelease = gu->gameTime; } /******************************************************************************/ diff --git a/rts/Game/UI/MiniMap.h b/rts/Game/UI/MiniMap.h index 2b7292f85cc..d6ecbd8fd95 100644 --- a/rts/Game/UI/MiniMap.h +++ b/rts/Game/UI/MiniMap.h @@ -76,7 +76,7 @@ class CMiniMap : public CInputReceiver { void ToggleMaximized(bool maxspect); void SetMaximizedGeometry(); - void SelectUnits(int x, int y) const; + void SelectUnits(int x, int y); void ProxyMousePress(int x, int y, int button); void ProxyMouseRelease(int x, int y, int button); @@ -180,6 +180,8 @@ class CMiniMap : public CInputReceiver { float color[4]; }; std::deque notes; + + CUnit* lastClicked; }; diff --git a/rts/Game/UI/MouseHandler.cpp b/rts/Game/UI/MouseHandler.cpp index f3cbea345d9..ca0ceccbc46 100644 --- a/rts/Game/UI/MouseHandler.cpp +++ b/rts/Game/UI/MouseHandler.cpp @@ -97,6 +97,7 @@ CMouseHandler::CMouseHandler() , dragScrollThreshold(0.0f) , scrollx(0.0f) , scrolly(0.0f) + , lastClicked(nullptr) { const int2 mousepos = IMouseInput::GetInstance()->GetPos(); lastx = mousepos.x; @@ -371,6 +372,9 @@ void CMouseHandler::GetSelectionBoxCoeff(const float3& pos1, const float3& dir1, void CMouseHandler::MouseRelease(int x, int y, int button) { + const CUnit *_lastClicked = lastClicked; + lastClicked = nullptr; + if (button > NUM_BUTTONS) return; @@ -439,8 +443,10 @@ void CMouseHandler::MouseRelease(int x, int y, int button) CUnit* unit; CFeature* feature; TraceRay::GuiTraceRay(camera->GetPos(), dir, globalRendering->viewRange * 1.4f, NULL, unit, feature, false); + lastClicked = unit; + const bool selectType = bp.lastRelease >= (gu->gameTime - doubleClickTime) && unit == _lastClicked; - selectedUnitsHandler.HandleSingleUnitClickSelection(unit, true); + selectedUnitsHandler.HandleSingleUnitClickSelection(unit, true, selectType); } bp.lastRelease = gu->gameTime; diff --git a/rts/Game/UI/MouseHandler.h b/rts/Game/UI/MouseHandler.h index 49badbe13af..8750d615e6c 100644 --- a/rts/Game/UI/MouseHandler.h +++ b/rts/Game/UI/MouseHandler.h @@ -15,7 +15,7 @@ static const int NUM_BUTTONS = 10; class CInputReceiver; class CCameraController; - +class CUnit; class CMouseHandler { @@ -128,6 +128,8 @@ class CMouseHandler float scrollx; float scrolly; + CUnit* lastClicked; + std::map cursorFileMap; std::map cursorCommandMap; };