Example #1
0
class InfoPanel(QWidget):
    def __init__(self, ctx, *args, **kwargs):
        super(InfoPanel, self).__init__(*args, **kwargs)
        self.ctx = ctx
        self.initVar()
        self.initUI()
        self.sigConnect()
        self.setInfo(self.getInfo())

    def initVar(self):
        self.id = None
        self.name = None
        self.protocol = None
        self.date = QDate.currentDate().toString('yyyyMMdd')
        self.age = -1
        self.sex = None
        self.scanner = None
        self.instn = None

    def sigConnect(self):
        self.name_edit.textChanged.connect(self.on_name_changed)
        self.protocol_edit.textChanged.connect(self.on_protocol_changed)
        self.exam_date_edit.dateChanged.connect(self.on_date_changed)
        self.age_edit.valueChanged.connect(self.on_age_changed)
        self.sex_edit.activated[int].connect(self.on_sex_changed)
        self.scanner_edit.textChanged.connect(self.on_scanner_changed)
        self.instn_edit.textChanged.connect(self.on_instn_changed)
        self.scanner_validator.validationChanged.connect(
            self.on_scanner_validation)

    def initUI(self):
        self.no_edit = QLineEdit()
        self.name_edit = QLineEdit()
        self.protocol_edit = QLineEdit()
        self.exam_date_edit = QDateEdit()
        self.age_edit = QSpinBox()
        self.sex_edit = QComboBox()
        self.instn_edit = QLineEdit()
        self.scanner_edit = QLineEdit()

        reg_ex = QRegExp('.*\-.*')
        self.scanner_validator = RegExpValidator(reg_ex, self.scanner_edit)

        self.scanner_edit.setValidator(self.scanner_validator)
        self.scanner_edit.setAlignment(Qt.AlignLeft)
        self.scanner_edit.setPlaceholderText('Manufacturer-Model')
        self.sex_edit.addItems(['M', 'F', 'Unspecified'])
        self.sex_edit.setPlaceholderText('Unspecified')
        self.sex_edit.setCurrentIndex(2)
        self.exam_date_edit.setDisplayFormat('dd/MM/yyyy')
        self.exam_date_edit.setButtonSymbols(QAbstractSpinBox.NoButtons)
        self.age_edit.setButtonSymbols(QAbstractSpinBox.NoButtons)
        self.age_edit.setSpecialValueText('-')
        self.age_edit.setMinimum(-1)
        self.age_edit.setValue(-1)

        l_layout = QFormLayout()
        l_layout.setVerticalSpacing(1)
        l_layout.addRow(QLabel('ID'), self.no_edit)
        l_layout.addRow(QLabel('Name'), self.name_edit)
        l_layout.addRow(QLabel('Age'), self.age_edit)
        l_layout.addRow(QLabel('Sex'), self.sex_edit)

        r_layout = QFormLayout()
        r_layout.setVerticalSpacing(1)
        r_layout.addRow(QLabel('Exam Date'), self.exam_date_edit)
        r_layout.addRow(QLabel('Institution'), self.instn_edit)
        r_layout.addRow(QLabel('Scanner'), self.scanner_edit)
        r_layout.addRow(QLabel('Protocol'), self.protocol_edit)

        main_layout = QHBoxLayout()
        main_layout.addLayout(l_layout)
        main_layout.addLayout(r_layout)

        self.setLayout(main_layout)
        self.setMaximumHeight(100)
        self.setContentsMargins(0, 0, 0, 0)

    def setInfo(self, pat_info):
        self.id = pat_info['id'] or ''
        self.name = pat_info['name'] or ''
        self.protocol = pat_info['protocol'] or ''
        self.age = pat_info['age'] or -1
        self.sex = pat_info['sex'] or None
        self.date = pat_info['date'] or None
        self.scanner = pat_info['scanner'] or None
        self.instn = pat_info['instn'] or None
        date = QDate.fromString(
            self.date,
            'yyyyMMdd') if self.date is not None else QDate.currentDate()

        self.no_edit.setText(self.id)
        self.name_edit.setText(self.name)
        self.protocol_edit.setText(self.protocol)
        self.age_edit.setValue(self.age)
        self.sex_edit.setCurrentText(
            self.sex if self.sex is not None else self.sex_edit.itemText(2))
        self.exam_date_edit.setDate(date)
        self.scanner_edit.setText(self.scanner)
        self.instn_edit.setText(self.instn)

    def getInfo(self):
        brand = model = None
        if self.scanner:
            brand_model = self.scanner.split('-')
            if len(brand_model) == 2:
                brand = brand_model[0] or None
                model = brand_model[1] or None
        info = {
            'id': self.id or None,
            'name': self.name or None,
            'sex': self.sex or None,
            'age': self.age if self.age >= 0 else None,
            'protocol': self.protocol or None,
            'date': self.date or None,
            'brand': brand,
            'model': model,
            'scanner': self.scanner or None,
            'instn': self.instn or None,
        }
        return info

    def on_name_changed(self):
        self.name = self.name_edit.text()

    def on_date_changed(self):
        self.date = self.exam_date_edit.date().toString('yyyyMMdd')

    def on_age_changed(self):
        self.age = self.age_edit.value()

    def on_sex_changed(self, id):
        self.sex = self.sex_edit.currentText() if id != 2 else None
        print(self.sex)

    def on_protocol_changed(self):
        self.protocol = self.protocol_edit.text()

    def on_instn_changed(self):
        self.instn = self.instn_edit.text()

    def on_scanner_changed(self):
        self.scanner = self.scanner_edit.text()

    def on_scanner_validation(self, state):
        if state == QValidator.Invalid:
            colour = 'red'
        elif state == QValidator.Intermediate:
            colour = 'gold'
        elif state == QValidator.Acceptable:
            colour = 'lime'
        self.scanner_edit.setStyleSheet('border: 3px solid %s' % colour)
        QTimer.singleShot(1000, lambda: self.scanner_edit.setStyleSheet(''))
