class SelectDialog(QDialog): ''' This dialog creates an input mask for a string list and return selected entries. ''' def __init__(self, items=list(), buttons=QDialogButtonBox.Cancel | QDialogButtonBox.Ok, exclusive=False, preselect_all=False, title='', description='', icon='', parent=None, select_if_single=True, checkitem1='', checkitem2=''): ''' Creates an input dialog. @param items: a list with strings @type items: C{list()} ''' QDialog.__init__(self, parent=parent) self.setObjectName(' - '.join(['SelectDialog', str(items)])) self.verticalLayout = QVBoxLayout(self) self.verticalLayout.setObjectName("verticalLayout") self.verticalLayout.setContentsMargins(1, 1, 1, 1) # add filter row self.filter_frame = QFrame(self) filterLayout = QHBoxLayout(self.filter_frame) filterLayout.setContentsMargins(1, 1, 1, 1) label = QLabel("Filter:", self.filter_frame) self.filter_field = EnchancedLineEdit(self.filter_frame) filterLayout.addWidget(label) filterLayout.addWidget(self.filter_field) self.filter_field.textChanged.connect(self._on_filter_changed) self.verticalLayout.addWidget(self.filter_frame) if description: self.description_frame = QFrame(self) descriptionLayout = QHBoxLayout(self.description_frame) # descriptionLayout.setContentsMargins(1, 1, 1, 1) if icon: self.icon_label = QLabel(self.description_frame) self.icon_label.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed) self.icon_label.setPixmap(QPixmap(icon).scaled(30, 30, Qt.KeepAspectRatio)) descriptionLayout.addWidget(self.icon_label) self.description_label = QLabel(self.description_frame) self.description_label.setWordWrap(True) self.description_label.setText(description) descriptionLayout.addWidget(self.description_label) self.verticalLayout.addWidget(self.description_frame) # create area for the parameter self.content = MainBox(self) if items: self.scroll_area = QScrollArea(self) self.scroll_area.setFocusPolicy(Qt.NoFocus) self.scroll_area.setObjectName("scroll_area") self.scroll_area.setWidgetResizable(True) self.scroll_area.setWidget(self.content) self.verticalLayout.addWidget(self.scroll_area) self.checkitem1 = checkitem1 self.checkitem1_result = False self.checkitem2 = checkitem2 self.checkitem2_result = False # add select all option if not exclusive and items: self._ignore_next_toggle = False self.select_all_checkbox = QCheckBox('all entries') self.select_all_checkbox.setTristate(True) self.select_all_checkbox.stateChanged.connect(self._on_select_all_checkbox_stateChanged) self.verticalLayout.addWidget(self.select_all_checkbox) self.content.toggled.connect(self._on_main_toggle) if self.checkitem1: self.checkitem1_checkbox = QCheckBox(self.checkitem1) self.checkitem1_checkbox.stateChanged.connect(self._on_select_checkitem1_checkbox_stateChanged) self.verticalLayout.addWidget(self.checkitem1_checkbox) if self.checkitem2: self.checkitem2_checkbox = QCheckBox(self.checkitem2) self.checkitem2_checkbox.stateChanged.connect(self._on_select_checkitem2_checkbox_stateChanged) self.verticalLayout.addWidget(self.checkitem2_checkbox) if not items: spacerItem = QSpacerItem(1, 1, QSizePolicy.Expanding, QSizePolicy.Expanding) self.verticalLayout.addItem(spacerItem) # create buttons self.buttonBox = QDialogButtonBox(self) self.buttonBox.setObjectName("buttonBox") self.buttonBox.setOrientation(Qt.Horizontal) self.buttonBox.setStandardButtons(buttons) self.buttonBox.accepted.connect(self.accept) self.buttonBox.rejected.connect(self.reject) self.verticalLayout.addWidget(self.buttonBox) # set the input fields if items: self.content.createFieldsFromValues(items, exclusive) if (select_if_single and len(items) == 1) or preselect_all: self.select_all_checkbox.setCheckState(Qt.Checked) if not items or len(items) < 7: self.filter_frame.setVisible(False) # print '=============== create', self.objectName() # # def __del__(self): # print "************ destroy", self.objectName() def _on_main_toggle(self, state): self._ignore_next_toggle = state != self.select_all_checkbox.checkState() self.select_all_checkbox.setCheckState(state) def _on_select_all_checkbox_stateChanged(self, state): if not self._ignore_next_toggle: self.content.setState(state) self._ignore_next_toggle = False def _on_select_checkitem1_checkbox_stateChanged(self, state): if state == Qt.Checked: self.checkitem1_result = True elif state == Qt.Unchecked: self.checkitem1_result = False def _on_select_checkitem2_checkbox_stateChanged(self, state): if state == Qt.Checked: self.checkitem2_result = True elif state == Qt.Unchecked: self.checkitem2_result = False def _on_filter_changed(self): self.content.filter(self.filter_field.text()) def getSelected(self): return self.content.getSelected() @staticmethod def getValue(title, description='', items=list(), exclusive=False, preselect_all=False, icon='', parent=None, select_if_single=True, checkitem1='', checkitem2=''): selectDia = SelectDialog(items, exclusive=exclusive, preselect_all=preselect_all, description=description, icon=icon, parent=parent, select_if_single=select_if_single, checkitem1=checkitem1, checkitem2=checkitem2) selectDia.setWindowTitle(title) selectDia.resize(480, 256) if selectDia.exec_(): if selectDia.checkitem2: return selectDia.getSelected(), True, selectDia.checkitem1_result, selectDia.checkitem2_result if selectDia.checkitem1: return selectDia.getSelected(), True, selectDia.checkitem1_result return selectDia.getSelected(), True if selectDia.checkitem2: return list(), False, False, False if selectDia.checkitem1: return list(), False, False return list(), False # %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # %%%%%%%%%%%%%%%%%% close handling %%%%%%%%%%%%%%%%%%%%% # %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% def accept(self): self.setResult(QDialog.Accepted) self.hide() def reject(self): self.setResult(QDialog.Rejected) self.hide() def hideEvent(self, event): self.close() def closeEvent(self, event): ''' Test the open files for changes and save this if needed. ''' self.setAttribute(Qt.WA_DeleteOnClose, True) QDialog.closeEvent(self, event)
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 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) } 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.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 not nm.settings( ).ask_reload_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)''' IconEmpty = 0 IconQuestion = 1 IconLaunchFile = 2 IconDefaultCfg = 3 IconNodelet = 4 IconBinary = 5 QuestionInvalid = 0 QuestionNoname = 1 QuestionLaunchFile = 2 QuestionDefaultCfg = 3 QuestionNodelet = 4 QuestionBinary = 5 ICON_SIZE = 32 def __init__(self, parent=None): QFrame.__init__(self, parent=parent) self.setObjectName('MessageFrame') self.questionid = self.QuestionInvalid self.text = "" self.iconid = self.IconEmpty self.data = MessageData(None) self.IMAGES = { 0: QPixmap(), 1: QPixmap(':/icons/crystal_clear_question.png').scaled( self.ICON_SIZE, self.ICON_SIZE, Qt.IgnoreAspectRatio, Qt.SmoothTransformation), 2: QPixmap(':/icons/crystal_clear_launch_file.png').scaled( self.ICON_SIZE, self.ICON_SIZE, Qt.IgnoreAspectRatio, Qt.SmoothTransformation), 3: QPixmap(":/icons/default_cfg.png").scaled(self.ICON_SIZE, self.ICON_SIZE, Qt.IgnoreAspectRatio, Qt.SmoothTransformation), 4: QPixmap(":/icons/crystal_clear_nodelet_q.png").scaled( self.ICON_SIZE, self.ICON_SIZE, Qt.IgnoreAspectRatio, Qt.SmoothTransformation), 5: QPixmap(":/icons/crystal_clear_question.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) self.frameui.setVisible(False) self.frameui.questionOkButton.clicked.connect(self._on_question_ok) self.frameui.questionCancelButton.clicked.connect( self._on_question_cancel) def show_question(self, questionid, text, data=MessageData(None), icon=0): self._new_request = True self.questionid = questionid self.text = text self.iconid = icon self.data = data self.frameui.questionIcon.setPixmap(self.IMAGES[icon]) self.frameui.questionLabel.setText(text) self.frameui.setVisible(True) def hide_question(self): self._new_request = False self.frameui.setVisible(False) self.cancel_signal.emit(self.questionid, self.data) if not self._new_request: self.questionid = 0 def _on_question_ok(self): self._new_request = False self.frameui.setVisible(False) self.accept_signal.emit(self.questionid, self.data) if not self._new_request: self.questionid = 0 def _on_question_cancel(self): self._new_request = False self.frameui.setVisible(False) self.cancel_signal.emit(self.questionid, self.data) if not self._new_request: self.questionid = 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)
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_launch_file_transfer.png").scaled( self.ICON_SIZE, self.ICON_SIZE, Qt.IgnoreAspectRatio, Qt.SmoothTransformation), 7: QPixmap(":/icons/crystal_clear_question.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 if self.questionid != questionid or self.text != text or data != self.data: 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.is_do_not_ask(self.TYPE_NOSCREEN): return 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 is_do_not_ask(self, questionid): try: # is it in the list for not ask again? return self._do_not_ask[questionid] except Exception: return False 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)