diff --git a/part/dlgpresentation.cpp b/part/dlgpresentation.cpp index 29a0ca4cb..16a7e666e 100644 --- a/part/dlgpresentation.cpp +++ b/part/dlgpresentation.cpp @@ -151,8 +151,25 @@ PreferredScreenSelector::PreferredScreenSelector(QWidget *parent) : QComboBox(parent) , m_disconnectedScreenNumber(k_noDisconnectedScreenNumber) { + repopulateList(); + connect(qApp, &QGuiApplication::screenAdded, this, &PreferredScreenSelector::repopulateList); + connect(qApp, &QGuiApplication::screenRemoved, this, &PreferredScreenSelector::repopulateList); + + // KConfigWidgets setup: + setProperty("kcfg_property", QByteArray("preferredScreen")); + connect(this, QOverload::of(&QComboBox::currentIndexChanged), [this](int index) { emit preferredScreenChanged(index - k_specialScreenCount); }); +} + +void PreferredScreenSelector::repopulateList() +{ + // Remember which index was selected before: + const int screenBeforeRepopulation = preferredScreen(); + + QSignalBlocker signalBlocker(this); + clear(); + // Populate list: - static_assert(k_specialScreenCount == 2, "Special screens unknown to PreferredScreenSelector constructor."); + static_assert(k_specialScreenCount == 2, "Special screens unknown to PreferredScreenSelector::repopulateList()."); addItem(i18nc("@item:inlistbox Config dialog, presentation page, preferred screen", "Current Screen")); addItem(i18nc("@item:inlistbox Config dialog, presentation page, preferred screen", "Default Screen")); @@ -170,21 +187,24 @@ PreferredScreenSelector::PreferredScreenSelector(QWidget *parent) // 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); }); + // If a screen of currently disconnected index was selected, keep its list item: + if (m_disconnectedScreenNumber >= m_disconnectedScreenIndex - k_specialScreenCount) { + addItem(i18nc("@item:inlistbox Config dialog, presentation page, preferred screen. %1 is the screen number (0, 1, ...), hopefully not 0.", "Screen %1 (disconnected)", m_disconnectedScreenNumber)); + } + + // Select the index that was selected before: + setPreferredScreen(screenBeforeRepopulation); } void PreferredScreenSelector::setPreferredScreen(int newScreen) { // 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()); + if (m_disconnectedScreenNumber != newScreen) { + m_disconnectedScreenNumber = newScreen; + repopulateList(); } - 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; } diff --git a/part/dlgpresentation.h b/part/dlgpresentation.h index a390e5c73..4fcfbd20d 100644 --- a/part/dlgpresentation.h +++ b/part/dlgpresentation.h @@ -59,6 +59,14 @@ protected: * Until @c m_disconnectedScreenIndex entry is created, this is @c k_noDisconnectedScreenNumber. */ int m_disconnectedScreenNumber; + +protected Q_SLOTS: + /** + * Populates the combobox list with items for the special screens, + * and for every connected screen. + * If @c m_disconnectedScreenNumber is set, adds an item for this disconnected screen. + */ + void repopulateList(); }; /** “Current” and “Default” */