Example #2
0
class HomeScreen(QMainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setWindowTitle("Home Screen")
        self.resize(550, 461)
        self.setStyleSheet(Hariku_Style.get_window_stylesheet())
        self.centralWidget = QWidget()
        self.setCentralWidget(self.centralWidget)

        self.setupUI()

    def setupUI(self):
        self.setWindowIcon(Hariku_Style.getIcon())

        self.centralwidget = QWidget(self)
        self.setFocus()

        self.gridLayout = QGridLayout(self.centralwidget)
        self.gridLayout.setObjectName("gridLayout")

        self.topcenter_layout = QHBoxLayout()

        spacerItem = QSpacerItem(25, 20, QSizePolicy.MinimumExpanding,
                                 QSizePolicy.Minimum)
        self.topcenter_layout.addItem(spacerItem)

        self.monthFilter = QDateEdit(self.centralwidget)
        self.monthFilter.setCurrentSection(QDateTimeEdit.MonthSection)
        self.monthFilter.setButtonSymbols(QSpinBox.NoButtons)
        self.monthFilter.setDate(datetime.now())
        self.monthFilter.setDisplayFormat("MMMM/yyyy")
        self.monthFilter.setFont(Hariku_Style.get_font(10))
        self.monthFilter.setStyleSheet(Hariku_Style.get_dateedit_stylesheet())
        self.monthFilter.dateChanged.connect(self.filterDiaryByMonth)
        self.topcenter_layout.addWidget(self.monthFilter)

        self.showAllBtn = QPushButton("Remove Filter", self.centralwidget)
        self.showAllBtn.setFont(Hariku_Style.get_font(8))
        self.showAllBtn.clicked.connect(self.getDiaries)
        self.showAllBtn.setStyleSheet(
            Hariku_Style.get_moodBtn_stylesheet("rgb(38, 160, 173)",
                                                "rgb(8, 102, 112)"))
        self.topcenter_layout.addWidget(self.showAllBtn)

        spacerItem1 = QSpacerItem(25, 20, QSizePolicy.MinimumExpanding,
                                  QSizePolicy.Minimum)
        self.topcenter_layout.addItem(spacerItem1)

        self.gridLayout.addLayout(self.topcenter_layout, 1, 0, 1, 1)

        self.bottomLayout = QHBoxLayout()

        spacerItem2 = QSpacerItem(40, 20, QSizePolicy.Expanding,
                                  QSizePolicy.Minimum)
        self.bottomLayout.addItem(spacerItem2)

        self.createBtn = QPushButton("+ Add New Diary", self.centralwidget)
        self.createBtn.setFont(Hariku_Style.get_font(10))
        self.createBtn.clicked.connect(self.addNewDiary)
        self.createBtn.setStyleSheet(
            Hariku_Style.get_moodBtn_stylesheet("rgb(40, 186, 130)",
                                                "rgb(207, 207, 188)"))
        self.bottomLayout.addWidget(self.createBtn)

        self.gridLayout.addLayout(self.bottomLayout, 4, 0, 1, 1)

        self.contentScrollArea = QScrollArea(self.centralwidget)
        self.contentScrollArea.setEnabled(True)
        sizePolicy = QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(
            self.contentScrollArea.sizePolicy().hasHeightForWidth())
        self.contentScrollArea.setSizePolicy(sizePolicy)
        self.contentScrollArea.setStyleSheet(
            Hariku_Style.get_scrollarea_stylesheet())
        self.contentScrollArea.setWidgetResizable(True)
        self.contentScrollArea.setAlignment(QtCore.Qt.AlignLeading
                                            | QtCore.Qt.AlignLeft
                                            | QtCore.Qt.AlignTop)

        self.scrollAreaWidgetContents = QWidget()
        self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 487, 321))
        self.scrollAreaLayout = QVBoxLayout(self.scrollAreaWidgetContents)

        self.getDiaries()

        self.contentScrollArea.setWidget(self.scrollAreaWidgetContents)

        self.gridLayout.addWidget(self.contentScrollArea, 2, 0, 1, 1)

        self.judul = QLabel("\nWelcome Home:)\n", self)
        self.judul.setFont(Hariku_Style.get_font(18))
        self.judul.setAlignment(QtCore.Qt.AlignCenter)
        self.gridLayout.addWidget(self.judul, 0, 0, 1, 1)

        self.setCentralWidget(self.centralwidget)

    def addNewDiary(self):
        dialog = DiaryScreen(self)
        dialog.show()
        self.hide()

    def clearScrollAreaLayout(self):
        # delete the diaries currently showind
        for i in reversed(range(self.scrollAreaLayout.count())):
            try:
                self.scrollAreaLayout.itemAt(i).widget().setParent(None)
            except AttributeError:
                self.scrollAreaLayout.removeItem(
                    self.scrollAreaLayout.itemAt(i))

    def filterDiaryByMonth(self):
        self.clearScrollAreaLayout()

        year = self.monthFilter.date().year()
        month = self.monthFilter.date().month()

        diaries = getDiaryByMonth(year, month)

        for i, diary in enumerate(diaries):
            self.diaryItem = QWidget(self.scrollAreaWidgetContents)
            sizePolicy = QSizePolicy(QSizePolicy.Minimum, QSizePolicy.Fixed)
            sizePolicy.setHeightForWidth(
                self.diaryItem.sizePolicy().hasHeightForWidth())
            self.diaryItem.setSizePolicy(sizePolicy)
            self.diaryItem.setMinimumSize(QtCore.QSize(0, 50))
            self.diaryItem.setStyleSheet(
                "background-color: rgba(227, 217, 163, 100%);\nborder-radius : 10px;"
            )
            self.diaryItem.setObjectName("diaryItem")
            self.itemLayout = QGridLayout(self.diaryItem)

            self.contentDateLayout = QVBoxLayout()
            self.contentDateLayout.setObjectName("contentDateLayout")

            self.content = QLabel(self.truncateString(diary.content),
                                  self.diaryItem)
            self.content.setFont(Hariku_Style.get_font(10))
            self.contentDateLayout.addWidget(self.content)

            self.date = QLabel(
                diary.date.strftime("%d %B %Y") +
                diary.time.strftime("  %I:%M %p"), self.diaryItem)
            self.date.setFont(Hariku_Style.get_font(8))
            self.contentDateLayout.addWidget(self.date)

            self.itemLayout.addLayout(self.contentDateLayout, 0, 0, 1, 1)

            self.buttons.append(i)
            self.buttons[i] = [
                QPushButton("⋗", self.diaryItem),
                QPushButton("×", self.diaryItem)
            ]

            self.buttons[i][0].clicked.connect(
                lambda checked, i=diary.diary_id: self.viewDiaryById(i))
            sizePolicy = QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)
            sizePolicy.setHorizontalStretch(0)
            sizePolicy.setVerticalStretch(0)
            sizePolicy.setHeightForWidth(
                self.buttons[i][0].sizePolicy().hasHeightForWidth())
            self.buttons[i][0].setSizePolicy(sizePolicy)
            self.buttons[i][0].setFont(Hariku_Style.get_font(9))
            self.buttons[i][0].setStyleSheet(
                Hariku_Style.get_moodBtn_stylesheet("rgb(145, 133, 63)",
                                                    "rgb(235, 224, 157)"))
            self.itemLayout.addWidget(self.buttons[i][0], 0, 1, 1, 1)

            # self.deleteBtn = QPushButton("×", self.diaryItem)
            self.buttons[i][1].clicked.connect(
                lambda checked, i=diary.diary_id: self.deleteDiaryById(i))
            sizePolicy = QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)
            sizePolicy.setHorizontalStretch(0)
            sizePolicy.setVerticalStretch(0)
            sizePolicy.setHeightForWidth(
                self.buttons[i][1].sizePolicy().hasHeightForWidth())
            self.buttons[i][1].setSizePolicy(sizePolicy)
            self.buttons[i][1].setFont(Hariku_Style.get_font(9))
            self.buttons[i][1].setStyleSheet(
                Hariku_Style.get_moodBtn_stylesheet("rgb(145, 63, 63)",
                                                    "rgb(235, 157, 157)"))
            self.itemLayout.addWidget(self.buttons[i][1], 0, 2, 1, 1)

            self.scrollAreaLayout.addWidget(self.diaryItem,
                                            alignment=QtCore.Qt.AlignTop)

        spacerItem2 = QSpacerItem(20, 40, QSizePolicy.Minimum,
                                  QSizePolicy.MinimumExpanding)
        self.scrollAreaLayout.addItem(spacerItem2)

    def getDiaries(self):
        diaries = getAllDiaries()

        self.monthFilter.setDate(datetime.now())
        self.clearScrollAreaLayout()

        self.buttons = []

        for i, diary in enumerate(diaries):
            self.diaryItem = QWidget(self.scrollAreaWidgetContents)
            sizePolicy = QSizePolicy(QSizePolicy.Minimum, QSizePolicy.Fixed)
            sizePolicy.setHeightForWidth(
                self.diaryItem.sizePolicy().hasHeightForWidth())
            self.diaryItem.setSizePolicy(sizePolicy)
            self.diaryItem.setMinimumSize(QtCore.QSize(0, 50))
            self.diaryItem.setStyleSheet(
                "background-color: rgba(227, 217, 163, 100%);\nborder-radius : 10px;"
            )
            self.diaryItem.setObjectName("diaryItem")
            self.itemLayout = QGridLayout(self.diaryItem)

            self.contentDateLayout = QVBoxLayout()
            self.contentDateLayout.setObjectName("contentDateLayout")

            self.content = QLabel(self.truncateString(diary.content),
                                  self.diaryItem)
            self.content.setFont(Hariku_Style.get_font(10))
            self.contentDateLayout.addWidget(self.content)

            self.date = QLabel(
                diary.date.strftime("%d %B %Y") +
                diary.time.strftime("  %I:%M %p"), self.diaryItem)
            self.date.setFont(Hariku_Style.get_font(8))
            self.contentDateLayout.addWidget(self.date)

            self.itemLayout.addLayout(self.contentDateLayout, 0, 0, 1, 1)

            self.buttons.append(i)
            self.buttons[i] = [
                QPushButton("⋗", self.diaryItem),
                QPushButton("×", self.diaryItem)
            ]

            self.buttons[i][0].clicked.connect(
                lambda checked, i=diary.diary_id: self.viewDiaryById(i))
            sizePolicy = QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)
            sizePolicy.setHorizontalStretch(0)
            sizePolicy.setVerticalStretch(0)
            sizePolicy.setHeightForWidth(
                self.buttons[i][0].sizePolicy().hasHeightForWidth())
            self.buttons[i][0].setSizePolicy(sizePolicy)
            self.buttons[i][0].setFont(Hariku_Style.get_font(9))
            self.buttons[i][0].setStyleSheet(
                Hariku_Style.get_moodBtn_stylesheet("rgb(145, 133, 63)",
                                                    "rgb(235, 224, 157)"))
            self.itemLayout.addWidget(self.buttons[i][0], 0, 1, 1, 1)

            # self.deleteBtn = QPushButton("×", self.diaryItem)
            self.buttons[i][1].clicked.connect(
                lambda checked, i=diary.diary_id: self.deleteDiaryById(i))
            sizePolicy = QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)
            sizePolicy.setHorizontalStretch(0)
            sizePolicy.setVerticalStretch(0)
            sizePolicy.setHeightForWidth(
                self.buttons[i][1].sizePolicy().hasHeightForWidth())
            self.buttons[i][1].setSizePolicy(sizePolicy)
            self.buttons[i][1].setFont(Hariku_Style.get_font(9))
            self.buttons[i][1].setStyleSheet(
                Hariku_Style.get_moodBtn_stylesheet("rgb(145, 63, 63)",
                                                    "rgb(235, 157, 157)"))
            self.itemLayout.addWidget(self.buttons[i][1], 0, 2, 1, 1)

            self.scrollAreaLayout.addWidget(self.diaryItem,
                                            alignment=QtCore.Qt.AlignTop)

        spacerItem2 = QSpacerItem(20, 40, QSizePolicy.Minimum,
                                  QSizePolicy.MinimumExpanding)
        self.scrollAreaLayout.addItem(spacerItem2)

    def truncateString(self, string):
        try:
            string = string.replace('\n', ' ')
            return string[:45] + '...'
        except IndexError:
            return string

    def viewDiaryById(self, id):
        dialog = DiaryScreen(self, edit=False, id=id)
        dialog.show()
        self.hide()

    def deleteDiaryById(self, id):
        deleteDiaryById(id)
        self.clearScrollAreaLayout()
        self.getDiaries()