29317b426b
The stream-based XML serialization API resides in corelib/serialization. Move the steambookmarks example there. The Qt XML documentation is updated to no longer refer to this example code directly and refer to the direct location in the example documentation instead. Task-number: QTBUG-110647 Pick-to: 6.5 Change-Id: Id36fb04a6acb7b8d1eb008f61568fe0abc221e3d Reviewed-by: Marc Mutz <marc.mutz@qt.io>
141 lines
3.9 KiB
C++
141 lines
3.9 KiB
C++
// Copyright (C) 2016 The Qt Company Ltd.
|
|
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
|
|
|
|
#include <QtWidgets>
|
|
|
|
#include "xbelreader.h"
|
|
|
|
//! [0]
|
|
XbelReader::XbelReader(QTreeWidget *treeWidget)
|
|
: treeWidget(treeWidget)
|
|
{
|
|
QStyle *style = treeWidget->style();
|
|
|
|
folderIcon.addPixmap(style->standardPixmap(QStyle::SP_DirClosedIcon),
|
|
QIcon::Normal, QIcon::Off);
|
|
folderIcon.addPixmap(style->standardPixmap(QStyle::SP_DirOpenIcon),
|
|
QIcon::Normal, QIcon::On);
|
|
bookmarkIcon.addPixmap(style->standardPixmap(QStyle::SP_FileIcon));
|
|
}
|
|
//! [0]
|
|
|
|
//! [1]
|
|
bool XbelReader::read(QIODevice *device)
|
|
{
|
|
xml.setDevice(device);
|
|
|
|
if (xml.readNextStartElement()) {
|
|
if (xml.name() == QLatin1String("xbel")
|
|
&& xml.attributes().value(versionAttribute()) == QLatin1String("1.0")) {
|
|
readXBEL();
|
|
} else {
|
|
xml.raiseError(QObject::tr("The file is not an XBEL version 1.0 file."));
|
|
}
|
|
}
|
|
|
|
return !xml.error();
|
|
}
|
|
//! [1]
|
|
|
|
//! [2]
|
|
QString XbelReader::errorString() const
|
|
{
|
|
return QObject::tr("%1\nLine %2, column %3")
|
|
.arg(xml.errorString())
|
|
.arg(xml.lineNumber())
|
|
.arg(xml.columnNumber());
|
|
}
|
|
//! [2]
|
|
|
|
//! [3]
|
|
void XbelReader::readXBEL()
|
|
{
|
|
Q_ASSERT(xml.isStartElement() && xml.name() == QLatin1String("xbel"));
|
|
|
|
while (xml.readNextStartElement()) {
|
|
if (xml.name() == QLatin1String("folder"))
|
|
readFolder(0);
|
|
else if (xml.name() == QLatin1String("bookmark"))
|
|
readBookmark(0);
|
|
else if (xml.name() == QLatin1String("separator"))
|
|
readSeparator(0);
|
|
else
|
|
xml.skipCurrentElement();
|
|
}
|
|
}
|
|
//! [3]
|
|
|
|
//! [4]
|
|
void XbelReader::readTitle(QTreeWidgetItem *item)
|
|
{
|
|
Q_ASSERT(xml.isStartElement() && xml.name() == QLatin1String("title"));
|
|
|
|
QString title = xml.readElementText();
|
|
item->setText(0, title);
|
|
}
|
|
//! [4]
|
|
|
|
//! [5]
|
|
void XbelReader::readSeparator(QTreeWidgetItem *item)
|
|
{
|
|
Q_ASSERT(xml.isStartElement() && xml.name() == QLatin1String("separator"));
|
|
|
|
QTreeWidgetItem *separator = createChildItem(item);
|
|
separator->setFlags(item->flags() & ~Qt::ItemIsSelectable);
|
|
separator->setText(0, QString(30, u'\xB7'));
|
|
xml.skipCurrentElement();
|
|
}
|
|
//! [5]
|
|
|
|
void XbelReader::readFolder(QTreeWidgetItem *item)
|
|
{
|
|
Q_ASSERT(xml.isStartElement() && xml.name() == QLatin1String("folder"));
|
|
|
|
QTreeWidgetItem *folder = createChildItem(item);
|
|
bool folded = (xml.attributes().value(foldedAttribute()) != QLatin1String("no"));
|
|
folder->setExpanded(!folded);
|
|
|
|
while (xml.readNextStartElement()) {
|
|
if (xml.name() == QLatin1String("title"))
|
|
readTitle(folder);
|
|
else if (xml.name() == QLatin1String("folder"))
|
|
readFolder(folder);
|
|
else if (xml.name() == QLatin1String("bookmark"))
|
|
readBookmark(folder);
|
|
else if (xml.name() == QLatin1String("separator"))
|
|
readSeparator(folder);
|
|
else
|
|
xml.skipCurrentElement();
|
|
}
|
|
}
|
|
|
|
void XbelReader::readBookmark(QTreeWidgetItem *item)
|
|
{
|
|
Q_ASSERT(xml.isStartElement() && xml.name() == QLatin1String("bookmark"));
|
|
|
|
QTreeWidgetItem *bookmark = createChildItem(item);
|
|
bookmark->setFlags(bookmark->flags() | Qt::ItemIsEditable);
|
|
bookmark->setIcon(0, bookmarkIcon);
|
|
bookmark->setText(0, QObject::tr("Unknown title"));
|
|
bookmark->setText(1, xml.attributes().value(hrefAttribute()).toString());
|
|
|
|
while (xml.readNextStartElement()) {
|
|
if (xml.name() == QLatin1String("title"))
|
|
readTitle(bookmark);
|
|
else
|
|
xml.skipCurrentElement();
|
|
}
|
|
}
|
|
|
|
QTreeWidgetItem *XbelReader::createChildItem(QTreeWidgetItem *item)
|
|
{
|
|
QTreeWidgetItem *childItem;
|
|
if (item) {
|
|
childItem = new QTreeWidgetItem(item);
|
|
} else {
|
|
childItem = new QTreeWidgetItem(treeWidget);
|
|
}
|
|
childItem->setData(0, Qt::UserRole, xml.name().toString());
|
|
return childItem;
|
|
}
|