Adding now adds an empty string to list and starts edit for that string.
[emufront] / src / widgets / efcombobox.cpp
index dfa12c2..07cda9f 100644 (file)
 // along with EmuFront.  If not, see <http://www.gnu.org/licenses/>.
 
 #include "efcombobox.h"
-#include "../exceptions/emufrontexception.h"
-#include "../dataobjects/emufrontobject.h"
+#include "emufrontexception.h"
+#include "emufrontobject.h"
 #include <QSqlQueryModel>
 #include <QSqlRecord>
 #include <QDebug>
+#include <QTime>
+#include <QAbstractItemView>
 
 EFComboBox::EFComboBox(DatabaseManager *dbMan, QWidget *parent)
     : QComboBox(parent), dbManager(dbMan)
 {
-    if (!dbManager)
-        throw new EmuFrontException("Database manager is not available!");
+    setSizeAdjustPolicy(QComboBox::AdjustToContents);
     updateDataModel();
 }
 
@@ -36,50 +37,62 @@ EFComboBox::~EFComboBox()
 {
 }
 
-void EFComboBox::updateDataModel()
+void EFComboBox::updateDataModel(bool reset)
 {
-    QSqlQueryModel *model = dbManager->getDataModel();
+    QSqlQueryModel *model = dbManager->getDataModel(reset);
     if (model)
         setModel(model);
 }
 
-EmuFrontObject* EFComboBox::getSelected() const
+/*
+    Returns a pointer to EmuFrontObject which should be deleted
+    later by calling code!
+
+    Throws EmuFrontException
+*/
+EmuFrontObject* EFComboBox::getSelected()
 {
     EmuFrontObject *efo = 0;
     int index = currentIndex();
-    qDebug() << "Selected index " << index << ".";
     if (index < 0)
         return 0;
     QSqlQueryModel *qmodel
         = dynamic_cast<QSqlQueryModel*>(model());
     if (!qmodel) {
-        qDebug() << "No data model available!";
-        return 0;
+        throw EmuFrontException(tr("No data model available!"));
     }
     QSqlRecord rec = qmodel->record(index);
     if (rec.isEmpty()) {
-        qDebug() << "No record available!";
-        return efo;
+        throw EmuFrontException(tr("No data available for selected item!"));
     }
-    qDebug() << "Fetching a data object with id "
-        << rec.value(dataModelIndex_id).toInt();
-    EmuFrontObject *o
-        = dbManager->getDataObject(rec.value(dataModelIndex_id).toInt());
+    int id = rec.value(dataModelIndex_id).toInt();
+    EmuFrontObject *o = dbManager->getDataObject(id); /* Throws EmuFrontException */
+    reset();
+    setCurrentIndex(index);
+    if (!o) throw EmuFrontException(tr("Failed creating selected data object!"));
     return o;
 }
 
+void EFComboBox::reset()
+{
+    dbManager->resetModel();
+}
+
 void EFComboBox::setSelected(const EmuFrontObject *efo)
 {
     if (!efo)
         return;
+    qDebug() << "EFCombobox selecting " << efo->getName()
+        << " [" << efo->getId() << "].";
     QSqlQueryModel *qmodel
         = dynamic_cast<QSqlQueryModel*>(model());
-    for (int i = 0; i < qmodel->rowCount(); i++){
-        QSqlRecord rec = qmodel->record(i);
-        if (rec.value(dataModelIndex_id) == efo->getId()){
-            setCurrentIndex(i);
-            break;
-        }
-    }
+    QModelIndex idStart = qmodel->index(0, dataModelIndex_id);
+    int targetId = efo->getId();
 
+    QModelIndexList indLst = qmodel->match(idStart,Qt::DisplayRole, targetId, 1);
+    if (indLst.count() >= 1) {
+        QModelIndex ind = indLst.first();
+        view()->setCurrentIndex(ind);
+        setCurrentIndex(ind.row());
+    }
 }