Bug fix: unable download and add xdxf dictionary more than once
[mdictionary] / src / plugins / xdxf / XdxfDictSelectDialog.cpp
index 897cae9..4b4a066 100644 (file)
     Copyright 2010 Comarch S.A.
 
 *******************************************************************************/
-
-//Created by Mateusz Półrola
+/*!
+    \file XdxfDictSelectDialog.cpp
+    \author Mateusz Półrola <mateusz.polrola@comarch.com>
+*/
 
 #include "XdxfDictSelectDialog.h"
 
-XdxfDictSelectDialog::XdxfDictSelectDialog(QWidget *parent) :
-    QDialog(parent) {
+XdxfDictSelectDialog::XdxfDictSelectDialog(QList<DownloadDict> dicts,
+                                           QWidget *parent) :
+                    QDialog(parent) {
+    setWindowTitle(tr("Select dictionary"));
+
     layout = new QVBoxLayout;
     setLayout(layout);
 
@@ -34,22 +39,55 @@ XdxfDictSelectDialog::XdxfDictSelectDialog(QWidget *parent) :
     langFrom = new QComboBox;
     langTo = new QComboBox;
 
-    checkBoxLayout->addWidget(langFrom);
-    checkBoxLayout->addWidget(langTo);
+    langFrom->setInsertPolicy(QComboBox::InsertAlphabetically);
+    langTo->setInsertPolicy(QComboBox::InsertAlphabetically);
+
+    langFromLabel = new QLabel(tr("From "));
+    langToLabel = new QLabel(tr("To "));
+
+    checkBoxLayout->addWidget(langFromLabel);
+    checkBoxLayout->addWidget(langFrom, 10);
+    checkBoxLayout->addWidget(langToLabel);
+    checkBoxLayout->addWidget(langTo, 10);
+
+    //here removing already added dictionary
+
+    for (int i = 0; i < dicts.size(); i++){
+        if(QFile::exists(QDir::homePath() + "/.mdictionary/" + dicts[i].title() + ".xdxf")){
+            dicts.removeAt(i);
+            i--;
+        }
+    }
+
+    model = new DictsModel(dicts, this);
+
+    proxyModel = new DictsProxyModel;
+    proxyModel->setDynamicSortFilter(true);
+    proxyModel->setSourceModel(model);
+
+    treeView = new QTreeView;
+    treeView->setModel(proxyModel);
+    treeView->setRootIsDecorated(false);
+    treeView->setExpandsOnDoubleClick(false);
+
+    treeView->setSortingEnabled(true);
+    treeView->sortByColumn(0, Qt::AscendingOrder);
 
+    treeView->setWordWrap(true);
 
-    treeWidget = new QTreeWidget;
-    treeWidget->setRootIsDecorated(false);
-    treeWidget->setColumnCount(4);
-    QStringList headers;
-    headers << tr("From") << tr("To") << tr("Name") << tr("Size");
-    treeWidget->setHeaderLabels(headers);
-    treeWidget->setColumnWidth(0, 100);
-    treeWidget->setColumnWidth(1, 100);
-    treeWidget->setColumnWidth(2, 100);
-    treeWidget->setColumnWidth(3, 100);
-    layout->addWidget(treeWidget);
+    #ifndef Q_WS_MAEMO_5
+        treeView->resizeColumnToContents(0);
+        treeView->resizeColumnToContents(1);
+        treeView->setColumnWidth(2, 300);
+        treeView->resizeColumnToContents(3);
+    #else
+        treeView->setColumnWidth(0, 150);
+        treeView->setColumnWidth(1, 150);
+        treeView->setColumnWidth(2, 300);
+        treeView->setColumnWidth(3, 150);
+    #endif
 
+    layout->addWidget(treeView);
 
     connect(langFrom, SIGNAL(currentIndexChanged(int)),
             this, SLOT(refreshDictList()));
@@ -57,18 +95,71 @@ XdxfDictSelectDialog::XdxfDictSelectDialog(QWidget *parent) :
     connect(langTo, SIGNAL(currentIndexChanged(int)),
             this, SLOT(refreshDictList()));
 
+    connect(treeView, SIGNAL(activated(QModelIndex)),
+            this, SLOT(itemClicked(QModelIndex)));
+
     #ifndef Q_WS_MAEMO_5
-        setMinimumSize(400,200);
+        setMinimumSize(800,500);
     #else
         setMinimumHeight(350);
     #endif
 
-    refreshDictList();
+    initializeDicts();
+}
+
+
+void XdxfDictSelectDialog::initializeDicts() {
+    //scan of all languages of dictionaries, using QSet to get only distinct languages
+    QSet<QString> languagesFrom;
+    QSet<QString> languagesTo;
+
+    for(int i=0; i < model->rowCount(QModelIndex()); i++) {
+        languagesFrom.insert(
+                model->data(model->index(i, 0, QModelIndex())).toString());
+        languagesTo.insert(
+                model->data(model->index(i, 1, QModelIndex())).toString());
+    }
+
+    //removes one dictionary which from and to languages are empty....
+    //bug in site with dictionaries
+    languagesFrom.remove(QString());
+    languagesTo.remove(QString());
+
+    //sorting of found languages
+    QList<QString> langFromList = languagesFrom.toList();
+    qSort(langFromList);
+
+    QList<QString> langToList = languagesTo.toList();
+    qSort(langToList);
+
+    //and adding them to combobox, first item in each combobox is "Any"
+    langFrom->addItem(tr("Any"));
+    for(int i=0; i < langFromList.count(); i++) {
+         langFrom->addItem(langFromList.at(i));
+    }
+
+    langTo->addItem(tr("Any"));
+    for(int i=0; i < langToList.count(); i++) {
+         langTo->addItem(langToList.at(i));
+    }
 }
 
 
 void XdxfDictSelectDialog::refreshDictList() {
-    QStringList l;
-    l << "pies" << "kot";
-    treeWidget->insertTopLevelItem(0, new QTreeWidgetItem(l));
+    //if selected language is "Any"(index 0), from filter string is set to empty string, proxy model uses empty string as special case and don't filter by this field.
+    if(langTo->currentIndex() == 0)
+        proxyModel->setTo(QString());
+    else
+        proxyModel->setTo(langTo->currentText());
+
+    if(langFrom->currentIndex() == 0)
+        proxyModel->setFrom(QString());
+    else
+        proxyModel->setFrom(langFrom->currentText());
+}
+
+
+void XdxfDictSelectDialog::itemClicked(QModelIndex index) {
+    _link = index.model()->data(index, Qt::UserRole).toString();
+    accept();
 }