]> Shamusworld >> Repos - schematic/blob - src/mainwin.cpp
d4531034c95712f6423f5906bcfcd90de5a00b0b
[schematic] / src / mainwin.cpp
1 //
2 // mainwin.cpp - The Supply Chain Manager-O-Matic
3 // by James Hammons
4 // (C) 2012 Underground Software
5 //
6 // JLH = James Hammons <jlhamm@acm.org>
7 //
8 // Who  When        What
9 // ---  ----------  -------------------------------------------------------------
10 // JLH  09/14/2012  Created this file
11 //
12
13 // Uncomment this for debugging...
14 //#define DEBUG
15 //#define DEBUGFOO                              // Various tool debugging...
16 //#define DEBUGTP                               // Toolpalette debugging...
17
18 #include "mainwin.h"
19 #include "about.h"
20 #include "configdialog.h"
21 #include "logindialog.h"
22 #include "newvendordialog.h"
23 #include "scmwidget.h"
24 #include "sqlsettingsdialog.h"
25 #include "vendorclassdialog.h"
26
27
28 MainWindow::MainWindow(): aboutWin(new AboutWindow(this)),
29         scmWidget(new SCMWidget(this)),
30         boldFont(new QFont),
31         loggedInUID(0)
32 {
33         setWindowIcon(QIcon(":/res/schematic.png"));
34         setWindowTitle("SCheMatic");
35
36         setUnifiedTitleAndToolBarOnMac(true);
37
38         // Create actions
39
40         quitAppAct = new QAction(tr("E&xit"), this);
41         quitAppAct->setShortcut(QKeySequence(tr("Ctrl+q")));
42         quitAppAct->setStatusTip(tr("Quit SCheMatic"));
43         connect(quitAppAct, SIGNAL(triggered()), this, SLOT(close()));
44
45         aboutAct = new QAction(QIcon(":/res/schematic.png"), tr("&About..."), this);
46         aboutAct->setStatusTip(tr("Blatant self-promotion"));
47         connect(aboutAct, SIGNAL(triggered()), this, SLOT(ShowAboutWin()));
48
49         configAct = new QAction(QIcon(":/res/schematic.png"), tr("&Configure..."), this);
50         configAct->setStatusTip(tr("Configure SCheMatic"));
51         connect(configAct, SIGNAL(triggered()), this, SLOT(HandleConfigDialog()));
52
53         vendorClassAct = new QAction(QIcon(":/res/schematic.png"), tr("&Edit Vendor Classes..."), this);
54         vendorClassAct->setStatusTip(tr("Edit Vendor Classes"));
55         connect(vendorClassAct, SIGNAL(triggered()), this, SLOT(HandleVendorClassDialog()));
56
57         newVendorAct = new QAction(QIcon(":/res/schematic.png"), tr("&Add Vendor..."), this);
58         newVendorAct->setStatusTip(tr("Create a new vendor"));
59         connect(newVendorAct, SIGNAL(triggered()), this, SLOT(HandleNewVendorDialog()));
60
61 //      helpAct = new QAction(QIcon(":/res/vj-icon.png"), tr("&Contents..."), this);
62 //      helpAct->setStatusTip(tr("Help is available, if you should need it"));
63 //      connect(helpAct, SIGNAL(triggered()), this, SLOT(ShowHelpWin()));
64
65         // Create menus & toolbars
66
67         QMenu * menu = menuBar()->addMenu(tr("&File"));
68 //      fileMenu->addAction(powerAct);
69 //      fileMenu->addAction(pauseAct);
70 //      fileMenu->addAction(frameAdvanceAct);
71 //      fileMenu->addAction(filePickAct);
72 //      fileMenu->addAction(useCDAct);
73 //      fileMenu->addAction(configAct);
74         menu->addAction(quitAppAct);
75
76         menu = menuBar()->addMenu(tr("&Edit"));
77         menu->addAction(configAct);
78         menu->addAction(vendorClassAct);
79         menu->addAction(newVendorAct);
80
81         menu = menuBar()->addMenu(tr("&Help"));
82 //      menu->addAction(helpAct);
83         menu->addAction(aboutAct);
84
85         QToolBar * toolbar = addToolBar(tr("Stuff"));
86 //      toolbar->addAction(powerAct);
87 //      toolbar->addAction(pauseAct);
88 //      toolbar->addAction(filePickAct);
89 //      toolbar->addAction(useCDAct);
90 //      toolbar->addSeparator();
91 //      toolbar->addAction(x1Act);
92 //      toolbar->addAction(x2Act);
93 //      toolbar->addAction(x3Act);
94 //      toolbar->addSeparator();
95 //      toolbar->addAction(ntscAct);
96 //      toolbar->addAction(palAct);
97 //      toolbar->addSeparator();
98 //      toolbar->addAction(blurAct);
99 //      toolbar->addAction(fullScreenAct);
100
101         //      Create status bar
102         statusBar()->showMessage(tr("Ready"));
103
104         ReadSettings();
105         boldFont->setBold(true);
106
107         // Finally, set up database connection
108
109 //      db = QSqlDatabase::addDatabase("QMYSQL");
110         db = QSqlDatabase::addDatabase("QODBC");
111         bool ok = false;
112
113         // Prime the SQL Settings dialog (in case we need it)
114
115         SQLSettingsDialog sqlSettings;
116         sqlSettings.edit1->setText(dbDriver);
117         sqlSettings.edit2->setText(dbHostName);
118         sqlSettings.edit3->setText(dbName);
119         sqlSettings.edit4->setText(dbUserName);
120         sqlSettings.edit5->setText(dbPassword);
121
122 #if 0
123 db = QSqlDatabase::addDatabase("QODBC");
124 db.setDatabaseName("Driver={MySQL ODBC 5.1 Driver};DATABASE=agp-dbserver01;");
125 db.setUserName("xcdr");
126 db.setPassword("xcdr");
127 #endif
128         do
129         {
130                 // Set up the DB connection with saved settings
131                 QString odbc = QString("DRIVER={%1};DATABASE=%2;").arg(dbDriver).arg(dbName);
132                 db.setHostName(dbHostName);
133                 db.setDatabaseName(odbc);
134                 db.setUserName(dbUserName);
135                 db.setPassword(dbPassword);
136                 ok = db.open();
137
138                 // If unsuccessful, run the SQL settings/test dialog
139                 if (!ok)
140                 {
141 //printf("Error: %s\n", db.lastError().databaseText().toAscii().data());
142 //printf("Error: %s\n", db.lastError().driverText().toAscii().data());
143                         sqlSettings.error1->setText(db.lastError().databaseText());
144                         sqlSettings.error2->setText(db.lastError().driverText());
145
146                         if (sqlSettings.exec())
147                         {
148                                 // User thinks this will work (hit OK button), so prime the variables
149                                 // for the next attempt
150                                 dbDriver = sqlSettings.edit1->text();
151                                 dbHostName = sqlSettings.edit2->text();
152                                 dbName = sqlSettings.edit3->text();
153                                 dbUserName = sqlSettings.edit4->text();
154                                 dbPassword = sqlSettings.edit5->text();
155                         }
156                         else
157                                 return;                                         // User cancelled the dialog, so quit
158                 }
159         }
160         while (!ok);
161
162         // Check to see how many users are in the system; if less than 2, we don't do a login
163         QSqlQuery query;
164         query.prepare("SELECT COUNT(*) FROM User");
165         query.exec();
166         query.next();
167
168         if (query.value(0).toInt() > 1)
169         {
170         // Do Login dialog
171         LoginDialog loginDlg;
172         bool done = false;
173
174         do
175         {
176                 bool accept = loginDlg.exec();
177
178                 // Check to see if user cancelled out
179                 if (!accept)
180                         done = true;
181                 else
182                 {
183 #if 0
184                         // Search DB for this username/login pair
185                         QSqlQuery query("SELECT UID, name, login FROM User WHERE Login=? AND Password=?");
186                         query.addBindValue(loginDlg.edit1->text());
187                         query.addBindValue(loginDlg.edit2->text());
188                         query.exec();
189 #else
190                         // Search DB for this username/login pair
191                         QSqlQuery query;
192                         query.prepare("SELECT UID, name, login FROM User WHERE Login=? AND Password=?");
193                         query.addBindValue(loginDlg.edit1->text());
194                         query.addBindValue(loginDlg.edit2->text());
195                         query.exec();
196 #endif
197
198                         while (query.next())
199                         {
200                                 // We have a winner!
201                                 loggedInUID = query.value(0).toInt();
202                                 fullName = query.value(1).toString();
203                                 login = query.value(2).toString();
204                                 done = true;
205                         }
206                 }
207         }
208         while (!done);
209         }
210         else
211         {
212                 fullName = "Administrator";
213                 login = "admin";
214                 loggedInUID = 1;
215         }
216
217         QString s = QString("User: %1 (%2)").arg(fullName).arg(login);
218         scmWidget->username->setText(s);
219         setCentralWidget(scmWidget);
220 }
221
222
223 void MainWindow::closeEvent(QCloseEvent * event)
224 {
225         WriteSettings();
226         event->accept(); // ignore() if can't close for some reason
227 }
228
229
230 void MainWindow::Open(void)
231 {
232 }
233
234
235 void MainWindow::ShowAboutWin(void)
236 {
237         aboutWin->show();
238 }
239
240
241 void MainWindow::HandleConfigDialog(void)
242 {
243         ConfigDialog dialog(this);
244         dialog.exec();
245 }
246
247
248 void MainWindow::HandleVendorClassDialog(void)
249 {
250         VendorClassDialog dialog(this);
251
252         if (!dialog.exec())
253                 return;
254 }
255
256
257 void MainWindow::HandleNewVendorDialog(void)
258 {
259         NewVendorDialog dialog(this);
260         FillVendorLevelCombo(dialog.combo1);
261         FillContactTypeCombo(dialog.contact->field1);
262         FillVendorClassList(dialog.list);
263
264         if (!dialog.exec())
265                 return;
266
267         // Presumably, the user has given us good data, so we try to populate the
268         // database with this new vendor data.
269         QSqlQuery query;
270         query.prepare("INSERT INTO  VALUES (?, ?, ?)");
271
272         
273 }
274
275
276 void MainWindow::FillVendorLevelCombo(QComboBox * combo)
277 {
278         QSqlQuery query;
279         query.prepare("SELECT VLID, Description FROM VendorLevel");
280         query.exec();
281
282         while (query.next())
283         {
284                 int vlid = query.value(0).toInt();
285                 QString description = query.value(1).toString();
286
287                 combo->addItem(description, vlid);
288         }
289 }
290
291
292 void MainWindow::FillContactTypeCombo(QComboBox * combo)
293 {
294         QSqlQuery query;
295         query.prepare("SELECT CTID, Description FROM ContactType");
296         query.exec();
297
298         while (query.next())
299         {
300                 int ctid = query.value(0).toInt();
301                 QString description = query.value(1).toString();
302
303                 combo->addItem(description, ctid);
304         }
305 }
306
307
308 void MainWindow::FillVendorClassList(QListWidget * list)
309 {
310         std::vector<VendorType> groupList;
311
312         // Pull in definitions from DB for Vendor Classes/Groups
313         QSqlQuery query1;
314         query1.prepare("SELECT vgid, description FROM VendorGroup ORDER BY seqNo");
315         query1.exec();
316
317         while (query1.next())
318         {
319                 VendorType v;
320                 v.key         = query1.value(0).toInt();
321                 v.description = query1.value(1).toString();
322                 groupList.push_back(v);
323         }
324
325 //      QSqlQuery query2;
326         query1.prepare("SELECT vtid, vgid, description FROM VendorType ORDER BY seqNo");
327         query1.exec();
328
329         int previousID = -1, groupListIndex = 0;
330         QListWidgetItem * item;
331
332         while (query1.next())
333         {
334 //              VendorType v;
335                 int vtid            = query1.value(0).toInt();
336                 int vgid            = query1.value(1).toInt();
337                 QString description = query1.value(2).toString();
338
339                 // Check to see if we need to insert new header yet.
340                 // If we're not still in same group, push the next group header into the list
341                 // and continue
342                 if (previousID != vgid)
343                 {
344                         item  = new QListWidgetItem(groupList[groupListIndex].description);
345                         item->setData(Qt::UserRole, groupList[groupListIndex++].key);
346                         item->setFont(*boldFont);
347                         list->addItem(item);
348                         previousID = vgid;
349                 }
350
351                 item  = new QListWidgetItem(description);
352                 item->setData(Qt::UserRole, vtid);
353                 item->setCheckState(Qt::Unchecked);
354                 list->addItem(item);
355         }
356 }
357
358
359 void MainWindow::ReadSettings(void)
360 {
361         QSettings settings("Underground Software", "SCheMatic");
362         QPoint pos = settings.value("pos", QPoint(200, 200)).toPoint();
363         QSize size = settings.value("size", QSize(400, 400)).toSize();
364         resize(size);
365         move(pos);
366 //      pos = settings.value("charWndPos", QPoint(0, 0)).toPoint();
367 //      size = settings.value("charWndSize", QSize(200, 200)).toSize();
368 //      ((TTEdit *)qApp)->charWnd->resize(size);
369 //      ((TTEdit *)qApp)->charWnd->move(pos);
370
371         dbDriver = settings.value("dbDriver", "myodbc-5.1").toString();
372         dbHostName = settings.value("dbHostName", "localhost").toString();
373         dbName = settings.value("dbName", "schematic").toString();
374         dbUserName = settings.value("dbUserName", "scm_user").toString();
375         dbPassword = settings.value("dbPassword", "scm_user").toString();
376 }
377
378
379 void MainWindow::WriteSettings(void)
380 {
381         QSettings settings("Underground Software", "SCheMatic");
382         settings.setValue("pos", pos());
383         settings.setValue("size", size());
384 //      settings.setValue("charWndPos", ((TTEdit *)qApp)->charWnd->pos());
385 //      settings.setValue("charWndSize", ((TTEdit *)qApp)->charWnd->size());
386
387         settings.setValue("dbDriver", dbDriver);
388         settings.setValue("dbHostName", dbHostName);
389         settings.setValue("dbName", dbName);
390         settings.setValue("dbUserName", dbUserName);
391         settings.setValue("dbPassword", dbPassword);
392 }
393