diff options
| author | Aqua-sama <aqua@iserlohn-fortress.net> | 2017-09-04 16:20:09 +0200 | 
|---|---|---|
| committer | Aqua-sama <aqua@iserlohn-fortress.net> | 2017-09-04 16:20:09 +0200 | 
| commit | 02980eb506e2b624d539a2dfb29bbe1834dd07a0 (patch) | |
| tree | 3efd42ae40652c7085bc45843c3f890c07c1aea3 /src/lib/bookmarks | |
| parent | Implemented Print to PDF action (diff) | |
| download | smolbote-02980eb506e2b624d539a2dfb29bbe1834dd07a0.tar.xz | |
Split off Bookmarks into static lib
Diffstat (limited to 'src/lib/bookmarks')
| -rw-r--r-- | src/lib/bookmarks/bookmarks.qbs | 26 | ||||
| -rw-r--r-- | src/lib/bookmarks/bookmarksform.ui | 104 | ||||
| -rw-r--r-- | src/lib/bookmarks/bookmarkswidget.cpp | 96 | ||||
| -rw-r--r-- | src/lib/bookmarks/bookmarkswidget.h | 59 | ||||
| -rw-r--r-- | src/lib/bookmarks/xbel.cpp | 198 | ||||
| -rw-r--r-- | src/lib/bookmarks/xbel.h | 57 | 
6 files changed, 540 insertions, 0 deletions
| diff --git a/src/lib/bookmarks/bookmarks.qbs b/src/lib/bookmarks/bookmarks.qbs new file mode 100644 index 0000000..22971a4 --- /dev/null +++ b/src/lib/bookmarks/bookmarks.qbs @@ -0,0 +1,26 @@ +import qbs 1.0 + +Project { +    name: "bookmarks" + +    StaticLibrary { +        id: bookmarks +        name: "bookmarks" + +        cpp.includePaths: ['../..'] + +        Depends { +            name: "Qt" +            versionAtLeast: "5.9.0" +            submodules: ["core", "widgets"] +        } + +        files: [ +            "bookmarksform.ui", +            "bookmarkswidget.cpp", +            "bookmarkswidget.h", +            "xbel.cpp", +            "xbel.h", +        ] +    } +} diff --git a/src/lib/bookmarks/bookmarksform.ui b/src/lib/bookmarks/bookmarksform.ui new file mode 100644 index 0000000..2df0c4b --- /dev/null +++ b/src/lib/bookmarks/bookmarksform.ui @@ -0,0 +1,104 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>BookmarksDialog</class> + <widget class="QWidget" name="BookmarksDialog"> +  <property name="geometry"> +   <rect> +    <x>0</x> +    <y>0</y> +    <width>420</width> +    <height>600</height> +   </rect> +  </property> +  <property name="minimumSize"> +   <size> +    <width>420</width> +    <height>600</height> +   </size> +  </property> +  <property name="windowTitle"> +   <string>Bookmarks</string> +  </property> +  <layout class="QVBoxLayout" name="verticalLayout"> +   <item> +    <layout class="QHBoxLayout" name="horizontalLayout_2"> +     <item> +      <widget class="QToolButton" name="addFolder_toolButton"> +       <property name="text"> +        <string>...</string> +       </property> +      </widget> +     </item> +     <item> +      <widget class="QToolButton" name="addBookmark_toolButton"> +       <property name="text"> +        <string>...</string> +       </property> +      </widget> +     </item> +     <item> +      <widget class="QToolButton" name="addSeparator_toolButton"> +       <property name="text"> +        <string>...</string> +       </property> +      </widget> +     </item> +     <item> +      <widget class="QToolButton" name="deleteItem_toolButton"> +       <property name="text"> +        <string>...</string> +       </property> +      </widget> +     </item> +    </layout> +   </item> +   <item> +    <widget class="QTreeWidget" name="treeWidget"> +     <property name="dragEnabled"> +      <bool>true</bool> +     </property> +     <property name="dragDropMode"> +      <enum>QAbstractItemView::InternalMove</enum> +     </property> +     <property name="defaultDropAction"> +      <enum>Qt::MoveAction</enum> +     </property> +     <column> +      <property name="text"> +       <string notr="true">Title</string> +      </property> +     </column> +     <column> +      <property name="text"> +       <string>href</string> +      </property> +     </column> +    </widget> +   </item> +   <item> +    <widget class="QGroupBox" name="groupBox"> +     <property name="title"> +      <string>Details</string> +     </property> +     <layout class="QFormLayout" name="formLayout"> +      <item row="1" column="0"> +       <widget class="QLabel" name="href_label"> +        <property name="text"> +         <string>href</string> +        </property> +       </widget> +      </item> +      <item row="1" column="1"> +       <widget class="QLineEdit" name="href_lineEdit"/> +      </item> +      <item row="0" column="1"> +       <widget class="QLineEdit" name="title_lineEdit"/> +      </item> +     </layout> +    </widget> +   </item> +  </layout> + </widget> + <resources/> + <connections/> +</ui> diff --git a/src/lib/bookmarks/bookmarkswidget.cpp b/src/lib/bookmarks/bookmarkswidget.cpp new file mode 100644 index 0000000..38716ce --- /dev/null +++ b/src/lib/bookmarks/bookmarkswidget.cpp @@ -0,0 +1,96 @@ +/******************************************************************************* + ** + ** smolbote: yet another qute browser + ** Copyright (C) 2017  Xian Nox + ** + ** This program is free software: you can redistribute it and/or modify + ** it under the terms of the GNU General Public License as published by + ** the Free Software Foundation, either version 3 of the License, or + ** (at your option) any later version. + ** + ** This program is distributed in the hope that it will be useful, + ** but WITHOUT ANY WARRANTY; without even the implied warranty of + ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + ** GNU General Public License for more details. + ** + ** You should have received a copy of the GNU General Public License + ** along with this program.  If not, see <http://www.gnu.org/licenses/>. + ** + ******************************************************************************/ + +#include "bookmarkswidget.h" +#include "ui_bookmarksform.h" +#include <QTreeWidget> +#include <QUrl> + +BookmarksWidget::BookmarksWidget(const QString &path, QWidget *parent) : +    DockingWidget(tr("Bookmarks"), parent), +    ui(new Ui::BookmarksDialog) +{ +    // make sure this dialog does not get deleted on close +    setAttribute(Qt::WA_DeleteOnClose, false); + +    ui->setupUi(this); +    ui->treeWidget->header()->setSectionResizeMode(QHeaderView::Stretch); + +    QStyle *style = ui->treeWidget->style(); +    ui->addFolder_toolButton->setIcon(style->standardPixmap(QStyle::SP_DirIcon)); +    ui->addBookmark_toolButton->setIcon(style->standardPixmap(QStyle::SP_FileIcon)); +    ui->addSeparator_toolButton->setText("---"); +    ui->deleteItem_toolButton->setIcon(style->standardPixmap(QStyle::SP_TrashIcon)); + +    connect(ui->treeWidget, SIGNAL(itemSelectionChanged()), this, SLOT(showItemDetails())); +    connect(ui->treeWidget, SIGNAL(itemActivated(QTreeWidgetItem*,int)), this, SLOT(openItem(QTreeWidgetItem*,int))); + +    ui->deleteItem_toolButton->setShortcut(QKeySequence::Delete); +    connect(ui->deleteItem_toolButton, SIGNAL(clicked(bool)), this, SLOT(deleteCurrentItem())); + +    m_path = path; +    xbel = new Xbel(ui->treeWidget); +    xbel->read(m_path); + +    connect(ui->addFolder_toolButton, &QToolButton::clicked, [this]() { +        xbel->addFolder(ui->treeWidget->currentItem()); +    }); +    connect(ui->addBookmark_toolButton, &QToolButton::clicked, [this]() { +        xbel->addBookmark(ui->treeWidget->currentItem()); +    }); +    connect(ui->addSeparator_toolButton, &QToolButton::clicked, [this]() { +        xbel->addSeparator(ui->treeWidget->currentItem()); +    }); +} + +BookmarksWidget::~BookmarksWidget() +{ +    qDebug("Destroying BookmarksManager"); + +    if(ui->treeWidget->topLevelItemCount() > 0) { +        xbel->write(m_path); +    } + +    delete xbel; +    delete ui; +} + +void BookmarksWidget::deleteCurrentItem() +{ +    delete ui->treeWidget->currentItem(); +} + +void BookmarksWidget::openItem(QTreeWidgetItem *item, int column) +{ +    Q_UNUSED(column) +    emit openUrl(QUrl::fromUserInput(item->text(1))); +} + +void BookmarksWidget::showItemDetails() +{ +    QTreeWidgetItem *item = ui->treeWidget->currentItem(); +    if(!item) { +        ui->title_lineEdit->setText(""); +        ui->href_label->setText(""); +        return; +    } +    ui->title_lineEdit->setText(item->text(0)); +    ui->href_lineEdit->setText(item->text(1)); +} diff --git a/src/lib/bookmarks/bookmarkswidget.h b/src/lib/bookmarks/bookmarkswidget.h new file mode 100644 index 0000000..a31cfea --- /dev/null +++ b/src/lib/bookmarks/bookmarkswidget.h @@ -0,0 +1,59 @@ +/******************************************************************************* + ** + ** smolbote: yet another qute browser + ** Copyright (C) 2017  Xian Nox + ** + ** This program is free software: you can redistribute it and/or modify + ** it under the terms of the GNU General Public License as published by + ** the Free Software Foundation, either version 3 of the License, or + ** (at your option) any later version. + ** + ** This program is distributed in the hope that it will be useful, + ** but WITHOUT ANY WARRANTY; without even the implied warranty of + ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + ** GNU General Public License for more details. + ** + ** You should have received a copy of the GNU General Public License + ** along with this program.  If not, see <http://www.gnu.org/licenses/>. + ** + ******************************************************************************/ + +#ifndef BOOKMARKSDIALOG_H +#define BOOKMARKSDIALOG_H + +#include "widgets/dockingwidget.h" +#include <QDockWidget> +#include "xbel.h" + +namespace Ui { +class BookmarksDialog; +} + +class BookmarksWidget : public DockingWidget +{ +    Q_OBJECT + +public: +    explicit BookmarksWidget(const QString &path, QWidget *parent = 0); +    ~BookmarksWidget(); + +signals: +    void openUrl(const QUrl &url); + +public slots: +    // void addFolder(const QString &title); +    // void addBookmark(const QString &title, const QString &href); +    // void addSeparator(); +    void deleteCurrentItem(); + +private slots: +    void openItem(QTreeWidgetItem *item, int column); +    void showItemDetails(); + +private: +    QString m_path; +    Ui::BookmarksDialog *ui; +    Xbel *xbel; +}; + +#endif // BOOKMARKSDIALOG_H diff --git a/src/lib/bookmarks/xbel.cpp b/src/lib/bookmarks/xbel.cpp new file mode 100644 index 0000000..7ba0cb4 --- /dev/null +++ b/src/lib/bookmarks/xbel.cpp @@ -0,0 +1,198 @@ +/******************************************************************************* + ** + ** smolbote: yet another qute browser + ** Copyright (C) 2017  Xian Nox + ** + ** This program is free software: you can redistribute it and/or modify + ** it under the terms of the GNU General Public License as published by + ** the Free Software Foundation, either version 3 of the License, or + ** (at your option) any later version. + ** + ** This program is distributed in the hope that it will be useful, + ** but WITHOUT ANY WARRANTY; without even the implied warranty of + ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + ** GNU General Public License for more details. + ** + ** You should have received a copy of the GNU General Public License + ** along with this program.  If not, see <http://www.gnu.org/licenses/>. + ** + ******************************************************************************/ + +#include "xbel.h" +#include <QFile> + +#include <QTreeWidgetItem> + +Xbel::Xbel(QTreeWidget *widget) +{ +    treeWidget = widget; + +    QStyle *style = treeWidget->style(); +    folderIcon.addPixmap(style->standardPixmap(QStyle::SP_DirOpenIcon), QIcon::Normal, QIcon::On); +    folderIcon.addPixmap(style->standardPixmap(QStyle::SP_DirClosedIcon), QIcon::Normal, QIcon::Off); +    bookmarkIcon.addPixmap(style->standardPixmap(QStyle::SP_FileIcon)); +} + +bool Xbel::read(const QString &xbel) +{ +    // no file specified +    if(xbel.isEmpty()) { +        return false; +    } + +    QFile file(xbel); +    if(!file.open(QIODevice::ReadOnly | QIODevice::Text)) { +        // file cannot be opened +        qDebug("Cannot open xbel: %s", qUtf8Printable(xbel)); +        return false; +    } + +    xmlReader.setDevice(&file); + +    if(xmlReader.readNextStartElement()) { +        if(xmlReader.name() == "xbel" && xmlReader.attributes().value("version") == "1.0") { +            qDebug("valid xbel"); +            readChildElements(0); +        } else { +            qDebug("invalid xbel"); +            return false; +        } + +    } +    return true; +} + +bool Xbel::write(const QString &xbel) +{ +    // no file specified +    if(xbel.isEmpty()) { +        return false; +    } + +    QFile file(xbel); +    if(!file.open(QIODevice::WriteOnly | QIODevice::Text)) { +        // file cannot be opened +        qDebug("Cannot open xbel: %s", qUtf8Printable(xbel)); +        return false; +    } + +    xmlWriter.setAutoFormatting(true); +    xmlWriter.setDevice(&file); + +    xmlWriter.writeStartDocument(); +    xmlWriter.writeDTD("<!DOCTYPE xbel>"); +    xmlWriter.writeStartElement("xbel"); +    xmlWriter.writeAttribute("version", "1.0"); + +    for(int i=0; i<treeWidget->topLevelItemCount(); i++) { +        writeItem(treeWidget->topLevelItem(i)); +    } + +    xmlWriter.writeEndDocument(); +    return true; +} + +void Xbel::readChildElements(QTreeWidgetItem *parentItem) +{ +    while(xmlReader.readNextStartElement()) { +        if(xmlReader.name() == "title") { +            readTitle(parentItem); +        } else if(xmlReader.name() == "folder") { +            readChildElements(addFolder(parentItem)); +        } else if(xmlReader.name() == "bookmark") { +            QTreeWidgetItem *item = addBookmark(parentItem); +            item->setText(1, xmlReader.attributes().value("href").toString()); +            readChildElements(item); +        } else if(xmlReader.name() == "separator") { +            addSeparator(parentItem); +            xmlReader.skipCurrentElement(); +        } else { +            xmlReader.skipCurrentElement(); +        } +    } +} + +void Xbel::readTitle(QTreeWidgetItem *item) +{ +    item->setText(0, xmlReader.readElementText()); +} + +QTreeWidgetItem *Xbel::addFolder(QTreeWidgetItem *parentItem) +{ +    QTreeWidgetItem *folderItem = createChildItem(parentFolder(parentItem), "folder"); +    //folderItem->setExpanded(xmlReader.attributes().value("folded") != "no"); +    treeWidget->setItemExpanded(folderItem, xmlReader.attributes().value("folded") != "yes"); +    folderItem->setFlags(folderItem->flags() | Qt::ItemIsEditable); +    folderItem->setIcon(0, folderIcon); + +    return folderItem; +} + +QTreeWidgetItem *Xbel::addBookmark(QTreeWidgetItem *parentItem) +{ +    QTreeWidgetItem *bookmarkItem = createChildItem(parentFolder(parentItem), "bookmark"); +    bookmarkItem->setFlags((bookmarkItem->flags() | Qt::ItemIsEditable) & ~Qt::ItemIsDropEnabled); +    bookmarkItem->setIcon(0, bookmarkIcon); +    bookmarkItem->setText(0, "Unknown Title"); +    bookmarkItem->setText(1, "Unknown Address"); + +    return bookmarkItem; +} + +void Xbel::addSeparator(QTreeWidgetItem *parentItem) +{ +    QTreeWidgetItem *separatorItem = createChildItem(parentFolder(parentItem), "separator"); +    separatorItem->setFlags(separatorItem->flags() & ~Qt::ItemIsDropEnabled); +    separatorItem->setText(0, "-----"); +} + +QTreeWidgetItem *Xbel::parentFolder(QTreeWidgetItem *item) +{ +    QTreeWidgetItem *parentItem = item; + +    if(parentItem) { +        while(parentItem->data(0, Qt::UserRole) != "folder") { +            parentItem = parentItem->parent(); +            if(parentItem == 0) { +                break; +            } +        } +    } + +    return parentItem; +} + +QTreeWidgetItem *Xbel::createChildItem(QTreeWidgetItem *item, const QString &type) +{ +    QTreeWidgetItem *childItem; +    if(item) { +        childItem = new QTreeWidgetItem(item); +    } else { +        childItem = new QTreeWidgetItem(treeWidget); +    } +    childItem->setData(0, Qt::UserRole, type); +    return childItem; +} + +void Xbel::writeItem(QTreeWidgetItem *item) +{ +    QString tagName = item->data(0, Qt::UserRole).toString(); +    if (tagName == "folder") { +        xmlWriter.writeStartElement(tagName); +        xmlWriter.writeAttribute("folded", treeWidget->isItemExpanded(item) ? "no" : "yes"); +        xmlWriter.writeTextElement("title", item->text(0)); +        for (int i = 0; i < item->childCount(); ++i) { +            writeItem(item->child(i)); +        } +        xmlWriter.writeEndElement(); +    } else if (tagName == "bookmark") { +        xmlWriter.writeStartElement(tagName); +        if (!item->text(1).isEmpty()) { +            xmlWriter.writeAttribute("href", item->text(1)); +        } +        xmlWriter.writeTextElement("title", item->text(0)); +        xmlWriter.writeEndElement(); +    } else if (tagName == "separator") { +        xmlWriter.writeEmptyElement(tagName); +    } +} diff --git a/src/lib/bookmarks/xbel.h b/src/lib/bookmarks/xbel.h new file mode 100644 index 0000000..0ff98fc --- /dev/null +++ b/src/lib/bookmarks/xbel.h @@ -0,0 +1,57 @@ +/******************************************************************************* + ** + ** smolbote: yet another qute browser + ** Copyright (C) 2017  Xian Nox + ** + ** This program is free software: you can redistribute it and/or modify + ** it under the terms of the GNU General Public License as published by + ** the Free Software Foundation, either version 3 of the License, or + ** (at your option) any later version. + ** + ** This program is distributed in the hope that it will be useful, + ** but WITHOUT ANY WARRANTY; without even the implied warranty of + ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + ** GNU General Public License for more details. + ** + ** You should have received a copy of the GNU General Public License + ** along with this program.  If not, see <http://www.gnu.org/licenses/>. + ** + ******************************************************************************/ + +#ifndef XBELREADER_H +#define XBELREADER_H + +#include <QXmlStreamReader> +#include <QIcon> + +class QTreeWidget; +class QTreeWidgetItem; +class Xbel +{ +public: +    explicit Xbel(QTreeWidget *widget); +    bool read(const QString &xbel); +    bool write(const QString &xbel); + +    QTreeWidgetItem *addFolder(QTreeWidgetItem *parentItem); +    QTreeWidgetItem *addBookmark(QTreeWidgetItem *parentItem); +    void addSeparator(QTreeWidgetItem *parentItem); + +private: +    void readChildElements(QTreeWidgetItem *parentItem); +    void readTitle(QTreeWidgetItem *item); + +    QTreeWidgetItem *parentFolder(QTreeWidgetItem *item); +    QTreeWidgetItem *createChildItem(QTreeWidgetItem *item, const QString &type); + +    void writeItem(QTreeWidgetItem *item); + +    QIcon folderIcon; +    QIcon bookmarkIcon; + +    QTreeWidget *treeWidget; +    QXmlStreamReader xmlReader; +    QXmlStreamWriter xmlWriter; +}; + +#endif // XBELREADER_H | 
