Exemplo n.º 1
0
class RuleFilter:
    def __init__(self, rules, help_text):
        window = rules.window
        self.rules = rules
        self.exact_widget = rules.getWidget('filter_exact')
        self.layout = rules.filter_layout
        self.frame = rules.filter_frame
        window.connect(self.exact_widget, SIGNAL("toggled(bool)"), self.toggleExact)
        self.consistency_filter = ConsistencyFilter(self)
        self.filters = [self.consistency_filter]

        # Help widget
        self.help_widget = QLabel(help_text)
        self.help_widget.setForegroundRole(QPalette.Dark)
        self.help_widget.setWordWrap(True)
        pos = self.layout.count() - 1
        self.layout.insertWidget(pos, self.help_widget)

    def toggleExact(self, exact):
        updates = Updates()
        if any((not filter.isEmpty()) for filter in self.filters):
            self.rules.display(updates)

    def clear(self):
        for filter in self.filters:
            filter.clear()
        self.help_widget.show()

    def updateHelp(self):
        if any((not filter.isEmpty()) for filter in self.filters):
            # at least one filter is displayed
            self.help_widget.hide()
        else:
            self.help_widget.show()

    def match(self, acl):
        exact = self.exact_widget.isChecked()
        for filter in self.filters:
            match = filter.match(acl, exact )
            if match == False:
                return False
        return True

    def dragEnter(self, url):
        for filter in self.filters:
            if filter.getUrlIdentifier(url):
                return True
        return False

    def drop(self, url):
        updates = Updates()
        for filter in self.filters:
            identifier = filter.getUrlIdentifier(url)
            if not identifier:
                continue
            object = filter.library[identifier]
            if not filter.add(object):
                # Duplicate filter: do nothing
                return True
            self.help_widget.hide()
            self.rules.display(updates)
            return True
        return False

    def setConsistencyFilter(self, identifiers):
        updated = False
        if identifiers:
            for filter in self.filters:
                if filter is self.consistency_filter:
                    continue
                updated |= filter.clear()
        updated |= self.consistency_filter.setIdentifiers(identifiers)
        self.updateHelp()
        if updated:
            updates = Updates()
            self.rules.display(updates)