Commit e36d755e authored by Andoni Jimenez's avatar Andoni Jimenez
Browse files

Add config file & create widgets from config file

parent cd522c5a
Loading
Loading
Loading
Loading
+168 −2
Original line number Diff line number Diff line
@@ -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):
@@ -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,
@@ -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]
@@ -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