Rework Launcher as General category

Signed-off-by: TheKodeToad <TheKodeToad@proton.me>
This commit is contained in:
TheKodeToad 2025-03-21 01:39:30 +00:00
parent d0b9073f60
commit 7dd159aac0
No known key found for this signature in database
GPG key ID: 5E39D70B4C93C38E
3 changed files with 511 additions and 696 deletions

View file

@ -72,24 +72,14 @@ LauncherPage::LauncherPage(QWidget* parent) : QWidget(parent), ui(new Ui::Launch
ui->sortingModeGroup->setId(ui->sortByNameBtn, Sort_Name); ui->sortingModeGroup->setId(ui->sortByNameBtn, Sort_Name);
ui->sortingModeGroup->setId(ui->sortLastLaunchedBtn, Sort_LastLaunch); ui->sortingModeGroup->setId(ui->sortLastLaunchedBtn, Sort_LastLaunch);
defaultFormat = new QTextCharFormat(ui->fontPreview->currentCharFormat());
m_languageModel = APPLICATION->translations();
loadSettings(); loadSettings();
ui->updateSettingsBox->setHidden(!APPLICATION->updater()); ui->updateSettingsBox->setHidden(!APPLICATION->updater());
connect(ui->fontSizeBox, QOverload<int>::of(&QSpinBox::valueChanged), this, &LauncherPage::refreshFontPreview);
connect(ui->consoleFont, &QFontComboBox::currentFontChanged, this, &LauncherPage::refreshFontPreview);
connect(ui->themeCustomizationWidget, &ThemeCustomizationWidget::currentWidgetThemeChanged, this, &LauncherPage::refreshFontPreview);
connect(ui->themeCustomizationWidget, &ThemeCustomizationWidget::currentCatChanged, APPLICATION, &Application::currentCatChanged);
} }
LauncherPage::~LauncherPage() LauncherPage::~LauncherPage()
{ {
delete ui; delete ui;
delete defaultFormat;
} }
bool LauncherPage::apply() bool LauncherPage::apply()
@ -194,9 +184,9 @@ void LauncherPage::on_skinsDirBrowseBtn_clicked()
} }
} }
void LauncherPage::on_metadataDisableBtn_clicked() void LauncherPage::on_metadataEnableBtn_clicked()
{ {
ui->metadataWarningLabel->setHidden(!ui->metadataDisableBtn->isChecked()); ui->metadataWarningLabel->setHidden(ui->metadataEnableBtn->isChecked());
} }
void LauncherPage::applySettings() void LauncherPage::applySettings()
@ -217,9 +207,6 @@ void LauncherPage::applySettings()
s->set("RequestTimeout", ui->timeoutSecondsSpinBox->value()); s->set("RequestTimeout", ui->timeoutSecondsSpinBox->value());
// Console settings // Console settings
QString consoleFontFamily = ui->consoleFont->currentFont().family();
s->set("ConsoleFont", consoleFontFamily);
s->set("ConsoleFontSize", ui->fontSizeBox->value());
s->set("ConsoleMaxLines", ui->lineLimitSpinBox->value()); s->set("ConsoleMaxLines", ui->lineLimitSpinBox->value());
s->set("ConsoleOverflowStop", ui->checkStopLogging->checkState() != Qt::Unchecked); s->set("ConsoleOverflowStop", ui->checkStopLogging->checkState() != Qt::Unchecked);
@ -245,13 +232,10 @@ void LauncherPage::applySettings()
break; break;
} }
// Cat
s->set("CatOpacity", ui->catOpacitySpinBox->value());
// Mods // Mods
s->set("ModMetadataDisabled", ui->metadataDisableBtn->isChecked()); s->set("ModMetadataDisabled", !ui->metadataEnableBtn->isChecked());
s->set("ModDependenciesDisabled", ui->dependenciesDisableBtn->isChecked()); s->set("ModDependenciesDisabled", !ui->dependenciesEnableBtn->isChecked());
s->set("SkipModpackUpdatePrompt", ui->skipModpackUpdatePromptBtn->isChecked()); s->set("SkipModpackUpdatePrompt", !ui->modpackUpdatePromptBtn->isChecked());
} }
void LauncherPage::loadSettings() void LauncherPage::loadSettings()
{ {
@ -262,11 +246,6 @@ void LauncherPage::loadSettings()
ui->updateIntervalSpinBox->setValue(APPLICATION->updater()->getUpdateCheckInterval() / 3600); ui->updateIntervalSpinBox->setValue(APPLICATION->updater()->getUpdateCheckInterval() / 3600);
} }
// Toolbar/menu bar settings (not applicable if native menu bar is present)
ui->toolsBox->setEnabled(!QMenuBar().isNativeMenuBar());
#ifdef Q_OS_MACOS
ui->toolsBox->setVisible(!QMenuBar().isNativeMenuBar());
#endif
ui->preferMenuBarCheckBox->setChecked(s->get("MenuBarInsteadOfToolBar").toBool()); ui->preferMenuBarCheckBox->setChecked(s->get("MenuBarInsteadOfToolBar").toBool());
ui->numberOfConcurrentTasksSpinBox->setValue(s->get("NumberOfConcurrentTasks").toInt()); ui->numberOfConcurrentTasksSpinBox->setValue(s->get("NumberOfConcurrentTasks").toInt());
@ -275,17 +254,6 @@ void LauncherPage::loadSettings()
ui->timeoutSecondsSpinBox->setValue(s->get("RequestTimeout").toInt()); ui->timeoutSecondsSpinBox->setValue(s->get("RequestTimeout").toInt());
// Console settings // Console settings
QString fontFamily = APPLICATION->settings()->get("ConsoleFont").toString();
QFont consoleFont(fontFamily);
ui->consoleFont->setCurrentFont(consoleFont);
bool conversionOk = true;
int fontSize = APPLICATION->settings()->get("ConsoleFontSize").toInt(&conversionOk);
if (!conversionOk) {
fontSize = 11;
}
ui->fontSizeBox->setValue(fontSize);
refreshFontPreview();
ui->lineLimitSpinBox->setValue(s->get("ConsoleMaxLines").toInt()); ui->lineLimitSpinBox->setValue(s->get("ConsoleMaxLines").toInt());
ui->checkStopLogging->setChecked(s->get("ConsoleOverflowStop").toBool()); ui->checkStopLogging->setChecked(s->get("ConsoleOverflowStop").toBool());
@ -307,59 +275,11 @@ void LauncherPage::loadSettings()
ui->sortByNameBtn->setChecked(true); ui->sortByNameBtn->setChecked(true);
} }
// Cat
ui->catOpacitySpinBox->setValue(s->get("CatOpacity").toInt());
// Mods // Mods
ui->metadataDisableBtn->setChecked(s->get("ModMetadataDisabled").toBool()); ui->metadataEnableBtn->setChecked(!s->get("ModMetadataDisabled").toBool());
ui->metadataWarningLabel->setHidden(!ui->metadataDisableBtn->isChecked()); ui->metadataWarningLabel->setHidden(ui->metadataEnableBtn->isChecked());
ui->dependenciesDisableBtn->setChecked(s->get("ModDependenciesDisabled").toBool()); ui->dependenciesEnableBtn->setChecked(!s->get("ModDependenciesDisabled").toBool());
ui->skipModpackUpdatePromptBtn->setChecked(s->get("SkipModpackUpdatePrompt").toBool()); ui->modpackUpdatePromptBtn->setChecked(!s->get("SkipModpackUpdatePrompt").toBool());
}
void LauncherPage::refreshFontPreview()
{
const LogColors& colors = APPLICATION->themeManager()->getLogColors();
int fontSize = ui->fontSizeBox->value();
QString fontFamily = ui->consoleFont->currentFont().family();
ui->fontPreview->clear();
defaultFormat->setFont(QFont(fontFamily, fontSize));
auto print = [this, colors](const QString& message, MessageLevel::Enum level) {
QTextCharFormat format(*defaultFormat);
QColor bg = colors.background.value(level);
QColor fg = colors.foreground.value(level);
if (bg.isValid())
format.setBackground(bg);
if (fg.isValid())
format.setForeground(fg);
// append a paragraph/line
auto workCursor = ui->fontPreview->textCursor();
workCursor.movePosition(QTextCursor::End);
workCursor.insertText(message, format);
workCursor.insertBlock();
};
print(QString("%1 version: %2 (%3)\n")
.arg(BuildConfig.LAUNCHER_DISPLAYNAME, BuildConfig.printableVersionString(), BuildConfig.BUILD_PLATFORM),
MessageLevel::Launcher);
QDate today = QDate::currentDate();
if (today.month() == 10 && today.day() == 31)
print(tr("[Test/ERROR] OOoooOOOoooo! A spooky error!"), MessageLevel::Error);
else
print(tr("[Test/ERROR] A spooky error!"), MessageLevel::Error);
print(tr("[Test/INFO] A harmless message..."), MessageLevel::Info);
print(tr("[Test/WARN] A not so spooky warning."), MessageLevel::Warning);
print(tr("[Test/DEBUG] A secret debugging message..."), MessageLevel::Debug);
print(tr("[Test/FATAL] A terrifying fatal error!"), MessageLevel::Fatal);
} }
void LauncherPage::retranslate() void LauncherPage::retranslate()

