refactor: use UI file for main window

- main window now use UI file for layout.
- remove all manual computed widget position code. use full Qt layout implementation instead.
- remove useless functions in main window
- change style changed slot as private
This commit is contained in:
2026-07-24 14:57:41 +08:00
parent bd35a8c3e0
commit aa13355966
9 changed files with 305 additions and 168 deletions
+6
View File
@@ -78,6 +78,7 @@ set (PPIC_UI_FILES
app/settingsdialog.ui app/settingsdialog.ui
app/aboutdialog.ui app/aboutdialog.ui
app/metadatadialog.ui app/metadatadialog.ui
app/mainwindow.ui
) )
set (PPIC_QRC_FILES set (PPIC_QRC_FILES
@@ -119,6 +120,11 @@ else()
qt_add_translations(${EXE_NAME} ${ADD_TRANSLATIONS_ADDITIONAL_ARGS} TS_FILES ${PPIC_TS_FILES} QM_FILES_OUTPUT_VARIABLE PPIC_QM_FILES) qt_add_translations(${EXE_NAME} ${ADD_TRANSLATIONS_ADDITIONAL_ARGS} TS_FILES ${PPIC_TS_FILES} QM_FILES_OUTPUT_VARIABLE PPIC_QM_FILES)
endif() endif()
# YYC MARK:
# This is essential, otherwise Qt UIC generated UI header file
# can not find our header files if there are custom widgets inside UI file.
target_include_directories(${EXE_NAME} PRIVATE app/)
target_sources(${EXE_NAME} PRIVATE ${PPIC_QM_FILES}) target_sources(${EXE_NAME} PRIVATE ${PPIC_QM_FILES})
target_link_libraries (${EXE_NAME} Qt${QT_VERSION_MAJOR}::Widgets Qt${QT_VERSION_MAJOR}::Svg Qt${QT_VERSION_MAJOR}::SvgWidgets) target_link_libraries (${EXE_NAME} Qt${QT_VERSION_MAJOR}::Widgets Qt${QT_VERSION_MAJOR}::Svg Qt${QT_VERSION_MAJOR}::SvgWidgets)
+7 -1
View File
@@ -8,7 +8,7 @@
#include <QVBoxLayout> #include <QVBoxLayout>
#include <QDebug> #include <QDebug>
BottomButtonGroup::BottomButtonGroup(const std::vector<QAction *> &actionList, QWidget *parent) BottomButtonGroup::BottomButtonGroup(QWidget *parent)
: QGroupBox (parent) : QGroupBox (parent)
{ {
QHBoxLayout * mainLayout = new QHBoxLayout(this); QHBoxLayout * mainLayout = new QHBoxLayout(this);
@@ -25,7 +25,9 @@ QToolButton {
border-style: none; border-style: none;
} }
)#"); )#");
}
void BottomButtonGroup::addActions(const std::vector<QAction *> & actionList) {
for (QAction * action : actionList) { for (QAction * action : actionList) {
// Create button // Create button
QToolButton * btn = new QToolButton(this); QToolButton * btn = new QToolButton(this);
@@ -37,3 +39,7 @@ QToolButton {
} }
updateGeometry(); updateGeometry();
} }
void BottomButtonGroup::addAction(QAction* action) {
addActions({action});
}
+4 -1
View File
@@ -14,7 +14,10 @@ class BottomButtonGroup : public QGroupBox
{ {
Q_OBJECT Q_OBJECT
public: public:
explicit BottomButtonGroup(const std::vector<QAction *> & actionList, QWidget *parent = nullptr); explicit BottomButtonGroup(QWidget *parent = nullptr);
void addActions(const std::vector<QAction *> & actionList);
void addAction(QAction* action);
}; };
#endif // BOTTOMBUTTONGROUP_H #endif // BOTTOMBUTTONGROUP_H
+1 -1
View File
@@ -38,7 +38,7 @@ public:
QPixmap renderToPixmap(); QPixmap renderToPixmap();
public slots: private slots:
void updateStyle(Qt::ColorScheme colorScheme); void updateStyle(Qt::ColorScheme colorScheme);
private: private:
+1 -1
View File
@@ -52,7 +52,7 @@ signals:
void navigatorViewRequired(bool required, QTransform transform); void navigatorViewRequired(bool required, QTransform transform);
void viewportRectChanged(); void viewportRectChanged();
public slots: private slots:
void updateStyle(Qt::ColorScheme colorScheme); void updateStyle(Qt::ColorScheme colorScheme);
private: private:
+105 -144
View File
@@ -3,6 +3,7 @@
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
#include "mainwindow.h" #include "mainwindow.h"
#include "ui_mainwindow.h"
#include "settings.h" #include "settings.h"
#include "bottombuttongroup.h" #include "bottombuttongroup.h"
@@ -37,7 +38,6 @@
#include <QProcess> #include <QProcess>
#include <QDesktopServices> #include <QDesktopServices>
#include <QMessageBox> #include <QMessageBox>
#include <QVBoxLayout>
#ifdef HAVE_QTDBUS #ifdef HAVE_QTDBUS
#include <QDBusInterface> #include <QDBusInterface>
@@ -48,15 +48,13 @@ using namespace Qt::Literals::StringLiterals;
MainWindow::MainWindow(QWidget *parent) MainWindow::MainWindow(QWidget *parent)
: QWidget(parent) : QWidget(parent)
, ui(new QT_PREPEND_NAMESPACE(Ui::MainWindow))
, m_am(new ActionManager) , m_am(new ActionManager)
, m_pm(new PlaylistManager(this)) , m_pm(new PlaylistManager(this))
, m_fileSystemWatcher(new QFileSystemWatcher(this)) , m_fileSystemWatcher(new QFileSystemWatcher(this))
{ {
ui->setupUi(this);
this->setWindowFlags(Qt::Window | Qt::WindowTitleHint | Qt::WindowSystemMenuHint | Qt::WindowMinMaxButtonsHint | Qt::WindowCloseButtonHint); this->setWindowFlags(Qt::Window | Qt::WindowTitleHint | Qt::WindowSystemMenuHint | Qt::WindowMinMaxButtonsHint | Qt::WindowCloseButtonHint);
m_centralLayout = new QVBoxLayout(this);
// YYC MARK:
// 72 px is the height of Windows Photo Viewer's bottom line.
m_centralLayout->setContentsMargins(QMargins(0, 0, 0, 72)); // TODO: This value may be declared as a constant.
// YYC MARK: // YYC MARK:
// Blumis set original value is 350 x 330. // Blumis set original value is 350 x 330.
@@ -66,38 +64,33 @@ MainWindow::MainWindow(QWidget *parent)
this->setWindowIcon(QIcon(u":/icons/app-icon.svg"_s)); this->setWindowIcon(QIcon(u":/icons/app-icon.svg"_s));
this->setAcceptDrops(true); this->setAcceptDrops(true);
// Initialize playlist manager
m_pm->setAllowedSuffixes(supportedImageFormats()); m_pm->setAllowedSuffixes(supportedImageFormats());
// Initialize graphics scene
GraphicsScene * scene = new GraphicsScene(this); GraphicsScene * scene = new GraphicsScene(this);
// Setup graphics view (main photo view)
m_gv = new GraphicsView(this); ui->m_gv->setScene(scene);
m_gv->setScene(scene); // Setup navigator view (right-bottom corner thumbnail view)
m_centralLayout->addWidget(m_gv); ui->m_nav->setScene(scene);
ui->m_nav->setMainView(ui->m_gv);
m_nav = new NavigatorView(this); ui->m_nav->fitInView(ui->m_nav->sceneRect(), Qt::KeepAspectRatio);
// YYC MARK: // Binding graphics and navigator views signals
// Blumia set original value is 220 x 160. connect(ui->m_gv, &GraphicsView::navigatorViewRequired,
// So if we set its height to 72 for respecting the height of Windows Photo Viewer,
// the width should be set to 99 for keeping aspect ratio.
m_nav->setFixedSize(99, 72);
m_nav->setScene(scene);
m_nav->setMainView(m_gv);
m_nav->fitInView(m_nav->sceneRect(), Qt::KeepAspectRatio);
connect(m_gv, &GraphicsView::navigatorViewRequired,
this, [this](bool required, const QTransform & tf){ this, [this](bool required, const QTransform & tf){
m_nav->setTransform(GraphicsView::resetScale(tf)); ui->m_nav->setTransform(GraphicsView::resetScale(tf));
m_nav->fitInView(m_nav->sceneRect(), Qt::KeepAspectRatio); ui->m_nav->fitInView(ui->m_nav->sceneRect(), Qt::KeepAspectRatio);
m_nav->setVisible(required); ui->m_nav->setVisible(required);
m_nav->updateMainViewportRegion(); ui->m_navPH->setVisible(required);
ui->m_nav->updateMainViewportRegion();
}); });
connect(ui->m_gv, &GraphicsView::viewportRectChanged,
ui->m_nav, &NavigatorView::updateMainViewportRegion);
connect(m_gv, &GraphicsView::viewportRectChanged, // Setup action manager
m_nav, &NavigatorView::updateMainViewportRegion);
m_am->setupAction(this); m_am->setupAction(this);
// Setup bottom button group
m_bottomButtonGroup = new BottomButtonGroup({ ui->m_bottomButtonGroup->addActions({
m_am->actionActualSize, m_am->actionActualSize,
m_am->actionFitToScreen, m_am->actionFitToScreen,
m_am->actionZoomIn, m_am->actionZoomIn,
@@ -109,67 +102,59 @@ MainWindow::MainWindow(QWidget *parent)
m_am->actionRotateClockwise, m_am->actionRotateClockwise,
m_am->actionFlipHorizontal, m_am->actionFlipHorizontal,
m_am->actionToggleCheckerboard, m_am->actionToggleCheckerboard,
}, this); });
// Setup right click menus
m_subMenuCopy = new QMenu(this);
m_subMenuCopy->setTitle(tr("&Copy"));
m_subMenuCopy->setIcon(QIcon::fromTheme(QLatin1String("edit-copy")));
{ {
m_subMenuCopy->addAction(m_am->actionCopyPixmap); ui->m_subMenuCopy->addAction(m_am->actionCopyPixmap);
m_subMenuCopy->addAction(m_am->actionCopyFilePath); ui->m_subMenuCopy->addAction(m_am->actionCopyFilePath);
}
{
ui->m_subMenuTransform->addAction(m_am->actionActualSize);
ui->m_subMenuTransform->addAction(m_am->actionFitToScreen);
ui->m_subMenuTransform->addAction(m_am->actionFitByWidth);
ui->m_subMenuTransform->addAction(m_am->actionFitByHeight);
ui->m_subMenuTransform->addAction(m_am->actionZoomIn);
ui->m_subMenuTransform->addAction(m_am->actionZoomOut);
ui->m_subMenuTransform->addSeparator();
ui->m_subMenuTransform->addAction(m_am->actionFlipHorizontal);
ui->m_subMenuTransform->addAction(m_am->actionFlipVertical);
ui->m_subMenuTransform->addAction(m_am->actionRotateClockwise);
ui->m_subMenuTransform->addAction(m_am->actionRotateCounterClockwise);
}
{
ui->m_menu->addMenu(ui->m_subMenuCopy);
ui->m_menu->addSeparator();
ui->m_menu->addAction(m_am->actionPrevPicture);
ui->m_menu->addAction(m_am->actionNextPicture);
ui->m_menu->addSeparator();
ui->m_menu->addMenu(ui->m_subMenuTransform);
ui->m_menu->addSeparator();
ui->m_menu->addAction(m_am->actionToggleAvoidResetTransform);
ui->m_menu->addAction(m_am->actionToggleCheckerboard);
ui->m_menu->addAction(m_am->actionTogglePauseAnimation);
ui->m_menu->addAction(m_am->actionAnimationNextFrame);
ui->m_menu->addSeparator();
ui->m_menu->addAction(m_am->actionTrash);
ui->m_menu->addAction(m_am->actionLocateInFileManager);
ui->m_menu->addAction(m_am->actionProperties);
ui->m_menu->addSeparator();
ui->m_menu->addAction(m_am->actionSettings);
ui->m_menu->addAction(m_am->actionHelp);
} }
m_subMenuTransform = new QMenu(this); // Connect playlist manager and file watcher signals for photo browsering.
m_subMenuTransform->setTitle(tr("&Transform"));
{
m_subMenuTransform->addAction(m_am->actionActualSize);
m_subMenuTransform->addAction(m_am->actionFitToScreen);
m_subMenuTransform->addAction(m_am->actionFitByWidth);
m_subMenuTransform->addAction(m_am->actionFitByHeight);
m_subMenuTransform->addAction(m_am->actionZoomIn);
m_subMenuTransform->addAction(m_am->actionZoomOut);
m_subMenuTransform->addSeparator();
m_subMenuTransform->addAction(m_am->actionFlipHorizontal);
m_subMenuTransform->addAction(m_am->actionFlipVertical);
m_subMenuTransform->addAction(m_am->actionRotateClockwise);
m_subMenuTransform->addAction(m_am->actionRotateCounterClockwise);
}
m_menu = new QMenu(this);
{
m_menu->addMenu(m_subMenuCopy);
m_menu->addSeparator();
m_menu->addAction(m_am->actionPrevPicture);
m_menu->addAction(m_am->actionNextPicture);
m_menu->addSeparator();
m_menu->addMenu(m_subMenuTransform);
m_menu->addSeparator();
m_menu->addAction(m_am->actionToggleAvoidResetTransform);
m_menu->addAction(m_am->actionToggleCheckerboard);
m_menu->addAction(m_am->actionTogglePauseAnimation);
m_menu->addAction(m_am->actionAnimationNextFrame);
m_menu->addSeparator();
m_menu->addAction(m_am->actionTrash);
m_menu->addAction(m_am->actionLocateInFileManager);
m_menu->addAction(m_am->actionProperties);
m_menu->addSeparator();
m_menu->addAction(m_am->actionSettings);
m_menu->addAction(m_am->actionHelp);
}
connect(m_pm, &PlaylistManager::playlistChanged, this, std::bind(&MainWindow::updateActionState, this)); connect(m_pm, &PlaylistManager::playlistChanged, this, std::bind(&MainWindow::updateActionState, this));
connect(m_pm, &PlaylistManager::playlistChanged, this, std::bind(&MainWindow::galleryCurrent, this, false)); connect(m_pm, &PlaylistManager::playlistChanged, this, std::bind(&MainWindow::galleryCurrent, this, false));
@@ -179,10 +164,7 @@ MainWindow::MainWindow(QWidget *parent)
QTimer::singleShot(500, this, std::bind(&MainWindow::galleryCurrent, this, true)); QTimer::singleShot(500, this, std::bind(&MainWindow::galleryCurrent, this, true));
}); });
QShortcut * fullscreenShorucut = new QShortcut(QKeySequence(QKeySequence::FullScreen), this); // Change window location
connect(fullscreenShorucut, &QShortcut::activated,
this, &MainWindow::toggleFullscreen);
centerWindow(); centerWindow();
QTimer::singleShot(0, this, [this](){ QTimer::singleShot(0, this, [this](){
@@ -193,19 +175,19 @@ MainWindow::MainWindow(QWidget *parent)
MainWindow::~MainWindow() MainWindow::~MainWindow()
{ {
delete ui;
} }
void MainWindow::showFiles(const QStringList &files) void MainWindow::showFiles(const QStringList &files)
{ {
m_pm->loadPlaylist(files); m_pm->loadPlaylist(files);
m_nav->fitInView(m_nav->sceneRect(), Qt::KeepAspectRatio); ui->m_nav->fitInView(ui->m_nav->sceneRect(), Qt::KeepAspectRatio);
} }
void MainWindow::showFiles(const QList<QUrl>& urls) void MainWindow::showFiles(const QList<QUrl>& urls)
{ {
m_pm->loadPlaylist(urls); m_pm->loadPlaylist(urls);
m_nav->fitInView(m_nav->sceneRect(), Qt::KeepAspectRatio); ui->m_nav->fitInView(ui->m_nav->sceneRect(), Qt::KeepAspectRatio);
} }
void MainWindow::initWindowSize() void MainWindow::initWindowSize()
@@ -230,10 +212,10 @@ void MainWindow::adjustWindowSizeBySceneRect()
{ {
if (m_pm->totalCount() < 1) return; if (m_pm->totalCount() < 1) return;
QSize sceneSize = m_gv->sceneRect().toRect().size(); QSize sceneSize = ui->m_gv->sceneRect().toRect().size();
QSize sceneSizeWithMargins = sceneSize + QSize(130, 125); QSize sceneSizeWithMargins = sceneSize + QSize(130, 125);
if (m_gv->scaleFactor() < 1 || size().expandedTo(sceneSizeWithMargins) != size()) { if (ui->m_gv->scaleFactor() < 1 || size().expandedTo(sceneSizeWithMargins) != size()) {
// if it scaled down by the resize policy: // if it scaled down by the resize policy:
QSize screenSize = qApp->screenAt(QCursor::pos())->availableSize(); QSize screenSize = qApp->screenAt(QCursor::pos())->availableSize();
if (screenSize.expandedTo(sceneSize) == screenSize) { if (screenSize.expandedTo(sceneSize) == screenSize) {
@@ -247,7 +229,7 @@ void MainWindow::adjustWindowSizeBySceneRect()
// The old window size may cause fitInView call from resize() and the // The old window size may cause fitInView call from resize() and the
// above resize() call won't reset the scale back to 1:1, so we // above resize() call won't reset the scale back to 1:1, so we
// just call resetScale() here to ensure the thing is no longer scaled. // just call resetScale() here to ensure the thing is no longer scaled.
m_gv->resetScale(); ui->m_gv->resetScale();
centerWindow(); centerWindow();
} else { } else {
// toggle maximum // toggle maximum
@@ -288,13 +270,13 @@ void MainWindow::galleryCurrent(bool fromFileWatcher)
auto index = m_pm->currentIndex(); auto index = m_pm->currentIndex();
if (index.has_value()) { if (index.has_value()) {
QString localFilePath = m_pm->localFileByIndex(*index); QString localFilePath = m_pm->localFileByIndex(*index);
m_gv->showFileFromPath(localFilePath); ui->m_gv->showFileFromPath(localFilePath);
if (!fromFileWatcher) { if (!fromFileWatcher) {
updateFileWatcher(localFilePath); updateFileWatcher(localFilePath);
setWindowTitle(m_pm->urlByIndex(*index).fileName()); setWindowTitle(m_pm->urlByIndex(*index).fileName());
} }
} else { } else {
m_gv->showText(tr("Drag image here")); ui->m_gv->showText(tr("Drag image here"));
setWindowTitle(QString()); setWindowTitle(QString());
updateFileWatcher(); updateFileWatcher();
} }
@@ -315,13 +297,6 @@ QStringList MainWindow::supportedImageFormats()
return formatFilters; return formatFilters;
} }
void MainWindow::showEvent(QShowEvent *event)
{
updateWidgetsPosition();
return QWidget::showEvent(event);
}
void MainWindow::mouseDoubleClickEvent(QMouseEvent *event) void MainWindow::mouseDoubleClickEvent(QMouseEvent *event)
{ {
// The forward/back mouse button can also used to trigger a mouse double-click event // The forward/back mouse button can also used to trigger a mouse double-click event
@@ -388,16 +363,9 @@ void MainWindow::wheelEvent(QWheelEvent *event)
} }
} }
void MainWindow::resizeEvent(QResizeEvent *event)
{
updateWidgetsPosition();
return QWidget::resizeEvent(event);
}
void MainWindow::contextMenuEvent(QContextMenuEvent *event) void MainWindow::contextMenuEvent(QContextMenuEvent *event)
{ {
m_menu->exec(mapToGlobal(event->pos())); ui->m_menu->exec(mapToGlobal(event->pos()));
return QWidget::contextMenuEvent(event); return QWidget::contextMenuEvent(event);
} }
@@ -426,7 +394,7 @@ void MainWindow::dropEvent(QDropEvent *event)
if (mimeData->hasUrls()) { if (mimeData->hasUrls()) {
showFiles(mimeData->urls()); showFiles(mimeData->urls());
} else { } else {
m_gv->showText(tr("Not supported mimedata: %1").arg(mimeData->formats().first())); ui->m_gv->showText(tr("Not supported mimedata: %1").arg(mimeData->formats().first()));
} }
} }
@@ -446,16 +414,9 @@ void MainWindow::closeWindow()
{ {
} }
void MainWindow::updateWidgetsPosition()
{
m_bottomButtonGroup->move((width() - m_bottomButtonGroup->width()) / 2,
(72 - m_bottomButtonGroup->height()) / 2 + (height() - 72));
m_nav->move(width() - m_nav->width(), height() - m_nav->height());
}
void MainWindow::toggleAvoidResetTransform() void MainWindow::toggleAvoidResetTransform()
{ {
m_gv->setAvoidResetTransform(!m_gv->isAvoidResetTransform()); ui->m_gv->setAvoidResetTransform(!ui->m_gv->isAvoidResetTransform());
} }
void MainWindow::toggleFullscreen() void MainWindow::toggleFullscreen()
@@ -486,7 +447,7 @@ QSize MainWindow::sizeHint() const
void MainWindow::on_actionCopyPixmap_triggered() void MainWindow::on_actionCopyPixmap_triggered()
{ {
QClipboard *cb = QApplication::clipboard(); QClipboard *cb = QApplication::clipboard();
cb->setPixmap(m_gv->scene()->renderToPixmap()); cb->setPixmap(ui->m_gv->scene()->renderToPixmap());
} }
void MainWindow::on_actionCopyFilePath_triggered() void MainWindow::on_actionCopyFilePath_triggered()
@@ -510,58 +471,58 @@ void MainWindow::on_actionNextPicture_triggered()
void MainWindow::on_actionActualSize_triggered() void MainWindow::on_actionActualSize_triggered()
{ {
m_gv->resetScale(); ui->m_gv->resetScale();
m_gv->setEnableAutoFitToScreen(false); ui->m_gv->setEnableAutoFitToScreen(false);
} }
void MainWindow::on_actionFitToScreen_triggered() void MainWindow::on_actionFitToScreen_triggered()
{ {
m_gv->fitInView(m_nav->sceneRect(), Qt::KeepAspectRatio); ui->m_gv->fitInView(ui->m_nav->sceneRect(), Qt::KeepAspectRatio);
m_gv->setEnableAutoFitToScreen(m_gv->scaleFactor() <= 1); ui->m_gv->setEnableAutoFitToScreen(ui->m_gv->scaleFactor() <= 1);
} }
void MainWindow::on_actionFitByWidth_triggered() void MainWindow::on_actionFitByWidth_triggered()
{ {
m_gv->fitByOrientation(Qt::Orientation::Horizontal); ui->m_gv->fitByOrientation(Qt::Orientation::Horizontal);
} }
void MainWindow::on_actionFitByHeight_triggered() void MainWindow::on_actionFitByHeight_triggered()
{ {
m_gv->fitByOrientation(Qt::Orientation::Vertical); ui->m_gv->fitByOrientation(Qt::Orientation::Vertical);
} }
void MainWindow::on_actionZoomIn_triggered() void MainWindow::on_actionZoomIn_triggered()
{ {
if (m_gv->scaleFactor() < 1000) { if (ui->m_gv->scaleFactor() < 1000) {
m_gv->zoomView(1.25); ui->m_gv->zoomView(1.25);
} }
} }
void MainWindow::on_actionZoomOut_triggered() void MainWindow::on_actionZoomOut_triggered()
{ {
m_gv->zoomView(0.8); ui->m_gv->zoomView(0.8);
} }
void MainWindow::on_actionFlipHorizontal_triggered() void MainWindow::on_actionFlipHorizontal_triggered()
{ {
m_gv->flipView(true); ui->m_gv->flipView(true);
} }
void MainWindow::on_actionFlipVertical_triggered() void MainWindow::on_actionFlipVertical_triggered()
{ {
m_gv->flipView(false); ui->m_gv->flipView(false);
} }
void MainWindow::on_actionRotateClockwise_triggered() void MainWindow::on_actionRotateClockwise_triggered()
{ {
m_gv->rotateView(true); ui->m_gv->rotateView(true);
m_gv->displayScene(); ui->m_gv->displayScene();
} }
void MainWindow::on_actionRotateCounterClockwise_triggered() void MainWindow::on_actionRotateCounterClockwise_triggered()
{ {
m_gv->rotateView(false); ui->m_gv->rotateView(false);
m_gv->displayScene(); ui->m_gv->displayScene();
} }
void MainWindow::on_actionToggleAvoidResetTransform_triggered() void MainWindow::on_actionToggleAvoidResetTransform_triggered()
@@ -571,17 +532,17 @@ void MainWindow::on_actionToggleAvoidResetTransform_triggered()
void MainWindow::on_actionToggleCheckerboard_triggered() void MainWindow::on_actionToggleCheckerboard_triggered()
{ {
m_gv->toggleCheckerboard(QGuiApplication::queryKeyboardModifiers().testFlag(Qt::ShiftModifier)); ui->m_gv->toggleCheckerboard(QGuiApplication::queryKeyboardModifiers().testFlag(Qt::ShiftModifier));
} }
void MainWindow::on_actionTogglePauseAnimation_triggered() void MainWindow::on_actionTogglePauseAnimation_triggered()
{ {
m_gv->scene()->togglePauseAnimation(); ui->m_gv->scene()->togglePauseAnimation();
} }
void MainWindow::on_actionAnimationNextFrame_triggered() void MainWindow::on_actionAnimationNextFrame_triggered()
{ {
m_gv->scene()->skipAnimationFrame(1); ui->m_gv->scene()->skipAnimationFrame(1);
} }
void MainWindow::on_actionTrash_triggered() void MainWindow::on_actionTrash_triggered()
@@ -683,5 +644,5 @@ bool MainWindow::updateFileWatcher(const QString &basePath)
} }
void MainWindow::updateActionState() { void MainWindow::updateActionState() {
m_am->updateActionState(m_pm, m_gv); m_am->updateActionState(m_pm, ui->m_gv);
} }
+7 -20
View File
@@ -5,22 +5,18 @@
#ifndef MAINWINDOW_H #ifndef MAINWINDOW_H
#define MAINWINDOW_H #define MAINWINDOW_H
#include <QParallelAnimationGroup> #include <QWidget>
#include <QPropertyAnimation>
#include <QPushButton>
QT_BEGIN_NAMESPACE QT_BEGIN_NAMESPACE
class QMenu;
class QVBoxLayout;
class QGraphicsView;
class QFileSystemWatcher; class QFileSystemWatcher;
namespace Ui {
class MainWindow;
}
QT_END_NAMESPACE QT_END_NAMESPACE
class ActionManager; class ActionManager;
class PlaylistManager; class PlaylistManager;
class GraphicsView;
class NavigatorView;
class BottomButtonGroup;
class MainWindow : public QWidget class MainWindow : public QWidget
{ {
Q_OBJECT Q_OBJECT
@@ -42,10 +38,8 @@ public:
static QStringList supportedImageFormats(); static QStringList supportedImageFormats();
protected slots: protected slots:
void showEvent(QShowEvent *event) override;
void mouseDoubleClickEvent(QMouseEvent *event) override; void mouseDoubleClickEvent(QMouseEvent *event) override;
void wheelEvent(QWheelEvent *event) override; void wheelEvent(QWheelEvent *event) override;
void resizeEvent(QResizeEvent *event) override;
void contextMenuEvent(QContextMenuEvent *event) override; void contextMenuEvent(QContextMenuEvent *event) override;
void dragEnterEvent(QDragEnterEvent *event) override; void dragEnterEvent(QDragEnterEvent *event) override;
void dragMoveEvent(QDragMoveEvent *event) override; void dragMoveEvent(QDragMoveEvent *event) override;
@@ -53,7 +47,6 @@ protected slots:
void centerWindow(); void centerWindow();
void closeWindow(); void closeWindow();
void updateWidgetsPosition();
void toggleAvoidResetTransform(); void toggleAvoidResetTransform();
void toggleFullscreen(); void toggleFullscreen();
void toggleMaximize(); void toggleMaximize();
@@ -97,17 +90,11 @@ private:
void updateActionState(); void updateActionState();
private: private:
QT_PREPEND_NAMESPACE(Ui::MainWindow) *ui;
ActionManager *m_am; ActionManager *m_am;
PlaylistManager *m_pm; PlaylistManager *m_pm;
GraphicsView *m_gv;
NavigatorView *m_nav;
QMenu *m_menu;
QMenu *m_subMenuCopy;
QMenu *m_subMenuTransform;
QVBoxLayout * m_centralLayout = nullptr;
QFileSystemWatcher *m_fileSystemWatcher; QFileSystemWatcher *m_fileSystemWatcher;
BottomButtonGroup *m_bottomButtonGroup;
}; };
#endif // MAINWINDOW_H #endif // MAINWINDOW_H
+172
View File
@@ -0,0 +1,172 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>MainWindow</class>
<widget class="QWidget" name="MainWindow">
<property name="windowModality">
<enum>Qt::NonModal</enum>
</property>
<property name="minimumSize">
<size>
<width>640</width>
<height>480</height>
</size>
</property>
<property name="acceptDrops">
<bool>true</bool>
</property>
<layout class="QVBoxLayout" name="m_centralLayout">
<property name="spacing">
<number>0</number>
</property>
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="GraphicsView" name="m_gv">
<property name="frameShape">
<enum>QFrame::NoFrame</enum>
</property>
<property name="verticalScrollBarPolicy">
<enum>Qt::ScrollBarAlwaysOff</enum>
</property>
<property name="horizontalScrollBarPolicy">
<enum>Qt::ScrollBarAlwaysOff</enum>
</property>
</widget>
</item>
<item>
<widget class="QWidget" name="bottomBar" native="true">
<property name="minimumSize">
<size>
<width>0</width>
<height>72</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>16777215</width>
<height>72</height>
</size>
</property>
<layout class="QHBoxLayout" name="bottomBarLayout">
<property name="spacing">
<number>0</number>
</property>
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QWidget" name="m_navPH" native="true">
<property name="minimumSize">
<size>
<width>99</width>
<height>72</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>99</width>
<height>72</height>
</size>
</property>
</widget>
</item>
<item>
<spacer name="leftSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</spacer>
</item>
<item>
<widget class="BottomButtonGroup" name="m_bottomButtonGroup"/>
</item>
<item>
<spacer name="rightSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</spacer>
</item>
<item>
<widget class="NavigatorView" name="m_nav">
<property name="minimumSize">
<size>
<width>99</width>
<height>72</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>99</width>
<height>72</height>
</size>
</property>
<property name="frameShape">
<enum>QFrame::NoFrame</enum>
</property>
<property name="verticalScrollBarPolicy">
<enum>Qt::ScrollBarAlwaysOff</enum>
</property>
<property name="horizontalScrollBarPolicy">
<enum>Qt::ScrollBarAlwaysOff</enum>
</property>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
<widget class="QMenu" name="m_subMenuCopy">
<property name="title">
<string>&amp;Copy</string>
</property>
<property name="icon">
<iconset theme="edit-copy"/>
</property>
</widget>
<widget class="QMenu" name="m_subMenuTransform">
<property name="title">
<string>&amp;Transform</string>
</property>
</widget>
<widget class="QMenu" name="m_menu"/>
</widget>
<customwidgets>
<customwidget>
<class>GraphicsView</class>
<extends>QGraphicsView</extends>
<header>graphicsview.h</header>
</customwidget>
<customwidget>
<class>NavigatorView</class>
<extends>QGraphicsView</extends>
<header>navigatorview.h</header>
</customwidget>
<customwidget>
<class>BottomButtonGroup</class>
<extends>QGroupBox</extends>
<header>bottombuttongroup.h</header>
</customwidget>
</customwidgets>
<resources/>
<connections/>
</ui>
+2
View File
@@ -18,6 +18,8 @@ public:
public slots: public slots:
void updateMainViewportRegion(); void updateMainViewportRegion();
private slots:
void updateStyle(Qt::ColorScheme colorScheme); void updateStyle(Qt::ColorScheme colorScheme);
private: private: