Fixed closing menu, added bookmarks operations in different thread
[mdictionary] / trunk / src / base / backbone / backbone.h
index a0b41b0..21cb3df 100644 (file)
 #include <QTimer>
 #include <QTime>
 #include <QDir>
+#include <QThread>
 #include <QSettings>
+#include <QFutureWatcher>
 #include "../../includes/CommonDictInterface.h"
 #include "../../includes/settings.h"
 #include "../../includes/translation.h"
 #include "../../includes/History.h"
+#include "Bookmarks.h"
 
 
 /*! Inner part of dictionary - glues together GUI and plugins
@@ -84,14 +87,6 @@ public:
     //! \return maximum number of word that plugin could find
     int searchLimit() const;
 
-    //! \return number of active searches
-    int activeSearches() const;
-
-    /*! Performs search for final translation (html/xml) form
-      \param list of Translation* to be searched for
-      */
-    void searchHtml(QList<Translation*>);
-
     //! \return final translation (after searching for html)
     QStringList htmls();
 
@@ -102,6 +97,8 @@ public Q_SLOTS:
 
     /*! search for a word translation
        \param word to be translated
+       \param dicts searching in dicionaries
+       \param bookmarks searching in bookmarks
       */
     void search(QString word);
 
@@ -139,8 +136,79 @@ public Q_SLOTS:
     /*! saves plugins new state/configuration after each change */
     void dictUpdated();
 
-    // TODO addToBookmark(Translation*);
-    // TODO removeFromBookmark(Translation*);
+    /*! Performs search for final translation (html/xml) form
+      \param list of Translation* to be searched for
+      */
+    void searchHtml(QList<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<Translation*> translations) {
+        foreach(Translation* translation, translations)
+            //_bookmarks.add(translation);
+            QtConcurrent::run(_bookmarks, &Bookmarks::add, translation);
+    }
+
+
+    /*! Remove bookmarks to given translatios
+      \param translation remove bookmark to this translation
+      */
+    void removeBookmark(QList<Translation*> translations) {
+        foreach(Translation* translation, translations)
+            _bookmarks.remove(translation);
+    }
+
+
+
+    /*! Remove all bookmarks
+      */
+    void removeAllBookmark(){
+        _bookmarks.clear();
+    }
+
+
+   /*! 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() {
+        _result.clear();
+
+        stopped = false;
+        dictFin = 1;
+        bookmarkFin = 0;
+
+        if(_searchBookmarks) {
+           _innerBookmarks = QtConcurrent::run(_bookmarks,
+                   &Bookmarks::searchWordList, QString("*"));
+           _bookmarkSearchWatcher.setFuture(_innerBookmarks);
+        }
+   }
+
+   /*! \return list of all bookmarks
+     */
+   QList<Translation*> bookmarks() {
+       return _bookmarksResult;
+   }
+
+
+   /*! Sets settings for backbone: history_size, search_limit,
+       searching backends (search_bookmarks, search_dictionaries)
+       \param settings settings object with opitons set
+       */
+    void setSettings(Settings* settings);
+
+
+    /*! \return coresponding settings object with history_size, search_limit,
+       searching backends (search_bookmarks, search_dictionaries)
+       */
+    Settings* settings();
+
+
+
 
 Q_SIGNALS:
     /*! emmited when backbone is ready to close - after getting stop signal it
@@ -153,41 +221,67 @@ Q_SIGNALS:
     //! emitted when html result is ready to fetch
     void htmlReady();
 
+    //! throwed when searches are stopped
+    void searchCanceled();
+
+    //! emmited when bookmark list is ready to fetch
+    void bookmarksReady();
+
+private Q_SLOTS:
+    void bookmarksListReady();
 
 
 private:
-    QHash<CommonDictInterface*, bool> _dicts;
-    QList<CommonDictInterface*> _plugins;
-    QFuture<QList<Translation*> > _innerResult;
-    QFuture<QString> _innerHtmlResult;
-    QMultiHash<QString, Translation*> _result;
-    QStringList _htmlResult;
-    QTimer _timerSearch, _timerHtmlSearch;
-    QTime _time;
+    QHash<CommonDictInterface*, bool> _dicts; // List of dictionaries
+    QList<CommonDictInterface*> _plugins;  // List of plugins
+
+
+    QFuture<QList<Translation*> > _innerResult; //Res of concurent word search
+    QFuture<QString> _innerHtmlResult;  // Result of html search
+    QFuture<QList<Translation*> > _innerBookmarks; //Res of search in bookmarks
+    QFuture<QList<Translation*> > _innerListBookmarks; //Res of search in bookmarks
+    QFuture<QStringList> _innerHtmlBookmarks; //Html result of bookmarks search
+
+    QMultiHash<QString, Translation*> _result; //Final result of word search
+    QStringList _htmlResult; // Final result of html search
+    QList<Translation*> _bookmarksResult; // Final result of search in bookmarks
+
+
+    // Keeps track of concurent computations
+    QFutureWatcher<QList<Translation*> > _resultWatcher;
+    QFutureWatcher<QList<Translation*> > _bookmarkWatcher;
+    QFutureWatcher<QList<Translation*> > _bookmarkSearchWatcher;
+    QFutureWatcher<QString> _htmlResultWatcher;
+
+
     QString _pluginPath, _defaultPluginPath;
     QString _configPath;
     QString _defaultConfigPath;
-    //QString _mappedSearch;
     int _searchLimit, _defaultSearchLimit;
     int _activeSearchNum;
-    int _interval; //Search fetching timer.timeout interval in msec
     int _historyLen, _defaultHistoryLen;
     bool dryRun;
+    bool stopped;
+    bool bookmarkFin, dictFin; // inform whether givent search type is ready
+    bool _searchDicts, _searchBookmarks;
+    Bookmarks _bookmarks;
 
 
     void init();
+
     QStringList getFilesFromDir(QString dir, QStringList nameFilter);
     void loadPlugins(); //< locate and load plugins
     void loadPrefs(QString fileName);
     void loadDicts(QString fileName, bool _default=false);
+
     void saveState(QSettings*, Settings*, bool, uint);
     void addInternalDictionary(CommonDictInterface*, bool);
     void savePrefs(QSettings*);
     void saveDefaultPrefs(QSettings*);
+
     CommonDictInterface* plugin(QString type); //< search for given type plugin
     QList<CommonDictInterface*> activeDicts();
 
-    //QList<Translation*> mapSearch(CommonDictInterface*) const;
 
     History* _history;