Loading src/gui.py +168 −2 Original line number Diff line number Diff line Loading @@ -6,6 +6,8 @@ import pandas as pd from src import utils import sys import json class Ui(QtWidgets.QMainWindow): def __init__(self, df, selectedGroups): Loading @@ -27,7 +29,7 @@ class Ui(QtWidgets.QMainWindow): self.pb_prev.clicked.connect(self.prev_row) self.pb_next.clicked.connect(self.next_row) self.pb_save.clicked.connect(self.exec_row) self.pb_clear.clicked.connect(self.clear_morphology_rb) #self.pb_clear.clicked.connect(self.clear_morphology_rb) # Find actions in Menu bar: self.act_allSavedData = self.findChild(QtWidgets.QAction, Loading @@ -47,6 +49,137 @@ class Ui(QtWidgets.QMainWindow): #print(self.gb_galList) #self.progress = QtGui.QProgressBar(self) # Import config try: with open("config", 'r') as f: config:dict = json.loads(f.read()) except: raise # Create right gui gb_img:QtWidgets.QWidget = self.findChild(QtWidgets.QGroupBox, 'gb_img') # add image container w = QtWidgets.QLabel(None) w.setObjectName("imageLabel") w.setSizePolicy(QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Expanding)) gb_img.layout().addWidget(w, 0, 0, 1, 3) # add flags wcols = 3 wcount = 3+3 for k in config.keys(): try: tconf:dict = config[k] name = k.capitalize() if 'name' in tconf.keys(): name = tconf['name'] if 'type' not in tconf.keys(): print(f"type of {k}:{name} not specified") continue # COMMENTBOX if tconf['type'] == 'text': gb = createGroupBox(name) gb.setSizePolicy(QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Maximum, QtWidgets.QSizePolicy.Policy.Ignored)) w = QtWidgets.QPlainTextEdit(None) w.setObjectName("commentBox") #f"cm_{ename}") w.setSizePolicy(QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum)) w.setPlaceholderText(f"Press [{tconf['shortcut']}] to insert comments. Press [Enter] to save, and [Esc] to discard.") gb.layout().addWidget(w) # CHECKBOX elif tconf['type'] == 'checkbox': count = 0 cols = 2 if 'ncolumns' in tconf.keys(): cols = tconf['ncolumns'] gb = createGroupBox(name) gb.setSizePolicy(QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Maximum)) for key in tconf['elements'].keys(): try: ename, evalue = key, tconf['elements'][key] # add checkbox w = QtWidgets.QCheckBox(None) w.setObjectName(f"cb_{ename}") w.setSizePolicy(QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Fixed)) addTexts(w, evalue, ename) addToolTip(w, evalue) gb.layout().addWidget(w,count//cols, count%cols) count += 1 except KeyError as e: print(e) # RADIOBUTTON TYPE elif tconf['type'] == 'radiobutton': count = 0 cols = 2 if 'ncolumns' in tconf.keys(): cols = tconf['ncolumns']*2 gb = createGroupBox(name) gb.setSizePolicy(QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Preferred, QtWidgets.QSizePolicy.Policy.Preferred)) gbb = QtWidgets.QButtonGroup() gbb.setObjectName(f"gbb_{name.lower()}") for key in tconf['elements'].keys(): try: ename, evalue = key, tconf['elements'][key] # radiobutton w = QtWidgets.QRadioButton(None) w.setObjectName(f"rb_{ename}") w.setSizePolicy(QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Fixed)) w.setShortcut(evalue['shortcut']) w.setText(f"{evalue['name']}") addToolTip(w, evalue) gbb.addButton(w) gb.layout().addWidget(w,count//cols, count%cols) count += 1 # shortcut label w = QtWidgets.QLabel(None) w.setSizePolicy(QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Preferred, QtWidgets.QSizePolicy.Policy.Preferred)) w.setText(f"[{evalue['shortcut']}]") gb.layout().addWidget(w,count//cols, count%cols) count += 1 except KeyError as e: print(e) if 'add_clear' in tconf.keys() and tconf['add_clear'] is True: w = QtWidgets.QPushButton(None) w.setObjectName(f"pb_clear") w.setSizePolicy(QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Fixed)) text = f"Clear" if 'clear_shortcut' in tconf.keys(): text += f" [{tconf['clear_shortcut']}]" w.setText(text) #w.clicked.connect(self.clear_morphology_rb) gb.layout().addWidget(w, count//cols, count%cols, 1, cols) else: print(f"{tconf['type']} not implemented") gb_img.layout().addWidget(gb, wcount//wcols, wcount%wcols) wcount += 1 except: raise # Changes to make # 1 - utils COLUMNS and MORPHO need to be dinamic # 2 - aboid finding cb and rb maybe safe them in creation # 3 - get radio button ischecked from ButtonGroup # 4 - dinamic input file, independent form group. # also, HEADER created from this file # 5 - output file keys have to be dinamic (related to input file and COLUMNS) # also, newEntry func # Find checkboxes: self.cbColumns = utils.getCheckBoxesColumns() self.cbNames = ['cb_' + x for x in self.cbColumns] Loading Loading @@ -329,3 +462,36 @@ class Ui(QtWidgets.QMainWindow): def splitterResizeEvent(self, pos, index): # Re-draw image: self.showImage(self.imgPath) # Widget ops def createGroupBox(name:str) -> QtWidgets.QGroupBox: gb = QtWidgets.QGroupBox(name) gb.setObjectName(f"gb_{name.lower()}") #gb.setSizePolicy(QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Ignored, QtWidgets.QSizePolicy.Policy.Ignored)) #gb.setMinimumSize(50, 150) gb.setLayout(QtWidgets.QGridLayout()) return gb def addToolTip(widget: QtWidgets.QWidget, element:dict) -> None: try: widget.setToolTip(f"{element['description']}") except KeyError as e: print(e) def addTexts(widget: QtWidgets.QWidget, element:dict, element_key:str) -> None: name = None shortcut = None try: name = element['name'] shortcut = element['shortcut'] except KeyError as e: if name is None: name = element_key.capitalize() print(e) finally: text = f"{name}" if shortcut is not None: widget.setShortcut(shortcut) text = f"[{shortcut}] {name}" widget.setText(text) No newline at end of file Loading
src/gui.py +168 −2 Original line number Diff line number Diff line Loading @@ -6,6 +6,8 @@ import pandas as pd from src import utils import sys import json class Ui(QtWidgets.QMainWindow): def __init__(self, df, selectedGroups): Loading @@ -27,7 +29,7 @@ class Ui(QtWidgets.QMainWindow): self.pb_prev.clicked.connect(self.prev_row) self.pb_next.clicked.connect(self.next_row) self.pb_save.clicked.connect(self.exec_row) self.pb_clear.clicked.connect(self.clear_morphology_rb) #self.pb_clear.clicked.connect(self.clear_morphology_rb) # Find actions in Menu bar: self.act_allSavedData = self.findChild(QtWidgets.QAction, Loading @@ -47,6 +49,137 @@ class Ui(QtWidgets.QMainWindow): #print(self.gb_galList) #self.progress = QtGui.QProgressBar(self) # Import config try: with open("config", 'r') as f: config:dict = json.loads(f.read()) except: raise # Create right gui gb_img:QtWidgets.QWidget = self.findChild(QtWidgets.QGroupBox, 'gb_img') # add image container w = QtWidgets.QLabel(None) w.setObjectName("imageLabel") w.setSizePolicy(QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Expanding)) gb_img.layout().addWidget(w, 0, 0, 1, 3) # add flags wcols = 3 wcount = 3+3 for k in config.keys(): try: tconf:dict = config[k] name = k.capitalize() if 'name' in tconf.keys(): name = tconf['name'] if 'type' not in tconf.keys(): print(f"type of {k}:{name} not specified") continue # COMMENTBOX if tconf['type'] == 'text': gb = createGroupBox(name) gb.setSizePolicy(QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Maximum, QtWidgets.QSizePolicy.Policy.Ignored)) w = QtWidgets.QPlainTextEdit(None) w.setObjectName("commentBox") #f"cm_{ename}") w.setSizePolicy(QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum)) w.setPlaceholderText(f"Press [{tconf['shortcut']}] to insert comments. Press [Enter] to save, and [Esc] to discard.") gb.layout().addWidget(w) # CHECKBOX elif tconf['type'] == 'checkbox': count = 0 cols = 2 if 'ncolumns' in tconf.keys(): cols = tconf['ncolumns'] gb = createGroupBox(name) gb.setSizePolicy(QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Maximum)) for key in tconf['elements'].keys(): try: ename, evalue = key, tconf['elements'][key] # add checkbox w = QtWidgets.QCheckBox(None) w.setObjectName(f"cb_{ename}") w.setSizePolicy(QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Fixed)) addTexts(w, evalue, ename) addToolTip(w, evalue) gb.layout().addWidget(w,count//cols, count%cols) count += 1 except KeyError as e: print(e) # RADIOBUTTON TYPE elif tconf['type'] == 'radiobutton': count = 0 cols = 2 if 'ncolumns' in tconf.keys(): cols = tconf['ncolumns']*2 gb = createGroupBox(name) gb.setSizePolicy(QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Preferred, QtWidgets.QSizePolicy.Policy.Preferred)) gbb = QtWidgets.QButtonGroup() gbb.setObjectName(f"gbb_{name.lower()}") for key in tconf['elements'].keys(): try: ename, evalue = key, tconf['elements'][key] # radiobutton w = QtWidgets.QRadioButton(None) w.setObjectName(f"rb_{ename}") w.setSizePolicy(QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Fixed)) w.setShortcut(evalue['shortcut']) w.setText(f"{evalue['name']}") addToolTip(w, evalue) gbb.addButton(w) gb.layout().addWidget(w,count//cols, count%cols) count += 1 # shortcut label w = QtWidgets.QLabel(None) w.setSizePolicy(QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Preferred, QtWidgets.QSizePolicy.Policy.Preferred)) w.setText(f"[{evalue['shortcut']}]") gb.layout().addWidget(w,count//cols, count%cols) count += 1 except KeyError as e: print(e) if 'add_clear' in tconf.keys() and tconf['add_clear'] is True: w = QtWidgets.QPushButton(None) w.setObjectName(f"pb_clear") w.setSizePolicy(QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Fixed)) text = f"Clear" if 'clear_shortcut' in tconf.keys(): text += f" [{tconf['clear_shortcut']}]" w.setText(text) #w.clicked.connect(self.clear_morphology_rb) gb.layout().addWidget(w, count//cols, count%cols, 1, cols) else: print(f"{tconf['type']} not implemented") gb_img.layout().addWidget(gb, wcount//wcols, wcount%wcols) wcount += 1 except: raise # Changes to make # 1 - utils COLUMNS and MORPHO need to be dinamic # 2 - aboid finding cb and rb maybe safe them in creation # 3 - get radio button ischecked from ButtonGroup # 4 - dinamic input file, independent form group. # also, HEADER created from this file # 5 - output file keys have to be dinamic (related to input file and COLUMNS) # also, newEntry func # Find checkboxes: self.cbColumns = utils.getCheckBoxesColumns() self.cbNames = ['cb_' + x for x in self.cbColumns] Loading Loading @@ -329,3 +462,36 @@ class Ui(QtWidgets.QMainWindow): def splitterResizeEvent(self, pos, index): # Re-draw image: self.showImage(self.imgPath) # Widget ops def createGroupBox(name:str) -> QtWidgets.QGroupBox: gb = QtWidgets.QGroupBox(name) gb.setObjectName(f"gb_{name.lower()}") #gb.setSizePolicy(QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Ignored, QtWidgets.QSizePolicy.Policy.Ignored)) #gb.setMinimumSize(50, 150) gb.setLayout(QtWidgets.QGridLayout()) return gb def addToolTip(widget: QtWidgets.QWidget, element:dict) -> None: try: widget.setToolTip(f"{element['description']}") except KeyError as e: print(e) def addTexts(widget: QtWidgets.QWidget, element:dict, element_key:str) -> None: name = None shortcut = None try: name = element['name'] shortcut = element['shortcut'] except KeyError as e: if name is None: name = element_key.capitalize() print(e) finally: text = f"{name}" if shortcut is not None: widget.setShortcut(shortcut) text = f"[{shortcut}] {name}" widget.setText(text) No newline at end of file