mirror of
https://github.com/Nheko-Reborn/nheko.git
synced 2024-11-22 11:00:48 +03:00
Fix full screen image viewer on macOS sierra
This commit is contained in:
parent
93e8297b61
commit
4fccc6270e
2 changed files with 17 additions and 27 deletions
|
@ -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_;
|
||||||
};
|
};
|
||||||
|
|
|
@ -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_);
|
||||||
|
|
Loading…
Reference in a new issue