class MainWindow(QMainWindow): """docstring for MainWindowQMainWindow""" def __init__(self): super( ).__init__() self.setWindowTitle("C3 Media Database Management Systems") self.availableGraphics = [':Logo.png', ':splash.png', ':home-icon.png',':items-icon.png',':customers-icon.png',':loan-icon.png',':test-icon.png',':logout-icon.png',':quit-icon.png', ':password-icon.png'] self.icon = QIcon(QPixmap(self.availableGraphics[0])) self.setWindowIcon(self.icon) self.setFixedSize(1200,680) #Connection Attribute stores the database connection self.connection = None self.access = False #stacked layout self.stackedLayout = QStackedLayout() #Main Widget self.widget = QWidget() self.widget.setLayout(self.stackedLayout) #set central widget to the stacked layout self.setCentralWidget(self.widget) #add menubar, status and toolbars self.settings() self.createActionShortcuts() #generate widgets self.initialCentralWidget() self.loggedInWidget() self.CreateNewItemWidget() self.CreateNewCustomerWidget() self.CreateNewLoanWidget() self.CreateNewPatTestWidget() self.CreateManageItemsWidget() self.CreateManageCustomersWidget() self.CreateManageLoansLayout() self.CreateManagePatTestsLayout() #disable actions self.DisableActions() #set Qt action signals, connections and shortcuts self.connections() self.createActionShortcuts() self.setStyleSheet(maincss) def addConnectionsToWidgets(self): self.newItem.addConnection(self.connection) self.newCustomer.addConnection(self.connection) self.newLoan.addConnection(self.connection) self.newPatTest.addConnection(self.connection) self.manageItems.addConnection(self.connection) self.manageCustomers.addConnection(self.connection) self.manageLoans.addConnection(self.connection) self.managePatTests.addConnection(self.connection) def settings(self): #file actions self.open = QAction("Open Database", self) self.closeDatabaseAction = QAction("Close Database", self) self.new = QAction("New", self) self.Print = QAction("Export", self) self.ChangePasswordAction = QAction("Change Password", self) self.logoutAction = QAction("Logout", self) self.closeWindowAction = QAction("Close Window", self) #edit actions self.cut = QAction("Cut", self) self.copy = QAction("Copy", self) self.paste = QAction("Paste...", self) self.selectAll = QAction("Select All", self) #item actions self.addItemAction = QAction('Add Item', self) self.manageItemsAction = QAction('Manage Items', self) #customer actions self.addCustomerAction = QAction('Add Customer', self) self.manageCustomersAction = QAction('Manage Customers', self) #loan actions self.addLoanAction = QAction('Add Loan', self) self.manageLoansAction = QAction('Manage Loans', self) #pat_test actions self.addPatTestAction = QAction('Add Pat Test', self) self.managePatTestsAction = QAction('Manage Pat Tests', self) #Minimize window actions self.homeAction = QAction('Home', self) self.minimizeAction = QAction("Minimize", self) #help action self.help = QAction('Help', self) self.about = QAction('About', self) #menubar self.menubar = QMenuBar() #add file menu and add actions to file menu self.fileMenu = self.menubar.addMenu("File") self.fileMenu.addAction(self.open) self.fileMenu.addAction(self.new) self.fileMenu.addAction(self.Print) self.fileMenu.addSeparator() self.fileMenu.addAction(self.ChangePasswordAction) self.fileMenu.addAction(self.logoutAction) self.fileMenu.addSeparator() self.fileMenu.addAction(self.closeWindowAction) #add edit menu and add actions to edit menu self.editMenu = self.menubar.addMenu("Edit") self.editMenu.addAction(self.cut) self.editMenu.addAction(self.copy) self.editMenu.addAction(self.paste) self.editMenu.addAction(self.selectAll) self.editMenu.addSeparator() #item menu self.itemMenu = self.menubar.addMenu("Item") self.itemMenu.addAction(self.addItemAction) self.itemMenu.addAction(self.manageItemsAction) #customer menu self.customerMenu = self.menubar.addMenu("Customer") self.customerMenu.addAction(self.addCustomerAction) self.customerMenu.addAction(self.manageCustomersAction) #loan menu self.loanMenu = self.menubar.addMenu("Loan") self.loanMenu.addAction(self.addLoanAction) self.loanMenu.addAction(self.manageLoansAction) #pat test menu self.patTestMenu = self.menubar.addMenu("Pat Test") self.patTestMenu.addAction(self.addPatTestAction) self.patTestMenu.addAction(self.managePatTestsAction) #window menu self.windowMenu = self.menubar.addMenu("Window") self.windowMenu.addAction(self.homeAction) self.windowMenu.addAction(self.minimizeAction) #help menu self.helpMenu = self.menubar.addMenu("Help") self.helpMenu.addAction(self.help) self.helpMenu.addAction(self.about) #create menubar self.setMenuBar(self.menubar) #================== ToolBar ===================# #================== Widgets ===================# #home widgets self.homeTitle = QToolButton() self.homeTitle.setText(' Home') self.homeTitle.setIcon(QIcon(self.availableGraphics[2])) self.homeTitle.setIconSize(QSize(30,30)) self.homeTitle.setToolButtonStyle(2) self.homeTitle.setObjectName('homeButton') self.homeTitle.setProperty("buttonClass","leftToolBar") self.homeTitle.setCursor(QCursor(Qt.PointingHandCursor)) #home widgets self.logoutButton = QToolButton() self.logoutButton.setText(' Logout') self.logoutButton.setIcon(QIcon(self.availableGraphics[7])) self.logoutButton.setIconSize(QSize(30,30)) self.logoutButton.setToolButtonStyle(2) self.logoutButton.setProperty("buttonClass","leftToolBar") self.logoutButton.setCursor(QCursor(Qt.PointingHandCursor)) #home widgets self.changePasswordButton = QToolButton() self.changePasswordButton.setText(' Change Password') self.changePasswordButton.setIcon(QIcon(self.availableGraphics[9])) self.changePasswordButton.setIconSize(QSize(30,30)) self.changePasswordButton.setToolButtonStyle(2) self.changePasswordButton.setProperty("buttonClass","leftToolBar") self.changePasswordButton.setCursor(QCursor(Qt.PointingHandCursor)) #home widgets self.quitButton = QToolButton() self.quitButton.setText(' Quit Application') self.quitButton.setIcon(QIcon(self.availableGraphics[8])) self.quitButton.setIconSize(QSize(30,30)) self.quitButton.setToolButtonStyle(2) self.quitButton.setProperty("buttonClass","leftToolBar") self.quitButton.setCursor(QCursor(Qt.PointingHandCursor)) #item widgets self.addItemButton = QToolButton() self.addItemButton.setText(' Add Item') self.addItemButton.setIcon(QIcon(self.availableGraphics[3])) self.addItemButton.setIconSize(QSize(30,30)) self.addItemButton.setToolButtonStyle(2) self.addItemButton.setObjectName('addItem') self.addItemButton.setProperty("buttonClass","leftToolBar") self.addItemButton.setCursor(QCursor(Qt.PointingHandCursor)) self.manageItemsButton = QToolButton() self.manageItemsButton.setText(' Manage Items') self.manageItemsButton.setIcon(QIcon(self.availableGraphics[3])) self.manageItemsButton.setIconSize(QSize(30,30)) self.manageItemsButton.setToolButtonStyle(2) self.manageItemsButton.setObjectName('manageItem') self.manageItemsButton.setProperty("buttonClass","leftToolBar") self.manageItemsButton.setCursor(QCursor(Qt.PointingHandCursor)) #customer widgets self.addCustomerButton = QToolButton() self.addCustomerButton.setText(' Add Customer') self.addCustomerButton.setIcon(QIcon(self.availableGraphics[4])) self.addCustomerButton.setIconSize(QSize(30,30)) self.addCustomerButton.setToolButtonStyle(2) self.addCustomerButton.setObjectName('addCust') self.addCustomerButton.setProperty("buttonClass","leftToolBar") self.addCustomerButton.setCursor(QCursor(Qt.PointingHandCursor)) self.manageCustomersButton = QToolButton() self.manageCustomersButton.setText(' Manage Customers') self.manageCustomersButton.setIcon(QIcon(self.availableGraphics[4])) self.manageCustomersButton.setIconSize(QSize(30,30)) self.manageCustomersButton.setToolButtonStyle(2) self.manageCustomersButton.setObjectName('manageCust') self.manageCustomersButton.setProperty("buttonClass","leftToolBar") self.manageCustomersButton.setCursor(QCursor(Qt.PointingHandCursor)) #loan widgets self.addLoanButton = QToolButton() self.addLoanButton.setText(' Add Loan') self.addLoanButton.setIcon(QIcon(self.availableGraphics[5])) self.addLoanButton.setIconSize(QSize(30,30)) self.addLoanButton.setToolButtonStyle(2) self.addLoanButton.setObjectName('addLoan') self.addLoanButton.setProperty("buttonClass","leftToolBar") self.addLoanButton.setCursor(QCursor(Qt.PointingHandCursor)) self.manageLoansButton = QToolButton() self.manageLoansButton.setText(' Manage Loans') self.manageLoansButton.setIcon(QIcon(self.availableGraphics[5])) self.manageLoansButton.setIconSize(QSize(30,30)) self.manageLoansButton.setToolButtonStyle(2) self.manageLoansButton.setObjectName('manageLoan') self.manageLoansButton.setProperty("buttonClass","leftToolBar") self.manageLoansButton.setCursor(QCursor(Qt.PointingHandCursor)) #test widgets self.addPatTestButton = QToolButton() self.addPatTestButton.setText(' Add Pat-Test') self.addPatTestButton.setIcon(QIcon(self.availableGraphics[6])) self.addPatTestButton.setIconSize(QSize(30,30)) self.addPatTestButton.setToolButtonStyle(2) self.addPatTestButton.setObjectName('addTest') self.addPatTestButton.setProperty("buttonClass","leftToolBar") self.addPatTestButton.setCursor(QCursor(Qt.PointingHandCursor)) self.managePatTestsButton = QToolButton() self.managePatTestsButton.setText(' Manage Pat-Tests') self.managePatTestsButton.setIcon(QIcon(self.availableGraphics[6])) self.managePatTestsButton.setIconSize(QSize(30,30)) self.managePatTestsButton.setToolButtonStyle(2) self.managePatTestsButton.setObjectName('manageTest') self.managePatTestsButton.setProperty("buttonClass","leftToolBar") self.managePatTestsButton.setCursor(QCursor(Qt.PointingHandCursor)) #tool bar self.leftToolBar = QToolBar() self.leftToolBar.setObjectName('left') self.leftToolBar.setMovable(False) self.addToolBar(Qt.LeftToolBarArea, self.leftToolBar) self.spacerWidget = QWidget() self.spacerWidget.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) self.leftToolBar.addWidget(self.homeTitle) self.leftToolBar.addWidget(self.addItemButton) self.leftToolBar.addWidget(self.manageItemsButton) self.leftToolBar.addWidget(self.addCustomerButton) self.leftToolBar.addWidget(self.manageCustomersButton) self.leftToolBar.addWidget(self.addLoanButton) self.leftToolBar.addWidget(self.manageLoansButton) self.leftToolBar.addWidget(self.addPatTestButton) self.leftToolBar.addWidget(self.managePatTestsButton) self.leftToolBar.addWidget(self.spacerWidget) self.leftToolBar.addWidget(self.logoutButton) self.leftToolBar.addWidget(self.changePasswordButton) self.leftToolBar.addWidget(self.quitButton) self.statusBar = QStatusBar() self.setStatusBar(self.statusBar) def collapseApp(self): self.showMinimized() def createActionShortcuts(self): #file menu shortcuts self.open.setShortcut('Ctrl+O') self.new.setShortcut('Ctrl+N') self.Print.setShortcut('Ctrl+P') self.logoutAction.setShortcut('Ctrl+Shift+L') self.closeWindowAction.setShortcut('Ctrl+W') #edit menu shortcuts self.cut.setShortcut('Ctrl+X') self.copy.setShortcut('Ctrl+C') self.paste.setShortcut('Ctrl+V') self.selectAll.setShortcut('Ctrl+A') #window shortcuts self.homeAction.setShortcut('Ctrl+Shift+H') self.minimizeAction.setShortcut('Ctrl+M') def connections(self): #menubar connections self.open.triggered.connect(self.openDatabase) self.new.triggered.connect(self.SelectNewRecordTableDialog) self.ChangePasswordAction.triggered.connect(self.changePasswordDialog) self.closeWindowAction.triggered.connect(self.close) self.minimizeAction.triggered.connect(self.collapseApp) self.homeAction.triggered.connect(self.switchToMainMenu) #toolbar actions self.homeTitle.clicked.connect(self.switchToMainMenu) self.addItemButton.clicked.connect(self.switchToNewItem) self.addCustomerButton.clicked.connect(self.switchToNewCustomer) self.addLoanButton.clicked.connect(self.switchToNewLoan) self.addPatTestButton.clicked.connect(self.switchToNewPatTest) self.manageItemsButton.clicked.connect(self.switchToManageItems) self.manageCustomersButton.clicked.connect(self.switchToManageCustomers) self.manageLoansButton.clicked.connect(self.switchToManageLoans) self.managePatTestsButton.clicked.connect(self.switchToManagePatTests) self.logoutButton.clicked.connect(self.closeDatabase) self.changePasswordButton.clicked.connect(self.changePasswordDialog) self.quitButton.clicked.connect(self.close) #button connections self.openDatabaseButton.clicked.connect(self.openDatabase) self.closeAppButton.clicked.connect(self.close) self.newItem.cancelButton.clicked.connect(self.switchToMainMenu) self.newCustomer.cancelButton.clicked.connect(self.switchToMainMenu) self.newLoan.cancelButton.clicked.connect(self.switchToMainMenu) self.newPatTest.cancelButton.clicked.connect(self.switchToMainMenu) #login connections self.logoutAction.triggered.connect(self.closeDatabase) def DisableActions(self): #file actions self.open.setEnabled(True) self.new.setEnabled(False) self.Print.setEnabled(False) self.ChangePasswordAction.setEnabled(False) self.logoutAction.setEnabled(False) #edit actions self.cut.setEnabled(False) self.copy.setEnabled(False) self.paste.setEnabled(False) self.selectAll.setEnabled(False) #item actions self.addItemAction.setEnabled(False) self.manageItemsAction.setEnabled(False) #customer actions self.addCustomerAction.setEnabled(False) self.manageCustomersAction.setEnabled(False) #loan actions self.addLoanAction.setEnabled(False) self.manageLoansAction.setEnabled(False) #pat_test actions self.addPatTestAction.setEnabled(False) self.managePatTestsAction.setEnabled(False) #window actions self.homeAction.setEnabled(True) #help actions self.help.setEnabled(False) self.about.setEnabled(True) #database actions self.open.setEnabled(True) self.closeDatabaseAction.setEnabled(False) #ToolBar Acions self.homeTitle.setEnabled(False) self.addItemButton.setEnabled(False) self.manageItemsButton.setEnabled(False) self.addCustomerButton.setEnabled(False) self.manageCustomersButton.setEnabled(False) self.addLoanButton.setEnabled(False) self.manageLoansButton.setEnabled(False) self.addPatTestButton.setEnabled(False) self.managePatTestsButton.setEnabled(False) self.logoutButton.setEnabled(False) self.changePasswordButton.setEnabled(False) self.quitButton.setEnabled(True) def enableActions(self): #file actions self.open.setEnabled(True) self.new.setEnabled(True) self.ChangePasswordAction.setEnabled(True) self.logoutAction.setEnabled(True) #edit actions self.cut.setEnabled(True) self.copy.setEnabled(True) self.paste.setEnabled(True) self.selectAll.setEnabled(True) #item actions self.addItemAction.setEnabled(True) self.manageItemsAction.setEnabled(True) #customer actions self.addCustomerAction.setEnabled(True) self.manageCustomersAction.setEnabled(True) #loan actions self.addLoanAction.setEnabled(True) self.manageLoansAction.setEnabled(True) #pat_test actions self.addPatTestAction.setEnabled(True) self.managePatTestsAction.setEnabled(True) #window actions self.homeAction.setEnabled(True) #help actions self.help.setEnabled(True) self.about.setEnabled(True) #database actions self.open.setEnabled(False) self.closeDatabaseAction.setEnabled(True) #add connection to widgets self.addConnectionsToWidgets() #toolbar actions self.homeTitle.setEnabled(True) self.addItemButton.setEnabled(True) self.manageItemsButton.setEnabled(True) self.addCustomerButton.setEnabled(True) self.manageCustomersButton.setEnabled(True) self.addLoanButton.setEnabled(True) self.manageLoansButton.setEnabled(True) self.addPatTestButton.setEnabled(True) self.managePatTestsButton.setEnabled(True) self.logoutButton.setEnabled(True) self.changePasswordButton.setEnabled(True) self.quitButton.setEnabled(True) def openDatabase(self): if self.connection: self.closeDatabase() path = "C3_media_database.db" self.connection = SQLConnection(path) opened = self.connection.openDatabase() if opened: self.password = self.connection.getPassword() self.databaseLogin() self.connection.referentialIntegrity() self.statusBar.showMessage("Connected to Database: {0}".format(path)) time.sleep(2) self.statusBar.showMessage("") def closeDatabase(self): if self.connection: closed = self.connection.closeDatabase() if closed: self.statusBar.showMessage("Database has been closed.") self.DisableActions() self.stackedLayout.setCurrentIndex(0) self.access = False else: self.statusBar.showMessage("An error occured!") else: self.statusBar.showMessage("No Database to close.") def SelectNewRecordTableDialog(self): self.selectTableDialogBox = RadioButtonWidget("Please Select a Table", ("Item", "Customer", "Loan", "PAT-Test"), self) self.selectTableDialogBox.exec_() def initialCentralWidget(self): self.openDatabaseButton = QPushButton("Open Database") self.openDatabaseButton.setMaximumWidth(200) self.openDatabaseButton.setProperty("buttonClass","home") self.openDatabaseButton.setCursor(QCursor(Qt.PointingHandCursor)) self.closeAppButton = QPushButton("Close Application") self.closeAppButton.setMaximumWidth(200) self.closeAppButton.setProperty("buttonClass","home") self.closeAppButton.setCursor(QCursor(Qt.PointingHandCursor)) self.databaseLayout = QVBoxLayout() self.databaseLayout.addWidget(self.openDatabaseButton,Qt.AlignCenter) self.databaseLayout.addWidget(self.closeAppButton,Qt.AlignCenter) self.databaseLayout.setAlignment(Qt.AlignHCenter) self.databaseWidget = QWidget() self.databaseWidget.setLayout(self.databaseLayout) self.stackedLayout.addWidget(self.databaseWidget) def loggedInWidget(self): self.mainMenu = MainMenuWidget(self) self.mainMenu.setLayout(self.mainMenu.mainLayout) self.stackedLayout.addWidget(self.mainMenu) def switchToMainMenu(self): self.stackedLayout.setCurrentIndex(1) self.setStyleSheet(atMain) def switchToNewItem(self): if hasattr(self, 'newItem'): self.newItem.clearForm() self.stackedLayout.setCurrentIndex(2) self.setStyleSheet(addItemPressed) def switchToNewCustomer(self): if hasattr(self, 'newCustomer'): self.newCustomer.clearForm() self.stackedLayout.setCurrentIndex(3) self.setStyleSheet(addCustomerPressed) def switchToNewLoan(self): if hasattr(self, 'newLoan'): self.newLoan.clearForm() self.stackedLayout.setCurrentIndex(4) self.setStyleSheet(addLoanPressed) def switchToNewPatTest(self): if hasattr(self, 'newPatTest'): self.newPatTest.clearForm() self.stackedLayout.setCurrentIndex(5) self.setStyleSheet(addTestPressed) def switchToManageItems(self): if hasattr(self, 'manageItems'): self.manageItems.clearForm() self.stackedLayout.setCurrentIndex(6) self.setStyleSheet(manageItemPressed) def switchToManageCustomers(self): if hasattr(self, 'manageCustomers'): self.manageCustomers.clearForm() self.stackedLayout.setCurrentIndex(7) self.setStyleSheet(manageCustomerPressed) def switchToManageLoans(self): if hasattr(self, 'manageLoans'): self.manageLoans.showAllLoansInTable() self.manageLoans.leftWidget.setEnabled(True) self.manageLoans.rightWidget.setEnabled(False) self.stackedLayout.setCurrentIndex(8) self.setStyleSheet(manageLoanPressed) def switchToManagePatTests(self): if hasattr(self, 'managePatTests'): self.managePatTests.showAllPatTestsInTable() self.managePatTests.showAllItemsInTable() self.stackedLayout.setCurrentIndex(9) self.setStyleSheet(manageTestPressed) def CreateNewItemWidget(self): self.newItem = NewItemWidget(self) self.stackedLayout.addWidget(self.newItem) def CreateNewCustomerWidget(self): self.newCustomer = NewCustomerWidget(self) self.stackedLayout.addWidget(self.newCustomer) def CreateNewLoanWidget(self): self.newLoan = NewLoanWidget(self) self.stackedLayout.addWidget(self.newLoan) def CreateNewPatTestWidget(self): self.newPatTest = NewPatTestWidget(self) self.stackedLayout.addWidget(self.newPatTest) def CreateManageItemsWidget(self): self.manageItems = ManageItemsWidget(self) self.stackedLayout.addWidget(self.manageItems) def CreateManageCustomersWidget(self): self.manageCustomers = ManageCustomersWidget(self) self.stackedLayout.addWidget(self.manageCustomers) def CreateManageLoansLayout(self): self.manageLoans = ManageLoansWidget(self) self.stackedLayout.addWidget(self.manageLoans) def CreateManagePatTestsLayout(self): self.managePatTests = ManagePatTestsWidget(self) self.stackedLayout.addWidget(self.managePatTests) def showAboutMessageBox(self): aboutText = """This application was built by Joel Butcher using Python3, PyQt4 and uses Sqlite3. \n It is design for use by the media department of Cambridge Community Church \n to enable the organisation of the equipment owned by the department """ QMessageBox.about(self, "About", aboutText) def createLoginDialog(self): self.loginDialog = LoginDialog(self) self.loginDialog.exec_() def changePasswordDialog(self): self.changePasswordWindow = ChangePasswordDialog(self,self.password) self.changePasswordWindow.addConnection(self.connection) self.changePasswordWindow.exec_() def databaseLogin(self): self.createLoginDialog() password = self.loginDialog.password_entry.text() if password == self.password: self.access = True self.enableActions() self.switchToMainMenu() else: self.login_error_dialog = LoginErrorDialog() self.login_error_dialog.exec_() self.access = False def closeEvent(self, event): self.stackedLayout.setCurrentIndex(1) if self.access == False: self.closeDatabase() def closeEvent(self, event): self.closeDatabase()