class MessageFrame(QFrame): accept_signal = Signal(int, MessageData) ''' @ivar: A signal on accept button clicked (id, data)''' cancel_signal = Signal(int, MessageData) ''' @ivar: A signal on cancel button clicked (id, data)''' TYPE_INVALID = 0 TYPE_EMPTY = 1 TYPE_QUESTION = 2 TYPE_LAUNCH_FILE = 3 TYPE_DEFAULT_CFG = 4 TYPE_NODELET = 5 TYPE_TRANSFER = 6 TYPE_BINARY = 7 TYPE_NOSCREEN = 8 ICON_SIZE = 32 def __init__(self, parent=None, info=False): QFrame.__init__(self, parent=parent) self.setObjectName('MessageFrame') self.questionid = self.TYPE_INVALID self.text = "" self.data = MessageData(None) self.IMAGES = { 1: QPixmap(), 2: QPixmap(':/icons/crystal_clear_question.png').scaled( self.ICON_SIZE, self.ICON_SIZE, Qt.IgnoreAspectRatio, Qt.SmoothTransformation), 3: QPixmap(':/icons/crystal_clear_launch_file.png').scaled( self.ICON_SIZE, self.ICON_SIZE, Qt.IgnoreAspectRatio, Qt.SmoothTransformation), 4: QPixmap(":/icons/default_cfg.png").scaled(self.ICON_SIZE, self.ICON_SIZE, Qt.IgnoreAspectRatio, Qt.SmoothTransformation), 5: QPixmap(":/icons/crystal_clear_nodelet_q.png").scaled( self.ICON_SIZE, self.ICON_SIZE, Qt.IgnoreAspectRatio, Qt.SmoothTransformation), 6: QPixmap(":/icons/crystal_clear_question.png").scaled( self.ICON_SIZE, self.ICON_SIZE, Qt.IgnoreAspectRatio, Qt.SmoothTransformation), 7: QPixmap(":/icons/crystal_clear_launch_file_transfer.png").scaled( self.ICON_SIZE, self.ICON_SIZE, Qt.IgnoreAspectRatio, Qt.SmoothTransformation), 8: QPixmap(":/icons/crystal_clear_no_io.png").scaled( self.ICON_SIZE, self.ICON_SIZE, Qt.IgnoreAspectRatio, Qt.SmoothTransformation) } self._new_request = False self.frameui = QFrame() ui_file = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'MessageFrame.ui') loadUi(ui_file, self.frameui) color = QColor(255, 207, 121) self.frameui.setVisible(False) self.frameui.scrollArea.setVisible(False) self.frameui.questionOkButton.clicked.connect(self._on_question_ok) self.frameui.questionCancelButton.clicked.connect( self._on_question_cancel) self.frameui.checkBox_dnaa.stateChanged.connect( self._on_checkbox_state_changed) self._ask = 'ask' if info: color = QColor(232, 104, 80) self.frameui.questionCancelButton.setVisible(False) self._ask = 'show' bg_style = "QFrame#questionFame { background-color: %s;}" % color.name( ) self.frameui.setStyleSheet("%s" % (bg_style)) self._queue = MessageQueue() self._do_not_ask = {} def show_question(self, questionid, text, data=MessageData(None), color=None): if questionid == 0: return if color is not None: bg_style = "QFrame#questionFame { background-color: %s;}" % color.name( ) self.frameui.setStyleSheet("%s" % (bg_style)) try: # is it in the list for not ask again? if self._do_not_ask[questionid]: self.accept_signal.emit(questionid, data) else: self.cancel_signal.emit(questionid, data) return except Exception: pass self._queue.add(questionid, text, data) if self.questionid == self.TYPE_INVALID: self._new_request = self._read_next_item() self._frameui_4_request(self._new_request) if self.questionid == self.TYPE_NODELET: self.frameui.checkBox_dnaa.setText("don't %s again, never!" % self._ask) else: self.frameui.checkBox_dnaa.setText( "don't %s again, for session" % self._ask) def add_info_no_screen(self, nodename): if self.questionid == self.TYPE_NOSCREEN: self.data.data.append(nodename) self.frameui.scrollAreaLayout.addWidget(QLabel(nodename)) else: self._queue.add(self.TYPE_NOSCREEN, '', MessageData([nodename])) if self.questionid == self.TYPE_INVALID: self._new_request = self._read_next_item() self._frameui_4_request(self._new_request) def hide_question(self, questionids): if self.questionid in questionids: self._new_request = False self.frameui.setVisible(False) self.cancel_signal.emit(self.questionid, self.data) self.questionid = 0 self._clear_scroll_area() self._new_request = self._read_next_item() self._frameui_4_request(self._new_request) def _frameui_4_request(self, request): if request: self.frameui.checkBox_dnaa.setChecked(False) self.frameui.setVisible(True) self.frameui.scrollArea.setVisible( self.frameui.scrollAreaLayout.count() > 0) else: self.questionid = 0 self.frameui.setVisible(False) self.frameui.scrollArea.setVisible(False) def _on_question_ok(self): if self.frameui.checkBox_dnaa.isChecked(): # save the decision self._do_not_ask[self.questionid] = True self._new_request = False self.frameui.setVisible(False) self.accept_signal.emit(self.questionid, self.data) self.questionid = 0 self._clear_scroll_area() self._new_request = self._read_next_item() self._frameui_4_request(self._new_request) def _on_question_cancel(self): if self.frameui.checkBox_dnaa.isChecked(): if self.questionid == self.QuestionNodelet: nm.settings().check_for_nodelets_at_start = False else: # save the decision self._do_not_ask[self.questionid] = False self._new_request = False self.frameui.setVisible(False) self.cancel_signal.emit(self.questionid, self.data) self.questionid = 0 self._clear_scroll_area() self._new_request = self._read_next_item() self._frameui_4_request(self._new_request) def _is_launch_data_in_queue(self, newdata): for _, data, _ in self._queue_launchfile: if data == newdata: return True return False def _is_transfer_data_in_queue(self, newdata): for _, data, _ in self._queue_transfer_files: if data == newdata: return True return False def _is_other_data_in_queue(self, questionid, text, data): for cqid, ctxt, cd, _ in self._queue_other: if cqid == questionid and cd == data and ctxt == text: return True return False def _read_next_item(self): (qid, text, data) = self._queue.get() if qid == self.TYPE_NOSCREEN: self.questionid = self.TYPE_NOSCREEN self.text = 'No screens found! See log for details!<br>The following nodes are affected:' self.data = data self.frameui.questionIcon.setPixmap(self.IMAGES[qid]) self.frameui.questionLabel.setText(self.text) for nodename in data.data: self.frameui.scrollAreaLayout.addWidget(QLabel(nodename)) self.frameui.scrollArea.setVisible(True) elif qid != self.TYPE_INVALID: self.questionid = qid self.text = text self.data = data self.frameui.questionIcon.setPixmap(self.IMAGES[qid]) self.frameui.questionLabel.setText(text) return qid != self.TYPE_INVALID def _on_checkbox_state_changed(self, state): if state: if self.questionid == self.TYPE_NODELET: self.frameui.questionOkButton.setVisible(False) else: self.frameui.questionOkButton.setVisible(True) def _clear_scroll_area(self): child = self.frameui.scrollAreaLayout.takeAt(0) while child: child.widget().setParent(None) del child child = self.frameui.scrollAreaLayout.takeAt(0)
class MessageFrame(QFrame): accept_signal = Signal(int, MessageData) ''' @ivar: A signal on accept button clicked (id, data)''' cancel_signal = Signal(int, MessageData) ''' @ivar: A signal on cancel button clicked (id, data)''' TYPE_INVALID = 0 TYPE_EMPTY = 1 TYPE_QUESTION = 2 TYPE_LAUNCH_FILE = 3 TYPE_DEFAULT_CFG = 4 TYPE_NODELET = 5 TYPE_TRANSFER = 6 TYPE_BINARY = 7 TYPE_NOSCREEN = 8 TYPE_NMD = 9 TYPE_NODE_CFG = 10 ICON_SIZE = 32 def __init__(self, parent=None, info=False): QFrame.__init__(self, parent=parent) self.setObjectName('MessageFrame') self.questionid = self.TYPE_INVALID self.text = "" self.data = MessageData(None) self.IMAGES = { 1: QPixmap(), 2: QPixmap(':/icons/question.png').scaled(self.ICON_SIZE, self.ICON_SIZE, Qt.IgnoreAspectRatio, Qt.SmoothTransformation), 3: QPixmap(':/icons/crystal_clear_launch_file.png').scaled( self.ICON_SIZE, self.ICON_SIZE, Qt.IgnoreAspectRatio, Qt.SmoothTransformation), 4: QPixmap(":/icons/default_cfg.png").scaled(self.ICON_SIZE, self.ICON_SIZE, Qt.IgnoreAspectRatio, Qt.SmoothTransformation), 5: QPixmap(":/icons/crystal_clear_nodelet_q.png").scaled( self.ICON_SIZE, self.ICON_SIZE, Qt.IgnoreAspectRatio, Qt.SmoothTransformation), 6: QPixmap(":/icons/crystal_clear_launch_file_transfer.png").scaled( self.ICON_SIZE, self.ICON_SIZE, Qt.IgnoreAspectRatio, Qt.SmoothTransformation), 7: QPixmap(":/icons/crystal_clear_binary.png").scaled( self.ICON_SIZE, self.ICON_SIZE, Qt.IgnoreAspectRatio, Qt.SmoothTransformation), 8: QPixmap(":/icons/crystal_clear_no_io.png").scaled( self.ICON_SIZE, self.ICON_SIZE, Qt.IgnoreAspectRatio, Qt.SmoothTransformation), 9: QPixmap(":/icons/crystal_clear_run_zeroconf.png").scaled( self.ICON_SIZE, self.ICON_SIZE, Qt.IgnoreAspectRatio, Qt.SmoothTransformation), 10: QPixmap(":/icons/sekkyumu_restart.png").scaled( self.ICON_SIZE, self.ICON_SIZE, Qt.IgnoreAspectRatio, Qt.SmoothTransformation) } self._new_request = False self.frameui = QFrame() ui_file = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'MessageFrame.ui') loadUi(ui_file, self.frameui) color = QColor(255, 207, 121) self.frameui.listLabel.setTextInteractionFlags( Qt.TextSelectableByMouse) self.frameui.questionLabel.setTextInteractionFlags( Qt.TextSelectableByMouse) self.frameui.setVisible(False) self.frameui.listLabel.setVisible(False) self.frameui.questionOkButton.clicked.connect(self._on_question_ok) self.frameui.questionCancelButton.clicked.connect( self._on_question_cancel) self.frameui.checkBox_dnaa.stateChanged.connect( self._on_checkbox_state_changed) self._ask = 'ask' if info: color = QColor(232, 104, 80) self.frameui.questionCancelButton.setVisible(False) self._ask = 'show' bg_style = "QFrame#questionFame { background-color: %s;}" % color.name( ) self.frameui.setStyleSheet("%s" % (bg_style)) self._queue = MessageQueue() self._do_not_ask = {} def show_question(self, questionid, text, data=MessageData(None), color=None): if questionid == 0: return try: if questionid == self.TYPE_LAUNCH_FILE and nm.settings( ).autoreload_launch: self.accept_signal.emit(questionid, data) return # is it in the list for not ask again? if self._do_not_ask[questionid] == 1: self.accept_signal.emit(questionid, data) elif self._do_not_ask[questionid] == 0: self.cancel_signal.emit(questionid, data) return except Exception: pass if self.questionid != questionid or self.text != text or data != self.data: self._queue.add(questionid, text, data) elif data.data_list: # same question again # update the list of files or nodes which causes this question in current question for dt in data.data_list: if dt not in self.data.data_list: self.data.data_list.append(dt) self._update_list_label(self.data.data_list) # if no question is active pop first element from the queue if self.questionid == self.TYPE_INVALID: self._new_request = self._read_next_item() self._frameui_4_request(self._new_request) if self.questionid in [self.TYPE_NODELET, self.TYPE_NOSCREEN]: self.frameui.checkBox_dnaa.setText("don't %s again, never!" % self._ask) else: self.frameui.checkBox_dnaa.setText( "don't %s again, for session" % self._ask) def show_info(self, infoid, text, data=MessageData(None), color=None): self.show_question(infoid, text=text, data=data, color=color) def is_do_not_ask(self, questionid): try: # is it in the list for not ask again? return self._do_not_ask[questionid] in [0, 1] except Exception: return False def hide_question(self, questionids): for qid in questionids: self._queue.remove(qid) if self.questionid in questionids: self._new_request = False self.frameui.setVisible(False) self.cancel_signal.emit(self.questionid, self.data) self.questionid = 0 self._update_list_label([]) self._new_request = self._read_next_item() self._frameui_4_request(self._new_request) def _update_list_label(self, items=[]): ''' Put list elements into the list label in the question frame ''' if items: self.frameui.listLabel.setText('') for item in items: ltext = self.frameui.listLabel.text() if ltext: self.frameui.listLabel.setText( "%s, %s" % (ltext, HTMLDelegate.toHTML(item))) else: self.frameui.listLabel.setText("%s" % (HTMLDelegate.toHTML(item))) self.frameui.listLabel.setVisible(True) else: self.frameui.listLabel.setText('') self.frameui.listLabel.setVisible(False) def _frameui_4_request(self, request): if request: self.frameui.checkBox_dnaa.setChecked(False) self.frameui.setVisible(True) self.frameui.listLabel.setVisible(True) else: self.questionid = 0 self.frameui.setVisible(False) self.frameui.listLabel.setVisible(False) def _on_question_ok(self): self._new_request = False self.frameui.setVisible(False) try: # set action for do not ask again if self.frameui.checkBox_dnaa.isChecked(): self._do_not_ask[self.questionid] = 1 except Exception: pass self.accept_signal.emit(self.questionid, self.data) self.questionid = 0 self._update_list_label([]) self._new_request = self._read_next_item() self._frameui_4_request(self._new_request) def _on_question_cancel(self): self._new_request = False self.frameui.setVisible(False) try: # set action for do not ask again if self.frameui.checkBox_dnaa.isChecked(): self._do_not_ask[self.questionid] = 0 except Exception: pass self.cancel_signal.emit(self.questionid, self.data) self.questionid = 0 self._update_list_label([]) self._new_request = self._read_next_item() self._frameui_4_request(self._new_request) def _is_launch_data_in_queue(self, newdata): for _, data, _ in self._queue_launchfile: if data == newdata: return True return False def _is_transfer_data_in_queue(self, newdata): for _, data, _ in self._queue_transfer_files: if data == newdata: return True return False def _is_other_data_in_queue(self, questionid, text, data): for cqid, ctxt, cd, _ in self._queue_other: if cqid == questionid and cd == data and ctxt == text: return True return False def _read_next_item(self): (qid, text, data) = self._queue.get() if qid != self.TYPE_INVALID: self.questionid = qid self.text = text self.data = data self.frameui.questionIcon.setPixmap(self.IMAGES[qid]) self.frameui.questionLabel.setText(text) self._update_list_label(self.data.data_list) return qid != self.TYPE_INVALID def _on_checkbox_state_changed(self, state): if self.questionid == self.TYPE_NODELET: self.frameui.questionOkButton.setVisible(not state) nm.settings().check_for_nodelets_at_start = not state elif self.questionid == self.TYPE_NOSCREEN: self.frameui.questionCancelButton.setVisible(not state) nm.settings().show_noscreen_error = not state def _clear_scroll_area(self): child = self.frameui.scrollAreaLayout.takeAt(0) while child: child.widget().setParent(None) del child child = self.frameui.scrollAreaLayout.takeAt(0)
class MessageFrame(QFrame): accept_signal = Signal(int, MessageData) ''' @ivar: A signal on accept button clicked (id, data)''' cancel_signal = Signal(int, MessageData) ''' @ivar: A signal on cancel button clicked (id, data)''' TYPE_INVALID = 0 TYPE_EMPTY = 1 TYPE_QUESTION = 2 TYPE_LAUNCH_FILE = 3 TYPE_DEFAULT_CFG = 4 TYPE_NODELET = 5 TYPE_TRANSFER = 6 TYPE_BINARY = 7 TYPE_NOSCREEN = 8 ICON_SIZE = 32 def __init__(self, parent=None, info=False): QFrame.__init__(self, parent=parent) self.setObjectName('MessageFrame') self.questionid = self.TYPE_INVALID self.text = "" self.data = MessageData(None) self.IMAGES = {1: QPixmap(), 2: QPixmap(':/icons/crystal_clear_question.png').scaled(self.ICON_SIZE, self.ICON_SIZE, Qt.IgnoreAspectRatio, Qt.SmoothTransformation), 3: QPixmap(':/icons/crystal_clear_launch_file.png').scaled(self.ICON_SIZE, self.ICON_SIZE, Qt.IgnoreAspectRatio, Qt.SmoothTransformation), 4: QPixmap(":/icons/default_cfg.png").scaled(self.ICON_SIZE, self.ICON_SIZE, Qt.IgnoreAspectRatio, Qt.SmoothTransformation), 5: QPixmap(":/icons/crystal_clear_nodelet_q.png").scaled(self.ICON_SIZE, self.ICON_SIZE, Qt.IgnoreAspectRatio, Qt.SmoothTransformation), 6: QPixmap(":/icons/crystal_clear_question.png").scaled(self.ICON_SIZE, self.ICON_SIZE, Qt.IgnoreAspectRatio, Qt.SmoothTransformation), 7: QPixmap(":/icons/crystal_clear_launch_file_transfer.png").scaled(self.ICON_SIZE, self.ICON_SIZE, Qt.IgnoreAspectRatio, Qt.SmoothTransformation), 8: QPixmap(":/icons/crystal_clear_no_io.png").scaled(self.ICON_SIZE, self.ICON_SIZE, Qt.IgnoreAspectRatio, Qt.SmoothTransformation) } self._new_request = False self.frameui = QFrame() ui_file = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'MessageFrame.ui') loadUi(ui_file, self.frameui) color = QColor(255, 207, 121) self.frameui.setVisible(False) self.frameui.scrollArea.setVisible(False) self.frameui.questionOkButton.clicked.connect(self._on_question_ok) self.frameui.questionCancelButton.clicked.connect(self._on_question_cancel) self.frameui.checkBox_dnaa.stateChanged.connect(self._on_checkbox_state_changed) self._ask = 'ask' if info: color = QColor(232, 104, 80) self.frameui.questionCancelButton.setVisible(False) self._ask = 'show' bg_style = "QFrame#questionFame { background-color: %s;}" % color.name() self.frameui.setStyleSheet("%s" % (bg_style)) self._queue = MessageQueue() self._do_not_ask = {} def show_question(self, questionid, text, data=MessageData(None), color=None): if questionid == 0: return if color is not None: bg_style = "QFrame#questionFame { background-color: %s;}" % color.name() self.frameui.setStyleSheet("%s" % (bg_style)) try: # is it in the list for not ask again? if self._do_not_ask[questionid]: self.accept_signal.emit(questionid, data) else: self.cancel_signal.emit(questionid, data) return except Exception: pass self._queue.add(questionid, text, data) if self.questionid == self.TYPE_INVALID: self._new_request = self._read_next_item() self._frameui_4_request(self._new_request) if self.questionid == self.TYPE_NODELET: self.frameui.checkBox_dnaa.setText("don't %s again, never!" % self._ask) else: self.frameui.checkBox_dnaa.setText("don't %s again, for session" % self._ask) def add_info_no_screen(self, nodename): if self.questionid == self.TYPE_NOSCREEN: self.data.data.append(nodename) self.frameui.scrollAreaLayout.addWidget(QLabel(nodename)) else: self._queue.add(self.TYPE_NOSCREEN, '', MessageData([nodename])) if self.questionid == self.TYPE_INVALID: self._new_request = self._read_next_item() self._frameui_4_request(self._new_request) def hide_question(self, questionids): if self.questionid in questionids: self._new_request = False self.frameui.setVisible(False) self.cancel_signal.emit(self.questionid, self.data) self.questionid = 0 self._clear_scroll_area() self._new_request = self._read_next_item() self._frameui_4_request(self._new_request) def _frameui_4_request(self, request): if request: self.frameui.checkBox_dnaa.setChecked(False) self.frameui.setVisible(True) self.frameui.scrollArea.setVisible(self.frameui.scrollAreaLayout.count() > 0) else: self.questionid = 0 self.frameui.setVisible(False) self.frameui.scrollArea.setVisible(False) def _on_question_ok(self): if self.frameui.checkBox_dnaa.isChecked(): # save the decision self._do_not_ask[self.questionid] = True self._new_request = False self.frameui.setVisible(False) self.accept_signal.emit(self.questionid, self.data) self.questionid = 0 self._clear_scroll_area() self._new_request = self._read_next_item() self._frameui_4_request(self._new_request) def _on_question_cancel(self): if self.frameui.checkBox_dnaa.isChecked(): if self.questionid == self.QuestionNodelet: nm.settings().check_for_nodelets_at_start = False else: # save the decision self._do_not_ask[self.questionid] = False self._new_request = False self.frameui.setVisible(False) self.cancel_signal.emit(self.questionid, self.data) self.questionid = 0 self._clear_scroll_area() self._new_request = self._read_next_item() self._frameui_4_request(self._new_request) def _is_launch_data_in_queue(self, newdata): for _, data, _ in self._queue_launchfile: if data == newdata: return True return False def _is_transfer_data_in_queue(self, newdata): for _, data, _ in self._queue_transfer_files: if data == newdata: return True return False def _is_other_data_in_queue(self, questionid, text, data): for cqid, ctxt, cd, _ in self._queue_other: if cqid == questionid and cd == data and ctxt == text: return True return False def _read_next_item(self): (qid, text, data) = self._queue.get() if qid == self.TYPE_NOSCREEN: self.questionid = self.TYPE_NOSCREEN self.text = 'No screens found! See log for details!<br>The following nodes are affected:' self.data = data self.frameui.questionIcon.setPixmap(self.IMAGES[qid]) self.frameui.questionLabel.setText(self.text) for nodename in data.data: self.frameui.scrollAreaLayout.addWidget(QLabel(nodename)) self.frameui.scrollArea.setVisible(True) elif qid != self.TYPE_INVALID: self.questionid = qid self.text = text self.data = data self.frameui.questionIcon.setPixmap(self.IMAGES[qid]) self.frameui.questionLabel.setText(text) return qid != self.TYPE_INVALID def _on_checkbox_state_changed(self, state): if state: if self.questionid == self.TYPE_NODELET: self.frameui.questionOkButton.setVisible(False) else: self.frameui.questionOkButton.setVisible(True) def _clear_scroll_area(self): child = self.frameui.scrollAreaLayout.takeAt(0) while child: child.widget().setParent(None) del child child = self.frameui.scrollAreaLayout.takeAt(0)