Started working on task system and login system.

This commit is contained in:
Andrew 2013-02-05 16:34:20 -06:00
parent f8ea8d9e3b
commit a416c58a93
17 changed files with 784 additions and 8 deletions

View File

@ -96,11 +96,15 @@ data/instancebase.cpp
data/instancemodel.cpp
data/stdinstance.cpp
data/version.cpp
data/userinfo.cpp
data/loginresponse.cpp
gui/mainwindow.cpp
gui/modeditwindow.cpp
gui/settingsdialog.cpp
gui/newinstancedialog.cpp
gui/logindialog.cpp
gui/taskdialog.cpp
util/pathutils.cpp
util/osutils.cpp
@ -109,6 +113,7 @@ java/javautils.cpp
java/annotations.cpp
tasks/task.cpp
tasks/logintask.cpp
)
SET(MULTIMC_HEADERS
@ -116,6 +121,8 @@ gui/mainwindow.h
gui/modeditwindow.h
gui/settingsdialog.h
gui/newinstancedialog.h
gui/logindialog.h
gui/taskdialog.h
data/appsettings.h
data/inifile.h
@ -123,6 +130,8 @@ data/instancebase.h
data/instancemodel.h
data/stdinstance.h
data/version.h
data/userinfo.h
data/loginresponse.h
util/apputils.h
util/pathutils.h
@ -139,6 +148,7 @@ java/javautils.h
java/membuffer.h
tasks/task.h
tasks/logintask.h
)
SET(MULTIMC5_UIS
@ -146,6 +156,8 @@ gui/mainwindow.ui
gui/modeditwindow.ui
gui/settingsdialog.ui
gui/newinstancedialog.ui
gui/logindialog.ui
gui/taskdialog.ui
)
IF(WIN32)

49
data/loginresponse.cpp Normal file
View File

@ -0,0 +1,49 @@
/* Copyright 2013 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 "loginresponse.h"
LoginResponse::LoginResponse(const QString& username, const QString& sessionID, QObject *parent) :
QObject(parent)
{
this->username = username;
this->sessionID = sessionID;
}
LoginResponse::LoginResponse(const LoginResponse &other)
{
this->username = other.username;
this->sessionID = other.sessionID;
}
QString LoginResponse::getUsername() const
{
return username;
}
void LoginResponse::setUsername(const QString& username)
{
this->username = username;
}
QString LoginResponse::getSessionID() const
{
return sessionID;
}
void LoginResponse::setSessionID(const QString& sessionID)
{
this->sessionID = sessionID;
}

39
data/loginresponse.h Normal file
View File

@ -0,0 +1,39 @@
/* Copyright 2013 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.
*/
#ifndef LOGINRESPONSE_H
#define LOGINRESPONSE_H
#include <QObject>
class LoginResponse : public QObject
{
Q_OBJECT
public:
explicit LoginResponse(const QString &username, const QString &sessionID, QObject *parent = 0);
LoginResponse(const LoginResponse& other);
QString getUsername() const;
void setUsername(const QString& username);
QString getSessionID() const;
void setSessionID(const QString& sessionID);
private:
QString username;
QString sessionID;
};
#endif // LOGINRESPONSE_H

49
data/userinfo.cpp Normal file
View File

@ -0,0 +1,49 @@
/* Copyright 2013 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 "userinfo.h"
UserInfo::UserInfo(const QString &username, const QString &password, QObject *parent) :
QObject(parent)
{
this->username = username;
this->password = password;
}
UserInfo::UserInfo(const UserInfo &other)
{
this->username = other.username;
this->password = other.password;
}
QString UserInfo::getUsername() const
{
return username;
}
void UserInfo::setUsername(const QString &username)
{
this->username = username;
}
QString UserInfo::getPassword() const
{
return password;
}
void UserInfo::setPassword(const QString &password)
{
this->password = password;
}

39
data/userinfo.h Normal file
View File

@ -0,0 +1,39 @@
/* Copyright 2013 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.
*/
#ifndef USERINFO_H
#define USERINFO_H
#include <QObject>
class UserInfo : public QObject
{
Q_OBJECT
public:
explicit UserInfo(const QString& username, const QString& password, QObject *parent = 0);
explicit UserInfo(const UserInfo& other);
QString getUsername() const;
void setUsername(const QString& username);
QString getPassword() const;
void setPassword(const QString& password);
protected:
QString username;
QString password;
};
#endif // USERINFO_H

