Fix full screen image viewer on macOS sierra

This commit is contained in:
Konstantinos Sideris 2017-08-06 10:35:32 +03:00
parent 93e8297b61
commit 4fccc6270e
2 changed files with 17 additions and 27 deletions

View File

@ -21,14 +21,12 @@
#include <QMouseEvent> #include <QMouseEvent>
#include <QPixmap> #include <QPixmap>
class ImageOverlayDialog : public QDialog class ImageOverlayDialog : public QWidget
{ {
Q_OBJECT Q_OBJECT
public: public:
ImageOverlayDialog(QPixmap image, QWidget *parent = nullptr); ImageOverlayDialog(QPixmap image, QWidget *parent = nullptr);
void reject() override;
protected: protected:
void mousePressEvent(QMouseEvent *event) override; void mousePressEvent(QMouseEvent *event) override;
void paintEvent(QPaintEvent *event) override; void paintEvent(QPaintEvent *event) override;
@ -36,9 +34,6 @@ protected:
signals: signals:
void closing(); void closing();
private slots:
void closeDialog();
private: private:
void scaleImage(int width, int height); void scaleImage(int width, int height);
@ -47,4 +42,5 @@ private:
QRect content_; QRect content_;
QRect close_button_; QRect close_button_;
QRect screen_;
}; };

View File

@ -15,43 +15,37 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
#include <QApplication>
#include <QDebug> #include <QDebug>
#include <QDesktopWidget>
#include <QPainter> #include <QPainter>
#include <QScreen>
#include <QTimer> #include <QTimer>
#include "ImageOverlayDialog.h" #include "ImageOverlayDialog.h"
ImageOverlayDialog::ImageOverlayDialog(QPixmap image, QWidget *parent) ImageOverlayDialog::ImageOverlayDialog(QPixmap image, QWidget *parent)
: QDialog{parent} : QWidget{parent}
, originalImage_{image} , originalImage_{image}
{ {
setMouseTracking(true); setMouseTracking(true);
setModal(false); setParent(0);
setWindowFlags(windowFlags() | Qt::FramelessWindowHint); setWindowFlags(windowFlags() | Qt::FramelessWindowHint);
setAttribute(Qt::WA_NoSystemBackground, true); setAttribute(Qt::WA_NoSystemBackground, true);
setAttribute(Qt::WA_TranslucentBackground, true); setAttribute(Qt::WA_TranslucentBackground, true);
setAttribute(Qt::WA_DeleteOnClose, true); setAttribute(Qt::WA_DeleteOnClose, true);
setWindowState(Qt::WindowFullScreen); setWindowState(Qt::WindowFullScreen);
connect(this, SIGNAL(closing()), this, SLOT(closeDialog())); screen_ = QApplication::desktop()->availableGeometry();
}
void ImageOverlayDialog::reject() move(QApplication::desktop()->mapToGlobal(screen_.topLeft()));
{ resize(screen_.size());
// 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(); connect(this, SIGNAL(closing()), this, SLOT(close()));
}
void ImageOverlayDialog::closeDialog() raise();
{
QTimer::singleShot(100, this, &ImageOverlayDialog::reject);
} }
// TODO: Move this into Utils // TODO: Move this into Utils
@ -87,15 +81,15 @@ void ImageOverlayDialog::paintEvent(QPaintEvent *event)
painter.setRenderHint(QPainter::Antialiasing); painter.setRenderHint(QPainter::Antialiasing);
// Full screen overlay. // Full screen overlay.
painter.fillRect(rect(), QColor(55, 55, 55, 170)); painter.fillRect(QRect(0, 0, screen_.width(), screen_.height()), QColor(55, 55, 55, 170));
// Left and Right margins // Left and Right margins
int outer_margin = rect().width() * 0.12; int outer_margin = screen_.width() * 0.12;
int buttonSize = 36; int buttonSize = 36;
int margin = outer_margin * 0.1; int margin = outer_margin * 0.1;
int max_width = rect().width() - 2 * outer_margin; int max_width = screen_.width() - 2 * outer_margin;
int max_height = rect().height(); int max_height = screen_.height();
scaleImage(max_width, max_height); scaleImage(max_width, max_height);
@ -103,7 +97,7 @@ void ImageOverlayDialog::paintEvent(QPaintEvent *event)
int diff_y = max_height - image_.height(); int diff_y = max_height - image_.height();
content_ = QRect(outer_margin + diff_x / 2, diff_y / 2, image_.width(), image_.height()); content_ = QRect(outer_margin + diff_x / 2, diff_y / 2, image_.width(), image_.height());
close_button_ = QRect(rect().width() - margin - buttonSize, margin, buttonSize, buttonSize); close_button_ = QRect(screen_.width() - margin - buttonSize, margin, buttonSize, buttonSize);
// Draw main content_. // Draw main content_.
painter.drawPixmap(content_, image_); painter.drawPixmap(content_, image_);