Compare commits

..
3 Commits
Author SHA1 Message Date
yyc12345 17c9ab5fb5 feat: remove close window animation 2026-07-03 14:09:55 +08:00
yyc12345 f6c39ab684 feat: remove redundant close button 2026-07-03 14:02:34 +08:00
yyc12345 e48d8e52d2 feat: restore system default window instead of custom one.
custom window is not the goal of this project.
we remove it and use system default window instead.
2026-07-03 10:50:50 +08:00
8 changed files with 52 additions and 0 deletions
+2
View File
@@ -62,6 +62,7 @@ void ActionManager::setupAction(MainWindow *mainWindow)
CREATE_NEW_ACTION(mainWindow, actionCopyFilePath); CREATE_NEW_ACTION(mainWindow, actionCopyFilePath);
CREATE_NEW_THEMEICON_ACTION(mainWindow, actionPaste, edit-paste); CREATE_NEW_THEMEICON_ACTION(mainWindow, actionPaste, edit-paste);
CREATE_NEW_THEMEICON_ACTION(mainWindow, actionTrash, edit-delete); CREATE_NEW_THEMEICON_ACTION(mainWindow, actionTrash, edit-delete);
CREATE_NEW_ACTION(mainWindow, actionToggleStayOnTop);
CREATE_NEW_ACTION(mainWindow, actionToggleProtectMode); CREATE_NEW_ACTION(mainWindow, actionToggleProtectMode);
CREATE_NEW_ACTION(mainWindow, actionToggleAvoidResetTransform); CREATE_NEW_ACTION(mainWindow, actionToggleAvoidResetTransform);
CREATE_NEW_ACTION(mainWindow, actionSettings); CREATE_NEW_ACTION(mainWindow, actionSettings);
@@ -104,6 +105,7 @@ void ActionManager::retranslateUi(MainWindow *mainWindow)
actionCopyFilePath->setText(QCoreApplication::translate("MainWindow", "Copy &File Path", nullptr)); actionCopyFilePath->setText(QCoreApplication::translate("MainWindow", "Copy &File Path", nullptr));
actionPaste->setText(QCoreApplication::translate("MainWindow", "&Paste", nullptr)); actionPaste->setText(QCoreApplication::translate("MainWindow", "&Paste", nullptr));
actionTrash->setText(QCoreApplication::translate("MainWindow", "Move to Trash", nullptr)); actionTrash->setText(QCoreApplication::translate("MainWindow", "Move to Trash", nullptr));
actionToggleStayOnTop->setText(QCoreApplication::translate("MainWindow", "Stay on top", nullptr));
actionToggleProtectMode->setText(QCoreApplication::translate("MainWindow", "Protected mode", nullptr)); actionToggleProtectMode->setText(QCoreApplication::translate("MainWindow", "Protected mode", nullptr));
actionToggleAvoidResetTransform->setText(QCoreApplication::translate("MainWindow", "Keep transformation", "The 'transformation' means the flip/rotation status that currently applied to the image view")); actionToggleAvoidResetTransform->setText(QCoreApplication::translate("MainWindow", "Keep transformation", "The 'transformation' means the flip/rotation status that currently applied to the image view"));
actionSettings->setText(QCoreApplication::translate("MainWindow", "Configure...", nullptr)); actionSettings->setText(QCoreApplication::translate("MainWindow", "Configure...", nullptr));
+1
View File
@@ -45,6 +45,7 @@ public:
QAction *actionCopyFilePath; QAction *actionCopyFilePath;
QAction *actionPaste; QAction *actionPaste;
QAction *actionTrash; QAction *actionTrash;
QAction *actionToggleStayOnTop;
QAction *actionToggleProtectMode; QAction *actionToggleProtectMode;
QAction *actionToggleAvoidResetTransform; QAction *actionToggleAvoidResetTransform;
QAction *actionSettings; QAction *actionSettings;
+25
View File
@@ -52,6 +52,10 @@ MainWindow::MainWindow(QWidget *parent)
, m_pm(new PlaylistManager(this)) , m_pm(new PlaylistManager(this))
, m_fileSystemWatcher(new QFileSystemWatcher(this)) , m_fileSystemWatcher(new QFileSystemWatcher(this))
{ {
if (Settings::instance()->stayOnTop()) {
this->setWindowFlag(Qt::WindowStaysOnTopHint);
}
this->setAttribute(Qt::WA_TranslucentBackground, true); this->setAttribute(Qt::WA_TranslucentBackground, true);
this->setMinimumSize(350, 330); this->setMinimumSize(350, 330);
this->setWindowIcon(QIcon(u":/icons/app-icon.svg"_s)); this->setWindowIcon(QIcon(u":/icons/app-icon.svg"_s));
@@ -441,6 +445,10 @@ void MainWindow::contextMenuEvent(QContextMenuEvent *event)
QAction * trash = m_am->actionTrash; QAction * trash = m_am->actionTrash;
QAction * stayOnTopMode = m_am->actionToggleStayOnTop;
stayOnTopMode->setCheckable(true);
stayOnTopMode->setChecked(stayOnTop());
QAction * protectedMode = m_am->actionToggleProtectMode; QAction * protectedMode = m_am->actionToggleProtectMode;
protectedMode->setCheckable(true); protectedMode->setCheckable(true);
protectedMode->setChecked(m_protectedMode); protectedMode->setChecked(m_protectedMode);
@@ -475,6 +483,7 @@ void MainWindow::contextMenuEvent(QContextMenuEvent *event)
menu->addAction(m_am->actionFitByWidth); menu->addAction(m_am->actionFitByWidth);
#endif // 0 #endif // 0
menu->addSeparator(); menu->addSeparator();
menu->addAction(stayOnTopMode);
menu->addAction(protectedMode); menu->addAction(protectedMode);
menu->addAction(avoidResetTransform); menu->addAction(avoidResetTransform);
menu->addSeparator(); menu->addSeparator();
@@ -571,11 +580,22 @@ void MainWindow::toggleProtectedMode()
updateGalleryButtonsVisibility(); updateGalleryButtonsVisibility();
} }
void MainWindow::toggleStayOnTop()
{
setWindowFlag(Qt::WindowStaysOnTopHint, !stayOnTop());
show();
}
void MainWindow::toggleAvoidResetTransform() void MainWindow::toggleAvoidResetTransform()
{ {
m_graphicsView->setAvoidResetTransform(!m_graphicsView->avoidResetTransform()); m_graphicsView->setAvoidResetTransform(!m_graphicsView->avoidResetTransform());
} }
bool MainWindow::stayOnTop() const
{
return windowFlags().testFlag(Qt::WindowStaysOnTopHint);
}
bool MainWindow::canPaste() const bool MainWindow::canPaste() const
{ {
const QMimeData * clipboardData = QApplication::clipboard()->mimeData(); const QMimeData * clipboardData = QApplication::clipboard()->mimeData();
@@ -780,6 +800,11 @@ void MainWindow::on_actionAnimationNextFrame_triggered()
m_graphicsView->scene()->skipAnimationFrame(1); m_graphicsView->scene()->skipAnimationFrame(1);
} }
void MainWindow::on_actionToggleStayOnTop_triggered()
{
toggleStayOnTop();
}
void MainWindow::on_actionToggleProtectMode_triggered() void MainWindow::on_actionToggleProtectMode_triggered()
{ {
toggleProtectedMode(); toggleProtectedMode();
+3
View File
@@ -62,7 +62,9 @@ protected slots:
void closeWindow(); void closeWindow();
void updateWidgetsPosition(); void updateWidgetsPosition();
void toggleProtectedMode(); void toggleProtectedMode();
void toggleStayOnTop();
void toggleAvoidResetTransform(); void toggleAvoidResetTransform();
bool stayOnTop() const;
bool canPaste() const; bool canPaste() const;
void quitAppAction(bool force = false); void quitAppAction(bool force = false);
void toggleFullscreen(); void toggleFullscreen();
@@ -95,6 +97,7 @@ private slots:
void on_actionCopyFilePath_triggered(); void on_actionCopyFilePath_triggered();
void on_actionPaste_triggered(); void on_actionPaste_triggered();
void on_actionTrash_triggered(); void on_actionTrash_triggered();
void on_actionToggleStayOnTop_triggered();
void on_actionToggleProtectMode_triggered(); void on_actionToggleProtectMode_triggered();
void on_actionToggleAvoidResetTransform_triggered(); void on_actionToggleAvoidResetTransform_triggered();
void on_actionSettings_triggered(); void on_actionSettings_triggered();
+11
View File
@@ -45,6 +45,11 @@ Settings *Settings::instance()
return m_settings_instance; return m_settings_instance;
} }
bool Settings::stayOnTop() const
{
return m_qsettings->value("stay_on_top", true).toBool();
}
bool Settings::useLightCheckerboard() const bool Settings::useLightCheckerboard() const
{ {
return m_qsettings->value("use_light_checkerboard", false).toBool(); return m_qsettings->value("use_light_checkerboard", false).toBool();
@@ -96,6 +101,12 @@ Qt::HighDpiScaleFactorRoundingPolicy Settings::hiDpiScaleFactorBehavior() const
return QEnumHelper::fromString<Qt::HighDpiScaleFactorRoundingPolicy>(result, Qt::HighDpiScaleFactorRoundingPolicy::PassThrough); return QEnumHelper::fromString<Qt::HighDpiScaleFactorRoundingPolicy>(result, Qt::HighDpiScaleFactorRoundingPolicy::PassThrough);
} }
void Settings::setStayOnTop(bool on)
{
m_qsettings->setValue("stay_on_top", on);
m_qsettings->sync();
}
void Settings::setUseLightCheckerboard(bool light) void Settings::setUseLightCheckerboard(bool light)
{ {
m_qsettings->setValue("use_light_checkerboard", light); m_qsettings->setValue("use_light_checkerboard", light);
+2
View File
@@ -34,6 +34,7 @@ public:
static Settings *instance(); static Settings *instance();
bool stayOnTop() const;
bool useLightCheckerboard() const; bool useLightCheckerboard() const;
bool loopGallery() const; bool loopGallery() const;
bool svgTiny12Only() const; bool svgTiny12Only() const;
@@ -42,6 +43,7 @@ public:
WindowSizeBehavior initWindowSizeBehavior() const; WindowSizeBehavior initWindowSizeBehavior() const;
Qt::HighDpiScaleFactorRoundingPolicy hiDpiScaleFactorBehavior() const; Qt::HighDpiScaleFactorRoundingPolicy hiDpiScaleFactorBehavior() const;
void setStayOnTop(bool on);
void setUseLightCheckerboard(bool light); void setUseLightCheckerboard(bool light);
void setLoopGallery(bool on); void setLoopGallery(bool on);
void setSvgTiny12Only(bool on); void setSvgTiny12Only(bool on);
+7
View File
@@ -19,6 +19,7 @@
SettingsDialog::SettingsDialog(QWidget *parent) SettingsDialog::SettingsDialog(QWidget *parent)
: QDialog(parent) : QDialog(parent)
, m_stayOnTop(new QCheckBox)
, m_useLightCheckerboard(new QCheckBox) , m_useLightCheckerboard(new QCheckBox)
, m_loopGallery(new QCheckBox) , m_loopGallery(new QCheckBox)
, m_svgTiny12Only(new QCheckBox) , m_svgTiny12Only(new QCheckBox)
@@ -118,6 +119,7 @@ SettingsDialog::SettingsDialog(QWidget *parent)
hidpiDropDown.append(hidpiOption.second); hidpiDropDown.append(hidpiOption.second);
} }
settingsForm->addRow(tr("Stay on top when start-up"), m_stayOnTop);
settingsForm->addRow(tr("Use light-color checkerboard"), m_useLightCheckerboard); settingsForm->addRow(tr("Use light-color checkerboard"), m_useLightCheckerboard);
settingsForm->addRow(tr("Loop the loaded gallery"), m_loopGallery); settingsForm->addRow(tr("Loop the loaded gallery"), m_loopGallery);
settingsForm->addRow(tr("Limit SVG support to SVG Tiny 1.2"), m_svgTiny12Only); settingsForm->addRow(tr("Limit SVG support to SVG Tiny 1.2"), m_svgTiny12Only);
@@ -126,6 +128,7 @@ SettingsDialog::SettingsDialog(QWidget *parent)
settingsForm->addRow(tr("Default window size"), m_initWindowSizeBehavior); settingsForm->addRow(tr("Default window size"), m_initWindowSizeBehavior);
settingsForm->addRow(tr("HiDPI scale factor rounding policy"), m_hiDpiRoundingPolicyBehavior); settingsForm->addRow(tr("HiDPI scale factor rounding policy"), m_hiDpiRoundingPolicyBehavior);
m_stayOnTop->setChecked(Settings::instance()->stayOnTop());
m_useLightCheckerboard->setChecked(Settings::instance()->useLightCheckerboard()); m_useLightCheckerboard->setChecked(Settings::instance()->useLightCheckerboard());
m_loopGallery->setChecked(Settings::instance()->loopGallery()); m_loopGallery->setChecked(Settings::instance()->loopGallery());
m_svgTiny12Only->setChecked(Settings::instance()->svgTiny12Only()); m_svgTiny12Only->setChecked(Settings::instance()->svgTiny12Only());
@@ -155,6 +158,10 @@ SettingsDialog::SettingsDialog(QWidget *parent)
# define QT_CHECKSTATE int # define QT_CHECKSTATE int
#endif // QT_VERSION >= QT_VERSION_CHECK(6, 7, 0) #endif // QT_VERSION >= QT_VERSION_CHECK(6, 7, 0)
connect(m_stayOnTop, &QCHECKBOX_CHECKSTATECHANGED, this, [ = ](QT_CHECKSTATE state){
Settings::instance()->setStayOnTop(state == Qt::Checked);
});
connect(m_useLightCheckerboard, &QCHECKBOX_CHECKSTATECHANGED, this, [ = ](QT_CHECKSTATE state){ connect(m_useLightCheckerboard, &QCHECKBOX_CHECKSTATECHANGED, this, [ = ](QT_CHECKSTATE state){
Settings::instance()->setUseLightCheckerboard(state == Qt::Checked); Settings::instance()->setUseLightCheckerboard(state == Qt::Checked);
}); });
+1
View File
@@ -22,6 +22,7 @@ signals:
public slots: public slots:
private: private:
QCheckBox * m_stayOnTop = nullptr;
QCheckBox * m_useLightCheckerboard = nullptr; QCheckBox * m_useLightCheckerboard = nullptr;
QCheckBox * m_loopGallery = nullptr; QCheckBox * m_loopGallery = nullptr;
QCheckBox * m_svgTiny12Only = nullptr; QCheckBox * m_svgTiny12Only = nullptr;