1
0
Fork 0
mirror of synced 2024-06-25 17:50:45 +12:00

Adjust BrowserLogin to use IndicatorLineEdit

Adjust Locale in `LegendarySettings` to use `IndicatorLineEdit`
Adjust `InstallDialog` to conform with new `PathEdit` `edit_func` specification

This commit temporarily removes `EGLSync` from `LegendarySettings`
as it is being worked on.
This commit is contained in:
Stelios Tsampas 2021-10-09 15:08:54 +03:00
parent c1e750138f
commit 463443796d
9 changed files with 371 additions and 882 deletions

View file

@ -140,10 +140,11 @@ class InstallDialog(QDialog, Ui_InstallDialog):
self.get_options()
self.get_download_info()
def option_changed(self):
def option_changed(self, path):
self.options_changed = True
self.install_button.setEnabled(False)
self.verify_button.setEnabled(not self.worker_running)
return True, path
def cancel_clicked(self):
self.dl_item.download = None

View file

@ -2,7 +2,7 @@ from dataclasses import dataclass
from logging import getLogger
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QDialog
from PyQt5.QtWidgets import QDialog, QMessageBox
from legendary.core import LegendaryCore
from rare.components.dialogs.login.browser_login import BrowserLogin
@ -35,7 +35,7 @@ class LoginDialog(QDialog, Ui_LoginDialog):
self.login_stack.insertWidget(self.pages.browser, self.browser_page)
self.browser_page.success.connect(self.login_successful)
self.browser_page.changed.connect(
self.next_button.setEnabled
lambda: self.next_button.setEnabled(self.browser_page.is_valid())
)
self.import_page = ImportLogin(self.core, self.login_stack)
self.login_stack.insertWidget(self.pages.import_egl, self.import_page)
@ -76,8 +76,6 @@ class LoginDialog(QDialog, Ui_LoginDialog):
self.browser_page.do_login()
elif self.login_stack.currentIndex() == self.pages.import_egl:
self.import_page.do_login()
else:
self.close()
def login(self):
self.exec_()
@ -94,3 +92,5 @@ class LoginDialog(QDialog, Ui_LoginDialog):
logger.error(str(e))
self.next_button.setEnabled(False)
self.logged_in = False
QMessageBox.warning(self, "Error", str(e))

View file

@ -4,16 +4,17 @@ from logging import getLogger
from PyQt5.QtCore import pyqtSignal, QUrl
from PyQt5.QtGui import QDesktopServices
from PyQt5.QtWidgets import QWidget
from legendary.core import LegendaryCore
from rare.ui.components.dialogs.login.browser_login import Ui_BrowserLogin
from rare.utils.extra_widgets import IndicatorLineEdit
logger = getLogger("BrowserLogin")
class BrowserLogin(QWidget, Ui_BrowserLogin):
success = pyqtSignal()
changed = pyqtSignal(bool)
changed = pyqtSignal()
login_url = "https://www.epicgames.com/id/login?redirectUrl=https%3A%2F%2Fwww.epicgames.com%2Fid%2Fapi%2Fredirect"
def __init__(self, core: LegendaryCore, parent=None):
@ -22,34 +23,37 @@ class BrowserLogin(QWidget, Ui_BrowserLogin):
self.core = core
self.sid_edit = IndicatorLineEdit(
ph_text=self.tr("Insert SID here"),
edit_func=self.text_changed,
parent=self
)
self.sid_layout.addWidget(self.sid_edit)
self.open_button.clicked.connect(self.open_browser)
self.sid_edit.textChanged.connect(self.text_changed)
self.sid_edit.textChanged.connect(self.changed.emit)
def is_valid(self, text: str):
def is_valid(self):
return self.sid_edit.is_valid
@staticmethod
def text_changed(text) -> tuple[bool, str]:
if text:
return len(text) == 32
text = text.strip()
if text.startswith("{") and text.endswith("}"):
try:
text = json.loads(text).get("sid")
except json.JSONDecodeError:
return False, text
elif '"' in text:
text = text.strip('"')
return len(text) == 32, text
else:
return len(self.sid_edit.text()) == 32
def text_changed(self, text):
if not self.is_valid(text):
try:
sid = json.loads(text).get("sid")
if sid and self.is_valid(sid):
self.sid_edit.setText(sid)
self.status_label.setText(self.tr("Parsed sid from pasted text"))
except json.JSONDecodeError:
self.changed.emit(False)
else:
self.changed.emit(True)
return False, text
def do_login(self):
self.status_label.setText(self.tr("Logging in..."))
sid = self.sid_edit.text()
# when the text copied
if sid.startswith("{") and sid.endswith("}"):
sid = json.loads(sid)["sid"]
try:
token = self.core.auth_sid(sid)
if self.core.auth_code(token):

View file

