Skip to content
This repository has been archived by the owner on May 10, 2018. It is now read-only.

Commit

Permalink
[Bookmarks] New JSON backend supports multi-level folders and more...
Browse files Browse the repository at this point in the history
Merge branch 'bookmarks'

Closes #458
  • Loading branch information
nowrep committed Feb 10, 2014
2 parents 1c8b25f + a19164c commit d328ad2
Show file tree
Hide file tree
Showing 83 changed files with 4,549 additions and 3,741 deletions.
1 change: 0 additions & 1 deletion .gitignore
Expand Up @@ -23,7 +23,6 @@ git_revision
*.exp
*.zip
Thumbs.db
tests/modeltest
*.pdb
*.ilk
*.kdev4
Expand Down
4 changes: 2 additions & 2 deletions .travis.yml
Expand Up @@ -12,12 +12,12 @@ before_install:
install:
- sudo apt-get -qq update
- sudo apt-get -qq install libssl-dev pkg-config libhunspell-dev
- if [[ "$QT" == "qt4" ]]; then sudo apt-get -qq install libqt4-dev libqt4-webkit libqt4-sql-sqlite; fi
- if [[ "$QT" == "qt4" ]]; then sudo apt-get -qq install libqt4-dev libqt4-webkit libqt4-sql-sqlite libqjson-dev; fi
- if [[ "$QT" == "qt5" ]]; then sudo apt-add-repository -y ppa:beineri/opt-qt511; sudo apt-get update -qq; sudo apt-get install -qq qt51base qt51webkit qt51tools qt51script libgstreamer0.10-dev libgstreamer-plugins-base0.10-dev; fi

script:
- QMAKE="qmake"
- if [[ "$QT" == "qt5" ]]; then QMAKE="/opt/qt51/bin/qmake"; fi
- $QMAKE QMAKE_CXXFLAGS+="-Wextra -Werror"
- make
- make || exit 1
- cd scripts && ./run_tests.sh $QMAKE
2 changes: 1 addition & 1 deletion README.md
@@ -1,7 +1,7 @@
QupZilla Web Browser
----------------------------------------------------------------------------------------

