Virtual method addObject implementation abstracted from child classes
[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::insertDb(const EmuFrontObject *ob) const
66 {
67     dbManager->insertDataObjectToModel(ob);
68 }
69
70 void DbObjectDialog::addObject()
71 {
72     deleteCurrentObject();
73     dbObject = createObject();
74     nameDialog->setDataObject(dbObject);
75     activateNameDialog();
76 }
77
78 void DbObjectDialog::editObject()
79 {
80     QModelIndex index = objectList->currentIndex();
81     if (!index.isValid())
82         return;
83     deleteCurrentObject();
84     dbObject = dbManager->getDataObjectFromModel(&index);
85     nameDialog->setDataObject(dbObject);
86     activateNameDialog();
87 }
88
89 void DbObjectDialog::updateDb(const EmuFrontObject *ob) const
90 {
91     if (!ob) return;
92     qDebug() << "Updating platform " << ob->getName();
93     dbManager->updateDataObjectToModel(ob);
94 }
95
96 void DbObjectDialog::updateList() const
97 {
98     if (!dbManager) return;
99     dbManager->resetModel();
100 }
101
102 void DbObjectDialog::addButtonClicked()
103 {
104     disableSelection();
105     addObject();
106 }
107
108 void DbObjectDialog::editButtonClicked()
109 {
110     disableSelection();
111     editObject();
112 }
113
114 void DbObjectDialog::deleteButtonClicked()
115 {
116     QItemSelectionModel *selModel = objectList->selectionModel();
117     if (!selModel->hasSelection()) return;
118
119     QAbstractItemModel *tblModel = objectList->model();
120     QModelIndex index = selModel->currentIndex();
121     QVariant vName = tblModel->data(index);
122     QString name = vName.toString();
123     disableSelection();
124
125     QString msg =  tr("Do you want to delete") + name + "?";
126     int yn = QMessageBox::question(this, "Confirm", msg, QMessageBox::Yes | QMessageBox::No, QMessageBox::No);
127     if (yn == QMessageBox::Yes)
128     {
129         qDebug() << "Deleting item..." << name << ".";
130         deleteItem();
131     }
132 }
133
134 void DbObjectDialog::layout()
135 {
136     QHBoxLayout *mainLayout = new QHBoxLayout;
137     mainLayout->addWidget(objectList);
138     mainLayout->addWidget(buttonBox);
139     setLayout(mainLayout);
140 }
141
142 void DbObjectDialog::listObjectClicked(const QModelIndex &index)
143 {
144     const QModelIndex *x;
145     x = &index;
146     qDebug() << "Row " << x->row() << ", column " << x->column() << " clicked.";
147     setButtonsEnabled(index.isValid());
148     if(!index.isValid()) 
149         return;
150 }
151
152 void DbObjectDialog::setButtonsEnabled(bool enabled)
153 {
154     editButton->setEnabled(enabled);
155     deleteButton->setEnabled(enabled);
156 }
157
158 void DbObjectDialog::disableSelection()
159 {
160     setButtonsEnabled(false);
161 }
162
163 void DbObjectDialog::activateNameDialog()
164 {
165     if (!nameDialog) return;
166     nameDialog->show();
167     nameDialog->raise();
168     nameDialog->activateWindow();
169 }
170
171 void DbObjectDialog::initDataTable()
172 {
173    objectList->setModel(dbManager->getDataModel());
174    objectList->setSelectionMode(QAbstractItemView::SingleSelection);
175    objectList->resizeColumnsToContents();
176 }
177 void DbObjectDialog::updateData()
178 {
179     qDebug() << "Update data";
180     // update data model
181     if (!dbObject) return;
182
183     qDebug() << "dbObject is not 0";
184
185     qDebug() << "We have a " + dbObject->getName();
186
187     qDebug() << "Data will be inserted/updated...";
188
189     // if data object id > -1 we are updating the data otherwise we are inserting new data
190     if (dbObject->getId() > -1) updateDb(dbObject);
191     else insertDb(dbObject);
192
193     // we don't need dbObject anymore
194     deleteCurrentObject();
195     dbObject = 0;
196     updateList();
197 }
198
199 void DbObjectDialog::deleteCurrentObject()
200 {
201     delete dbObject;
202 }
203
204 bool DbObjectDialog::confirmDelete(QString name, int numRefs)
205 {
206     int r = QMessageBox::warning(this, tr("Confirm delete"),
207                                  QString("Do you really want to delete %1 with %2 data bindings?")
208                                  .arg(name).arg(numRefs),
209                                  QMessageBox::Yes | QMessageBox::No);
210     if ( r == QMessageBox::No )
211         return false;
212     return true;
213 }