@ -3,22 +3,19 @@ import platform
import re
from logging import getLogger
from PyQt5.QtWidgets import QFileDialog, QMessageBox, QVBoxLayout, QDialog, QCheckBox, QLabel, \
QHBoxLayout, QPushButton, QGroupBox, QWidget
from qtawesome import icon
from PyQt5.QtWidgets import QSizePolicy, QWidget, QFileDialog, QMessageBox
from legendary.core import LegendaryCore
from rare import shared
import rare.shared as shared
from rare.ui.components.tabs.settings.legendary import Ui_LegendarySettings
from rare.utils.extra_widgets import PathEdit
from rare.utils.extra_widgets import PathEdit, IndicatorLineEdit
from rare.utils.utils import get_size
logger = getLogger("LegendarySettings")
class LegendarySettings(QWidget, Ui_LegendarySettings):
def __init__(self):
super(LegendarySettings, self).__init__()
def __init__(self, parent=None):
super(LegendarySettings, self).__init__(parent=parent)
self.setupUi(self)
self.core = shared.legendary_core
@ -26,7 +23,7 @@ class LegendarySettings(QWidget, Ui_LegendarySettings):
# Default installation directory
self.install_dir = PathEdit(self.core.get_default_install_dir(),
file_type=QFileDialog.DirectoryOnly,
save_func=self.save_path)
save_func=self.path_save)
self.install_dir_layout.addWidget(self.install_dir)
# Max Workers
@ -54,159 +51,40 @@ class LegendarySettings(QWidget, Ui_LegendarySettings):
lambda: self.cleanup(True)
)
self.manifest_path_info.setText(
self.tr("EGL path is at C:\\ProgramData\\Epic\\EpicGamesLauncher\\Data\\Manifests"))
path = os.path.expanduser("~/")
if self.core.egl.programdata_path:
path = self.core.egl.programdata_path
self.locale_edit = IndicatorLineEdit(
f"{self.core.language_code}-{self.core.country_code}",
edit_func=self.locale_chck,
save_func=self.locale_save,
horiz_policy=QSizePolicy.Minimum,
parent=self
)
self.locale_layout.addWidget(self.locale_edit)
@staticmethod
def locale_chck(text: str) -> tuple[bool, str]:
if text:
if re.match("^[a-zA-Z]{2,3}_[a-zA-Z]{2,3}$", text):
language, country = text.split("_")
text = "-".join([language.lower(), country.upper()])
return bool(re.match("^[a-z]{2,3}-[A-Z]{2,3}$", text)), text
else:
possible_wine_prefixes = [os.path.expanduser("~/.wine"),
os.path.expanduser("~/Games/epic-games-store")]
for i in possible_wine_prefixes:
if os.path.exists(p := os.path.join(i, "drive_c/ProgramData/Epic/EpicGamesLauncher/Data/Manifests")):
path = p
return True, text
self.manifest_path_edit = PathEdit(path, QFileDialog.DirectoryOnly, save_func=self.save_egl_path)
self.manifest_path_layout.addWidget(self.manifest_path_edit)
if platform.system() != "Windows":
self.core.lgd.config.set('Legendary', 'egl_programdata', path)
self.core.egl.programdata_path = path
self.importable_widgets = list()
self.exportable_widgets = list()
if self.core.egl_sync_enabled:
self.egl_sync_button.setText(self.tr("Disable sync"))
else:
self.egl_sync_button.setText(self.tr("Enable Sync"))
self.egl_sync_button.clicked.connect(self.sync)
self.enable_sync_button.clicked.connect(self.enable_sync)
self.sync_once_button.clicked.connect(self.core.egl_sync)
self.locale_lineedit.setText(f"{self.core.language_code}-{self.core.country_code}")
self.locale_lineedit.textChanged.connect(self.save_locale)
def save_locale(self, text: str):
if re.match("^[a-z]{2,3}-[A-Z]{2,3}$", text):
self.core.egs.language_code = text.split("-")[0]
self.core.egs.country_code = text.split("-")[1]
def locale_save(self, text: str):
if text:
self.core.egs.language_code, self.core.egs.country_code = text.split("-")
self.core.lgd.config.set("Legendary", "locale", text)
self.core.lgd.save_config()
self.indicator_label.setPixmap(icon("ei.ok-sign", color="green").pixmap(16, 16))
elif re.match("^[a-zA-Z]{2,3}[-_][a-zA-Z]{2,3}$", text):
text = text.replace("_", "-")
# changing text triggers text changed signal
self.locale_lineedit.setText(text.split("-")[0].lower() + "-" + text.split("-")[1].upper())
elif text == "":
else:
if self.core.lgd.config.has_option("Legendary", "locale"):
self.core.lgd.config.remove_option("Legendary", "locale")
self.core.lgd.save_config()
self.indicator_label.setPixmap(icon("ei.ok-sign", color="green").pixmap(16, 16))
else:
self.indicator_label.setPixmap(icon("fa.warning", color="red").pixmap(16, 16))
def enable_sync(self):
if not self.core.egl.programdata_path:
if os.path.exists(path := self.manifest_path_edit.text()):
self.core.lgd.config.set("Legendary", "egl_programdata", path)
self.core.lgd.save_config()
self.core.egl.programdata_path = path
self.core.lgd.config.set('Legendary', 'egl_sync', "true")
self.core.egl_sync()
self.core.lgd.save_config()
self.egl_sync_button.setText(self.tr("Disable Sync"))
self.enable_sync_button.setDisabled(True)
def export_all(self):
for ew in self.exportable_widgets:
ew.export_game()
self.exportable_widgets.clear()
def import_all(self):
for iw in self.importable_widgets:
iw.import_game()
self.importable_widgets.clear()
def save_egl_path(self):
self.core.lgd.config.set("Legendary", "egl_programdata", self.manifest_path_edit.text())
self.core.egl.programdata_path = self.manifest_path_edit.text()
self.core.lgd.save_config()
self.update_egl_widget()
def sync(self):
if self.core.egl_sync_enabled:
# disable sync
info = DisableSyncDialog().get_information()
if info[0] == 0:
if info[1]:
self.core.lgd.config.remove_option('Legendary', 'egl_sync')
else:
self.core.lgd.config.remove_option('Legendary', 'egl_programdata')
self.core.lgd.config.remove_option('Legendary', 'egl_sync')
# remove EGL GUIDs from all games, DO NOT remove .egstore folders because that would fuck things up.
for igame in self.core.get_installed_list():
igame.egl_guid = ''
self.core.install_game(igame)
self.core.lgd.save_config()
self.egl_sync_button.setText(self.tr("Enable Sync"))
else:
# enable sync
self.enable_sync_button.setDisabled(False)
self.update_egl_widget()
def update_egl_widget(self):
self.import_scroll.setVisible(bool(self.core.egl.programdata_path))
self.export_scroll.setVisible(bool(self.core.egl.programdata_path))
self.export_all_button.setDisabled(not bool(self.core.egl.programdata_path))
self.import_all_button.setDisabled(not bool(self.core.egl.programdata_path))
if not self.core.egl.programdata_path:
return
if self.exportable_widgets:
for ew in self.exportable_widgets:
# FIXME: Handle this using signals to properly update the list on python's side
try:
ew.deleteLater()
except RuntimeError as e:
print(e)
self.exportable_widgets.clear()
exportable_games = self.core.egl_get_exportable()
for igame in exportable_games:
ew = EGLSyncWidget(igame, True, self.core)
self.exportable_widgets.append(ew)
self.exportable_layout.addWidget(ew)
self.export_group.setEnabled(bool(exportable_games))
self.export_all_button.setEnabled(bool(exportable_games))
self.export_label.setVisible(not bool(exportable_games))
if self.importable_widgets:
for iw in self.importable_widgets:
# FIXME: Handle this using signals to properly update the list on python's side
try:
iw.deleteLater()
except RuntimeError as e:
print(e)
self.importable_widgets.clear()
importable_games = self.core.egl_get_importable()
for game in importable_games:
iw = EGLSyncWidget(game, False, self.core)
self.importable_widgets.append(iw)
self.importable_layout.addWidget(iw)
self.import_group.setEnabled(bool(importable_games))
self.import_all_button.setEnabled(bool(importable_games))
self.import_label.setVisible(not bool(importable_games))
def save_path(self):
self.core.lgd.config["Legendary"]["install_dir"] = self.install_dir.text()
if self.install_dir.text() == "" and "install_dir" in self.core.lgd.config["Legendary"].keys():
def path_save(self, text: str):
self.core.lgd.config["Legendary"]["install_dir"] = text
if not text and "install_dir" in self.core.lgd.config["Legendary"].keys():
self.core.lgd.config["Legendary"].pop("install_dir")
else:
logger.info("Set config install_dir to " + self.install_dir.text())
logger.info("Set config install_dir to " + text)
self.core.lgd.save_config()
def max_worker_save(self, workers: str):
@ -256,81 +134,3 @@ class LegendarySettings(QWidget, Ui_LegendarySettings):
get_size(before - after)))
else:
QMessageBox.information(self, "Cleanup", "Nothing to clean")
class DisableSyncDialog(QDialog):
info = 1, False
def __init__(self, parent=None):
super(DisableSyncDialog, self).__init__(parent=parent)
self.layout = QVBoxLayout()
self.question = QLabel(self.tr("Do you really want to disable sync with Epic Games Store"))
self.layout.addWidget(self.question)
self.remove_metadata = QCheckBox(self.tr("Remove metadata from installed games"))
self.layout.addWidget(self.remove_metadata)
self.button_layout = QHBoxLayout()
self.button_layout.addStretch(1)
self.ok_button = QPushButton(self.tr("Ok"))
self.cancel_button = QPushButton(self.tr("Cancel"))
self.ok_button.clicked.connect(self.ok)
self.cancel_button.clicked.connect(self.cancel)
self.button_layout.addWidget(self.ok_button)
self.button_layout.addWidget(self.cancel_button)
self.layout.addStretch(1)
self.layout.addLayout(self.button_layout)
self.setLayout(self.layout)
def ok(self):
self.info = 0, self.remove_metadata.isChecked()
self.close()
def cancel(self):
self.close()
def get_information(self):
self.exec_()
return self.info
class EGLSyncWidget(QGroupBox):
def __init__(self, game, export: bool, core: LegendaryCore, parent=None):
super(EGLSyncWidget, self).__init__(parent=parent)
self.layout = QVBoxLayout()
self.export = export
self.core = core
self.game = game
if export:
self.app_title_label = QLabel(game.title)
else:
title = self.core.get_game(game.app_name).app_title
self.app_title_label = QLabel(title)
self.layout.addWidget(self.app_title_label)
self.button = QPushButton(self.tr("Export") if export else self.tr("Import"))
if export:
self.button.clicked.connect(self.export_game)
else:
self.button.clicked.connect(self.import_game)
self.layout.addWidget(self.button)
self.setLayout(self.layout)
def export_game(self):
self.core.egl_export(self.game.app_name)
# FIXME: on update_egl_widget this is going to crash because
# FIXME: the item is not removed from the list in the python's side
self.deleteLater()
def import_game(self):
self.core.egl_import(self.game.app_name)
# FIXME: on update_egl_widget this is going to crash because
# FIXME: the item is not removed from the list in the python's side
self.deleteLater()

