22 #include <QtCore/QXmlStreamWriter>
27 const int MaxCompression = 9;
31 : QAbstractItemModel(parent), m_root_item(0), m_name(
"DefaultName"), m_model_tag(model_tag)
53 Qt::ItemFlags result_flags = QAbstractItemModel::flags(
index);
54 if (
index.isValid()) {
55 result_flags |= Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsDragEnabled;
59 result_flags |= Qt::ItemIsEditable;
62 result_flags |= Qt::ItemIsDropEnabled;
65 result_flags |= Qt::ItemIsDropEnabled;
77 if (role == Qt::DisplayRole || role == Qt::EditRole) {
81 return item->itemName();
92 return item->roleProperty(role);
100 if (orientation == Qt::Horizontal && role == Qt::DisplayRole) {
130 return QModelIndex();
135 return createIndex(row, column, item);
136 return QModelIndex();
141 if (!child.isValid())
142 return QModelIndex();
147 return QModelIndex();
149 return createIndex(
ParentRow(*parent_item), 0, parent_item);
152 return QModelIndex();
157 if (!
index.isValid())
160 QModelIndex dataIndex =
index;
162 if (item->setRoleProperty(role, value))
173 for (
int i = 0; i < count; ++i)
185 if (indices.count() != 2)
189 QMimeData* mime_data =
new QMimeData;
191 QXmlStreamWriter writer(&xml_data);
200 int column,
const QModelIndex& parent)
const
204 if (action == Qt::IgnoreAction)
206 if (action != Qt::MoveAction || column > 0 || !
data
213 QXmlStreamReader reader(xml_data);
214 while (!reader.atEnd()) {
216 if (reader.isStartElement()) {
220 return acceptable_child_items.contains(
model_type);
228 const QModelIndex& parent)
230 if (action == Qt::IgnoreAction)
232 if (action != Qt::MoveAction || column > 0 || !
data
239 QXmlStreamReader reader(xml_data);
241 row = item->numberOfChildren();
242 beginInsertRows(
parent, row, row);
254 return QModelIndex();
257 return createIndex(row, 0, item);
280 if (!parent_item->
insertItem(row, new_item, tag))
281 throw GUIHelpers::Error(
"SessionModel::insertNewItem -> Error. Can't insert item");
287 int row, QString tag)
301 QVector<QString> result;
303 result = parent_item->acceptableDefaultItemTypes();
320 if (!file.open(QIODevice::ReadOnly))
324 QXmlStreamReader reader(&file);
326 if (reader.hasError())
334 if (!file.open(QIODevice::WriteOnly | QIODevice::Text))
337 QXmlStreamWriter writer(&file);
338 writer.setAutoFormatting(
true);
339 writer.writeStartDocument();
340 writer.writeStartElement(
"BornAgain");
343 writer.writeEndElement();
344 writer.writeEndDocument();
369 if (reader->hasError())
390 const QString tagName = tag.isEmpty() ? new_parent->
defaultTag() : tag;
395 if (item->
parent() == new_parent) {
397 int previousIndex = item->
parent()->
getItems(tagName).indexOf(item);
398 if (row == previousIndex)
400 else if (previousIndex >= 0 && row > previousIndex)
425 const QString tagName = tag.isEmpty() ? new_parent->
defaultTag() : tag;
428 QXmlStreamWriter writer(&xml_data);
431 QXmlStreamReader reader(xml_data);
434 return new_parent->
getItems(tagName).back();
440 throw GUIHelpers::Error(
"SessionModel::createCopy() -> Error. Not implemented.");
445 QByteArray byte_array;
446 QXmlStreamWriter writer(&byte_array);
447 writer.setAutoFormatting(
true);
451 QXmlStreamReader reader(byte_array);
453 while (!reader.atEnd()) {
455 if (reader.isStartElement())
468 return QVector<SessionItem*>();
#define ASSERT(condition)
Defines class GUIHelpers functions.
Defines class ItemFactory.
Defines namespace SessionItemUtils.
Defines class SessionModel.
The service to collect messages from different senders.
SessionItemTags * sessionItemTags()
bool insertItem(int row, SessionItem *item, const QString &tag="")
Insert item into given tag into given row.
bool registerTag(const QString &name, int min=0, int max=-1, QStringList modelTypes={})
Add new tag to this item with given name, min, max and types.
QVector< SessionItem * > getItems(const QString &tag="") const
Returns vector of all items of given tag.
int numberOfChildren() const
Returns total number of children.
QVariant value() const
Get value.
int rowOfChild(SessionItem *child) const
Returns row index of given child.
QString defaultTag() const
Get default tag.
SessionItem * parent() const
Returns parent of this item.
void setDefaultTag(const QString &tag)
Set default tag.
SessionItem * takeRow(int row)
Removes row from item and returns the item.
SessionItem * takeItem(int row, const QString &tag)
Remove item from given row from given tag.
SessionItem * childAt(int row) const
Returns the child at the given row.
QString modelType() const
Get model type.
void setModel(SessionModel *model)
virtual QModelIndex parent(const QModelIndex &child) const
SessionItem * copy(const SessionItem *item_to_copy, SessionItem *new_parent=0, const QString &tag="")
Copy given item to the new_parent at given row.
virtual void writeTo(QXmlStreamWriter *writer, SessionItem *parent=0)
virtual Qt::ItemFlags flags(const QModelIndex &index) const
SessionItem * itemForIndex(const QModelIndex &index) const
virtual bool canDropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent) const
virtual QVector< SessionItem * > nonXMLItems() const
QString m_dragged_item_type
virtual bool dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent)
virtual QModelIndex index(int row, int column, const QModelIndex &parent) const
virtual bool setData(const QModelIndex &index, const QVariant &value, int role)
virtual QVariant headerData(int section, Qt::Orientation orientation, int role) const
virtual int columnCount(const QModelIndex &parent) const
virtual int rowCount(const QModelIndex &parent) const
virtual bool removeRows(int row, int count, const QModelIndex &parent)
void load(const QString &filename="")
SessionModel(QString model_tag, QObject *parent=0)
void removeItem(SessionItem *item)
SessionItem * insertNewItem(QString model_type, SessionItem *parent_item=nullptr, int row=-1, QString tag="")
virtual QStringList mimeTypes() const
void save(const QString &filename="")
virtual void initFrom(SessionModel *model, SessionItem *parent)
SessionItem * moveItem(SessionItem *item, SessionItem *new_parent=0, int row=-1, const QString &tag="")
Move given parameterized item to the new_parent at given row.
QString m_model_tag
model tag (SampleModel, InstrumentModel)
SessionItem * rootItem() const
virtual QVariant data(const QModelIndex &index, int role) const
QVector< QString > acceptableDefaultItemTypes(const QModelIndex &parent) const
virtual QMimeData * mimeData(const QModelIndexList &indexes) const
virtual void readFrom(QXmlStreamReader *reader, MessageService *messageService=0)
SessionItem * m_root_item
QModelIndex indexOfItem(SessionItem *item) const
virtual SessionModel * createCopy(SessionItem *parent=0)
std::string filename(const std::string &path)
Returns path without directory part ("Foo/Bar/Doz.int.gz" -> "Doz.int.gz")
QString getBornAgainVersionString()
SessionItem * CreateEmptyItem()
create empty SessionItem that serves as a root item
SessionItem * CreateItem(const QString &model_name, SessionItem *parent=nullptr)
create SessionItem of specific type and parent
QVariant DecorationRole(const SessionItem &item)
Returns tooltip for given item.
QVariant CheckStateRole(const SessionItem &item)
Returns check state for given item.
QVariant ToolTipRole(const SessionItem &item, int ncol=0)
Returns tooltip for given item.
QVariant ForegroundRole(const SessionItem &item)
Returns text color for given item.
int ParentRow(const SessionItem &item)
Returns the index of the given item within its parent. Returns -1 when no parent is set.
const QString ModelTypeAttribute("ModelType")
void writeItemAndChildItems(QXmlStreamWriter *writer, const SessionItem *item)
void readItems(QXmlStreamReader *reader, SessionItem *parent, QString topTag="", MessageService *messageService=nullptr)
void writeTo(QXmlStreamWriter *writer, SessionItem *parent)
const QString ModelNameAttribute("Name")
const QString ItemTag("Item")
const QString ItemMimeType