diff --git a/part/dlgpresentation.cpp b/part/dlgpresentation.cpp index 25ed34733..376062a57 100644 --- a/part/dlgpresentation.cpp +++ b/part/dlgpresentation.cpp @@ -12,10 +12,8 @@ #include "ui_dlgpresentationbase.h" #include "widgetdrawingtools.h" -#include -#include #include -#include +#include #include "settings.h" @@ -29,27 +27,7 @@ DlgPresentation::DlgPresentation(QWidget *parent) m_dlg->verticalLayout_4->addWidget(kcfg_DrawingTools); kcfg_DrawingTools->setObjectName(QStringLiteral("kcfg_DrawingTools")); - QStringList choices; - choices.append(i18nc("@label:listbox The current screen, for the presentation mode", "Current Screen")); - choices.append(i18nc("@label:listbox The default screen for the presentation mode", "Default Screen")); - const int screenCount = QGuiApplication::screens().count(); - for (int i = 0; i < screenCount; ++i) { - choices.append(i18nc("@label:listbox %1 is the screen number (0, 1, ...)", "Screen %1", i)); - } - m_dlg->screenCombo->addItems(choices); - - const int screen = Okular::Settings::slidesScreen(); - if (screen >= -2 && screen < screenCount) { - m_dlg->screenCombo->setCurrentIndex(screen + 2); - } else { - m_dlg->screenCombo->setCurrentIndex(0); - Okular::Settings::setSlidesScreen(-2); - } - m_dlg->kcfg_SlidesAdvanceTime->setSuffix(ki18ncp("Advance every %1 seconds", " second", " seconds")); - - connect(m_dlg->screenCombo, static_cast(&QComboBox::activated), this, &DlgPresentation::screenComboChanged); - connect(m_dlg->kcfg_SlidesAdvance, &QAbstractButton::toggled, m_dlg->kcfg_SlidesAdvanceTime, &QWidget::setEnabled); } DlgPresentation::~DlgPresentation() @@ -57,9 +35,57 @@ DlgPresentation::~DlgPresentation() delete m_dlg; } -void DlgPresentation::screenComboChanged(int which) +PreferredScreenSelector::PreferredScreenSelector(QWidget *parent) + : QComboBox(parent) + , m_disconnectedScreenNumber(k_noDisconnectedScreenNumber) +{ + // Populate list: + static_assert(k_specialScreenCount == 2, "Special screens unknown to PreferredScreenSelector constructor."); + addItem(i18nc("@item:inlistbox Config dialog, presentation page, preferred screen", "Current Screen")); + addItem(i18nc("@item:inlistbox Config dialog, presentation page, preferred screen", "Default Screen")); + + const QList screens = qApp->screens(); + for (int screenNumber = 0; screenNumber < screens.count(); ++screenNumber) { + QScreen *screen = screens.at(screenNumber); + addItem(i18nc("@item:inlistbox Config dialog, presentation page, preferred screen. %1 is the screen number (0, 1, ...). %2 is the screen manufacturer name. %3 is the screen model name. %4 is the screen name like DVI-0", + "Screen %1 (%2 %3 %4)", + screenNumber, + screen->manufacturer(), + screen->model(), + screen->name())); + } + + // If a disconnected screen is configured, it will be appended last: + m_disconnectedScreenIndex = count(); + + // KConfigWidgets setup: + setProperty("kcfg_property", QByteArray("preferredScreen")); + connect(this, QOverload::of(&QComboBox::currentIndexChanged), [this](int index) { emit preferredScreenChanged(index - k_specialScreenCount); }); +} + +void PreferredScreenSelector::setPreferredScreen(int newScreen) { - Okular::Settings::setSlidesScreen(which - 2); + // Check whether the new screen is not in the list of connected screens: + if (newScreen >= m_disconnectedScreenIndex - k_specialScreenCount) { + if (m_disconnectedScreenNumber == k_noDisconnectedScreenNumber) { + addItem(QString()); + } + setItemText(m_disconnectedScreenIndex, i18nc("@item:inlistbox Config dialog, presentation page, preferred screen. %1 is the screen number (0, 1, ...), hopefully not 0.", "Screen %1 (disconnected)", newScreen)); + setCurrentIndex(m_disconnectedScreenIndex); + m_disconnectedScreenNumber = newScreen; + return; + } + + setCurrentIndex(newScreen + k_specialScreenCount); + + // screenChanged() is emitted through currentIndexChanged(). } -#include "moc_dlgpresentation.cpp" +int PreferredScreenSelector::preferredScreen() const +{ + if (currentIndex() == m_disconnectedScreenIndex) { + return m_disconnectedScreenNumber; + } else { + return currentIndex() - k_specialScreenCount; + } +} diff --git a/part/dlgpresentation.h b/part/dlgpresentation.h index cc4e5b97a..eb274ef37 100644 --- a/part/dlgpresentation.h +++ b/part/dlgpresentation.h @@ -10,7 +10,8 @@ #ifndef _DLGPRESENTATION_H #define _DLGPRESENTATION_H -#include +#include +#include class Ui_DlgPresentationBase; @@ -22,11 +23,53 @@ public: explicit DlgPresentation(QWidget *parent = nullptr); ~DlgPresentation() override; -protected Q_SLOTS: - void screenComboChanged(int which); - protected: Ui_DlgPresentationBase *m_dlg; }; +/** + * We need this because there are some special screens, + * which are not represented by the typical currentIndex(), + * which would be used by KConfigWidgets. + * + * Additionally this class allows to remember a disconnected screen. + */ +class PreferredScreenSelector : public QComboBox +{ + Q_OBJECT + + Q_PROPERTY(int preferredScreen READ preferredScreen WRITE setPreferredScreen NOTIFY preferredScreenChanged) + +public: + explicit PreferredScreenSelector(QWidget *parent); + int preferredScreen() const; + +Q_SIGNALS: + void preferredScreenChanged(int screen); + +public Q_SLOTS: + void setPreferredScreen(int newScreen); + +protected: + // These two variables protect the screen setting from changing + // when the configured screen is currently disconnected. + + /** + * When setScreen() is called with a disconnected screen, + * a “disconnected” entry is created at this index: + */ + int m_disconnectedScreenIndex; + + /** + * Which screen is referred by @c m_disconnectedScreenIndex. + * Until @c m_disconnectedScreenIndex entry is created, this is @c k_noDisconnectedScreenNumber. + */ + int m_disconnectedScreenNumber; +}; + +/** “Current” and “Default” */ +const int k_specialScreenCount = 2; +/** Default value of m_disconnectedScreenNumber when no disconnected screen is remembered */ +const int k_noDisconnectedScreenNumber = -3; + #endif diff --git a/part/dlgpresentationbase.ui b/part/dlgpresentationbase.ui index e1dcb9df2..ba302d6dd 100644 --- a/part/dlgpresentationbase.ui +++ b/part/dlgpresentationbase.ui @@ -348,7 +348,7 @@ - + @@ -374,6 +374,11 @@ QSpinBox
KPluralHandlingSpinBox
+ + PreferredScreenSelector + QComboBox +
part/dlgpresentation.h
+