virtual method updateDb abstraced away from child classes to
[emufront] / src / dialogs / dbobjectdialog.cpp
1 // EmuFront
2 // Copyright 2010 Mikko Keinänen
3 //
4 // This file is part of EmuFront.
5 //
6 //
7 // EmuFront is free software: you can redistribute it and/or modify
8 // it under the terms of the GNU General Public License as published by
9 // the Free Software Foundation, either version 3 of the License, or
10 // (at your option) any later version.
11 //
12 // Foobar is distributed in the hope that it will be useful,
13 // but WITHOUT ANY WARRANTY; without even the implied warranty of
14 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 // GNU General Public License for more details.
16 //
17 // You should have received a copy of the GNU General Public License
18 // along with Foobar.  If not, see <http://www.gnu.org/licenses/>.
19
20 #include <QtGui>
21 #include <QSqlTableModel>
22 #include "dbobjectdialog.h"
23 #include "../db/databasemanager.h"
24
25 DbObjectDialog::DbObjectDialog(QWidget *parent)
26     : EmuFrontDialog(parent)
27 {
28     dbObject = 0;
29     dbManager = 0;
30     editButton = new QPushButton(tr("&Edit")); 
31     editButton->setEnabled(false);
32     addButton = new QPushButton(tr("&Add"));
33     deleteButton = new QPushButton(tr("&Delete"));
34     deleteButton->setEnabled(false);
35     objectList = new QTableView(this);
36     buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok, Qt::Vertical);
37     buttonBox->addButton(editButton, QDialogButtonBox::ActionRole);
38     buttonBox->addButton(addButton, QDialogButtonBox::ActionRole);
39     buttonBox->addButton(deleteButton, QDialogButtonBox::ActionRole);
40     // this be called from the implementing classes:
41     //connectSignals();
42     layout();
43
44
45 DbObjectDialog::~DbObjectDialog()
46 {
47     // no need to explicitically delete widgets within a parented layout
48     // they are automatically parented and will be deleted
49     // dbManager is also parented and will be implicitically deleted
50     // this must be deleted in an implementing class
51     //delete dbObject;
52 }
53
54 void DbObjectDialog::connectSignals()
55 {
56     connect(buttonBox, SIGNAL(accepted()), this, SLOT(close()));
57     connect(objectList, SIGNAL(clicked(const QModelIndex &)),
58         this, SLOT(listObjectClicked(const QModelIndex &)));
59     connect(editButton, SIGNAL(clicked()), this, SLOT(editButtonClicked()));
60     connect(addButton, SIGNAL(clicked()), this, SLOT(addButtonClicked()));
61     connect(deleteButton, SIGNAL(clicked()), this, SLOT(deleteButtonClicked()));
62     connect(nameDialog, SIGNAL(dataObjectUpdated()), this, SLOT(updateData()));
63 }
64
65 void DbObjectDialog::editObject()
66 {
67     QModelIndex index = objectList->currentIndex();
68     if (!index.isValid())
69         return;
70     deleteCurrentObject();
71     dbObject = dbManager->getDataObjectFromModel(&index);
72     nameDialog->setDataObject(dbObject);
73     activateNameDialog();
74 }
75
76 void DbObjectDialog::updateDb(const EmuFrontObject *ob) const
77 {
78     if (!ob) return;
79     qDebug() << "Updating platform " << ob->getName();
80     dbManager->updateDataObjectToModel(ob);
81 }
82
83 void DbObjectDialog::updateList() const
84 {
85     if (!dbManager) return;
86     dbManager->resetModel();
87 }
88
89 void DbObjectDialog::addButtonClicked()
90 {
91     disableSelection();
92     addObject();
93 }
94
95 void DbObjectDialog::editButtonClicked()
96 {
97     disableSelection();
98     editObject();
99 }
100
101 void DbObjectDialog::deleteButtonClicked()
102 {
103     QItemSelectionModel *selModel = objectList->selectionModel();
104     if (!selModel->hasSelection()) return;
105
106     QAbstractItemModel *tblModel = objectList->model();
107     QModelIndex index = selModel->currentIndex();
108     QVariant vName = tblModel->data(index);
109     QString name = vName.toString();
110     disableSelection();
111
112     QString msg =  tr("Do you want to delete") + name + "?";
113     int yn = QMessageBox::question(this, "Confirm", msg, QMessageBox::Yes | QMessageBox::No, QMessageBox::No);
114     if (yn == QMessageBox::Yes)
115     {
116         qDebug() << "Deleting item..." << name << ".";
117         deleteItem();
118     }
119 }
120
121 void DbObjectDialog::layout()
122 {
123     QHBoxLayout *mainLayout = new QHBoxLayout;
124     mainLayout->addWidget(objectList);
125     mainLayout->addWidget(buttonBox);
126     setLayout(mainLayout);
127 }
128
129 void DbObjectDialog::listObjectClicked(const QModelIndex &index)
130 {
131     const QModelIndex *x;
132     x = &index;
133     qDebug() << "Row " << x->row() << ", column " << x->column() << " clicked.";
134     setButtonsEnabled(index.isValid());
135     if(!index.isValid()) 
136         return;
137 }
138
139 void DbObjectDialog::setButtonsEnabled(bool enabled)
140 {
141     editButton->setEnabled(enabled);
142     deleteButton->setEnabled(enabled);
143 }
144
145 void DbObjectDialog::disableSelection()
146 {
147     setButtonsEnabled(false);
148 }
149
150 void DbObjectDialog::activateNameDialog()
151 {
152     if (!nameDialog) return;
153     nameDialog->show();
154     nameDialog->raise();
155     nameDialog->activateWindow();
156 }
157
158 void DbObjectDialog::initDataTable()
159 {
160    objectList->setModel(dbManager->getDataModel());
161    objectList->setSelectionMode(QAbstractItemView::SingleSelection);
162    objectList->resizeColumnsToContents();
163 }
164 void DbObjectDialog::updateData()
165 {
166     qDebug() << "Update data";
167     // update data model
168     if (!dbObject) return;
169
170     qDebug() << "dbObject is not 0";
171
172     qDebug() << "We have a " + dbObject->getName();
173
174     qDebug() << "Data will be inserted/updated...";
175
176     // if data object id > -1 we are updating the data otherwise we are inserting new data
177     if (dbObject->getId() > -1) updateDb(dbObject);
178     else insertDb(dbObject);
179
180     // we don't need dbObject anymore
181     deleteCurrentObject();
182     dbObject = 0;
183     updateList();
184 }
185
186 void DbObjectDialog::deleteCurrentObject()
187 {
188     delete dbObject;
189 }
190
191 bool DbObjectDialog::confirmDelete(QString name, int numRefs)
192 {
193     int r = QMessageBox::warning(this, tr("Confirm delete"),
194                                  QString("Do you really want to delete %1 with %2 data bindings?")
195                                  .arg(name).arg(numRefs),
196                                  QMessageBox::Yes | QMessageBox::No);
197     if ( r == QMessageBox::No )
198         return false;
199     return true;
200 }