View file

@ -1,6 +1,6 @@
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'browser_login.ui'
# Form implementation generated from reading ui file 'rare/ui/components/dialogs/login/browser_login.ui'
#
# Created by: PyQt5 UI code generator 5.15.4
#
@ -14,7 +14,7 @@ from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_BrowserLogin(object):
def setupUi(self, BrowserLogin):
BrowserLogin.setObjectName("BrowserLogin")
BrowserLogin.resize(246, 130)
BrowserLogin.resize(382, 178)
BrowserLogin.setWindowTitle("BrowserLogin")
self.browser_layout = QtWidgets.QGridLayout(BrowserLogin)
self.browser_layout.setObjectName("browser_layout")
@ -28,9 +28,6 @@ class Ui_BrowserLogin(object):
self.title_label.setFont(font)
self.title_label.setObjectName("title_label")
self.browser_layout.addWidget(self.title_label, 0, 0, 1, 2, QtCore.Qt.AlignTop)
self.sid_edit = QtWidgets.QLineEdit(BrowserLogin)
self.sid_edit.setObjectName("sid_edit")
self.browser_layout.addWidget(self.sid_edit, 1, 1, 1, 1)
self.info_label = QtWidgets.QLabel(BrowserLogin)
font = QtGui.QFont()
font.setItalic(True)
@ -47,6 +44,9 @@ class Ui_BrowserLogin(object):
self.status_label.setText("")
self.status_label.setObjectName("status_label")
self.browser_layout.addWidget(self.status_label, 2, 1, 1, 1)
self.sid_layout = QtWidgets.QHBoxLayout()
self.sid_layout.setObjectName("sid_layout")
self.browser_layout.addLayout(self.sid_layout, 1, 1, 1, 1)
self.retranslateUi(BrowserLogin)
QtCore.QMetaObject.connectSlotsByName(BrowserLogin)
@ -55,14 +55,11 @@ class Ui_BrowserLogin(object):
_translate = QtCore.QCoreApplication.translate
self.open_button.setText(_translate("BrowserLogin", "Open Browser"))
self.title_label.setText(_translate("BrowserLogin", "Login through browser"))
self.sid_edit.setPlaceholderText(_translate("BrowserLogin", "Insert SID here"))
self.info_label.setText(_translate("BrowserLogin",
"Click the button to open the login page in a browser. After logging in, copy the SID code in the input above."))
self.info_label.setText(_translate("BrowserLogin", "Click the button to open the login page in a browser. After logging in, copy the SID code in the input above."))
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
BrowserLogin = QtWidgets.QWidget()
ui = Ui_BrowserLogin()

