From 9f5dd5a438e4a749f7659bdc249fe54bbe3d03c4 Mon Sep 17 00:00:00 2001 From: loathingKernel <142770+loathingKernel@users.noreply.github.com> Date: Thu, 26 Feb 2026 18:23:12 +0200 Subject: [PATCH 1/2] PathEdit: make editable by default and read-only per-case --- rare/components/dialogs/install/dialog.py | 1 + rare/components/dialogs/move.py | 1 + .../tabs/integrations/egl_sync_group.py | 1 + .../tabs/integrations/import_group.py | 17 +++++++++-------- .../tabs/library/details/cloud_saves.py | 1 + rare/components/tabs/library/details/game.py | 1 - rare/components/tabs/settings/legendary.py | 2 ++ rare/components/tabs/settings/widgets/launch.py | 1 - rare/components/tabs/settings/widgets/proton.py | 1 + rare/components/tabs/settings/widgets/wine.py | 2 -- rare/widgets/indicator_edit.py | 4 +++- 11 files changed, 19 insertions(+), 13 deletions(-) diff --git a/rare/components/dialogs/install/dialog.py b/rare/components/dialogs/install/dialog.py index 70d261760a..d317877264 100644 --- a/rare/components/dialogs/install/dialog.py +++ b/rare/components/dialogs/install/dialog.py @@ -90,6 +90,7 @@ def __init__(self, settings: RareAppSettings, rgame: "RareGame", options: Instal save_func=self._install_dir_save_callback, parent=self, ) + self.install_dir_edit.setReadOnly(True) self.install_dir_edit.validationFinished.connect(self._on_install_dir_validation) self.ui.main_layout.setWidget( self.ui.main_layout.getWidgetPosition(self.ui.install_dir_label)[0], diff --git a/rare/components/dialogs/move.py b/rare/components/dialogs/move.py index 76653f2c69..2682ce1ba7 100644 --- a/rare/components/dialogs/move.py +++ b/rare/components/dialogs/move.py @@ -45,6 +45,7 @@ def __init__(self, rcore: RareCore, rgame: RareGame, parent=None): edit_func=self.__target_path_edit_callback, parent=self, ) + self.target_path_edit.setReadOnly(True) self.target_path_edit.reasons = { MovePathEditReasons.MOVEDIALOG_DST_MISSING: self.tr("You need to provide the destination directory."), MovePathEditReasons.MOVEDIALOG_NO_WRITE: self.tr("No write permission on destination."), diff --git a/rare/components/tabs/integrations/egl_sync_group.py b/rare/components/tabs/integrations/egl_sync_group.py index 2f467b4790..341ab08cf5 100644 --- a/rare/components/tabs/integrations/egl_sync_group.py +++ b/rare/components/tabs/integrations/egl_sync_group.py @@ -48,6 +48,7 @@ def __init__(self, rcore: RareCore, parent=None): save_func=self.egl_path_edit_save_cb, parent=self, ) + self.egl_path_edit.setReadOnly(True) self.ui.egl_sync_layout.setWidget( self.ui.egl_sync_layout.getWidgetPosition(self.ui.egl_path_edit_label)[0], QFormLayout.ItemRole.FieldRole, diff --git a/rare/components/tabs/integrations/import_group.py b/rare/components/tabs/integrations/import_group.py index 7d9ee0f8c1..fc91671ec5 100644 --- a/rare/components/tabs/integrations/import_group.py +++ b/rare/components/tabs/integrations/import_group.py @@ -166,17 +166,18 @@ def __init__(self, rcore: RareCore, parent=None): self._app_titles: Dict[str, str] = {} self._install_dirs: Set[str] = set() - self.path_edit = PathEdit( + self.import_path_edit = PathEdit( path=self.core.get_default_install_dir(self.core.default_platform), file_mode=QFileDialog.FileMode.Directory, edit_func=self._path_edit_callback, parent=self, ) - self.path_edit.textChanged.connect(self._path_changed) + self.import_path_edit.setReadOnly(True) + self.import_path_edit.textChanged.connect(self._path_changed) self.ui.import_layout.setWidget( self.ui.import_layout.getWidgetPosition(self.ui.path_edit_label)[0], QFormLayout.ItemRole.FieldRole, - self.path_edit, + self.import_path_edit, ) self.app_name_edit = IndicatorLineEdit( @@ -226,7 +227,7 @@ def showEvent(self, a0: QShowEvent) -> None: def set_game(self, app_name: str): if app_name: rgame = self.rcore.get_game(app_name) - self.path_edit.setText( + self.import_path_edit.setText( os.path.join( self.core.get_default_install_dir(rgame.default_platform), rgame.folder_name, @@ -248,7 +249,7 @@ def _path_changed(self, path: str): self.info_label.setText("") self.ui.import_folder_check.setCheckState(Qt.CheckState.Unchecked) self.ui.import_force_check.setCheckState(Qt.CheckState.Unchecked) - if self.path_edit.is_valid: + if self.import_path_edit.is_valid: self.app_name_edit.setText(find_app_name(self.core, path)) else: self.app_name_edit.setText("") @@ -277,7 +278,7 @@ def _app_name_changed(self, app_name: str): self.ui.import_dlcs_check.setCheckState(Qt.CheckState.Unchecked) self.ui.import_force_check.setCheckState(Qt.CheckState.Unchecked) self.ui.import_dlcs_check.setEnabled(self.app_name_edit.is_valid and bool(self.core.get_dlc_for_game(app_name))) - self.ui.import_button.setEnabled(not bool(self.worker) and (self.app_name_edit.is_valid and self.path_edit.is_valid)) + self.ui.import_button.setEnabled(not bool(self.worker) and (self.app_name_edit.is_valid and self.import_path_edit.is_valid)) @Slot(Qt.CheckState) def _on_import_folder_changed(self, state: Qt.CheckState): @@ -311,7 +312,7 @@ def _on_import_dlcs_changed(self, state: Qt.CheckState): @Slot() def _on_import_clicked(self): - self._import(self.path_edit.text()) + self._import(self.import_path_edit.text()) @Slot(str) def _import(self, path: Optional[str] = None): @@ -321,7 +322,7 @@ def _import(self, path: Optional[str] = None): self.button_info_stack.setCurrentWidget(self.info_progress) if not path: - path = self.path_edit.text() + path = self.import_path_edit.text() self.worker = ImportWorker( self.core, path, diff --git a/rare/components/tabs/library/details/cloud_saves.py b/rare/components/tabs/library/details/cloud_saves.py index 2fa3431490..a2315d103f 100644 --- a/rare/components/tabs/library/details/cloud_saves.py +++ b/rare/components/tabs/library/details/cloud_saves.py @@ -72,6 +72,7 @@ def __init__(self, settings: RareAppSettings, rcore: RareCore, parent=None): edit_func=self.edit_save_path, save_func=self.save_save_path, ) + self.cloud_save_path_edit.setReadOnly(True) self.cloud_ui.main_layout.setWidget( self.cloud_ui.main_layout.getWidgetPosition(self.cloud_ui.path_label)[0], QFormLayout.ItemRole.FieldRole, diff --git a/rare/components/tabs/library/details/game.py b/rare/components/tabs/library/details/game.py index 47fc35c23b..09ada8b422 100644 --- a/rare/components/tabs/library/details/game.py +++ b/rare/components/tabs/library/details/game.py @@ -60,7 +60,6 @@ def __init__(self, rcore: RareCore, parent=None): save_func=self.__override_exe_save_callback, parent=self, ) - self.override_exe_edit.line_edit.setReadOnly(False) self.launch_params_edit = QLineEdit(self) self.launch_params_edit.setPlaceholderText(self.tr("Game specific command line arguments")) diff --git a/rare/components/tabs/settings/legendary.py b/rare/components/tabs/settings/legendary.py index 1a865a306a..ca5d51bfd3 100644 --- a/rare/components/tabs/settings/legendary.py +++ b/rare/components/tabs/settings/legendary.py @@ -61,6 +61,7 @@ def __init__(self, settings: RareAppSettings, rcore: RareCore, parent=None): edit_func=self.__path_edit_callback, save_func=self._path_save_callback_mac, ) + self.mac_install_dir_edit.setReadOnly(True) self.ui.install_dir_layout.addWidget(self.mac_install_dir_edit) # Platform-independent installation directory @@ -71,6 +72,7 @@ def __init__(self, settings: RareAppSettings, rcore: RareCore, parent=None): edit_func=self.__path_edit_callback, save_func=self._path_save_callback_win, ) + self.install_dir_edit.setReadOnly(True) self.ui.install_dir_layout.addWidget(self.install_dir_edit) # Max Workers diff --git a/rare/components/tabs/settings/widgets/launch.py b/rare/components/tabs/settings/widgets/launch.py index 03dbfc2c09..7d971545b9 100644 --- a/rare/components/tabs/settings/widgets/launch.py +++ b/rare/components/tabs/settings/widgets/launch.py @@ -36,7 +36,6 @@ def __init__(self, rcore: RareCore, wrapper_widget: Type[WrapperSettings], paren edit_func=self.__prelaunch_cmd_edit_callback, save_func=self.__prelaunch_cmd_save_callback, ) - self.prelaunch_cmd.line_edit.setReadOnly(False) self.prelaunch_args = QLineEdit("") self.prelaunch_args.setPlaceholderText(self.tr("Arguments to the script or program to run before the game")) diff --git a/rare/components/tabs/settings/widgets/proton.py b/rare/components/tabs/settings/widgets/proton.py index 6b86de4242..1e86dd9d9c 100644 --- a/rare/components/tabs/settings/widgets/proton.py +++ b/rare/components/tabs/settings/widgets/proton.py @@ -64,6 +64,7 @@ def __init__(self, rcore: RareCore, parent=None): placeholder=self.tr("Please select path for proton prefix"), parent=self, ) + self.compat_edit.setReadOnly(True) # self.winetricks_button = QPushButton(self.tr("Winetricks"), self) # self.create_button = QPushButton(self.tr("Create prefix"), self) diff --git a/rare/components/tabs/settings/widgets/wine.py b/rare/components/tabs/settings/widgets/wine.py index 577b5ba99b..1d598f096e 100644 --- a/rare/components/tabs/settings/widgets/wine.py +++ b/rare/components/tabs/settings/widgets/wine.py @@ -34,7 +34,6 @@ def __init__(self, settings: RareAppSettings, rcore: RareCore, parent=None): edit_func=self._wine_prefix_edit, save_func=self.save_prefix, ) - self.wine_prefix_edit.line_edit.setReadOnly(False) # Wine executable self.wine_execut_edit = PathEdit( @@ -48,7 +47,6 @@ def __init__(self, settings: RareAppSettings, rcore: RareCore, parent=None): ), save_func=self.save_execut, ) - self.wine_execut_edit.line_edit.setReadOnly(False) layout = QFormLayout(self) layout.addRow(self.tr("Executable"), self.wine_execut_edit) diff --git a/rare/widgets/indicator_edit.py b/rare/widgets/indicator_edit.py index e01c878668..45553acb6a 100644 --- a/rare/widgets/indicator_edit.py +++ b/rare/widgets/indicator_edit.py @@ -371,7 +371,6 @@ def __init__( ) self.setObjectName(type(self).__name__) self.line_edit.setMinimumSize(QSize(250, 0)) - self.line_edit.setReadOnly(True) self.path_select = QPushButton(self) self.path_select.setObjectName(f"{type(self).__name__}Button") layout = self.layout() @@ -385,6 +384,9 @@ def __init__( self.path_select.clicked.connect(self.__set_path) + def setReadOnly(self, read_only: bool): + self.line_edit.setReadOnly(read_only) + def setRootPath(self, path: str): self.__root_path = path self.__completer_model.setRootPath(path) From 58f85f3795cfd8e477b90e57543aec4a7ed92cf0 Mon Sep 17 00:00:00 2001 From: loathingKernel <142770+loathingKernel@users.noreply.github.com> Date: Sun, 1 Mar 2026 03:27:03 +0200 Subject: [PATCH 2/2] IndicatorEdit: fix layout constraint --- rare/widgets/indicator_edit.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/rare/widgets/indicator_edit.py b/rare/widgets/indicator_edit.py index 45553acb6a..107b2d2b97 100644 --- a/rare/widgets/indicator_edit.py +++ b/rare/widgets/indicator_edit.py @@ -144,9 +144,7 @@ def __init__( layout = QHBoxLayout(self) layout.setObjectName(f"{self.objectName()}Layout") layout.setContentsMargins(0, 0, 0, 0) - layout.setSizeConstraints( - QHBoxLayout.SizeConstraint.SetDefaultConstraint, QHBoxLayout.SizeConstraint.SetFixedSize - ) + layout.setSizeConstraint(QHBoxLayout.SizeConstraint.SetDefaultConstraint) # Add line_edit self.line_edit = QLineEdit(self) self.line_edit.setObjectName(f"{type(self).__name__}Edit")