1 /*******************************************************************************
3 This file is part of mDictionary.
5 mDictionary is free software: you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation, either version 3 of the License, or
8 (at your option) any later version.
10 mDictionary is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with mDictionary. If not, see <http://www.gnu.org/licenses/>.
18 Copyright 2010 Comarch S.A.
20 *******************************************************************************/
22 /*! /file backbone.cpp
23 \brief Backbone/core main header \see Backbone
26 \author Bartosz Szatkowski <bulislaw@linux.com>
35 #include <QPluginLoader>
37 #include <QtConcurrentRun>
38 #include <QtConcurrentMap>
39 #include <QFutureIterator>
45 #include <QFutureWatcher>
46 #include "../../includes/CommonDictInterface.h"
47 #include "../../includes/settings.h"
48 #include "../../includes/translation.h"
49 #include "../../includes/History.h"
50 #include "Bookmarks.h"
53 /*! Inner part of dictionary - glues together GUI and plugins
55 Backbone is responsible for managing plugins and dictionaries, starting
56 new searches and threads, merging search results from multiple dictionaries.
58 Each plugin may live in multiple instances - each with its own dictionary,
59 backbone must provide way to create them at start (with specific Settings) and
60 distinguich each ditionary.
63 class Backbone : public QObject
68 /*!\param pluginPath path to plugins (leave blank for default)
69 \param configPath path to folder with configuration files*/
70 Backbone(QString pluginPath="", QString configPath="",
71 bool dry = 0, QObject *parent = 0);
73 Backbone(const Backbone& b);
75 //! \return all loadded dictionaries with activity state flag
76 QHash<CommonDictInterface*, bool> getDictionaries();
78 //! \return all loadded plugins
79 QList<CommonDictInterface*> getPlugins();
81 //! \return history of performed searches
84 //! \return return search fesult
85 QMultiHash<QString, Translation*> result();
87 //! \return maximum number of word that plugin could find
88 int searchLimit() const;
90 //! \return final translation (after searching for html)
95 //! stops all current searches
98 /*! search for a word translation
99 \param word to be translated
101 void search(QString word);
103 /*! sets active dictionaries (searches are performed only in active dicts
104 \param List of dictionaris to be activated
106 void selectedDictionaries(QList<CommonDictInterface* >);
108 /*! adds new dictionary and activate it
109 \param dict dictionary to be added
110 \param active decides whether searches are perfomed in given dictionaries
112 void addDictionary(CommonDictInterface* dict, bool active = 1);
115 //! stops all current activity - emiting signal \see closeOk
119 /*! Fired with given interval during searches -
120 checking if translation is ready
122 void translationReady();
124 /*! Fired with given interval during html searches -
125 checking if html is ready
127 void htmlTranslationReady();
129 /*! Removes given dictionary
130 \param dict dictionary to be deleted
132 void removeDictionary(CommonDictInterface* dict);
134 /*! saves plugins new state/configuration after each change */
137 /*! Performs search for final translation (html/xml) form
138 \param list of Translation* to be searched for
140 void searchHtml(QList<Translation*>);
143 /*! add bookmarks to given translations (translation object is fetched and
144 added to bookmarks data base (key and translation stored in db)
145 \param translation translation object to be stored in db
147 void addBookmark(QList<Translation*> translations) {
148 foreach(Translation* translation, translations)
149 QtConcurrent::run(&bookmarks, &Bookmarks::add, translation);
153 /*! Remove bookmarks to given translatios
154 \param translation remove bookmark to this translation
156 void removeBookmark(QList<Translation*> translations) {
157 foreach(Translation* translation, translations)
158 bookmarks.remove(translation);
162 /*! Searching for list of bookmarks may take some time, so i moved it to
163 new thread (to avoid gui blocking), when ready bookmarksReady is emited
164 and result is returned after calling getBookmarks()
166 void fetchBookmarks() {
167 _bookmarksResult.clear();
168 _innerBookmarks = QtConcurrent::run(bookmarks, &Bookmarks::list);
169 _bookmarkWatcher.setFuture(_innerBookmarks);
172 /*! \return list of all bookmarks
174 QList<Translation*> getBookmarks() {
175 return _bookmarksResult;
181 /*! emmited when backbone is ready to close - after getting stop signal it
182 should kill all threads and so on */
185 //! emitted when there are search result ready to fetch
188 //! emitted when html result is ready to fetch
191 //! throwed when searches are stopped
192 void searchCanceled();
194 //! emmited when bookmark list is ready to fetch
195 void bookmarksReady();
198 void bookmarksListReady();
202 QHash<CommonDictInterface*, bool> _dicts;
203 QList<CommonDictInterface*> _plugins;
204 QFuture<QList<Translation*> > _innerResult;
205 QFuture<QString> _innerHtmlResult;
206 QFuture<QList<Translation*> > _innerBookmarks;
207 QMultiHash<QString, Translation*> _result;
208 QStringList _htmlResult;
209 QList<Translation*> _bookmarksResult;
211 QString _pluginPath, _defaultPluginPath;
213 QString _defaultConfigPath;
214 QFutureWatcher<QList<Translation*> > _resultWatcher;
215 QFutureWatcher<QList<Translation*> > _bookmarkWatcher;
216 QFutureWatcher<QString> _htmlResultWatcher;
217 int _searchLimit, _defaultSearchLimit;
218 int _activeSearchNum;
219 int _historyLen, _defaultHistoryLen;
226 QStringList getFilesFromDir(QString dir, QStringList nameFilter);
227 void loadPlugins(); //< locate and load plugins
228 void loadPrefs(QString fileName);
229 void loadDicts(QString fileName, bool _default=false);
230 void saveState(QSettings*, Settings*, bool, uint);
231 void addInternalDictionary(CommonDictInterface*, bool);
232 void savePrefs(QSettings*);
233 void saveDefaultPrefs(QSettings*);
234 CommonDictInterface* plugin(QString type); //< search for given type plugin
235 QList<CommonDictInterface*> activeDicts();
237 //QList<Translation*> mapSearch(CommonDictInterface*) const;