예제 #1
0
    def _search(self, needle):

        import Levenshtein

        if not needle:
            haystack = self._haystack[:]
            if self._default:
                haystack.insert(0,
                                (self._default[0].lower(), ) + self._default)
            self._result_box.clear()
            for lower_label, label, data, on_select in haystack:
                item = QListWidgetItem(label, self._result_box)
                item.data = data
                item.on_select = on_select
                self._result_box.addItem(item)
            return
        needle = needle.lower()
        needles = needle.split()
        self._result_box.show()
        self._result_box.clear()
        results = []
        for lower_label, label, data, on_select in self._haystack:
            for subneedle in needles:
                if subneedle not in lower_label:
                    break
            else:
                results.append(
                    (Levenshtein.distance(needle, lower_label) / len(label),
                     label, data, on_select))
        for score, label, data, on_select in sorted(results,
                                                    key=lambda t: t[0]):
            item = QListWidgetItem(label, self._result_box)
            item.data = data
            item.on_select = on_select
            self._result_box.addItem(item)
예제 #2
0
    def _search(self, needle):

        import Levenshtein

        if not needle:
            haystack = self._haystack[:]
            if self._default:
                haystack.insert(0,
                                (self._default[0].lower(), ) + self._default)
            self._result_box.clear()
            for lower_label, label, data, on_select in haystack:
                item = QListWidgetItem(label, self._result_box)
                item.data = data
                item.on_select = on_select
                self._result_box.addItem(item)
            return
        needle = needle.lower()
        needles = needle.split()
        self._result_box.show()
        self._result_box.clear()
        results = []
        for lower_label, label, data, on_select in self._haystack:
            for subneedle in needles:
                if subneedle not in lower_label:
                    break
            else:
                # We count the number of full matches of the needle in the
                # labels and divide the score by this. This was we give an
                # advantage to labels that contain multiple matches of the
                # needle, for example in the folder and file name.
                hits = max(1,
                           sum(lower_label.count(s) for s in needle.split()))
                results.append((Levenshtein.distance(needle, lower_label) /
                                (len(label) * hits), label, data, on_select))
        for score, label, data, on_select in sorted(results,
                                                    key=lambda t: t[0]):
            item = QListWidgetItem(label, self._result_box)
            item.data = data
            item.on_select = on_select
            self._result_box.addItem(item)