aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/forms/bookmarksdialog.cpp42
-rw-r--r--src/forms/bookmarksdialog.h44
-rw-r--r--src/forms/bookmarksdialog.ui78
-rw-r--r--src/mainwindow.cpp2
-rw-r--r--src/mainwindow.h3
-rw-r--r--src/smolbote.qbs5
-rw-r--r--src/xbel/xbel.cpp170
-rw-r--r--src/xbel/xbel.h51
8 files changed, 395 insertions, 0 deletions
diff --git a/src/forms/bookmarksdialog.cpp b/src/forms/bookmarksdialog.cpp
new file mode 100644
index 0000000..bf5a9fc
--- /dev/null
+++ b/src/forms/bookmarksdialog.cpp
@@ -0,0 +1,42 @@
+/** LICENSE ********************************************************************
+ **
+ ** 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 "bookmarksdialog.h"
+#include "ui_bookmarksdialog.h"
+
+#include "xbel/xbel.h"
+
+BookmarksDialog::BookmarksDialog(QWidget *parent) :
+ QDialog(parent),
+ ui(new Ui::BookmarksDialog)
+{
+ ui->setupUi(this);
+
+ xbel = new Xbel(ui->treeWidget);
+ xbel->read("bookmarks.xbel");
+}
+
+BookmarksDialog::~BookmarksDialog()
+{
+ xbel->write("bookmarks.xbel");
+
+ delete xbel;
+ delete ui;
+}
diff --git a/src/forms/bookmarksdialog.h b/src/forms/bookmarksdialog.h
new file mode 100644
index 0000000..b01fc8b
--- /dev/null
+++ b/src/forms/bookmarksdialog.h
@@ -0,0 +1,44 @@
+/** LICENSE ********************************************************************
+ **
+ ** 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 <QDialog>
+#include "xbel/xbel.h"
+
+namespace Ui {
+class BookmarksDialog;
+}
+
+class BookmarksDialog : public QDialog
+{
+ Q_OBJECT
+
+public:
+ explicit BookmarksDialog(QWidget *parent = 0);
+ ~BookmarksDialog();
+
+private:
+ Ui::BookmarksDialog *ui;
+ Xbel *xbel;
+};
+
+#endif // BOOKMARKSDIALOG_H
diff --git a/src/forms/bookmarksdialog.ui b/src/forms/bookmarksdialog.ui
new file mode 100644
index 0000000..f578737
--- /dev/null
+++ b/src/forms/bookmarksdialog.ui
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>BookmarksDialog</class>
+ <widget class="QDialog" name="BookmarksDialog">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>640</width>
+ <height>480</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>Bookmarks</string>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout">
+ <item>
+ <widget class="QTreeWidget" name="treeWidget">
+ <column>
+ <property name="text">
+ <string notr="true">1</string>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>2</string>
+ </property>
+ </column>
+ </widget>
+ </item>
+ <item>
+ <widget class="QDialogButtonBox" name="buttonBox">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="standardButtons">
+ <set>QDialogButtonBox::Close</set>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <resources/>
+ <connections>
+ <connection>
+ <sender>buttonBox</sender>
+ <signal>accepted()</signal>
+ <receiver>BookmarksDialog</receiver>
+ <slot>accept()</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>248</x>
+ <y>254</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>157</x>
+ <y>274</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>buttonBox</sender>
+ <signal>rejected()</signal>
+ <receiver>BookmarksDialog</receiver>
+ <slot>reject()</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>316</x>
+ <y>260</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>286</x>
+ <y>274</y>
+ </hint>
+ </hints>
+ </connection>
+ </connections>
+</ui>
diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp
index 4cd8975..3bc5597 100644
--- a/src/mainwindow.cpp
+++ b/src/mainwindow.cpp
@@ -36,6 +36,7 @@ MainWindow::MainWindow(Browser *instance, QUrl defaultUrl, QWidget *parent) :
QMainWindow(parent),
downloadManager(new DownloadDialog(this)),
blocklistManager(new BlockerDialog(this)),
+ bookmarkManager(new BookmarksDialog(this)),
ui(new Ui::MainWindow),
navigationToolBar(new QToolBar(tr("Navigation"), this)),
tabToolBar(new QToolBar(tr("Tab bar"), this)),
@@ -67,6 +68,7 @@ MainWindow::MainWindow(Browser *instance, QUrl defaultUrl, QWidget *parent) :
ui->menuBar->addMenu(toolsMenu);
toolsMenu->addAction(tr("Downloads"), downloadManager, SLOT(show()));
toolsMenu->addAction(tr("Blocker"), blocklistManager, SLOT(show()));
+ toolsMenu->addAction(tr("Bookmarks"), bookmarkManager, SLOT(show()));
// Profile menu
QMenu *profileMenu = new QMenu(tr("Profile"), ui->menuBar);
diff --git a/src/mainwindow.h b/src/mainwindow.h
index e217c1f..15e406a 100644
--- a/src/mainwindow.h
+++ b/src/mainwindow.h
@@ -32,6 +32,7 @@
#include "webengine/urlinterceptor.h"
#include "forms/blockerdialog.h"
#include "widgets/loadingbar.h"
+#include "forms/bookmarksdialog.h"
namespace Ui {
class MainWindow;
@@ -68,6 +69,8 @@ private:
Browser *browserInstance;
DownloadDialog *downloadManager;
BlockerDialog *blocklistManager;
+ BookmarksDialog *bookmarkManager;
+
QString profileName;
WebEngineProfile *profile = nullptr;
diff --git a/src/smolbote.qbs b/src/smolbote.qbs
index 1f23534..ec0c9d5 100644
--- a/src/smolbote.qbs
+++ b/src/smolbote.qbs
@@ -34,6 +34,9 @@ Project {
"forms/blockerdialog.cpp",
"forms/blockerdialog.h",
"forms/blockerdialog.ui",
+ "forms/bookmarksdialog.cpp",
+ "forms/bookmarksdialog.h",
+ "forms/bookmarksdialog.ui",
"forms/downloaddialog.cpp",
"forms/downloaddialog.h",
"forms/downloaddialog.ui",
@@ -67,6 +70,8 @@ Project {
"widgets/urllineedit.h",
"widgets/webviewtabbar.cpp",
"widgets/webviewtabbar.h",
+ "xbel/xbel.cpp",
+ "xbel/xbel.h",
]
Depends { name: "Qt"; submodules: ["core", "widgets", "webengine", "webenginewidgets"] }
diff --git a/src/xbel/xbel.cpp b/src/xbel/xbel.cpp
new file mode 100644
index 0000000..509be1f
--- /dev/null
+++ b/src/xbel/xbel.cpp
@@ -0,0 +1,170 @@
+/** LICENSE ********************************************************************
+ **
+ ** 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;
+}
+
+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") {
+ readFolder(parentItem);
+ } else if(xmlReader.name() == "bookmark") {
+ readBookmark(parentItem);
+ } else if(xmlReader.name() == "separator") {
+ readSeparator(parentItem);
+ } else {
+ xmlReader.skipCurrentElement();
+ }
+ }
+}
+
+void Xbel::readTitle(QTreeWidgetItem *item)
+{
+ item->setText(0, xmlReader.readElementText());
+}
+
+void Xbel::readFolder(QTreeWidgetItem *parentItem)
+{
+ QTreeWidgetItem *folderItem = createChildItem(parentItem);
+ folderItem->setExpanded(xmlReader.attributes().value("folded") != "no");
+
+ readChildElements(folderItem);
+}
+
+void Xbel::readBookmark(QTreeWidgetItem *parentItem)
+{
+ QTreeWidgetItem *bookmarkItem = createChildItem(parentItem);
+ bookmarkItem->setFlags(bookmarkItem->flags() | Qt::ItemIsEditable);
+ bookmarkItem->setText(0, "Unknown Title");
+ bookmarkItem->setText(1, xmlReader.attributes().value("href").toString());
+
+ readChildElements(bookmarkItem);
+}
+
+void Xbel::readSeparator(QTreeWidgetItem *parentItem)
+{
+ QTreeWidgetItem *separatorItem = createChildItem(parentItem);
+ separatorItem->setText(0, "-----");
+ xmlReader.skipCurrentElement();
+}
+
+QTreeWidgetItem *Xbel::createChildItem(QTreeWidgetItem *item)
+{
+ QTreeWidgetItem *childItem;
+ if(item) {
+ childItem = new QTreeWidgetItem(item);
+ } else {
+ childItem = new QTreeWidgetItem(treeWidget);
+ }
+ childItem->setData(0, Qt::UserRole, xmlReader.name().toString());
+ 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/xbel/xbel.h b/src/xbel/xbel.h
new file mode 100644
index 0000000..7f80eeb
--- /dev/null
+++ b/src/xbel/xbel.h
@@ -0,0 +1,51 @@
+/** LICENSE ********************************************************************
+ **
+ ** 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>
+
+class QTreeWidget;
+class QTreeWidgetItem;
+class Xbel
+{
+public:
+ Xbel(QTreeWidget *widget);
+ bool read(const QString &xbel);
+ bool write(const QString &xbel);
+
+private:
+ void readChildElements(QTreeWidgetItem *parentItem);
+ void readTitle(QTreeWidgetItem *item);
+ void readFolder(QTreeWidgetItem *parentItem);
+ void readBookmark(QTreeWidgetItem *parentItem);
+ void readSeparator(QTreeWidgetItem *parentItem);
+
+ QTreeWidgetItem *createChildItem(QTreeWidgetItem *item);
+
+ void writeItem(QTreeWidgetItem *item);
+
+ QTreeWidget *treeWidget;
+ QXmlStreamReader xmlReader;
+ QXmlStreamWriter xmlWriter;
+};
+
+#endif // XBELREADER_H