Skip to content

Commit

Permalink
Improve display layout editor for zooming into corners, also limit th…
Browse files Browse the repository at this point in the history
…e scale to 10 to match slider.
  • Loading branch information
LunaMoo committed Dec 11, 2017
1 parent 7c03d69 commit 2597ca9
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 11 deletions.
38 changes: 27 additions & 11 deletions UI/DisplayLayoutScreen.cpp
Expand Up @@ -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));
Expand All @@ -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();
Expand Down Expand Up @@ -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;
}
Expand Down
1 change: 1 addition & 0 deletions UI/DisplayLayoutScreen.h
Expand Up @@ -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_;
Expand Down

0 comments on commit 2597ca9

Please sign in to comment.