View file

@ -57,8 +57,8 @@ class LauncherPage : public QWidget, public BasePage {
explicit LauncherPage(QWidget* parent = 0); explicit LauncherPage(QWidget* parent = 0);
~LauncherPage(); ~LauncherPage();
QString displayName() const override { return tr("Launcher"); } QString displayName() const override { return tr("General"); }
QIcon icon() const override { return APPLICATION->getThemedIcon("launcher"); } QIcon icon() const override { return APPLICATION->getThemedIcon("settings"); }
QString id() const override { return "launcher-settings"; } QString id() const override { return "launcher-settings"; }
QString helpPage() const override { return "Launcher-settings"; } QString helpPage() const override { return "Launcher-settings"; }
bool apply() override; bool apply() override;
@ -75,23 +75,8 @@ class LauncherPage : public QWidget, public BasePage {
void on_downloadsDirBrowseBtn_clicked(); void on_downloadsDirBrowseBtn_clicked();
void on_javaDirBrowseBtn_clicked(); void on_javaDirBrowseBtn_clicked();
void on_skinsDirBrowseBtn_clicked(); void on_skinsDirBrowseBtn_clicked();
void on_metadataDisableBtn_clicked(); void on_metadataEnableBtn_clicked();
/*!
* Updates the font preview
*/
void refreshFontPreview();
private: private:
Ui::LauncherPage* ui; Ui::LauncherPage* ui;
/*!
* Stores the currently selected update channel.
*/
QString m_currentUpdateChannel;
// default format for the font preview...
QTextCharFormat* defaultFormat;
std::shared_ptr<TranslationsModel> m_languageModel;
}; };

