complete WordListWidget with model.
[mdictionary] / src / mdictionary / gui / WordListWidget.cpp
index 7d6eaab..135e4ae 100644 (file)
 
 *******************************************************************************/
 
-//! \file WordListWidget.cpp
-//! \author Mateusz Półrola <mateusz.polrola@comarch.pl>
+/*! \file WordListwidget.cpp
+    \brief Displays list of words found in dictionaries
+
+    \author Mateusz Półrola <mateusz.polrola@comarch.pl>
+*/
 
 #include "WordListWidget.h"
 #include "WordListProxyStyle.h"
-#include "../../common/translation.h"
+#include "../../include/translation.h"
+#include <QKeyEvent>
 
 
 WordListWidget::WordListWidget(QWidget *parent):
     QTreeView(parent) {
 
     //creating new model to store words and stars
+#ifdef Q_WS_MAEMO_5
     model = new QStandardItemModel(this);
     setModel(model);
-    setHeaderHidden(true);
-    setRootIsDecorated(false);
+
     setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
 
     //set our custom style to draw checkboxes as stars
     proxyStyle = new WordListProxyStyle();
     setStyle(proxyStyle);
 
+    //for future use, set checkbox icons for maemo
+//    ctxt->setContextProperty("CheckedPath", "qrc:/icons/96x96/staron.png");
+//    ctxt->setContextProperty("UncheckedPath", "qrc:/icons/96x96/staroff.png");
+#else
+
+    listModel = new WordListModel(this);
+
+    verticalLayout = new QVBoxLayout;
+    setLayout(verticalLayout);
+
+    qmlView = new QDeclarativeView(this);
+
+    ctxt = qmlView->rootContext();
+
+    ctxt->setContextProperty("wordModel", &(*listModel));
+    ctxt->setContextProperty("CheckedPath", "qrc:/icons/16x16/staron.png");
+    ctxt->setContextProperty("UncheckedPath", "qrc:/icons/16x16/staroff.png");
+
+    qmlView->setSource(QUrl::fromLocalFile("/usr/share/mdictionary/qml/WordListWidget.qml"));
+
+    QGraphicsObject *rootObject = qmlView->rootObject();
+
+    qmlView->setResizeMode(QDeclarativeView::SizeRootObjectToView);
+
+    verticalLayout->addWidget(qmlView);
+
+    connect(rootObject, SIGNAL(wordSelected(QString)), this, SLOT(wordClicked(QString)));
+    connect(listModel, SIGNAL(addToBookmarks(QString)), this, SLOT(addToBookmarks(QString)));
+    connect(listModel, SIGNAL(removeFromBookmarks(QString)), this, SLOT(removeFromBookmarks(QString)));
+
+    connect(this, SIGNAL(setWordListState(QVariant)), rootObject, SLOT(setEnabled(QVariant)));
+
+#endif
+
+    setHeaderHidden(true);
+    setRootIsDecorated(false);
+
     //setting size of star in pixels, on maemo checboxes are much bigger
     #ifdef Q_WS_MAEMO_5
         checkBoxWidth = 70;
@@ -96,19 +137,64 @@ void WordListWidget::showSearchResults(
     clear();
     searchResult = result;
 
-    model->setColumnCount(2);
-    model->setRowCount(result.count());
+#ifdef Q_WS_MAEMO
+    if(searchResult.count()>0) {
+        setEnabled(true);
+        model->setColumnCount(2);
+        model->setRowCount(result.count());
 
-    int row=0;
-    QHash<QString, QList<Translation*> >::iterator i;
-    for(i = searchResult.begin(); i != searchResult.end(); i++) {
-           addWord(i.key(), row++);
+        int row=0;
+        QHash<QString, QList<Translation*> >::iterator i;
+        for(i = searchResult.begin(); i != searchResult.end(); i++) {
+               addWord(i.key(), row++);
+        }
+
+        model->sort(0);
+        resizeColumns();
+    }
+    else {
+        QStandardItem* item = new QStandardItem(tr("Can't find any matching words"));
+        item->setFlags(item->flags() ^ Qt::ItemIsEditable);
+        item->setTextAlignment(Qt::AlignCenter);
+        setEnabled(false);
+
+        model->setItem(0,item);
+    }
+#else
+
+    QHash<QString, bool> wordsInBookmarks;
+    QHashIterator<QString, QList<Translation *> > i(result);
+    while (i.hasNext()){
+        i.next();
+
+        bool bookmark = false;
+        Translation* t;
+        foreach(t, searchResult[i.key()]) {
+            if(t->isBookmark()) {
+                bookmark = true;
+                break;
+            }
+        }
+        wordsInBookmarks.insert(i.key(), bookmark);
     }
 
-    model->sort(0);
-    resizeColumns();    
+    if (result.count() == 0){
+        result.insert("!@#$%", QList<Translation*>());
+        wordsInBookmarks.insert("!@#$%", false);
+        Q_EMIT setWordListState(false);
+    }
+
+    if (listModel == 0){
+        listModel = new WordListModel(this);
+    }
+    listModel->setTranslations(result, wordsInBookmarks);
+
+#endif
+
+    setFocus();
 }
 
+#ifdef Q_WS_MAEMO
 void WordListWidget::wordClicked(QModelIndex index) {
     //we're getting translation based on data in index
     Q_EMIT showTranslation(
@@ -127,7 +213,7 @@ void WordListWidget::wordChecked(QModelIndex index) {
     QModelIndex item = selectedIndexes().at(0);
     if(!item.isValid()) return;
 
-    //to shorten lag between clicking on star and its change
+    //to shorten lag between clicking on a star and its change
     repaint();
 
     //depending on new state emit suitable signal
@@ -136,10 +222,43 @@ void WordListWidget::wordChecked(QModelIndex index) {
     }
     else {
         Q_EMIT removeBookmark(searchResult[item.data().toString()]);
+
+        Translation* t;
+        bool onlyBookmarks = true;
+        foreach(t, searchResult[item.data().toString()]) {
+            if(t->isBookmark() == 1 || t->isBookmark()==0) {
+
+                onlyBookmarks = false;
+                t->setBookmark(0);
+            }
+            else {
+                searchResult[item.data().toString()].removeAt(searchResult[item.data().toString()].indexOf(t));
+            }
+        }
+
+        if(onlyBookmarks) {
+            searchResult.remove(item.data().toString());
+            model->removeRow(item.row());
+        }
     }
 }
+#else
+    void WordListWidget::wordClicked(QString word){
+        emit showTranslation(searchResult[word]);
+    }
+
+    void WordListWidget::addToBookmarks(QString word){
+        emit addBookmark(searchResult[word]);
+    }
+
+    void WordListWidget::removeFromBookmarks(QString word){
+        emit removeBookmark(searchResult[word]);
+    }
+
+#endif
 
 
+#ifdef Q_WS_MAEMO_5
 void WordListWidget::mouseReleaseEvent(QMouseEvent *event) {
 
     //firstly we normally handle this event
@@ -154,16 +273,16 @@ void WordListWidget::mouseReleaseEvent(QMouseEvent *event) {
     system doesn't select item but emits mouseReleaseEvent*/
     if(selectedIndexes().count() == 0) return;
 
-    //if user doesn't click either on word or on star, return
+    //if user doesn't click either on a word or on a star, return
     if(selectedIndexes().at(0) != index && selectedIndexes().at(1) != index)
         return;
 
     int c = index.column();
     if(c==0)
-        //if column is 0 user clicked word
+        //if column is 0 user clicked on a word
         wordClicked(index);
     else
-        //else user clicked star
+        //else user clicked on a star
         wordChecked(index);
 }
 
@@ -172,21 +291,46 @@ void WordListWidget::resizeEvent(QResizeEvent *event) {
     QTreeView::resizeEvent(event);
 }
 
+void WordListWidget::keyPressEvent(QKeyEvent *event) {
+    QTreeView::keyPressEvent(event);
+
+    if(event->key() == Qt::Key_Return || event->key() == Qt::Key_Enter) {
+        if(selectedIndexes().count() == 0) return;
+
+        wordClicked(selectedIndexes().at(0));
+    }
+}
+#endif
+
 void WordListWidget::resizeColumns() {
     setColumnWidth(0, viewport()->width() -checkBoxWidth - 5);
     setColumnWidth(1, checkBoxWidth);
 }
 
 void WordListWidget::lockList() {
+#ifdef Q_WS_MAEMO_5
     setEnabled(false);
+#else
+    Q_EMIT setWordListState(false);
+#endif
 }
 
 void WordListWidget::unlockList() {
+#ifdef Q_WS_MAEMO_5
     setEnabled(true);
+#else
+    Q_EMIT setWordListState(true);
+#endif
 }
 
 void WordListWidget::clear() {
+#ifdef Q_WS_MAEMO_5
     model->clear();
+#else
+    if (listModel != 0){
+        listModel->clear();
+    }
+#endif
 
     QHash<QString, QList<Translation*> >::iterator i;
     for(i = searchResult.begin(); i != searchResult.end(); i++) {