diff --git a/plot_canvas.py b/code_samples/plot_canvas.py similarity index 100% rename from plot_canvas.py rename to code_samples/plot_canvas.py diff --git a/tab.py b/code_samples/tab.py similarity index 100% rename from tab.py rename to code_samples/tab.py diff --git a/test_a_widget.py b/code_samples/test_a_widget.py similarity index 100% rename from test_a_widget.py rename to code_samples/test_a_widget.py diff --git a/window.py b/code_samples/window.py similarity index 97% rename from window.py rename to code_samples/window.py index 2a9f6ac..1d3d6a7 100644 --- a/window.py +++ b/code_samples/window.py @@ -1,7 +1,7 @@ import sys -from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QMainWindow, QGridLayout, QLabel, QSpacerItem, QSizePolicy, QComboBox, QFileDialog -from plot_canvas import PlotCanvas +from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QMainWindow, QGridLayout, QLabel, QComboBox, QFileDialog +from code_samples.plot_canvas import PlotCanvas class Window(QMainWindow): ''' diff --git a/minor_widgets.py b/minor_widgets.py deleted file mode 100644 index dd8ebe1..0000000 --- a/minor_widgets.py +++ /dev/null @@ -1,2 +0,0 @@ -'''''' -from PyQt5.QtWidgets import QWidget \ No newline at end of file diff --git a/oneDimView.py b/oneDimView.py deleted file mode 100644 index e339206..0000000 --- a/oneDimView.py +++ /dev/null @@ -1,147 +0,0 @@ -from PyQt5.QtWidgets import QPlainTextEdit, QHBoxLayout, QWidget, QGridLayout, QLabel, QPushButton, QTableWidget, QTableWidgetItem -from tools import Tools - -class OneDimView(QWidget): - - - def __init__(self): - ''' Widget containing the entire 2D Mode view. ''' - super().__init__() - - self.grid = QGridLayout() - - self.setLayout(self.grid) - - - self.define_widgets() - self.set_widget_actions() - - - - def define_widgets(self): - ''' Define widgets such as buttons. This must be done before setting widget actions. - Otherwise a widget action might try to modify a widget that is not defined yet.''' - - # add empty label as spacer after buttons - # this has some side effects (i suspect) : - # + when adding the Buttons20, we really mean for it to span from grid position (3,1) to (3,2) - # but to create the correct visual effect it must span also over the invisible spacder column, - # Thus from (3,1) to (3,3). - self.grid.addWidget(QLabel(), 10,10) - self.loadDataButton = QPushButton() - self.loadDataButton.setText("Load Data File") - self.loadDataButton.setMaximumWidth(200) - self.grid.addWidget(self.loadDataButton, 0, 0) - - - self.one_d_text = OneDText() - self.grid.addWidget(self.one_d_text, 1,0) - - - self.one_d_table = OneDTable() - self.grid.addWidget(self.one_d_table,0,1, 4,1) - - - self.one_d_visualize = OneDVisualize() - self.grid.addWidget(self.one_d_visualize,0,2,2,2) - - self.buttons20 = Buttons20() - self.grid.addWidget(self.buttons20, 2,0) - - self.buttons30 = Buttons30() - self.grid.addWidget(self.buttons30, 3,0) - - self.buttons32 = Buttons32() - self.grid.addWidget(self.buttons32,3,2) - - def set_widget_actions(self): - - self.dataFile = self.loadDataButton.clicked.connect(lambda: Tools().open_file(self)) - pass - - - - -class OneDText(QPlainTextEdit): - def __init__(self): - super().__init__() - self.setMinimumSize(200,200) - self.setPlainText("List of Files:\n+ File 1\n+ File 2") - - - -class OneDTable(QTableWidget): - def __init__(self): - super().__init__() - - self.setSortingEnabled(True) - - self.setRowCount(4) - self.setColumnCount(4) - - self.setMinimumSize(300,200) - - self.setHorizontalHeaderLabels({'h', 'k', 'l'}) - - - - - - - -class Buttons20(QWidget): - - def __init__(self): - super().__init__() - self.hbox = QHBoxLayout() - self.setLayout(self.hbox) - self.searchButton = QPushButton('Search') - self.addButton = QPushButton('Add') - self.substractButton = QPushButton('Substract') - self.hbox.addWidget(self.searchButton) - self.hbox.addWidget(self.addButton) - self.hbox.addWidget(self.substractButton) - - - - -class Buttons30(QWidget): - def __init__(self): - super().__init__() - self.hbox = QHBoxLayout() - self.setLayout(self.hbox) - - - self.integrateButton = QPushButton('Integrate') - self.lorentzButton = QPushButton('Lorentz') - self.absorptionButton = QPushButton('Absorption') - - self.hbox.addWidget(self.integrateButton) - self.hbox.addWidget(self.lorentzButton) - self.hbox.addWidget(self.absorptionButton) - - - -class Buttons32(QWidget): - def __init__(self): - ''' Named after its position in the containing grid: row 3, column 2.''' - super().__init__() - self.grid= QGridLayout() - self.setLayout(self.grid) - self.saveButton = QPushButton('Save') - self.grid.addWidget(self.saveButton,0,0) - self.visualizeButton = QPushButton('Visualize in 2D') - self.grid.addWidget(self.visualizeButton, 0,1) - - - -class OneDVisualize(QPlainTextEdit): - def __init__(self): - super().__init__() - self.setMinimumSize(200,200) - self.setPlainText('Placeholder\nfor OneDVisualize().') - - - - - diff --git a/one_d_view.py b/one_d_view.py new file mode 100644 index 0000000..ff9a3a4 --- /dev/null +++ b/one_d_view.py @@ -0,0 +1,126 @@ +from PyQt5.QtWidgets import QPlainTextEdit, QHBoxLayout, QWidget, QGridLayout, QLabel, QPushButton + +from tools import Tools, View, Text, Table + + +class OneDimView(QWidget): + + + def __init__(self): + """ Widget containing the entire 2D Mode view. """ + super().__init__() + + # ---------------------------------------------------------------------- + # PREPARE + # ---------------------------------------------------------------------- + + self.grid = QGridLayout() + self.setLayout(self.grid) + + # Tools.View() groups Widgets for ease of use. + self.one = View() + + # Define Files so IDE does not issue warnings (self. variables should be defined in __init__). + self.dataFile = None + + # ---------------------------------------------------------------------- + # DEFINE WIDGETS + # ---------------------------------------------------------------------- + + # Add empty label as spacer after buttons.I suspect this has a side effect. + # When adding Buttons20, we mean for them to span from grid position (3,1) to (3,2). + # However to mainreate the mainorrect visual effect they must also mainover the invisible spacer mainolumn. + # Thus we set them to span from grid position (3,1) to (3,3). + self.grid.addWidget(QLabel(), 10, 10) + + # + self.one.loadDataButton = QPushButton("Load Data File") + self.one.loadDataButton.setMaximumWidth(200) + self.grid.addWidget(self.one.loadDataButton, 0, 0) + + self.one.text = Text("List of Files:\n+ File 1\n+ File 2") + self.grid.addWidget(self.one.text, 1, 0) + + self.one.table = Table() + self.grid.addWidget(self.one.table, 0, 1, 4, 1) + + self.one.visualize = OneVisualize() + self.grid.addWidget(self.one.visualize, 0, 2, 2, 2) + + self.one.buttons20 = Buttons20(self) + self.grid.addWidget(self.one.buttons20, 2, 0) + + self.one.buttons30 = Buttons30(self) + self.grid.addWidget(self.one.buttons30, 3, 0) + + self.one.buttons32 = Buttons32(self) + self.grid.addWidget(self.one.buttons32, 3, 2) + + # ---------------------------------------------------------------------- + # SET WIDGET ACTIONS + # ---------------------------------------------------------------------- + + self.dataFile = self.one.loadDataButton.clicked.connect(lambda: Tools().open_file(self)) + + # ---------------------------------------------------------------------- + # FINISH + # ---------------------------------------------------------------------- + + pass + + +class Buttons20(QWidget): + + def __init__(self, main): + super().__init__() + hbox = QHBoxLayout() + self.setLayout(hbox) + + main.one.searchButton = QPushButton('Search') + hbox.addWidget(main.one.searchButton) + + main.one.addButton = QPushButton('Add') + hbox.addWidget(main.one.addButton) + + main.one.substractButton = QPushButton('Substract') + hbox.addWidget(main.one.substractButton) + + +class Buttons30(QWidget): + + def __init__(self, main): + super().__init__() + hbox = QHBoxLayout() + self.setLayout(hbox) + + main.one.integrateButton = QPushButton('Integrate') + hbox.addWidget(main.one.integrateButton) + + main.one.lorentzButton = QPushButton('Lorentz') + hbox.addWidget(main.one.lorentzButton) + + main.one.absorptionButton = QPushButton('Absorption') + hbox.addWidget(main.one.absorptionButton) + + +class Buttons32(QWidget): + """ Named after its position in the containing grid: row 3, column 2.""" + + def __init__(self, main): + super().__init__() + grid = QGridLayout() + self.setLayout(grid) + + main.one.saveButton = QPushButton('Save') + grid.addWidget(main.one.saveButton, 0, 0) + + main.one.visualizeButton = QPushButton('Visualize in 2D') + grid.addWidget(main.one.visualizeButton, 0, 1) + + +class OneVisualize(QPlainTextEdit): + + def __init__(self): + super().__init__() + self.setMinimumSize(200, 200) + self.setPlainText('Placeholder\nfor the 1D Visualization.') diff --git a/prepareView.py b/prepare_view.py similarity index 77% rename from prepareView.py rename to prepare_view.py index c3b2643..ee75631 100644 --- a/prepareView.py +++ b/prepare_view.py @@ -9,8 +9,12 @@ class PrepareView(QWidget): """ Widget mainontaining the entire Zebra Mode view. """ super().__init__() - self.grid = QGridLayout() - self.setLayout(self.grid) + # ---------------------------------------------------------------------- + # PREPARE + # ---------------------------------------------------------------------- + + grid = QGridLayout() + self.setLayout(grid) # Tools.View()s group Widgets for ease of use. self.base = View() @@ -21,64 +25,63 @@ class PrepareView(QWidget): self.crystalFile = None self.instrumentFile = None - # Define widgets. - self.define_widgets() - self.set_widget_actions() - - # Start by showing the base view. - self.show_view() - - - def define_widgets(self): - """ - Define widgets, such as buttons. This must be done before setting widget actions. - Otherwise a widget action might try to modify a widget that is not defined yet. - """ + # ---------------------------------------------------------------------- + # DEFINE WIDGETS + # ---------------------------------------------------------------------- # Add empty label as spacer after buttons.I suspect this has a side effect. # When adding Buttons20, we mean for them to span from grid position (3,1) to (3,2). # However to mainreate the mainorrect visual effect they must also mainover the invisible spacer mainolumn. # Thus we set them to span from grid position (3,1) to (3,3). - self.grid.addWidget(QLabel(), 10, 10) + grid.addWidget(QLabel(), 10, 10) # Base Items (Left mainolumn, always shown) self.base.table = Table() - self.grid.addWidget(self.base.table, 0, 1) + grid.addWidget(self.base.table, 0, 1) self.base.buttons00 = BaseButtons00(self) - self.grid.addWidget(self.base.buttons00, 0, 0) + grid.addWidget(self.base.buttons00, 0, 0) # Zebra Nuc View self.nuc.table = Table() - self.grid.addWidget(self.nuc.table, 0, 1) + grid.addWidget(self.nuc.table, 0, 1) self.nuc.buttons11 = NucButtons11(self) - self.grid.addWidget(self.nuc.buttons11, 1, 1) + grid.addWidget(self.nuc.buttons11, 1, 1) # Zebra Mag View self.mag.table = Table() - self.grid.addWidget(self.mag.table, 0, 1) + grid.addWidget(self.mag.table, 0, 1) self.mag.buttons11 = MagButtons11(self) - self.grid.addWidget(self.mag.buttons11, 1, 1) + grid.addWidget(self.mag.buttons11, 1, 1) self.mag.visual = Text("List of Files:\n+ File 1\n+ File 2") - self.grid.addWidget(self.mag.visual, 0, 2) + grid.addWidget(self.mag.visual, 0, 2) self.mag.buttons12 = MagButtons12(self) - self.grid.addWidget(self.mag.buttons12, 1, 2) + grid.addWidget(self.mag.buttons12, 1, 2) + # ---------------------------------------------------------------------- + # SET WIDGET ACTIONS + # ---------------------------------------------------------------------- - def set_widget_actions(self): self.crystalFile = self.loadCrystalFileButton.clicked.connect(lambda: Tools().open_file(self)) self.instrumentFile = self.loadInstrumentFileButton.clicked.connect(lambda: Tools().open_file(self)) self.sectorNucButton.clicked.connect(lambda: self.show_view('nuc')) self.sectorMagButton.clicked.connect(lambda: self.show_view('mag')) + # ---------------------------------------------------------------------- + # FINISH + # ---------------------------------------------------------------------- + + # Show the base view. + self.show_view() + def show_view(self, view = None): """ Will hide everything if mainalled with anything besides nuc or mag.""" @@ -95,6 +98,9 @@ class PrepareView(QWidget): self.base.table.setHidden(True) self.mag.show() + else: + pass + class BaseButtons00(QWidget): diff --git a/tools.py b/tools.py index 3abfbce..3bc3333 100644 --- a/tools.py +++ b/tools.py @@ -14,8 +14,8 @@ class Tools(): def open_file(self, container): - ''' Corresponds to 1.2 - TODO Right now this is just copy&pasted. Clean this up.''' + """ Corresponds to 1.2 + TODO Right now this is just copy&pasted. Clean this up.""" options = QFileDialog.Options() options |= QFileDialog.DontUseNativeDialog fileName, _ = QFileDialog.getOpenFileName(container,"QFileDialog.getOpenFileName()", "","All Files (*);;Python Files (*.py)", options=options) @@ -53,18 +53,24 @@ class Text(QPlainTextEdit): class View(): + """ Groups Widgets for ease of use.""" + def __init__(self): + """ + Do not define self. variables here. + The idea behind this class is to work with the vars() method. + """ pass def show(self): - ''' Show widgets. ''' + """ Show widgets. """ #TODO filter this, so that it applies to QWidgets only. for widget in vars(self): vars(self)[widget].setHidden(False) def hide(self): - ''' Hide widgets. ''' + """ Hide widgets. """ for widget in vars(self): vars(self)[widget].setHidden(True) diff --git a/twoDimView.py b/twoDimView.py deleted file mode 100644 index fdcd12e..0000000 --- a/twoDimView.py +++ /dev/null @@ -1,156 +0,0 @@ - -from PyQt5.QtWidgets import QWidget, QGridLayout, QComboBox, QLabel, QPushButton, QAction, QHBoxLayout, QTabWidget, QTableWidget, QPlainTextEdit -from tools import Tools - -class TwoDimView(QWidget): - - - - - - - - - - - def __init__(self): - ''' Widget containing the entire Zebra Mode view. ''' - super().__init__() - - self.grid = QGridLayout() - - self.setLayout(self.grid) - - - self.define_widgets() - self.set_widget_actions() - - - - - def define_widgets(self): - ''' Define widgets such as buttons. This must be done before setting widget actions. - Otherwise a widget action might try to modify a widget that is not defined yet.''' - - # add empty label as spacer after buttons - # this has some side effects (i suspect) : - # + when adding the Buttons12, we really mean for it to span from grid position (3,1) to (3,2) - # but to create the correct visual effect it must span also over the invisible spacder column, - # Thus from (3,1) to (3,3). - self.grid.addWidget(QLabel(), 10,10) - self.loadDataButton = QPushButton() - self.loadDataButton.setText("Load Data File") - self.loadDataButton.setMaximumWidth(200) - self.grid.addWidget(self.loadDataButton, 1, 0) - - - self.one_d_text = OneDText() - self.grid.addWidget(self.one_d_text, 0,0) - - - self.one_d_table = OneDTable() - self.grid.addWidget(self.one_d_table,0,1) - - self.one_d_visualize = OneDVisualize() - self.grid.addWidget(self.one_d_visualize,0,2) - - - - - - self.buttons11 = Buttons11() - self.grid.addWidget(self.buttons11, 1,1) - - self.buttons12 = Buttons12() - self.grid.addWidget(self.buttons12, 1,2) - - - def set_widget_actions(self): - - self.dataFile = self.loadDataButton.clicked.connect(lambda: Tools().open_file(self)) - pass - - - - -class OneDText(QPlainTextEdit): - def __init__(self): - super().__init__() - self.setMinimumSize(200,200) - self.setPlainText("List of Files:\n+ File 1\n+ File 2") - - - -class OneDTable(QTableWidget): - def __init__(self): - super().__init__() - - self.setSortingEnabled(True) - - self.setRowCount(4) - self.setColumnCount(4) - - self.setMinimumSize(300,200) - - self.setHorizontalHeaderLabels({'h', 'k', 'l'}) - - - -class OneDVisualize(QPlainTextEdit): - def __init__(self): - super().__init__() - self.setMinimumSize(200,200) - self.setPlainText('Placeholder\nfor Visualization.') - - - - - - -class Buttons11(QWidget): - def __init__(self): - super().__init__() - self.grid = QGridLayout() - self.setLayout(self.grid) - - self.searchButton = QPushButton('Search') - self.grid.addWidget(self.searchButton, 0,0) - - self.addButton = QPushButton('Add') - self.grid.addWidget(self.addButton,0,1) - - self.substractButton = QPushButton('Substract') - self.grid.addWidget(self.substractButton, 0,2) - - - self.integrateComboBox = QComboBox() - self.integrateComboBox.addItems(['Integrate','-> Gaussian', '-> Pseudo-Voidg', '-> Lorenzian', '-> Several Peaks']) - self.grid.addWidget(self.integrateComboBox,1,0) - - - - - self.lorentzButton = QPushButton('Lorentz') - self.grid.addWidget(self.lorentzButton,1,1) - - self.absorptionButton = QPushButton('Absorption') - self.grid.addWidget(self.absorptionButton,1,2) - - self.saveWorksheetButton = QPushButton('Save') - self.grid.addWidget(self.saveWorksheetButton,0,3,2,3) - - -class Buttons12(QWidget): - - def __init__(self): - super().__init__() - self.grid = QGridLayout() - self.setLayout(self.grid) - self.qmapsButton = QPushButton('Q-Maps') - self.grid.addWidget(self.qmapsButton,0,0) - - self.plotdatavsButton = QPushButton('Plot Data VS') - self.grid.addWidget(self.plotdatavsButton,1,0) - - self.saveVisualizationButton = QPushButton('Save') - self.grid.addWidget(self.saveVisualizationButton,0,1,2,1) diff --git a/two_d_view.py b/two_d_view.py new file mode 100644 index 0000000..27c0aec --- /dev/null +++ b/two_d_view.py @@ -0,0 +1,124 @@ +from PyQt5.QtWidgets import QWidget, QGridLayout, QComboBox, QLabel, QPushButton, QPlainTextEdit + +from tools import Tools, View, Text, Table + + +class TwoDimView(QWidget): + + + def __init__(self): + """ Widget containing the entire Zebra Mode view. """ + super().__init__() + + # ---------------------------------------------------------------------- + # PREPARE + # ---------------------------------------------------------------------- + + grid = QGridLayout() + self.setLayout(grid) + + # Tools.View() groups Widgets for ease of use. + self.two = View() + + # Define Files so IDE does not issue warnings. + self.dataFile = None + + # ---------------------------------------------------------------------- + # DEFINE WIDGETS + # ---------------------------------------------------------------------- + + # Add empty label as spacer after buttons.I suspect this has a side effect. + # When adding Buttons20, we mean for them to span from grid position (3,1) to (3,2). + # However to mainreate the mainorrect visual effect they must also mainover the invisible spacer mainolumn. + # Thus we set them to span from grid position (3,1) to (3,3). + grid.addWidget(QLabel(), 10, 10) + + self.two.loadDataButton = QPushButton("Load Data File") + self.two.loadDataButton.setMaximumWidth(200) + grid.addWidget(self.two.loadDataButton, 1, 0) + + self.two.text = Text("List of Files:\n+ File 1\n+ File 2") + grid.addWidget(self.two.text, 0, 0) + + self.two.table = Table() + grid.addWidget(self.two.table, 0, 1) + + self.two.visualize = Visualize() + grid.addWidget(self.two.visualize, 0, 2) + + self.two.buttons11 = Buttons11(self) + grid.addWidget(self.two.buttons11, 1, 1) + + self.two.buttons12 = Buttons12(self) + grid.addWidget(self.two.buttons12, 1, 2) + + # ---------------------------------------------------------------------- + # SET WIDGET ACTIONS + # ---------------------------------------------------------------------- + + self.dataFile = self.two.loadDataButton.clicked.connect(lambda: Tools().open_file(self)) + + # ---------------------------------------------------------------------- + # FINISH + # ---------------------------------------------------------------------- + + pass + + +class Visualize(QPlainTextEdit): + + def __init__(self): + super().__init__() + self.setMinimumSize(200, 200) + self.setPlainText('Placeholder\nfor Visualization.') + + +class Buttons11(QWidget): + + def __init__(self, main): + """ Here main is the main window.\n + The purpose of this notation is to enable access to each button via self in the main window.""" + super().__init__() + grid = QGridLayout() + self.setLayout(grid) + + main.two.searchButton = QPushButton('Search') + grid.addWidget(main.two.searchButton, 0, 0) + + main.two.addButton = QPushButton('Add') + grid.addWidget(main.two.addButton, 0, 1) + + main.two.substractButton = QPushButton('Substract') + grid.addWidget(main.two.substractButton, 0, 2) + + main.two.integrateComboBox = QComboBox() + main.two.integrateComboBox.addItems(['Integrate', '-> Gaussian', '-> Pseudo-Voidg', '-> Lorenzian', '-> Several Peaks']) + grid.addWidget(main.two.integrateComboBox, 1, 0) + + main.two.lorentzButton = QPushButton('Lorentz') + grid.addWidget(main.two.lorentzButton, 1, 1) + + main.two.absorptionButton = QPushButton('Absorption') + grid.addWidget(main.two.absorptionButton, 1, 2) + + main.two.saveWorksheetButton = QPushButton('Save') + grid.addWidget(main.two.saveWorksheetButton, 0, 3, 2, 3) + + +class Buttons12(QWidget): + + def __init__(self, main): + """ Here main is the main window.\n + The purpose of this notation is to enable access to each button via self in the main window.""" + super().__init__() + grid = QGridLayout() + self.setLayout(grid) + + main.two.qmapsButton = QPushButton('Q-Maps') + grid.addWidget(main.two.qmapsButton, 0, 0) + + main.two.plotdatavsButton = QPushButton('Plot Data VS') + grid.addWidget(main.two.plotdatavsButton, 1, 0) + + main.two.saveVisualizationButton = QPushButton('Save') + grid.addWidget(main.two.saveVisualizationButton, 0, 1, 2, 1) diff --git a/welcomeView.py b/welcome_view.py similarity index 100% rename from welcomeView.py rename to welcome_view.py diff --git a/zebra.py b/zebra.py index 7dee89d..3065fed 100644 --- a/zebra.py +++ b/zebra.py @@ -1,10 +1,10 @@ import sys from PyQt5.QtWidgets import QMainWindow, QApplication, QPushButton, QGraphicsPixmapItem, QLabel,QWidget, QVBoxLayout, QAction -from twoDimView import TwoDimView -from oneDimView import OneDimView -from welcomeView import WelcomeView -from prepareView import PrepareView +from two_d_view import TwoDimView +from one_d_view import OneDimView +from welcome_view import WelcomeView +from prepare_view import PrepareView # test