View file

@ -6,8 +6,8 @@
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>511</width> <width>600</width>
<height>726</height> <height>700</height>
</rect> </rect>
</property> </property>
<property name="sizePolicy"> <property name="sizePolicy">
@ -16,35 +16,7 @@
<verstretch>0</verstretch> <verstretch>0</verstretch>
</sizepolicy> </sizepolicy>
</property> </property>
<layout class="QVBoxLayout" name="mainLayout"> <layout class="QVBoxLayout" name="verticalLayout">
<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>
<widget class="QTabWidget" name="tabWidget">
<property name="toolTip">
<string notr="true"/>
</property>
<property name="tabShape">
<enum>QTabWidget::Rounded</enum>
</property>
<property name="currentIndex">
<number>0</number>
</property>
<widget class="QWidget" name="featuresTab">
<attribute name="title">
<string>Features</string>
</attribute>
<layout class="QVBoxLayout" name="verticalLayout_9">
<item> <item>
<widget class="QScrollArea" name="scrollArea"> <widget class="QScrollArea" name="scrollArea">
<property name="horizontalScrollBarPolicy"> <property name="horizontalScrollBarPolicy">
@ -58,15 +30,71 @@
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>473</width> <width>563</width>
<height>770</height> <height>1293</height>
</rect> </rect>
</property> </property>
<layout class="QVBoxLayout" name="verticalLayout_8"> <layout class="QVBoxLayout" name="verticalLayout_8">
<item>
<widget class="QGroupBox" name="userInterfaceBox">
<property name="enabled">
<bool>true</bool>
</property>
<property name="title">
<string>User Interface</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_3">
<item>
<widget class="QLabel" name="instanceSortingLabel">
<property name="text">
<string>Instance Sorting</string>
</property>
</widget>
</item>
<item>
<widget class="QRadioButton" name="sortByNameBtn">
<property name="text">
<string>By &amp;name</string>
</property>
<attribute name="buttonGroup">
<string notr="true">sortingModeGroup</string>
</attribute>
</widget>
</item>
<item>
<widget class="QRadioButton" name="sortLastLaunchedBtn">
<property name="text">
<string>&amp;By last launched</string>
</property>
<attribute name="buttonGroup">
<string notr="true">sortingModeGroup</string>
</attribute>
</widget>
</item>
<item>
<widget class="Line" name="line">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="preferMenuBarCheckBox">
<property name="toolTip">
<string>The menubar is more friendly for keyboard-driven interaction.</string>
</property>
<property name="text">
<string>&amp;Replace toolbar with menubar</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item> <item>
<widget class="QGroupBox" name="updateSettingsBox"> <widget class="QGroupBox" name="updateSettingsBox">
<property name="title"> <property name="title">
<string>Update Settings</string> <string>Updater</string>
</property> </property>
<layout class="QVBoxLayout" name="verticalLayout_7"> <layout class="QVBoxLayout" name="verticalLayout_7">
<item> <item>
@ -77,15 +105,15 @@
</widget> </widget>
</item> </item>
<item> <item>
<layout class="QFormLayout" name="updateSetingsLayout">
<item row="0" column="0">
<widget class="QLabel" name="updateIntervalLabel"> <widget class="QLabel" name="updateIntervalLabel">
<property name="text"> <property name="text">
<string>Update interval</string> <string>Update checking interval</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="0" column="1"> <item>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QSpinBox" name="updateIntervalSpinBox"> <widget class="QSpinBox" name="updateIntervalSpinBox">
<property name="toolTip"> <property name="toolTip">
<string>Set it to 0 to only check on launch</string> <string>Set it to 0 to only check on launch</string>
@ -97,10 +125,23 @@
<number>0</number> <number>0</number>
</property> </property>
<property name="maximum"> <property name="maximum">
<number>99999999</number> <number>168</number>
</property> </property>
</widget> </widget>
</item> </item>
<item>
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
</spacer>
</item>
</layout> </layout>
</item> </item>
</layout> </layout>
@ -115,7 +156,7 @@
<item row="8" column="0"> <item row="8" column="0">
<widget class="QLabel" name="labelDownloadsDir"> <widget class="QLabel" name="labelDownloadsDir">
<property name="text"> <property name="text">
<string>&amp;Downloads:</string> <string>&amp;Downloads</string>
</property> </property>
<property name="buddy"> <property name="buddy">
<cstring>downloadsDirTextBox</cstring> <cstring>downloadsDirTextBox</cstring>
@ -138,7 +179,7 @@
<item row="4" column="0"> <item row="4" column="0">
<widget class="QLabel" name="labelSkinsDir"> <widget class="QLabel" name="labelSkinsDir">
<property name="text"> <property name="text">
<string>&amp;Skins:</string> <string>&amp;Skins</string>
</property> </property>
<property name="buddy"> <property name="buddy">
<cstring>skinsDirTextBox</cstring> <cstring>skinsDirTextBox</cstring>
@ -148,7 +189,7 @@
<item row="2" column="0"> <item row="2" column="0">
<widget class="QLabel" name="labelIconsDir"> <widget class="QLabel" name="labelIconsDir">
<property name="text"> <property name="text">
<string>&amp;Icons:</string> <string>&amp;Icons</string>
</property> </property>
<property name="buddy"> <property name="buddy">
<cstring>iconsDirTextBox</cstring> <cstring>iconsDirTextBox</cstring>
@ -156,28 +197,7 @@
</widget> </widget>
</item> </item>
<item row="9" column="1" colspan="2"> <item row="9" column="1" colspan="2">
<layout class="QHBoxLayout" name="downloadModsCheckLayout"> <layout class="QHBoxLayout" name="downloadModsCheckLayout"/>
<item>
<widget class="QCheckBox" name="downloadsDirWatchRecursiveCheckBox">
<property name="toolTip">
<string>When enabled, in addition to the downloads folder, its sub folders will also be searched when looking for resources (e.g. when looking for blocked mods on CurseForge).</string>
</property>
<property name="text">
<string>Check downloads folder recursively</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="downloadsDirMoveCheckBox">
<property name="toolTip">
<string>When enabled, it will move blocked resources instead of copying them.</string>
</property>
<property name="text">
<string>Move blocked resources</string>
</property>
</widget>
</item>
</layout>
</item> </item>
<item row="8" column="1"> <item row="8" column="1">
<widget class="QLineEdit" name="downloadsDirTextBox"/> <widget class="QLineEdit" name="downloadsDirTextBox"/>
@ -185,7 +205,7 @@
<item row="3" column="0"> <item row="3" column="0">
<widget class="QLabel" name="labelJavaDir"> <widget class="QLabel" name="labelJavaDir">
<property name="text"> <property name="text">
<string>&amp;Java:</string> <string>&amp;Java</string>
</property> </property>
<property name="buddy"> <property name="buddy">
<cstring>javaDirTextBox</cstring> <cstring>javaDirTextBox</cstring>
@ -195,7 +215,7 @@
<item row="1" column="0"> <item row="1" column="0">
<widget class="QLabel" name="labelModsDir"> <widget class="QLabel" name="labelModsDir">
<property name="text"> <property name="text">
<string>&amp;Mods:</string> <string>&amp;Mods</string>
</property> </property>
<property name="buddy"> <property name="buddy">
<cstring>modsDirTextBox</cstring> <cstring>modsDirTextBox</cstring>
@ -235,7 +255,7 @@
<item row="0" column="0"> <item row="0" column="0">
<widget class="QLabel" name="labelInstDir"> <widget class="QLabel" name="labelInstDir">
<property name="text"> <property name="text">
<string>I&amp;nstances:</string> <string>I&amp;nstances</string>
</property> </property>
<property name="buddy"> <property name="buddy">
<cstring>instDirTextBox</cstring> <cstring>instDirTextBox</cstring>
@ -262,16 +282,36 @@
<item> <item>
<widget class="QGroupBox" name="modsBox"> <widget class="QGroupBox" name="modsBox">
<property name="title"> <property name="title">
<string>Mods</string> <string>Mod Management</string>
</property> </property>
<layout class="QVBoxLayout" name="verticalLayout_4"> <layout class="QVBoxLayout" name="verticalLayout_4">
<item> <item>
<widget class="QCheckBox" name="metadataDisableBtn"> <widget class="QCheckBox" name="downloadsDirWatchRecursiveCheckBox">
<property name="toolTip">
<string>When enabled, in addition to the downloads folder, its sub folders will also be searched when looking for resources (e.g. when looking for blocked mods on CurseForge).</string>
</property>
<property name="text">
<string>Check &amp;subfolders for blocked mods</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="downloadsDirMoveCheckBox">
<property name="toolTip">
<string>When enabled, it will move blocked resources instead of copying them.</string>
</property>
<property name="text">
<string>Move blocked mods instead of copying them</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="metadataEnableBtn">
<property name="toolTip"> <property name="toolTip">
<string>Disable using metadata provided by mod providers (like Modrinth or CurseForge) for mods.</string> <string>Disable using metadata provided by mod providers (like Modrinth or CurseForge) for mods.</string>
</property> </property>
<property name="text"> <property name="text">
<string>Disable using metadata for mods</string> <string>Keep track of mod metadata</string>
</property> </property>
</widget> </widget>
</item> </item>
@ -286,22 +326,31 @@
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QCheckBox" name="dependenciesDisableBtn"> <widget class="QCheckBox" name="dependenciesEnableBtn">
<property name="toolTip"> <property name="toolTip">
<string>Disable the automatic detection, installation, and updating of mod dependencies.</string> <string>Disable the automatic detection, installation, and updating of mod dependencies.</string>
</property> </property>
<property name="text"> <property name="text">
<string>Disable automatic mod dependency management</string> <string>Install dependencies automatically</string>
</property> </property>
</widget> </widget>
</item> </item>
</layout>
</widget>
</item>
<item> <item>
<widget class="QCheckBox" name="skipModpackUpdatePromptBtn"> <widget class="QGroupBox" name="groupBox">
<property name="title">
<string>Modpacks</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_11">
<item>
<widget class="QCheckBox" name="modpackUpdatePromptBtn">
<property name="toolTip"> <property name="toolTip">
<string>When creating a new modpack instance, do not suggest updating existing instances instead.</string> <string>When creating a new modpack instance, do not suggest updating existing instances instead.</string>
</property> </property>
<property name="text"> <property name="text">
<string>Skip modpack update prompt</string> <string>Ask whether to update an existing instance when installing modpacks</string>
</property> </property>
</widget> </widget>
</item> </item>
@ -309,248 +358,24 @@
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QGroupBox" name="miscellaneousGroupBox"> <widget class="QGroupBox" name="groupBox_2">
<property name="title"> <property name="title">
<string>Miscellaneous</string>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="1" column="1">
<widget class="QSpinBox" name="numberOfConcurrentDownloadsSpinBox">
<property name="minimum">
<number>1</number>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="numberOfConcurrentTasksLabel">
<property name="text">
<string>Number of concurrent tasks</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QSpinBox" name="numberOfConcurrentTasksSpinBox">
<property name="minimum">
<number>1</number>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="numberOfConcurrentDownloadsLabel">
<property name="text">
<string>Number of concurrent downloads</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="numberOfManualRetriesLabel">
<property name="text">
<string>Number of manual retries</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QSpinBox" name="numberOfManualRetriesSpinBox">
<property name="minimum">
<number>0</number>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="timeoutSecondsLabel">
<property name="toolTip">
<string>Seconds to wait until the requests are terminated</string>
</property>
<property name="text">
<string>Timeout for HTTP requests</string>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QSpinBox" name="timeoutSecondsSpinBox">
<property name="suffix">
<string>s</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<spacer name="verticalSpacer_FeaturesTab">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="userInterfaceTab">
<attribute name="title">
<string>User Interface</string>
</attribute>
<layout class="QVBoxLayout" name="verticalLayout_6">
<item>
<widget class="QGroupBox" name="sortingModeBox">
<property name="enabled">
<bool>true</bool>
</property>
<property name="title">
<string>Instance view sorting mode</string>
</property>
<layout class="QHBoxLayout" name="sortingModeBoxLayout">
<item>
<widget class="QRadioButton" name="sortLastLaunchedBtn">
<property name="text">
<string>&amp;By last launched</string>
</property>
<attribute name="buttonGroup">
<string notr="true">sortingModeGroup</string>
</attribute>
</widget>
</item>
<item>
<widget class="QRadioButton" name="sortByNameBtn">
<property name="text">
<string>By &amp;name</string>
</property>
<attribute name="buttonGroup">
<string notr="true">sortingModeGroup</string>
</attribute>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="themeBox">
<property name="title">
<string>Theme</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_5">
<item>
<widget class="ThemeCustomizationWidget" name="themeCustomizationWidget" native="true"/>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="catBox">
<property name="title">
<string>Cat</string>
</property>
<layout class="QGridLayout" name="gridLayout_5">
<item row="0" column="0">
<widget class="QLabel" name="catOpacityLabel">
<property name="toolTip">
<string>Set the cat's opacity. 0% is fully transparent and 100% is fully opaque.</string>
</property>
<property name="text">
<string>Opacity</string>
</property>
</widget>
</item>
<item row="0" column="2">
<widget class="QSpinBox" name="catOpacitySpinBox">
<property name="specialValueText">
<string/>
</property>
<property name="suffix">
<string>%</string>
</property>
<property name="maximum">
<number>100</number>
</property>
<property name="value">
<number>0</number>
</property>
</widget>
</item>
<item row="0" column="1">
<spacer name="horizontalSpacer">
<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>
</item>
<item>
<widget class="QGroupBox" name="toolsBox">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="title">
<string>Tools</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QCheckBox" name="preferMenuBarCheckBox">
<property name="toolTip">
<string>The menubar is more friendly for keyboard-driven interaction.</string>
</property>
<property name="text">
<string>&amp;Replace toolbar with menubar</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<spacer name="verticalSpacer_UserInterfaceTab">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
<widget class="QWidget" name="consoleTab">
<attribute name="title">
<string>Console</string> <string>Console</string>
</attribute> </property>
<layout class="QVBoxLayout" name="verticalLayout_2"> <layout class="QVBoxLayout" name="verticalLayout_2">
<item> <item>
<widget class="QGroupBox" name="groupBox_4"> <widget class="QLabel" name="lineLimitLabel">
<property name="title">
<string>&amp;History limit</string>
</property>
<layout class="QGridLayout" name="gridLayout_3">
<item row="1" column="0">
<widget class="QCheckBox" name="checkStopLogging">
<property name="text"> <property name="text">
<string>&amp;Stop logging when log overflows</string> <string>Log History &amp;Limit</string>
</property>
<property name="buddy">
<cstring>lineLimitSpinBox</cstring>
</property> </property>
</widget> </widget>
</item> </item>
<item row="0" column="0"> <item>
<layout class="QHBoxLayout" name="horizontalLayout_6">
<item>
<widget class="QSpinBox" name="lineLimitSpinBox"> <widget class="QSpinBox" name="lineLimitSpinBox">
<property name="sizePolicy"> <property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed"> <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
@ -575,85 +400,183 @@
</property> </property>
</widget> </widget>
</item> </item>
<item>
<spacer name="horizontalSpacer_6">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</spacer>
</item>
</layout>
</item>
<item>
<widget class="QCheckBox" name="checkStopLogging">
<property name="text">
<string>&amp;Stop logging when log overflows</string>
</property>
</widget>
</item>
</layout> </layout>
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QGroupBox" name="themeBox_2"> <widget class="QGroupBox" name="tasksBox">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="title"> <property name="title">
<string>Console &amp;font</string> <string>Tasks</string>
</property> </property>
<layout class="QGridLayout" name="gridLayout_2"> <layout class="QVBoxLayout" name="verticalLayout_10">
<item row="1" column="0" colspan="2"> <item>
<widget class="QTextEdit" name="fontPreview"> <widget class="QLabel" name="numberOfConcurrentTasksLabel">
<property name="sizePolicy"> <property name="text">
<sizepolicy hsizetype="Expanding" vsizetype="MinimumExpanding"> <string>Number of concurrent tasks</string>
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="horizontalScrollBarPolicy">
<enum>Qt::ScrollBarAsNeeded</enum>
</property>
<property name="undoRedoEnabled">
<bool>false</bool>
</property>
<property name="textInteractionFlags">
<set>Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse</set>
</property> </property>
</widget> </widget>
</item> </item>
<item row="0" column="0"> <item>
<widget class="QFontComboBox" name="consoleFont"> <layout class="QHBoxLayout" name="horizontalLayout_2">
<property name="sizePolicy"> <item>
<sizepolicy hsizetype="Expanding" vsizetype="Fixed"> <widget class="QSpinBox" name="numberOfConcurrentTasksSpinBox">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QSpinBox" name="fontSizeBox">
<property name="minimum"> <property name="minimum">
<number>5</number> <number>1</number>
</property>
<property name="maximum">
<number>16</number>
</property>
<property name="value">
<number>11</number>
</property> </property>
</widget> </widget>
</item> </item>
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item>
<widget class="QLabel" name="numberOfConcurrentDownloadsLabel">
<property name="text">
<string>Number of concurrent downloads</string>
</property>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_3">
<item>
<widget class="QSpinBox" name="numberOfConcurrentDownloadsSpinBox">
<property name="minimum">
<number>1</number>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_3">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item>
<widget class="QLabel" name="numberOfManualRetriesLabel">
<property name="text">
<string>Number of manual retries</string>
</property>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_4">
<item>
<widget class="QSpinBox" name="numberOfManualRetriesSpinBox">
<property name="minimum">
<number>0</number>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_4">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item>
<widget class="QLabel" name="timeoutSecondsLabel">
<property name="toolTip">
<string>Seconds to wait until the requests are terminated</string>
</property>
<property name="text">
<string>Timeout for HTTP requests</string>
</property>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_5">
<item>
<widget class="QSpinBox" name="timeoutSecondsSpinBox">
<property name="suffix">
<string>s</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_5">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
</layout> </layout>
</widget> </widget>
</item> </item>
<item>
<spacer name="verticalSpacer_FeaturesTab">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
</spacer>
</item>
</layout> </layout>
</widget> </widget>
</widget> </widget>
</item> </item>
</layout> </layout>
</widget> </widget>
<customwidgets>
<customwidget>
<class>ThemeCustomizationWidget</class>
<extends>QWidget</extends>
<header>ui/widgets/ThemeCustomizationWidget.h</header>
<container>1</container>
</customwidget>
</customwidgets>
<tabstops> <tabstops>
<tabstop>tabWidget</tabstop>
<tabstop>scrollArea</tabstop> <tabstop>scrollArea</tabstop>
<tabstop>autoUpdateCheckBox</tabstop> <tabstop>autoUpdateCheckBox</tabstop>
<tabstop>updateIntervalSpinBox</tabstop>
<tabstop>instDirTextBox</tabstop> <tabstop>instDirTextBox</tabstop>
<tabstop>instDirBrowseBtn</tabstop> <tabstop>instDirBrowseBtn</tabstop>
<tabstop>modsDirTextBox</tabstop> <tabstop>modsDirTextBox</tabstop>
@ -666,23 +589,10 @@
<tabstop>skinsDirBrowseBtn</tabstop> <tabstop>skinsDirBrowseBtn</tabstop>
<tabstop>downloadsDirTextBox</tabstop> <tabstop>downloadsDirTextBox</tabstop>
<tabstop>downloadsDirBrowseBtn</tabstop> <tabstop>downloadsDirBrowseBtn</tabstop>
<tabstop>downloadsDirWatchRecursiveCheckBox</tabstop> <tabstop>metadataEnableBtn</tabstop>
<tabstop>metadataDisableBtn</tabstop> <tabstop>dependenciesEnableBtn</tabstop>
<tabstop>dependenciesDisableBtn</tabstop>
<tabstop>skipModpackUpdatePromptBtn</tabstop>
<tabstop>numberOfConcurrentTasksSpinBox</tabstop>
<tabstop>numberOfConcurrentDownloadsSpinBox</tabstop>
<tabstop>numberOfManualRetriesSpinBox</tabstop>
<tabstop>timeoutSecondsSpinBox</tabstop>
<tabstop>sortLastLaunchedBtn</tabstop> <tabstop>sortLastLaunchedBtn</tabstop>
<tabstop>sortByNameBtn</tabstop> <tabstop>sortByNameBtn</tabstop>
<tabstop>catOpacitySpinBox</tabstop>
<tabstop>preferMenuBarCheckBox</tabstop>
<tabstop>lineLimitSpinBox</tabstop>
<tabstop>checkStopLogging</tabstop>
<tabstop>consoleFont</tabstop>
<tabstop>fontSizeBox</tabstop>
<tabstop>fontPreview</tabstop>
</tabstops> </tabstops>
<resources/> <resources/>
<connections/> <connections/>