From 2597ca90f4b2b4849254e1584ab9d41af2a3082d Mon Sep 17 00:00:00 2001 From: LunaMoo Date: Mon, 11 Dec 2017 15:16:00 +0100 Subject: [PATCH 1/4] Improve display layout editor for zooming into corners, also limit the scale to 10 to match slider. --- UI/DisplayLayoutScreen.cpp | 38 +++++++++++++++++++++++++++----------- UI/DisplayLayoutScreen.h | 1 + 2 files changed, 28 insertions(+), 11 deletions(-) diff --git a/UI/DisplayLayoutScreen.cpp b/UI/DisplayLayoutScreen.cpp index 014df89e60..be5a4419c2 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 e031423535..be7d2b6872 100644 --- a/UI/DisplayLayoutScreen.h +++ b/UI/DisplayLayoutScreen.h @@ -44,6 +44,7 @@ private: UI::PopupMultiChoice *zoom_; UI::PopupMultiChoice *rotation_; bool displayRotEnable_; + bool bRotated; // Touch down state for drag to resize etc float startX_; float startY_; From b0b38078422c1b28aed72f5775e6ca07ef42e4ff Mon Sep 17 00:00:00 2001 From: LunaMoo Date: Mon, 11 Dec 2017 15:50:41 +0100 Subject: [PATCH 2/4] Stick display to edges of the screen/window size --- UI/DisplayLayoutScreen.cpp | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/UI/DisplayLayoutScreen.cpp b/UI/DisplayLayoutScreen.cpp index be5a4419c2..d70cb2f016 100644 --- a/UI/DisplayLayoutScreen.cpp +++ b/UI/DisplayLayoutScreen.cpp @@ -94,6 +94,17 @@ bool DisplayLayoutScreen::touch(const TouchInput &touch) { limitY = limitTemp; } + // Check where each edge of the screen is + int windowLeftEdge = local_dp_xres / 4; + int windowRightEdge = windowLeftEdge * 3; + int windowUpperEdge = local_dp_yres / 4; + int windowLowerEdge = windowUpperEdge * 3; + // And stick display when close to any edge + if (touchX > windowLeftEdge - 15 + limitX && touchX < windowLeftEdge + 15 + limitX) touchX = windowLeftEdge + limitX; + if (touchX > windowRightEdge - 15 - limitX && touchX < windowRightEdge + 15 - limitX) touchX = windowRightEdge - limitX; + if (touchY > windowUpperEdge - 15 + limitY && touchY < windowUpperEdge + 15 + limitY) touchY = windowUpperEdge + limitY; + if (touchY > windowLowerEdge - 15 - limitY && touchY < windowLowerEdge + 15 - limitY) touchY = windowLowerEdge - limitY; + int minX = local_dp_xres / 2; int maxX = local_dp_xres + minX; int minY = local_dp_yres / 2; @@ -106,10 +117,10 @@ bool DisplayLayoutScreen::touch(const TouchInput &touch) { int newX = bounds.centerX(), newY = bounds.centerY(); // 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) { + if (touchX > minX - limitX - 10 && touchX < minX + limitX + 10) { newX = touchX; } - if (touchY > (local_dp_yres / 2) - limitY - 10 && touchY < (local_dp_yres / 2) + limitY + 10) { + if (touchY > minY - limitY - 10 && touchY < minY + limitY + 10) { newY = touchY; } picked_->ReplaceLayoutParams(new UI::AnchorLayoutParams(newX, newY, NONE, NONE, true)); From 89be17491babd3e5a0eae9fc668b664f340b25c3 Mon Sep 17 00:00:00 2001 From: LunaMoo Date: Mon, 11 Dec 2017 16:10:59 +0100 Subject: [PATCH 3/4] Respect sticky edge by center option and make it stick from smaller range --- UI/DisplayLayoutScreen.cpp | 15 +++++++++------ UI/DisplayLayoutScreen.h | 2 ++ 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/UI/DisplayLayoutScreen.cpp b/UI/DisplayLayoutScreen.cpp index d70cb2f016..5fec557786 100644 --- a/UI/DisplayLayoutScreen.cpp +++ b/UI/DisplayLayoutScreen.cpp @@ -100,10 +100,11 @@ bool DisplayLayoutScreen::touch(const TouchInput &touch) { int windowUpperEdge = local_dp_yres / 4; int windowLowerEdge = windowUpperEdge * 3; // And stick display when close to any edge - if (touchX > windowLeftEdge - 15 + limitX && touchX < windowLeftEdge + 15 + limitX) touchX = windowLeftEdge + limitX; - if (touchX > windowRightEdge - 15 - limitX && touchX < windowRightEdge + 15 - limitX) touchX = windowRightEdge - limitX; - if (touchY > windowUpperEdge - 15 + limitY && touchY < windowUpperEdge + 15 + limitY) touchY = windowUpperEdge + limitY; - if (touchY > windowLowerEdge - 15 - limitY && touchY < windowLowerEdge + 15 - limitY) touchY = windowLowerEdge - limitY; + stickToEdgeX = false; stickToEdgeY = false; + if (touchX > windowLeftEdge - 8 + limitX && touchX < windowLeftEdge + 8 + limitX) { touchX = windowLeftEdge + limitX; stickToEdgeX = true; } + if (touchX > windowRightEdge - 8 - limitX && touchX < windowRightEdge + 8 - limitX) { touchX = windowRightEdge - limitX; stickToEdgeX = true; } + if (touchY > windowUpperEdge - 8 + limitY && touchY < windowUpperEdge + 8 + limitY) { touchY = windowUpperEdge + limitY; stickToEdgeY = true; } + if (touchY > windowLowerEdge - 8 - limitY && touchY < windowLowerEdge + 8 - limitY) { touchY = windowLowerEdge - limitY; stickToEdgeY = true; } int minX = local_dp_xres / 2; int maxX = local_dp_xres + minX; @@ -167,8 +168,10 @@ void DisplayLayoutScreen::onFinish(DialogResult reason) { } UI::EventReturn DisplayLayoutScreen::OnCenter(UI::EventParams &e) { - g_Config.fSmallDisplayOffsetX = 0.5f; - g_Config.fSmallDisplayOffsetY = 0.5f; + if (!stickToEdgeX || (stickToEdgeX && stickToEdgeY)) + g_Config.fSmallDisplayOffsetX = 0.5f; + if (!stickToEdgeY || (stickToEdgeX && stickToEdgeY)) + g_Config.fSmallDisplayOffsetY = 0.5f; RecreateViews(); return UI::EVENT_DONE; }; diff --git a/UI/DisplayLayoutScreen.h b/UI/DisplayLayoutScreen.h index be7d2b6872..a9d29c19e9 100644 --- a/UI/DisplayLayoutScreen.h +++ b/UI/DisplayLayoutScreen.h @@ -45,6 +45,8 @@ private: UI::PopupMultiChoice *rotation_; bool displayRotEnable_; bool bRotated; + bool stickToEdgeX; + bool stickToEdgeY; // Touch down state for drag to resize etc float startX_; float startY_; From 18d0d45e7fb583d29b39d157f14dccf58e6939be Mon Sep 17 00:00:00 2001 From: LunaMoo Date: Mon, 11 Dec 2017 16:39:01 +0100 Subject: [PATCH 4/4] Limit smallest zoom to match it's slider and well. --- UI/DisplayLayoutScreen.cpp | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/UI/DisplayLayoutScreen.cpp b/UI/DisplayLayoutScreen.cpp index 5fec557786..7559b78c65 100644 --- a/UI/DisplayLayoutScreen.cpp +++ b/UI/DisplayLayoutScreen.cpp @@ -83,10 +83,7 @@ bool DisplayLayoutScreen::touch(const TouchInput &touch) { 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; @@ -135,7 +132,7 @@ bool DisplayLayoutScreen::touch(const TouchInput &touch) { float newScale = startScale_ + diffY * movementScale; // 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; + if (newScale < 8.0f) newScale = 8.0f; picked_->SetScale(newScale); scaleUpdate_ = picked_->GetScale(); g_Config.fSmallDisplayZoomLevel = scaleUpdate_ / 8.0f;