FFFF Add an option for GraphicsWindow zoom to stay centered in view. by WickedSmoke · Pull Request #1505 · solvespace/solvespace · GitHub
[go: up one dir, main page]

Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions src/confscreen.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,10 @@ void TextWindow::ScreenChangeCameraNav(int link, uint32_t v) {
SS.cameraNav = !SS.cameraNav;
}

void TextWindow::ScreenChangeZoomNav(int link, uint32_t v) {
SS.zoomCenterNav = !SS.zoomCenterNav;
}

void TextWindow::ScreenChangeImmediatelyEditDimension(int link, uint32_t v) {
SS.immediatelyEditDimension = !SS.immediatelyEditDimension;
SS.GW.Invalidate(/*clearPersistent=*/true);
Expand Down Expand Up @@ -357,6 +361,8 @@ void TextWindow::ShowConfiguration() {
SS.cameraNav ? CHECK_TRUE : CHECK_FALSE);
Printf(false, " %Fd%f%Ll%s use turntable mouse navigation%E", &ScreenChangeTurntableNav,
SS.turntableNav ? CHECK_TRUE : CHECK_FALSE);
Printf(false, " %Fd%f%Ll%s zoom keeping view centered%E", &ScreenChangeZoomNav,
SS.zoomCenterNav ? CHECK_TRUE : CHECK_FALSE);
Printf(false, " %Fd%f%Ll%s edit newly added dimensions%E",
&ScreenChangeImmediatelyEditDimension,
SS.immediatelyEditDimension ? CHECK_TRUE : CHECK_FALSE);
Expand Down
38 changes: 25 additions & 13 deletions src/graphicswin.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -726,27 +726,39 @@ double GraphicsWindow::ZoomToFit(const Camera &camera,
}


void GraphicsWindow::ZoomToMouse(double zoomMultiplyer) {
double offsetRight = offset.Dot(projRight);
double offsetUp = offset.Dot(projUp);
void GraphicsWindow::ZoomToMouse(double zoomMultiplyer, bool centered) {
double offsetRight, offsetUp;
double righti, upi;

double width, height;
window->GetContentSize(&width, &height);
// Mouse edit operations currently track the pointer relative to the
// initial button press position, so centered is currently ignored during
// edits.
bool trackPointer = (pending.operation != Pending::NONE) || (! centered);

double righti = currentMousePosition.x / scale - offsetRight;
double upi = currentMousePosition.y / scale - offsetUp;
if (trackPointer) {
offsetRight = offset.Dot(projRight);
offsetUp = offset.Dot(projUp);

double width, height;
window->GetContentSize(&width, &height);

righti = currentMousePosition.x / scale - offsetRight;
upi = currentMousePosition.y / scale - offsetUp;
}

// zoomMultiplyer of 1 gives a default zoom factor of 1.2x: zoomMultiplyer * 1.2
// zoom = adjusted zoom negative zoomMultiplyer will zoom out, positive will zoom in
//

scale *= exp(0.1823216 * zoomMultiplyer); // ln(1.2) = 0.1823216

double rightf = currentMousePosition.x / scale - offsetRight;
double upf = currentMousePosition.y / scale - offsetUp;
if (trackPointer) {
double rightf = currentMousePosition.x / scale - offsetRight;
double upf = currentMousePosition.y / scale - offsetUp;

offset = offset.Plus(projRight.ScaledBy(rightf - righti));
offset = offset.Plus(projUp.ScaledBy(upf - upi));
offset = offset.Plus(projRight.ScaledBy(rightf - righti));
offset = offset.Plus(projUp.ScaledBy(upf - upi));
}

if(SS.TW.shown.screen == TextWindow::Screen::EDIT_VIEW) {
if(havePainted) {
Expand All @@ -761,11 +773,11 @@ void GraphicsWindow::ZoomToMouse(double zoomMultiplyer) {
void GraphicsWindow::MenuView(Command id) {
switch(id) {
case Command::ZOOM_IN:
SS.GW.ZoomToMouse(1);
SS.GW.ZoomToMouse(1, SS.zoomCenterNav);
break;

case Command::ZOOM_OUT:
SS.GW.ZoomToMouse(-1);
SS.GW.ZoomToMouse(-1, SS.zoomCenterNav);
break;

case Command::ZOOM_TO_FIT:
Expand Down
7 changes: 4 additions & 3 deletions src/mouse.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -923,7 +923,8 @@ bool GraphicsWindow::MouseEvent(Platform::MouseEvent event) {
break;

case MouseEvent::Type::SCROLL_VERT:
this->MouseScroll(event.shiftDown ? event.scrollDelta / 10 : event.scrollDelta);
this->MouseScroll(event.shiftDown ? event.scrollDelta / 10 : event.scrollDelta,
event.controlDown);
break;

case MouseEvent::Type::LEAVE:
Expand Down Expand Up @@ -1488,7 +1489,7 @@ void GraphicsWindow::EditControlDone(const std::string &s) {
}
}

void GraphicsWindow::MouseScroll(double zoomMultiplyer) {
void GraphicsWindow::MouseScroll(double zoomMultiplyer, bool alt) {
// To support smooth scrolling where scroll wheel events come in increments
// smaller (or larger) than 1 we do:
// scale *= exp(ln(1.2) * zoomMultiplyer);
Expand All @@ -1499,7 +1500,7 @@ void GraphicsWindow::MouseScroll(double zoomMultiplyer) {
// while
// scale * a * b != scale * (a+b)
// So this constant is ln(1.2) = 0.1823216 to make the default zoom 1.2x
ZoomToMouse(zoomMultiplyer);
ZoomToMouse(zoomMultiplyer, alt ? ! SS.zoomCenterNav : SS.zoomCenterNav);
}

void GraphicsWindow::MouseLeave() {
Expand Down
4 changes: 4 additions & 0 deletions src/solvespace.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,8 @@ void SolveSpaceUI::Init() {
cameraNav = settings->ThawBool("CameraNav", false);
// Use turntable mouse navigation
turntableNav = settings->ThawBool("TurntableNav", false);
// Zoom keeping view centered
zoomCenterNav = settings->ThawBool("ZoomCenterNav", false);
// Immediately edit dimension
immediatelyEditDimension = settings->ThawBool("ImmediatelyEditDimension", true);
// Check that contours are closed and not self-intersecting
Expand Down Expand Up @@ -278,6 +280,8 @@ void SolveSpaceUI::Exit() {
settings->FreezeBool("CameraNav", cameraNav);
// Use turntable mouse navigation
settings->FreezeBool("TurntableNav", turntableNav);
// Zoom keeping view centered
settings->FreezeBool("ZoomCenterNav", zoomCenterNav);
// Immediately edit dimensions
settings->FreezeBool("ImmediatelyEditDimension", immediatelyEditDimension);
// Enable automatic constrains for lines
Expand Down
1 change: 1 addition & 0 deletions src/solvespace.h
Original file line number Diff line number Diff line change
Expand Up @@ -496,6 +496,7 @@ class SolveSpaceUI {
bool checkClosedContour;
bool cameraNav;
bool turntableNav;
bool zoomCenterNav;
bool immediatelyEditDimension;
bool automaticLineConstraints;
bool showToolbar;
Expand Down
5 changes: 3 additions & 2 deletions src/ui.h
Original file line number Diff line number Diff line change
Expand Up @@ -472,6 +472,7 @@ class TextWindow {
static void ScreenChangeShowContourAreas(int link, uint32_t v);
static void ScreenChangeCheckClosedContour(int link, uint32_t v);
static void ScreenChangeCameraNav(int link, uint32_t v);
static void ScreenChangeZoomNav(int link, uint32_t v);
static void ScreenChangeTurntableNav(int link, uint32_t v);
static void ScreenChangeImmediatelyEditDimension(int link, uint32_t v);
static void ScreenChangeAutomaticLineConstraints(int link, uint32_t v);
Expand Down Expand Up @@ -648,7 +649,7 @@ class GraphicsWindow {
void HandlePointForZoomToFit(Vector p, Point2d *pmax, Point2d *pmin,
double *wmin, bool usePerspective,
const Camera &camera);
void ZoomToMouse(double delta);
void ZoomToMouse(double delta, bool centered);
void LoopOverPoints(const std::vector<Entity *> &entities,
const std::vector<Constraint *> &constraints,
const std::vector<hEntity> &faces,
Expand Down Expand Up @@ -874,7 +875,7 @@ class GraphicsWindow {
void MouseLeftDoubleClick(double x, double y);
void MouseMiddleOrRightDown(double x, double y);
void MouseRightUp(double x, double y);
void MouseScroll(double delta);
void MouseScroll(double delta, bool alt);
void MouseLeave();
bool KeyboardEvent(Platform::KeyboardEvent event);
void EditControlDone(const std::string &s);
Expand Down
Loading
0