summaryrefslogtreecommitdiff
path: root/lib/apps
diff options
context:
space:
mode:
authormatteo4375 <[email protected]>2024-10-26 12:31:40 -0400
committermatteo4375 <[email protected]>2024-10-26 12:31:40 -0400
commitf679c48a24b200195ca703bf673a2ae72dc65d1c (patch)
tree109d20394e9b0d73e5187c69da4772a30b5bd064 /lib/apps
parent4a5308c82e0134f87b7e1ccc56e4fa2778b69fdd (diff)
apps: add option to include categories in queries
Diffstat (limited to 'lib/apps')
-rw-r--r--lib/apps/application.vala36
-rw-r--r--lib/apps/apps.vala13
2 files changed, 45 insertions, 4 deletions
diff --git a/lib/apps/application.vala b/lib/apps/application.vala
index 0a2f73c..07b44e4 100644
--- a/lib/apps/application.vala
+++ b/lib/apps/application.vala
@@ -47,6 +47,17 @@ public class AstalApps.Application : Object {
*/
public string[] keywords { owned get { return app.get_keywords(); } }
+ /**
+ * `Categories` field from the desktop file.
+ */
+ public string[] categories { owned get {
+ var categories = app.get_categories();
+ if (categories != null)
+ return categories.split(";");
+
+ return new string[0];
+ } }
+
internal Application(string id, int? frequency = 0) {
Object(app: new DesktopAppInfo(id));
this.frequency = frequency;
@@ -94,6 +105,12 @@ public class AstalApps.Application : Object {
score.keywords = s;
}
}
+ foreach (var category in categories) {
+ var s = fuzzy_match_string(term, category);
+ if (s > score.categories) {
+ score.categories = s;
+ }
+ }
return score;
}
@@ -117,6 +134,11 @@ public class AstalApps.Application : Object {
score.keywords = keyword.down().contains(term.down()) ? 1 : 0;
}
}
+ foreach (var category in categories) {
+ if (score.categories == 0) {
+ score.categories = category.down().contains(term.down()) ? 1 : 0;
+ }
+ }
return score;
}
@@ -129,16 +151,21 @@ public class AstalApps.Application : Object {
.set_member_name("executable").add_string_value(executable)
.set_member_name("description").add_string_value(description)
.set_member_name("icon_name").add_string_value(icon_name)
- .set_member_name("frequency").add_int_value(frequency)
- .set_member_name("keywords")
- .begin_array();
+ .set_member_name("frequency").add_int_value(frequency);
+ builder.set_member_name("keywords").begin_array();
foreach (string keyword in keywords) {
builder.add_string_value(keyword);
}
+ builder.end_array();
+
+ builder.set_member_name("categories").begin_array();
+ foreach (string category in categories) {
+ builder.add_string_value(category);
+ }
+ builder.end_array();
return builder
- .end_array()
.end_object()
.get_root();
}
@@ -150,4 +177,5 @@ public struct AstalApps.Score {
int executable;
int description;
int keywords;
+ int categories;
}
diff --git a/lib/apps/apps.vala b/lib/apps/apps.vala
index dde7d44..30c305a 100644
--- a/lib/apps/apps.vala
+++ b/lib/apps/apps.vala
@@ -50,6 +50,12 @@ public class AstalApps.Apps : Object {
public double keywords_multiplier { get; set; default = 0.5; }
/**
+ * Extra multiplier to apply when matching the categories of an application.
+ * Defaults to `0.5`
+ */
+ public double categories_multiplier { get; set; default = 0.5; }
+
+ /**
* Consider the name of an application during queries.
* Defaults to `true`
*/
@@ -79,6 +85,12 @@ public class AstalApps.Apps : Object {
*/
public bool include_keywords { get; set; default = false; }
+ /**
+ * Consider the categories of an application during queries.
+ * Defaults to `false`
+ */
+ public bool include_categories { get; set; default = false; }
+
construct {
cache_directory = Environment.get_user_cache_dir() + "/astal";
cache_file = cache_directory + "/apps-frequents.json";
@@ -120,6 +132,7 @@ public class AstalApps.Apps : Object {
if (include_executable) r += s.executable * executable_multiplier;
if (include_description) r += s.description * description_multiplier;
if (include_keywords) r += s.keywords * keywords_multiplier;
+ if (include_categories) r += s.categories * categories_multiplier;
return r;
}