Connect presentation screen selection to KConfigWidgets

This adds a class PreferredScreenSelector, which is a QComboBox that
holds items for each connected screen, and provides a preferredScreen
property which is accessed by KConfigDialogManager.
This class also allows to remember a disconnected screen by adding
a temporary item “Screen xy (disconnected)”.
remotes/origin/work/aacid/new_clang_format_master
David Hurka 5 years ago
parent 275b7ea57c
commit 4c7a2ac60e
  1. 78
      part/dlgpresentation.cpp
  2. 51
      part/dlgpresentation.h
  3. 7
      part/dlgpresentationbase.ui

@ -12,10 +12,8 @@
#include "ui_dlgpresentationbase.h"
#include "widgetdrawingtools.h"
#include <KConfigDialogManager>
#include <KLocalizedString>
#include <QApplication>
#include <QDesktopWidget>
#include <QScreen>
#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<void (QComboBox::*)(int)>(&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<QScreen *> 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<int>::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;
}
}

@ -10,7 +10,8 @@
#ifndef _DLGPRESENTATION_H
#define _DLGPRESENTATION_H
#include <qwidget.h>
#include <QComboBox>
#include <QWidget>
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

@ -348,7 +348,7 @@
</widget>
</item>
<item row="0" column="1">
<widget class="QComboBox" name="screenCombo"/>
<widget class="PreferredScreenSelector" name="kcfg_SlidesScreen"/>
</item>
</layout>
</widget>
@ -374,6 +374,11 @@
<extends>QSpinBox</extends>
<header>KPluralHandlingSpinBox</header>
</customwidget>
<customwidget>
<class>PreferredScreenSelector</class>
<extends>QComboBox</extends>
<header>part/dlgpresentation.h</header>
</customwidget>
</customwidgets>
<resources/>
</ui>

Loading…
Cancel
Save