class ProjectBlock(QtWidgets.QWidget): """ This class implements the project block displayed in the welcome dialog. """ sgnDeleteProject = QtCore.pyqtSignal(str) sgnOpenProject = QtCore.pyqtSignal(str) def __init__(self, project, parent=None): """ Initialize the project block. :type project: str :type parent: QtWidgets.QWidget """ super().__init__(parent) self.nameLabel = QtWidgets.QLabel(os.path.basename(project), self) self.nameLabel.setContentsMargins(20, 0, 20, 0) self.nameLabel.setProperty('class', 'name') self.nameLabel.setFont(Font('Roboto', 12, bold=True)) self.pathLabel = QtWidgets.QLabel(compressPath(shortPath(project), 34), self) self.pathLabel.setContentsMargins(20, 0, 20, 0) self.pathLabel.setProperty('class', 'path') self.pathLabel.setFont(Font('Roboto', 12)) self.deleteBtn = PHCQPushButton(self) self.deleteBtn.setIcon(QtGui.QIcon(':/icons/24/ic_delete_black')) self.deleteBtn.setVisible( not isSubPath(expandPath('@examples/'), project)) connect(self.deleteBtn.clicked, self.onDeleteButtonClicked) self.leftWidget = QtWidgets.QWidget(self) self.leftWidget.setContentsMargins(0, 0, 0, 0) self.leftLayout = QtWidgets.QVBoxLayout(self.leftWidget) self.leftLayout.setContentsMargins(0, 0, 0, 0) self.leftLayout.setSpacing(0) self.leftLayout.addWidget(self.nameLabel) self.leftLayout.addWidget(self.pathLabel) self.rightWidget = QtWidgets.QWidget(self) self.rightWidget.setContentsMargins(0, 0, 10, 0) self.rightLayout = QtWidgets.QVBoxLayout(self.rightWidget) self.rightLayout.setContentsMargins(0, 0, 0, 0) self.rightLayout.setSpacing(0) self.rightLayout.addWidget(self.deleteBtn) self.mainLayout = QtWidgets.QHBoxLayout(self) self.mainLayout.setContentsMargins(0, 0, 0, 0) self.mainLayout.addWidget(self.leftWidget) self.mainLayout.addWidget(self.rightWidget, 1, QtCore.Qt.AlignRight) self.setContentsMargins(0, 0, 0, 0) self.setFixedHeight(40) self.path = project ############################################# # SLOTS ################################# @QtCore.pyqtSlot() def onDeleteButtonClicked(self): """ Executed when the delete button is clicked. """ self.sgnDeleteProject.emit(self.path) ############################################# # EVENTS ################################# def mouseReleaseEvent(self, mouseEvent): """ Executed when a mouse button is released from this widget. :type mouseEvent: QMouseEvent """ if mouseEvent.button() == QtCore.Qt.LeftButton: self.sgnOpenProject.emit(self.path) def paintEvent(self, paintEvent): """ This is needed for the widget to pick the stylesheet. :type paintEvent: QPaintEvent """ option = QtWidgets.QStyleOption() option.initFrom(self) painter = QtGui.QPainter(self) style = self.style() style.drawPrimitive(QtWidgets.QStyle.PE_Widget, option, painter, self)
class ProjectBlock(QtWidgets.QWidget): """ This class implements the project block displayed in the welcome dialog. """ sgnDeleteProject = QtCore.pyqtSignal(str) sgnOpenProject = QtCore.pyqtSignal(str) sgnRemoveProject = QtCore.pyqtSignal(str) def __init__(self, project, parent=None): """ Initialize the project block. :type project: str :type parent: QtWidgets.QWidget """ super().__init__(parent) self.nameLabel = QtWidgets.QLabel(os.path.basename(project), self) self.nameLabel.setContentsMargins(20, 0, 20, 0) self.nameLabel.setProperty('class', 'name') self.nameLabel.setFont(Font(bold=True)) self.pathLabel = QtWidgets.QLabel(compressPath(shortPath(project), 34), self) self.pathLabel.setContentsMargins(20, 0, 20, 0) self.pathLabel.setProperty('class', 'path') self.removeBtn = PHCQPushButton(self) self.removeBtn.setIcon(QtGui.QIcon(':icons/24/ic_close_black')) self.removeBtn.setToolTip('Remove Project') self.removeBtn.setVisible(False) connect(self.removeBtn.clicked, self.onRemoveButtonClicked) self.deleteBtn = PHCQPushButton(self) self.deleteBtn.setToolTip('Delete Project') self.deleteBtn.setIcon(QtGui.QIcon(':/icons/24/ic_delete_black')) self.deleteBtn.setVisible(False) connect(self.deleteBtn.clicked, self.onDeleteButtonClicked) self.leftWidget = QtWidgets.QWidget(self) self.leftWidget.setContentsMargins(0, 0, 0, 0) self.leftLayout = QtWidgets.QVBoxLayout(self.leftWidget) self.leftLayout.setContentsMargins(0, 0, 0, 0) self.leftLayout.setSpacing(0) self.leftLayout.addWidget(self.nameLabel) self.leftLayout.addWidget(self.pathLabel) self.rightWidget = QtWidgets.QWidget(self) self.rightWidget.setContentsMargins(0, 0, 10, 0) self.rightLayout = QtWidgets.QHBoxLayout(self.rightWidget) self.rightLayout.setContentsMargins(0, 0, 0, 0) self.rightLayout.setSpacing(0) self.rightLayout.addWidget(self.removeBtn) self.rightLayout.addWidget(self.deleteBtn) self.mainLayout = QtWidgets.QHBoxLayout(self) self.mainLayout.setContentsMargins(0, 0, 0, 0) self.mainLayout.addWidget(self.leftWidget) self.mainLayout.addWidget(self.rightWidget, 1, QtCore.Qt.AlignRight) self.installEventFilter(self) self.setContentsMargins(0, 0, 0, 0) self.setCursor(QtCore.Qt.PointingHandCursor) self.setFixedHeight(40) self.setFocusPolicy(QtCore.Qt.TabFocus) self.setToolTip(expandPath(project)) self.path = project ############################################# # SLOTS ################################# @QtCore.pyqtSlot() def onDeleteButtonClicked(self): """ Executed when the delete button is clicked. """ self.sgnDeleteProject.emit(self.path) @QtCore.pyqtSlot() def onRemoveButtonClicked(self): """ Executed when the remove button is clicked. """ self.sgnRemoveProject.emit(self.path) ############################################# # EVENTS ################################# def eventFilter(self, source, event): """ Filters events to show remove and delete buttons only when hovered. :type source: QObject :type event: QtCore.QEvent :rtype: bool """ if event.type() == QtCore.QEvent.HoverEnter: self.removeBtn.setVisible(True) self.deleteBtn.setVisible(faccess(self.path, os.R_OK | os.W_OK)) self.setFocus() elif event.type() == QtCore.QEvent.HoverLeave: self.removeBtn.setVisible(False) self.deleteBtn.setVisible(False) self.clearFocus() elif event.type() == QtCore.QEvent.KeyPress: if event.key() in { QtCore.Qt.Key_Enter, QtCore.Qt.Key_Return, QtCore.Qt.Key_Space }: self.sgnOpenProject.emit(self.path) return super().eventFilter(source, event) def mouseReleaseEvent(self, mouseEvent): """ Executed when a mouse button is released from this widget. :type mouseEvent: QMouseEvent """ if mouseEvent.button() == QtCore.Qt.LeftButton: self.sgnOpenProject.emit(self.path) def paintEvent(self, paintEvent): """ This is needed for the widget to pick the stylesheet. :type paintEvent: QPaintEvent """ option = QtWidgets.QStyleOption() option.initFrom(self) painter = QtGui.QPainter(self) style = self.style() style.drawPrimitive(QtWidgets.QStyle.PE_Widget, option, painter, self)
class ProjectBlock(QtWidgets.QWidget): """ This class implements the project block displayed in the welcome dialog. """ sgnDeleteProject = QtCore.pyqtSignal(str) sgnOpenProject = QtCore.pyqtSignal(str) def __init__(self, project, parent=None): """ Initialize the project block. :type project: str :type parent: QtWidgets.QWidget """ super().__init__(parent) self.nameLabel = QtWidgets.QLabel(os.path.basename(project), self) self.nameLabel.setContentsMargins(20, 0, 20, 0) self.nameLabel.setProperty('class', 'name') self.nameLabel.setFont(Font('Roboto', 12, bold=True)) self.pathLabel = QtWidgets.QLabel(compressPath(shortPath(project), 34), self) self.pathLabel.setContentsMargins(20, 0, 20, 0) self.pathLabel.setProperty('class', 'path') self.pathLabel.setFont(Font('Roboto', 12)) self.deleteBtn = PHCQPushButton(self) self.deleteBtn.setIcon(QtGui.QIcon(':/icons/24/ic_delete_black')) self.deleteBtn.setVisible(not isSubPath(expandPath('@examples/'), project)) connect(self.deleteBtn.clicked, self.onDeleteButtonClicked) self.leftWidget = QtWidgets.QWidget(self) self.leftWidget.setContentsMargins(0, 0, 0, 0) self.leftLayout = QtWidgets.QVBoxLayout(self.leftWidget) self.leftLayout.setContentsMargins(0, 0, 0, 0) self.leftLayout.setSpacing(0) self.leftLayout.addWidget(self.nameLabel) self.leftLayout.addWidget(self.pathLabel) self.rightWidget = QtWidgets.QWidget(self) self.rightWidget.setContentsMargins(0, 0, 10, 0) self.rightLayout = QtWidgets.QVBoxLayout(self.rightWidget) self.rightLayout.setContentsMargins(0, 0, 0, 0) self.rightLayout.setSpacing(0) self.rightLayout.addWidget(self.deleteBtn) self.mainLayout = QtWidgets.QHBoxLayout(self) self.mainLayout.setContentsMargins(0, 0, 0, 0) self.mainLayout.addWidget(self.leftWidget) self.mainLayout.addWidget(self.rightWidget, 1, QtCore.Qt.AlignRight) self.setContentsMargins(0, 0, 0, 0) self.setFixedHeight(40) self.path = project ############################################# # SLOTS ################################# @QtCore.pyqtSlot() def onDeleteButtonClicked(self): """ Executed when the delete button is clicked. """ self.sgnDeleteProject.emit(self.path) ############################################# # EVENTS ################################# def mouseReleaseEvent(self, mouseEvent): """ Executed when a mouse button is released from this widget. :type mouseEvent: QMouseEvent """ if mouseEvent.button() == QtCore.Qt.LeftButton: self.sgnOpenProject.emit(self.path) def paintEvent(self, paintEvent): """ This is needed for the widget to pick the stylesheet. :type paintEvent: QPaintEvent """ option = QtWidgets.QStyleOption() option.initFrom(self) painter = QtGui.QPainter(self) style = self.style() style.drawPrimitive(QtWidgets.QStyle.PE_Widget, option, painter, self)