From 9cc9b623ebae8ef9021d1462dc0d58189777f65e Mon Sep 17 00:00:00 2001 From: Matthew Hodgson Date: Thu, 4 May 2017 11:11:04 +0100 Subject: [PATCH] macOS fixes (#15) - Improve build instructions. - Fix fullscreen image sizing. - Remove horizontal overscroll of RoomInfoListItem. --- README.md | 3 +++ include/ImageOverlayDialog.h | 3 +++ src/ImageOverlayDialog.cc | 30 +++++++++++++++++++----------- src/RoomInfoListItem.cc | 2 +- 4 files changed, 26 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 5ddf784f..2f7fb761 100644 --- a/README.md +++ b/README.md @@ -42,6 +42,9 @@ $ brew update $ brew install qt5 ``` +N.B. you will need to pass `-DCMAKE_PREFIX_PATH=/usr/local/opt/qt5` +to cmake to point it at your qt5 install (tweaking the path as needed) + ### Building ```bash diff --git a/include/ImageOverlayDialog.h b/include/ImageOverlayDialog.h index e9eed0c1..5ef4fb65 100644 --- a/include/ImageOverlayDialog.h +++ b/include/ImageOverlayDialog.h @@ -28,6 +28,8 @@ class ImageOverlayDialog : public QDialog public: ImageOverlayDialog(QPixmap image, QWidget *parent = nullptr); + void reject() override; + protected: void mousePressEvent(QMouseEvent *event) override; void paintEvent(QPaintEvent *event) override; @@ -41,6 +43,7 @@ private slots: private: void scaleImage(int width, int height); + QPixmap originalImage_; QPixmap image_; QRect content_; diff --git a/src/ImageOverlayDialog.cc b/src/ImageOverlayDialog.cc index 55e0df00..b23f2a34 100644 --- a/src/ImageOverlayDialog.cc +++ b/src/ImageOverlayDialog.cc @@ -23,7 +23,7 @@ ImageOverlayDialog::ImageOverlayDialog(QPixmap image, QWidget *parent) : QDialog{parent} - , image_{image} + , originalImage_{image} { setMouseTracking(true); setModal(false); @@ -36,11 +36,19 @@ ImageOverlayDialog::ImageOverlayDialog(QPixmap image, QWidget *parent) setWindowState(Qt::WindowFullScreen); - raise(); - connect(this, SIGNAL(closing()), this, SLOT(closeDialog())); } +void ImageOverlayDialog::reject() +{ + // needed on macOS to recover the main menu after the dialog is closed(!) + // also affects KDE/Plasma. XXX: There may be a better way of resetting the + // window state than this... + setWindowState(Qt::WindowNoState); + + QDialog::reject(); +} + void ImageOverlayDialog::closeDialog() { QTimer::singleShot(100, this, &ImageOverlayDialog::reject); @@ -49,11 +57,11 @@ void ImageOverlayDialog::closeDialog() // TODO: Move this into Utils void ImageOverlayDialog::scaleImage(int max_width, int max_height) { - if (image_.isNull()) + if (originalImage_.isNull()) return; - auto width_ratio = (double)max_width / (double)image_.width(); - auto height_ratio = (double)max_height / (double)image_.height(); + auto width_ratio = (double)max_width / (double)originalImage_.width(); + auto height_ratio = (double)max_height / (double)originalImage_.height(); auto min_aspect_ratio = std::min(width_ratio, height_ratio); @@ -61,14 +69,14 @@ void ImageOverlayDialog::scaleImage(int max_width, int max_height) int final_height = 0; if (min_aspect_ratio > 1) { - final_width = image_.width(); - final_height = image_.height(); + final_width = originalImage_.width(); + final_height = originalImage_.height(); } else { - final_width = image_.width() * min_aspect_ratio; - final_height = image_.height() * min_aspect_ratio; + final_width = originalImage_.width() * min_aspect_ratio; + final_height = originalImage_.height() * min_aspect_ratio; } - image_ = image_.scaled(final_width, final_height, Qt::IgnoreAspectRatio, Qt::SmoothTransformation); + image_ = originalImage_.scaled(final_width, final_height, Qt::IgnoreAspectRatio, Qt::SmoothTransformation); } void ImageOverlayDialog::paintEvent(QPaintEvent *event) diff --git a/src/RoomInfoListItem.cc b/src/RoomInfoListItem.cc index e93fd3a8..954025c6 100644 --- a/src/RoomInfoListItem.cc +++ b/src/RoomInfoListItem.cc @@ -41,7 +41,7 @@ RoomInfoListItem::RoomInfoListItem(RoomInfo info, QWidget *parent) setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); setAutoFillBackground(true); - setMinimumSize(parent->width(), max_height_); + setMaximumSize(parent->width(), max_height_); topLayout_ = new QHBoxLayout(this); topLayout_->setSpacing(0);