Beispiel #1
0
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 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)
Beispiel #6
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)