diff --git a/rare/components/tabs/games/import_sync/egl_sync_group.py b/rare/components/tabs/games/import_sync/egl_sync_group.py index eccc3ffb..2634f8c6 100644 --- a/rare/components/tabs/games/import_sync/egl_sync_group.py +++ b/rare/components/tabs/games/import_sync/egl_sync_group.py @@ -1,9 +1,9 @@ import os import platform from logging import getLogger -from typing import List, Tuple, Iterable +from typing import Tuple, Iterable -from PyQt5.QtCore import Qt, QThread, QThreadPool, QRunnable, pyqtSlot, QFileSystemWatcher +from PyQt5.QtCore import Qt, QThreadPool, QRunnable, pyqtSlot, QFileSystemWatcher from PyQt5.QtWidgets import QGroupBox, QListWidgetItem, QFileDialog import rare.shared as shared @@ -27,13 +27,12 @@ class EGLSyncGroup(QGroupBox, Ui_EGLSyncGroup): self.threadpool = QThreadPool.globalInstance() if platform.system() == 'Windows': - estimated_path = os.path.expandvars(PathSpec.egl_programdata) + self.egl_path_info.setText(os.path.expandvars(PathSpec.egl_programdata)) else: - estimated_path = self.tr('Updating...') + self.egl_path_info.setText(self.tr('Updating...')) wine_resolver = WineResolver(PathSpec.egl_programdata, 'default', shared.core) - wine_resolver.signals.result_ready.connect(self.egl_path_info.setText) + wine_resolver.signals.result_ready.connect(self.wine_resolver_cb) self.threadpool.start(wine_resolver) - self.egl_path_info.setText(estimated_path) egl_path = shared.core.egl.programdata_path if egl_path is None: @@ -44,7 +43,7 @@ class EGLSyncGroup(QGroupBox, Ui_EGLSyncGroup): self.egl_path_edit = PathEdit( path=egl_path, - ph_text=estimated_path, + ph_text=self.tr('Path to the Wine prefix where EGL is installed, or the Manifests folder'), file_type=QFileDialog.DirectoryOnly, edit_func=self.egl_path_edit_cb, save_func=self.egl_path_save_cb, @@ -72,6 +71,12 @@ class EGLSyncGroup(QGroupBox, Ui_EGLSyncGroup): self.update_lists() + def wine_resolver_cb(self, path): + self.egl_path_info.setText(path) + if not path: + self.egl_path_info.setText( + self.tr('Default Wine prefix is unset, configure it in Settings -> Linux')) + @staticmethod def egl_path_edit_cb(path) -> Tuple[bool, str]: if not path: @@ -161,6 +166,14 @@ class EGLSyncListItem(QListWidgetItem): else: shared.core.egl_import(self.game.app_name) + @property + def app_name(self): + return self.game.app_name + + @property + def app_title(self): + return self.game.app_title + class EGLSyncListGroup(QGroupBox, Ui_EGLSyncListGroup): @@ -214,12 +227,14 @@ class EGLSyncListGroup(QGroupBox, Ui_EGLSyncListGroup): self.buttons_widget.setVisible(enabled and bool(self.list.count())) def action(self): + imported = list() for item in self.items: if item.is_checked(): item.action() + imported.append(item.app_name) self.list.takeItem(self.list.row(item)) - if not self.export: - shared.signals.update_gamelist.emit(str()) + if not self.export and imported: + shared.signals.update_gamelist.emit(imported) self.populate(True) @property diff --git a/rare/components/tabs/games/import_sync/import_group.py b/rare/components/tabs/games/import_sync/import_group.py index 4100470f..e6f002e0 100644 --- a/rare/components/tabs/games/import_sync/import_group.py +++ b/rare/components/tabs/games/import_sync/import_group.py @@ -1,12 +1,11 @@ import json import os from logging import getLogger -from typing import Tuple +from typing import List, Tuple from PyQt5.QtCore import Qt, QModelIndex, pyqtSignal from PyQt5.QtGui import QStandardItemModel -from PyQt5.QtWidgets import QFileDialog, QGroupBox, QCompleter, QListView -from legendary.core import LegendaryCore +from PyQt5.QtWidgets import QFileDialog, QGroupBox, QCompleter, QListView, QTreeView, QHeaderView import rare.shared as shared from rare.ui.components.tabs.games.import_sync.import_group import Ui_ImportGroup @@ -19,11 +18,11 @@ logger = getLogger("Import") class AppNameCompleter(QCompleter): activated = pyqtSignal(str) - def __init__(self, core: LegendaryCore, parent=None): + def __init__(self, app_names: List, parent=None): super(AppNameCompleter, self).__init__(parent) + # pylint: disable=E1136 super(AppNameCompleter, self).activated[QModelIndex].connect(self.__activated) - app_names = [(i.app_name, i.app_title) for i in core.get_game_list()] model = QStandardItemModel(len(app_names), 2) for idx, game in enumerate(app_names): app_name, app_title = game @@ -31,16 +30,16 @@ class AppNameCompleter(QCompleter): model.setData(model.index(idx, 1), app_name) self.setModel(model) - # treeview = QTreeView() - # treeview.setRootIsDecorated(False) - # treeview.header().hide() - # treeview.header().setSectionResizeMode(0, QHeaderView.Stretch) - # treeview.header().setSectionResizeMode(1, QHeaderView.ResizeToContents) - # self.setPopup(treeview) + treeview = QTreeView() + self.setPopup(treeview) + treeview.setRootIsDecorated(False) + treeview.header().hide() + treeview.header().setSectionResizeMode(0, QHeaderView.Stretch) + treeview.header().setSectionResizeMode(1, QHeaderView.Stretch) - listview = QListView() - # listview.setModelColumn(1) - self.setPopup(listview) + # listview = QListView() + # self.setPopup(listview) + # # listview.setModelColumn(1) self.setFilterMode(Qt.MatchContains) self.setCaseSensitivity(Qt.CaseInsensitive) @@ -82,7 +81,7 @@ class ImportGroup(QGroupBox, Ui_ImportGroup): self.app_name = IndicatorLineEdit( ph_text=self.tr("Use in case the app name was not found automatically"), - completer=AppNameCompleter(self.core), + completer=AppNameCompleter(app_names=[(i.app_name, i.app_title) for i in self.core.get_game_list()]), edit_func=self.app_name_edit_cb, parent=self ) diff --git a/rare/utils/extra_widgets.py b/rare/utils/extra_widgets.py index f73d3335..6667431e 100644 --- a/rare/utils/extra_widgets.py +++ b/rare/utils/extra_widgets.py @@ -137,14 +137,23 @@ class IndicatorLineEdit(QWidget): horiz_policy: QSizePolicy = QSizePolicy.Expanding, parent=None): super(IndicatorLineEdit, self).__init__(parent=parent) - self.setObjectName("IndicatorTextEdit") + self.setObjectName("IndicatorLineEdit") self.layout = QHBoxLayout(self) self.layout.setObjectName("layout") self.layout.setContentsMargins(0, 0, 0, 0) + # Add line_edit self.line_edit = QLineEdit(self) self.line_edit.setObjectName("line_edit") self.line_edit.setPlaceholderText(ph_text) self.line_edit.setSizePolicy(horiz_policy, QSizePolicy.Fixed) + # Add hint_label to line_edit + self.line_edit.setLayout(QHBoxLayout()) + self.hint_label = QLabel() + self.hint_label.setObjectName('HintLabel') + self.hint_label.setAlignment(Qt.AlignRight | Qt.AlignVCenter) + self.line_edit.layout().setContentsMargins(0, 0, 10, 0) + self.line_edit.layout().addWidget(self.hint_label) + # Add completer if completer is not None: completer.popup().setItemDelegate(QStyledItemDelegate(self)) completer.popup().setAlternatingRowColors(True) @@ -181,6 +190,10 @@ class IndicatorLineEdit(QWidget): def setText(self, text: str): self.line_edit.setText(text) + def setHintText(self, text: str): + self.hint_label.setFrameRect(self.line_edit.rect()) + self.hint_label.setText(text) + def __indicator(self, res): color = "green" if res else "red" self.indicator_label.setPixmap(qta_icon("ei.info-circle", color=color).pixmap(16, 16)) diff --git a/rare/utils/utils.py b/rare/utils/utils.py index 0f216414..9a62660a 100644 --- a/rare/utils/utils.py +++ b/rare/utils/utils.py @@ -445,6 +445,10 @@ class WineResolver(QRunnable): @pyqtSlot() def run(self): + if 'WINEPREFIX' not in self.wine_env: + # pylint: disable=E1136 + self.signals.result_ready[str].emit(str()) + return path = self.path.strip().replace('/', '\\') cmd = 'cd {} & cd'.format(path) # [self.wine_binary, 'cmd', '/c', 'echo', path] if path not exists alternative @@ -459,4 +463,6 @@ class WineResolver(QRunnable): env=self.wine_env, shell=False, text=True) out, err = proc.communicate() real_path = os.path.realpath(out.strip()) - self.signals.result_ready.emit(real_path) + # pylint: disable=E1136 + self.signals.result_ready[str].emit(real_path) + return