From c8092afddcc42ffccbd3f0fec18ff191c1d932cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20Mr=C3=A1zek?= Date: Wed, 11 Aug 2010 08:08:08 +0200 Subject: [PATCH] A fake-ish data model that at least shows something (can load any xml file) --- offsetedit/CMakeLists.txt | 9 +- offsetedit/src/CMakeLists.txt | 3 +- offsetedit/src/dfedit.cpp | 36 ++++-- offsetedit/src/dfedit.h | 2 + offsetedit/src/memxmlModel.cpp | 209 +++++++++++++++++++++++++++++++++ offsetedit/src/memxmlModel.h | 30 +++++ 6 files changed, 274 insertions(+), 15 deletions(-) create mode 100644 offsetedit/src/memxmlModel.cpp create mode 100644 offsetedit/src/memxmlModel.h diff --git a/offsetedit/CMakeLists.txt b/offsetedit/CMakeLists.txt index e4d379f04..246f3ba3d 100644 --- a/offsetedit/CMakeLists.txt +++ b/offsetedit/CMakeLists.txt @@ -1,5 +1,8 @@ project(dfoffsetedit) cmake_minimum_required(VERSION 2.6) -find_package(Qt4 REQUIRED) - -add_subdirectory (src) \ No newline at end of file +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) diff --git a/offsetedit/src/CMakeLists.txt b/offsetedit/src/CMakeLists.txt index f5981c879..dc2eeea6e 100644 --- a/offsetedit/src/CMakeLists.txt +++ b/offsetedit/src/CMakeLists.txt @@ -2,6 +2,7 @@ include_directories(${QT_INCLUDES} ${CMAKE_CURRENT_BINARY_DIR}) set ( dfoffsetedit_SRCS dfedit.cpp + memxmlModel.cpp main.cpp ) @@ -23,4 +24,4 @@ qt4_automoc(${dfoffsetedit_SRCS}) #ADD_EXECUTABLE( sample ${SAMPLE_SRCS} ${SAMPLE_MOC_SRCS} ${SAMPLE_RC_SRCS} ${SAMPLE_UI_HDRS}) add_executable(dfoffsetedit ${dfoffsetedit_SRCS} ${dfoffsetedit_RC_SRCS}) -target_link_libraries(dfoffsetedit ${QT_QTCORE_LIBRARY} ${QT_QTGUI_LIBRARY}) \ No newline at end of file +target_link_libraries(dfoffsetedit ${QT_QTCORE_LIBRARY} ${QT_QTGUI_LIBRARY} ${QT_QTXML_LIBRARY} ) \ No newline at end of file diff --git a/offsetedit/src/dfedit.cpp b/offsetedit/src/dfedit.cpp index cb1c1b9ef..dc4fc3205 100644 --- a/offsetedit/src/dfedit.cpp +++ b/offsetedit/src/dfedit.cpp @@ -1,6 +1,7 @@ #include "dfedit.h" #include #include +#include "memxmlModel.h" dfedit::dfedit(QWidget *parent): QMainWindow(parent) { @@ -12,15 +13,15 @@ dfedit::dfedit(QWidget *parent): QMainWindow(parent) connect(ui.actionSave_As,SIGNAL(triggered(bool)),this,SLOT(slotSaveAs(bool))); connect(ui.actionSetup_DF_executables,SIGNAL(triggered(bool)),this,SLOT(slotSetupDFs(bool))); ui.actionOpen->setIcon(QIcon::fromTheme("document-open")); - ui.actionOpen->setIconText("Open"); + ui.actionOpen->setIconText(tr("Open")); ui.actionSave->setIcon(QIcon::fromTheme("document-save")); - ui.actionSave->setIconText("Save"); + ui.actionSave->setIconText(tr("Save")); ui.actionSave_As->setIcon(QIcon::fromTheme("document-save-as")); - ui.actionSave_As->setIconText("Save As"); + ui.actionSave_As->setIconText(tr("Save As")); ui.actionRun_DF->setIcon(QIcon::fromTheme("system-run")); - ui.actionRun_DF->setIconText("Run DF"); + ui.actionRun_DF->setIconText(tr("Run DF")); ui.actionQuit->setIcon(QIcon::fromTheme("application-exit")); - ui.actionQuit->setIconText("Run DF"); + ui.actionQuit->setIconText(tr("Run DF")); } dfedit::~dfedit() @@ -28,16 +29,29 @@ dfedit::~dfedit() void dfedit::slotOpen(bool ) { - QFileDialog fd(this,"Locate the Memoxy.xml file"); - fd.setNameFilter("Memory definition (Memory.xml)"); + QFileDialog fd(this,tr("Locate the Memoxy.xml file")); + fd.setNameFilter(tr("Memory definition (Memory.xml)")); fd.setFileMode(QFileDialog::ExistingFile); fd.setAcceptMode(QFileDialog::AcceptOpen); int result = fd.exec(); if(result == QDialog::Accepted) { QStringList files = fd.selectedFiles(); - QString file = files[0]; - qDebug() << "File:" << file; + QString fileName = files[0]; + QDomDocument doc("memxml"); + QFile file(fileName); + if(!file.open(QIODevice::ReadOnly)) + { + return; + } + if(!doc.setContent(&file)) + { + file.close(); + return; + } + mod = new MemXMLModel(doc,this); + ui.entryView->setModel(mod); + file.close(); } } @@ -58,8 +72,8 @@ void dfedit::slotRunDF(bool ) void dfedit::slotSaveAs(bool ) { - QFileDialog fd(this,"Choose file to save as..."); - fd.setNameFilter("Memory definition (*.xml)"); + QFileDialog fd(this,tr("Choose file to save as...")); + fd.setNameFilter(tr("Memory definition (*.xml)")); fd.setFileMode(QFileDialog::AnyFile); fd.selectFile("Memory.xml"); fd.setAcceptMode(QFileDialog::AcceptSave); diff --git a/offsetedit/src/dfedit.h b/offsetedit/src/dfedit.h index dfc03421e..2a30ef7aa 100644 --- a/offsetedit/src/dfedit.h +++ b/offsetedit/src/dfedit.h @@ -3,6 +3,7 @@ #include #include "ui_main.h" +#include "memxmlModel.h" class dfedit : public QMainWindow { @@ -13,6 +14,7 @@ public: private: Ui::MainWindow ui; + MemXMLModel * mod; public slots: void slotOpen(bool); void slotQuit(bool); diff --git a/offsetedit/src/memxmlModel.cpp b/offsetedit/src/memxmlModel.cpp new file mode 100644 index 000000000..ce03f9bce --- /dev/null +++ b/offsetedit/src/memxmlModel.cpp @@ -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 +#include +#include +#include + +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 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::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(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(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(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(parent.internalPointer()); + + return parentItem->node().childNodes().count(); +} + +#include "memxmlModel.moc" \ No newline at end of file diff --git a/offsetedit/src/memxmlModel.h b/offsetedit/src/memxmlModel.h new file mode 100644 index 000000000..2879f4b5f --- /dev/null +++ b/offsetedit/src/memxmlModel.h @@ -0,0 +1,30 @@ +#ifndef memxmlModel_H +#define memxmlModel_H + +#include +#include + +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