Commit 3e450981 authored by Andoni Jimenez's avatar Andoni Jimenez
Browse files

Reorder/rename some func/params. Delete from self not needed pars. Save...

Reorder/rename some func/params. Delete from self not needed pars. Save widgets dynamically. Radiobuttons ischecked from buttongroup. Refactor textbox.
parent c2bb6a05
Loading
Loading
Loading
Loading
+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,
+151 −99
Original line number Diff line number Diff line
@@ -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:
@@ -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():
@@ -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():
@@ -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 
@@ -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)
@@ -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)
@@ -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")
                
@@ -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')
@@ -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:
@@ -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()
@@ -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)

@@ -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")
@@ -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)
@@ -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))
+1 −1
Original line number Diff line number Diff line
@@ -43,7 +43,7 @@ def getOptions(version):

    args = parser.parse_args()
    VERSION = version
    return parser.parse_args()
    return args


def getVersion():