# -*- coding: utf-8 -*- # Roastero, released under GPLv3 import os import json import shutil import openroast from PyQt5 import QtGui from PyQt5 import QtCore from PyQt5 import QtWidgets from openroast.views import roasttab from openroast.views import recipestab from openroast.views import aboutwindow from openroast.version import __version__ class MainWindow(QtWidgets.QMainWindow): def __init__(self, recipes, roaster): super(MainWindow, self).__init__() # Define main window for the application. self.setWindowTitle('Openroast v%s' % __version__) self.setMinimumSize(800, 600) self.setContextMenuPolicy(QtCore.Qt.NoContextMenu) # keep a copy of roaster & recipes, needed here self.roaster = roaster self.recipes = recipes # Create toolbar. self.create_toolbar() # Create tabs. self.create_tabs(self.roaster, recipes) # Create menu. self.create_actions() self.create_menus() def create_actions(self): # File menu actions. self.clearRoastAct = QtWidgets.QAction( "&Clear", self, shortcut=QtGui.QKeySequence( QtCore.Qt.CTRL + QtCore.Qt.SHIFT + QtCore.Qt.Key_C), statusTip="Clear the roast window", triggered=self.roast.clear_roast) self.newRoastAct = QtWidgets.QAction("&Roast Again", self, shortcut=QtGui.QKeySequence(QtCore.Qt.CTRL + QtCore.Qt.Key_R), statusTip="Roast recipe again", triggered=self.roast.reset_current_roast) self.importRecipeAct = QtWidgets.QAction("&Import Recipe", self, shortcut=QtGui.QKeySequence(QtCore.Qt.CTRL + QtCore.Qt.Key_I), statusTip="Import a recipe file", triggered=self.import_recipe_file) self.exportRecipeAct = QtWidgets.QAction("&Export Recipe", self, shortcut=QtGui.QKeySequence(QtCore.Qt.CTRL + QtCore.Qt.Key_E), statusTip="Export a recipe file", triggered=self.export_recipe_file) self.saveRoastGraphAct = QtWidgets.QAction("&Save Roast Graph", self, shortcut=QtGui.QKeySequence(QtCore.Qt.CTRL + QtCore.Qt.Key_K), statusTip="Save an image of the roast graph", triggered=self.roast.save_roast_graph) self.saveRoastGraphCSVAct = QtWidgets.QAction("&Save Roast Graph CSV", self, statusTip="Save the roast graph as a csv", triggered=self.roast.save_roast_graph_csv) self.openAboutWindow = QtWidgets.QAction("&About", self, statusTip="About openroast", triggered=self.open_about_window) def create_menus(self): menubar = self.menuBar() # Create file menu. self.fileMenu = menubar.addMenu("&File") self.fileMenu.addAction(self.clearRoastAct) self.fileMenu.addAction(self.newRoastAct) self.fileMenu.addSeparator() self.fileMenu.addAction(self.importRecipeAct) self.fileMenu.addAction(self.exportRecipeAct) self.fileMenu.addSeparator() self.fileMenu.addAction(self.saveRoastGraphAct) self.fileMenu.addAction(self.saveRoastGraphCSVAct) self.fileMenu.addSeparator() # Create help menu. self.helpMenu = menubar.addMenu("&Help") self.helpMenu.addAction(self.openAboutWindow) def create_toolbar(self): # Create toolbar. self.mainToolBar = self.addToolBar('mainToolBar') self.mainToolBar.setMovable(False) self.mainToolBar.setFloatable(False) # Add logo. self.logo = QtWidgets.QLabel("openroast") self.logo.setObjectName("logo") self.mainToolBar.addWidget(self.logo) # Add roasting tab button. self.roastTabButton = QtWidgets.QPushButton("ROAST", self) self.roastTabButton.setObjectName("toolbar") self.roastTabButton.clicked.connect(self.select_roast_tab) self.mainToolBar.addWidget(self.roastTabButton) # Add recipes tab button. self.recipesTabButton = QtWidgets.QPushButton("RECIPES", self) self.recipesTabButton.setObjectName("toolbar") self.recipesTabButton.clicked.connect(self.select_recipes_tab) self.mainToolBar.addWidget(self.recipesTabButton) # Add spacer to set login button on the right. self.spacer = QtWidgets.QWidget() self.spacer.setSizePolicy( QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding) self.mainToolBar.addWidget(self.spacer) # Add buttons to array to be disabled on selection. self.tabButtons = [self.roastTabButton, self.recipesTabButton] def create_tabs(self, roaster, recipes): self.tabs = QtWidgets.QStackedWidget() # Create widgets to add to tabs. self.roast = roasttab.RoastTab( roaster, recipes) self.recipes = recipestab.RecipesTab( roastTabObject=self.roast, MainWindowObject=self, recipes_object=self.recipes) # Add widgets to tabs. self.tabs.insertWidget(0, self.roast) self.tabs.insertWidget(1, self.recipes) # Set the tabs as the central widget. self.setCentralWidget(self.tabs) # Set the roast button disabled. self.roastTabButton.setEnabled(False) def select_roast_tab(self): self.tabs.setCurrentIndex(0) self.change_blocked_button(0) def select_recipes_tab(self): self.tabs.setCurrentIndex(1) self.change_blocked_button(1) def change_blocked_button(self, index): # Set all buttons enabled. for button in self.tabButtons: button.setEnabled(True) # Set selected button disabled. self.tabButtons[index].setEnabled(False) def import_recipe_file(self): try: recipeFile = QtWidgets.QFileDialog.getOpenFileName(self, 'Select Recipe', os.path.expanduser('~/'), 'Recipes (*.json);;All Files (*)') shutil.copy2(recipeFile[0], os.path.expanduser('~/Documents/Openroast/Recipes/My Recipes/')) except FileNotFoundError: # Occurs if file browser is canceled pass else: pass def export_recipe_file(self): try: recipeFile = QtWidgets.QFileDialog.getSaveFileName(self, 'Export Recipe', os.path.expanduser('~/'), 'Recipes (*.json);;All Files (*)') jsonObject = json.dumps( self.recipes.currentlySelectedRecipe, indent=4) file = open(recipeFile[0], 'w') file.write(jsonObject) file.close() except FileNotFoundError: # Occurs if file browser is canceled pass else: pass def open_about_window(self): self.aboutWindow = aboutwindow.About() self.aboutWindow.exec_() def closeEvent(self, event): self.roaster.disconnect()