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(''))
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()