Example #1
0
    def __init__(self, window, fragment=None, parent=None):
        """
            @param window [NulogMainWindow] the window where we edit fragment
            @param fragment [Fragment] the edited fragment
        """

        QDialog.__init__(self, parent)
        self.ui = Ui_AddFragDialog()
        self.ui.setupUi(self)

        self.window = window
        self.compatibility = window.user_settings.compatibility
        self.fragment = fragment
        self.is_new = not fragment
        self.args = []
        self.background_color = None
        self.last_firewall = None

        self.connectSignals()
Example #2
0
class AddFragDialog(QDialog):
    def __init__(self, window, fragment=None, parent=None):
        """
            @param window [NulogMainWindow] the window where we edit fragment
            @param fragment [Fragment] the edited fragment
        """

        QDialog.__init__(self, parent)
        self.ui = Ui_AddFragDialog()
        self.ui.setupUi(self)

        self.window = window
        self.compatibility = window.user_settings.compatibility
        self.fragment = fragment
        self.is_new = not fragment
        self.args = []
        self.background_color = None
        self.last_firewall = None

        self.connectSignals()

    def connectSignals(self):
        self.connect(self.ui.type, SIGNAL('currentIndexChanged(int)'), self.typeChanged)
        self.connect(self.ui.color_button, SIGNAL('clicked(bool)'), self.colorChanged)

    def colorChanged(self, ok):
        color = QColorDialog.getColor(QColor(self.fragment.background_color))

        # user cancelled
        if not color.isValid():
            return

        # remove the alpha channel
        self.background_color = color.rgb() & 0x00ffffff
        self.ui.color.setStyleSheet('background-color: rgb(%d, %d, %d)' % (color.red(), color.green(), color.blue()))

    def typeChanged(self, index):
        """
            Type is changed, index is the new selected index
        """

        self.ui.view.clear()

        # If nothing is selected
        if index < 0:
            self.ui.title_label.setEnabled(False)
            self.ui.title.setEnabled(False)
            self.ui.title.setText('')
            self.ui.view_label.hide()
            self.ui.view.hide()
            self.ui.color_label.setEnabled(False)
            self.ui.color_button.setEnabled(False)
            self.ui.firewall.setEnabled(False)
            self.ui.firewall_label.setEnabled(False)
            self.ui.buttonBox.button(QDialogButtonBox.Ok).setEnabled(False)
            self._set_args(False)
            return

        fragtypename = unicode(self.ui.type.itemData(index).toString())
        fragtype = frag_types[fragtypename]
        if not self.fragment or self.fragment.type != fragtypename:
#            self.window.user_settings.removeFragment(self.fragment)
            self.fragment = self.window.user_settings.createFragment(fragtypename, False)

        self.ui.title_label.setEnabled(True)
        self.ui.title.setEnabled(True)
        self.ui.title.setText(fragtype.title)
        self.ui.view_label.setEnabled(True)
        self.ui.view.setEnabled(True)
        self.ui.color_label.setEnabled(True)
        self.ui.color_button.setEnabled(True)
        self.ui.firewall.setEnabled(True)
        self.ui.firewall_label.setEnabled(True)

        # Add views related to this fragment type.
        for view in fragtype.views:
#            if not views_list.has_key(view):
#                continue
            if not isinstance(view, GraphicsView):
                continue
