aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.travis.yml3
-rw-r--r--BUILD.md2
-rw-r--r--CMakeLists.txt8
-rw-r--r--MultiMC.cpp2
-rw-r--r--changelog.yaml7
-rw-r--r--cmake/UseCXX11.cmake2
-rw-r--r--gui/ConsoleWindow.cpp7
-rw-r--r--gui/MainWindow.cpp62
-rw-r--r--gui/MainWindow.h2
-rw-r--r--gui/MainWindow.ui17
-rw-r--r--gui/dialogs/AccountListDialog.cpp71
-rw-r--r--gui/dialogs/LoginDialog.cpp110
-rw-r--r--gui/dialogs/LoginDialog.h58
-rw-r--r--gui/dialogs/LoginDialog.ui77
-rw-r--r--gui/dialogs/VersionSelectDialog.cpp4
-rw-r--r--logic/LegacyInstance.cpp5
-rw-r--r--logic/LegacyInstance.h1
-rw-r--r--logic/LegacyUpdate.cpp169
-rw-r--r--logic/LegacyUpdate.h13
-rw-r--r--logic/OneSixLibrary.cpp27
-rw-r--r--logic/OneSixLibrary.h1
-rw-r--r--logic/OneSixUpdate.cpp18
-rw-r--r--logic/auth/MojangAccount.cpp2
-rw-r--r--logic/auth/YggdrasilTask.cpp110
-rw-r--r--logic/auth/YggdrasilTask.h25
-rw-r--r--logic/auth/flows/AuthenticateTask.cpp36
-rw-r--r--logic/auth/flows/AuthenticateTask.h8
-rw-r--r--logic/auth/flows/RefreshTask.cpp32
-rw-r--r--logic/auth/flows/RefreshTask.h8
-rw-r--r--logic/auth/flows/ValidateTask.cpp15
-rw-r--r--logic/auth/flows/ValidateTask.h8
-rw-r--r--logic/net/URLConstants.cpp2
-rw-r--r--logic/net/URLConstants.h2
-rw-r--r--resources/multimc/16x16/patreon.pngbin0 -> 682 bytes
-rw-r--r--resources/multimc/22x22/patreon.pngbin0 -> 976 bytes
-rw-r--r--resources/multimc/24x24/patreon.pngbin0 -> 1034 bytes
-rw-r--r--resources/multimc/32x32/patreon.pngbin0 -> 1450 bytes
-rw-r--r--resources/multimc/48x48/patreon.pngbin0 -> 2317 bytes
-rw-r--r--resources/multimc/64x64/patreon.pngbin0 -> 3212 bytes
-rw-r--r--resources/multimc/multimc.qrc8
-rw-r--r--translations/mmc_de.ts220
-rw-r--r--translations/mmc_fr.ts3399
42 files changed, 4328 insertions, 213 deletions
diff --git a/.travis.yml b/.travis.yml
index 842f6b9d..fdc8215e 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,6 +1,7 @@
language: cpp
compiler:
- gcc
+ - clang
cache: apt
before_install:
- sudo apt-add-repository -y ppa:beineri/opt-qt521
@@ -9,7 +10,7 @@ before_install:
- sudo apt-get update -qq
install:
- sudo apt-get install -y -qq cmake qt52base qt52svg qt52tools qt52x11extras
- - if [ "$CXX" = "g++" ]; then sudo apt-get install -y -qq g++-4.8; fi
+ - sudo apt-get install -y -qq g++-4.8
- if [ "$CXX" = "g++" ]; then export CXX="g++-4.8" CC="gcc-4.8"; fi
before_script:
- mkdir build
diff --git a/BUILD.md b/BUILD.md
index 32f4a385..bd17541d 100644
--- a/BUILD.md
+++ b/BUILD.md
@@ -56,7 +56,7 @@ Getting the project to build and run on Windows is easy if you use Qt's IDE, Qt
## Dependencies
* Qt 5.1.1+ Development tools (http://qt-project.org/downloads) ("Qt Online Installer for Windows")
-* OpenSSL (http://slproweb.com/products/Win32OpenSSL.html) ("Win32 OpenSSL v1.0.1e Light")
+* OpenSSL (http://slproweb.com/products/Win32OpenSSL.html) ("Win32 OpenSSL \<version\> Light")
- Microsoft Visual C++ 2008 Redist. is required for this, there's a link on the OpenSSL download page above next to the main download.
* CMake (http://www.cmake.org/cmake/resources/software.html) ("Windows (Win32 Installer)")
* A copy of the MultiMC source (clone it with git)
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 6c9606b2..0707571b 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -242,7 +242,7 @@ add_subdirectory(mmc_updater)
################################ FILES ################################
######## Sources and headers ########
-set(MULTIMC_SOURCES
+SET(MULTIMC_SOURCES
# Application base
MultiMC.h
MultiMC.cpp
@@ -294,6 +294,8 @@ set(MULTIMC_SOURCES
gui/dialogs/CustomMessageBox.cpp
gui/dialogs/EditAccountDialog.h
gui/dialogs/EditAccountDialog.cpp
+ gui/dialogs/LoginDialog.h
+ gui/dialogs/LoginDialog.cpp
gui/dialogs/AccountListDialog.h
gui/dialogs/AccountListDialog.cpp
gui/dialogs/AccountSelectDialog.h
@@ -487,6 +489,7 @@ set(MULTIMC_SOURCES
logic/icons/IconList.h
logic/icons/IconList.cpp
+
# misc model/view
logic/EnabledItemFilter.h
logic/EnabledItemFilter.cpp
@@ -533,7 +536,7 @@ set(MULTIMC_SOURCES
######## UIs ########
-set(MULTIMC_UIS
+SET(MULTIMC_UIS
# Windows
gui/MainWindow.ui
gui/ConsoleWindow.ui
@@ -554,6 +557,7 @@ set(MULTIMC_UIS
gui/dialogs/AccountListDialog.ui
gui/dialogs/AccountSelectDialog.ui
gui/dialogs/EditAccountDialog.ui
+ gui/dialogs/LoginDialog.ui
gui/dialogs/UpdateDialog.ui
gui/dialogs/ScreenshotDialog.ui
gui/dialogs/NotificationDialog.ui
diff --git a/MultiMC.cpp b/MultiMC.cpp
index ddc1fca7..a0ff8b66 100644
--- a/MultiMC.cpp
+++ b/MultiMC.cpp
@@ -412,6 +412,7 @@ void MultiMC::initGlobalSettings()
// Console
m_settings->registerSetting("ShowConsole", true);
+ m_settings->registerSetting("RaiseConsole", true);
m_settings->registerSetting("AutoCloseConsole", true);
m_settings->registerSetting("LogPrePostOutput", true);
@@ -470,6 +471,7 @@ void MultiMC::initHttpMetaCache()
m_metacache->addBase("versions", QDir("versions").absolutePath());
m_metacache->addBase("libraries", QDir("libraries").absolutePath());
m_metacache->addBase("minecraftforge", QDir("mods/minecraftforge").absolutePath());
+ m_metacache->addBase("fmllibs", QDir("mods/minecraftforge/libs").absolutePath());
m_metacache->addBase("liteloader", QDir("mods/liteloader").absolutePath());
m_metacache->addBase("skins", QDir("accounts/skins").absolutePath());
m_metacache->addBase("root", QDir(root()).absolutePath());
diff --git a/changelog.yaml b/changelog.yaml
index c1f36408..db5a3e56 100644
--- a/changelog.yaml
+++ b/changelog.yaml
@@ -59,4 +59,9 @@
- Customizing FTB pack versions will remove the FTB pack patch file
0.3.2:
- Fix issues with libraries not getting replaced properly (fixes instance startup for new instances)
- - Fix april fools \ No newline at end of file
+ - Fix april fools
+0.3.3:
+ - Tweak context menu to prevent accidental clicks
+ - Fix adding icons to custom icon directories
+ - Added a Patreon button to the toolbar
+ - Minecraft authentication tasks now provide better error reports \ No newline at end of file
diff --git a/cmake/UseCXX11.cmake b/cmake/UseCXX11.cmake
index e94de2bb..f8afaa6e 100644
--- a/cmake/UseCXX11.cmake
+++ b/cmake/UseCXX11.cmake
@@ -4,7 +4,7 @@ endif()
set(__USECXX11_CMAKE__ TRUE)
if(APPLE)
- set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++ -std=c++11")
elseif(UNIX)
# assume GCC, add C++0x/C++11 stuff
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
diff --git a/gui/ConsoleWindow.cpp b/gui/ConsoleWindow.cpp
index 621f035f..18a617e0 100644
--- a/gui/ConsoleWindow.cpp
+++ b/gui/ConsoleWindow.cpp
@@ -265,6 +265,13 @@ void ConsoleWindow::onEnded(BaseInstance *instance, int code, QProcess::ExitStat
*/
if (!isVisible())
show();
+
+ // Raise Window
+ if (MMC->settings()->get("RaiseConsole").toBool())
+ {
+ raise();
+ activateWindow();
+ }
}
void ConsoleWindow::onLaunchFailed(BaseInstance *instance)
diff --git a/gui/MainWindow.cpp b/gui/MainWindow.cpp
index ce09c42d..b0e86249 100644
--- a/gui/MainWindow.cpp
+++ b/gui/MainWindow.cpp
@@ -35,6 +35,7 @@
#include <QToolButton>
#include <QWidgetAction>
#include <QProgressDialog>
+#include <QShortcut>
#include "osutils.h"
#include "userutils.h"
@@ -116,6 +117,13 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWi
// OSX magic.
// setUnifiedTitleAndToolBarOnMac(true);
+ // Global shortcuts
+ {
+ //FIXME: This is kinda weird. and bad. We need some kind of managed shutdown.
+ auto q = new QShortcut(QKeySequence::Quit, this);
+ connect(q, SIGNAL(activated()), qApp, SLOT(quit()));
+ }
+
// The instance action toolbar customizations
{
// disabled until we have an instance selected
@@ -353,25 +361,52 @@ void MainWindow::skinJobFinished()
void MainWindow::showInstanceContextMenu(const QPoint &pos)
{
- if (!view->indexAt(pos).isValid())
+ QList<QAction *> actions;
+
+ QAction *actionSep = new QAction("", this);
+ actionSep->setSeparator(true);
+
+ bool onInstance = view->indexAt(pos).isValid();
+ if (onInstance)
{
- return;
- }
+ actions = ui->instanceToolBar->actions();
+
+ QAction *actionVoid = new QAction(m_selectedInstance->name(), this);
+ actionVoid->setEnabled(false);
+
+ QAction *actionRename = new QAction(tr("Rename"), this);
+ actionRename->setToolTip(ui->actionRenameInstance->toolTip());
- QList<QAction *> actions = ui->instanceToolBar->actions();
+ QAction *actionCopyInstance = new QAction(tr("Copy instance"), this);
+ actionCopyInstance->setToolTip(ui->actionCopyInstance->toolTip());
- // HACK: Filthy rename button hack because the instance view is getting rewritten anyway
- QAction *actionRename;
- actionRename = new QAction(tr("Rename"), this);
- actionRename->setToolTip(ui->actionRenameInstance->toolTip());
- connect(actionRename, SIGNAL(triggered(bool)), SLOT(on_actionRenameInstance_triggered()));
+ connect(actionRename, SIGNAL(triggered(bool)), SLOT(on_actionRenameInstance_triggered()));
+ connect(actionCopyInstance, SIGNAL(triggered(bool)), SLOT(on_actionCopyInstance_triggered()));
- actions.replace(1, actionRename);
+ actions.replace(1, actionRename);
+ actions.prepend(actionSep);
+ actions.prepend(actionVoid);
+ actions.append(actionCopyInstance);
+ }
+ else
+ {
+ QAction *actionVoid = new QAction(tr("MultiMC"), this);
+ actionVoid->setEnabled(false);
+
+ QAction *actionCreateInstance = new QAction(tr("Create instance"), this);
+ actionCreateInstance->setToolTip(ui->actionAddInstance->toolTip());
+
+ connect(actionCreateInstance, SIGNAL(triggered(bool)), SLOT(on_actionAddInstance_triggered()));
+ actions.prepend(actionSep);
+ actions.prepend(actionVoid);
+ actions.append(actionCreateInstance);
+ }
QMenu myMenu;
myMenu.addActions(actions);
- myMenu.setEnabled(m_selectedInstance->canLaunch());
+ if(onInstance)
+ myMenu.setEnabled(m_selectedInstance->canLaunch());
myMenu.exec(view->mapToGlobal(pos));
}
@@ -988,6 +1023,11 @@ void MainWindow::on_actionReportBug_triggered()
openWebPage(QUrl("https://github.com/MultiMC/MultiMC5/issues"));
}
+void MainWindow::on_actionPatreon_triggered()
+{
+ openWebPage(QUrl("http://www.patreon.com/multimc"));
+}
+
void MainWindow::on_actionMoreNews_triggered()
{
openWebPage(QUrl("http://multimc.org/posts.html"));
diff --git a/gui/MainWindow.h b/gui/MainWindow.h
index 5ddfef7b..d610a87d 100644
--- a/gui/MainWindow.h
+++ b/gui/MainWindow.h
@@ -85,6 +85,8 @@ slots:
void on_actionReportBug_triggered();
+ void on_actionPatreon_triggered();
+
void on_actionMoreNews_triggered();
void newsButtonClicked();
diff --git a/gui/MainWindow.ui b/gui/MainWindow.ui
index 2bd8ec22..1d7fbec9 100644
--- a/gui/MainWindow.ui
+++ b/gui/MainWindow.ui
@@ -74,6 +74,7 @@
<addaction name="actionReportBug"/>
<addaction name="actionAbout"/>
<addaction name="separator"/>
+ <addaction name="actionPatreon"/>
<addaction name="actionCAT"/>
</widget>
<widget class="QStatusBar" name="statusBar"/>
@@ -268,6 +269,22 @@
<string>Open the bug tracker to report a bug with MultiMC.</string>
</property>
</action>
+ <action name="actionPatreon">
+ <property name="icon">
+ <iconset theme="patreon">
+ <normaloff/>
+ </iconset>
+ </property>
+ <property name="text">
+ <string>Support us on Patreon!</string>
+ </property>
+ <property name="toolTip">
+ <string>Open the MultiMC Patreon page.</string>
+ </property>
+ <property name="statusTip">
+ <string>Open the MultiMC Patreon page.</string>
+ </property>
+ </action>
<action name="actionMoreNews">
<property name="icon">
<iconset theme="news">
diff --git a/gui/dialogs/AccountListDialog.cpp b/gui/dialogs/AccountListDialog.cpp
index a38035a6..688cffa8 100644
--- a/gui/dialogs/AccountListDialog.cpp
+++ b/gui/dialogs/AccountListDialog.cpp
@@ -26,6 +26,7 @@
#include <gui/dialogs/EditAccountDialog.h>
#include <gui/dialogs/ProgressDialog.h>
#include <gui/dialogs/AccountSelectDialog.h>
+#include <gui/dialogs/LoginDialog.h>
#include "CustomMessageBox.h"
#include <logic/tasks/Task.h>
#include <logic/auth/YggdrasilTask.h>
@@ -45,10 +46,11 @@ AccountListDialog::AccountListDialog(QWidget *parent)
// Expand the account column
ui->listView->header()->setSectionResizeMode(1, QHeaderView::Stretch);
- QItemSelectionModel* selectionModel = ui->listView->selectionModel();
+ QItemSelectionModel *selectionModel = ui->listView->selectionModel();
- connect(selectionModel, &QItemSelectionModel::selectionChanged,
- [this] (const QItemSelection& sel, const QItemSelection& dsel) { updateButtonStates(); });
+ connect(selectionModel, &QItemSelectionModel::selectionChanged,
+ [this](const QItemSelection &sel, const QItemSelection &dsel)
+ { updateButtonStates(); });
connect(m_accounts.get(), SIGNAL(listChanged()), SLOT(listChanged()));
connect(m_accounts.get(), SIGNAL(activeAccountChanged()), SLOT(listChanged()));
@@ -68,7 +70,8 @@ void AccountListDialog::listChanged()
void AccountListDialog::on_addAccountBtn_clicked()
{
- addAccount(tr("Please enter your Mojang or Minecraft account username and password to add your account."));
+ addAccount(tr("Please enter your Mojang or Minecraft account username and password to add "
+ "your account."));
}
void AccountListDialog::on_rmAccountBtn_clicked()
@@ -87,7 +90,8 @@ void AccountListDialog::on_setDefaultBtn_clicked()
if (selection.size() > 0)
{
QModelIndex selected = selection.first();
- MojangAccountPtr account = selected.data(MojangAccountList::PointerRole).value<MojangAccountPtr>();
+ MojangAccountPtr account =
+ selected.data(MojangAccountList::PointerRole).value<MojangAccountPtr>();
m_accounts->setActiveAccount(account->username());
}
}
@@ -113,48 +117,29 @@ void AccountListDialog::updateButtonStates()
ui->noDefaultBtn->setDown(m_accounts->activeAccount().get() == nullptr);
}
-void AccountListDialog::addAccount(const QString& errMsg)
+void AccountListDialog::addAccount(const QString &errMsg)
{
- // TODO: We can use the login dialog for this for now, but we'll have to make something better for it eventually.
- EditAccountDialog loginDialog(errMsg, this, EditAccountDialog::UsernameField | EditAccountDialog::PasswordField);
- loginDialog.exec();
+ // TODO: The login dialog isn't quite done yet
+ MojangAccountPtr account = LoginDialog::newAccount(this, errMsg);
- if (loginDialog.result() == QDialog::Accepted)
+ if (account != nullptr)
{
- QString username(loginDialog.username());
- QString password(loginDialog.password());
-
- MojangAccountPtr account = MojangAccount::createFromUsername(username);
- ProgressDialog progDialog(this);
- auto task = account->login(nullptr, password);
- progDialog.exec(task.get());
- if(task->successful())
- {
- m_accounts->addAccount(account);
- if (m_accounts->count() == 1)
- m_accounts->setActiveAccount(account->username());
-
- // Grab associated player skins
- auto job = new NetJob("Player skins: " + account->username());
-
- for(AccountProfile profile : account->profiles())
- {
- auto meta = MMC->metacache()->resolveEntry("skins", profile.name + ".png");
- auto action = CacheDownload::make(
- QUrl("http://" + URLConstants::SKINS_BASE + profile.name + ".png"),
- meta);
- job->addNetAction(action);
- meta->stale = true;
- }
-
- job->start();
- }
- else
+ m_accounts->addAccount(account);
+ if (m_accounts->count() == 1)
+ m_accounts->setActiveAccount(account->username());
+
+ // Grab associated player skins
+ auto job = new NetJob("Player skins: " + account->username());
+
+ for (AccountProfile profile : account->profiles())
{
- auto reason = task->failReason();
- auto dlg = CustomMessageBox::selectable(this, tr("Login error."), reason, QMessageBox::Critical);
- dlg->exec();
- delete dlg;
+ auto meta = MMC->metacache()->resolveEntry("skins", profile.name + ".png");
+ auto action = CacheDownload::make(
+ QUrl("http://" + URLConstants::SKINS_BASE + profile.name + ".png"), meta);
+ job->addNetAction(action);
+ meta->stale = true;
}
+
+ job->start();
}
}
diff --git a/gui/dialogs/LoginDialog.cpp b/gui/dialogs/LoginDialog.cpp
new file mode 100644
index 00000000..5ac94fac
--- /dev/null
+++ b/gui/dialogs/LoginDialog.cpp
@@ -0,0 +1,110 @@
+/* Copyright 2014 MultiMC Contributors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "LoginDialog.h"
+#include "ui_LoginDialog.h"
+
+#include "logic/auth/YggdrasilTask.h"
+
+#include <QtWidgets/QPushButton>
+
+LoginDialog::LoginDialog(QWidget *parent) : QDialog(parent), ui(new Ui::LoginDialog)
+{
+ ui->setupUi(this);
+ ui->progressBar->setVisible(false);
+ ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(false);
+
+ connect(ui->buttonBox, &QDialogButtonBox::accepted, this, &QDialog::accept);
+ connect(ui->buttonBox, &QDialogButtonBox::rejected, this, &QDialog::reject);
+}
+
+LoginDialog::~LoginDialog()
+{
+ delete ui;
+}
+
+// Stage 1: User interaction
+void LoginDialog::accept()
+{
+ setUserInputsEnabled(false);
+ ui->progressBar->setVisible(true);
+
+ // Setup the login task and start it
+ m_account = MojangAccount::createFromUsername(ui->userTextBox->text());
+ m_loginTask = m_account->login(nullptr, ui->passTextBox->text());
+ connect(m_loginTask.get(), &ProgressProvider::failed, this, &LoginDialog::onTaskFailed);
+ connect(m_loginTask.get(), &ProgressProvider::succeeded, this,
+ &LoginDialog::onTaskSucceeded);
+ connect(m_loginTask.get(), &ProgressProvider::status, this, &LoginDialog::onTaskStatus);
+ connect(m_loginTask.get(), &ProgressProvider::progress, this, &LoginDialog::onTaskProgress);
+ m_loginTask->start();
+}
+
+void LoginDialog::setUserInputsEnabled(bool enable)
+{
+ ui->userTextBox->setEnabled(enable);
+ ui->passTextBox->setEnabled(enable);
+ ui->buttonBox->setEnabled(enable);
+}
+
+// Enable the OK button only when both textboxes contain something.
+void LoginDialog::on_userTextBox_textEdited(const QString &newText)
+{
+ ui->buttonBox->button(QDialogButtonBox::Ok)
+ ->setEnabled(!newText.isEmpty() && !ui->passTextBox->text().isEmpty());
+}
+void LoginDialog::on_passTextBox_textEdited(const QString &newText)
+{
+ ui->buttonBox->button(QDialogButtonBox::Ok)
+ ->setEnabled(!newText.isEmpty() && !ui->userTextBox->text().isEmpty());
+}
+
+void LoginDialog::onTaskFailed(const QString &reason)
+{
+ // Set message
+ ui->label->setText("<span style='color:red'>" + reason + "</span>");
+
+ // Re-enable user-interaction
+ setUserInputsEnabled(true);
+ ui->progressBar->setVisible(false);
+}
+
+void LoginDialog::onTaskSucceeded()
+{
+ QDialog::accept();
+}
+
+void LoginDialog::onTaskStatus(const QString &status)
+{
+ ui->label->setText(status);
+}
+
+void LoginDialog::onTaskProgress(qint64 current, qint64 total)
+{
+ ui->progressBar->setMaximum(total);
+ ui->progressBar->setValue(current);
+}
+
+// Public interface
+MojangAccountPtr LoginDialog::newAccount(QWidget *parent, QString msg)
+{
+ LoginDialog dlg(parent);
+ dlg.ui->label->setText(msg);
+ if (dlg.exec() == QDialog::Accepted)
+ {
+ return dlg.m_account;
+ }
+ return 0;
+}
diff --git a/gui/dialogs/LoginDialog.h b/gui/dialogs/LoginDialog.h
new file mode 100644
index 00000000..560ed5ec
--- /dev/null
+++ b/gui/dialogs/LoginDialog.h
@@ -0,0 +1,58 @@
+/* Copyright 2014 MultiMC Contributors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <QtWidgets/QDialog>
+#include <QtCore/QEventLoop>
+
+#include "logic/auth/MojangAccount.h"
+
+namespace Ui
+{
+class LoginDialog;
+}
+
+class LoginDialog : public QDialog
+{
+ Q_OBJECT
+
+public:
+ ~LoginDialog();
+
+ static MojangAccountPtr newAccount(QWidget *parent, QString message);
+
+private:
+ explicit LoginDialog(QWidget *parent = 0);
+
+ void setUserInputsEnabled(bool enable);
+
+protected
+slots:
+ void accept();
+
+ void onTaskFailed(const QString &reason);
+ void onTaskSucceeded();
+ void onTaskStatus(const QString &status);
+ void onTaskProgress(qint64 current, qint64 total);
+
+ void on_userTextBox_textEdited(const QString &newText);
+ void on_passTextBox_textEdited(const QString &newText);
+
+private:
+ Ui::LoginDialog *ui;
+ MojangAccountPtr m_account;
+ std::shared_ptr<Task> m_loginTask;
+};
diff --git a/gui/dialogs/LoginDialog.ui b/gui/dialogs/LoginDialog.ui
new file mode 100644
index 00000000..b24b1c0c
--- /dev/null
+++ b/gui/dialogs/LoginDialog.ui
@@ -0,0 +1,77 @@
+<?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>400</width>
+ <height>162</height>
+ </rect>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="windowTitle">
+ <string>Add Account</string>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout">
+ <item>
+ <widget class="QLabel" name="label">
+ <property name="text">
+ <string>Message label placeholder.</string>
+ </property>
+ <property name="textFormat">
+ <enum>Qt::RichText</enum>
+ </property>
+ <property name="textInteractionFlags">
+ <set>Qt::LinksAccessibleByKeyboard|Qt::LinksAccessibleByMouse|Qt::TextBrowserInteraction|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse</set>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLineEdit" name="userTextBox">
+ <property name="placeholderText">
+ <string>Email / Username</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLineEdit" name="passTextBox">
+ <property name="echoMode">
+ <enum>QLineEdit::Password</enum>
+ </property>
+ <property name="placeholderText">
+ <string>Password</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QProgressBar" name="progressBar">
+ <property name="value">
+ <number>24</number>
+ </property>
+ <property name="textVisible">
+ <bool>false</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QDialogButtonBox" name="buttonBox">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="standardButtons">
+ <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/gui/dialogs/VersionSelectDialog.cpp b/gui/dialogs/VersionSelectDialog.cpp
index 3277fd2f..f4d314b6 100644
--- a/gui/dialogs/VersionSelectDialog.cpp
+++ b/gui/dialogs/VersionSelectDialog.cpp
@@ -100,7 +100,9 @@ void VersionSelectDialog::on_refreshButton_clicked()
void VersionSelectDialog::setFilter(int column, QString filter)
{
m_proxyModel->setFilterKeyColumn(column);
- m_proxyModel->setFilterFixedString(filter);
+ // m_proxyModel->setFilterFixedString(filter);
+ m_proxyModel->setFilterRegExp(QRegExp(QString("^%1$").arg(filter.replace(".", "\\.")),
+ Qt::CaseInsensitive, QRegExp::RegExp));
/*
QStringList filteredTypes;
if (!ui->filterSnapshotsCheckbox->isChecked())
diff --git a/logic/LegacyInstance.cpp b/logic/LegacyInstance.cpp
index 4f2dfd9b..d06b8827 100644
--- a/logic/LegacyInstance.cpp
+++ b/logic/LegacyInstance.cpp
@@ -159,6 +159,11 @@ QString LegacyInstance::binDir() const
return PathCombine(minecraftRoot(), "bin");
}