View file

@ -1,78 +1,72 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>BrowserLogin</class>
<widget class="QWidget" name="BrowserLogin">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>246</width>
<height>130</height>
</rect>
</property>
<property name="windowTitle">
<string notr="true">BrowserLogin</string>
</property>
<layout class="QGridLayout" name="browser_layout">
<item row="1" column="0">
<widget class="QPushButton" name="open_button">
<property name="text">
<string>Open Browser</string>
</property>
</widget>
</item>
<item row="0" column="0" colspan="2" alignment="Qt::AlignTop">
<widget class="QLabel" name="title_label">
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>Login through browser</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QLineEdit" name="sid_edit">
<property name="placeholderText">
<string>Insert SID here</string>
</property>
</widget>
</item>
<item row="3" column="0" colspan="2" alignment="Qt::AlignBottom">
<widget class="QLabel" name="info_label">
<property name="font">
<font>
<italic>true</italic>
</font>
</property>
<property name="text">
<string>Click the button to open the login page in a browser. After logging in, copy the SID
code in the input above.
</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QLabel" name="status_label">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string notr="true"/>
</property>
</widget>
</item>
</layout>
<class>BrowserLogin</class>
<widget class="QWidget" name="BrowserLogin">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>382</width>
<height>178</height>
</rect>
</property>
<property name="windowTitle">
<string notr="true">BrowserLogin</string>
</property>
<layout class="QGridLayout" name="browser_layout">
<item row="1" column="0">
<widget class="QPushButton" name="open_button">
<property name="text">
<string>Open Browser</string>
</property>
</widget>
<resources/>
<connections/>
</item>
<item row="0" column="0" colspan="2" alignment="Qt::AlignTop">
<widget class="QLabel" name="title_label">
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>Login through browser</string>
</property>
</widget>
</item>
<item row="3" column="0" colspan="2" alignment="Qt::AlignBottom">
<widget class="QLabel" name="info_label">
<property name="font">
<font>
<italic>true</italic>
</font>
</property>
<property name="text">
<string>Click the button to open the login page in a browser. After logging in, copy the SID code in the input above.</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QLabel" name="status_label">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string notr="true"/>
</property>
</widget>
</item>
<item row="1" column="1">
<layout class="QHBoxLayout" name="sid_layout"/>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>

