鼠标位移item的pos
2024-12-18
0
0
鼠标位移由OBSBasicPreview::mouseMoveEvent触发。
1.首选通过GetMouseEventPos计算出鼠标的位置在实际画布窗口中的相对位置。
返回的这个位置pos就变成了相对于画布绘图区域的逻辑位置了。
2.获取到POS调用MoveItems
void OBSBasicPreview::MoveItems(const vec2 &pos)
{
Qt::KeyboardModifiers modifiers = QGuiApplication::keyboardModifiers();
OBSBasic *main = reinterpret_cast<OBSBasic *>(App()->GetMainWindow());
OBSScene scene = main->GetCurrentScene();
vec2 offset, moveOffset;
//与前位置与鼠标按下时的起始位置之差
vec2_sub(&offset, &pos, &startPos);
vec2_sub(&moveOffset, &offset, &lastMoveOffset);
if (!(modifiers & Qt::ControlModifier))
SnapItemMovement(moveOffset);
vec2_add(&lastMoveOffset, &lastMoveOffset, &moveOffset);
obs_scene_enum_items(scene, move_items, &moveOffset);
}
最终调用move_items
static bool move_items(obs_scene_t *scene, obs_sceneitem_t *item, void *param)
{
//获取偏移位置
vec2 *offset = reinterpret_cast<vec2 *>(param);
if (selected) {
vec2 pos;
//获取当前
obs_sceneitem_get_pos(item, &pos);
//计算新的位置
vec2_add(&pos, &pos, offset);
//更新位置
obs_sceneitem_set_pos(item, &pos);
}
}
所以这里的偏移使用的是方法:
1.鼠标按下时计录按下的位置
2.鼠标移动时的位置和刚开始按下的位置做差,就计算出了移动的位置。这样ITEM的源坐标加上这个偏多位置就是新的位置。
注意,这里的位置都是相对于画布绘图区域的逻辑坐标位置。
逻辑坐标的计算
位意一鼠标点相对于画布的逻辑坐位计算方法使用GetMouseEventPos来计算。
vec2 OBSBasicPreview::GetMouseEventPos(QMouseEvent *event)
{
OBSBasic *main = reinterpret_cast<OBSBasic *>(App()->GetMainWindow());
float pixelRatio = main->devicePixelRatioF();
float scale = pixelRatio / main->previewScale;
vec2 pos;
vec2_set(&pos,
(float(event->x()) - main->previewX / pixelRatio) * scale,
(float(event->y()) - main->previewY / pixelRatio) * scale);
return pos;
}