2 // mainwin.cpp - The Supply Chain Manager-O-Matic
4 // (C) 2012 Underground Software
6 // JLH = James Hammons <jlhamm@acm.org>
9 // --- ---------- -------------------------------------------------------------
10 // JLH 09/14/2012 Created this file
13 // Uncomment this for debugging...
15 //#define DEBUGFOO // Various tool debugging...
16 //#define DEBUGTP // Toolpalette debugging...
20 #include "configdialog.h"
21 #include "logindialog.h"
22 #include "newvendordialog.h"
23 #include "scmwidget.h"
24 #include "sqlsettingsdialog.h"
25 #include "vendorclassdialog.h"
28 MainWindow::MainWindow(): aboutWin(new AboutWindow(this)),
29 scmWidget(new SCMWidget(this)),
33 setWindowIcon(QIcon(":/res/schematic.png"));
34 setWindowTitle("SCheMatic");
36 setUnifiedTitleAndToolBarOnMac(true);
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()));
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()));
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()));
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()));
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()));
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()));
65 // Create menus & toolbars
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);
76 menu = menuBar()->addMenu(tr("&Edit"));
77 menu->addAction(configAct);
78 menu->addAction(vendorClassAct);
79 menu->addAction(newVendorAct);
81 menu = menuBar()->addMenu(tr("&Help"));
82 // menu->addAction(helpAct);
83 menu->addAction(aboutAct);
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);
102 statusBar()->showMessage(tr("Ready"));
105 boldFont->setBold(true);
107 // Finally, set up database connection
109 // db = QSqlDatabase::addDatabase("QMYSQL");
110 db = QSqlDatabase::addDatabase("QODBC");
113 // Prime the SQL Settings dialog (in case we need it)
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);
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");
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);
138 // If unsuccessful, run the SQL settings/test dialog
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());
146 if (sqlSettings.exec())
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();
157 return; // User cancelled the dialog, so quit
162 // Check to see how many users are in the system; if less than 2, we don't do a login
164 query.prepare("SELECT COUNT(*) FROM User");
168 if (query.value(0).toInt() > 1)
171 LoginDialog loginDlg;
176 bool accept = loginDlg.exec();
178 // Check to see if user cancelled out
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());
190 // Search DB for this username/login pair
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());
201 loggedInUID = query.value(0).toInt();
202 fullName = query.value(1).toString();
203 login = query.value(2).toString();
212 fullName = "Administrator";
217 QString s = QString("User: %1 (%2)").arg(fullName).arg(login);
218 scmWidget->username->setText(s);
219 setCentralWidget(scmWidget);
223 void MainWindow::closeEvent(QCloseEvent * event)
226 event->accept(); // ignore() if can't close for some reason
230 void MainWindow::Open(void)
235 void MainWindow::ShowAboutWin(void)
241 void MainWindow::HandleConfigDialog(void)
243 ConfigDialog dialog(this);
248 void MainWindow::HandleVendorClassDialog(void)
250 VendorClassDialog dialog(this);
257 void MainWindow::HandleNewVendorDialog(void)
259 NewVendorDialog dialog(this);
260 FillVendorLevelCombo(dialog.combo1);
261 FillContactTypeCombo(dialog.contact->field1);
262 FillVendorClassList(dialog.list);
267 // Presumably, the user has given us good data, so we try to populate the
268 // database with this new vendor data.
270 query.prepare("INSERT INTO VALUES (?, ?, ?)");
276 void MainWindow::FillVendorLevelCombo(QComboBox * combo)
279 query.prepare("SELECT VLID, Description FROM VendorLevel");
284 int vlid = query.value(0).toInt();
285 QString description = query.value(1).toString();
287 combo->addItem(description, vlid);
292 void MainWindow::FillContactTypeCombo(QComboBox * combo)
295 query.prepare("SELECT CTID, Description FROM ContactType");
300 int ctid = query.value(0).toInt();
301 QString description = query.value(1).toString();
303 combo->addItem(description, ctid);
308 void MainWindow::FillVendorClassList(QListWidget * list)
310 std::vector<VendorType> groupList;
312 // Pull in definitions from DB for Vendor Classes/Groups
314 query1.prepare("SELECT vgid, description FROM VendorGroup ORDER BY seqNo");
317 while (query1.next())
320 v.key = query1.value(0).toInt();
321 v.description = query1.value(1).toString();
322 groupList.push_back(v);
326 query1.prepare("SELECT vtid, vgid, description FROM VendorType ORDER BY seqNo");
329 int previousID = -1, groupListIndex = 0;
330 QListWidgetItem * item;
332 while (query1.next())
335 int vtid = query1.value(0).toInt();
336 int vgid = query1.value(1).toInt();
337 QString description = query1.value(2).toString();
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
342 if (previousID != vgid)
344 item = new QListWidgetItem(groupList[groupListIndex].description);
345 item->setData(Qt::UserRole, groupList[groupListIndex++].key);
346 item->setFont(*boldFont);
351 item = new QListWidgetItem(description);
352 item->setData(Qt::UserRole, vtid);
353 item->setCheckState(Qt::Unchecked);
359 void MainWindow::ReadSettings(void)
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();
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);
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();
379 void MainWindow::WriteSettings(void)
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());
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);