View file

@ -1,209 +1,209 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>LoginDialog</class>
<widget class="QDialog" name="LoginDialog">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>498</width>
<height>311</height>
</rect>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="windowTitle">
<string>Welcome to Rare</string>
</property>
<layout class="QVBoxLayout" name="dialog_layout">
<item>
<spacer name="login_vspacer_top">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Fixed</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QLabel" name="welcome_label">
<property name="text">
<string>&lt;h1&gt;Welcome to Rare&lt;/h1&gt;</string>
</property>
</widget>
</item>
<item>
<spacer name="login_vspacer_bottom">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Fixed</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QStackedWidget" name="login_stack">
<property name="enabled">
<bool>true</bool>
</property>
<property name="minimumSize">
<size>
<width>480</width>
<height>135</height>
</size>
</property>
<property name="frameShape">
<enum>QFrame::StyledPanel</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Raised</enum>
</property>
<property name="currentIndex">
<number>0</number>
</property>
<widget class="QWidget" name="login_page">
<property name="enabled">
<bool>true</bool>
</property>
<layout class="QGridLayout" name="login_page_layout">
<item row="1" column="1">
<widget class="QLabel" name="login_browser_label">
<property name="font">
<font>
<italic>true</italic>
</font>
</property>
<property name="text">
<string>Login using a browser.</string>
</property>
</widget>
</item>
<item row="0" column="0" colspan="3" alignment="Qt::AlignTop">
<widget class="QLabel" name="login_label">
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>Select login method</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QLabel" name="login_import_label">
<property name="font">
<font>
<italic>true</italic>
</font>
</property>
<property name="text">
<string>Import from Epic Games Launcher</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QRadioButton" name="login_import_radio">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Import</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QRadioButton" name="login_browser_radio">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Browser</string>
</property>
</widget>
</item>
<item row="1" column="2" rowspan="2">
<spacer name="login_hspacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="button_layout">
<item>
<spacer name="button_hspacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QPushButton" name="exit_button">
<property name="text">
<string>Exit</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="back_button">
<property name="text">
<string>Back</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="next_button">
<property name="text">
<string>Next</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
<class>LoginDialog</class>
<widget class="QDialog" name="LoginDialog">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>498</width>
<height>311</height>
</rect>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="windowTitle">
<string>Welcome to Rare</string>
</property>
<layout class="QVBoxLayout" name="dialog_layout">
<item>
<spacer name="login_vspacer_top">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Fixed</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QLabel" name="welcome_label">
<property name="text">
<string>&lt;h1&gt;Welcome to Rare&lt;/h1&gt;</string>
</property>
</widget>
<resources/>
<connections/>
</item>
<item>
<spacer name="login_vspacer_bottom">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Fixed</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QStackedWidget" name="login_stack">
<property name="enabled">
<bool>true</bool>
</property>
<property name="minimumSize">
<size>
<width>480</width>
<height>135</height>
</size>
</property>
<property name="frameShape">
<enum>QFrame::StyledPanel</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Raised</enum>
</property>
<property name="currentIndex">
<number>0</number>
</property>
<widget class="QWidget" name="login_page">
<property name="enabled">
<bool>true</bool>
</property>
<layout class="QGridLayout" name="login_page_layout">
<item row="1" column="1">
<widget class="QLabel" name="login_browser_label">
<property name="font">
<font>
<italic>true</italic>
</font>
</property>
<property name="text">
<string>Login using a browser.</string>
</property>
</widget>
</item>
<item row="0" column="0" colspan="3" alignment="Qt::AlignTop">
<widget class="QLabel" name="login_label">
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>Select login method</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QLabel" name="login_import_label">
<property name="font">
<font>
<italic>true</italic>
</font>
</property>
<property name="text">
<string>Import from Epic Games Launcher</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QRadioButton" name="login_import_radio">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Import</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QRadioButton" name="login_browser_radio">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Browser</string>
</property>
</widget>
</item>
<item row="1" column="2" rowspan="2">
<spacer name="login_hspacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="button_layout">
<item>
<spacer name="button_hspacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QPushButton" name="exit_button">
<property name="text">
<string>Exit</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="back_button">
<property name="text">
<string>Back</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="next_button">
<property name="text">
<string>Next</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>

