소스 검색

UI: Change cursor when interacting with the preview

Includes move, resize, crop, stretch, box select.
Matt Gajownik 5 년 전
부모
커밋
ff23eb4a24
2개의 변경된 파일50개의 추가작업 그리고 0개의 파일을 삭제
  1. 48 0
      UI/window-basic-preview.cpp
  2. 2 0
      UI/window-basic-preview.hpp

+ 48 - 0
UI/window-basic-preview.cpp

@@ -583,6 +583,25 @@ void OBSBasicPreview::mousePressEvent(QMouseEvent *event)
 	mousePos = startPos;
 	mousePos = startPos;
 }
 }
 
 
+void OBSBasicPreview::UpdateCursor(uint32_t &flags)
+{
+	if (!flags && cursor().shape() != Qt::OpenHandCursor)
+		unsetCursor();
+	if (cursor().shape() != Qt::ArrowCursor)
+		return;
+
+	if ((flags & ITEM_LEFT && flags & ITEM_TOP) ||
+	    (flags & ITEM_RIGHT && flags & ITEM_BOTTOM))
+		setCursor(Qt::SizeFDiagCursor);
+	else if ((flags & ITEM_LEFT && flags & ITEM_BOTTOM) ||
+		 (flags & ITEM_RIGHT && flags & ITEM_TOP))
+		setCursor(Qt::SizeBDiagCursor);
+	else if (flags & ITEM_LEFT || flags & ITEM_RIGHT)
+		setCursor(Qt::SizeHorCursor);
+	else if (flags & ITEM_TOP || flags & ITEM_BOTTOM)
+		setCursor(Qt::SizeVerCursor);
+}
+
 static bool select_one(obs_scene_t *scene, obs_sceneitem_t *item, void *param)
 static bool select_one(obs_scene_t *scene, obs_sceneitem_t *item, void *param)
 {
 {
 	obs_sceneitem_t *selectedItem =
 	obs_sceneitem_t *selectedItem =
@@ -685,6 +704,7 @@ void OBSBasicPreview::mouseReleaseEvent(QMouseEvent *event)
 		mouseMoved = false;
 		mouseMoved = false;
 		cropping = false;
 		cropping = false;
 		selectionBox = false;
 		selectionBox = false;
+		unsetCursor();
 
 
 		OBSSceneItem item = GetItemAtPos(pos, true);
 		OBSSceneItem item = GetItemAtPos(pos, true);
 
 
@@ -1090,6 +1110,9 @@ void OBSBasicPreview::BoxItems(const vec2 &startPos, const vec2 &pos)
 	if (!scene)
 	if (!scene)
 		return;
 		return;
 
 
+	if (cursor().shape() != Qt::CrossCursor)
+		setCursor(Qt::CrossCursor);
+
 	SceneFindBoxData data(startPos, pos);
 	SceneFindBoxData data(startPos, pos);
 	obs_scene_enum_items(scene, FindItemsInBox, &data);
 	obs_scene_enum_items(scene, FindItemsInBox, &data);
 
 
@@ -1423,6 +1446,8 @@ void OBSBasicPreview::mouseMoveEvent(QMouseEvent *event)
 	if (locked)
 	if (locked)
 		return;
 		return;
 
 
+	bool updateCursor = false;
+
 	if (mouseDown) {
 	if (mouseDown) {
 		vec2 pos = GetMouseEventPos(event);
 		vec2 pos = GetMouseEventPos(event);
 
 
@@ -1458,6 +1483,8 @@ void OBSBasicPreview::mouseMoveEvent(QMouseEvent *event)
 				StretchItem(pos);
 				StretchItem(pos);
 
 
 		} else if (mouseOverItems) {
 		} else if (mouseOverItems) {
+			if (cursor().shape() != Qt::SizeAllCursor)
+				setCursor(Qt::SizeAllCursor);
 			selectionBox = false;
 			selectionBox = false;
 			MoveItems(pos);
 			MoveItems(pos);
 		} else {
 		} else {
@@ -1476,6 +1503,27 @@ void OBSBasicPreview::mouseMoveEvent(QMouseEvent *event)
 		std::lock_guard<std::mutex> lock(selectMutex);
 		std::lock_guard<std::mutex> lock(selectMutex);
 		hoveredPreviewItems.clear();
 		hoveredPreviewItems.clear();
 		hoveredPreviewItems.push_back(item);
 		hoveredPreviewItems.push_back(item);
+
+		if (!mouseMoved && hoveredPreviewItems.size() > 0) {
+			mousePos = pos;
+			OBSBasic *main = reinterpret_cast<OBSBasic *>(
+				App()->GetMainWindow());
+#ifdef SUPPORTS_FRACTIONAL_SCALING
+			float scale = main->devicePixelRatioF();
+#else
+			float scale = main->devicePixelRatio();
+#endif
+			float x = float(event->x()) - main->previewX / scale;
+			float y = float(event->y()) - main->previewY / scale;
+			vec2_set(&startPos, x, y);
+			updateCursor = true;
+		}
+	}
+
+	if (updateCursor) {
+		GetStretchHandleData(startPos);
+		uint32_t stretchFlags = (uint32_t)stretchHandle;
+		UpdateCursor(stretchFlags);
 	}
 	}
 }
 }
 
 

+ 2 - 0
UI/window-basic-preview.hpp

@@ -92,6 +92,8 @@ private:
 
 
 	void GetStretchHandleData(const vec2 &pos);
 	void GetStretchHandleData(const vec2 &pos);
 
 
+	void UpdateCursor(uint32_t &flags);
+
 	void SnapStretchingToScreen(vec3 &tl, vec3 &br);
 	void SnapStretchingToScreen(vec3 &tl, vec3 &br);
 	void ClampAspect(vec3 &tl, vec3 &br, vec2 &size, const vec2 &baseSize);
 	void ClampAspect(vec3 &tl, vec3 &br, vec2 &size, const vec2 &baseSize);
 	vec3 CalculateStretchPos(const vec3 &tl, const vec3 &br);
 	vec3 CalculateStretchPos(const vec3 &tl, const vec3 &br);