From c4e1de1ec4dd51af18635410ceca4ff8f9f7a1f8 Mon Sep 17 00:00:00 2001 From: Bartosz Szatkowski Date: Mon, 16 Aug 2010 15:14:05 +0200 Subject: [PATCH] Bookamarks adding, removing, searching (basic), listing -> ready --- mdictionary.pro | 2 +- trunk/src/base/backbone/BookmarkTranslations.h | 12 ++++-- trunk/src/base/backbone/Bookmarks.cpp | 51 ++++++++++++++---------- trunk/src/base/backbone/Bookmarks.h | 15 +++++-- trunk/src/base/backbone/backbone.cpp | 9 +++++ trunk/src/base/backbone/backbone.h | 49 ++++++++++++++++++++++- trunk/src/base/base.pro | 2 +- trunk/src/base/gui/MainWindow.cpp | 5 +++ 8 files changed, 112 insertions(+), 33 deletions(-) diff --git a/mdictionary.pro b/mdictionary.pro index c54e852..912067e 100644 --- a/mdictionary.pro +++ b/mdictionary.pro @@ -4,7 +4,7 @@ isEmpty( ISQT4 ) { error("Use the qmake include with Qt4.4 or greater, on Debian that is qmake-qt4"); } - +QT += sql TEMPLATE = subdirs SUBDIRS = trunk diff --git a/trunk/src/base/backbone/BookmarkTranslations.h b/trunk/src/base/backbone/BookmarkTranslations.h index 0226f6a..5848390 100644 --- a/trunk/src/base/backbone/BookmarkTranslations.h +++ b/trunk/src/base/backbone/BookmarkTranslations.h @@ -30,15 +30,14 @@ #include "../../includes/settings.h" #include "../../includes/translation.h" +#include "Bookmarks.h" -class Bookmarks; class BookmarkTranslation : public Translation { public: - TranslationXdxf(); - TranslationXdxf(QString key, Bookmarks* bookmarks) { + BookmarkTranslation(QString key, Bookmarks* bookmarks) { _key = key; _dictionaryInfo = "Bookmarks"; _bookmarks = bookmarks; @@ -57,7 +56,12 @@ public: //! \return parsed raw format into html QString toHtml() const { - return _bookmarks->search(_key); + QStringList list = _bookmarks->search(_key); + QString result; + foreach(QString translation, list) + result += translation; + return result; + } /*! sets the word for which we want to find a translation diff --git a/trunk/src/base/backbone/Bookmarks.cpp b/trunk/src/base/backbone/Bookmarks.cpp index bb78627..c90edc0 100644 --- a/trunk/src/base/backbone/Bookmarks.cpp +++ b/trunk/src/base/backbone/Bookmarks.cpp @@ -1,18 +1,17 @@ #include "Bookmarks.h" - +#include "BookmarkTranslations.h" Bookmarks::Bookmarks() { dbName = QDir::homePath() + "/.mdictionary/" - + "history.db"; - db = QSqlDatabase::addDatabase("QSQLITE", "history"); + + "bookmarks.db"; + db = QSqlDatabase::addDatabase("QSQLITE", "bookmarks"); db.setDatabaseName(dbName); + checkAndCreateDb(); } bool Bookmarks::checkAndCreateDb() { - stopped = false; - if(!db.open()) { qDebug() << "Database error: " << db.lastError().text() << endl; return false; @@ -28,7 +27,7 @@ bool Bookmarks::checkAndCreateDb() { void Bookmarks::clear() { QSqlQuery cur(db); cur.exec("drop table bookmarks"); - cur.exec("create table bookmarks(word text ,translation text)"); + cur.exec("create table bookmarks(key text ,translation text)"); } @@ -36,7 +35,8 @@ void Bookmarks::clear() { void Bookmarks::add(Translation* translation) { QSqlQuery cur(db); cur.prepare("insert into bookmarks values (?,?)"); - cur.addBindValue(translation->key(), translation->key()); + cur.addBindValue(translation->key()); + cur.addBindValue(translation->toHtml()); cur.exec(); } @@ -45,7 +45,8 @@ void Bookmarks::add(Translation* translation) { void Bookmarks::remove(Translation* translation) { QSqlQuery cur(db); cur.prepare("delete from bookmarks where key=? and translation=?"); - cur.addBindValue(translation->key(), translation->key()); + cur.addBindValue(translation->key()); + cur.addBindValue(translation->key()); cur.exec(); } @@ -53,10 +54,10 @@ void Bookmarks::remove(Translation* translation) { QList Bookmarks::list() { QSqlQuery cur(db); - cur.exec("select key from bookmarks"); + cur.exec("select distinct key from bookmarks"); QList res; while(cur.next()) - res.append(new HistoryTranslation(cur.value(0).toString(), this)); + res.append(new BookmarkTranslation(cur.value(0).toString(), this)); return res; } @@ -75,31 +76,25 @@ QList Bookmarks::searchWordList(QString word) { cur.exec(); QList res; while(cur.next()) - res.append(new HistoryTranslation(cur.value(0).toString(), this)); + res.append(new BookmarkTranslation(cur.value(0).toString(), this)); return res; } -QList Bookmarks::search(QString word) { +QStringList Bookmarks::search(QString word) { QSqlQuery cur(db); - cur.prepare("select translation from bookmarks where word=? limit 1"); + QStringList result; + cur.prepare("select translation from bookmarks where word=?"); cur.addBindValue(word); cur.exec(); - if(cur.next()) - result = cur.value(0).toString(); + while(cur.next()) + result << cur.value(0).toString(); return result; } -void Bookmarks::clear() { - QSqlQuery cur(db); - cur.exec("drop table bookmarks"); - cur.exec("create table bookmarks(word text ,translation text)"); -} - - QString Bookmarks::removeAccents(QString string) { string = string.replace(QString::fromUtf8("ł"), "l", Qt::CaseInsensitive); QString normalized = string.normalized(QString::NormalizationForm_D); @@ -115,3 +110,15 @@ QString Bookmarks::removeAccents(QString string) { } return normalized; } + + + +bool Bookmarks::inBookmarks(QString word) { + QSqlQuery cur(db); + cur.prepare("select translation from bookmarks where word=? limit 1"); + cur.addBindValue(word); + cur.exec(); + if(cur.next()) + return true; + return false; +} diff --git a/trunk/src/base/backbone/Bookmarks.h b/trunk/src/base/backbone/Bookmarks.h index 22817c3..eeaa594 100644 --- a/trunk/src/base/backbone/Bookmarks.h +++ b/trunk/src/base/backbone/Bookmarks.h @@ -30,17 +30,20 @@ #ifndef BOOKMARKS_H #define BOOKMARKS_H +#include #include #include #include #include -#include #include +#include #include #include +#include #include "../../includes/settings.h" #include "../../includes/translation.h" -#include "HistoryTranslation.h" +class BookmarkTranslation; + /*! Bookmarks are way to store words that You think You will need to search for often. @@ -86,12 +89,18 @@ public: /*! clars bookmarks database */ void clear(); + + /*! \return true if given word is already in bookmarks + \param word to check + */ + bool inBookmarks(QString word); + private: QString dbName; QSqlDatabase db; bool checkAndCreateDb(); - QString removeAccents(); + QString removeAccents(QString); }; diff --git a/trunk/src/base/backbone/backbone.cpp b/trunk/src/base/backbone/backbone.cpp index 6270791..f15e1cd 100644 --- a/trunk/src/base/backbone/backbone.cpp +++ b/trunk/src/base/backbone/backbone.cpp @@ -72,6 +72,8 @@ void Backbone::init() { connect(&_resultWatcher, SIGNAL(finished()), this, SLOT(translationReady())); connect(&_htmlResultWatcher, SIGNAL(finished()), this, SLOT(htmlTranslationReady())); + connect(&_bookmarkWatcher, SIGNAL(finished()), this, + SLOT(bookmarksListReady())); QThreadPool::globalInstance()->setMaxThreadCount( QThreadPool::globalInstance()->maxThreadCount()+1); @@ -452,3 +454,10 @@ QList Backbone::activeDicts() { return res; } + + + +void Backbone::bookmarksListReady() { + _bookmarksResult = _innerBookmarks.result(); + Q_EMIT bookmarksReady(); +} diff --git a/trunk/src/base/backbone/backbone.h b/trunk/src/base/backbone/backbone.h index 142d729..d92fa50 100644 --- a/trunk/src/base/backbone/backbone.h +++ b/trunk/src/base/backbone/backbone.h @@ -47,6 +47,7 @@ #include "../../includes/settings.h" #include "../../includes/translation.h" #include "../../includes/History.h" +#include "Bookmarks.h" /*! Inner part of dictionary - glues together GUI and plugins @@ -138,8 +139,43 @@ public Q_SLOTS: */ void searchHtml(QList); - // TODO addToBookmark(Translation*); - // TODO removeFromBookmark(Translation*); + + /*! add bookmarks to given translations (translation object is fetched and + added to bookmarks data base (key and translation stored in db) + \param translation translation object to be stored in db + */ + void addBookmark(QList translations) { + foreach(Translation* translation, translations) + QtConcurrent::run(&bookmarks, &Bookmarks::add, translation); + } + + + /*! Remove bookmarks to given translatios + \param translation remove bookmark to this translation + */ + void removeBookmark(QList translations) { + foreach(Translation* translation, translations) + bookmarks.remove(translation); + } + + + /*! Searching for list of bookmarks may take some time, so i moved it to + new thread (to avoid gui blocking), when ready bookmarksReady is emited + and result is returned after calling getBookmarks() + */ + void fetchBookmarks() { + _bookmarksResult.clear(); + _innerBookmarks = QtConcurrent::run(bookmarks, &Bookmarks::list); + _bookmarkWatcher.setFuture(_innerBookmarks); + } + + /*! \return list of all bookmarks + */ + QList getBookmarks() { + return _bookmarksResult; + } + + Q_SIGNALS: /*! emmited when backbone is ready to close - after getting stop signal it @@ -155,6 +191,11 @@ Q_SIGNALS: //! throwed when searches are stopped void searchCanceled(); + //! emmited when bookmark list is ready to fetch + void bookmarksReady(); + +private Q_SLOTS: + void bookmarksListReady(); private: @@ -162,19 +203,23 @@ private: QList _plugins; QFuture > _innerResult; QFuture _innerHtmlResult; + QFuture > _innerBookmarks; QMultiHash _result; QStringList _htmlResult; + QList _bookmarksResult; //QTime _time; QString _pluginPath, _defaultPluginPath; QString _configPath; QString _defaultConfigPath; QFutureWatcher > _resultWatcher; + QFutureWatcher > _bookmarkWatcher; QFutureWatcher _htmlResultWatcher; int _searchLimit, _defaultSearchLimit; int _activeSearchNum; int _historyLen, _defaultHistoryLen; bool dryRun; bool stopped; + Bookmarks bookmarks; void init(); diff --git a/trunk/src/base/base.pro b/trunk/src/base/base.pro index 02bd90d..2a02ca7 100644 --- a/trunk/src/base/base.pro +++ b/trunk/src/base/base.pro @@ -4,7 +4,7 @@ # #------------------------------------------------- -QT += core gui +QT += core gui sql maemo5 { QT += maemo5 diff --git a/trunk/src/base/gui/MainWindow.cpp b/trunk/src/base/gui/MainWindow.cpp index c4e3958..3948a18 100644 --- a/trunk/src/base/gui/MainWindow.cpp +++ b/trunk/src/base/gui/MainWindow.cpp @@ -324,6 +324,11 @@ void MainWindow::connectWordList() { connect(wordListWidget, SIGNAL(showTranslation(QList)), this, SIGNAL(searchTranslations(QList))); + //TODO TEMP + connect(wordListWidget, SIGNAL(showTranslation(QList)), + backbone, SLOT(addBookmark(QList))); + + connect(this, SIGNAL(setBusy()), wordListWidget, SLOT(lockList())); -- 1.7.9.5