Daniel Johnson
ce8961fce2
Bug fixes for conjunction handling
2024-05-12 17:36:06 -07:00
Daniel Johnson
7654ac7173
Rework playtime so >= and <= are operators, and so that "playtime:>=3 hours playtime:<=20 hours" will work with no explicit AND.
2024-05-12 17:36:06 -07:00
Daniel Johnson
67f5078079
Rely more heavily on the TokenReader to handle whitespace and conjoined tokens.
...
This way 'playtime: 20 hours' can be parsed, as this tag along can read the rest of the text to the next stop.
2024-05-12 17:36:06 -07:00
Daniel Johnson
dc1a9dfebc
First cut of a playtime search tag - with just >, < and equals matches, but the equals match is too precise to be useful.
...
The search syntax is "playtime: >9 hours 3 minutes"; quotes are allowed but not required.
2024-05-12 17:36:06 -07:00
Daniel Johnson
59bdf379e7
Factor out flag handling into a function, and use exceptions rather than None to indicate 'bad tagness'.
...
This way the read_flag_token() function can return None for 'maybe', and raise for 'invalid argument'
2024-05-12 17:36:06 -07:00
Daniel Johnson
c8519f546e
Commenting about the tokenization code; also make it a bit less search-specific.
2024-05-12 17:36:06 -07:00
Daniel Johnson
c43b890982
Move tokenization code into its own module, down in 'lutris.util'.
2024-05-12 17:36:06 -07:00
Daniel Johnson
05e85634c3
Pass the token reader around more so we can have multi-token arguments to the tags
2024-05-12 17:36:06 -07:00
Daniel Johnson
47f452a803
Move away from using iterators, since they proved inadequate.
2024-05-12 17:36:06 -07:00
Daniel Johnson
48210dc7b3
Add support for parenthesis grouping too
2024-05-12 17:36:06 -07:00
Daniel Johnson
11f039aa14
Restore awareness of valid tags, so more ':' characters can be searched for normally
2024-05-12 17:36:06 -07:00
Daniel Johnson
5429cab292
More cleanup using helpful functions
2024-05-12 17:36:06 -07:00
Daniel Johnson
279d49e53b
Replace List[Callable] with SearchPredicate functions for simplicity
2024-05-12 17:36:06 -07:00
Daniel Johnson
070c493265
Clean up recursive descent code via various helper methods.
2024-05-12 17:36:06 -07:00
Daniel Johnson
e1c52b9a92
Add support for the AND conjunction
...
But this is still super messy.
2024-05-12 17:36:06 -07:00
Daniel Johnson
5112d3c60c
Give up on using iterators; add a TokenReader class that can go backwards, allowing lookahead.
2024-05-12 17:36:06 -07:00
Daniel Johnson
3c50d7d208
Rework the parser again, now pre-combining unquoted text runs and handling the OR conjunction
2024-05-12 17:36:06 -07:00
Daniel Johnson
617ec2cbde
Rework the search parser to recursive descent, and also conjoin consecutive text segments so text is order sensitive, and "-alien shooter" applies the negation to the whole thing.
2024-05-12 17:36:06 -07:00
Daniel Johnson
9c4f637f31
More aggressive tokenization; allows forms like "hidden: true" with a space in it.
2024-05-12 17:36:06 -07:00
Daniel Johnson
c20aad4fbb
Extend the search with '-' as a negation operator
2024-05-12 17:36:06 -07:00
Daniel Johnson
c1082ab94a
Replace split with a tokenization function that knows about quotations
2024-05-12 17:36:06 -07:00
Daniel Johnson
e555175d91
Add 'hidden:maybe' support. This is just too cute to resist.
...
'installed:maybe' is also useful; you can override the UI menu settings with these.
'hidden:maybe' is useful to show hidden and non-hidden together.
You can use 'maybe' with other components, but it does nothing useful for them.
2024-05-12 17:36:06 -07:00
Daniel Johnson
8da7d719e3
Add 'hidden:yes/no' to the search
...
Also, make hidden and installed override the menu-based settings, so they can be used from the Game view freely.
This does mean doing less of the search in SQL, but I suspect this won't be a problem.
2024-05-12 17:36:06 -07:00
Daniel Johnson
1856e5e466
Add 'favorite:yes/no' to search for favorites.
2024-05-12 17:36:06 -07:00
Daniel Johnson
cbd0e78653
Provide access to the search components; lazy load the predicates.
...
This should support editing searches later, even editing invalid ones.
2024-05-12 17:36:06 -07:00
Daniel Johnson
f2c056be6d
Add searches for 'runner:' and 'platform:'
2024-05-12 17:36:06 -07:00
Daniel Johnson
d4d3959b05
Use a case-insensitive category name in the search.
...
More or less; SQLite COLLATE NOCASE is apparently crappy, but it's better than nothing.
2024-05-12 17:36:06 -07:00
Daniel Johnson
fcfcdf8af5
Add additional game searches 'categorized:true/false' and 'category:x' to search categories.
...
Sadly the category is case-sensitive for now.
2024-05-12 17:36:06 -07:00
Daniel Johnson
901b5a0309
Create RunnerSearch and use it to search runners
...
This means you can now search for installed (or non-installed) runners. Yay!
2024-05-12 17:36:06 -07:00
Daniel Johnson
3cf7f28095
Generalize the BaseSearch class so it can work with non-games and without a service.
...
To do this, I've put a reference to the service in GameSearch as a field.
2024-05-12 17:36:06 -07:00
Daniel Johnson
1250dcbb84
Put search classes into search.py
2024-05-12 17:36:06 -07:00
Daniel Johnson
59b621a925
Break out a base class for searches that aren't of games.
...
I'm thinking runner search!
2024-05-12 17:36:06 -07:00
Daniel Johnson
8173d4098a
Crude first cut at an "installed:yes/no" search term.
...
This sort of works, but sometimes the same game is both installed and not somehow.
2024-05-12 17:36:06 -07:00
Daniel Johnson
b9cfaed683
Split game search logic into separate predicates, simplify the __init__ method.
2024-05-12 17:36:06 -07:00
Daniel Johnson
1bb998cda2
Generalize installer check so it works on non-service games and is clearer.
2024-05-12 17:36:06 -07:00
Daniel Johnson
5e93cac3ac
Move the filter_games() matching logic into a new class GameSearch.
2024-05-12 17:36:06 -07:00
Daniel Johnson
ce49b92904
Move the generation count out of NotificationSource.
...
This is used in only one place, and does not really fit with the argument-passing fire() method we have now, so I'll move it.
2024-05-12 08:41:52 -04:00
Daniel Johnson
189c02bf43
At last, Game can stop being a GObject.
2024-05-12 07:11:00 -04:00
Daniel Johnson
b8af800c96
Convert "game-error" to a NotificationSource as well.
2024-05-12 07:07:53 -04:00
Daniel Johnson
2235a3d192
Convert "game-unhandled-error" to a NotificationSource
2024-05-12 06:50:01 -04:00
Daniel Johnson
26b1c33fc9
Convert "game-installed" into a NotificationSource
2024-05-12 06:43:56 -04:00
Daniel Johnson
4449dc8415
Convert "game-updated" into a NotificationSource.
...
I've also put MoveDialog into a separate module to break a circular dependency.
2024-05-12 06:40:28 -04:00
Daniel Johnson
ace302a809
Convert "game-stopped" to a NotificationSource
2024-05-12 06:30:01 -04:00
Daniel Johnson
c6bf26bb95
OK, PR #5421 looks nice to me, but it is not moving. Let's get Game.py off of GObject.
...
This commit replaces the game-start and game-started signals with NotificationSource.
2024-05-12 05:56:35 -04:00
Daniel Johnson
cb147ee18e
Move notification source to use registration objects.
...
This lets us avoid having to have None checks; we can initialize registration fields to EMPTY_NOTIFICATION_REGISTRATION and we can then blindly unregister them with no problems if they were never registered.
2024-05-12 05:49:48 -04:00
Daniel Johnson
28e5d2e35a
Ubisoft YAML search should return its (None, None) signal value if any of the various keys or indices it looks for are missing.
...
Resolves #5469
2024-05-11 19:32:57 -04:00
Daniel Johnson
80fdb19c02
Change default 'Installed Games Only' to show those games in a new install.
...
I think default was flipped by commit 01340c3499
, and it looks like it's just a bug.
But with the new library-sync feature, which we guide users towards, the Lutris service is now gone, so 'Installed Games Only' effectively hides what used to be the Lutris service. I see this confusing users on Discord at least.
This only affects new installations of Lutris; the saved setting is still respected.
2024-05-11 05:56:13 -04:00
nierozec
c833cd8853
Added foot terminal support
2024-05-08 14:14:01 -07:00
Daniel Johnson
6fc1684afb
Keep an extra file in ~/.cache/lutris when in the process of logging in with WebConnectDialog; is_authenticated() is then false when this file is present, so even though we have cookies at this time, Lutris won't think we're already authenticated.
...
This means if you just close out of the WebConnectDialog, you are not considered to be logged in anyway- this extra file remains in that case.
Should help with #5406
2024-05-04 08:57:54 -04:00
Daniel Johnson
f3218bddc8
When you click Refresh on a source but are no longer connected, let's log you out and back in; this will ask for new credentials and then reload anyway.
...
Should help with #5406
2024-05-04 08:21:02 -04:00