Loading output.csv +4 −1 Original line number Diff line number Diff line filename,group,galaxy,morphology,large,tiny,faceon,edgeon,star,calibration,recentre,duplicated,member,hiiregion,yes,no,comment image_1432.png,1,1432,elliptical,False,True,True,False,False,True,False,False,False,True,False,True,as image_45125.png,1,45125,,True,False,False,False,True,False,False,True,True,False,False,False, image_23654.png,1,23654,spiral,False,False,False,False,False,False,False,False,False,False,False,False,asdf image_87502.png,1,87502,,False,False,True,True,False,True,False,True,True,True,True,True, src/gui.py +151 −99 Original line number Diff line number Diff line Loading @@ -19,29 +19,27 @@ class Ui(QtWidgets.QMainWindow): # Load data frame and make it accessible along the class: self.df = df self.galaxies = selectedGroups self.groups = selectedGroups # Find buttons: self.pb_prev = self.findChild(QtWidgets.QPushButton, 'pb_prev') self.pb_next = self.findChild(QtWidgets.QPushButton, 'pb_next') pb_prev = self.findChild(QtWidgets.QPushButton, 'pb_prev') pb_prev.clicked.connect(self.prev_row) pb_next = self.findChild(QtWidgets.QPushButton, 'pb_next') pb_next.clicked.connect(self.next_row) self.pb_save = self.findChild(QtWidgets.QPushButton, 'pb_save') self.pb_clear = self.findChild(QtWidgets.QPushButton, 'pb_clear') 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_save.clicked.connect(self.save_row) # self.pb_clear = self.findChild(QtWidgets.QPushButton, 'pb_clear') # self.pb_clear.clicked.connect(self.clear_morphology_rb) # Find actions in Menu bar: self.act_allSavedData = self.findChild(QtWidgets.QAction, 'act_allSavedData') self.act_exit = self.findChild(QtWidgets.QAction, 'act_exit') self.act_allSavedData.changed.connect(self.toggleAIDVisibility) self.act_exit.triggered.connect(self.exit) act_exit = self.findChild(QtWidgets.QAction, 'act_exit') act_exit.triggered.connect(self.exit) act_allSavedData = self.findChild(QtWidgets.QAction, 'act_allSavedData') act_allSavedData.changed.connect(lambda: self.toggleAIDVisibility(act_allSavedData)) # Find Splitters: self.mainSplitter = self.findChild(QtWidgets.QSplitter, 'mainSplitter') self.mainSplitter.splitterMoved.connect(self.splitterResizeEvent) mainSplitter = self.findChild(QtWidgets.QSplitter, 'mainSplitter') mainSplitter.splitterMoved.connect(self.splitterResizeEvent) # For next release: Hidable progress bar: # Find Groupboxes: Loading @@ -57,24 +55,34 @@ class Ui(QtWidgets.QMainWindow): raise # Create right gui wcols = 3 wcount = 0 wcols = 3 # no. cols in each row wcount = 0 # pointer to current col policy = QtWidgets.QSizePolicy.Policy gb_img:QtWidgets.QWidget = self.findChild(QtWidgets.QGroupBox, 'gb_img') policy = QtWidgets.QSizePolicy.Policy # add image container # Add image container widget widget = QtWidgets.QLabel(None) widget.setObjectName("imageLabel") widget.setSizePolicy(QtWidgets.QSizePolicy(policy.Expanding, policy.Expanding)) gb_img.layout().addWidget(widget, 0, 0, 1, 3) wcount += 3 # add widgets widget.setAlignment(Qt.AlignmentFlag.AlignHCenter | Qt.AlignmentFlag.AlignVCenter) gb_img.layout().addWidget(widget, 0, 0, 1, wcols) # Full row width wcount += wcols # Save image widget: self.defaultImgPath = Path("res") / Path("image_not_found.png") self.imageLabel = widget # Instances to widget saves self.rbg = {} # buttongroups self.rb = {} # radiobuttons self.rbTypes, self.rbNames = [], [] self.cb = {} # checkboxs self.cbColumns, self.cbNames = [], [] self.tb = {} # textbox # Add dynamic widgets for tconf in config: tconf:dict count = 0 cols = 2 cols = 2 # default cols inside each widget count = 0 # pointer to current col inside widget try: # check basic define params if 'id' in tconf.keys(): Loading @@ -92,11 +100,14 @@ class Ui(QtWidgets.QMainWindow): if tconf['type'] == 'text': gb = newGroupBox(id, name, QtWidgets.QSizePolicy(policy.Maximum, policy.Ignored)) w = QtWidgets.QPlainTextEdit(None) w.setObjectName("commentBox") #f"cm_{ename}") w.setSizePolicy(QtWidgets.QSizePolicy(policy.Expanding, policy.Minimum)) w.setPlaceholderText(f"Press [{tconf['shortcut']}] to insert comments. Press [Enter] to save, and [Esc] to discard.") gb.layout().addWidget(w) widget = QtWidgets.QPlainTextEdit(None) widget.setObjectName(f"tb_{id}") widget.setSizePolicy(QtWidgets.QSizePolicy(policy.Expanding, policy.Minimum)) widget.setPlaceholderText(f"Press [{tconf['shortcut']}] to insert comments. Press [Enter] to save, and [Esc] to discard.") widget.installEventFilter(self) # Set enter as save row gb.layout().addWidget(widget) self.commentBox = widget self.tb[id] = widget # CHECKBOX elif tconf['type'] == 'checkbox': if 'ncolumns' in tconf.keys(): Loading @@ -106,15 +117,22 @@ class Ui(QtWidgets.QMainWindow): for element in tconf['elements']: try: eid = element['id'] wid = f"cb_{eid}" # add checkbox widget = QtWidgets.QCheckBox(None) widget.setObjectName(f"cb_{element['id']}") widget.setObjectName(wid) widget.setSizePolicy(QtWidgets.QSizePolicy(policy.Minimum, policy.Fixed)) addCheckBoxTexts(widget, element) addToolTip(widget, element) gb.layout().addWidget(widget, count//cols, count%cols) count += 1 # save widget self.cb[eid] = widget self.cbColumns.append(eid) self.cbNames.append(wid) except KeyError as e: print(e) # RADIOBUTTON TYPE Loading @@ -134,9 +152,11 @@ class Ui(QtWidgets.QMainWindow): if 'shortcut' in element.keys(): shortcut = element['shortcut'] eid = element['id'] wid = f"rb_{eid}" # radiobutton widget = QtWidgets.QRadioButton(None) widget.setObjectName(f"rb_{element['id']}") widget.setObjectName(wid) widget.setSizePolicy(QtWidgets.QSizePolicy(policy.Minimum, policy.Fixed)) widget.setText(f"{element['name']}") widget.setShortcut(shortcut) Loading @@ -145,6 +165,11 @@ class Ui(QtWidgets.QMainWindow): gbb.addButton(widget) gb.layout().addWidget(widget, count//cols, count%cols) count += 1 # save widget self.rb[eid] = widget self.rbTypes.append(eid) self.rbNames.append(wid) # shortcut label if shortcut != '': widget = QtWidgets.QLabel(None) Loading @@ -156,17 +181,17 @@ class Ui(QtWidgets.QMainWindow): print(e) if 'add_clear' in tconf.keys() and tconf['add_clear'] is True: widget = QtWidgets.QPushButton(None) widget.setObjectName(f"pb_clear") widget.setObjectName(f"pb_clear_{id}") widget.setSizePolicy(QtWidgets.QSizePolicy(policy.Minimum, policy.Fixed)) text = f"Clear" if 'clear_shortcut' in tconf.keys(): text += f" [{tconf['clear_shortcut']}]" widget.setText(text) widget.clicked.connect(self.clear_morphology_rb) widget.clicked.connect(lambda: self.clear_ButtonGroup(gbb)) gb.layout().addWidget(widget, count//cols, count%cols, 1, cols) self.gbb = gbb self.rbg[id] = gbb else: print(f"{tconf['type']} not implemented") Loading @@ -178,43 +203,45 @@ class Ui(QtWidgets.QMainWindow): # 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 # DONE 2 - aboid finding cb and rb maybe safe them in creation # DONE 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 # 6 - what if multiple same named widgets? add groudid to widgetid? # 7 - multiple commentBox not supported (yes, but events need to be solved) # Find checkboxes: self.cbColumns = utils.getCheckBoxesColumns() self.cbNames = ['cb_' + x for x in self.cbColumns] self.cb = {} for i, cb in enumerate(self.cbNames): self.cb[self.cbColumns[i]] = self.findChild(QtWidgets.QCheckBox, self.cbNames[i]) # self.cbColumns = utils.getCheckBoxesColumns() # self.cbNames = ['cb_' + x for x in self.cbColumns] # self.cb = {} # for i, cb in enumerate(self.cbNames): # self.cb[self.cbColumns[i]] = self.findChild(QtWidgets.QCheckBox, # self.cbNames[i]) # Find radio buttons: self.rbTypes = utils.getRadioButtonsMorphology() self.rbNames = ['rb_' + x for x in self.rbTypes] self.rb = {} for i, cb in enumerate(self.rbNames): self.rb[self.rbTypes[i]] = self.findChild(QtWidgets.QRadioButton, self.rbNames[i]) # self.rbTypes = utils.getRadioButtonsMorphology() # self.rbNames = ['rb_' + x for x in self.rbTypes] # self.rb = {} # for i, cb in enumerate(self.rbNames): # self.rb[self.rbTypes[i]] = self.findChild(QtWidgets.QRadioButton, # self.rbNames[i]) # find comment box: self.commentBox = self.findChild(QtWidgets.QPlainTextEdit, 'commentBox') self.commentBox.installEventFilter(self) # self.commentBox = self.findChild(QtWidgets.QPlainTextEdit, # 'commentBox') # self.commentBox.installEventFilter(self) # Set enter as save row # Find image frame: self.imageLabel = self.findChild(QtWidgets.QLabel, 'imageLabel') # self.imageLabel.setScaledContents(True) self.imageLabel.setAlignment(Qt.AlignHCenter | Qt.AlignVCenter) self.defaultImgPath = Path("res") / Path("Cavity.png") # self.imageLabel = self.findChild(QtWidgets.QLabel, 'imageLabel') # # self.imageLabel.setScaledContents(True) # self.imageLabel.setAlignment(Qt.AlignHCenter | Qt.AlignVCenter) # self.defaultImgPath = Path("res") / Path("Cavity.png") # # self.showImage(self.defaultImgPath) # # Show image with updated windows size: # self.showImage(self.defaultImgPath) # Show image with updated windows size: self.showImage(self.defaultImgPath) # Find table: self.fileList = self.findChild(QtWidgets.QTableWidget, 'fileList') Loading Loading @@ -275,7 +302,7 @@ class Ui(QtWidgets.QMainWindow): # Place filename in the row: self.fileList.setItem(i, 5, QtWidgets.QTableWidgetItem(str(row['filename']))) if (not showAllSavedData) and (int(row['group']) not in self.galaxies): if (not showAllSavedData) and (int(row['group']) not in self.groups): self.fileList.hideRow(i) # Order by RA coordinate: Loading @@ -297,7 +324,7 @@ class Ui(QtWidgets.QMainWindow): # Button methods: def exec_row(self): def save_row(self): index = self.fileList.selectionModel().selectedRows()[0].row() try: fn = self.fileList.item(index, 5).text() Loading @@ -309,17 +336,27 @@ class Ui(QtWidgets.QMainWindow): self.fileList.setCellWidget(index, 2, self.getIconCell(True)) for radio in self.rbTypes: if(self.rb[radio].isChecked()): self.df.loc[item_index, 'morphology'] = radio break else: self.df.loc[item_index, 'morphology'] = utils.getMorphology()[-1] for id, bg in self.rbg.items(): selected = '' if bg.checkedButton() is not None: idChecked = bg.checkedButton().objectName() # refactor rbTypes and rbNames? selected = self.rbTypes[self.rbNames.index(idChecked)] self.df.loc[item_index, id] = selected # for radio in self.rbTypes: # if(self.rb[radio].isChecked()): # self.df.loc[item_index, 'morphology'] = radio # break # else: # self.df.loc[item_index, 'morphology'] = utils.getMorphology()[-1] for column in self.cbColumns: self.df.loc[item_index, column] = self.cb[column].isChecked() self.df.loc[item_index, 'comment'] = self.commentBox.toPlainText().replace('\n', '') for id, tb in self.tb.items(): self.df.loc[item_index, id] = tb.toPlainText().replace('\n', '') # self.df.loc[item_index, 'comment'] = self.commentBox.toPlainText().replace('\n', '') self.fileList.selectRow(index+1) Loading @@ -338,30 +375,45 @@ class Ui(QtWidgets.QMainWindow): item = self.df.loc[self.df['filename'] == fn] self.imgPath = item['fullpath'].item() windowTitle = '' if 'group' in item.keys(): grp = str(item['group'].item()) windowTitle += f"Grp: {grp} | " gal = str(item['galaxy'].item()) self.setWindowTitle('Grp: ' + grp + ' | Gal: ' + gal + ' | ' + self.title) windowTitle += f"Gal: {gal} | {self.title}" self.setWindowTitle(windowTitle) self.fileList.setCellWidget(index, 2, self.getIconCell(item['processed'].item())) self.clear_morphology_rb() for radio in self.rbTypes: if(item['morphology'].item() == radio): self.rb[radio].setChecked(True) # radiobuttons for id, bg in self.rbg.items(): self.clear_ButtonGroup(bg) selected = item[id].item() if selected in self.rbTypes: idChecked = self.rbNames[self.rbTypes.index(selected)] # refactor rbTypes and rbNames? self.rb[selected].setChecked(True) # for radio in self.rbTypes: # if(item['morphology'].item() == radio): # self.rb[radio].setChecked(True) # checkboxes for cb in self.cbColumns: self.cb[cb].setChecked(item[cb].item()) comment = item['comment'].item() if not pd.isnull(comment): self.commentBox.setPlainText(str(comment)) # textboxes for id, tb in self.tb.items(): comment = item[id].item() if pd.notnull(comment): tb.setPlainText(str(comment)) else: self.commentBox.setPlainText('') tb.setPlainText('') # comment = item['comment'].item() # if not pd.isnull(comment): # self.commentBox.setPlainText(str(comment)) # else: # self.commentBox.setPlainText('') except (AttributeError, KeyError): print("WARNING:\tEmpty item") Loading @@ -383,26 +435,26 @@ class Ui(QtWidgets.QMainWindow): self.fileList.selectRow(index-1) def clear_morphology_rb(self): def clear_ButtonGroup(self, bg): # for i, cb in enumerate(self.rbNames): # self.rb[self.rbTypes[i]].setAutoExclusive(False) # self.rb[self.rbTypes[i]].setChecked(False) # self.rb[self.rbTypes[i]].setAutoExclusive(True) if self.gbb.checkedButton() is not None: self.gbb.setExclusive(False) self.gbb.checkedButton().setChecked(False) self.gbb.setExclusive(True) if bg.checkedButton() is not None: bg.setExclusive(False) bg.checkedButton().setChecked(False) bg.setExclusive(True) # Actions helpers def exit(self): QCoreApplication.quit() def toggleAIDVisibility(self): showAllSavedData = self.act_allSavedData.isChecked() def toggleAIDVisibility(self, act): showAllSavedData = act.isChecked() for i in range(self.fileList.rowCount()): row = self.fileList.item(i, 0).text() if (not showAllSavedData) and (int(row) not in self.galaxies): if (not showAllSavedData) and (int(row) not in self.groups): self.fileList.hideRow(i) else: self.fileList.showRow(i) Loading @@ -410,7 +462,7 @@ class Ui(QtWidgets.QMainWindow): # Image helpers: def showImage(self, imageFile): if imageFile: if imageFile and Path.is_file(imageFile): pixmap = QPixmap(str(imageFile)) else: pixmap = QPixmap(str(self.defaultImgPath)) Loading src/utils.py +1 −1 Original line number Diff line number Diff line Loading @@ -43,7 +43,7 @@ def getOptions(version): args = parser.parse_args() VERSION = version return parser.parse_args() return args def getVersion(): Loading Loading
output.csv +4 −1 Original line number Diff line number Diff line filename,group,galaxy,morphology,large,tiny,faceon,edgeon,star,calibration,recentre,duplicated,member,hiiregion,yes,no,comment image_1432.png,1,1432,elliptical,False,True,True,False,False,True,False,False,False,True,False,True,as image_45125.png,1,45125,,True,False,False,False,True,False,False,True,True,False,False,False, image_23654.png,1,23654,spiral,False,False,False,False,False,False,False,False,False,False,False,False,asdf image_87502.png,1,87502,,False,False,True,True,False,True,False,True,True,True,True,True,
src/gui.py +151 −99 Original line number Diff line number Diff line Loading @@ -19,29 +19,27 @@ class Ui(QtWidgets.QMainWindow): # Load data frame and make it accessible along the class: self.df = df self.galaxies = selectedGroups self.groups = selectedGroups # Find buttons: self.pb_prev = self.findChild(QtWidgets.QPushButton, 'pb_prev') self.pb_next = self.findChild(QtWidgets.QPushButton, 'pb_next') pb_prev = self.findChild(QtWidgets.QPushButton, 'pb_prev') pb_prev.clicked.connect(self.prev_row) pb_next = self.findChild(QtWidgets.QPushButton, 'pb_next') pb_next.clicked.connect(self.next_row) self.pb_save = self.findChild(QtWidgets.QPushButton, 'pb_save') self.pb_clear = self.findChild(QtWidgets.QPushButton, 'pb_clear') 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_save.clicked.connect(self.save_row) # self.pb_clear = self.findChild(QtWidgets.QPushButton, 'pb_clear') # self.pb_clear.clicked.connect(self.clear_morphology_rb) # Find actions in Menu bar: self.act_allSavedData = self.findChild(QtWidgets.QAction, 'act_allSavedData') self.act_exit = self.findChild(QtWidgets.QAction, 'act_exit') self.act_allSavedData.changed.connect(self.toggleAIDVisibility) self.act_exit.triggered.connect(self.exit) act_exit = self.findChild(QtWidgets.QAction, 'act_exit') act_exit.triggered.connect(self.exit) act_allSavedData = self.findChild(QtWidgets.QAction, 'act_allSavedData') act_allSavedData.changed.connect(lambda: self.toggleAIDVisibility(act_allSavedData)) # Find Splitters: self.mainSplitter = self.findChild(QtWidgets.QSplitter, 'mainSplitter') self.mainSplitter.splitterMoved.connect(self.splitterResizeEvent) mainSplitter = self.findChild(QtWidgets.QSplitter, 'mainSplitter') mainSplitter.splitterMoved.connect(self.splitterResizeEvent) # For next release: Hidable progress bar: # Find Groupboxes: Loading @@ -57,24 +55,34 @@ class Ui(QtWidgets.QMainWindow): raise # Create right gui wcols = 3 wcount = 0 wcols = 3 # no. cols in each row wcount = 0 # pointer to current col policy = QtWidgets.QSizePolicy.Policy gb_img:QtWidgets.QWidget = self.findChild(QtWidgets.QGroupBox, 'gb_img') policy = QtWidgets.QSizePolicy.Policy # add image container # Add image container widget widget = QtWidgets.QLabel(None) widget.setObjectName("imageLabel") widget.setSizePolicy(QtWidgets.QSizePolicy(policy.Expanding, policy.Expanding)) gb_img.layout().addWidget(widget, 0, 0, 1, 3) wcount += 3 # add widgets widget.setAlignment(Qt.AlignmentFlag.AlignHCenter | Qt.AlignmentFlag.AlignVCenter) gb_img.layout().addWidget(widget, 0, 0, 1, wcols) # Full row width wcount += wcols # Save image widget: self.defaultImgPath = Path("res") / Path("image_not_found.png") self.imageLabel = widget # Instances to widget saves self.rbg = {} # buttongroups self.rb = {} # radiobuttons self.rbTypes, self.rbNames = [], [] self.cb = {} # checkboxs self.cbColumns, self.cbNames = [], [] self.tb = {} # textbox # Add dynamic widgets for tconf in config: tconf:dict count = 0 cols = 2 cols = 2 # default cols inside each widget count = 0 # pointer to current col inside widget try: # check basic define params if 'id' in tconf.keys(): Loading @@ -92,11 +100,14 @@ class Ui(QtWidgets.QMainWindow): if tconf['type'] == 'text': gb = newGroupBox(id, name, QtWidgets.QSizePolicy(policy.Maximum, policy.Ignored)) w = QtWidgets.QPlainTextEdit(None) w.setObjectName("commentBox") #f"cm_{ename}") w.setSizePolicy(QtWidgets.QSizePolicy(policy.Expanding, policy.Minimum)) w.setPlaceholderText(f"Press [{tconf['shortcut']}] to insert comments. Press [Enter] to save, and [Esc] to discard.") gb.layout().addWidget(w) widget = QtWidgets.QPlainTextEdit(None) widget.setObjectName(f"tb_{id}") widget.setSizePolicy(QtWidgets.QSizePolicy(policy.Expanding, policy.Minimum)) widget.setPlaceholderText(f"Press [{tconf['shortcut']}] to insert comments. Press [Enter] to save, and [Esc] to discard.") widget.installEventFilter(self) # Set enter as save row gb.layout().addWidget(widget) self.commentBox = widget self.tb[id] = widget # CHECKBOX elif tconf['type'] == 'checkbox': if 'ncolumns' in tconf.keys(): Loading @@ -106,15 +117,22 @@ class Ui(QtWidgets.QMainWindow): for element in tconf['elements']: try: eid = element['id'] wid = f"cb_{eid}" # add checkbox widget = QtWidgets.QCheckBox(None) widget.setObjectName(f"cb_{element['id']}") widget.setObjectName(wid) widget.setSizePolicy(QtWidgets.QSizePolicy(policy.Minimum, policy.Fixed)) addCheckBoxTexts(widget, element) addToolTip(widget, element) gb.layout().addWidget(widget, count//cols, count%cols) count += 1 # save widget self.cb[eid] = widget self.cbColumns.append(eid) self.cbNames.append(wid) except KeyError as e: print(e) # RADIOBUTTON TYPE Loading @@ -134,9 +152,11 @@ class Ui(QtWidgets.QMainWindow): if 'shortcut' in element.keys(): shortcut = element['shortcut'] eid = element['id'] wid = f"rb_{eid}" # radiobutton widget = QtWidgets.QRadioButton(None) widget.setObjectName(f"rb_{element['id']}") widget.setObjectName(wid) widget.setSizePolicy(QtWidgets.QSizePolicy(policy.Minimum, policy.Fixed)) widget.setText(f"{element['name']}") widget.setShortcut(shortcut) Loading @@ -145,6 +165,11 @@ class Ui(QtWidgets.QMainWindow): gbb.addButton(widget) gb.layout().addWidget(widget, count//cols, count%cols) count += 1 # save widget self.rb[eid] = widget self.rbTypes.append(eid) self.rbNames.append(wid) # shortcut label if shortcut != '': widget = QtWidgets.QLabel(None) Loading @@ -156,17 +181,17 @@ class Ui(QtWidgets.QMainWindow): print(e) if 'add_clear' in tconf.keys() and tconf['add_clear'] is True: widget = QtWidgets.QPushButton(None) widget.setObjectName(f"pb_clear") widget.setObjectName(f"pb_clear_{id}") widget.setSizePolicy(QtWidgets.QSizePolicy(policy.Minimum, policy.Fixed)) text = f"Clear" if 'clear_shortcut' in tconf.keys(): text += f" [{tconf['clear_shortcut']}]" widget.setText(text) widget.clicked.connect(self.clear_morphology_rb) widget.clicked.connect(lambda: self.clear_ButtonGroup(gbb)) gb.layout().addWidget(widget, count//cols, count%cols, 1, cols) self.gbb = gbb self.rbg[id] = gbb else: print(f"{tconf['type']} not implemented") Loading @@ -178,43 +203,45 @@ class Ui(QtWidgets.QMainWindow): # 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 # DONE 2 - aboid finding cb and rb maybe safe them in creation # DONE 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 # 6 - what if multiple same named widgets? add groudid to widgetid? # 7 - multiple commentBox not supported (yes, but events need to be solved) # Find checkboxes: self.cbColumns = utils.getCheckBoxesColumns() self.cbNames = ['cb_' + x for x in self.cbColumns] self.cb = {} for i, cb in enumerate(self.cbNames): self.cb[self.cbColumns[i]] = self.findChild(QtWidgets.QCheckBox, self.cbNames[i]) # self.cbColumns = utils.getCheckBoxesColumns() # self.cbNames = ['cb_' + x for x in self.cbColumns] # self.cb = {} # for i, cb in enumerate(self.cbNames): # self.cb[self.cbColumns[i]] = self.findChild(QtWidgets.QCheckBox, # self.cbNames[i]) # Find radio buttons: self.rbTypes = utils.getRadioButtonsMorphology() self.rbNames = ['rb_' + x for x in self.rbTypes] self.rb = {} for i, cb in enumerate(self.rbNames): self.rb[self.rbTypes[i]] = self.findChild(QtWidgets.QRadioButton, self.rbNames[i]) # self.rbTypes = utils.getRadioButtonsMorphology() # self.rbNames = ['rb_' + x for x in self.rbTypes] # self.rb = {} # for i, cb in enumerate(self.rbNames): # self.rb[self.rbTypes[i]] = self.findChild(QtWidgets.QRadioButton, # self.rbNames[i]) # find comment box: self.commentBox = self.findChild(QtWidgets.QPlainTextEdit, 'commentBox') self.commentBox.installEventFilter(self) # self.commentBox = self.findChild(QtWidgets.QPlainTextEdit, # 'commentBox') # self.commentBox.installEventFilter(self) # Set enter as save row # Find image frame: self.imageLabel = self.findChild(QtWidgets.QLabel, 'imageLabel') # self.imageLabel.setScaledContents(True) self.imageLabel.setAlignment(Qt.AlignHCenter | Qt.AlignVCenter) self.defaultImgPath = Path("res") / Path("Cavity.png") # self.imageLabel = self.findChild(QtWidgets.QLabel, 'imageLabel') # # self.imageLabel.setScaledContents(True) # self.imageLabel.setAlignment(Qt.AlignHCenter | Qt.AlignVCenter) # self.defaultImgPath = Path("res") / Path("Cavity.png") # # self.showImage(self.defaultImgPath) # # Show image with updated windows size: # self.showImage(self.defaultImgPath) # Show image with updated windows size: self.showImage(self.defaultImgPath) # Find table: self.fileList = self.findChild(QtWidgets.QTableWidget, 'fileList') Loading Loading @@ -275,7 +302,7 @@ class Ui(QtWidgets.QMainWindow): # Place filename in the row: self.fileList.setItem(i, 5, QtWidgets.QTableWidgetItem(str(row['filename']))) if (not showAllSavedData) and (int(row['group']) not in self.galaxies): if (not showAllSavedData) and (int(row['group']) not in self.groups): self.fileList.hideRow(i) # Order by RA coordinate: Loading @@ -297,7 +324,7 @@ class Ui(QtWidgets.QMainWindow): # Button methods: def exec_row(self): def save_row(self): index = self.fileList.selectionModel().selectedRows()[0].row() try: fn = self.fileList.item(index, 5).text() Loading @@ -309,17 +336,27 @@ class Ui(QtWidgets.QMainWindow): self.fileList.setCellWidget(index, 2, self.getIconCell(True)) for radio in self.rbTypes: if(self.rb[radio].isChecked()): self.df.loc[item_index, 'morphology'] = radio break else: self.df.loc[item_index, 'morphology'] = utils.getMorphology()[-1] for id, bg in self.rbg.items(): selected = '' if bg.checkedButton() is not None: idChecked = bg.checkedButton().objectName() # refactor rbTypes and rbNames? selected = self.rbTypes[self.rbNames.index(idChecked)] self.df.loc[item_index, id] = selected # for radio in self.rbTypes: # if(self.rb[radio].isChecked()): # self.df.loc[item_index, 'morphology'] = radio # break # else: # self.df.loc[item_index, 'morphology'] = utils.getMorphology()[-1] for column in self.cbColumns: self.df.loc[item_index, column] = self.cb[column].isChecked() self.df.loc[item_index, 'comment'] = self.commentBox.toPlainText().replace('\n', '') for id, tb in self.tb.items(): self.df.loc[item_index, id] = tb.toPlainText().replace('\n', '') # self.df.loc[item_index, 'comment'] = self.commentBox.toPlainText().replace('\n', '') self.fileList.selectRow(index+1) Loading @@ -338,30 +375,45 @@ class Ui(QtWidgets.QMainWindow): item = self.df.loc[self.df['filename'] == fn] self.imgPath = item['fullpath'].item() windowTitle = '' if 'group' in item.keys(): grp = str(item['group'].item()) windowTitle += f"Grp: {grp} | " gal = str(item['galaxy'].item()) self.setWindowTitle('Grp: ' + grp + ' | Gal: ' + gal + ' | ' + self.title) windowTitle += f"Gal: {gal} | {self.title}" self.setWindowTitle(windowTitle) self.fileList.setCellWidget(index, 2, self.getIconCell(item['processed'].item())) self.clear_morphology_rb() for radio in self.rbTypes: if(item['morphology'].item() == radio): self.rb[radio].setChecked(True) # radiobuttons for id, bg in self.rbg.items(): self.clear_ButtonGroup(bg) selected = item[id].item() if selected in self.rbTypes: idChecked = self.rbNames[self.rbTypes.index(selected)] # refactor rbTypes and rbNames? self.rb[selected].setChecked(True) # for radio in self.rbTypes: # if(item['morphology'].item() == radio): # self.rb[radio].setChecked(True) # checkboxes for cb in self.cbColumns: self.cb[cb].setChecked(item[cb].item()) comment = item['comment'].item() if not pd.isnull(comment): self.commentBox.setPlainText(str(comment)) # textboxes for id, tb in self.tb.items(): comment = item[id].item() if pd.notnull(comment): tb.setPlainText(str(comment)) else: self.commentBox.setPlainText('') tb.setPlainText('') # comment = item['comment'].item() # if not pd.isnull(comment): # self.commentBox.setPlainText(str(comment)) # else: # self.commentBox.setPlainText('') except (AttributeError, KeyError): print("WARNING:\tEmpty item") Loading @@ -383,26 +435,26 @@ class Ui(QtWidgets.QMainWindow): self.fileList.selectRow(index-1) def clear_morphology_rb(self): def clear_ButtonGroup(self, bg): # for i, cb in enumerate(self.rbNames): # self.rb[self.rbTypes[i]].setAutoExclusive(False) # self.rb[self.rbTypes[i]].setChecked(False) # self.rb[self.rbTypes[i]].setAutoExclusive(True) if self.gbb.checkedButton() is not None: self.gbb.setExclusive(False) self.gbb.checkedButton().setChecked(False) self.gbb.setExclusive(True) if bg.checkedButton() is not None: bg.setExclusive(False) bg.checkedButton().setChecked(False) bg.setExclusive(True) # Actions helpers def exit(self): QCoreApplication.quit() def toggleAIDVisibility(self): showAllSavedData = self.act_allSavedData.isChecked() def toggleAIDVisibility(self, act): showAllSavedData = act.isChecked() for i in range(self.fileList.rowCount()): row = self.fileList.item(i, 0).text() if (not showAllSavedData) and (int(row) not in self.galaxies): if (not showAllSavedData) and (int(row) not in self.groups): self.fileList.hideRow(i) else: self.fileList.showRow(i) Loading @@ -410,7 +462,7 @@ class Ui(QtWidgets.QMainWindow): # Image helpers: def showImage(self, imageFile): if imageFile: if imageFile and Path.is_file(imageFile): pixmap = QPixmap(str(imageFile)) else: pixmap = QPixmap(str(self.defaultImgPath)) Loading
src/utils.py +1 −1 Original line number Diff line number Diff line Loading @@ -43,7 +43,7 @@ def getOptions(version): args = parser.parse_args() VERSION = version return parser.parse_args() return args def getVersion(): Loading