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"