From 4b5fb132f7150b72bd209a9d7d0a3c5a1e5b0500 Mon Sep 17 00:00:00 2001 From: Gres Date: Wed, 25 Mar 2020 20:32:02 +0300 Subject: [PATCH] Place editor respecting available space --- screen-translator.pro | 2 ++ src/capture/captureareaselector.cpp | 5 ++- src/service/geometryutils.cpp | 50 +++++++++++++++++++++++++++++ src/service/geometryutils.h | 14 ++++++++ 4 files changed, 70 insertions(+), 1 deletion(-) create mode 100644 src/service/geometryutils.cpp create mode 100644 src/service/geometryutils.h diff --git a/screen-translator.pro b/screen-translator.pro index 0a45dac..3fb1506 100644 --- a/screen-translator.pro +++ b/screen-translator.pro @@ -44,6 +44,7 @@ HEADERS += \ src/represent/resultwidget.h \ src/service/apptranslator.h \ src/service/debug.h \ + src/service/geometryutils.h \ src/service/globalaction.h \ src/service/runatsystemstart.h \ src/service/singleapplication.h \ @@ -75,6 +76,7 @@ SOURCES += \ src/represent/resultwidget.cpp \ src/service/apptranslator.cpp \ src/service/debug.cpp \ + src/service/geometryutils.cpp \ src/service/globalaction.cpp \ src/service/runatsystemstart.cpp \ src/service/singleapplication.cpp \ diff --git a/src/capture/captureareaselector.cpp b/src/capture/captureareaselector.cpp index ad60161..22387ec 100644 --- a/src/capture/captureareaselector.cpp +++ b/src/capture/captureareaselector.cpp @@ -3,6 +3,7 @@ #include "captureareaeditor.h" #include "capturer.h" #include "debug.h" +#include "geometryutils.h" #include "languagecodes.h" #include "settings.h" @@ -219,8 +220,10 @@ void CaptureAreaSelector::customize(const CaptureArea &area) { SOFT_ASSERT(editor_, return ); editor_->set(area); - editor_->move(QCursor::pos()); editor_->show(); + const auto topLeft = service::geometry::cornerAtPoint( + area.rect().center(), editor_->size(), geometry()); + editor_->move(topLeft); update(); } diff --git a/src/service/geometryutils.cpp b/src/service/geometryutils.cpp new file mode 100644 index 0000000..10c45df --- /dev/null +++ b/src/service/geometryutils.cpp @@ -0,0 +1,50 @@ +#include "geometryutils.h" + +#include + +namespace service +{ +namespace geometry +{ +QPoint cornerAtPoint(const QPoint &corner, const QSize &size, + const QRect &boundRect) +{ + auto clamped = corner; + if (!boundRect.contains(clamped)) { + const auto x = std::clamp(clamped.x(), boundRect.left(), boundRect.right()); + const auto y = std::clamp(clamped.y(), boundRect.top(), boundRect.bottom()); + clamped = QPoint(x, y); + } + + const auto zeroCorner = clamped - boundRect.topLeft(); + const auto boundWidth = boundRect.width(); + const auto boundHeight = boundRect.height(); + + QPoint result; + if (boundWidth <= size.width()) { // not fits + result.rx() = 0; + } else if (boundWidth - zeroCorner.x() >= size.width()) { // enough on right + result.rx() = zeroCorner.x(); + } else if (zeroCorner.x() >= size.width()) { // enough on left + result.rx() = zeroCorner.x() - size.width() + 1; + } else { // not enough on both sides + result.rx() = + zeroCorner.x() >= boundWidth / 2 ? 0 : boundWidth - size.width() + 1; + } + + if (boundHeight <= size.height()) { + result.ry() = 0; + } else if (boundHeight - zeroCorner.y() >= size.height()) { + result.ry() = zeroCorner.y(); + } else if (zeroCorner.y() >= size.height()) { + result.ry() = zeroCorner.y() - size.height() + 1; + } else { + result.ry() = + zeroCorner.y() >= boundHeight / 2 ? 0 : boundHeight - size.height() + 1; + } + + return result + boundRect.topLeft(); +} + +} // namespace geometry +} // namespace service diff --git a/src/service/geometryutils.h b/src/service/geometryutils.h new file mode 100644 index 0000000..86f0b0d --- /dev/null +++ b/src/service/geometryutils.h @@ -0,0 +1,14 @@ +#pragma once + +class QRect; +class QPoint; +class QSize; + +namespace service +{ +namespace geometry +{ +QPoint cornerAtPoint(const QPoint& corner, const QSize& size, + const QRect& boundRect); +} +} // namespace service