51
gui/logindialog.cpp Normal file
View File

@ -0,0 +1,51 @@
/* Copyright 2013 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"
LoginDialog::LoginDialog(QWidget *parent, const QString& loginErrMsg) :
QDialog(parent),
ui(new Ui::LoginDialog)
{
ui->setupUi(this);
if (loginErrMsg.isEmpty())
ui->loginErrorLabel->setVisible(false);
else
{
ui->loginErrorLabel->setVisible(true);
ui->loginErrorLabel->setText(QString("<span style=\" color:#ff0000;\">%1</span>").
arg(loginErrMsg));
}
resize(minimumSizeHint());
layout()->setSizeConstraint(QLayout::SetFixedSize);
}
LoginDialog::~LoginDialog()
{
delete ui;
}
QString LoginDialog::getUsername() const
{
return ui->usernameTextBox->text();
}
QString LoginDialog::getPassword() const
{
return ui->passwordTextBox->text();
}

40
gui/logindialog.h Normal file
View File

@ -0,0 +1,40 @@
/* Copyright 2013 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.
*/
#ifndef LOGINDIALOG_H
#define LOGINDIALOG_H
#include <QDialog>
namespace Ui {
class LoginDialog;
}
class LoginDialog : public QDialog
{
Q_OBJECT
public:
explicit LoginDialog(QWidget *parent = 0, const QString& loginErrMsg = "");
~LoginDialog();
QString getUsername() const;
QString getPassword() const;
private:
Ui::LoginDialog *ui;
};
#endif // LOGINDIALOG_H

146
gui/logindialog.ui Normal file
View File

@ -0,0 +1,146 @@
<?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>365</width>
<height>145</height>
</rect>
</property>
<property name="windowTitle">
<string>Login</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QLabel" name="loginErrorLabel">
<property name="text">
<string>&lt;span style=&quot; color:#ff0000;&quot;&gt;Error&lt;/span&gt;</string>
</property>
</widget>
</item>
<item>
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0">
<widget class="QLabel" name="usernameLabel">
<property name="text">
<string>Username:</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLineEdit" name="usernameTextBox">
<property name="placeholderText">
<string>Username</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="passwordLabel">
<property name="text">
<string>Password:</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QLineEdit" name="passwordTextBox">
<property name="echoMode">
<enum>QLineEdit::Password</enum>
</property>
<property name="placeholderText">
<string>Password</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="checkboxLayout">
<item>
<widget class="QPushButton" name="forceUpdateButton">
<property name="text">
<string>&amp;Force Update</string>
</property>
<property name="checkable">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="rememberUsernameCheckbox">
<property name="sizePolicy">
<sizepolicy hsizetype="Maximum" vsizetype="Fixed">
<horstretch>1</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>&amp;Remember Username?</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="rememberPasswordCheckbox">
<property name="sizePolicy">
<sizepolicy hsizetype="Maximum" vsizetype="Fixed">
<horstretch>1</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>R&amp;emember Password?</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<widget class="QDialogButtonBox" name="loginButtonBox">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
</property>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections>
<connection>
<sender>loginButtonBox</sender>
<signal>accepted()</signal>
<receiver>LoginDialog</receiver>
<slot>accept()</slot>
<hints>
<hint type="sourcelabel">
<x>248</x>
<y>254</y>
</hint>
<hint type="destinationlabel">
<x>157</x>
<y>274</y>
</hint>
</hints>
</connection>
<connection>
<sender>loginButtonBox</sender>
<signal>rejected()</signal>
<receiver>LoginDialog</receiver>
<slot>reject()</slot>
<hints>
<hint type="sourcelabel">
<x>316</x>
<y>260</y>
</hint>
<hint type="destinationlabel">
<x>286</x>
<y>274</y>
</hint>
</hints>
</connection>
</connections>
</ui>

