Krita Source Code Documentation
Loading...
Searching...
No Matches
KisSqueezedComboBox.cpp
Go to the documentation of this file.
1/* ============================================================
2 * Author: Tom Albers <tomalbers@kde.nl>
3 * Date : 2005-01-01
4 * Description :
5 *
6 * SPDX-FileCopyrightText: 2005 Tom Albers <tomalbers@kde.nl>
7 *
8 * SPDX-License-Identifier: GPL-2.0-or-later
9 *
10 * ============================================================ */
11
12#include "KisSqueezedComboBox.h"
15// Qt includes.
16
17#include <QComboBox>
18#include <QTimer>
19#include <QStyle>
20#include <QApplication>
21#include <QResizeEvent>
22
23KisSqueezedComboBox::KisSqueezedComboBox(QWidget *parent, const char *name)
24 : QComboBox(parent)
25{
26 setObjectName(name);
27 setMinimumWidth(100);
28 m_timer = new QTimer(this);
29 m_timer->setSingleShot(true);
30 connect(m_timer, SIGNAL(timeout()),
31 SLOT(slotTimeOut()));
32}
33
38
39bool KisSqueezedComboBox::contains(const QString& _text) const
40{
41 if (_text.isEmpty())
42 return false;
43
44 for (QMap<int, QString>::const_iterator it = m_originalItems.begin() ; it != m_originalItems.end();
45 ++it) {
46 if (it.value() == _text) {
47 return true;
48 }
49 }
50 return false;
51}
52
53qint32 KisSqueezedComboBox::findOriginalText(const QString& text) const
54{
55 for (int i = 0; i < m_originalItems.size(); i++) {
56 if(m_originalItems.value(i) == text) {
57 return i;
58 }
59 }
60 return -1;
61}
62
67
69{
70 if (texts == m_originalItems.values()) return;
71
72 clear();
73 m_originalItems.clear();
74
75 Q_FOREACH (const QString &item, texts) {
76 addSqueezedItem(item);
77 }
78}
79
81{
82 ensurePolished();
83 QFontMetrics fm = fontMetrics();
84 int maxW = count() ? 18 : 7 * fm.boundingRect(QChar('x')).width() + 18;
85 int maxH = qMax(fm.lineSpacing(), 14) + 2;
86
87 QStyleOptionComboBox options;
88 options.initFrom(this);
89
90 return style()->sizeFromContents(QStyle::CT_ComboBox, &options, QSize(maxW, maxH), this);
91}
92
93void KisSqueezedComboBox::insertSqueezedItem(const QString& newItem, int index, QVariant userData)
94{
95 m_originalItems[index] = newItem;
96 QComboBox::insertItem(index, squeezeText(newItem, this), userData);
97 setItemData(index, newItem, Qt::ToolTipRole);
98}
99
100void KisSqueezedComboBox::insertSqueezedItem(const QIcon &icon, const QString &newItem, int index, QVariant userData)
101{
102 m_originalItems[index] = newItem;
103 QComboBox::insertItem(index, icon, squeezeText(newItem, this), userData);
104 setItemData(index, newItem, Qt::ToolTipRole);
105}
106
107void KisSqueezedComboBox::addSqueezedItem(const QString& newItem, QVariant userData)
108{
109 insertSqueezedItem(newItem, count(), userData);
110}
111
112void KisSqueezedComboBox::addSqueezedItem(const QIcon &icon, const QString &newItem, QVariant userData)
113{
114 insertSqueezedItem(icon, newItem, count(), userData);
115}
116
117void KisSqueezedComboBox::setCurrent(const QString& itemText)
118{
119 qint32 itemIndex = findOriginalText(itemText);
120 if (itemIndex >= 0) {
121 setCurrentIndex(itemIndex);
122 }
123}
124
126{
127 m_timer->start(200);
128}
129
131{
132 for (QMap<int, QString>::iterator it = m_originalItems.begin() ; it != m_originalItems.end();
133 ++it) {
134 setItemText(it.key(), squeezeText(it.value(), this));
135 }
136}
137
138QString KisSqueezedComboBox::squeezeText(const QString& original, const QWidget *widget)
139{
140 // not the complete widgetSize is usable. Need to compensate for that.
141 int widgetSize = widget->width() - 30;
142 QFontMetrics fm(widget->fontMetrics());
143
144 // If we can fit the full text, return that.
145 if (fm.boundingRect(original).width() < widgetSize)
146 return(original);
147
148 // We need to squeeze.
149 QString sqItem = original; // prevent empty return value;
150 widgetSize = widgetSize - fm.boundingRect("...").width();
151 for (int i = 0 ; i != original.length(); ++i) {
152 if ((int)fm.boundingRect(original.right(i)).width() > widgetSize) {
153 sqItem = QString("..." + original.right(--i));
154 break;
155 }
156 }
157 return sqItem;
158}
159
161{
162 int curItem = currentIndex();
163 return m_originalItems[curItem];
164}
165
167{
168 removeItem(index);
169 m_originalItems.remove(index);
170}
171
connect(this, SIGNAL(optionsChanged()), this, SLOT(saveOptions()))
bool contains(const QString &text) const
QMap< int, QString > m_originalItems
void removeSqueezedItem(int index)
QStringList originalTexts() const
void resizeEvent(QResizeEvent *) override
void setCurrent(const QString &itemText)
void addSqueezedItem(const QString &newItem, QVariant userData=QVariant())
QSize sizeHint() const override
static QString squeezeText(const QString &original, const QWidget *widget)
KisSqueezedComboBox(QWidget *parent=0, const char *name=0)
qint32 findOriginalText(const QString &text) const
void resetOriginalTexts(const QStringList &texts)
void insertSqueezedItem(const QString &newItem, int index, QVariant userData=QVariant())