Compare commits
3
Commits
master
...
17c9ab5fb5
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
17c9ab5fb5 | ||
|
|
f6c39ab684 | ||
|
|
e48d8e52d2 |
+1
-129
@@ -11,32 +11,11 @@
|
|||||||
#include <QVBoxLayout>
|
#include <QVBoxLayout>
|
||||||
#include <QWindow>
|
#include <QWindow>
|
||||||
|
|
||||||
#ifdef Q_OS_WIN
|
|
||||||
#include "windows.h"
|
|
||||||
void fixWindowStyle(QWidget * that)
|
|
||||||
{
|
|
||||||
HWND hwnd = (HWND)that->winId();
|
|
||||||
|
|
||||||
LONG style = GetWindowLong(hwnd, GWL_STYLE);
|
|
||||||
style |= WS_THICKFRAME | WS_CAPTION | WS_MAXIMIZEBOX | WS_MINIMIZEBOX | WS_SYSMENU;
|
|
||||||
SetWindowLong(hwnd, GWL_STYLE, style);
|
|
||||||
|
|
||||||
SetWindowPos(hwnd, nullptr, 0, 0, 0, 0,
|
|
||||||
SWP_FRAMECHANGED | SWP_NOMOVE | SWP_NOSIZE |
|
|
||||||
SWP_NOZORDER | SWP_NOACTIVATE);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
FramelessWindow::FramelessWindow(QWidget *parent)
|
FramelessWindow::FramelessWindow(QWidget *parent)
|
||||||
: QWidget(parent)
|
: QWidget(parent)
|
||||||
, m_centralLayout(new QVBoxLayout(this))
|
, m_centralLayout(new QVBoxLayout(this))
|
||||||
, m_oldCursorShape(Qt::ArrowCursor)
|
|
||||||
, m_oldEdges()
|
|
||||||
{
|
{
|
||||||
this->setWindowFlags(Qt::Window | Qt::FramelessWindowHint | Qt::WindowMinMaxButtonsHint);
|
this->setWindowFlags(Qt::Window | Qt::WindowTitleHint | Qt::WindowSystemMenuHint | Qt::WindowMinMaxButtonsHint | Qt::WindowCloseButtonHint);
|
||||||
this->setMouseTracking(true);
|
|
||||||
this->setAttribute(Qt::WA_Hover, true);
|
|
||||||
this->installEventFilter(this);
|
|
||||||
|
|
||||||
m_centralLayout->setContentsMargins(QMargins());
|
m_centralLayout->setContentsMargins(QMargins());
|
||||||
}
|
}
|
||||||
@@ -51,110 +30,3 @@ void FramelessWindow::setCentralWidget(QWidget *widget)
|
|||||||
m_centralLayout->addWidget(widget);
|
m_centralLayout->addWidget(widget);
|
||||||
m_centralWidget = widget;
|
m_centralWidget = widget;
|
||||||
}
|
}
|
||||||
|
|
||||||
void FramelessWindow::installResizeCapture(QObject* widget)
|
|
||||||
{
|
|
||||||
widget->installEventFilter(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
void FramelessWindow::showEvent(QShowEvent *event)
|
|
||||||
{
|
|
||||||
#ifdef Q_OS_WIN
|
|
||||||
fixWindowStyle(this);
|
|
||||||
#endif // Q_OS_WIN
|
|
||||||
return QWidget::showEvent(event);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool FramelessWindow::eventFilter(QObject* o, QEvent* e)
|
|
||||||
{
|
|
||||||
switch (e->type()) {
|
|
||||||
case QEvent::HoverMove:
|
|
||||||
{
|
|
||||||
QWidget* wg = qobject_cast<QWidget*>(o);
|
|
||||||
if (wg != nullptr)
|
|
||||||
return mouseHover(static_cast<QHoverEvent*>(e), wg);
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case QEvent::MouseButtonPress:
|
|
||||||
return mousePress(static_cast<QMouseEvent*>(e));
|
|
||||||
}
|
|
||||||
|
|
||||||
return QWidget::eventFilter(o, e);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool FramelessWindow::mouseHover(QHoverEvent* event, QWidget* wg)
|
|
||||||
{
|
|
||||||
if (!isMaximized() && !isFullScreen()) {
|
|
||||||
QWindow* win = window()->windowHandle();
|
|
||||||
Qt::Edges edges = this->getEdgesByPos(wg->mapToGlobal(event->oldPos()), win->frameGeometry());
|
|
||||||
|
|
||||||
// backup & restore cursor shape
|
|
||||||
if (edges && !m_oldEdges)
|
|
||||||
// entering the edge. backup cursor shape
|
|
||||||
m_oldCursorShape = win->cursor().shape();
|
|
||||||
if (!edges && m_oldEdges)
|
|
||||||
// leaving the edge. restore cursor shape
|
|
||||||
win->setCursor(m_oldCursorShape);
|
|
||||||
|
|
||||||
// save the latest edges status
|
|
||||||
m_oldEdges = edges;
|
|
||||||
|
|
||||||
// show resize cursor shape if cursor is within border
|
|
||||||
if (edges) {
|
|
||||||
win->setCursor(this->getCursorByEdge(edges, Qt::ArrowCursor));
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool FramelessWindow::mousePress(QMouseEvent* event)
|
|
||||||
{
|
|
||||||
if (event->buttons() & Qt::LeftButton && !isMaximized() && !isFullScreen()) {
|
|
||||||
QWindow* win = window()->windowHandle();
|
|
||||||
Qt::Edges edges = this->getEdgesByPos(event->globalPosition().toPoint(), win->frameGeometry());
|
|
||||||
if (edges) {
|
|
||||||
win->startSystemResize(edges);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
Qt::CursorShape FramelessWindow::getCursorByEdge(const Qt::Edges& edges, Qt::CursorShape default_cursor)
|
|
||||||
{
|
|
||||||
if ((edges == (Qt::TopEdge | Qt::LeftEdge)) || (edges == (Qt::RightEdge | Qt::BottomEdge)))
|
|
||||||
return Qt::SizeFDiagCursor;
|
|
||||||
else if ((edges == (Qt::TopEdge | Qt::RightEdge)) || (edges == (Qt::LeftEdge | Qt::BottomEdge)))
|
|
||||||
return Qt::SizeBDiagCursor;
|
|
||||||
else if (edges & (Qt::TopEdge | Qt::BottomEdge))
|
|
||||||
return Qt::SizeVerCursor;
|
|
||||||
else if (edges & (Qt::LeftEdge | Qt::RightEdge))
|
|
||||||
return Qt::SizeHorCursor;
|
|
||||||
else
|
|
||||||
return default_cursor;
|
|
||||||
}
|
|
||||||
|
|
||||||
Qt::Edges FramelessWindow::getEdgesByPos(const QPoint gpos, const QRect& winrect)
|
|
||||||
{
|
|
||||||
const int borderWidth = 8;
|
|
||||||
Qt::Edges edges;
|
|
||||||
|
|
||||||
int x = gpos.x() - winrect.x();
|
|
||||||
int y = gpos.y() - winrect.y();
|
|
||||||
|
|
||||||
if (x < borderWidth)
|
|
||||||
edges |= Qt::LeftEdge;
|
|
||||||
if (x > (winrect.width() - borderWidth))
|
|
||||||
edges |= Qt::RightEdge;
|
|
||||||
if (y < borderWidth)
|
|
||||||
edges |= Qt::TopEdge;
|
|
||||||
if (y > (winrect.height() - borderWidth))
|
|
||||||
edges |= Qt::BottomEdge;
|
|
||||||
|
|
||||||
return edges;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|||||||
@@ -18,23 +18,8 @@ public:
|
|||||||
explicit FramelessWindow(QWidget *parent = nullptr);
|
explicit FramelessWindow(QWidget *parent = nullptr);
|
||||||
|
|
||||||
void setCentralWidget(QWidget * widget);
|
void setCentralWidget(QWidget * widget);
|
||||||
void installResizeCapture(QObject* widget);
|
|
||||||
|
|
||||||
protected slots:
|
|
||||||
void showEvent(QShowEvent *event) override;
|
|
||||||
|
|
||||||
protected:
|
|
||||||
bool eventFilter(QObject *o, QEvent *e) override;
|
|
||||||
bool mouseHover(QHoverEvent* event, QWidget* wg);
|
|
||||||
bool mousePress(QMouseEvent* event);
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Qt::Edges m_oldEdges;
|
|
||||||
Qt::CursorShape m_oldCursorShape;
|
|
||||||
|
|
||||||
Qt::CursorShape getCursorByEdge(const Qt::Edges& edges, Qt::CursorShape default_cursor);
|
|
||||||
Qt::Edges getEdgesByPos(const QPoint pos, const QRect& winrect);
|
|
||||||
|
|
||||||
QVBoxLayout * m_centralLayout = nullptr;
|
QVBoxLayout * m_centralLayout = nullptr;
|
||||||
QWidget * m_centralWidget = nullptr; // just a pointer, doesn't take the ownership.
|
QWidget * m_centralWidget = nullptr; // just a pointer, doesn't take the ownership.
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -64,23 +64,6 @@ MainWindow::MainWindow(QWidget *parent)
|
|||||||
|
|
||||||
m_pm->setAutoLoadFilterSuffixes(supportedImageFormats());
|
m_pm->setAutoLoadFilterSuffixes(supportedImageFormats());
|
||||||
|
|
||||||
m_fadeOutAnimation = new QPropertyAnimation(this, "windowOpacity"_ba);
|
|
||||||
m_fadeOutAnimation->setDuration(300);
|
|
||||||
m_fadeOutAnimation->setStartValue(1);
|
|
||||||
m_fadeOutAnimation->setEndValue(0);
|
|
||||||
m_floatUpAnimation = new QPropertyAnimation(this, "geometry"_ba);
|
|
||||||
m_floatUpAnimation->setDuration(300);
|
|
||||||
m_floatUpAnimation->setEasingCurve(QEasingCurve::OutCirc);
|
|
||||||
m_exitAnimationGroup = new QParallelAnimationGroup(this);
|
|
||||||
m_exitAnimationGroup->addAnimation(m_fadeOutAnimation);
|
|
||||||
m_exitAnimationGroup->addAnimation(m_floatUpAnimation);
|
|
||||||
connect(m_exitAnimationGroup, &QParallelAnimationGroup::finished,
|
|
||||||
#ifdef Q_OS_MAC
|
|
||||||
this, &QWidget::hide);
|
|
||||||
#else
|
|
||||||
this, &QWidget::close);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
GraphicsScene * scene = new GraphicsScene(this);
|
GraphicsScene * scene = new GraphicsScene(this);
|
||||||
|
|
||||||
m_graphicsView = new GraphicsView(this);
|
m_graphicsView = new GraphicsView(this);
|
||||||
@@ -104,14 +87,6 @@ MainWindow::MainWindow(QWidget *parent)
|
|||||||
connect(m_graphicsView, &GraphicsView::viewportRectChanged,
|
connect(m_graphicsView, &GraphicsView::viewportRectChanged,
|
||||||
m_gv, &NavigatorView::updateMainViewportRegion);
|
m_gv, &NavigatorView::updateMainViewportRegion);
|
||||||
|
|
||||||
m_closeButton = new ToolButton(true, m_graphicsView);
|
|
||||||
m_closeButton->setIconSize(QSize(32, 32));
|
|
||||||
m_closeButton->setFixedSize(QSize(50, 50));
|
|
||||||
m_closeButton->setIconResourcePath(":/icons/window-close.svg");
|
|
||||||
|
|
||||||
connect(m_closeButton, &QAbstractButton::clicked,
|
|
||||||
this, &MainWindow::closeWindow);
|
|
||||||
|
|
||||||
m_prevButton = new ToolButton(false, m_graphicsView);
|
m_prevButton = new ToolButton(false, m_graphicsView);
|
||||||
m_prevButton->setIconSize(QSize(75, 75));
|
m_prevButton->setIconSize(QSize(75, 75));
|
||||||
m_prevButton->setIconResourcePath(":/icons/go-previous.svg");
|
m_prevButton->setIconResourcePath(":/icons/go-previous.svg");
|
||||||
@@ -141,7 +116,6 @@ MainWindow::MainWindow(QWidget *parent)
|
|||||||
|
|
||||||
m_bottomButtonGroup->setOpacity(0, false);
|
m_bottomButtonGroup->setOpacity(0, false);
|
||||||
m_gv->setOpacity(0, false);
|
m_gv->setOpacity(0, false);
|
||||||
m_closeButton->setOpacity(0, false);
|
|
||||||
|
|
||||||
connect(m_pm, &PlaylistManager::totalCountChanged, this, &MainWindow::updateGalleryButtonsVisibility);
|
connect(m_pm, &PlaylistManager::totalCountChanged, this, &MainWindow::updateGalleryButtonsVisibility);
|
||||||
|
|
||||||
@@ -163,12 +137,6 @@ MainWindow::MainWindow(QWidget *parent)
|
|||||||
Settings::instance()->applyUserShortcuts(this);
|
Settings::instance()->applyUserShortcuts(this);
|
||||||
});
|
});
|
||||||
|
|
||||||
// allow some mouse events can go through these widgets for resizing window.
|
|
||||||
installResizeCapture(m_closeButton);
|
|
||||||
installResizeCapture(m_graphicsView);
|
|
||||||
installResizeCapture(m_graphicsView->viewport());
|
|
||||||
installResizeCapture(m_gv);
|
|
||||||
installResizeCapture(m_gv->viewport());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
MainWindow::~MainWindow()
|
MainWindow::~MainWindow()
|
||||||
@@ -327,7 +295,6 @@ void MainWindow::enterEvent(QEnterEvent *event)
|
|||||||
m_bottomButtonGroup->setOpacity(1);
|
m_bottomButtonGroup->setOpacity(1);
|
||||||
m_gv->setOpacity(1);
|
m_gv->setOpacity(1);
|
||||||
|
|
||||||
m_closeButton->setOpacity(1);
|
|
||||||
m_prevButton->setOpacity(1);
|
m_prevButton->setOpacity(1);
|
||||||
m_nextButton->setOpacity(1);
|
m_nextButton->setOpacity(1);
|
||||||
|
|
||||||
@@ -339,7 +306,6 @@ void MainWindow::leaveEvent(QEvent *event)
|
|||||||
m_bottomButtonGroup->setOpacity(0);
|
m_bottomButtonGroup->setOpacity(0);
|
||||||
m_gv->setOpacity(0);
|
m_gv->setOpacity(0);
|
||||||
|
|
||||||
m_closeButton->setOpacity(0);
|
|
||||||
m_prevButton->setOpacity(0);
|
m_prevButton->setOpacity(0);
|
||||||
m_nextButton->setOpacity(0);
|
m_nextButton->setOpacity(0);
|
||||||
|
|
||||||
@@ -596,17 +562,10 @@ void MainWindow::centerWindow()
|
|||||||
|
|
||||||
void MainWindow::closeWindow()
|
void MainWindow::closeWindow()
|
||||||
{
|
{
|
||||||
QRect windowRect(this->geometry());
|
|
||||||
m_floatUpAnimation->setStartValue(windowRect);
|
|
||||||
m_floatUpAnimation->setEndValue(windowRect.adjusted(0, -80, 0, 0));
|
|
||||||
m_floatUpAnimation->setStartValue(QRect(this->geometry().x(), this->geometry().y(), this->geometry().width(), this->geometry().height()));
|
|
||||||
m_floatUpAnimation->setEndValue(QRect(this->geometry().x(), this->geometry().y()-80, this->geometry().width(), this->geometry().height()));
|
|
||||||
m_exitAnimationGroup->start();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::updateWidgetsPosition()
|
void MainWindow::updateWidgetsPosition()
|
||||||
{
|
{
|
||||||
m_closeButton->move(width() - m_closeButton->width(), 0);
|
|
||||||
m_prevButton->move(25, (height() - m_prevButton->sizeHint().height()) / 2);
|
m_prevButton->move(25, (height() - m_prevButton->sizeHint().height()) / 2);
|
||||||
m_nextButton->move(width() - m_nextButton->sizeHint().width() - 25,
|
m_nextButton->move(width() - m_nextButton->sizeHint().width() - 25,
|
||||||
(height() - m_prevButton->sizeHint().height()) / 2);
|
(height() - m_prevButton->sizeHint().height()) / 2);
|
||||||
@@ -618,7 +577,6 @@ void MainWindow::updateWidgetsPosition()
|
|||||||
void MainWindow::toggleProtectedMode()
|
void MainWindow::toggleProtectedMode()
|
||||||
{
|
{
|
||||||
m_protectedMode = !m_protectedMode;
|
m_protectedMode = !m_protectedMode;
|
||||||
m_closeButton->setVisible(!m_protectedMode);
|
|
||||||
updateGalleryButtonsVisibility();
|
updateGalleryButtonsVisibility();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -115,11 +115,7 @@ private:
|
|||||||
PlaylistManager *m_pm;
|
PlaylistManager *m_pm;
|
||||||
|
|
||||||
QPoint m_oldMousePos;
|
QPoint m_oldMousePos;
|
||||||
QPropertyAnimation *m_fadeOutAnimation;
|
|
||||||
QPropertyAnimation *m_floatUpAnimation;
|
|
||||||
QParallelAnimationGroup *m_exitAnimationGroup;
|
|
||||||
QFileSystemWatcher *m_fileSystemWatcher;
|
QFileSystemWatcher *m_fileSystemWatcher;
|
||||||
ToolButton *m_closeButton;
|
|
||||||
ToolButton *m_prevButton;
|
ToolButton *m_prevButton;
|
||||||
ToolButton *m_nextButton;
|
ToolButton *m_nextButton;
|
||||||
GraphicsView *m_graphicsView;
|
GraphicsView *m_graphicsView;
|
||||||
|
|||||||
Reference in New Issue
Block a user