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

0001 /* ============================================================
0002  *
0003  * This file is a part of digiKam project
0004  * https://www.digikam.org
0005  *
0006  * Date        : 2008-09-09
0007  * Description : a presentation tool.
0008  *
0009  * SPDX-FileCopyrightText: 2008-2009 by Valerio Fuoglio <valerio dot fuoglio at gmail dot com>
0010  * SPDX-FileCopyrightText: 2009      by Andi Clemens <andi dot clemens at googlemail dot com>
0011  * SPDX-FileCopyrightText: 2012-2024 by Gilles Caulier <caulier dot gilles at gmail dot com>
0012  *
0013  * SPDX-License-Identifier: GPL-2.0-or-later
0014  *
0015  * ============================================================ */
0016 
0017 #include "presentationdlg.h"
0018 
0019 // Qt includes
0020 
0021 #include <QFileInfo>
0022 #include <QFont>
0023 #include <QCloseEvent>
0024 #include <QIcon>
0025 #include <QMenu>
0026 #include <QTabWidget>
0027 #include <QDialogButtonBox>
0028 
0029 // KDE includes
0030 
0031 #include <ksharedconfig.h>
0032 #include <kconfiggroup.h>
0033 
0034 // Local includes
0035 
0036 #include "digikam_config.h"
0037 #include "digikam_debug.h"
0038 #include "presentationcontainer.h"
0039 #include "presentation_mainpage.h"
0040 #include "presentation_captionpage.h"
0041 #include "presentation_advpage.h"
0042 #include "thumbnailloadthread.h"
0043 
0044 #ifdef HAVE_MEDIAPLAYER
0045 #   include "presentation_audiopage.h"
0046 #endif
0047 
0048 namespace DigikamGenericPresentationPlugin
0049 {
0050 
0051 class Q_DECL_HIDDEN PresentationDlg::Private
0052 {
0053 
0054 public:
0055 
0056     explicit Private()
0057       : buttonBox   (nullptr),
0058         startButton (nullptr),
0059         tab         (nullptr),
0060         sharedData  (nullptr)
0061     {
0062     }
0063 
0064     QDialogButtonBox*      buttonBox;
0065     QPushButton*           startButton;
0066     QTabWidget*            tab;
0067     PresentationContainer* sharedData;
0068 };
0069 
0070 PresentationDlg::PresentationDlg(QWidget* const parent,
0071                                  PresentationContainer* const sharedData)
0072     : DPluginDialog(parent, QLatin1String("Presentation Settings")),
0073       d            (new Private)
0074 {
0075     setWindowTitle(i18nc("@title:window", "Presentation"));
0076     setModal(false);
0077 
0078     d->sharedData = sharedData;
0079 
0080     m_buttons->addButton(QDialogButtonBox::Close);
0081     m_buttons->addButton(QDialogButtonBox::Ok);
0082     m_buttons->button(QDialogButtonBox::Ok)->setText(i18nc("@action: play presentation", "Start"));
0083     m_buttons->button(QDialogButtonBox::Ok)->setToolTip(i18nc("@info:tooltip", "Start Presentation"));
0084     m_buttons->button(QDialogButtonBox::Ok)->setIcon(QIcon::fromTheme(QLatin1String("media-playback-start")));
0085     m_buttons->button(QDialogButtonBox::Ok)->setDefault(true);
0086 
0087     // --- Pages settings ---
0088 
0089     d->tab = new QTabWidget(this);
0090 
0091     d->sharedData->mainPage = new PresentationMainPage(this, d->sharedData);
0092     d->tab->addTab(d->sharedData->mainPage,
0093                    QIcon::fromTheme(QLatin1String("view-presentation")),
0094                    i18nc("@title: main settings for the presentation", "Main Settings"));
0095 
0096     d->sharedData->captionPage = new PresentationCaptionPage(this, d->sharedData);
0097     d->tab->addTab(d->sharedData->captionPage,
0098                    QIcon::fromTheme(QLatin1String("draw-freehand")),
0099                    i18nc("@title: caption settings for the presentation", "Caption"));
0100 
0101 #ifdef HAVE_MEDIAPLAYER
0102 
0103     d->sharedData->soundtrackPage = new PresentationAudioPage(this, d->sharedData);
0104     d->tab->addTab(d->sharedData->soundtrackPage,
0105                    QIcon::fromTheme(QLatin1String("speaker")),
0106                    i18nc("@title: soundtrack settings for the presentation", "Soundtrack"));
0107 
0108 #endif
0109 
0110     d->sharedData->advancedPage = new PresentationAdvPage(this, d->sharedData);
0111     d->tab->addTab(d->sharedData->advancedPage,
0112                    QIcon::fromTheme(QLatin1String("configure")),
0113                    i18nc("@title: advanced presentation settings", "Advanced"));
0114 
0115     QVBoxLayout* const mainLayout = new QVBoxLayout(this);
0116     mainLayout->addWidget(d->tab);
0117     mainLayout->addWidget(m_buttons);
0118     setLayout(mainLayout);
0119 
0120     // Slot connections
0121 
0122     connect(m_buttons->button(QDialogButtonBox::Ok), SIGNAL(clicked()),
0123             this, SLOT(slotStartClicked()));
0124 
0125     connect(m_buttons->button(QDialogButtonBox::Close), SIGNAL(clicked()),
0126             this, SLOT(reject()));
0127 
0128     readSettings();
0129 }
0130 
0131 PresentationDlg::~PresentationDlg ()
0132 {
0133     delete d;
0134 }
0135 
0136 void PresentationDlg::readSettings()
0137 {
0138     KSharedConfigPtr config          = KSharedConfig::openConfig();
0139     KConfigGroup grp                 = config->group(QLatin1String("Presentation Settings"));
0140 
0141     d->sharedData->opengl            = grp.readEntry("OpenGL",                   false);
0142     d->sharedData->openGlFullScale   = grp.readEntry("OpenGLFullScale",          false);
0143     d->sharedData->delay             = grp.readEntry("Delay",                    1500);
0144     d->sharedData->printFileName     = grp.readEntry("Print Filename",           true);
0145     d->sharedData->printProgress     = grp.readEntry("Print Progress Indicator", true);
0146     d->sharedData->printFileComments = grp.readEntry("Print Comments",           false);
0147     d->sharedData->loop              = grp.readEntry("Loop",                     false);
0148     d->sharedData->shuffle           = grp.readEntry("Shuffle",                  false);
0149     d->sharedData->effectName        = grp.readEntry("Effect Name",              "Random");
0150     d->sharedData->effectNameGL      = grp.readEntry("Effect Name (OpenGL)",     "Random");
0151 
0152     d->sharedData->delayMsMaxValue   = 120000;
0153     d->sharedData->delayMsMinValue   = 100;
0154     d->sharedData->delayMsLineStep   = 100;
0155 
0156     // Comments tab settings
0157 
0158     QFont* const savedFont = new QFont();
0159     savedFont->setFamily(    grp.readEntry("Comments Font Family"));
0160     savedFont->setPointSize( grp.readEntry("Comments Font Size",        10));
0161     savedFont->setBold(      grp.readEntry("Comments Font Bold",        false));
0162     savedFont->setItalic(    grp.readEntry("Comments Font Italic",      false));
0163     savedFont->setUnderline( grp.readEntry("Comments Font Underline",   false));
0164     savedFont->setOverline(  grp.readEntry("Comments Font Overline",    false));
0165     savedFont->setStrikeOut( grp.readEntry("Comments Font StrikeOut",   false));
0166     savedFont->setFixedPitch(grp.readEntry("Comments Font FixedPitch",  false));
0167 
0168     d->sharedData->captionFont         = savedFont;
0169 
0170     d->sharedData->commentsFontColor   = grp.readEntry("Comments Font Color",   0xffffff);
0171     d->sharedData->commentsBgColor     = grp.readEntry("Comments Bg Color",     0x000000);
0172     d->sharedData->commentsDrawOutline = grp.readEntry("Comments Text Outline", true);
0173     d->sharedData->bgOpacity           = grp.readEntry("Background Opacity",    10);
0174     d->sharedData->commentsLinesLength = grp.readEntry("Comments Lines Length", 72);
0175 
0176 #ifdef HAVE_MEDIAPLAYER
0177 
0178     // Soundtrack tab
0179 
0180     d->sharedData->soundtrackLoop             = grp.readEntry("Soundtrack Loop",                     false);
0181     d->sharedData->soundtrackPlay             = grp.readEntry("Soundtrack Auto Play",                false);
0182     d->sharedData->soundtrackPath             = QUrl::fromLocalFile(grp.readEntry("Soundtrack Path", ""));
0183     d->sharedData->soundtrackRememberPlaylist = grp.readEntry("Soundtrack Remember Playlist",        false);
0184 
0185 #endif
0186 
0187     // Advanced tab
0188 
0189     d->sharedData->useMilliseconds     = grp.readEntry("Use Milliseconds",      false);
0190     d->sharedData->enableMouseWheel    = grp.readEntry("Enable Mouse Wheel",    true);
0191 
0192     d->sharedData->kbDisableFadeInOut  = grp.readEntry("KB Disable FadeInOut",  false);
0193     d->sharedData->kbDisableCrossFade  = grp.readEntry("KB Disable Crossfade",  false);
0194 
0195     d->sharedData->enableCache         = grp.readEntry("Enable Cache",          false);
0196     d->sharedData->cacheSize           = grp.readEntry("Cache Size",            5);
0197 
0198     if (d->sharedData->soundtrackRememberPlaylist)
0199     {
0200         QString groupName(QLatin1String("Presentation Settings") + QLatin1String(" Soundtrack "));
0201         KConfigGroup soundGrp = config->group(groupName);
0202 
0203         // load and check playlist files, if valid, add to tracklist widget
0204 
0205         QList<QUrl> playlistFiles = soundGrp.readEntry("Tracks", QList<QUrl>());
0206 
0207         Q_FOREACH (const QUrl& playlistFile, playlistFiles)
0208         {
0209             QUrl file(playlistFile);
0210             QFileInfo fi(file.toLocalFile());
0211 
0212             if (fi.isFile())
0213             {
0214                 d->sharedData->soundtrackUrls << file;
0215             }
0216         }
0217     }
0218 
0219     d->sharedData->mainPage->readSettings();
0220     d->sharedData->captionPage->readSettings();
0221     d->sharedData->advancedPage->readSettings();
0222 
0223 #ifdef HAVE_MEDIAPLAYER
0224 
0225     d->sharedData->soundtrackPage->readSettings();
0226 
0227 #endif
0228 
0229 }
0230 
0231 void PresentationDlg::saveSettings()
0232 {
0233     d->sharedData->mainPage->saveSettings();
0234     d->sharedData->captionPage->saveSettings();
0235     d->sharedData->advancedPage->saveSettings();
0236 
0237 #ifdef HAVE_MEDIAPLAYER
0238 
0239     d->sharedData->soundtrackPage->saveSettings();
0240 
0241 #endif
0242 
0243     KSharedConfigPtr config = KSharedConfig::openConfig();
0244     KConfigGroup grp        = config->group(QLatin1String("Presentation Settings"));
0245     grp.writeEntry("OpenGL",                   d->sharedData->opengl);
0246     grp.writeEntry("OpenGLFullScale",          d->sharedData->openGlFullScale);
0247     grp.writeEntry("Delay",                    d->sharedData->delay);
0248     grp.writeEntry("Print Filename",           d->sharedData->printFileName);
0249     grp.writeEntry("Print Progress Indicator", d->sharedData->printProgress);
0250     grp.writeEntry("Print Comments",           d->sharedData->printFileComments);
0251     grp.writeEntry("Loop",                     d->sharedData->loop);
0252     grp.writeEntry("Shuffle",                  d->sharedData->shuffle);
0253     grp.writeEntry("Use Milliseconds",         d->sharedData->useMilliseconds);
0254     grp.writeEntry("Enable Mouse Wheel",       d->sharedData->enableMouseWheel);
0255 
0256     // Comments tab settings
0257 
0258     QFont* const commentsFont = d->sharedData->captionFont;
0259     grp.writeEntry("Comments Font Family",     commentsFont->family());
0260     grp.writeEntry("Comments Font Size",       commentsFont->pointSize());
0261     grp.writeEntry("Comments Font Bold",       commentsFont->bold());
0262     grp.writeEntry("Comments Font Italic",     commentsFont->italic());
0263     grp.writeEntry("Comments Font Underline",  commentsFont->underline());
0264     grp.writeEntry("Comments Font Overline",   commentsFont->overline());
0265     grp.writeEntry("Comments Font StrikeOut",  commentsFont->strikeOut());
0266     grp.writeEntry("Comments Font FixedPitch", commentsFont->fixedPitch());
0267     grp.writeEntry("Comments Font Color",      d->sharedData->commentsFontColor);
0268     grp.writeEntry("Comments Bg Color",        d->sharedData->commentsBgColor);
0269     grp.writeEntry("Comments Text Outline",    d->sharedData->commentsDrawOutline);
0270     grp.writeEntry("Background Opacity",       d->sharedData->bgOpacity);
0271     grp.writeEntry("Comments Lines Length",    d->sharedData->commentsLinesLength);
0272     grp.writeEntry("Effect Name (OpenGL)",     d->sharedData->effectNameGL);
0273     grp.writeEntry("Effect Name",              d->sharedData->effectName);
0274 
0275 #ifdef HAVE_MEDIAPLAYER
0276 
0277     // Soundtrack tab
0278 
0279     grp.writeEntry("Soundtrack Loop",              d->sharedData->soundtrackLoop);
0280     grp.writeEntry("Soundtrack Auto Play",         d->sharedData->soundtrackPlay);
0281     grp.writeEntry("Soundtrack Path",              d->sharedData->soundtrackPath.toLocalFile());
0282     grp.writeEntry("Soundtrack Remember Playlist", d->sharedData->soundtrackRememberPlaylist);
0283 
0284 #endif
0285 
0286     // Advanced settings
0287 
0288     grp.writeEntry("KB Disable FadeInOut", d->sharedData->kbDisableFadeInOut);
0289     grp.writeEntry("KB Disable Crossfade", d->sharedData->kbDisableCrossFade);
0290     grp.writeEntry("Enable Cache",         d->sharedData->enableCache);
0291     grp.writeEntry("Cache Size",           d->sharedData->cacheSize);
0292 
0293     // --------------------------------------------------------
0294 
0295     // only save tracks when option is set and tracklist is NOT empty, to prevent deletion
0296     // of older track entries
0297 
0298     if (d->sharedData->soundtrackRememberPlaylist && d->sharedData->soundtrackPlayListNeedsUpdate)
0299     {
0300         QString groupName(QLatin1String("Presentation Settings") + QLatin1String(" Soundtrack "));
0301         KConfigGroup soundGrp = config->group(groupName);
0302         soundGrp.writeEntry("Tracks", d->sharedData->soundtrackUrls);
0303     }
0304 
0305     config->sync();
0306 }
0307 
0308 void PresentationDlg::slotStartClicked()
0309 {
0310     saveSettings();
0311 
0312     if (d->sharedData->mainPage->updateUrlList())
0313     {
0314         Q_EMIT buttonStartClicked();
0315     }
0316 
0317     return;
0318 }
0319 
0320 void PresentationDlg::closeEvent(QCloseEvent* e)
0321 {
0322     saveSettings();
0323     e->accept();
0324 }
0325 
0326 } // namespace DigikamGenericPresentationPlugin
0327 
0328 #include "moc_presentationdlg.cpp"