A fake-ish data model that at least shows something (can load any xml file)
parent
1dc4aea04f
commit
c8092afddc
@ -1,5 +1,8 @@
|
||||
project(dfoffsetedit)
|
||||
cmake_minimum_required(VERSION 2.6)
|
||||
find_package(Qt4 REQUIRED)
|
||||
|
||||
add_subdirectory (src)
|
||||
find_package(Qt4 QUIET)
|
||||
if(QT4_FOUND)
|
||||
add_subdirectory (src)
|
||||
else(QT4_FOUND)
|
||||
MESSAGE(STATUS "Qt4 libraries not found - offset editor can't be built.")
|
||||
endif(QT4_FOUND)
|
||||
|
@ -0,0 +1,209 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2005-2006 Trolltech ASA. All rights reserved.
|
||||
**
|
||||
** This file was part of the example classes of the Qt Toolkit.
|
||||
** Now it's being hacked into some other shape... :)
|
||||
**
|
||||
** This file may be used under the terms of the GNU General Public
|
||||
** License version 2.0 as published by the Free Software Foundation
|
||||
** and appearing in the file LICENSE.GPL included in the packaging of
|
||||
** this file. Please review the following information to ensure GNU
|
||||
** General Public Licensing requirements will be met:
|
||||
** http://www.trolltech.com/products/qt/opensource.html
|
||||
**
|
||||
** If you are unsure which license is appropriate for your use, please
|
||||
** review the following information:
|
||||
** http://www.trolltech.com/products/qt/licensing.html or contact the
|
||||
** sales department at sales@trolltech.com.
|
||||
**
|
||||
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
|
||||
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#include "memxmlModel.h"
|
||||
#include <QtGui>
|
||||
#include <QtXml>
|
||||
#include <QDomNode>
|
||||
#include <QHash>
|
||||
|
||||
class DomItem
|
||||
{
|
||||
public:
|
||||
DomItem(QDomNode &node, int row, DomItem *parent = 0);
|
||||
~DomItem();
|
||||
DomItem *child(int i);
|
||||
DomItem *parent();
|
||||
QDomNode node() const;
|
||||
int row();
|
||||
|
||||
private:
|
||||
QDomNode domNode;
|
||||
QHash<int,DomItem*> childItems;
|
||||
DomItem *parentItem;
|
||||
int rowNumber;
|
||||
};
|
||||
|
||||
DomItem::DomItem(QDomNode &node, int row, DomItem *parent)
|
||||
{
|
||||
domNode = node;
|
||||
// Record the item's location within its parent.
|
||||
rowNumber = row;
|
||||
parentItem = parent;
|
||||
}
|
||||
|
||||
DomItem::~DomItem()
|
||||
{
|
||||
QHash<int,DomItem*>::iterator it;
|
||||
for (it = childItems.begin(); it != childItems.end(); ++it)
|
||||
delete it.value();
|
||||
}
|
||||
|
||||
QDomNode DomItem::node() const
|
||||
{
|
||||
return domNode;
|
||||
}
|
||||
|
||||
DomItem *DomItem::parent()
|
||||
{
|
||||
return parentItem;
|
||||
}
|
||||
|
||||
DomItem *DomItem::child(int i)
|
||||
{
|
||||
if (childItems.contains(i))
|
||||
return childItems[i];
|
||||
|
||||
if (i >= 0 && i < domNode.childNodes().count()) {
|
||||
QDomNode childNode = domNode.childNodes().item(i);
|
||||
DomItem *childItem = new DomItem(childNode, i, this);
|
||||
childItems[i] = childItem;
|
||||
return childItem;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int DomItem::row()
|
||||
{
|
||||
return rowNumber;
|
||||
}
|
||||
|
||||
MemXMLModel::MemXMLModel(QDomDocument document, QObject *parent)
|
||||
: QAbstractItemModel(parent), domDocument(document)
|
||||
{
|
||||
rootItem = new DomItem(domDocument, 0);
|
||||
}
|
||||
|
||||
MemXMLModel::~MemXMLModel()
|
||||
{
|
||||
delete rootItem;
|
||||
}
|
||||
|
||||
int MemXMLModel::columnCount(const QModelIndex &/*parent*/) const
|
||||
{
|
||||
return 3;
|
||||
}
|
||||
|
||||
QVariant MemXMLModel::data(const QModelIndex &index, int role) const
|
||||
{
|
||||
if (!index.isValid())
|
||||
return QVariant();
|
||||
|
||||
if (role != Qt::DisplayRole)
|
||||
return QVariant();
|
||||
|
||||
DomItem *item = static_cast<DomItem*>(index.internalPointer());
|
||||
|
||||
QDomNode node = item->node();
|
||||
QStringList attributes;
|
||||
QDomNamedNodeMap attributeMap = node.attributes();
|
||||
|
||||
switch (index.column()) {
|
||||
case 0:
|
||||
return node.nodeName();
|
||||
case 1:
|
||||
for (int i = 0; (unsigned int)(i) < attributeMap.count(); ++i) {
|
||||
QDomNode attribute = attributeMap.item(i);
|
||||
attributes << attribute.nodeName() + "=\""
|
||||
+attribute.nodeValue() + "\"";
|
||||
}
|
||||
return attributes.join(" ");
|
||||
case 2:
|
||||
return node.nodeValue().split("\n").join(" ");
|
||||
default:
|
||||
return QVariant();
|
||||
}
|
||||
}
|
||||
|
||||
Qt::ItemFlags MemXMLModel::flags(const QModelIndex &index) const
|
||||
{
|
||||
if (!index.isValid())
|
||||
return Qt::ItemIsEnabled;
|
||||
|
||||
return Qt::ItemIsEnabled | Qt::ItemIsSelectable;
|
||||
}
|
||||
|
||||
QVariant MemXMLModel::headerData(int section, Qt::Orientation orientation,
|
||||
int role) const
|
||||
{
|
||||
if (orientation == Qt::Horizontal && role == Qt::DisplayRole) {
|
||||
switch (section) {
|
||||
case 0:
|
||||
return tr("Name");
|
||||
case 1:
|
||||
return tr("Attributes");
|
||||
case 2:
|
||||
return tr("Value");
|
||||
default:
|
||||
return QVariant();
|
||||
}
|
||||
}
|
||||
|
||||
return QVariant();
|
||||
}
|
||||
|
||||
QModelIndex MemXMLModel::index(int row, int column, const QModelIndex &parent)
|
||||
const
|
||||
{
|
||||
DomItem *parentItem;
|
||||
|
||||
if (!parent.isValid())
|
||||
parentItem = rootItem;
|
||||
else
|
||||
parentItem = static_cast<DomItem*>(parent.internalPointer());
|
||||
|
||||
DomItem *childItem = parentItem->child(row);
|
||||
if (childItem)
|
||||
return createIndex(row, column, childItem);
|
||||
else
|
||||
return QModelIndex();
|
||||
}
|
||||
|
||||
QModelIndex MemXMLModel::parent(const QModelIndex &child) const
|
||||
{
|
||||
if (!child.isValid())
|
||||
return QModelIndex();
|
||||
|
||||
DomItem *childItem = static_cast<DomItem*>(child.internalPointer());
|
||||
DomItem *parentItem = childItem->parent();
|
||||
|
||||
if (!parentItem || parentItem == rootItem)
|
||||
return QModelIndex();
|
||||
|
||||
return createIndex(parentItem->row(), 0, parentItem);
|
||||
}
|
||||
|
||||
int MemXMLModel::rowCount(const QModelIndex &parent) const
|
||||
{
|
||||
DomItem *parentItem;
|
||||
|
||||
if (!parent.isValid())
|
||||
parentItem = rootItem;
|
||||
else
|
||||
parentItem = static_cast<DomItem*>(parent.internalPointer());
|
||||
|
||||
return parentItem->node().childNodes().count();
|
||||
}
|
||||
|
||||
#include "memxmlModel.moc"
|
@ -0,0 +1,30 @@
|
||||
#ifndef memxmlModel_H
|
||||
#define memxmlModel_H
|
||||
|
||||
#include <qabstractitemmodel.h>
|
||||
#include <qdom.h>
|
||||
|
||||
class DomItem;
|
||||
|
||||
class MemXMLModel : public QAbstractItemModel
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
MemXMLModel(QDomDocument document, QObject *parent = 0);
|
||||
~MemXMLModel();
|
||||
|
||||
QVariant data(const QModelIndex &index, int role) const;
|
||||
Qt::ItemFlags flags(const QModelIndex &index) const;
|
||||
QVariant headerData(int section, Qt::Orientation orientation,
|
||||
int role = Qt::DisplayRole) const;
|
||||
QModelIndex index(int row, int column,
|
||||
const QModelIndex &parent = QModelIndex()) const;
|
||||
QModelIndex parent(const QModelIndex &child) const;
|
||||
int rowCount(const QModelIndex &parent = QModelIndex()) const;
|
||||
int columnCount(const QModelIndex &parent = QModelIndex()) const;
|
||||
|
||||
private:
|
||||
QDomDocument domDocument;
|
||||
DomItem *rootItem;
|
||||
};
|
||||
#endif // memxmlModel
|
Loading…
Reference in New Issue