View File

@ -26,10 +26,14 @@
#include "gui/settingsdialog.h"
#include "gui/newinstancedialog.h"
#include "gui/logindialog.h"
#include "gui/taskdialog.h"
#include "data/appsettings.h"
#include "data/version.h"
#include "tasks/logintask.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
@ -121,3 +125,31 @@ void MainWindow::on_instanceView_customContextMenuRequested(const QPoint &pos)
instContextMenu->exec(ui->instanceView->mapToGlobal(pos));
}
void MainWindow::on_actionLaunchInstance_triggered()
{
doLogin();
}
void MainWindow::doLogin(const QString &errorMsg)
{
LoginDialog* loginDlg = new LoginDialog(this, errorMsg);
if (loginDlg->exec())
{
UserInfo uInfo(loginDlg->getUsername(), loginDlg->getPassword());
TaskDialog* tDialog = new TaskDialog(this);
LoginTask* loginTask = new LoginTask(uInfo, tDialog);
connect(loginTask, SIGNAL(loginComplete(LoginResponse)),
SLOT(onLoginComplete(LoginResponse)));
connect(loginTask, SIGNAL(loginFailed(QString)),
SLOT(doLogin(QString)));
tDialog->exec(loginTask);
}
}
void MainWindow::onLoginComplete(LoginResponse response)
{
}

View File