View file

@ -14,7 +14,7 @@ from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_LegendarySettings(object):
def setupUi(self, LegendarySettings):
LegendarySettings.setObjectName("LegendarySettings")
LegendarySettings.resize(796, 732)
LegendarySettings.resize(552, 268)
LegendarySettings.setWindowTitle("LegendarySettings")
self.settings_layout = QtWidgets.QHBoxLayout(LegendarySettings)
self.settings_layout.setObjectName("settings_layout")
@ -28,7 +28,7 @@ class Ui_LegendarySettings(object):
self.download_group = QtWidgets.QGroupBox(LegendarySettings)
self.download_group.setObjectName("download_group")
self.download_layout = QtWidgets.QFormLayout(self.download_group)
self.download_layout.setLabelAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter)
self.download_layout.setLabelAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
self.download_layout.setObjectName("download_layout")
self.max_workers_label = QtWidgets.QLabel(self.download_group)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Preferred)
@ -96,91 +96,21 @@ class Ui_LegendarySettings(object):
self.disable_https_check.setObjectName("disable_https_check")
self.download_layout.setWidget(3, QtWidgets.QFormLayout.FieldRole, self.disable_https_check)
self.left_layout.addWidget(self.download_group)
self.egl_sync_group = QtWidgets.QGroupBox(LegendarySettings)
self.egl_sync_group.setObjectName("egl_sync_group")
self.egl_sync_layout = QtWidgets.QVBoxLayout(self.egl_sync_group)
self.egl_sync_layout.setObjectName("egl_sync_layout")
self.manifest_path_layout = QtWidgets.QVBoxLayout()
self.manifest_path_layout.setObjectName("manifest_path_layout")
self.egl_sync_layout.addLayout(self.manifest_path_layout)
self.manifest_path_info = QtWidgets.QLabel(self.egl_sync_group)
self.manifest_path_info.setText("TextLabel")
self.manifest_path_info.setObjectName("manifest_path_info")
self.egl_sync_layout.addWidget(self.manifest_path_info)
self.export_import_layout = QtWidgets.QHBoxLayout()
self.export_import_layout.setObjectName("export_import_layout")
self.export_group = QtWidgets.QGroupBox(self.egl_sync_group)
self.export_group.setObjectName("export_group")
self.export_layout = QtWidgets.QVBoxLayout(self.export_group)
self.export_layout.setObjectName("export_layout")
self.export_label = QtWidgets.QLabel(self.export_group)
self.export_label.setObjectName("export_label")
self.export_layout.addWidget(self.export_label)
self.export_scroll = QtWidgets.QScrollArea(self.export_group)
self.export_scroll.setSizeAdjustPolicy(QtWidgets.QAbstractScrollArea.AdjustIgnored)
self.export_scroll.setWidgetResizable(True)
self.export_scroll.setObjectName("export_scroll")
self.export_contents = QtWidgets.QWidget()
self.export_contents.setGeometry(QtCore.QRect(0, 0, 248, 18))
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Maximum)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.export_contents.sizePolicy().hasHeightForWidth())
self.export_contents.setSizePolicy(sizePolicy)
self.export_contents.setObjectName("export_contents")
self.exportable_layout = QtWidgets.QVBoxLayout(self.export_contents)
self.exportable_layout.setObjectName("exportable_layout")
self.export_scroll.setWidget(self.export_contents)
self.export_layout.addWidget(self.export_scroll)
self.export_all_button = QtWidgets.QPushButton(self.export_group)
self.export_all_button.setObjectName("export_all_button")
self.export_layout.addWidget(self.export_all_button, 0, QtCore.Qt.AlignRight)
self.export_import_layout.addWidget(self.export_group)
self.import_group = QtWidgets.QGroupBox(self.egl_sync_group)
self.import_group.setObjectName("import_group")
self.import_layout = QtWidgets.QVBoxLayout(self.import_group)
self.import_layout.setObjectName("import_layout")
self.import_label = QtWidgets.QLabel(self.import_group)
self.import_label.setObjectName("import_label")
self.import_layout.addWidget(self.import_label)
self.import_scroll = QtWidgets.QScrollArea(self.import_group)
self.import_scroll.setSizeAdjustPolicy(QtWidgets.QAbstractScrollArea.AdjustIgnored)
self.import_scroll.setWidgetResizable(True)
self.import_scroll.setObjectName("import_scroll")
self.import_contents = QtWidgets.QWidget()
self.import_contents.setGeometry(QtCore.QRect(0, 0, 247, 18))
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Maximum)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.import_contents.sizePolicy().hasHeightForWidth())
self.import_contents.setSizePolicy(sizePolicy)
self.import_contents.setObjectName("import_contents")
self.importable_layout = QtWidgets.QVBoxLayout(self.import_contents)
self.importable_layout.setObjectName("importable_layout")
self.import_scroll.setWidget(self.import_contents)
self.import_layout.addWidget(self.import_scroll)
self.import_all_button = QtWidgets.QPushButton(self.import_group)
self.import_all_button.setObjectName("import_all_button")
self.import_layout.addWidget(self.import_all_button, 0, QtCore.Qt.AlignRight)
self.export_import_layout.addWidget(self.import_group)
self.egl_sync_layout.addLayout(self.export_import_layout)
self.enable_sync_group = QtWidgets.QGroupBox(self.egl_sync_group)
self.enable_sync_group.setObjectName("enable_sync_group")
self.enable_sync_layout = QtWidgets.QHBoxLayout(self.enable_sync_group)
self.enable_sync_layout.setObjectName("enable_sync_layout")
self.sync_once_button = QtWidgets.QPushButton(self.enable_sync_group)
self.sync_once_button.setObjectName("sync_once_button")
self.enable_sync_layout.addWidget(self.sync_once_button, 0, QtCore.Qt.AlignRight)
self.enable_sync_button = QtWidgets.QPushButton(self.enable_sync_group)
self.enable_sync_button.setObjectName("enable_sync_button")
self.enable_sync_layout.addWidget(self.enable_sync_button, 0, QtCore.Qt.AlignRight)
self.egl_sync_layout.addWidget(self.enable_sync_group)
self.left_layout.addWidget(self.egl_sync_group)
spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
self.left_layout.addItem(spacerItem)
self.settings_layout.addLayout(self.left_layout)
self.right_layout = QtWidgets.QVBoxLayout()
self.right_layout.setObjectName("right_layout")
self.locale_group = QtWidgets.QGroupBox(LegendarySettings)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.locale_group.sizePolicy().hasHeightForWidth())
self.locale_group.setSizePolicy(sizePolicy)
self.locale_group.setObjectName("locale_group")
self.locale_layout = QtWidgets.QVBoxLayout(self.locale_group)
self.locale_layout.setObjectName("locale_layout")
self.right_layout.addWidget(self.locale_group)
self.cleanup_group = QtWidgets.QGroupBox(LegendarySettings)
self.cleanup_group.setObjectName("cleanup_group")
self.cleanup_layout = QtWidgets.QVBoxLayout(self.cleanup_group)
@ -192,42 +122,6 @@ class Ui_LegendarySettings(object):
self.clean_button.setObjectName("clean_button")
self.cleanup_layout.addWidget(self.clean_button)
self.right_layout.addWidget(self.cleanup_group)
self.egl_sync = QtWidgets.QGroupBox(LegendarySettings)
self.egl_sync.setObjectName("egl_sync")
self.egl_sync_layout_3 = QtWidgets.QVBoxLayout(self.egl_sync)
self.egl_sync_layout_3.setObjectName("egl_sync_layout_3")
self.egl_sync_button = QtWidgets.QPushButton(self.egl_sync)
self.egl_sync_button.setObjectName("egl_sync_button")
self.egl_sync_layout_3.addWidget(self.egl_sync_button)
self.right_layout.addWidget(self.egl_sync)
self.locale_gb = QtWidgets.QGroupBox(LegendarySettings)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.locale_gb.sizePolicy().hasHeightForWidth())
self.locale_gb.setSizePolicy(sizePolicy)
self.locale_gb.setObjectName("locale_gb")
self.horizontalLayout = QtWidgets.QHBoxLayout(self.locale_gb)
self.horizontalLayout.setObjectName("horizontalLayout")
self.locale_lineedit = QtWidgets.QLineEdit(self.locale_gb)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.locale_lineedit.sizePolicy().hasHeightForWidth())
self.locale_lineedit.setSizePolicy(sizePolicy)
self.locale_lineedit.setPlaceholderText("")
self.locale_lineedit.setObjectName("locale_lineedit")
self.horizontalLayout.addWidget(self.locale_lineedit)
self.indicator_label = QtWidgets.QLabel(self.locale_gb)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Preferred)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.indicator_label.sizePolicy().hasHeightForWidth())
self.indicator_label.setSizePolicy(sizePolicy)
self.indicator_label.setText("")
self.indicator_label.setObjectName("indicator_label")
self.horizontalLayout.addWidget(self.indicator_label)
self.right_layout.addWidget(self.locale_gb)
spacerItem1 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
self.right_layout.addItem(spacerItem1)
self.settings_layout.addLayout(self.right_layout)
@ -247,22 +141,10 @@ class Ui_LegendarySettings(object):
self.preferred_cdn_label.setText(_translate("LegendarySettings", "Preferred CDN"))
self.preferred_cdn_line.setPlaceholderText(_translate("LegendarySettings", "Default"))
self.disable_https_label.setText(_translate("LegendarySettings", "Disable HTTPS"))
self.egl_sync_group.setTitle(_translate("LegendarySettings", "Sync with Epic Games Launcher"))
self.export_group.setTitle(_translate("LegendarySettings", "Exportable Games"))
self.export_label.setText(_translate("LegendarySettings", "No games to export to EGS"))
self.export_all_button.setText(_translate("LegendarySettings", "Export all Games"))
self.import_group.setTitle(_translate("LegendarySettings", "Importable"))
self.import_label.setText(_translate("LegendarySettings", "No games to import from EGS"))
self.import_all_button.setText(_translate("LegendarySettings", "Import all Games"))
self.enable_sync_group.setTitle(_translate("LegendarySettings", "Enable Sync"))
self.sync_once_button.setText(_translate("LegendarySettings", "Sync once"))
self.enable_sync_button.setText(_translate("LegendarySettings", "Enable automatic sync"))
self.locale_group.setTitle(_translate("LegendarySettings", "Locale"))
self.cleanup_group.setTitle(_translate("LegendarySettings", "Cleanup"))
self.clean_keep_manifests_button.setText(_translate("LegendarySettings", "Clean, but keep manifests"))
self.clean_button.setText(_translate("LegendarySettings", "Remove everything"))
self.egl_sync.setTitle(_translate("LegendarySettings", "EGL Sync"))
self.egl_sync_button.setText(_translate("LegendarySettings", "Sync Settings"))
self.locale_gb.setTitle(_translate("LegendarySettings", "Locale"))
if __name__ == "__main__":

