diff --git a/UI/DisplayLayoutScreen.cpp b/UI/DisplayLayoutScreen.cpp index 014df89e600b..be5a4419c26f 100644 --- a/UI/DisplayLayoutScreen.cpp +++ b/UI/DisplayLayoutScreen.cpp @@ -81,20 +81,35 @@ bool DisplayLayoutScreen::touch(const TouchInput &touch) { if (mode == 0) { const Bounds &bounds = picked_->GetBounds(); - int minTouchX = screen_bounds.w / 4; - int maxTouchX = screen_bounds.w - minTouchX; + int limitX = g_Config.fSmallDisplayZoomLevel * 120; + int limitY = g_Config.fSmallDisplayZoomLevel * 68; + if (g_Config.fSmallDisplayZoomLevel < 1) { + limitX = 120; + limitY = 68; + } + if (bRotated) { + //swap X/Y limit for rotated display + int limitTemp = limitX; + limitX = limitY; + limitY = limitTemp; + } - int minTouchY = screen_bounds.h / 4; - int maxTouchY = screen_bounds.h - minTouchY; + int minX = local_dp_xres / 2; + int maxX = local_dp_xres + minX; + int minY = local_dp_yres / 2; + int maxY = local_dp_yres + minY; + // Display visualization disappear outside of those bounds, so we have to limit + if (touchX < -minX) touchX = -minX; + if (touchX > maxX) touchX = maxX; + if (touchY < -minY) touchY = -minY; + if (touchY > maxY) touchY = maxY; int newX = bounds.centerX(), newY = bounds.centerY(); - // we have to handle x and y separately since even if x is blocked, y may not be. - if (touchX > minTouchX && touchX < maxTouchX) { - // if the leftmost point of the control is ahead of the margin, - // move it. Otherwise, don't. + // Allow moving zoomed in display freely as long as at least noticeable portion of the screen is occupied + if (touchX > (local_dp_xres / 2) - limitX - 10 && touchX < (local_dp_xres / 2) + limitX + 10) { newX = touchX; } - if (touchY > minTouchY && touchY < maxTouchY) { + if (touchY > (local_dp_yres / 2) - limitY - 10 && touchY < (local_dp_yres / 2) + limitY + 10) { newY = touchY; } picked_->ReplaceLayoutParams(new UI::AnchorLayoutParams(newX, newY, NONE, NONE, true)); @@ -106,7 +121,8 @@ bool DisplayLayoutScreen::touch(const TouchInput &touch) { float movementScale = 0.5f; float newScale = startScale_ + diffY * movementScale; - if (newScale > 100.0f) newScale = 100.0f; + // Desired scale * 8.0 since the visualization is tiny size and multiplied by 8. + if (newScale > 80.0f) newScale = 80.0f; if (newScale < 1.0f) newScale = 1.0f; picked_->SetScale(newScale); scaleUpdate_ = picked_->GetScale(); @@ -222,7 +238,7 @@ void DisplayLayoutScreen::CreateViews() { rotation_ = new PopupMultiChoice(&g_Config.iInternalScreenRotation, gr->T("Rotation"), displayRotation, 1, ARRAY_SIZE(displayRotation), co->GetName(), screenManager(), new AnchorLayoutParams(400, WRAP_CONTENT, previewWidth - 200.0f, 10, NONE, local_dp_yres - 64 - 10)); rotation_->SetEnabledPtr(&displayRotEnable_); displayRotEnable_ = (g_Config.iRenderingMode != FB_NON_BUFFERED_MODE); - bool bRotated = false; + bRotated = false; if (displayRotEnable_ && (g_Config.iInternalScreenRotation == ROTATION_LOCKED_VERTICAL || g_Config.iInternalScreenRotation == ROTATION_LOCKED_VERTICAL180)) { bRotated = true; } diff --git a/UI/DisplayLayoutScreen.h b/UI/DisplayLayoutScreen.h index e03142353514..be7d2b687299 100644 --- a/UI/DisplayLayoutScreen.h +++ b/UI/DisplayLayoutScreen.h @@ -44,6 +44,7 @@ class DisplayLayoutScreen : public UIDialogScreenWithBackground { UI::PopupMultiChoice *zoom_; UI::PopupMultiChoice *rotation_; bool displayRotEnable_; + bool bRotated; // Touch down state for drag to resize etc float startX_; float startY_;