File indexing completed on 2025-03-09 03:52:10

0001 /* ============================================================
0002  *
0003  * This file is a part of digiKam project
0004  * https://www.digikam.org
0005  *
0006  * Date        : 2004-10-05
0007  * Description : a tool bar for slideshow
0008  *
0009  * SPDX-FileCopyrightText: 2004-2005 by Renchi Raju <renchi dot raju at gmail dot com>
0010  * SPDX-FileCopyrightText: 2006-2024 by Gilles Caulier <caulier dot gilles at gmail dot com>
0011  * SPDX-FileCopyrightText: 2019-2020 by Minh Nghia Duong <minhnghiaduong997 at gmail dot com>
0012  * SPDX-FileCopyrightText:      2021 by Phuoc Khanh Le <phuockhanhnk94 at gmail dot com>
0013  *
0014  * SPDX-License-Identifier: GPL-2.0-or-later
0015  *
0016  * ============================================================ */
0017 
0018 #include "slidetoolbar.h"
0019 
0020 // Qt includes
0021 
0022 #include <QApplication>
0023 #include <QActionGroup>
0024 #include <QToolButton>
0025 #include <QPixmap>
0026 #include <QScreen>
0027 #include <QMenu>
0028 #include <QInputDialog>
0029 #include <QMessageBox>
0030 
0031 // KDE includes
0032 
0033 #include <klocalizedstring.h>
0034 
0035 // Local includes
0036 
0037 #include "dpluginaboutdlg.h"
0038 #include "digikam_debug.h"
0039 #include "setupslideshow_dialog.h"
0040 
0041 namespace DigikamGenericSlideShowPlugin
0042 {
0043 
0044 class Q_DECL_HIDDEN SlideToolBar::Private
0045 {
0046 public:
0047 
0048     explicit Private()
0049       : playBtn         (nullptr),
0050         prevBtn         (nullptr),
0051         nextBtn         (nullptr),
0052         stopBtn         (nullptr),
0053         delayBtn        (nullptr),
0054         deleteBtn       (nullptr),
0055         setupBtn        (nullptr),
0056         screenSelectBtn (nullptr),
0057         currentlyPause  (false),
0058         settings        (nullptr)
0059     {
0060     }
0061 
0062     QToolButton*          playBtn;
0063     QToolButton*          prevBtn;
0064     QToolButton*          nextBtn;
0065     QToolButton*          stopBtn;
0066     QToolButton*          delayBtn;
0067     QToolButton*          deleteBtn;
0068     QToolButton*          setupBtn;
0069     QToolButton*          screenSelectBtn;
0070 
0071     bool                  currentlyPause;
0072 
0073     SlideShowSettings*    settings;
0074 };
0075 
0076 SlideToolBar::SlideToolBar(SlideShowSettings* const settings, QWidget* const parent)
0077     : DHBox(parent),
0078       d    (new Private)
0079 {
0080     setMouseTracking(true);
0081     setContentsMargins(QMargins());
0082 
0083     d->settings       = settings;
0084 
0085     d->playBtn        = new QToolButton(this);
0086     d->prevBtn        = new QToolButton(this);
0087     d->nextBtn        = new QToolButton(this);
0088     d->stopBtn        = new QToolButton(this);
0089     d->delayBtn       = new QToolButton(this);
0090     d->deleteBtn      = new QToolButton(this);
0091     d->setupBtn       = new QToolButton(this);
0092 
0093     d->playBtn->setCheckable(true);
0094     d->playBtn->setChecked(!d->settings->autoPlayEnabled);
0095     d->playBtn->setFocusPolicy(Qt::NoFocus);
0096     d->prevBtn->setFocusPolicy(Qt::NoFocus);
0097     d->nextBtn->setFocusPolicy(Qt::NoFocus);
0098     d->stopBtn->setFocusPolicy(Qt::NoFocus);
0099     d->delayBtn->setFocusPolicy(Qt::NoFocus);
0100     d->deleteBtn->setFocusPolicy(Qt::NoFocus);
0101     d->setupBtn->setFocusPolicy(Qt::NoFocus);
0102 
0103     QSize s(32, 32);
0104     d->playBtn->setIconSize(s);
0105     d->prevBtn->setIconSize(s);
0106     d->nextBtn->setIconSize(s);
0107     d->stopBtn->setIconSize(s);
0108     d->delayBtn->setIconSize(s);
0109     d->deleteBtn->setIconSize(s);
0110     d->setupBtn->setIconSize(s);
0111 
0112     QString iconString = d->settings->autoPlayEnabled ? QLatin1String("media-playback-pause")
0113                                                       : QLatin1String("media-playback-start");
0114     d->playBtn->setIcon(QIcon::fromTheme(iconString));
0115     d->prevBtn->setIcon(QIcon::fromTheme(QLatin1String("media-skip-backward")));
0116     d->nextBtn->setIcon(QIcon::fromTheme(QLatin1String("media-skip-forward")));
0117     d->stopBtn->setIcon(QIcon::fromTheme(QLatin1String("media-playback-stop")));
0118     d->delayBtn->setIcon(QIcon::fromTheme(QLatin1String("appointment-new")));
0119     d->deleteBtn->setIcon(QIcon::fromTheme(QLatin1String("user-trash")));
0120     d->setupBtn->setIcon(QIcon::fromTheme(QLatin1String("systemsettings")));
0121 
0122     int num = qApp->screens().count();
0123 
0124     if (num > 1)
0125     {
0126         d->screenSelectBtn        = new QToolButton(this);
0127         QMenu* const screenMenu   = new QMenu(d->screenSelectBtn);
0128         d->screenSelectBtn->setToolTip(i18n("Switch Screen"));
0129         d->screenSelectBtn->setIconSize(s);
0130         d->screenSelectBtn->setIcon(QIcon::fromTheme(QLatin1String("video-display")));
0131         d->screenSelectBtn->setMenu(screenMenu);
0132         d->screenSelectBtn->setPopupMode(QToolButton::InstantPopup);
0133         d->screenSelectBtn->setFocusPolicy(Qt::NoFocus);
0134 
0135         QActionGroup* const group = new QActionGroup(screenMenu);
0136         group->setExclusive(true);
0137 
0138         for (int i = 0 ; i < num ; ++i)
0139         {
0140             QString model      = qApp->screens().at(i)->model();
0141             QAction* const act = screenMenu->addAction(i18nc("%1 is the screen number (0, 1, ...)", "Screen %1", i) +
0142                                                        QString::fromUtf8(" (%1)").arg(model.left(model.length() - 1)));
0143             act->setData(QVariant::fromValue(i));
0144             act->setCheckable(true);
0145             group->addAction(act);
0146 
0147             if (i == d->settings->slideScreen)
0148             {
0149                act->setChecked(true);
0150             }
0151         }
0152 
0153         connect(screenMenu, SIGNAL(triggered(QAction*)),
0154                 this, SLOT(slotScreenSelected(QAction*)));
0155     }
0156 
0157     connect(d->playBtn, SIGNAL(toggled(bool)),
0158             this, SLOT(slotPlayBtnToggled()));
0159 
0160     connect(d->nextBtn, SIGNAL(clicked()),
0161             this, SLOT(slotNexPrevClicked()));
0162 
0163     connect(d->prevBtn, SIGNAL(clicked()),
0164             this, SLOT(slotNexPrevClicked()));
0165 
0166     connect(d->nextBtn, SIGNAL(clicked()),
0167             this, SIGNAL(signalNext()));
0168 
0169     connect(d->prevBtn, SIGNAL(clicked()),
0170             this, SIGNAL(signalPrev()));
0171 
0172     connect(d->stopBtn, SIGNAL(clicked()),
0173             this, SIGNAL(signalClose()));
0174 
0175     connect(d->delayBtn, SIGNAL(clicked()),
0176             this, SLOT(slotChangeDelayButtonPressed()));
0177 
0178     connect(d->deleteBtn, SIGNAL(clicked()),
0179             this, SLOT(slotRemoveImage()));
0180 
0181     connect(d->setupBtn, SIGNAL(clicked()),
0182             this, SLOT(slotMenuSlideShowConfiguration()));
0183 }
0184 
0185 SlideToolBar::~SlideToolBar()
0186 {
0187     delete d;
0188 }
0189 
0190 bool SlideToolBar::isPaused() const
0191 {
0192     return d->playBtn->isChecked();
0193 }
0194 
0195 void SlideToolBar::pause(bool val)
0196 {
0197     if (val == isPaused())
0198     {
0199         return;
0200     }
0201 
0202     d->playBtn->setChecked(val);
0203     slotPlayBtnToggled();
0204 }
0205 
0206 void SlideToolBar::setEnabledPlay(bool val)
0207 {
0208     d->playBtn->setEnabled(val);
0209 }
0210 
0211 void SlideToolBar::setEnabledNext(bool val)
0212 {
0213     d->nextBtn->setEnabled(val);
0214 }
0215 
0216 void SlideToolBar::setEnabledPrev(bool val)
0217 {
0218     d->prevBtn->setEnabled(val);
0219 }
0220 
0221 void SlideToolBar::slotPlayBtnToggled()
0222 {
0223     if (d->playBtn->isChecked())
0224     {
0225         d->playBtn->setIcon(QIcon::fromTheme(QLatin1String("media-playback-start")));
0226 
0227         Q_EMIT signalPause();
0228     }
0229     else
0230     {
0231         d->playBtn->setIcon(QIcon::fromTheme(QLatin1String("media-playback-pause")));
0232 
0233         Q_EMIT signalPlay();
0234     }
0235 }
0236 
0237 void SlideToolBar::slotChangeDelayButtonPressed()
0238 {
0239     bool ok;
0240     int delay    = d->settings->delay;
0241     bool running = (!isPaused() && d->playBtn->isEnabled());
0242 
0243     if (running)
0244     {
0245         d->playBtn->animateClick();
0246     }
0247 
0248     delay = QInputDialog::getInt(this, i18nc("@title:window", "Specify Delay for Slide Show"),
0249                                        i18n("Delay:"), delay, 1, 3600, 1, &ok);
0250 
0251     if (ok)
0252     {
0253         d->settings->delay = delay;
0254     }
0255 
0256     if (running)
0257     {
0258         d->playBtn->animateClick();
0259     }
0260 }
0261 
0262 void SlideToolBar::slotNexPrevClicked()
0263 {
0264     if (!d->playBtn->isChecked())
0265     {
0266         d->playBtn->setChecked(true);
0267         d->playBtn->setIcon(QIcon::fromTheme(QLatin1String("media-playback-start")));
0268 
0269         Q_EMIT signalPause();
0270     }
0271 }
0272 
0273 void SlideToolBar::slotMenuSlideShowConfiguration()
0274 {
0275     d->currentlyPause = isPaused();
0276 
0277     if (!d->currentlyPause && d->playBtn->isEnabled())
0278     {
0279         d->playBtn->animateClick();
0280     }
0281 
0282     QPointer<SetupSlideShowDialog> setup = new SetupSlideShowDialog(d->settings);
0283     int ret = setup->exec();
0284     delete setup;
0285 
0286     if (ret == QDialog::Accepted)
0287     {
0288         Q_EMIT signalUpdateSettings();
0289     }
0290 
0291     if (!d->currentlyPause && d->playBtn->isEnabled())
0292     {
0293         d->playBtn->animateClick();
0294     }
0295 }
0296 
0297 void SlideToolBar::keyPressEvent(QKeyEvent* e)
0298 {
0299     switch (e->key())
0300     {
0301         case (Qt::Key_F1):
0302         {
0303             d->currentlyPause = isPaused();
0304 
0305             if (!d->currentlyPause && d->playBtn->isEnabled())
0306             {
0307                 d->playBtn->animateClick();
0308             }
0309 
0310             QPointer<DPluginAboutDlg> help = new DPluginAboutDlg(d->settings->plugin);
0311             help->exec();
0312             delete help;
0313 
0314             if (!d->currentlyPause && d->playBtn->isEnabled())
0315             {
0316                 d->playBtn->animateClick();
0317             }
0318 
0319             break;
0320         }
0321 
0322         case (Qt::Key_F2):
0323         {
0324             slotMenuSlideShowConfiguration();
0325             break;
0326         }
0327 
0328         case (Qt::Key_Space):
0329         {
0330             if (d->playBtn->isEnabled())
0331             {
0332                 d->playBtn->animateClick();
0333             }
0334 
0335             break;
0336         }
0337 
0338         case (Qt::Key_Left):
0339         case (Qt::Key_Up):
0340         case (Qt::Key_PageUp):
0341         {
0342             if (d->prevBtn->isEnabled())
0343             {
0344                 d->prevBtn->animateClick();
0345             }
0346 
0347             break;
0348         }
0349 
0350         case (Qt::Key_Right):
0351         case (Qt::Key_Down):
0352         case (Qt::Key_PageDown):
0353         {
0354             if (d->nextBtn->isEnabled())
0355             {
0356                 d->nextBtn->animateClick();
0357             }
0358 
0359             break;
0360         }
0361 
0362         case (Qt::Key_Escape):
0363         {
0364             if (d->stopBtn->isEnabled())
0365             {
0366                 d->stopBtn->animateClick();
0367             }
0368 
0369             break;
0370         }
0371 
0372         default:
0373         {
0374             break;
0375         }
0376     }
0377 
0378     e->accept();
0379 }
0380 
0381 void SlideToolBar::slotScreenSelected(QAction* act)
0382 {
0383 
0384 #if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0))
0385 
0386     if (!act || (act->data().typeId() != QVariant::Int))
0387 
0388 #else
0389 
0390     if (!act || (act->data().type() != QVariant::Int))
0391 
0392 #endif
0393 
0394     {
0395         return;
0396     }
0397 
0398     Q_EMIT signalScreenSelected(act->data().toInt());
0399 }
0400 
0401 void SlideToolBar::slotRemoveImage()
0402 {
0403     bool running = (!isPaused() && d->playBtn->isEnabled());
0404 
0405     if (running)
0406     {
0407         d->playBtn->animateClick();
0408     }
0409 
0410     QPointer<QMessageBox> msgBox = new QMessageBox(QMessageBox::Question,
0411              i18nc("@title:window", "Delete Image"),
0412              i18n("Do you want to move this image to the trash?"),
0413              QMessageBox::Yes | QMessageBox::No, this);
0414 
0415     msgBox->setDefaultButton(QMessageBox::Yes);
0416 
0417     int ret = msgBox->exec();
0418     delete msgBox;
0419 
0420     if (ret == QMessageBox::Yes)
0421     {
0422         Q_EMIT signalRemoveImageFromList();
0423     }
0424 
0425     if (running)
0426     {
0427         d->playBtn->animateClick();
0428     }
0429 }
0430 
0431 } // namespace DigikamGenericSlideShowPlugin
0432 
0433 #include "moc_slidetoolbar.cpp"