Fix bug with app crash on exit. Add keyboard support in wordList, DictTypeSelectDialo...
[mdictionary] / src / mdictionary / gui / WordListModel.cpp
index 2999778..5244664 100644 (file)
@@ -8,7 +8,7 @@ WordListModel::WordListModel(QObject *parent) :
     roles[IsBookmarkedRole] = "isBookmarked";
     roles[NumberRole] = "number";
     setRoleNames(roles);
-
+    _isBookmarkModeActive = false;
 
 }
 
@@ -39,6 +39,7 @@ void WordListModel::clear()
     if (!empty){
         endResetModel();
     }
+    _isBookmarkModeActive = false;
 }
 
 QVariant WordListModel::data(const QModelIndex &index, int role) const
@@ -83,8 +84,8 @@ void WordListModel::setTranslations(QHash<QString, QList<Translation *> > transl
         i.next();
         addWord(i.key(), i.value(), wordsInBookmarks[i.key()]);
     }
-    //todo: repair sorting
-//    sort(0);
+
+    sort(0);
 
 }
 
@@ -94,41 +95,15 @@ void WordListModel::sort(int column, Qt::SortOrder order)
         return;
 
     int left = 0;
-    int right = _wordList.count();
+    int right = _wordList.count() - 1;
 
     if (left < right){
         if (order == Qt::AscendingOrder){
-            ascendingQuickSort(left, right);
+            qSort(_wordList.begin(), _wordList.end());
         } else if (order == Qt::DescendingOrder) {
-            descendingQuickSort(left, right);
-        }
-    }
-}
-
-void WordListModel::ascendingQuickSort(int left, int right){
-    int m = left;
-    for(int i = left+1; i < right; i++){
-        if(_wordList[i] < _wordList[left]){
-            _wordList.swap(++m, i);
-        }
-    }
-
-    _wordList.swap(left, m);
-    ascendingQuickSort(left, m - 1);
-    ascendingQuickSort(m + 1, right);
-}
-
-void WordListModel::descendingQuickSort(int left, int right){
-    int m = left;
-    for(int i = left+1; i < right; i++){
-        if(_wordList[i] > _wordList[left]){
-            _wordList.swap(++m, i);
+            qSort(_wordList.begin(), _wordList.end(), qGreater<QString>());
         }
     }
-
-    _wordList.swap(left, m);
-    ascendingQuickSort(left, m - 1);
-    ascendingQuickSort(m + 1, right);
 }
 
 void WordListModel::setModelProperty(int index, const QVariant value, QString role)
@@ -139,14 +114,20 @@ void WordListModel::setModelProperty(int index, const QVariant value, QString ro
     }
 }
 
-int WordListModel::setDataPriv(int index, const QVariant &value, int role)
+void WordListModel::setModelPropertyByIndex(int index, QString role)
 {
-    bool bookmarksOnly = false;
-    if (_wordInBookmarks.values().count(false) == 0){
-        bookmarksOnly = true;
+    if (role.contains("isBookmarked"))
+    {
+        if (index < 0 || index > _translations.count() - 1)
+            return;
+
+        setDataPriv(index, !_wordInBookmarks[_wordList[index]], IsBookmarkedRole);
     }
+}
 
-    if (index < 0 || index > _translations.count())
+int WordListModel::setDataPriv(int index, const QVariant &value, int role)
+{
+    if (index < 0 || index > _translations.count() - 1)
         return 0;
 
     QString word = _wordList[index];
@@ -159,12 +140,11 @@ int WordListModel::setDataPriv(int index, const QVariant &value, int role)
         if (value.type() == QVariant::Bool)
         {
             _wordInBookmarks[word] = value.toBool();
-            Q_EMIT dataChanged(this->index(0), this->index(_translations.count() - 1));
             if (_wordInBookmarks[word] == true){
                 Q_EMIT addToBookmarks(word);
             } else {                
                 Q_EMIT removeFromBookmarks(word);
-                if (bookmarksOnly == true){
+                if (_isBookmarkModeActive == true){
                     beginRemoveRows(QModelIndex(), index, index + 1);
                     this->_translations.remove(_wordList[index]);
                     this->_wordInBookmarks.remove(_wordList[index]);
@@ -172,6 +152,7 @@ int WordListModel::setDataPriv(int index, const QVariant &value, int role)
                     endRemoveRows();
                 }
             }
+            Q_EMIT dataChanged(this->index(0), this->index(_translations.count() - 1));
             return 2;
         }
         else
@@ -181,3 +162,13 @@ int WordListModel::setDataPriv(int index, const QVariant &value, int role)
     }
     return 0;
 }
+
+void WordListModel::setBookmarkModeActive(bool mode)
+{
+    _isBookmarkModeActive = mode;
+}
+
+QString WordListModel::wordOnPosition(int index)
+{
+    return _wordList[index];
+}