[![Build Status](https://travis-ci.org/QupZilla/qupzilla.png?branch=master)](https://travis-ci.org/QupZilla/qupzilla)
[![Build Status](https://travis-ci.org/QupZilla/qupzilla.png?branch=bookmarks)](https://travis-ci.org/QupZilla/qupzilla)
Homepage: [http://www.qupzilla.com](http://www.qupzilla.com)
Blog: [http://blog.qupzilla.com](http://blog.qupzilla.com)
IRC: `#qupzilla` at `irc.freenode.net`
Expand Down
8 changes: 8 additions & 0 deletions src/defines.pri
Expand Up @@ -58,6 +58,14 @@ else {
}
}

# QJson dependency
!mac:unix:isEqual(QT_MAJOR_VERSION, 4) {
!system(test -d /usr/include/qjson): error(ERROR: QJson cannot be found!)

# Ugly hack to check for Indent support in QJson
system(grep setIndentMode /usr/include/qjson/serializer.h > /dev/null): DEFINES *= QJSON_HAVE_INDENT
}

DEFINES *= QT_NO_URL_CAST_FROM_STRING
DEFINES *= QT_USE_QSTRINGBUILDER

Expand Down
16 changes: 10 additions & 6 deletions src/lib/app/mainapplication.cpp
Expand Up @@ -1187,8 +1187,9 @@ bool MainApplication::saveStateSlot()
qupzilla_->tabWidget()->savePinnedTabs();
}

// Saving cookies
// Save cookies & bookmarks
m_cookiejar->saveCookies();
m_bookmarks->saveSettings();

return true;
}
Expand Down Expand Up @@ -1247,11 +1248,11 @@ bool MainApplication::checkSettingsDir()
|
.config/qupzilla/
|
profiles/-----------
| |
default/ profiles.ini
|
browsedata.db
profiles/---------------------
| |
default/------------- profiles.ini
| |
browsedata.db bookmarks.json
*/

if (QDir(PROFILEDIR).exists() && QFile(PROFILEDIR + "profiles/profiles.ini").exists()) {
Expand Down Expand Up @@ -1281,6 +1282,9 @@ bool MainApplication::checkSettingsDir()
QFile(PROFILEDIR + "profiles/default/browsedata.db").remove();
QFile(":data/browsedata.db").copy(PROFILEDIR + "profiles/default/browsedata.db");
QFile(PROFILEDIR + "profiles/default/browsedata.db").setPermissions(QFile::ReadUser | QFile::WriteUser);
QFile(":data/bookmarks.json").copy(PROFILEDIR + "profiles/default/bookmarks.json");
QFile(PROFILEDIR + "profiles/default/bookmarks.json").setPermissions(QFile::ReadUser | QFile::WriteUser);

QFile versionFile(PROFILEDIR + "profiles/default/version");
versionFile.open(QFile::WriteOnly);
versionFile.write(QupZilla::VERSION.toUtf8());
Expand Down
162 changes: 19 additions & 143 deletions src/lib/app/qupzilla.cpp
Expand Up @@ -30,7 +30,6 @@
#include "downloadmanager.h"
#include "cookiejar.h"
#include "cookiemanager.h"
#include "bookmarksmanager.h"
#include "bookmarkstoolbar.h"
#include "clearprivatedata.h"
#include "sourceviewer.h"
Expand Down Expand Up @@ -67,6 +66,8 @@
#include "speeddial.h"
#include "menubar.h"
#include "qtwin.h"
#include "bookmarkstools.h"
#include "bookmarksmenu.h"

#include <QKeyEvent>
#include <QSplitter>
Expand Down Expand Up @@ -567,14 +568,8 @@ void QupZilla::setupMenu()
/******************
* Bookmarks Menu *
******************/
m_menuBookmarks = new Menu(tr("&Bookmarks"));
m_menuBookmarks->addAction(QIcon::fromTheme("bookmark-new"), tr("Bookmark &This Page"), MENU_RECEIVER, SLOT(bookmarkPage()))->setShortcut(QKeySequence("Ctrl+D"));
m_menuBookmarks->addAction(QIcon::fromTheme("bookmark-new-list"), tr("Bookmark &All Tabs"), MENU_RECEIVER, SLOT(bookmarkAllTabs()));
m_menuBookmarks->addAction(qIconProvider->fromTheme("bookmarks-organize"), tr("Organize &Bookmarks"), MENU_RECEIVER, SLOT(showBookmarksManager()))->setShortcut(QKeySequence("Ctrl+Shift+O"));
m_menuBookmarks->addSeparator();

connect(m_menuBookmarks, SIGNAL(aboutToShow()), MENU_RECEIVER, SLOT(aboutToShowBookmarksMenu()));
connect(m_menuBookmarks, SIGNAL(menuMiddleClicked(Menu*)), MENU_RECEIVER, SLOT(loadFolderBookmarks(Menu*)));
m_menuBookmarks = new BookmarksMenu();
m_menuBookmarks->setMainWindow(this);

/**************
* Tools Menu *
Expand Down Expand Up @@ -1010,120 +1005,6 @@ void QupZilla::aboutToHideFileMenu()
m_actionCloseWindow->setEnabled(true);
}

void QupZilla::aboutToShowBookmarksMenu()
{
if (!bookmarksMenuChanged()) {
if (menuBookmarksAction()) {
menuBookmarksAction()->setVisible(m_bookmarksToolbar->isVisible());
}
return;
}
setBookmarksMenuChanged(false);

while (m_menuBookmarks->actions().count() != 4) {
QAction* act = m_menuBookmarks->actions().at(4);
if (act->menu()) {
act->menu()->clear();
}
m_menuBookmarks->removeAction(act);
delete act;
}

QSqlQuery query;
query.exec("SELECT title, url, icon FROM bookmarks WHERE folder='bookmarksMenu'");
while (query.next()) {
QString title = query.value(0).toString();
const QUrl url = query.value(1).toUrl();
const QIcon icon = qIconProvider->iconFromImage(QImage::fromData(query.value(2).toByteArray()));
if (title.length() > 40) {
title.truncate(40);
title += "..";
}

Action* act = new Action(icon, title);
act->setData(url);
connect(act, SIGNAL(triggered()), MENU_RECEIVER, SLOT(loadActionUrl()));
connect(act, SIGNAL(middleClicked()), MENU_RECEIVER, SLOT(loadActionUrlInNewNotSelectedTab()));
m_menuBookmarks->addAction(act);
}

Menu* menuBookmarks = new Menu(_bookmarksToolbar, m_menuBookmarks);
menuBookmarks->setIcon(QIcon(style()->standardIcon(QStyle::SP_DirOpenIcon)));

query.exec("SELECT title, url, icon FROM bookmarks WHERE folder='bookmarksToolbar'");
while (query.next()) {
QString title = query.value(0).toString();
const QUrl url = query.value(1).toUrl();
const QIcon icon = qIconProvider->iconFromImage(QImage::fromData(query.value(2).toByteArray()));
if (title.length() > 40) {
title.truncate(40);
title += "..";
}

Action* act = new Action(icon, title);
act->setData(url);
connect(act, SIGNAL(triggered()), MENU_RECEIVER, SLOT(loadActionUrl()));
connect(act, SIGNAL(middleClicked()), MENU_RECEIVER, SLOT(loadActionUrlInNewNotSelectedTab()));
menuBookmarks->addAction(act);
}
if (menuBookmarks->isEmpty()) {
menuBookmarks->addAction(tr("Empty"))->setEnabled(false);
}
setMenuBookmarksAction(m_menuBookmarks->addMenu(menuBookmarks));

query.exec("SELECT name FROM folders");
while (query.next()) {
const QString folderName = query.value(0).toString();
Menu* tempFolder = new Menu(folderName, m_menuBookmarks);
tempFolder->setIcon(QIcon(style()->standardIcon(QStyle::SP_DirOpenIcon)));

QSqlQuery query2;
query2.prepare("SELECT title, url, icon FROM bookmarks WHERE folder=?");
query2.addBindValue(folderName);
query2.exec();
while (query2.next()) {
QString title = query2.value(0).toString();
const QUrl url = query2.value(1).toUrl();
const QIcon icon = qIconProvider->iconFromImage(QImage::fromData(query2.value(2).toByteArray()));
if (title.length() > 40) {
title.truncate(40);
title += "..";
}

Action* act = new Action(icon, title);
act->setData(url);
connect(act, SIGNAL(triggered()), MENU_RECEIVER, SLOT(loadActionUrl()));
connect(act, SIGNAL(middleClicked()), MENU_RECEIVER, SLOT(loadActionUrlInNewNotSelectedTab()));
tempFolder->addAction(act);
}
if (tempFolder->isEmpty()) {
tempFolder->addAction(tr("Empty"))->setEnabled(false);
}
m_menuBookmarks->addMenu(tempFolder);
}

m_menuBookmarks->addSeparator();

query.exec("SELECT title, url, icon FROM bookmarks WHERE folder='unsorted'");
while (query.next()) {
QString title = query.value(0).toString();
const QUrl url = query.value(1).toUrl();
const QIcon icon = qIconProvider->iconFromImage(QImage::fromData(query.value(2).toByteArray()));
if (title.length() > 40) {
title.truncate(40);
title += "..";
}

Action* act = new Action(icon, title);
act->setData(url);
connect(act, SIGNAL(triggered()), MENU_RECEIVER, SLOT(loadActionUrl()));
connect(act, SIGNAL(middleClicked()), MENU_RECEIVER, SLOT(loadActionUrlInNewNotSelectedTab()));
m_menuBookmarks->addAction(act);
}

menuBookmarksAction()->setVisible(m_bookmarksToolbar->isVisible());
}

void QupZilla::aboutToShowHistoryMenu()
{
TabbedWebView* view = weView();
Expand Down Expand Up @@ -1180,7 +1061,7 @@ void QupZilla::aboutToShowHistoryRecentMenu()
Action* act = new Action(_iconForUrl(url), title);
act->setData(url);
connect(act, SIGNAL(triggered()), MENU_RECEIVER, SLOT(loadActionUrl()));
connect(act, SIGNAL(middleClicked()), MENU_RECEIVER, SLOT(loadActionUrlInNewNotSelectedTab()));
connect(act, SIGNAL(ctrlTriggered()), MENU_RECEIVER, SLOT(loadActionUrlInNewNotSelectedTab()));
m_menuHistoryRecent->addAction(act);
}

Expand All @@ -1205,7 +1086,7 @@ void QupZilla::aboutToShowHistoryMostMenu()
Action* act = new Action(_iconForUrl(entry.url), title);
act->setData(entry.url);
connect(act, SIGNAL(triggered()), MENU_RECEIVER, SLOT(loadActionUrl()));
connect(act, SIGNAL(middleClicked()), MENU_RECEIVER, SLOT(loadActionUrlInNewNotSelectedTab()));
connect(act, SIGNAL(ctrlTriggered()), MENU_RECEIVER, SLOT(loadActionUrlInNewNotSelectedTab()));
m_menuHistoryMost->addAction(act);
}

Expand Down Expand Up @@ -1379,17 +1260,18 @@ void QupZilla::triggerCaretBrowsing()

void QupZilla::bookmarkPage()
{
mApp->browsingLibrary()->bookmarksManager()->addBookmark(weView());
TabbedWebView* view = weView();
BookmarksTools::addBookmarkDialog(this, view->url(), view->title());
}

void QupZilla::addBookmark(const QUrl &url, const QString &title, const QIcon &icon)
void QupZilla::bookmarkAllTabs()
{
mApp->browsingLibrary()->bookmarksManager()->insertBookmark(url, title, icon);
BookmarksTools::bookmarkAllTabsDialog(this, m_tabWidget);
}

void QupZilla::bookmarkAllTabs()
void QupZilla::addBookmark(const QUrl &url, const QString &title)
{
mApp->browsingLibrary()->bookmarksManager()->insertAllTabs();
BookmarksTools::addBookmarkDialog(this, url, title);
}

void QupZilla::newWindow()
Expand Down Expand Up @@ -1500,24 +1382,18 @@ void QupZilla::loadActionUrlInNewNotSelectedTab(QObject* obj)
}
}

void QupZilla::loadFolderBookmarks(Menu* menu)
void QupZilla::loadAddress(const QUrl &url)
{
const QString folder = Bookmarks::fromTranslatedFolder(menu->title());
if (folder.isEmpty()) {
return;
if (weView()->webTab()->isPinned()) {
int index = m_tabWidget->addView(url, qzSettings->newTabPosition);
weView(index)->setFocus();
}

foreach (const Bookmark &b, mApp->bookmarks()->getFolderBookmarks(folder)) {
tabWidget()->addView(b.url, b.title, Qz::NT_NotSelectedTab);
else {
weView()->setFocus();
weView()->load(url);
}
}

void QupZilla::loadAddress(const QUrl &url)
{
weView()->setFocus();
weView()->load(url);
}

void QupZilla::showCookieManager()
{
CookieManager* m = mApp->cookieManager();
Expand Down
9 changes: 4 additions & 5 deletions src/lib/app/qupzilla.h
Expand Up @@ -36,6 +36,7 @@ class TabWidget;
class TabbedWebView;
class LineEdit;
class SearchToolBar;
class BookmarksMenu;
class BookmarksToolbar;
class AutoFill;
class MainApplication;
Expand Down Expand Up @@ -78,7 +79,7 @@ class QT_QUPZILLA_EXPORT QupZilla : public QMainWindow
void currentTabChanged();
void updateLoadingActions();

void addBookmark(const QUrl &url, const QString &title, const QIcon &icon);
void addBookmark(const QUrl &url, const QString &title);
void addDeleteOnCloseWidget(QWidget* widget);

void restoreWindowState(const RestoreManager::WindowData &d);
Expand Down Expand Up @@ -129,9 +130,9 @@ public slots:
void loadActionUrl(QObject* obj = 0);
void loadActionUrlInNewTab(QObject* obj = 0);
void loadActionUrlInNewNotSelectedTab(QObject* obj = 0);
void loadFolderBookmarks(Menu* menu);

void bookmarkPage();
void bookmarkAllTabs();
void loadAddress(const QUrl &url);
void showSource(QWebFrame* frame = 0, const QString &selectedHtml = QString());
void printPage(QWebFrame* frame = 0);
Expand All @@ -156,7 +157,6 @@ private slots:
void aboutToShowHistoryMenu();
void aboutToHideHistoryMenu();
void aboutToShowClosedTabsMenu();
void aboutToShowBookmarksMenu();
void aboutToShowViewMenu();
void aboutToHideViewMenu();
void aboutToShowEditMenu();
Expand All @@ -181,7 +181,6 @@ private slots:
void showBookmarkImport();

void refreshHistory();
void bookmarkAllTabs();
void newWindow();

void openLocation();
Expand Down Expand Up @@ -281,7 +280,7 @@ private slots:
QMenu* m_menuHelp;
QMenu* m_menuView;
QMenu* m_toolbarsMenu;
Menu* m_menuBookmarks;
BookmarksMenu* m_menuBookmarks;
Menu* m_menuHistory;
QMenu* m_menuClosedTabs;
Menu* m_menuHistoryRecent;
Expand Down
3 changes: 3 additions & 0 deletions src/lib/app/qz_namespace.h
Expand Up @@ -43,6 +43,9 @@ static const int sessionVersion = 0x0003 | 0x050000;
static const int sessionVersion = 0x0003;
#endif

// Version of bookmarks.json file
static const int bookmarksVersion = 1;

enum AppMessageType {
AM_SetAdBlockIconEnabled,
AM_CheckPrivateBrowsing,
Expand Down

1 comment on commit d328ad2

@srazi
Copy link
Member

@srazi srazi commented on d328ad2 Feb 11, 2014

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Great, thanks :-)

Please sign in to comment.