@ -18,7 +18,8 @@
#include <QMainWindow>
#include "../data/instancemodel.h"
#include "data/instancemodel.h"
#include "data/loginresponse.h"
namespace Ui
{
@ -58,6 +59,14 @@ private slots:
void on_instanceView_customContextMenuRequested(const QPoint &pos);
void on_actionLaunchInstance_triggered();
void doLogin(const QString& errorMsg = "");
void onLoginComplete(LoginResponse response);
private:
Ui::MainWindow *ui;

109
gui/taskdialog.cpp Normal file
View File

@ -0,0 +1,109 @@
/* Copyright 2013 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 "taskdialog.h"
#include "ui_taskdialog.h"
#include <QKeyEvent>
#include "tasks/task.h"
TaskDialog::TaskDialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::TaskDialog)
{
ui->setupUi(this);
updateSize();
changeProgress(0);
}
TaskDialog::~TaskDialog()
{
delete ui;
}
void TaskDialog::updateSize()
{
resize(QSize(480, minimumSizeHint().height()));
}
void TaskDialog::exec(Task *task)
{
this->task = task;
// Connect signals.
connect(task, SIGNAL(taskStarted(Task*)),
this, SLOT(onTaskStarted(Task*)));
connect(task, SIGNAL(taskEnded(Task*)),
this, SLOT(onTaskEnded(Task*)));
connect(task, SIGNAL(statusChanged(const QString&)),
this, SLOT(changeStatus(const QString&)));
connect(task, SIGNAL(progressChanged(int)),
this, SLOT(changeProgress(int)));
task->startTask();
QDialog::exec();
}
Task* TaskDialog::getTask()
{
return task;
}
void TaskDialog::onTaskStarted(Task*)
{
}
void TaskDialog::onTaskEnded(Task*)
{
close();
}
void TaskDialog::changeStatus(const QString &status)
{
ui->statusLabel->setText(status);
updateSize();
}
void TaskDialog::changeProgress(int progress)
{
if (progress < 0)
progress = 0;
else if (progress > 100)
progress = 100;
ui->taskProgressBar->setValue(progress);
}
void TaskDialog::keyPressEvent(QKeyEvent* e)
{
if (e->key() == Qt::Key_Escape)
return;
QDialog::keyPressEvent(e);
}
void TaskDialog::closeEvent(QCloseEvent* e)
{
if (task && task->isRunning())
{
e->ignore();
}
else
{
QDialog::closeEvent(e);
}
}

63
gui/taskdialog.h Normal file
View File

@ -0,0 +1,63 @@
/* Copyright 2013 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.
*/
#ifndef TASKDIALOG_H
#define TASKDIALOG_H
#include <QDialog>
class Task;
namespace Ui {
class TaskDialog;
}
class TaskDialog : public QDialog
{
Q_OBJECT
public:
explicit TaskDialog(QWidget *parent = 0);
~TaskDialog();
void updateSize();
void exec(Task* task);
Task* getTask();
public slots:
void onTaskStarted(Task*);
void onTaskEnded(Task*);
void changeStatus(const QString& status);
void changeProgress(int progress);
void test() { qDebug("Lol"); }
signals:
protected:
virtual void keyPressEvent(QKeyEvent* e);
virtual void closeEvent(QCloseEvent* e);
private:
Ui::TaskDialog *ui;
Task* task;
};
#endif // TASKDIALOG_H

53
gui/taskdialog.ui Normal file
View File

@ -0,0 +1,53 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>TaskDialog</class>
<widget class="QDialog" name="TaskDialog">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>400</width>
<height>58</height>
</rect>
</property>
<property name="minimumSize">
<size>
<width>400</width>
<height>0</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>600</width>
<height>16777215</height>
</size>
</property>
<property name="windowTitle">
<string>Please wait...</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QLabel" name="statusLabel">
<property name="text">
<string>Task Status...</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QProgressBar" name="taskProgressBar">
<property name="value">
<number>24</number>
</property>
<property name="textVisible">
<bool>false</bool>
</property>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>

44
tasks/logintask.cpp Normal file
View File

@ -0,0 +1,44 @@
/* Copyright 2013 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 "logintask.h"
LoginTask::LoginTask(const UserInfo &uInfo, QObject *parent) :
Task(parent), uInfo(uInfo)
{
}
void LoginTask::executeTask()
{
setStatus("Logging in...");
// TODO: PLACEHOLDER
for (int p = 0; p < 100; p++)
{
msleep(25);
setProgress(p);
}
if (uInfo.getUsername() == "test")
{
LoginResponse response("test", "Fake Session ID");
emit loginComplete(response);
}
else
{
emit loginFailed("Testing");
}
}

40
tasks/logintask.h Normal file
View File

@ -0,0 +1,40 @@
/* Copyright 2013 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.
*/
#ifndef LOGINTASK_H
#define LOGINTASK_H
#include "task.h"
#include "data/userinfo.h"
#include "data/loginresponse.h"
class LoginTask : public Task
{
Q_OBJECT
public:
explicit LoginTask(const UserInfo& uInfo, QObject *parent = 0);
signals:
void loginComplete(const LoginResponse& loginResponse);
void loginFailed(const QString& errorMsg);
protected:
void executeTask();
UserInfo uInfo;
};
#endif // LOGINTASK_H

View File

@ -29,7 +29,7 @@ QString Task::getStatus() const
void Task::setStatus(const QString &status)
{
this->status = status;
statusChanged(status);
emit statusChanged(status);
}
int Task::getProgress() const
@ -40,7 +40,7 @@ int Task::getProgress() const
void Task::setProgress(int progress)
{
this->progress = progress;
progressChanged(progress);
emit progressChanged(progress);
}
void Task::startTask()
@ -50,7 +50,7 @@ void Task::startTask()
void Task::run()
{
taskStarted(this);
emit taskStarted(this);
executeTask();
taskEnded(this);
emit taskEnded(this);
}

View File

@ -32,6 +32,10 @@ public:
QString getStatus() const;
int getProgress() const;
public slots:
void setStatus(const QString& status);
void setProgress(int progress);
signals:
void taskStarted(Task* task);
void taskEnded(Task* task);
@ -40,9 +44,6 @@ signals:
void progressChanged(int progress);
protected:
void setStatus(const QString& status);
void setProgress(int progress);
virtual void run();
virtual void executeTask() = 0;