View file

@ -6,8 +6,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>796</width>
<height>732</height>
<width>552</width>
<height>268</height>
</rect>
</property>
<property name="windowTitle">
@ -160,152 +160,6 @@
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="egl_sync_group">
<property name="title">
<string>Sync with Epic Games Launcher</string>
</property>
<layout class="QVBoxLayout" name="egl_sync_layout">
<item>
<layout class="QVBoxLayout" name="manifest_path_layout"/>
</item>
<item>
<widget class="QLabel" name="manifest_path_info">
<property name="text">
<string notr="true">TextLabel</string>
</property>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="export_import_layout">
<item>
<widget class="QGroupBox" name="export_group">
<property name="title">
<string>Exportable Games</string>
</property>
<layout class="QVBoxLayout" name="export_layout">
<item>
<widget class="QLabel" name="export_label">
<property name="text">
<string>No games to export to EGS</string>
</property>
</widget>
</item>
<item>
<widget class="QScrollArea" name="export_scroll">
<property name="sizeAdjustPolicy">
<enum>QAbstractScrollArea::AdjustIgnored</enum>
</property>
<property name="widgetResizable">
<bool>true</bool>
</property>
<widget class="QWidget" name="export_contents">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>248</width>
<height>18</height>
</rect>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Maximum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<layout class="QVBoxLayout" name="exportable_layout"/>
</widget>
</widget>
</item>
<item alignment="Qt::AlignRight">
<widget class="QPushButton" name="export_all_button">
<property name="text">
<string>Export all Games</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="import_group">
<property name="title">
<string>Importable</string>
</property>
<layout class="QVBoxLayout" name="import_layout">
<item>
<widget class="QLabel" name="import_label">
<property name="text">
<string>No games to import from EGS</string>
</property>
</widget>
</item>
<item>
<widget class="QScrollArea" name="import_scroll">
<property name="sizeAdjustPolicy">
<enum>QAbstractScrollArea::AdjustIgnored</enum>
</property>
<property name="widgetResizable">
<bool>true</bool>
</property>
<widget class="QWidget" name="import_contents">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>247</width>
<height>18</height>
</rect>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Maximum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<layout class="QVBoxLayout" name="importable_layout"/>
</widget>
</widget>
</item>
<item alignment="Qt::AlignRight">
<widget class="QPushButton" name="import_all_button">
<property name="text">
<string>Import all Games</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</item>
<item>
<widget class="QGroupBox" name="enable_sync_group">
<property name="title">
<string>Enable Sync</string>
</property>
<layout class="QHBoxLayout" name="enable_sync_layout">
<item alignment="Qt::AlignRight">
<widget class="QPushButton" name="sync_once_button">
<property name="text">
<string>Sync once</string>
</property>
</widget>
</item>
<item alignment="Qt::AlignRight">
<widget class="QPushButton" name="enable_sync_button">
<property name="text">
<string>Enable automatic sync</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<spacer name="left_vspacer">
<property name="orientation">
@ -323,6 +177,20 @@
</item>
<item>
<layout class="QVBoxLayout" name="right_layout">
<item>
<widget class="QGroupBox" name="locale_group">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="title">
<string>Locale</string>
</property>
<layout class="QVBoxLayout" name="locale_layout"/>
</widget>
</item>
<item>
<widget class="QGroupBox" name="cleanup_group">
<property name="title">
@ -346,63 +214,6 @@
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="egl_sync">
<property name="title">
<string>EGL Sync</string>
</property>
<layout class="QVBoxLayout" name="egl_sync_layout_3">
<item>
<widget class="QPushButton" name="egl_sync_button">
<property name="text">
<string>Sync Settings</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="locale_gb">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="title">
<string>Locale</string>
</property>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QLineEdit" name="locale_lineedit">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="placeholderText">
<string/>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="indicator_label">
<property name="sizePolicy">
<sizepolicy hsizetype="Maximum" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string/>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<spacer name="right_vspacer">
<property name="orientation">