mirror of
https://github.com/LibreOffice/core.git
synced 2025-08-15 20:47:46 +00:00
lok: properly treat zoom in LokStarMathHelper::postMouseEvent
Previous naive implementation was dropped in commit
033a342a63
(lok: use twips in Math,
Wed Nov 02 11:03:08 2022 +0300). Unlike chart, Math expects twips,
so PPT (pixel per twip) factor must be converted into percentage.
Change-Id: Icd936e004d961c0abc25c241391d4e24c44e8c14
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/142319
Tested-by: Jenkins
Reviewed-by: Mike Kaganski <mike.kaganski@collabora.com>
This commit is contained in:
@ -78,7 +78,7 @@ public:
|
||||
void Dispatch(const OUString& cmd, const css::uno::Sequence<css::beans::PropertyValue>& rArguments) const;
|
||||
|
||||
bool postMouseEvent(int nType, int nX, int nY, int nCount, int nButtons, int nModifier,
|
||||
double fScaleX = 1.0, double fScaleY = 1.0);
|
||||
double fPPTScaleX, double fPPTScaleY);
|
||||
|
||||
private:
|
||||
const SfxViewShell* mpViewShell;
|
||||
|
@ -139,7 +139,7 @@ tools::Rectangle LokStarMathHelper::GetBoundingBox() const
|
||||
}
|
||||
|
||||
bool LokStarMathHelper::postMouseEvent(int nType, int nX, int nY, int nCount, int nButtons,
|
||||
int nModifier, double /*fScaleX*/, double /*fScaleY*/)
|
||||
int nModifier, double fPPTScaleX, double fPPTScaleY)
|
||||
{
|
||||
const tools::Rectangle rBBox = GetBoundingBox();
|
||||
if (Point aMousePos(nX, nY); rBBox.Contains(aMousePos))
|
||||
@ -147,6 +147,17 @@ bool LokStarMathHelper::postMouseEvent(int nType, int nX, int nY, int nCount, in
|
||||
if (vcl::Window* pWindow = GetWidgetWindow())
|
||||
{
|
||||
aMousePos -= rBBox.TopLeft();
|
||||
|
||||
// In lok, Math does not convert coordinates (see SmGraphicWidget::SetDrawingArea,
|
||||
// which disables MapMode), and uses twips internally (see SmDocShell ctor and
|
||||
// SmMapUnit), but the conversion factor can depend on the client zoom.
|
||||
// 1. Remove the twip->pixel factor in the passed scales
|
||||
double fScaleX = o3tl::convert(fPPTScaleX, o3tl::Length::px, o3tl::Length::twip);
|
||||
double fScaleY = o3tl::convert(fPPTScaleY, o3tl::Length::px, o3tl::Length::twip);
|
||||
// 2. Adjust the position according to the scales
|
||||
aMousePos
|
||||
= Point(std::round(aMousePos.X() * fScaleX), std::round(aMousePos.Y() * fScaleY));
|
||||
|
||||
LokMouseEventData aMouseEventData(
|
||||
nType, aMousePos, nCount, MouseEventModifiers::SIMPLECLICK, nButtons, nModifier);
|
||||
SfxLokHelper::postMouseEventAsync(pWindow, aMouseEventData);
|
||||
|
Reference in New Issue
Block a user