diff --git a/UI/window-basic-preview.cpp b/UI/window-basic-preview.cpp index 83f998d55..8f3c79d3e 100644 --- a/UI/window-basic-preview.cpp +++ b/UI/window-basic-preview.cpp @@ -660,9 +660,48 @@ void OBSBasicPreview::UpdateCursor(uint32_t &flags) if (!flags && (cursor().shape() != Qt::OpenHandCursor || !scrollMode)) unsetCursor(); - if (cursor().shape() != Qt::ArrowCursor) + if ((cursor().shape() != Qt::ArrowCursor) || flags == 0) return; + if (flags & ITEM_ROT) { + setCursor(Qt::OpenHandCursor); + return; + } + + float rotation = obs_sceneitem_get_rot(stretchItem); + vec2 scale; + obs_sceneitem_get_scale(stretchItem, &scale); + + if (rotation < 0.0f) + rotation = 360.0f + rotation; + + int octant = int(std::round(rotation / 45.0f)); + bool isCorner = (flags & (flags - 1)) != 0; + + if ((scale.x < 0.0f) && isCorner) + flags ^= ITEM_LEFT | ITEM_RIGHT; + if ((scale.y < 0.0f) && isCorner) + flags ^= ITEM_TOP | ITEM_BOTTOM; + + if (octant % 4 >= 2) { + if (isCorner) { + flags ^= ITEM_TOP | ITEM_BOTTOM; + } else { + flags = (flags >> 2) | (flags << 2); + } + } + + if (octant % 2 == 1) { + if (isCorner) { + flags &= (flags % 3 == 0) ? ~ITEM_TOP & ~ITEM_BOTTOM + : ~ITEM_LEFT & ~ITEM_RIGHT; + } else { + flags = (flags % 4 == 0) + ? flags | flags >> ((flags / 2) - 1) + : flags | ((flags >> 2) | (flags << 2)); + } + } + if ((flags & ITEM_LEFT && flags & ITEM_TOP) || (flags & ITEM_RIGHT && flags & ITEM_BOTTOM)) setCursor(Qt::SizeFDiagCursor); @@ -673,8 +712,6 @@ void OBSBasicPreview::UpdateCursor(uint32_t &flags) setCursor(Qt::SizeHorCursor); else if (flags & ITEM_TOP || flags & ITEM_BOTTOM) setCursor(Qt::SizeVerCursor); - else if (flags & ITEM_ROT) - setCursor(Qt::OpenHandCursor); } static bool select_one(obs_scene_t * /* scene */, obs_sceneitem_t *item,