#            self.ui.view.addItem(views_list[view].name(), QVariant(view))
            self.ui.view.addItem(view.name(), QVariant(view))

        if len(fragtype.views) > 1:
            self.ui.view_label.show()
            self.ui.view.show()
        else:
            self.ui.view_label.hide()
            self.ui.view.hide()

        # Set the fragment background color
        color = QColor(self.fragment.background_color)
        self.ui.color.setStyleSheet('background-color: rgb(%d, %d, %d)' % (color.red(), color.green(), color.blue()))

        # Firewall
        i = self.ui.firewall.findData(QVariant(self.fragment.firewall))
        self.ui.firewall.setCurrentIndex(i)

        self._set_args()

        self.ui.buttonBox.button(QDialogButtonBox.Ok).setEnabled(True)

    def firewallChanged(self, i):
        if i < 0:
            return

        self.fragment.firewall = unicode(self.ui.firewall.itemData(i).toString())
        self._set_args()

    def _set_args(self, fetch=True):
        for arg_checkbox, arg_value in self.args:
            if arg_checkbox:
                self.ui.args.layout().removeWidget(arg_checkbox)
                arg_checkbox.hide()
            if arg_value:
                self.ui.args.layout().removeWidget(arg_value)
                arg_value.hide()
        self.args = []

        if not fetch:
            self.ui.args.setEnabled(False)
            return

        # Show arguments availables for this fragment type.
        try:
            args = frag_types[self.fragment.type].fetcher(self.fragment, {}, self.window.client).getArgs()
        except:
            args = {}

        if not args:
            self.ui.args.setEnabled(False)
            return

        self.ui.args.setEnabled(True)
        for arg in args:

            value = ''
            # There is already a value for this argument.
            if self.fragment.args.has_key(arg):
                value = self.fragment.args[arg]

            # Get the widget which will be used
            try:
                arg_value = arg_types[arg].filter(self.window.client, arg, value, compatibility=self.compatibility)
            except KeyError:
                continue
            if not isinstance(arg_value, QWidget):
                continue

            # Add a checkbox to activate or no this argument.
            arg_checkbox = QCheckBox(arg_types[arg].label)
            if not (value is None or value == ''):
                arg_checkbox.setChecked(True)
                arg_value.setEnabled(True)
            else:
                arg_checkbox.setChecked(False)
                arg_value.setEnabled(False)
            self.connect(arg_checkbox, SIGNAL('toggled(bool)'), arg_value.setEnabled)

            self.ui.args.layout().addWidget(arg_checkbox, len(self.args), 0)
            self.ui.args.layout().addWidget(arg_value, len(self.args), 1)

            self.args += [(arg_checkbox, arg_value)]

    def run(self):
        """
            Run the dialog box and add a fragment to it if fragment=None.
            In other case, we edit it.

        """
        if self.window.client.call('CORE', 'hasComponent', 'multisite_master'):
            firewalls = self.window.client.call('multisite_master', 'listFirewalls')
            self.ui.firewall.addItem(self.tr('EMF appliance'), QVariant(''))
            for fw, state, error, last_seen, ip in firewalls:
                self.ui.firewall.addItem(unicode(self.tr('Host firewall: %s')) % fw, QVariant(fw))
            self.connect(self.ui.firewall, SIGNAL('currentIndexChanged(int)'), self.firewallChanged)
        else:
            self.ui.firewall.hide()
            self.ui.firewall_label.hide()

        if not self.is_new:
            self.ui.type.addItem('%s - %s' % (self.fragment.type, self.tr(frag_types[self.fragment.type].title.encode("UTF-8"))), QVariant(self.fragment.type))
            self.ui.type.setEnabled(False)
            self.ui.type_label.setEnabled(False)

            self.ui.title.setText(self.fragment.title)

            index = self.ui.view.findData(QVariant(self.fragment.view))
            self.ui.view.setCurrentIndex(index)

            index = self.ui.firewall.findData(QVariant(self.fragment.firewall))
            self.ui.firewall.setCurrentIndex(index)
            self.last_firewall = self.fragment.firewall

            self.setWindowTitle(self.tr('Edit a fragment'))
        else:
            types = frag_types.items()
            types.sort()
            for label, frag in types:
                self.ui.type.addItem('%s - %s' % (label, tr(str(frag.title))), QVariant(label))

            self.ui.type.setCurrentIndex(-1)

        while 1:
            if not self.exec_() or not self.fragment:
                if self.fragment:
                    if not self.last_firewall is None:
                        self.fragment.firewall = self.last_firewall
                    if self.is_new:
                        self.window.user_settings.removeFragment(self.fragment)
                return False

            try:
                # Fetch arguments values before edit the 'self.fragment' object,
                # because the arg_filter.getValue() method can raises an
                # exception, and in this case we tell user that there is an
                # unvalid value in any field.
                args = deepcopy(self.fragment.args)
                for arg_checkbox, arg_filter in self.args:
                    if arg_checkbox.isChecked():
                        args[arg_filter.filter_arg] = arg_filter.getValue()
                    else:
                        try:
                            args.pop(arg_filter.filter_arg)
                        except KeyError:
                            pass

                self.fragment.title = unicode(self.ui.title.text())
                self.fragment.view = unicode(self.ui.view.itemData(self.ui.view.currentIndex()).toString())
                self.fragment.args = deepcopy(args)
                if not self.background_color is None:
                    self.fragment.background_color = self.background_color

                if self.is_new:
                    self.window.addFragment(self.fragment)
                    self.window.current_page.addFragment(self.fragment)
                    self.window.addFragRemoveAction(self.fragment.title, self.fragment.name)
                else:
                    self.fragment.setDefault(False)

                return True

            except CheckError, e:
                QMessageBox.critical(self, self.tr("Invalid argument"),
                                           unicode(e), QMessageBox.Ok)