25#include <QRegularExpression>
32class PaletteModel :
public QAbstractListModel
39 ElementTypeRole = Qt::UserRole + 1
42 explicit PaletteModel(QObject *parent =
nullptr);
44 [[nodiscard]]
int rowCount(
const QModelIndex &parent = QModelIndex())
const override;
45 [[nodiscard]] QVariant data(
const QModelIndex &index,
int role = Qt::DisplayRole)
const override;
46 [[nodiscard]] QMimeData *mimeData(
const QModelIndexList &indexes)
const override;
47 [[nodiscard]] Qt::ItemFlags flags(
const QModelIndex &index)
const override;
52 Entry(
Element::Type type_,
const QString &iconName_,
const QString &name_)
68 QVector<Entry> m_entries;
73PaletteModel::PaletteModel(QObject *parent)
74 : QAbstractListModel(parent)
77 m_entries << Entry(
Element::StateType, QStringLiteral(
":/kdsme/icons/state.png"), tr(
"State"));
78 m_entries << Entry(
Element::FinalStateType, QStringLiteral(
":/kdsme/icons/final_state.png"), tr(
"Final State"));
85int PaletteModel::rowCount(
const QModelIndex &parent)
const
90 return static_cast<int>(m_entries.count());
93QVariant PaletteModel::data(
const QModelIndex &index,
int role)
const
95 if (!index.isValid() || index.row() < 0 || index.row() >= m_entries.size())
98 const Entry &entry = m_entries.at(index.row());
100 case Qt::DisplayRole:
102 case Qt::DecorationRole: {
103 return QIcon(entry.iconName);
105 case ElementTypeRole:
106 return QVariant::fromValue<Element::Type>(entry.type);
112QMimeData *PaletteModel::mimeData(
const QModelIndexList &indexes)
const
114 Q_ASSERT(indexes.size() == 1);
116 const QModelIndex index = indexes.first();
117 auto type = index.data(ElementTypeRole).value<
Element::Type>();
120 auto *mimeData =
new QMimeData;
122 mimeData->setUrls({ QUrl(QStringLiteral(
"%1:Element/%2").arg(QStringLiteral(
KDSME_QML_URI_PREFIX)).arg(typeString)) });
128 static const QRegularExpression stateTypeRE(QStringLiteral(
".+StateType$"));
129 if (typeString.contains(stateTypeRE)) {
130 mimeData->setData(QStringLiteral(
"StateType"),
"");
133 static const QRegularExpression transitionTypeRE(QStringLiteral(
".+TransitionType$"));
134 if (typeString.contains(transitionTypeRE)) {
135 mimeData->setData(QStringLiteral(
"TransitionType"),
"");
138 mimeData->setData(QStringLiteral(
"external"),
"");
139 mimeData->setData(typeString,
"");
144Qt::ItemFlags PaletteModel::flags(
const QModelIndex &index)
const
146 auto flags = QAbstractListModel::flags(index);
147 return Qt::ItemIsDragEnabled | flags;
150struct StateMachinePaletteWidget::Private
158 auto *layout =
new QVBoxLayout(
this);
159 layout->setContentsMargins(0, 0, 0, 0);
161 auto *view =
new QListView(
this);
162 view->setDragEnabled(
true);
163 view->setViewMode(QListView::IconMode);
164 view->setFlow(QListView::LeftToRight);
165 view->setGridSize(QSize(128, 48));
166 view->setSpacing(10);
167 view->setIconSize(QSize(32, 32));
168 view->viewport()->setAcceptDrops(
false);
169 layout->addWidget(view);
170 view->setModel(
new PaletteModel);
177#include "statemachinepalettewidget.moc"
static Q_INVOKABLE const char * typeToString(KDSME::Element::Type type)
#define KDSME_QML_URI_PREFIX