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"