diff --git a/usr/lib/linuxmint/mintMenu/plugins/applications.py b/usr/lib/linuxmint/mintMenu/plugins/applications.py
index b26a15c..3ab2a2a 100755
--- a/usr/lib/linuxmint/mintMenu/plugins/applications.py
+++ b/usr/lib/linuxmint/mintMenu/plugins/applications.py
@@ -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)
- else:
- showns = self.exact_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:
+ 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)
@@ -1780,4 +1702,4 @@ class pluginclass(object):
# print "=======>>> " + item.get_name() + " = top level"
# newApplicationsList.append({"entry": item, "category": ""})
- return newApplicationsList
\ No newline at end of file
+ return newApplicationsList
diff --git a/usr/lib/linuxmint/mintMenu/plugins/easybuttons.py b/usr/lib/linuxmint/mintMenu/plugins/easybuttons.py
index 17001de..1fe8ca1 100755
--- a/usr/lib/linuxmint/mintMenu/plugins/easybuttons.py
+++ b/usr/lib/linuxmint/mintMenu/plugins/easybuttons.py
@@ -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
diff --git a/usr/lib/linuxmint/mintMenu/preferences.py b/usr/lib/linuxmint/mintMenu/preferences.py
index 016a36f..fd92981 100755
--- a/usr/lib/linuxmint/mintMenu/preferences.py
+++ b/usr/lib/linuxmint/mintMenu/preferences.py
@@ -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()
diff --git a/usr/share/glib-2.0/schemas/com.linuxmint.mintmenu.gschema.xml b/usr/share/glib-2.0/schemas/com.linuxmint.mintmenu.gschema.xml
index aa3c7de..d75c06c 100644
--- a/usr/share/glib-2.0/schemas/com.linuxmint.mintmenu.gschema.xml
+++ b/usr/share/glib-2.0/schemas/com.linuxmint.mintmenu.gschema.xml
@@ -286,12 +286,6 @@
-
- false
-
-
-
-
false