46 #include <QtDesigner/QDesignerFormEditorInterface>
47 #include <QtDesigner/QDesignerWidgetDataBaseInterface>
49 #include <QtXml/QDomDocument>
51 #include <QtGui/QIcon>
53 #include <QItemDelegate>
56 #include <QSortFilterProxyModel>
58 #include <QXmlStreamReader>
59 #include <QtCore/QAbstractListModel>
60 #include <QtCore/QList>
61 #include <QtCore/QRegExp>
62 #include <QtCore/QTextStream>
69 #if QT_VERSION < 0x050000
70 #define QStringLiteral QString
80 QTextStream stream(&result, QIODevice::WriteOnly);
89 result.setContent(xml);
102 QDesignerWidgetBoxInterface::Widget
widget;
113 const QString& filterIn,
const QIcon& i,
bool e)
114 : widget(w), filter(filterIn), icon(i), editable(e)
128 virtual QVariant
data(
const QModelIndex& index,
int role = Qt::DisplayRole)
const;
129 virtual int rowCount(
const QModelIndex& parent = QModelIndex())
const;
130 virtual bool setData(
const QModelIndex& index,
const QVariant& value,
int role = Qt::EditRole);
131 virtual Qt::ItemFlags
flags(
const QModelIndex& index)
const;
132 virtual bool removeRows(
int row,
int count,
const QModelIndex& parent = QModelIndex());
135 QListView::ViewMode
viewMode()
const;
138 void addWidget(
const QDesignerWidgetBoxInterface::Widget& widget,
const QIcon& icon,
141 QDesignerWidgetBoxInterface::Widget
widgetAt(
const QModelIndex& index)
const;
142 QDesignerWidgetBoxInterface::Widget
widgetAt(
int row)
const;
146 QDesignerWidgetBoxInterface::Category
category()
const;
162 : QAbstractListModel(parent)
164 #if QT_VERSION >= 0x050000
165 m_classNameRegExp(
"<widget +class *= *\"([^\"]+)\"")
168 m_classNameRegExp(QString(
"<widget +class *= *\"([^\"]+)\""))
173 m_viewMode(QListView::ListMode)
188 const bool empty =
m_items.isEmpty();
198 const int count =
m_items.size();
199 for (
int i = 0; i < count; i++)
207 QDesignerWidgetBoxInterface::Category rc;
208 const WidgetBoxCategoryEntrys::const_iterator cend =
m_items.constEnd();
209 for (WidgetBoxCategoryEntrys::const_iterator it =
m_items.constBegin(); it != cend; ++it)
210 rc.addWidget(it->widget);
218 bool changed =
false;
219 for (WidgetBoxCategoryEntrys::iterator it =
m_items.begin(); it !=
m_items.end();)
220 if (it->widget.type() == QDesignerWidgetBoxInterface::Widget::Custom) {
234 const QIcon& icon,
bool editable)
237 QString filter = widget.name();
238 if (!filter.contains(
"Layout") &&
m_classNameRegExp.indexIn(widget.domXml()) != -1) {
240 if (!filter.contains(className))
245 QXmlStreamReader reader(widget.domXml());
246 while (!reader.atEnd()) {
247 switch (reader.readNext()) {
248 case QXmlStreamReader::StartElement: {
249 const QStringRef tag = reader.name();
250 if (tag ==
"widget") {
251 const QXmlStreamAttributes attributes = reader.attributes();
252 QString className = attributes.value(
"class").toString();
254 if (!toolTip.isEmpty())
276 const int row =
m_items.size();
277 beginInsertRows(QModelIndex(), row, row);
284 const int row = index.row();
285 if (row < 0 || row >=
m_items.size())
290 case Qt::DisplayRole:
292 return QVariant(
m_viewMode == QListView::ListMode ? item.
widget.name() : QString());
294 return QVariant(item.
icon);
296 return QVariant(item.
widget.name());
301 QString tt = item.
widget.name();
303 tt += QLatin1Char(
'\n');
308 case Qt::WhatsThisRole:
318 const int row = index.row();
319 if (role != Qt::EditRole || row < 0 || row >=
m_items.size()
320 || value.type() != QVariant::String)
324 const QString newName = value.toString();
325 item.
widget.setName(newName);
328 QDomElement widget_elt = doc.firstChildElement(QLatin1String(
widgetElementC));
329 if (!widget_elt.isNull()) {
333 emit dataChanged(index, index);
339 Qt::ItemFlags rc = Qt::ItemIsEnabled;
340 const int row = index.row();
341 if (row >= 0 && row <
m_items.size())
342 if (
m_items.at(row).editable) {
343 rc |= Qt::ItemIsSelectable;
346 rc |= Qt::ItemIsEditable;
358 if (row < 0 || count < 1)
360 const int size =
m_items.size();
361 const int last = row + count - 1;
362 if (row >= size || last >= size)
364 beginRemoveRows(parent, row, last);
365 for (
int r = last; r >= row; r--)
378 if (row < 0 || row >=
m_items.size())
379 return QDesignerWidgetBoxInterface::Widget();
388 QWidget*
createEditor(QWidget* parent,
const QStyleOptionViewItem& option,
389 const QModelIndex& index)
const;
393 const QStyleOptionViewItem& option,
394 const QModelIndex& index)
const
396 QWidget* result = QItemDelegate::createEditor(parent, option, index);
397 if (QLineEdit* line_edit = qobject_cast<QLineEdit*>(result)) {
398 QRegExp re = QRegExp(
"[_a-zA-Z][_a-zA-Z0-9]*");
400 line_edit->setValidator(
new QRegExpValidator(re, line_edit));
411 , m_proxyModel(new QSortFilterProxyModel(this))
414 setFocusPolicy(Qt::NoFocus);
415 setFrameShape(QFrame::NoFrame);
417 setIconSize(QSize(32, 32));
419 setTextElideMode(Qt::ElideMiddle);
420 setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
421 setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
422 setResizeMode(QListView::Adjust);
423 setUniformItemSizes(
true);
428 setEditTriggers(QAbstractItemView::AnyKeyPressed);
433 connect(
m_model, SIGNAL(dataChanged(QModelIndex, QModelIndex)),
this,
439 QListView::setViewMode(vm);
449 setCurrentIndex(index);
454 const QDesignerWidgetBoxInterface::Widget wgt =
463 const QModelIndex index = currentIndex();
464 if (!index.isValid() || !
m_proxyModel->removeRow(index.row()))
478 const QModelIndex index = currentIndex();
490 const QModelIndex filterIndex =
m_proxyModel->index(filterRow, 0);
494 QDesignerWidgetBoxInterface::Widget
518 const QIcon& icon,
bool editable)
525 QString domXml = widget.domXml();
527 if (domXml.isEmpty()) {
529 domXml +=
"<widget class=\"";
530 domXml += widget.name();
Defines the macro ASSERT.
#define ASSERT(condition)
sample designer interface
WidgetBoxCategoryEntryDelegate(QWidget *parent=0)
QWidget * createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
QString const & name(EShape k)
QVariant DecorationRole(const SessionItem &item)
Returns tooltip for given item.
QVariant ToolTipRole(const SessionItem &item, int ncol=0)
Returns tooltip for given item.
QDesignerWidgetBoxInterface::Widget widget