From 6c9ba10f64c4880fd4c58527c462ef1f7841bf17 Mon Sep 17 00:00:00 2001 From: Shamus Hammons Date: Tue, 18 Sep 2012 22:31:53 -0500 Subject: [PATCH] Initial commit. --- database-schema.txt | 87 ++++++++ phase1.ui | 463 +++++++++++++++++++++++++++++++++++++++++++ res/schematic.png | Bin 0 -> 1529 bytes schematic | Bin 0 -> 67377 bytes schematic-schema.sql | 419 +++++++++++++++++++++++++++++++++++++++ schematic.pro | 38 ++++ schematic.qrc | 5 + specs.txt | 103 ++++++++++ src/about.cpp | 64 ++++++ src/about.h | 27 +++ src/configdialog.cpp | 41 ++++ src/configdialog.h | 24 +++ src/generaltab.cpp | 28 +++ src/generaltab.h | 18 ++ src/logindialog.cpp | 43 ++++ src/logindialog.h | 25 +++ src/main.cpp | 38 ++++ src/main.h | 25 +++ src/mainwin.cpp | 168 ++++++++++++++++ src/mainwin.h | 43 ++++ 20 files changed, 1659 insertions(+) create mode 100644 database-schema.txt create mode 100644 phase1.ui create mode 100644 res/schematic.png create mode 100755 schematic create mode 100644 schematic-schema.sql create mode 100644 schematic.pro create mode 100644 schematic.qrc create mode 100644 specs.txt create mode 100644 src/about.cpp create mode 100644 src/about.h create mode 100644 src/configdialog.cpp create mode 100644 src/configdialog.h create mode 100644 src/generaltab.cpp create mode 100644 src/generaltab.h create mode 100644 src/logindialog.cpp create mode 100644 src/logindialog.h create mode 100644 src/main.cpp create mode 100644 src/main.h create mode 100644 src/mainwin.cpp create mode 100644 src/mainwin.h diff --git a/database-schema.txt b/database-schema.txt new file mode 100644 index 0000000..a7bc741 --- /dev/null +++ b/database-schema.txt @@ -0,0 +1,87 @@ +Supply Chain Management Database (SCheMatic: The Supply Chain Manager-O-Matic) +------------------------------------------------------------------------------ + +TABLES: + +Vendor +VID (P-key) | VLID | Name +CREATE TABLE Vendor (vid INT NOT NULL PRIMARY KEY AUTO_INCREMENT, vlid INT, name VARCHAR(100), FOREIGN KEY (vlid) REFERENCES VendorLevel(vlid)) ENGINE=INNODB; + +VendorLevel +VLID (P-key) | VendorUseable | Color | Description +CREATE TABLE VendorLevel (vlid INT NOT NULL PRIMARY KEY AUTO_INCREMENT, vendorUsable TINYINT(1) NOT NULL DEFAULT 0, color INT(4), description VARCHAR(100)) ENGINE=INNODB; + +VendorType +VTID (P-key) | VGID | Description +CREATE TABLE VendorType (vtid INT NOT NULL PRIMARY KEY AUTO_INCREMENT, vgid INT, description VARCHAR(100), FOREIGN KEY (vgid) REFERENCES VendorGroup(vgid)) ENGINE=INNODB; + +VendorGroup +VGID (P-key) | Description +CREATE TABLE VendorGroup (vgid INT NOT NULL PRIMARY KEY AUTO_INCREMENT, description VARCHAR(100)) ENGINE=INNODB; + +VendorSpecificTypes +VID (multi) | VTID (multi) +CREATE TABLE VendorSpecificTypes (vid INT, vtid INT, FOREIGN KEY (vid) REFERENCES Vendor(vid), FOREIGN KEY (vtid) REFERENCES VendorType(vtid)) ENGINE=INNODB; + +Location +LID (P-key) | VID | Description +CREATE TABLE Location () ENGINE=INNODB; + +Contact +CID (P-key) | VID | CTID | Name | Email | Address | Phone1 | Phone2 | Fax +CREATE TABLE Contact (cid INT NOT NULL PRIMARY KEY AUTO_INCREMENT, vid INT, CTID int, name VARCHAR(64), email VARCHAR(64), address VARCHAR(200), phone1 VARCHAR(32), phone2 VARCHAR(32), fax VARCHAR(32), FOREIGN KEY (vid) REFERENCES Vendor(vid), FOREIGN KEY (ctid) REFERENCES ContactType(ctid)) ENGINE=INNODB; + +ContactType +CTID (P-key) | Description +CREATE TABLE ContactType (ctid INT NOT NULL PRIMARY KEY AUTO_INCREMENT, description VARCHAR(100)) ENGINE=INNODB; + +User +UID (P-key) | UCID | Name | Login | Password +CREATE TABLE User (uid INT NOT NULL PRIMARY KEY AUTO_INCREMENT, ucid int, name VARCHAR(64), login VARCHAR(32), password VARCHAR(64), FOREIGN KEY (ucid) REFERENCES UserClass(ucid)) ENGINE=INNODB; + +UserClass +UCID | PrivilegeLevel | Description +CREATE TABLE UserClass (ucid INT NOT NULL PRIMARY KEY AUTO_INCREMENT, privilegeLevel INT NOT NULL DEFAULT 0, description VARCHAR(100)) ENGINE=INNODB; + +PurchaseOrder +POID (P-key) | VID | Closed | Description +CREATE TABLE PurchaseOrder (poid INT NOT NULL PRIMARY KEY AUTO_INCREMENT, vid INT, closed TINYINT(1) NOT NULL DEFAULT 0, description VARCHAR(200), FOREIGN KEY (vid) REFERENCES Vendor(vid)) ENGINE=INNODB; + +Documents +DID (P-key) | DTID | VID | POID | Document +CREATE TABLE Documents (did INT NOT NULL PRIMARY KEY AUTO_INCREMENT, dtid INT, vid INT, poid INT, document LONGBLOB, FOREIGN KEY (dtid) REFERENCES DocumentType(dtid), FOREIGN KEY (vid) REFERENCES Vendor(vid), FOREIGN KEY (poid) REFERENCES PurchaseOrder(poid)) ENGINE=INNODB; + +DocumentType +DTID (P-key) | Description +CREATE TABLE DocumentType (dtid INT NOT NULL PRIMARY KEY AUTO_INCREMENT, description VARCHAR(100)) ENGINE=INNODB; + +Notes +NID (P-key) | POID | Note +CREATE TABLE Notes (nid INT NOT NULL PRIMARY KEY AUTO_INCREMENT, poid INT, note VARCHAR(200)) ENGINE=INNODB; + +Alerts +AID (P-key) | UID | NID | Date | Description +CREATE TABLE Alerts (aid INT NOT NULL PRIMARY KEY AUTO_INCREMENT, uid INT, nid INT, date DATE, description VARCHAR(200), FOREIGN KEY (uid) REFERENCES User(uid)) ENGINE=INNODB; + +History +UID | Date | Note +CREATE TABLE History (uid INT, date DATETIME, note VARCHAR(100), FOREIGN KEY (uid) REFERENCES User(uid)) ENGINE=INNODB; + +------------------------------------------------------------------------------- + +PurchaseRequest +PRID (P-key) | UIDRequestor | Description +CREATE TABLE () ENGINE=INNODB; + +PRItems +PRID (multi) | Quantity | UnitPrice | Description +CREATE TABLE () ENGINE=INNODB; + +PurchaseApprovals +PRID (multi) | UIDApprover | Approved +CREATE TABLE () ENGINE=INNODB; + +Approvers +UIDApprover (multi) | UIDRequestor (multi) +CREATE TABLE () ENGINE=INNODB; + diff --git a/phase1.ui b/phase1.ui new file mode 100644 index 0000000..768c40c --- /dev/null +++ b/phase1.ui @@ -0,0 +1,463 @@ + + + MainWindow + + + + 0 + 0 + 932 + 626 + + + + MainWindow + + + + + + 570 + 410 + 141 + 111 + + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Here's some stuff to look at, isn't it purty? :-)</p></body></html> + + + + + + 10 + 50 + 221 + 16 + + + + + 12 + + + + Vendor Name + + + + + + 240 + 10 + 51 + 16 + + + + Search: + + + + + + 290 + 10 + 191 + 22 + + + + + + + 10 + 30 + 731 + 16 + + + + Qt::Horizontal + + + + + + 20 + 230 + 61 + 14 + + + + Contact1: + + + + + + 90 + 230 + 221 + 22 + + + + Title, email, phone, fax, etc. + + + + + + 90 + 200 + 121 + 21 + + + + NDA Signed + + + + + + 10 + 80 + 281 + 111 + + + + + + + Address: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + + + City: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + State: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + + + + + + ZIP: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + + + + + 20 + 250 + 61 + 14 + + + + Contact2: + + + + + + 90 + 250 + 113 + 22 + + + + + + + 20 + 10 + 131 + 16 + + + + User: joneal + + + + + + 320 + 50 + 591 + 192 + + + + + PO # + + + + + Vendor + + + + + Desc. + + + + + OAD + + + + + UAD + + + + + Docs + + + + + FAI + + + + + + + 410 + 380 + 121 + 121 + + + + Create Item + + + + + 10 + 30 + 100 + 23 + + + + PO + + + + + + 10 + 60 + 100 + 23 + + + + Alert + + + + + + 10 + 90 + 100 + 23 + + + + Note + + + + + + + 10 + 380 + 131 + 121 + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + 10 + 10 + 111 + 101 + + + + + 64 + + + + false + + + <html><head/><body><p><span style=" background-color:#0055ff;"> &nbsp;2 </span></p></body></html> + + + Qt::AlignCenter + + + + + + + 150 + 380 + 256 + 192 + + + + + Vendor Classes + + + + + Machine + + + + Cutter + + + + + Casting + + + + + + Electronic Parts + + + + + PCBs + + + + + Raw Materials + + + + + Lenses + + + + + COTS + + + + + Coatings + + + + + + + + 0 + 0 + 932 + 20 + + + + + Menu1 + + + + + + Menu2 + + + + + + + + + + Submenu Item 1 + + + + + Submenu Item 1 + + + + + + diff --git a/res/schematic.png b/res/schematic.png new file mode 100644 index 0000000000000000000000000000000000000000..2b9c7fdd15450b4de5c8338c632776ffda44aad0 GIT binary patch literal 1529 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 + + res/schematic.png + + diff --git a/specs.txt b/specs.txt new file mode 100644 index 0000000..8b11dab --- /dev/null +++ b/specs.txt @@ -0,0 +1,103 @@ +Supply Chain Management Database (SCheMatic: The Supply Chain Manager-O-Matic) +------------------------------------------------------------------------------ + +Section 1 (Vendor Info): + +Essentially here is the display for vendor information including contacts with titles, addresses, phones, faxes & emails. + +There needs to be an edit field button for vendor information that activates depending on user level. + +There needs to be a lit up or not box for if they have completed an NDA. + + +Section 2 (Open P.O.s): + +7 Columns + + o PO# - well the first column displays the PO# - when you click, you can automatically create a note that will be associated with the PO in history. + o Company Name + o Desc - Well this would be what the PO is called or saved as. + o Original Arrival Date - Date unit expected at time of order. + o Updated Arrival Date - This is a date that can be adjusted based upon information learned. This means it needs to be editable. I figure if we click on this line, a popup displays where you can edit arrival date. It will prompt for a reason which. The reason and note of the update and by whom will be recorded in history. + o Supplied Docs - Here will be a record of documents/files supplied with the PO. These will be uploaded when you "create" the PO in section 3. This will need to be editable with history of edits in the history field. + o FAI - These are docs that are received and saved whenever a shipment is received. Should be able to click on this line section to add. + +Check box that says all. If checked all open POs. If not then vendor specific POs. + +Open POs are created in section 3. + + +Section 3 (Create PO): + +So here is the create section. Three main buttons (at the moment): + + o PO + o Alert + o Note + +So those buttons will call up a popup window I expect. I think for ease of design they can all bring up the same page, just with the sections not applicable greyed out. + +PO - This will actually bring up all three sections as they all apply when entering a new PO. + + o Sections: PO #, PO Desc, PO company name, expected arrival date (have 5 expected arrival date fields as we may have staggered POs), Alerts (again, have 5 fields with date, time, user assigned, admin always copied on alerts, Contact,) Notes. + +Alert - Will only open up window with alert, contact, company name (or User Name for Internal contact) and notes, PO #. + +Notes - Company name, contact, PO #, Notes + + +Section 4 (Vendor Level): + +Section backlit Green if they are a level 1 (Tier 1?). +Section backlit Blue if they are level 2. +Section backlit Red if they are BANNED. +Big number display for level (1, 2, X?) + + +Section 5 (Closed POs): + +Similar to section 2 + + +Section 6 (Action List): + +This is where todos are listed. Either alerts planned or ExactMax saying that a PO has been created. +Administrator sees all. Users just see their stuff. +3 columns + + o First colum reflects check boxes if the line items found in the action list. Check and then hit the delete button if desired. + o Second is the user assigned check box. If you check, then a small pop up comes in with a list of users you can assign this task to. + o Description of action. + + +Section 7 (Action History): + +Scrollable action history list. Everyone sees all. + + +Section 8 (Vendor page specific history): + +Here is where the history lives for each vendor on their page. + +Search box allows you to enter date range, contact name or PO # to view history in box. + +Window has 4 Columns + + o First column is date + o Second column is PO # + o Third column is the vendor note or description of action + o Fourth column is user + + +Section 9 (Vendor Class): + +Essentially this is where each vendor has their class ability listed. These classes are searchable. + +Edit button to assign classes to vendor. + + +Section 10 (Header Bar): + +There is a universal search field. + +User name is listed. diff --git a/src/about.cpp b/src/about.cpp new file mode 100644 index 0000000..dc43bdb --- /dev/null +++ b/src/about.cpp @@ -0,0 +1,64 @@ +// +// about.cpp - Credits +// +// by James Hammons +// (C) 2012 Underground Software +// +// JLH = James Hammons +// +// Who When What +// --- ---------- ------------------------------------------------------------- +// JLH 01/21/2010 Created this file +// + +#include "about.h" +//#include "version.h" + +AboutWindow::AboutWindow(QWidget * parent/*= 0*/): QWidget(parent, Qt::Dialog) +{ + setWindowTitle(tr("About SCheMatic...")); + + layout = new QVBoxLayout(); + layout->setSizeConstraint(QLayout::SetFixedSize); + setLayout(layout); + + image = new QLabel(); + image->setAlignment(Qt::AlignRight); + image->setPixmap(QPixmap(":/res/schematic.png")); + layout->addWidget(image); + + QString s; + s.append(tr( + "" + "" + "" + "" +// "" +// "" + "
Version: " +// VJ_RELEASE_VERSION " (" VJ_RELEASE_SUBVERSION ")" + "0.0.1 (Testing)" + "
Coders: James \"Shamus\" Hammons
Testers: Jason O'Neal
Build Team: ggn (win32)
LinkoVitch, goldenegg (MacOS)
Homepage: http://icculus.org/virtualjaguar/
" + "

