simplificaiton + removal of fuzzy
This commit is contained in:
parent
f9325f2870
commit
7c0bcbb5b7
@ -8,8 +8,6 @@ import os
|
||||
import subprocess
|
||||
import threading
|
||||
import urllib.request, urllib.parse, urllib.error
|
||||
from fuzzywuzzy import process
|
||||
import unidecode
|
||||
|
||||
import gi
|
||||
gi.require_version("Gtk", "3.0")
|
||||
@ -276,11 +274,9 @@ class pluginclass(object):
|
||||
self.settings.connect("changed::fav-cols", self.changeFavCols)
|
||||
self.settings.connect("changed::remember-filter", self.changeRememberFilter)
|
||||
self.settings.connect("changed::enable-internet-search", self.changeEnableInternetSearch)
|
||||
self.settings.connect("changed::enable-fuzzy-search", self.changeEnableFuzzySearch)
|
||||
self.settings.connect("changed::category-hover-delay", self.GetGSettingsEntries)
|
||||
self.settings.connect("changed::do-not-filter", self.GetGSettingsEntries)
|
||||
self.settings.connect("changed::enable-internet-search", self.GetGSettingsEntries)
|
||||
self.settings.connect("changed::enable-fuzzy-search", self.GetGSettingsEntries)
|
||||
self.settings.connect("changed::search-command", self.GetGSettingsEntries)
|
||||
self.settings.connect("changed::default-tab", self.GetGSettingsEntries)
|
||||
self.settings.connect("changed::favorite-apps-list", self.favoriteAppsChanged)
|
||||
@ -306,7 +302,6 @@ class pluginclass(object):
|
||||
|
||||
self.categoryList = []
|
||||
self.applicationList = []
|
||||
self.sortedApplicationList = []
|
||||
|
||||
#dirty ugly hack, to get favorites drag origin position
|
||||
self.drag_origin = None
|
||||
@ -446,9 +441,6 @@ class pluginclass(object):
|
||||
def changeEnableInternetSearch(self, settings, key):
|
||||
self.enableInternetSearch = settings.get_boolean(key)
|
||||
|
||||
def changeEnableFuzzySearch(self, settings, key):
|
||||
self.enableFuzzySearch = settings.get_boolean(key)
|
||||
|
||||
def changeShowApplicationComments(self, settings, key):
|
||||
self.showapplicationcomments = settings.get_boolean(key)
|
||||
for child in self.applicationsBox:
|
||||
@ -524,7 +516,6 @@ class pluginclass(object):
|
||||
self.useAPT = self.settings.get_boolean("use-apt")
|
||||
self.rememberFilter = self.settings.get_boolean("remember-filter")
|
||||
self.enableInternetSearch = self.settings.get_boolean("enable-internet-search")
|
||||
self.enableFuzzySearch = self.settings.get_boolean("enable-fuzzy-search")
|
||||
|
||||
self.lastActiveTab = self.settings.get_int("last-active-tab")
|
||||
self.defaultTab = self.settings.get_int("default-tab")
|
||||
@ -588,7 +579,6 @@ class pluginclass(object):
|
||||
return False
|
||||
|
||||
def focusSearchEntry(self, clear = True):
|
||||
self.applicationsBox.get_children()[0].grab_focus()
|
||||
# grab_focus() does select all text,
|
||||
# restoring the original selection is somehow broken, so just select the end
|
||||
# of the existing text, that's the most likely candidate anyhow
|
||||
@ -755,86 +745,6 @@ class pluginclass(object):
|
||||
except Exception as e:
|
||||
print(e)
|
||||
|
||||
def strip_case_and_accents(self, string):
|
||||
if isinstance(string, str):
|
||||
try:
|
||||
value = unidecode.unidecode(string.lower())
|
||||
except:
|
||||
pass
|
||||
return value
|
||||
|
||||
def fuzzy_application_search(self, search_text):
|
||||
shownList = []
|
||||
showns = False # Are any app shown?
|
||||
keywords = self.strip_case_and_accents(search_text).split()
|
||||
labels = [app["button"].appName for app in self.applicationList]
|
||||
results = process.extract(search_text, labels, limit=len(labels))
|
||||
|
||||
first_button = True
|
||||
|
||||
for match in results:
|
||||
if match[1] > 60: # Adjust the threshold as needed
|
||||
for app in self.applicationList:
|
||||
if app["button"].appName == match[0]:
|
||||
self.applicationsBox.pack_start(app["button"], False, False, 0)
|
||||
if first_button is True:
|
||||
app["button"].grab_focus()
|
||||
first_button = False
|
||||
shownList.append(app["button"])
|
||||
showns = True
|
||||
|
||||
# Non-fuzzy results for appGenericName, appComment and appExec
|
||||
# Again I should really make it a function or something
|
||||
for app in self.applicationList:
|
||||
for item in shownList:
|
||||
if app["button"].desktopFile == item.desktopFile:
|
||||
continue
|
||||
for keyword in keywords:
|
||||
if keyword != "" and (self.strip_case_and_accents(app["button"].appGenericName).find(keyword) != -1 or self.strip_case_and_accents(app["button"].appComment).find(keyword) != -1 or self.strip_case_and_accents(app["button"].appExec).find(keyword) != -1):
|
||||
self.applicationsBox.pack_start(app["button"], False, False, 0)
|
||||
if first_button is True:
|
||||
app["button"].grab_focus()
|
||||
first_button = False
|
||||
shownList.append(app["button"])
|
||||
showns = True
|
||||
return showns
|
||||
|
||||
|
||||
def exact_application_search(self, search_text):
|
||||
shownList = []
|
||||
showns = False # Are any app shown?
|
||||
first_button = True
|
||||
keywords = self.strip_case_and_accents(search_text).split()
|
||||
# I should probably make a function but whatever
|
||||
# Add applications that match the appName
|
||||
for app in self.applicationList:
|
||||
for item in shownList:
|
||||
if app["button"].desktopFile == item.desktopFile:
|
||||
continue
|
||||
for keyword in keywords:
|
||||
if keyword != "" and (self.strip_case_and_accents(app["button"].appName).find(keyword) != -1):
|
||||
self.applicationsBox.pack_start(app["button"], False, False, 0)
|
||||
if first_button is True:
|
||||
app["button"].grab_focus()
|
||||
first_button = False
|
||||
shownList.append(app["button"])
|
||||
showns = True
|
||||
|
||||
# Add applications that match appGenericName, appComment or appExec
|
||||
for app in self.applicationList:
|
||||
for item in shownList:
|
||||
if app["button"].desktopFile == item.desktopFile:
|
||||
continue
|
||||
for keyword in keywords:
|
||||
if keyword != "" and (self.strip_case_and_accents(app["button"].appGenericName).find(keyword) != -1 or self.strip_case_and_accents(app["button"].appComment).find(keyword) != -1 or self.strip_case_and_accents(app["button"].appExec).find(keyword) != -1):
|
||||
self.applicationsBox.pack_start(app["button"], False, False, 0)
|
||||
if first_button is True:
|
||||
app["button"].grab_focus()
|
||||
first_button = False
|
||||
shownList.append(app["button"])
|
||||
showns = True
|
||||
return showns
|
||||
|
||||
def Filter(self, widget, category = None):
|
||||
self.filterTimer = None
|
||||
|
||||
@ -851,25 +761,36 @@ class pluginclass(object):
|
||||
self.changeTab(1, clear = False)
|
||||
text = widget.get_text()
|
||||
showns = False # Are any app shown?
|
||||
|
||||
for item in self.applicationList:
|
||||
self.applicationsBox.remove(item["button"])
|
||||
|
||||
if text == "": # Reset application list
|
||||
for item in self.applicationList:
|
||||
self.applicationsBox.remove(item["button"])
|
||||
for item in self.sortedApplicationList:
|
||||
self.applicationsBox.pack_start(item[1], False, False, 0)
|
||||
if self.enableFuzzySearch:
|
||||
showns = self.fuzzy_application_search(text)
|
||||
shownList = []
|
||||
for i in self.applicationsBox.get_children():
|
||||
shown = i.filterText(text)
|
||||
if shown:
|
||||
dupe = False
|
||||
for item in shownList:
|
||||
if i.desktopFile == item.desktopFile:
|
||||
dupe = True
|
||||
if dupe:
|
||||
i.hide()
|
||||
else:
|
||||
showns = self.exact_application_search(text)
|
||||
|
||||
shownList.append(i)
|
||||
self.applicationsBox.remove(i)
|
||||
showns = True
|
||||
if not showns:
|
||||
if len(text) >= 3:
|
||||
self.add_search_suggestions(text)
|
||||
if self.useAPT:
|
||||
GLib.timeout_add(300, self.add_apt_filter_results, text)
|
||||
else:
|
||||
# Sort applications by relevance, and alphabetical within that
|
||||
shownList = sorted(shownList, key=lambda app: app.appName)
|
||||
shownList = sorted(shownList, key=lambda app: app.relevance, reverse=True)
|
||||
focused = False
|
||||
for i in shownList:
|
||||
self.applicationsBox.add(i)
|
||||
if not focused:
|
||||
# Grab focus of the first app shown
|
||||
i.grab_focus()
|
||||
focused = True
|
||||
for i in self.categoriesBox.get_children():
|
||||
i.released()
|
||||
i.set_relief(Gtk.ReliefStyle.NONE)
|
||||
@ -896,6 +817,7 @@ class pluginclass(object):
|
||||
i.released()
|
||||
i.set_relief(Gtk.ReliefStyle.NONE)
|
||||
widget.set_relief(Gtk.ReliefStyle.HALF)
|
||||
|
||||
self.applicationsScrolledWindow.get_vadjustment().set_value(0)
|
||||
|
||||
def FilterAndClear(self, widget, category = None):
|
||||
@ -1678,10 +1600,10 @@ class pluginclass(object):
|
||||
self.applicationList[key]["button"].destroy()
|
||||
del self.applicationList[key]
|
||||
if addedApplications:
|
||||
self.sortedApplicationList = []
|
||||
sortedApplicationList = []
|
||||
for item in self.applicationList:
|
||||
self.applicationsBox.remove(item["button"])
|
||||
self.sortedApplicationList.append((item["button"].appName, item["button"]))
|
||||
sortedApplicationList.append((item["button"].appName, item["button"]))
|
||||
for item in addedApplications:
|
||||
item["button"] = MenuApplicationLauncher(item["entry"].get_desktop_file_path(),
|
||||
self.iconSize, item["category"], self.showapplicationcomments,
|
||||
@ -1696,14 +1618,14 @@ class pluginclass(object):
|
||||
else:
|
||||
item["button"].filterCategory(self.activeFilter[1])
|
||||
item["button"].desktop_file_path = item["entry"].get_desktop_file_path()
|
||||
self.sortedApplicationList.append((item["button"].appName.upper(), item["button"]))
|
||||
sortedApplicationList.append((item["button"].appName.upper(), item["button"]))
|
||||
self.applicationList.append(item)
|
||||
else:
|
||||
item["button"].destroy()
|
||||
|
||||
self.sortedApplicationList.sort()
|
||||
sortedApplicationList.sort()
|
||||
launcherNames = [] # Keep track of launcher names so we don't add them twice in the list..
|
||||
for item in self.sortedApplicationList:
|
||||
for item in sortedApplicationList:
|
||||
launcherName = item[0]
|
||||
button = item[1]
|
||||
self.applicationsBox.add(button)
|
||||
|
@ -234,6 +234,7 @@ class ApplicationLauncher(easyButton):
|
||||
|
||||
self.desktopFile = desktopFile
|
||||
self.startupMonitorId = 0
|
||||
self.relevance = 0
|
||||
|
||||
self.loadDesktopEntry(desktopItem)
|
||||
|
||||
@ -306,11 +307,28 @@ class ApplicationLauncher(easyButton):
|
||||
|
||||
def filterText(self, text):
|
||||
keywords = self.strip_case_and_accents(text).split()
|
||||
self.relevance = 0
|
||||
|
||||
appName = self.strip_case_and_accents(self.appName)
|
||||
appGenericName = self.strip_case_and_accents(self.appGenericName)
|
||||
appComment = self.strip_case_and_accents(self.appComment)
|
||||
appExec = self.strip_case_and_accents(self.appExec)
|
||||
|
||||
for keyword in keywords:
|
||||
if appName == keyword:
|
||||
self.relevance += 32
|
||||
elif appName.find(keyword) == 0:
|
||||
self.relevance += 16
|
||||
elif appName.find(keyword) != -1:
|
||||
self.relevance += 8
|
||||
|
||||
if appExec.find(keyword) != -1:
|
||||
self.relevance += 4
|
||||
if appComment.find(keyword) != -1:
|
||||
self.relevance += 2
|
||||
if appGenericName.find(keyword) != -1:
|
||||
self.relevance += 1
|
||||
|
||||
if keyword != "" and appName.find(keyword) == -1 and appGenericName.find(keyword) == -1 and appComment.find(keyword) == -1 and appExec.find(keyword) == -1:
|
||||
self.hide()
|
||||
return False
|
||||
|
@ -134,7 +134,6 @@ class mintMenuPreferences():
|
||||
section.add_row(GSettingsSwitch(_("Search for packages to install"), "com.linuxmint.mintmenu.plugins.applications", "use-apt"))
|
||||
section.add_row(GSettingsSwitch(_("Remember the last category or search"), "com.linuxmint.mintmenu.plugins.applications", "remember-filter"))
|
||||
section.add_row(GSettingsSwitch(_("Enable Internet search"), "com.linuxmint.mintmenu.plugins.applications", "enable-internet-search"))
|
||||
section.add_row(GSettingsSwitch(_("Enable Fuzzy search"), "com.linuxmint.mintmenu.plugins.applications", "enable-fuzzy-search"))
|
||||
section.add_row(GSettingsEntry(_("Search command"), "com.linuxmint.mintmenu.plugins.applications", "search-command"))
|
||||
|
||||
page = SettingsPage()
|
||||
|
@ -286,12 +286,6 @@
|
||||
<description></description>
|
||||
</key>
|
||||
|
||||
<key type="b" name="enable-fuzzy-search">
|
||||
<default>false</default>
|
||||
<summary></summary>
|
||||
<description></description>
|
||||
</key>
|
||||
|
||||
<key type="b" name="search-on-top">
|
||||
<default>false</default>
|
||||
<summary></summary>
|
||||
|
Loading…
Reference in New Issue
Block a user