# HG changeset patch # User Chris Cannam # Date 1579869627 0 # Node ID 85f04c956f03d7c97428e0e93805c59251042a7f # Parent 57a4ee52ad69c118ffa66ffdbf8783a34ec1502b Add optional unset entry to colour combo diff -r 57a4ee52ad69 -r 85f04c956f03 widgets/ColourComboBox.cpp --- a/widgets/ColourComboBox.cpp Fri Jan 24 12:40:07 2020 +0000 +++ b/widgets/ColourComboBox.cpp Fri Jan 24 12:40:27 2020 +0000 @@ -38,15 +38,29 @@ connect(this, SIGNAL(activated(int)), this, SLOT(comboActivated(int))); connect(ColourDatabase::getInstance(), SIGNAL(colourDatabaseChanged()), this, SLOT(rebuild())); - - if (count() < 20 && count() > maxVisibleItems()) { - setMaxVisibleItems(count()); - } } void -ColourComboBox::comboActivated(int index) +ColourComboBox::includeUnsetEntry(QString entry) { + m_unsetEntry = entry; + + rebuild(); + + blockSignals(true); + int ix = currentIndex(); + setCurrentIndex(ix + 1); + blockSignals(false); +} + +void +ColourComboBox::comboActivated(int comboIndex) +{ + int index = comboIndex; + if (m_unsetEntry != "") { + index = comboIndex - 1; // so index is the colour index + } + if (!m_withAddNewColourEntry || index < int(ColourDatabase::getInstance()->getColourCount())) { emit colourChanged(index); @@ -81,6 +95,10 @@ clear(); + if (m_unsetEntry != "") { + addItem(m_unsetEntry); + } + int size = (QFontMetrics(QFont()).height() * 2) / 3; if (size < 12) size = 12; @@ -95,6 +113,12 @@ } setCurrentIndex(ix); + + if (count() < 18) { + setMaxVisibleItems(count()); + } else { + setMaxVisibleItems(10); + } blockSignals(false); } diff -r 57a4ee52ad69 -r 85f04c956f03 widgets/ColourComboBox.h --- a/widgets/ColourComboBox.h Fri Jan 24 12:40:07 2020 +0000 +++ b/widgets/ColourComboBox.h Fri Jan 24 12:40:27 2020 +0000 @@ -29,7 +29,32 @@ public: ColourComboBox(bool withAddNewColourEntry, QWidget *parent = 0); + /** + * Add an entry at the top of the combo for "no colour selected", + * with the given label. + */ + void includeUnsetEntry(QString label); + + /** + * Get the current colour index. This is the same as + * QComboBox::currentIndex() if there is no unset entry, or 1 less + * than it if includeUnsetEntry() has been used. So if there is an + * unset entry, and it is selected, this returns -1. + */ + int getCurrentColourIndex() const { + int index = currentIndex(); + if (m_unsetEntry == "") { + return index; + } else { + return index - 1; + } + } + signals: + /** + * Emitted when the current index is changed. The argument is the + * value returned by getCurrentColourIndex() + */ void colourChanged(int colourIndex); private slots: @@ -38,6 +63,7 @@ private: bool m_withAddNewColourEntry; + QString m_unsetEntry; }; #endif