UI: Fix resize cursor to respect item transformation

This commit is contained in:
BGM99
2023-10-14 20:50:41 +02:00
committed by Patrick Heyer
parent 38f7d29a5d
commit 04788d30e2

View File

@@ -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,