commit
c1c2153cc5
|
@ -2,7 +2,7 @@ import platform
|
|||
from logging import getLogger
|
||||
|
||||
from PyQt5.QtCore import Qt, pyqtSignal, QRunnable, QObject, QThreadPool, QSettings
|
||||
from PyQt5.QtWidgets import QDialog, QApplication
|
||||
from PyQt5.QtWidgets import QDialog, qApp
|
||||
from requests.exceptions import ConnectionError, HTTPError
|
||||
|
||||
from rare.components.dialogs.login import LoginDialog
|
||||
|
@ -19,6 +19,7 @@ class LaunchWorker(QRunnable):
|
|||
class Signals(QObject):
|
||||
progress = pyqtSignal(int)
|
||||
result = pyqtSignal(object, str)
|
||||
finished = pyqtSignal()
|
||||
|
||||
def __init__(self):
|
||||
super(LaunchWorker, self).__init__()
|
||||
|
@ -53,8 +54,7 @@ class ImageWorker(LaunchWorker):
|
|||
self.core.lgd.set_game_meta(game.app_name, game)
|
||||
self.image_manager.download_image_blocking(game)
|
||||
self.signals.progress.emit(int(i / len(game_list) * 100))
|
||||
|
||||
self.signals.progress.emit(100)
|
||||
self.signals.finished.emit()
|
||||
|
||||
|
||||
class ApiRequestWorker(LaunchWorker):
|
||||
|
@ -65,7 +65,7 @@ class ApiRequestWorker(LaunchWorker):
|
|||
def run(self) -> None:
|
||||
if self.settings.value("mac_meta", platform.system() == "Darwin", bool):
|
||||
try:
|
||||
result = self.core.get_game_and_dlc_list(update_assets=True, platform="Mac")
|
||||
result = self.core.get_game_and_dlc_list(update_assets=False, platform="Mac")
|
||||
except HTTPError:
|
||||
result = [], {}
|
||||
else:
|
||||
|
@ -74,7 +74,7 @@ class ApiRequestWorker(LaunchWorker):
|
|||
|
||||
if self.settings.value("win32_meta", False, bool):
|
||||
try:
|
||||
result = self.core.get_game_and_dlc_list(update_assets=True, platform="Win32")
|
||||
result = self.core.get_game_and_dlc_list(update_assets=False, platform="Win32")
|
||||
except HTTPError:
|
||||
result = [], {}
|
||||
else:
|
||||
|
@ -95,8 +95,10 @@ class LaunchDialog(QDialog, Ui_LaunchDialog):
|
|||
Qt.Window
|
||||
| Qt.Dialog
|
||||
| Qt.CustomizeWindowHint
|
||||
| Qt.WindowSystemMenuHint
|
||||
| Qt.WindowTitleHint
|
||||
| Qt.WindowMinimizeButtonHint
|
||||
| Qt.MSWindowsFixedSizeDialogHint
|
||||
)
|
||||
self.setWindowModality(Qt.WindowModal)
|
||||
|
||||
|
@ -111,7 +113,7 @@ class LaunchDialog(QDialog, Ui_LaunchDialog):
|
|||
if self.args.offline:
|
||||
pass
|
||||
else:
|
||||
QApplication.processEvents()
|
||||
qApp.processEvents()
|
||||
if self.core.login():
|
||||
logger.info("You are logged in")
|
||||
else:
|
||||
|
@ -132,20 +134,25 @@ class LaunchDialog(QDialog, Ui_LaunchDialog):
|
|||
else:
|
||||
self.quit_app.emit(0)
|
||||
|
||||
def start_api_requests(self):
|
||||
# gamelist and no_asset games are from Image worker
|
||||
api_worker = ApiRequestWorker()
|
||||
api_worker.signals.result.connect(self.handle_api_worker_result)
|
||||
self.thread_pool.start(api_worker)
|
||||
|
||||
def launch(self):
|
||||
|
||||
if not self.args.offline:
|
||||
self.image_info.setText(self.tr("Downloading Images"))
|
||||
image_worker = ImageWorker()
|
||||
image_worker.signals.progress.connect(self.update_image_progbar)
|
||||
image_worker.signals.result.connect(self.handle_api_worker_result)
|
||||
image_worker.signals.progress.connect(self.update_image_progbar)
|
||||
# lk: start the api requests worker after the manifests have been downloaded
|
||||
# lk: to avoid force updating the assets twice and causing inconsistencies
|
||||
image_worker.signals.finished.connect(self.start_api_requests)
|
||||
image_worker.signals.finished.connect(self.finish)
|
||||
self.thread_pool.start(image_worker)
|
||||
|
||||
# gamelist and no_asset games are from Image worker
|
||||
api_worker = ApiRequestWorker()
|
||||
api_worker.signals.result.connect(self.handle_api_worker_result)
|
||||
self.thread_pool.start(api_worker)
|
||||
|
||||
# cloud save from another worker, because it is used in cloud_save_utils too
|
||||
cloud_worker = CloudWorker()
|
||||
cloud_worker.signals.result_ready.connect(lambda x: self.handle_api_worker_result(x, "saves"))
|
||||
|
@ -180,14 +187,14 @@ class LaunchDialog(QDialog, Ui_LaunchDialog):
|
|||
self.api_results.game_list,
|
||||
self.api_results.dlcs,
|
||||
) = self.core.get_game_and_dlc_list(False)
|
||||
elif text == "no_assets":
|
||||
self.api_results.no_asset_games = result if result else []
|
||||
|
||||
elif text == "32bit":
|
||||
self.api_results.bit32_games = [i.app_name for i in result[0]] if result else []
|
||||
elif text == "mac":
|
||||
self.api_results.mac_games = [i.app_name for i in result[0]] if result else []
|
||||
|
||||
elif text == "no_assets":
|
||||
self.api_results.no_asset_games = result if result else []
|
||||
|
||||
elif text == "saves":
|
||||
self.api_results.saves = result
|
||||
|
||||
|
@ -196,14 +203,18 @@ class LaunchDialog(QDialog, Ui_LaunchDialog):
|
|||
|
||||
def update_image_progbar(self, i: int):
|
||||
self.image_prog_bar.setValue(i)
|
||||
if i == 100:
|
||||
self.finish()
|
||||
|
||||
def finish(self):
|
||||
if self.completed == 1:
|
||||
self.completed += 1
|
||||
if self.completed == 2:
|
||||
logger.info("App starting")
|
||||
self.image_info.setText(self.tr("Starting..."))
|
||||
ApiResultsSingleton(self.api_results)
|
||||
self.start_app.emit()
|
||||
else:
|
||||
self.completed += 1
|
||||
self.start_app.emit()
|
||||
|
||||
def reject(self) -> None:
|
||||
if self.completed >= 3:
|
||||
super(LaunchDialog, self).reject()
|
||||
else:
|
||||
pass
|
||||
|
|
|
@ -43,9 +43,11 @@ class LoginDialog(QDialog):
|
|||
Qt.Window
|
||||
| Qt.Dialog
|
||||
| Qt.CustomizeWindowHint
|
||||
| Qt.WindowSystemMenuHint
|
||||
| Qt.WindowTitleHint
|
||||
| Qt.WindowMinimizeButtonHint
|
||||
| Qt.WindowCloseButtonHint
|
||||
| Qt.MSWindowsFixedSizeDialogHint
|
||||
)
|
||||
self.setWindowModality(Qt.WindowModal)
|
||||
|
||||
|
|
|
@ -12,7 +12,6 @@ from rare.shared import (
|
|||
ApiResultsSingleton,
|
||||
)
|
||||
from rare.shared.image_manager import ImageManagerSingleton
|
||||
from rare.ui.components.tabs.games.games_tab import Ui_GamesTab
|
||||
from rare.widgets.library_layout import LibraryLayout
|
||||
from rare.widgets.sliding_stack import SlidingStackedWidget
|
||||
from .cloud_save_utils import CloudSaveUtils
|
||||
|
@ -42,9 +41,6 @@ class GamesTab(QStackedWidget):
|
|||
|
||||
def __init__(self, parent=None):
|
||||
super(GamesTab, self).__init__(parent=parent)
|
||||
self.ui = Ui_GamesTab()
|
||||
self.ui.setupUi(self)
|
||||
|
||||
self.core = LegendaryCoreSingleton()
|
||||
self.signals = GlobalSignalsSingleton()
|
||||
self.args = ArgumentsSingleton()
|
||||
|
@ -60,22 +56,26 @@ class GamesTab(QStackedWidget):
|
|||
|
||||
self.game_utils = GameUtils(parent=self)
|
||||
|
||||
self.head_bar = GameListHeadBar(self)
|
||||
self.games = QWidget(parent=self)
|
||||
self.games.setLayout(QVBoxLayout())
|
||||
self.addWidget(self.games)
|
||||
|
||||
self.head_bar = GameListHeadBar(parent=self.games)
|
||||
self.head_bar.import_clicked.connect(self.show_import)
|
||||
self.head_bar.egl_sync_clicked.connect(self.show_egl_sync)
|
||||
self.ui.games.layout().insertWidget(0, self.head_bar)
|
||||
self.games.layout().addWidget(self.head_bar)
|
||||
|
||||
self.game_info_tabs = GameInfoTabs(self.dlcs, self.game_utils, self)
|
||||
self.game_info_tabs.back_clicked.connect(lambda: self.setCurrentIndex(0))
|
||||
self.game_info_tabs.back_clicked.connect(lambda: self.setCurrentWidget(self.games))
|
||||
self.addWidget(self.game_info_tabs)
|
||||
|
||||
self.game_info_tabs.info.verification_finished.connect(
|
||||
self.verification_finished
|
||||
)
|
||||
self.game_info_tabs.info.uninstalled.connect(lambda x: self.setCurrentIndex(0))
|
||||
self.game_info_tabs.info.uninstalled.connect(lambda x: self.setCurrentWidget(self.games))
|
||||
|
||||
self.import_sync_tabs = ImportSyncTabs(self)
|
||||
self.import_sync_tabs.back_clicked.connect(lambda: self.setCurrentIndex(0))
|
||||
self.import_sync_tabs.back_clicked.connect(lambda: self.setCurrentWidget(self.games))
|
||||
self.addWidget(self.import_sync_tabs)
|
||||
|
||||
for i in self.game_list:
|
||||
|
@ -91,12 +91,9 @@ class GamesTab(QStackedWidget):
|
|||
self.ue_name = ""
|
||||
|
||||
self.uninstalled_info_tabs = UninstalledInfoTabs(self)
|
||||
self.uninstalled_info_tabs.back_clicked.connect(lambda: self.setCurrentIndex(0))
|
||||
self.uninstalled_info_tabs.back_clicked.connect(lambda: self.setCurrentWidget(self.games))
|
||||
self.addWidget(self.uninstalled_info_tabs)
|
||||
|
||||
# navigation
|
||||
self.head_bar.import_game.clicked.connect(lambda: self.setCurrentIndex(2))
|
||||
|
||||
self.no_asset_names = []
|
||||
if not self.args.offline:
|
||||
for game in self.no_assets:
|
||||
|
@ -106,19 +103,19 @@ class GamesTab(QStackedWidget):
|
|||
|
||||
self.installed = self.core.get_installed_list()
|
||||
|
||||
self.view_stack = SlidingStackedWidget(self.ui.library_frame)
|
||||
self.view_stack = SlidingStackedWidget(self.games)
|
||||
self.view_stack.setFrameStyle(QFrame.NoFrame)
|
||||
self.icon_view_scroll = QScrollArea(self.view_stack)
|
||||
self.icon_view_scroll.setWidgetResizable(True)
|
||||
self.icon_view_scroll.setFrameShape(QFrame.NoFrame)
|
||||
self.icon_view_scroll.setFrameShape(QFrame.StyledPanel)
|
||||
self.icon_view_scroll.horizontalScrollBar().setDisabled(True)
|
||||
self.list_view_scroll = QScrollArea(self.view_stack)
|
||||
self.list_view_scroll.setWidgetResizable(True)
|
||||
self.list_view_scroll.setFrameShape(QFrame.NoFrame)
|
||||
self.list_view_scroll.setFrameShape(QFrame.StyledPanel)
|
||||
self.list_view_scroll.horizontalScrollBar().setDisabled(True)
|
||||
self.icon_view = QWidget(self.icon_view_scroll)
|
||||
self.icon_view.setLayout(LibraryLayout(self.icon_view))
|
||||
self.icon_view.layout().setContentsMargins(0, 0, 0, 0)
|
||||
self.icon_view.layout().setContentsMargins(0, 13, 0, 0)
|
||||
self.icon_view.layout().setAlignment(Qt.AlignTop)
|
||||
self.list_view = QWidget(self.list_view_scroll)
|
||||
self.list_view.setLayout(QVBoxLayout(self.list_view))
|
||||
|
@ -128,7 +125,7 @@ class GamesTab(QStackedWidget):
|
|||
self.list_view_scroll.setWidget(self.list_view)
|
||||
self.view_stack.addWidget(self.icon_view_scroll)
|
||||
self.view_stack.addWidget(self.list_view_scroll)
|
||||
self.ui.library_frame_layout.addWidget(self.view_stack)
|
||||
self.games.layout().addWidget(self.view_stack)
|
||||
|
||||
# add installing game widget for icon view: List view not supported
|
||||
self.installing_widget = InstallingGameWidget()
|
||||
|
@ -188,28 +185,24 @@ class GamesTab(QStackedWidget):
|
|||
l_widget.update_text()
|
||||
|
||||
def show_import(self):
|
||||
self.setCurrentIndex(2)
|
||||
self.setCurrentWidget(self.import_sync_tabs)
|
||||
self.import_sync_tabs.show_import()
|
||||
|
||||
def show_egl_sync(self, idx):
|
||||
self.setCurrentIndex(2)
|
||||
self.setCurrentWidget(self.import_sync_tabs)
|
||||
self.import_sync_tabs.show_egl_sync()
|
||||
|
||||
def show_game_info(self, app_name):
|
||||
self.game_info_tabs.update_game(app_name)
|
||||
self.setCurrentIndex(1)
|
||||
self.setCurrentWidget(self.game_info_tabs)
|
||||
|
||||
def show_uninstalled_info(self, game):
|
||||
self.uninstalled_info_tabs.update_game(game)
|
||||
self.setCurrentIndex(3)
|
||||
self.setCurrentWidget(self.uninstalled_info_tabs)
|
||||
|
||||
@pyqtSlot()
|
||||
def update_count_games_label(self):
|
||||
self.ui.count_games_label.setText(
|
||||
self.tr("Installed Games: {}\tAvailable Games: {}").format(
|
||||
len(self.core.get_installed_list()), len(self.game_list)
|
||||
)
|
||||
)
|
||||
self.head_bar.set_games_count(len(self.core.get_installed_list()), len(self.game_list))
|
||||
|
||||
def setup_game_list(self):
|
||||
self.update_count_games_label()
|
||||
|
|
|
@ -112,9 +112,9 @@ class LibraryWidget(ImageWidget):
|
|||
self.updateProgress(0)
|
||||
|
||||
def updateProgress(self, progress: int):
|
||||
self.progress_label.setText(f"{progress:02}%")
|
||||
if progress > self._progress:
|
||||
self._progress = progress
|
||||
self.progress_label.setText(f"{progress:02}%")
|
||||
self.setPixmap(self.progressPixmap(self._color_pixmap, self._gray_pixmap, progress))
|
||||
|
||||
def hideProgress(self, stopped: bool):
|
||||
|
|
|
@ -1,12 +1,12 @@
|
|||
from PyQt5.QtCore import QSize, QSettings, pyqtSignal
|
||||
from PyQt5.QtCore import QSettings, pyqtSignal
|
||||
from PyQt5.QtWidgets import (
|
||||
QLineEdit,
|
||||
QLabel,
|
||||
QPushButton,
|
||||
QWidget,
|
||||
QHBoxLayout,
|
||||
QComboBox,
|
||||
)
|
||||
from qtawesome import IconWidget
|
||||
|
||||
from rare.shared import ApiResultsSingleton
|
||||
from rare.utils.extra_widgets import SelectViewWidget, ButtonLineEdit
|
||||
|
@ -19,10 +19,7 @@ class GameListHeadBar(QWidget):
|
|||
def __init__(self, parent=None):
|
||||
super(GameListHeadBar, self).__init__(parent=parent)
|
||||
self.api_results = ApiResultsSingleton()
|
||||
# self.installed_only = QCheckBox(self.tr("Installed only"))
|
||||
self.settings = QSettings()
|
||||
# self.installed_only.setChecked(self.settings.value("installed_only", False, bool))
|
||||
# self.layout.addWidget(self.installed_only)
|
||||
|
||||
self.filter = QComboBox()
|
||||
self.filter.addItems(
|
||||
|
@ -30,7 +27,8 @@ class GameListHeadBar(QWidget):
|
|||
self.tr("All games"),
|
||||
self.tr("Installed only"),
|
||||
self.tr("Offline Games"),
|
||||
])
|
||||
]
|
||||
)
|
||||
|
||||
self.available_filters = [
|
||||
"all",
|
||||
|
@ -75,6 +73,22 @@ class GameListHeadBar(QWidget):
|
|||
|
||||
checked = QSettings().value("icon_view", True, bool)
|
||||
|
||||
installed_tooltip = self.tr("Installed games")
|
||||
self.installed_icon = IconWidget(parent=self)
|
||||
self.installed_icon.setIcon(icon("ph.floppy-disk-back-fill"))
|
||||
self.installed_icon.setToolTip(installed_tooltip)
|
||||
self.installed_label = QLabel(parent=self)
|
||||
font = self.installed_label.font()
|
||||
font.setBold(True)
|
||||
self.installed_label.setFont(font)
|
||||
self.installed_label.setToolTip(installed_tooltip)
|
||||
available_tooltip = self.tr("Available games")
|
||||
self.available_icon = IconWidget(parent=self)
|
||||
self.available_icon.setIcon(icon("ph.floppy-disk-back-light"))
|
||||
self.available_icon.setToolTip(available_tooltip)
|
||||
self.available_label = QLabel(parent=self)
|
||||
self.available_label.setToolTip(available_tooltip)
|
||||
|
||||
self.view = SelectViewWidget(checked)
|
||||
|
||||
self.refresh_list = QPushButton()
|
||||
|
@ -86,14 +100,23 @@ class GameListHeadBar(QWidget):
|
|||
layout.addStretch(1)
|
||||
layout.addWidget(self.import_game)
|
||||
layout.addWidget(self.egl_sync)
|
||||
layout.addStretch(1)
|
||||
layout.addStretch(2)
|
||||
layout.addWidget(self.search_bar)
|
||||
layout.addStretch(3)
|
||||
layout.addStretch(2)
|
||||
layout.addWidget(self.installed_icon)
|
||||
layout.addWidget(self.installed_label)
|
||||
layout.addWidget(self.available_icon)
|
||||
layout.addWidget(self.available_label)
|
||||
layout.addStretch(2)
|
||||
layout.addWidget(self.view)
|
||||
layout.addStretch(1)
|
||||
layout.addStretch(2)
|
||||
layout.addWidget(self.refresh_list)
|
||||
self.setLayout(layout)
|
||||
|
||||
def set_games_count(self, inst: int, avail: int) -> None:
|
||||
self.installed_label.setText(str(inst))
|
||||
self.available_label.setText(str(avail))
|
||||
|
||||
def filter_changed(self, i):
|
||||
self.filterChanged.emit(self.available_filters[i])
|
||||
self.settings.setValue("filter", i)
|
||||
|
|
|
@ -1,57 +0,0 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
|
||||
# Form implementation generated from reading ui file 'rare/ui/components/tabs/games/games_tab.ui'
|
||||
#
|
||||
# Created by: PyQt5 UI code generator 5.15.6
|
||||
#
|
||||
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
|
||||
# run again. Do not edit this file unless you know what you are doing.
|
||||
|
||||
|
||||
from PyQt5 import QtCore, QtGui, QtWidgets
|
||||
|
||||
|
||||
class Ui_GamesTab(object):
|
||||
def setupUi(self, GamesTab):
|
||||
GamesTab.setObjectName("GamesTab")
|
||||
GamesTab.resize(104, 42)
|
||||
GamesTab.setWindowTitle("StackedWidget")
|
||||
self.games = QtWidgets.QWidget()
|
||||
self.games.setObjectName("games")
|
||||
self.games_layout = QtWidgets.QVBoxLayout(self.games)
|
||||
self.games_layout.setObjectName("games_layout")
|
||||
self.library_frame = QtWidgets.QFrame(self.games)
|
||||
self.library_frame.setFrameShape(QtWidgets.QFrame.StyledPanel)
|
||||
self.library_frame.setObjectName("library_frame")
|
||||
self.library_frame_layout = QtWidgets.QVBoxLayout(self.library_frame)
|
||||
self.library_frame_layout.setContentsMargins(0, 0, 0, 0)
|
||||
self.library_frame_layout.setObjectName("library_frame_layout")
|
||||
self.count_games_layout = QtWidgets.QHBoxLayout()
|
||||
self.count_games_layout.setSizeConstraint(QtWidgets.QLayout.SetFixedSize)
|
||||
self.count_games_layout.setContentsMargins(6, 6, 6, 6)
|
||||
self.count_games_layout.setObjectName("count_games_layout")
|
||||
self.count_games_label = QtWidgets.QLabel(self.library_frame)
|
||||
self.count_games_label.setText("error")
|
||||
self.count_games_label.setObjectName("count_games_label")
|
||||
self.count_games_layout.addWidget(self.count_games_label, 0, QtCore.Qt.AlignTop)
|
||||
self.library_frame_layout.addLayout(self.count_games_layout)
|
||||
self.games_layout.addWidget(self.library_frame)
|
||||
self.games_layout.setStretch(0, 1)
|
||||
GamesTab.addWidget(self.games)
|
||||
|
||||
self.retranslateUi(GamesTab)
|
||||
GamesTab.setCurrentIndex(0)
|
||||
QtCore.QMetaObject.connectSlotsByName(GamesTab)
|
||||
|
||||
def retranslateUi(self, GamesTab):
|
||||
pass
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
import sys
|
||||
app = QtWidgets.QApplication(sys.argv)
|
||||
GamesTab = QtWidgets.QStackedWidget()
|
||||
ui = Ui_GamesTab()
|
||||
ui.setupUi(GamesTab)
|
||||
GamesTab.show()
|
||||
sys.exit(app.exec_())
|
|
@ -1,73 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>GamesTab</class>
|
||||
<widget class="QStackedWidget" name="GamesTab">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>104</width>
|
||||
<height>42</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string notr="true">StackedWidget</string>
|
||||
</property>
|
||||
<property name="currentIndex">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<widget class="QWidget" name="games">
|
||||
<layout class="QVBoxLayout" name="games_layout" stretch="1">
|
||||
<item>
|
||||
<widget class="QFrame" name="library_frame">
|
||||
<property name="frameShape">
|
||||
<enum>QFrame::StyledPanel</enum>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="library_frame_layout">
|
||||
<property name="leftMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="count_games_layout">
|
||||
<property name="sizeConstraint">
|
||||
<enum>QLayout::SetFixedSize</enum>
|
||||
</property>
|
||||
<property name="leftMargin">
|
||||
<number>6</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>6</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>6</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>6</number>
|
||||
</property>
|
||||
<item alignment="Qt::AlignTop">
|
||||
<widget class="QLabel" name="count_games_label">
|
||||
<property name="text">
|
||||
<string notr="true">error</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</widget>
|
||||
<resources/>
|
||||
<connections/>
|
||||
</ui>
|
Loading…
Reference in a new issue