aboutsummaryrefslogtreecommitdiff
path: root/launcher/ui/widgets
diff options
context:
space:
mode:
Diffstat (limited to 'launcher/ui/widgets')
-rw-r--r--launcher/ui/widgets/ModFilterWidget.cpp66
-rw-r--r--launcher/ui/widgets/ModFilterWidget.h8
2 files changed, 49 insertions, 25 deletions
diff --git a/launcher/ui/widgets/ModFilterWidget.cpp b/launcher/ui/widgets/ModFilterWidget.cpp
index a4010aee..ea052c41 100644
--- a/launcher/ui/widgets/ModFilterWidget.cpp
+++ b/launcher/ui/widgets/ModFilterWidget.cpp
@@ -3,6 +3,37 @@
#include "Application.h"
+unique_qobject_ptr<ModFilterWidget> ModFilterWidget::create(Version default_version, QWidget* parent)
+{
+ auto filter_widget = new ModFilterWidget(default_version, parent);
+
+ if (!filter_widget->versionList()->isLoaded()) {
+ QEventLoop load_version_list_loop;
+
+ QTimer time_limit_for_list_load;
+ time_limit_for_list_load.setTimerType(Qt::TimerType::CoarseTimer);
+ time_limit_for_list_load.setSingleShot(true);
+ time_limit_for_list_load.callOnTimeout(&load_version_list_loop, &QEventLoop::quit);
+ time_limit_for_list_load.start(4000);
+
+ auto task = filter_widget->versionList()->getLoadTask();
+
+ connect(task.get(), &Task::failed, [filter_widget]{
+ filter_widget->disableVersionButton(VersionButtonID::Major, tr("failed to get version index"));
+ });
+ connect(task.get(), &Task::finished, &load_version_list_loop, &QEventLoop::quit);
+
+ if (!task->isRunning())
+ task->start();
+
+ load_version_list_loop.exec();
+ if (time_limit_for_list_load.isActive())
+ time_limit_for_list_load.stop();
+ }
+
+ return unique_qobject_ptr<ModFilterWidget>(filter_widget);
+}
+
ModFilterWidget::ModFilterWidget(Version def, QWidget* parent)
: QTabWidget(parent), m_filter(new Filter()), ui(new Ui::ModFilterWidget)
{
@@ -19,23 +50,6 @@ ModFilterWidget::ModFilterWidget(Version def, QWidget* parent)
m_filter->versions.push_front(def);
m_version_list = APPLICATION->metadataIndex()->get("net.minecraft");
- if (!m_version_list->isLoaded()) {
- QEventLoop load_version_list_loop;
-
- auto task = m_version_list->getLoadTask();
-
- connect(task.get(), &Task::failed, [this]{
- ui->majorVersionButton->setText(tr("Major version match (failed to get version index)"));
- disableVersionButton(VersionButtonID::Major);
- });
- connect(task.get(), &Task::finished, &load_version_list_loop, &QEventLoop::quit);
-
- if (!task->isRunning())
- task->start();
-
- load_version_list_loop.exec();
- }
-
setHidden(true);
}
@@ -71,24 +85,30 @@ auto ModFilterWidget::getFilter() -> std::shared_ptr<Filter>
return m_filter;
}
-void ModFilterWidget::disableVersionButton(VersionButtonID id)
+void ModFilterWidget::disableVersionButton(VersionButtonID id, QString reason)
{
+ QAbstractButton* btn = nullptr;
+
switch(id){
case(VersionButtonID::Strict):
- ui->strictVersionButton->setEnabled(false);
+ btn = ui->strictVersionButton;
break;
case(VersionButtonID::Major):
- ui->majorVersionButton->setEnabled(false);
+ btn = ui->majorVersionButton;
break;
case(VersionButtonID::All):
- ui->allVersionsButton->setEnabled(false);
+ btn = ui->allVersionsButton;
break;
case(VersionButtonID::Between):
- // ui->betweenVersionsButton->setEnabled(false);
- break;
default:
break;
}
+
+ if (btn) {
+ btn->setEnabled(false);
+ if (!reason.isEmpty())
+ btn->setText(btn->text() + QString(" (%1)").arg(reason));
+ }
}
void ModFilterWidget::onVersionFilterChanged(int id)
diff --git a/launcher/ui/widgets/ModFilterWidget.h b/launcher/ui/widgets/ModFilterWidget.h
index cf429174..958a1e2b 100644
--- a/launcher/ui/widgets/ModFilterWidget.h
+++ b/launcher/ui/widgets/ModFilterWidget.h
@@ -38,18 +38,22 @@ public:
std::shared_ptr<Filter> m_filter;
public:
- explicit ModFilterWidget(Version def, QWidget* parent = nullptr);
+ static unique_qobject_ptr<ModFilterWidget> create(Version default_version, QWidget* parent = nullptr);
~ModFilterWidget();
void setInstance(MinecraftInstance* instance);
/// By default all buttons are enabled
- void disableVersionButton(VersionButtonID);
+ void disableVersionButton(VersionButtonID, QString reason = {});
auto getFilter() -> std::shared_ptr<Filter>;
auto changed() const -> bool { return m_last_version_id != m_version_id; }
+ Meta::VersionListPtr versionList() { return m_version_list; }
+
private:
+ ModFilterWidget(Version def, QWidget* parent = nullptr);
+
inline auto mcVersionStr() const -> QString { return m_instance ? m_instance->getPackProfile()->getComponentVersion("net.minecraft") : ""; }
inline auto mcVersion() const -> Version { return { mcVersionStr() }; }