" + "The SCheMatic team would like to express their gratitude to:" + "

" + "Tracking Point for underwriting the creation of SCheMatic
" +// "David Raingeard for the original Virtual Jaguar sources
" +// "Bernd Schmidt for his UAE 68K emulator
" +// "Sam Lantinga for his amazing SDL libraries
" +// "Ryan C. Gordon for Virtual Jaguar's web presence
" +// "Curt Vendel for various Jaguar & other goodies (you rock!)
" +// "Reboot for reasons too numerous to mention
" +// "The Free Jaguar Project (you know why) ;-)
" +// "The guys over at Atari Age :-)
" +// "byuu for BSNES and showing us what was possible" + )); + text = new QLabel(s); + layout->addWidget(text); +} + +void AboutWindow::keyPressEvent(QKeyEvent * e) +{ + if (e->key() == Qt::Key_Escape || e->key() == Qt::Key_Return) + hide(); +} diff --git a/src/about.h b/src/about.h new file mode 100644 index 0000000..c0a802e --- /dev/null +++ b/src/about.h @@ -0,0 +1,27 @@ +// +// about.h: Credits where credits are due ;-) +// +// by James Hammons +// (C) 2012 Underground Software +// + +#ifndef __ABOUT_H__ +#define __ABOUT_H__ + +#include + +class AboutWindow: public QWidget +{ + public: + AboutWindow(QWidget * parent = 0); + + protected: + void keyPressEvent(QKeyEvent *); + + private: + QVBoxLayout * layout; + QLabel * text; + QLabel * image; +}; + +#endif // __ABOUT_H__ diff --git a/src/configdialog.cpp b/src/configdialog.cpp new file mode 100644 index 0000000..b3c14ed --- /dev/null +++ b/src/configdialog.cpp @@ -0,0 +1,41 @@ +// +// settingsdialog.cpp: Dialog for changing Architektonas settings +// +// Part of the Architektonas Project +// (C) 2011 Underground Software +// See the README and GPLv3 files for licensing and warranty information +// +// JLH = James Hammons +// +// WHO WHEN WHAT +// --- ---------- ------------------------------------------------------------ +// JLH 06/04/2011 Created this file + +#include "configdialog.h" +#include "generaltab.h" + + +ConfigDialog::ConfigDialog(QWidget * parent/*= 0*/): QDialog(parent) +{ + tabWidget = new QTabWidget; + generalTab = new GeneralTab(this); + tabWidget->addTab(generalTab, tr("General")); +// tabWidget->addTab(new PermissionsTab(fileInfo), tr("Permissions")); +// tabWidget->addTab(new ApplicationsTab(fileInfo), tr("Applications")); + + buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel); + + connect(buttonBox, SIGNAL(accepted()), this, SLOT(accept())); + connect(buttonBox, SIGNAL(rejected()), this, SLOT(reject())); + + QVBoxLayout * mainLayout = new QVBoxLayout; + mainLayout->addWidget(tabWidget); + mainLayout->addWidget(buttonBox); + setLayout(mainLayout); + + setWindowTitle(tr("SCheMatic Settings")); +} + +ConfigDialog::~ConfigDialog() +{ +} diff --git a/src/configdialog.h b/src/configdialog.h new file mode 100644 index 0000000..ddfdfda --- /dev/null +++ b/src/configdialog.h @@ -0,0 +1,24 @@ +#ifndef __CONFIGDIALOG_H__ +#define __CONFIGDIALOG_H__ + +#include + +class GeneralTab; + +class ConfigDialog: public QDialog +{ + Q_OBJECT + + public: + ConfigDialog(QWidget * parent = 0); + ~ConfigDialog(); + + private: + QTabWidget * tabWidget; + QDialogButtonBox * buttonBox; + + public: + GeneralTab * generalTab; +}; + +#endif // __CONFIGDIALOG_H__ diff --git a/src/generaltab.cpp b/src/generaltab.cpp new file mode 100644 index 0000000..7b18549 --- /dev/null +++ b/src/generaltab.cpp @@ -0,0 +1,28 @@ +// +// generaltab.cpp: "General" tab on the settings dialog +// +// Part of the Architektonas Project +// (C) 2011 Underground Software +// See the README and GPLv3 files for licensing and warranty information +// +// JLH = James Hammons +// +// WHO WHEN WHAT +// --- ---------- ------------------------------------------------------------ +// JLH 06/04/2011 Created this file + +#include "generaltab.h" + + +GeneralTab::GeneralTab(QWidget * parent/*= 0*/): QWidget(parent) +{ + antialiasChk = new QCheckBox(tr("Use Qt's built-in antialiasing")); + + QVBoxLayout * layout = new QVBoxLayout; + layout->addWidget(antialiasChk); + setLayout(layout); +} + +GeneralTab::~GeneralTab() +{ +} diff --git a/src/generaltab.h b/src/generaltab.h new file mode 100644 index 0000000..8dde60a --- /dev/null +++ b/src/generaltab.h @@ -0,0 +1,18 @@ +#ifndef __GENERALTAB_H__ +#define __GENERALTAB_H__ + +#include + +class GeneralTab: public QWidget +{ + Q_OBJECT + + public: + GeneralTab(QWidget * parent = 0); + ~GeneralTab(); + + public: + QCheckBox * antialiasChk; +}; + +#endif // __GENERALTAB_H__ diff --git a/src/logindialog.cpp b/src/logindialog.cpp new file mode 100644 index 0000000..fdd6ce6 --- /dev/null +++ b/src/logindialog.cpp @@ -0,0 +1,43 @@ +// +// logindialog.cpp: The login dialog +// +// Part of the SCheMatic Project +// (C) 2012 Underground Software +// +// JLH = James Hammons +// +// WHO WHEN WHAT +// --- ---------- ------------------------------------------------------------ +// JLH 06/04/2011 Created this file + +#include "logindialog.h" + + +LoginDialog::LoginDialog(QWidget * parent/*= 0*/): QDialog(parent), +// label1(new QLabel(tr("Username:"))), +// label2(new QLabel(tr("Password:"))), + buttonBox(new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel)), + edit1(new QLineEdit()), + edit2(new QLineEdit()) +{ + connect(buttonBox, SIGNAL(accepted()), this, SLOT(accept())); + connect(buttonBox, SIGNAL(rejected()), this, SLOT(reject())); + + edit2->setEchoMode(QLineEdit::Password); + + QFormLayout * formLayout = new QFormLayout; + formLayout->addRow(tr("&Username:"), edit1); + formLayout->addRow(tr("&Password:"), edit2); + + QVBoxLayout * mainLayout = new QVBoxLayout; +// mainLayout->addWidget(tabWidget); + mainLayout->addLayout(formLayout); + mainLayout->addWidget(buttonBox); + setLayout(mainLayout); + + setWindowTitle(tr("Please Log On to SCheMatic")); +} + +LoginDialog::~LoginDialog() +{ +} diff --git a/src/logindialog.h b/src/logindialog.h new file mode 100644 index 0000000..d583c63 --- /dev/null +++ b/src/logindialog.h @@ -0,0 +1,25 @@ +#ifndef __LOGINDIALOG_H__ +#define __LOGINDIALOG_H__ + +#include + +class LoginDialog: public QDialog +{ + Q_OBJECT + + public: + LoginDialog(QWidget * parent = 0); + ~LoginDialog(); + + private: +// QLabel * label1; +// QLabel * label2; + QLabel * title; + QDialogButtonBox * buttonBox; + + public: + QLineEdit * edit1; + QLineEdit * edit2; +}; + +#endif // __LOGINDIALOG_H__ diff --git a/src/main.cpp b/src/main.cpp new file mode 100644 index 0000000..9dc9195 --- /dev/null +++ b/src/main.cpp @@ -0,0 +1,38 @@ +// +// main.cpp - The Supply Chain Manager-O-Matic +// by James Hammons +// (C) 2012 Underground Software +// +// JLH = James Hammons +// +// Who When What +// --- ---------- ------------------------------------------------------------- +// JLH 09/14/2012 Created this file +// + +#include "main.h" +#include +#include "mainwin.h" + +// Main app constructor--we stick globally accessible stuff here... + +MainApp::MainApp(int & argc, char * argv[]): QApplication(argc, argv) +{ + mainWindow = new MainWindow; + mainWindow->show(); +} + + +// Here's the main application loop--short and simple... +int main(int argc, char * argv[]) +{ + Q_INIT_RESOURCE(schematic); // This must the same name as the exe filename + + MainApp app(argc, argv); + + // User either couldn't log on, or cancelled out + if (app.mainWindow->loggedInUID == 0) + return 0; + + return app.exec(); +} diff --git a/src/main.h b/src/main.h new file mode 100644 index 0000000..62647ac --- /dev/null +++ b/src/main.h @@ -0,0 +1,25 @@ +// +// main.h: Header file +// +// by James L. Hammons +// (C) 2012 Underground Software +// + +#ifndef __MAIN_H__ +#define __MAIN_H__ + +#include + +// Forward declarations +class MainWindow; + +class MainApp: public QApplication +{ + public: + MainApp(int & argc, char * argv[]); + + public: + MainWindow * mainWindow; +}; + +#endif // __MAIN_H__ diff --git a/src/mainwin.cpp b/src/mainwin.cpp new file mode 100644 index 0000000..b7e1748 --- /dev/null +++ b/src/mainwin.cpp @@ -0,0 +1,168 @@ +// +// mainwin.cpp - The Supply Chain Manager-O-Matic +// by James Hammons +// (C) 2012 Underground Software +// +// JLH = James Hammons +// +// Who When What +// --- ---------- ------------------------------------------------------------- +// JLH 09/14/2012 Created this file +// + +// Uncomment this for debugging... +//#define DEBUG +//#define DEBUGFOO // Various tool debugging... +//#define DEBUGTP // Toolpalette debugging... + +#include "mainwin.h" +#include +//#include "main.h" +#include "about.h" +#include "logindialog.h" + + +MainWindow::MainWindow(): aboutWin(new AboutWindow(this)), + loggedInUID(0) +{ + setWindowIcon(QIcon(":/res/schematic.png")); + setWindowTitle("SCheMatic"); + + setUnifiedTitleAndToolBarOnMac(true); + + // Create actions + + quitAppAct = new QAction(tr("E&xit"), this); + quitAppAct->setShortcut(QKeySequence(tr("Ctrl+q"))); + quitAppAct->setStatusTip(tr("Quit SCheMatic")); + connect(quitAppAct, SIGNAL(triggered()), this, SLOT(close())); + + aboutAct = new QAction(QIcon(":/res/schematic.png"), tr("&About..."), this); + aboutAct->setStatusTip(tr("Blatant self-promotion")); + connect(aboutAct, SIGNAL(triggered()), this, SLOT(ShowAboutWin())); + +// helpAct = new QAction(QIcon(":/res/vj-icon.png"), tr("&Contents..."), this); +// helpAct->setStatusTip(tr("Help is available, if you should need it")); +// connect(helpAct, SIGNAL(triggered()), this, SLOT(ShowHelpWin())); + + // Create menus & toolbars + + QMenu * menu = menuBar()->addMenu(tr("&File")); +// fileMenu->addAction(powerAct); +// fileMenu->addAction(pauseAct); +// fileMenu->addAction(frameAdvanceAct); +// fileMenu->addAction(filePickAct); +// fileMenu->addAction(useCDAct); +// fileMenu->addAction(configAct); + menu->addAction(quitAppAct); + + menu = menuBar()->addMenu(tr("&Help")); +// menu->addAction(helpAct); + menu->addAction(aboutAct); + + QToolBar * toolbar = addToolBar(tr("Stuff")); +// toolbar->addAction(powerAct); +// toolbar->addAction(pauseAct); +// toolbar->addAction(filePickAct); +// toolbar->addAction(useCDAct); +// toolbar->addSeparator(); +// toolbar->addAction(x1Act); +// toolbar->addAction(x2Act); +// toolbar->addAction(x3Act); +// toolbar->addSeparator(); +// toolbar->addAction(ntscAct); +// toolbar->addAction(palAct); +// toolbar->addSeparator(); +// toolbar->addAction(blurAct); +// toolbar->addAction(fullScreenAct); + + // Create status bar + statusBar()->showMessage(tr("Ready")); + + ReadSettings(); + + // Finally, set up database connection + + QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL"); + db.setHostName("localhost"); + db.setDatabaseName("schematic"); + db.setUserName("scm_user"); + db.setPassword("scm_user"); + bool ok = db.open(); + +#warning "!!! NEED TO SET UP DB SETUP DIALOG IF CONNECTION FAILED !!!" + + +// printf("Database connection was %sopened successfully.\n", (ok ? "" : "NOT ")); + + // Do Login dialog + LoginDialog login; + bool done = false; + + do + { + bool accept = login.exec(); + + // Check to see if user cancelled out + if (!accept) + done = true; + else + { + // Search DB for this username/login pair + QSqlQuery query("SELECT UID FROM User WHERE Login=? AND Password=?"); + query.addBindValue(login.edit1->text()); + query.addBindValue(login.edit2->text()); + query.exec(); + + while (query.next()) + { + // We have a winner! + loggedInUID = query.value(0).toInt(); + done = true; + } + } + } + while (!done); +} + + +void MainWindow::closeEvent(QCloseEvent * event) +{ + WriteSettings(); + event->accept(); // ignore() if can't close for some reason +} + + +void MainWindow::Open(void) +{ +} + + +void MainWindow::ShowAboutWin(void) +{ + aboutWin->show(); +} + + +void MainWindow::ReadSettings(void) +{ + QSettings settings("Underground Software", "SCheMatic"); + QPoint pos = settings.value("pos", QPoint(200, 200)).toPoint(); + QSize size = settings.value("size", QSize(400, 400)).toSize(); + resize(size); + move(pos); +// pos = settings.value("charWndPos", QPoint(0, 0)).toPoint(); +// size = settings.value("charWndSize", QSize(200, 200)).toSize(); +// ((TTEdit *)qApp)->charWnd->resize(size); +// ((TTEdit *)qApp)->charWnd->move(pos); +} + + +void MainWindow::WriteSettings(void) +{ + QSettings settings("Underground Software", "SCheMatic"); + settings.setValue("pos", pos()); + settings.setValue("size", size()); +// settings.setValue("charWndPos", ((TTEdit *)qApp)->charWnd->pos()); +// settings.setValue("charWndSize", ((TTEdit *)qApp)->charWnd->size()); +} diff --git a/src/mainwin.h b/src/mainwin.h new file mode 100644 index 0000000..0f4cb24 --- /dev/null +++ b/src/mainwin.h @@ -0,0 +1,43 @@ +// +// mainwin.h: Header file +// +// by James Hammons +// (C) 2012 Underground Software +// + +#ifndef __MAINWINDOW_H__ +#define __MAINWINDOW_H__ + +#include + +class AboutWindow; + +class MainWindow: public QMainWindow +{ + // All Qt apps require this macro + Q_OBJECT + + public: + MainWindow(); + + protected: + void closeEvent(QCloseEvent * event); + + private slots: + void Open(); + void ShowAboutWin(void); + + private: + void ReadSettings(void); + void WriteSettings(void); + + AboutWindow * aboutWin; + + QAction * quitAppAct; + QAction * aboutAct; + + public: + int loggedInUID; +}; + +#endif // __MAINWINDOW_H__ -- 2.37.2