Fixes a subtle bug that would cause increased CPU usage due to spawning
multiple singleshot times with very short timeouts (15ms) until the Store
tab was loaded.
When unsetting DISPLAY, Wine hangs after executing a command, and doesn't
allow for other instances of wine to start, i.e. games do not launch, with
a cryptic error. This also fixes the previously observed issues with
`winepath.exe` and `reg.exe` never exiting.
This is likely due to the newly introduced Wayland driver. This behavior
can be observed when Wayland support is compiled into Wine and the wayland
driver is enabled in the prefix's registry. In this case, if running under
X11 and DISPLAY is not set, Wine will hang, and the process never returns.
* Use horizontal scrollarea for free games. Based on the same idea as
WrapperSettings scrollarea. Both need some adjustments.
* Remove debugging dialogs. Need a better way anyways to debug.
* Add a big back button in details page.
* Add static CSS to render QPushButtons as flat when the `flat` property is set
* Remove outer scroll areas from details page since the page is already adjustable
* Remove scroll area from the requirements widget because ElideLabels are already used in it.
* Fix crash when sorting the wishlist
Important changes:
* Refactored QtRequests to accept parameters for `GET` operations
* Infer response data type from content-type header
* Support caching to disk, a manager with this set prefers the cache
* Support multiple handlers for a single request (unused, possibly pointeless)
* Subclass `ShopImageWidget` for all widgets used in the shop
* Request a resized image instead of the original one
* Fix the search and browse functions
* Remove the annoying stacked widget, instead create a double layout in
the container and place a label in that to hold the placeholder message.
* Implement the scroll area as a custom widget. This custom widget installs
an event filter on the container to adjust the scrollarea size when the
container size changes.
QToolButton is not really designed to be used in the way we did and since
QPushButton supports having a menu attached to, we can replace tool buttons
in most cases.
* Fix the presentation of the TabButtonWidget by updating RareStyle's css
* Reduce the size of the top tab bar to save vertical space.
* Remove infoLabel property
Do not create multiple library views and remove the ability to switch
between them on the fly. Add an option in settings to select the preferred
view. The view will be used the next time Rare is started.
* Add an option to select the library view mode.
This will allow us to instantiate only one library view at startup,
reducing time and complexity of the process.
* Remove base Qt translations from repo, load translations from Qt itself
* Prefix translation `qm` files with `rare_`.
* Rename `translation_source.ts` to simply `source.ts`
* If the selected language matches the system local, remove the option from the configuration.
* Instead of using legendary's locale as fallback, use system't locale
as default.
* Do not hardcode language names and countries but use QLocale on
the translation filenames.
Also add a dialog to select optional downloads before verifying
and refactor the move widget into a full-fledged dialog.
To keep dialogs in a common format and allow them to share the same
properties, three classes of dialogs have been implemented inheriting from
each other.
The classes are `BaseDialog` -> `ButtonDialog` -> `ActionDialog`
* Basedialog: is the basis of all dialogs and is responsible for
rejecting close requests from the window manager and the keyboard.
It also restricts access to `exec()` and `exec_()` because they are harmful.
It serves as the basis of Launch and Login dialogs
* ButtonDialog: is offering buttons for accepting or rejecting the presented
option. It implements its own buttons and exposes abstract methods to
implement handling in them. It restricts access to `close()` because these
dialogs should always product a result.
It is the basis of Uninstall, Selective dialogs.
* ActionDialog: in addition to the ButtonDialog, it offers an action buttom
with to validate the form or to make the dialog unable to close. It serves
as the basis of Install and Move dialogs.
Accordingly all dialogs in Rare have been updated to use these classes.
The default widgets only implement the settings for the `default` "app_name"
The game specific widgets sub-class the default widgets and implement
whatever they additionally need locally.
Remove multiple calls to save config and save when the game settings gets hidden.
* Use `vars()` instead of directly accessing `__dict__`
* Remove `auto_update` from RareGame's metadata
* Correct check for updating the Steam App ID (We want to keep any changes from the user)
* Collect both Wine and Proton prefixes when removing overlay registry keys.
* Add few convenience functions in config_helper and paths.
This allows compatibility tools that use the SteamAppId environment
variable to make decisions or apply fixes do their job more accurately.
Also use the stored variable to provide a link to protondb through
the grade label in GameInfo.
The steam grades now use the orjson library to load Steam's ~6MB
database faster.
Add a sub-application to Rare to launch the webview for logging into EGS.
The sub-application operates similatly to the `laucher` sub-application and
it is autonomous. After a successful login in returns the exchange code
to the standard output to be parsed and used by the login dialog.
The reason this implementation was chosen is because when pywebview uses
pyqtwebengine as the GUI library, we cannot launch it through Rare as
it tries to spawn a QMainWindow inside an existing event loop, which is
prohibited by Qt.
Despite that, EGS login page doesn't work correctly with QtWebEngine,
so on linux default to the GTK backend for pywebview, and this change
helps keeping applications using different toolkits separate.
At this moment, spawning the sub-application blocks the execution of the
main application.
This change should make it easier to authenticate through Rare inside
a gamescope session, such as the steam deck.