Add path completer for PathEdit.
Doesn't enumerate hidden folders right now unless the RootPath is re-set (Through the browse button)
This commit is contained in:
parent
4c3d9925e7
commit
8805dd5325
|
@ -2,9 +2,9 @@ from logging import getLogger
|
||||||
|
|
||||||
from PyQt5.QtCore import QSettings, QObjectCleanupHandler
|
from PyQt5.QtCore import QSettings, QObjectCleanupHandler
|
||||||
from PyQt5.QtWidgets import QStackedWidget, QVBoxLayout, QWidget
|
from PyQt5.QtWidgets import QStackedWidget, QVBoxLayout, QWidget
|
||||||
|
from legendary.models.game import Game, InstalledGame
|
||||||
|
|
||||||
import rare.shared as shared
|
import rare.shared as shared
|
||||||
from legendary.models.game import Game, InstalledGame
|
|
||||||
from rare.components.dialogs.uninstall_dialog import UninstallDialog
|
from rare.components.dialogs.uninstall_dialog import UninstallDialog
|
||||||
from rare.ui.components.tabs.games.games_tab import Ui_GamesTab
|
from rare.ui.components.tabs.games.games_tab import Ui_GamesTab
|
||||||
from rare.utils import legendary_utils
|
from rare.utils import legendary_utils
|
||||||
|
|
|
@ -254,7 +254,7 @@ QToolButton {
|
||||||
border-radius: 2px;
|
border-radius: 2px;
|
||||||
padding: 2px;
|
padding: 2px;
|
||||||
padding-left: 6px;
|
padding-left: 6px;
|
||||||
padding-right: 6px
|
padding-right: 6px;
|
||||||
}
|
}
|
||||||
QPushButton::menu-indicator {
|
QPushButton::menu-indicator {
|
||||||
subcontrol-position: right center;
|
subcontrol-position: right center;
|
||||||
|
|
|
@ -5,11 +5,12 @@ from typing import Callable, Tuple
|
||||||
|
|
||||||
import PIL
|
import PIL
|
||||||
from PIL import Image
|
from PIL import Image
|
||||||
from PyQt5.QtCore import Qt, QCoreApplication, QRect, QSize, QPoint, pyqtSignal
|
from PyQt5.QtCore import Qt, QCoreApplication, QRect, QSize, QPoint, pyqtSignal, QFileInfo
|
||||||
from PyQt5.QtGui import QMovie, QPixmap, QFontMetrics
|
from PyQt5.QtGui import QMovie, QPixmap, QFontMetrics
|
||||||
from PyQt5.QtWidgets import QLayout, QStyle, QSizePolicy, QLabel, QFileDialog, QHBoxLayout, QWidget, QPushButton, \
|
from PyQt5.QtWidgets import QLayout, QStyle, QSizePolicy, QLabel, QFileDialog, QHBoxLayout, QWidget, QPushButton, \
|
||||||
QStyleOptionTab, QStylePainter, QTabBar, QLineEdit, QToolButton, QTabWidget
|
QStyleOptionTab, QStylePainter, QTabBar, QLineEdit, QToolButton, QTabWidget, QCompleter, QFileSystemModel, \
|
||||||
from qtawesome import icon
|
QStyledItemDelegate, QFileIconProvider
|
||||||
|
from qtawesome import icon as qta_icon
|
||||||
|
|
||||||
from rare import resources_path, cache_dir
|
from rare import resources_path, cache_dir
|
||||||
from rare.utils.qt_requests import QtRequestManager
|
from rare.utils.qt_requests import QtRequestManager
|
||||||
|
@ -130,6 +131,7 @@ class IndicatorLineEdit(QWidget):
|
||||||
def __init__(self,
|
def __init__(self,
|
||||||
text: str = "",
|
text: str = "",
|
||||||
ph_text: str = "",
|
ph_text: str = "",
|
||||||
|
completer: QCompleter = None,
|
||||||
edit_func: Callable[[str], Tuple[bool, str]] = None,
|
edit_func: Callable[[str], Tuple[bool, str]] = None,
|
||||||
save_func: Callable[[str], None] = None,
|
save_func: Callable[[str], None] = None,
|
||||||
horiz_policy: QSizePolicy = QSizePolicy.Expanding,
|
horiz_policy: QSizePolicy = QSizePolicy.Expanding,
|
||||||
|
@ -143,10 +145,13 @@ class IndicatorLineEdit(QWidget):
|
||||||
self.line_edit.setObjectName("line_edit")
|
self.line_edit.setObjectName("line_edit")
|
||||||
self.line_edit.setPlaceholderText(ph_text)
|
self.line_edit.setPlaceholderText(ph_text)
|
||||||
self.line_edit.setSizePolicy(horiz_policy, QSizePolicy.Fixed)
|
self.line_edit.setSizePolicy(horiz_policy, QSizePolicy.Fixed)
|
||||||
|
if completer is not None:
|
||||||
|
completer.popup().setItemDelegate(QStyledItemDelegate(self))
|
||||||
|
self.line_edit.setCompleter(completer)
|
||||||
self.layout.addWidget(self.line_edit)
|
self.layout.addWidget(self.line_edit)
|
||||||
if edit_func is not None:
|
if edit_func is not None:
|
||||||
self.indicator_label = QLabel()
|
self.indicator_label = QLabel()
|
||||||
self.indicator_label.setPixmap(icon("ei.info-circle", color="gray").pixmap(16, 16))
|
self.indicator_label.setPixmap(qta_icon("ei.info-circle", color="gray").pixmap(16, 16))
|
||||||
self.indicator_label.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)
|
self.indicator_label.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)
|
||||||
self.layout.addWidget(self.indicator_label)
|
self.layout.addWidget(self.indicator_label)
|
||||||
|
|
||||||
|
@ -177,7 +182,7 @@ class IndicatorLineEdit(QWidget):
|
||||||
|
|
||||||
def __indicator(self, res):
|
def __indicator(self, res):
|
||||||
color = "green" if res else "red"
|
color = "green" if res else "red"
|
||||||
self.indicator_label.setPixmap(icon("ei.info-circle", color=color).pixmap(16, 16))
|
self.indicator_label.setPixmap(qta_icon("ei.info-circle", color=color).pixmap(16, 16))
|
||||||
|
|
||||||
def __edit(self, text):
|
def __edit(self, text):
|
||||||
if self.edit_func is not None:
|
if self.edit_func is not None:
|
||||||
|
@ -195,7 +200,43 @@ class IndicatorLineEdit(QWidget):
|
||||||
self.save_func(text)
|
self.save_func(text)
|
||||||
|
|
||||||
|
|
||||||
|
class PathEditIconProvider(QFileIconProvider):
|
||||||
|
icons = [
|
||||||
|
'mdi.file-cancel', # Unknown
|
||||||
|
'mdi.desktop-classic', # Computer
|
||||||
|
'mdi.desktop-mac', # Desktop
|
||||||
|
'mdi.trash-can', # Trashcan
|
||||||
|
'mdi.server-network', # Network
|
||||||
|
'mdi.harddisk', # Drive
|
||||||
|
'mdi.folder', # Folder
|
||||||
|
'mdi.file', # File
|
||||||
|
'mdi.cog', # Executable
|
||||||
|
]
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
super(PathEditIconProvider, self).__init__()
|
||||||
|
self.icon_types = dict()
|
||||||
|
for idx, icn in enumerate(self.icons):
|
||||||
|
self.icon_types.update({idx-1: qta_icon(icn, color='#eeeeee')})
|
||||||
|
|
||||||
|
def icon(self, info_type):
|
||||||
|
if isinstance(info_type, QFileInfo):
|
||||||
|
if info_type.isRoot():
|
||||||
|
return self.icon_types[4]
|
||||||
|
if info_type.isDir():
|
||||||
|
return self.icon_types[5]
|
||||||
|
if info_type.isFile():
|
||||||
|
return self.icon_types[6]
|
||||||
|
if info_type.isExecutable():
|
||||||
|
return self.icon_types[7]
|
||||||
|
return self.icon_types[-1]
|
||||||
|
return self.icon_types[int(info_type)]
|
||||||
|
|
||||||
|
|
||||||
class PathEdit(IndicatorLineEdit):
|
class PathEdit(IndicatorLineEdit):
|
||||||
|
compl = QCompleter()
|
||||||
|
compl_model = QFileSystemModel()
|
||||||
|
|
||||||
def __init__(self,
|
def __init__(self,
|
||||||
path: str = "",
|
path: str = "",
|
||||||
file_type: QFileDialog.FileType = QFileDialog.AnyFile,
|
file_type: QFileDialog.FileType = QFileDialog.AnyFile,
|
||||||
|
@ -206,7 +247,13 @@ class PathEdit(IndicatorLineEdit):
|
||||||
save_func: Callable[[str], None] = None,
|
save_func: Callable[[str], None] = None,
|
||||||
horiz_policy: QSizePolicy = QSizePolicy.Expanding,
|
horiz_policy: QSizePolicy = QSizePolicy.Expanding,
|
||||||
parent=None):
|
parent=None):
|
||||||
super(PathEdit, self).__init__(text=path, ph_text=ph_text,
|
self.compl_model.setOptions(QFileSystemModel.DontWatchForChanges |
|
||||||
|
QFileSystemModel.DontResolveSymlinks |
|
||||||
|
QFileSystemModel.DontUseCustomDirectoryIcons)
|
||||||
|
self.compl_model.setIconProvider(PathEditIconProvider())
|
||||||
|
self.compl_model.setRootPath(path)
|
||||||
|
self.compl.setModel(self.compl_model)
|
||||||
|
super(PathEdit, self).__init__(text=path, ph_text=ph_text, completer=self.compl,
|
||||||
edit_func=edit_func, save_func=save_func,
|
edit_func=edit_func, save_func=save_func,
|
||||||
horiz_policy=horiz_policy, parent=parent)
|
horiz_policy=horiz_policy, parent=parent)
|
||||||
self.setObjectName("PathEdit")
|
self.setObjectName("PathEdit")
|
||||||
|
@ -237,6 +284,7 @@ class PathEdit(IndicatorLineEdit):
|
||||||
if dlg.exec_():
|
if dlg.exec_():
|
||||||
names = dlg.selectedFiles()
|
names = dlg.selectedFiles()
|
||||||
self.line_edit.setText(names[0])
|
self.line_edit.setText(names[0])
|
||||||
|
self.compl_model.setRootPath(names[0])
|
||||||
|
|
||||||
|
|
||||||
class SideTabBar(QTabBar):
|
class SideTabBar(QTabBar):
|
||||||
|
@ -280,7 +328,7 @@ class SideTabWidget(QTabWidget):
|
||||||
self.setTabBar(SideTabBar())
|
self.setTabBar(SideTabBar())
|
||||||
self.setTabPosition(QTabWidget.West)
|
self.setTabPosition(QTabWidget.West)
|
||||||
if show_back:
|
if show_back:
|
||||||
self.addTab(QWidget(), icon("mdi.keyboard-backspace"), self.tr("Back"))
|
self.addTab(QWidget(), qta_icon("mdi.keyboard-backspace"), self.tr("Back"))
|
||||||
self.tabBarClicked.connect(self.back_func)
|
self.tabBarClicked.connect(self.back_func)
|
||||||
|
|
||||||
def back_func(self, tab):
|
def back_func(self, tab):
|
||||||
|
@ -311,11 +359,11 @@ class SelectViewWidget(QWidget):
|
||||||
self.icon_view_button = QPushButton()
|
self.icon_view_button = QPushButton()
|
||||||
self.list_view = QPushButton()
|
self.list_view = QPushButton()
|
||||||
if icon_view:
|
if icon_view:
|
||||||
self.icon_view_button.setIcon(icon("mdi.view-grid-outline", color="orange"))
|
self.icon_view_button.setIcon(qta_icon("mdi.view-grid-outline", color="orange"))
|
||||||
self.list_view.setIcon(icon("fa5s.list"))
|
self.list_view.setIcon(qta_icon("fa5s.list"))
|
||||||
else:
|
else:
|
||||||
self.icon_view_button.setIcon(icon("mdi.view-grid-outline"))
|
self.icon_view_button.setIcon(qta_icon("mdi.view-grid-outline"))
|
||||||
self.list_view.setIcon(icon("fa5s.list", color="orange"))
|
self.list_view.setIcon(qta_icon("fa5s.list", color="orange"))
|
||||||
|
|
||||||
self.icon_view_button.clicked.connect(self.icon)
|
self.icon_view_button.clicked.connect(self.icon)
|
||||||
self.list_view.clicked.connect(self.list)
|
self.list_view.clicked.connect(self.list)
|
||||||
|
@ -330,14 +378,14 @@ class SelectViewWidget(QWidget):
|
||||||
return self.icon_view
|
return self.icon_view
|
||||||
|
|
||||||
def icon(self):
|
def icon(self):
|
||||||
self.icon_view_button.setIcon(icon("mdi.view-grid-outline", color="orange"))
|
self.icon_view_button.setIcon(qta_icon("mdi.view-grid-outline", color="orange"))
|
||||||
self.list_view.setIcon(icon("fa5s.list"))
|
self.list_view.setIcon(qta_icon("fa5s.list"))
|
||||||
self.icon_view = False
|
self.icon_view = False
|
||||||
self.toggled.emit()
|
self.toggled.emit()
|
||||||
|
|
||||||
def list(self):
|
def list(self):
|
||||||
self.icon_view_button.setIcon(icon("mdi.view-grid-outline"))
|
self.icon_view_button.setIcon(qta_icon("mdi.view-grid-outline"))
|
||||||
self.list_view.setIcon(icon("fa5s.list", color="orange"))
|
self.list_view.setIcon(qta_icon("fa5s.list", color="orange"))
|
||||||
self.icon_view = True
|
self.icon_view = True
|
||||||
self.toggled.emit()
|
self.toggled.emit()
|
||||||
|
|
||||||
|
@ -401,7 +449,7 @@ class ButtonLineEdit(QLineEdit):
|
||||||
super(ButtonLineEdit, self).__init__(parent)
|
super(ButtonLineEdit, self).__init__(parent)
|
||||||
|
|
||||||
self.button = QToolButton(self)
|
self.button = QToolButton(self)
|
||||||
self.button.setIcon(icon(icon_name, color="white"))
|
self.button.setIcon(qta_icon(icon_name, color="white"))
|
||||||
self.button.setStyleSheet('border: 0px; padding: 0px;')
|
self.button.setStyleSheet('border: 0px; padding: 0px;')
|
||||||
self.button.setCursor(Qt.ArrowCursor)
|
self.button.setCursor(Qt.ArrowCursor)
|
||||||
self.button.clicked.connect(self.buttonClicked.emit)
|
self.button.clicked.connect(self.buttonClicked.emit)
|
||||||
|
|
Loading…
Reference in a new issue