{
ui->setupUi(this);
- connect(&serverSocket, SIGNAL(connected()), this, SLOT(serverConnected()));
- connect(&serverSocket, SIGNAL(disconnected()), this, SLOT(serverDisconnected()));
- connect(&serverSocket, SIGNAL(readyRead()), this, SLOT(serverDataAvailable()));
- connect(&serverSocket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(serverError()));
+ createStates();
+ createTransitions();
+ createConnections();
- connectToServer();
+ stateMachine.setInitialState(disconnectedState);
+ QTimer::singleShot(0, &stateMachine, SLOT(start()));
}
MainWindow::~MainWindow()
serverSocket.disconnectFromHost();
}
-void MainWindow::serverConnected()
+void MainWindow::createStates()
{
- ui->testButton->setEnabled(true);
- ui->actionConnect->setChecked(true);
-}
+ disconnectedState = new QState(&stateMachine);
+ disconnectedState->assignProperty(ui->networkButton, "text", "Connect");
+ disconnectedState->assignProperty(ui->networkButton, "enabled", true);
-void MainWindow::serverDisconnected()
-{
- ui->testButton->setEnabled(false);
- ui->actionConnect->setChecked(false);
-}
+ connectedState = new QState(&stateMachine);
-void MainWindow::serverDataAvailable()
-{
- QTextStream stream(&serverSocket);
- ui->textEdit->setText(stream.readAll());
-}
+ connectingState = new QState(connectedState);
+ connectingState->assignProperty(ui->networkButton, "text", "Connecting");
+ connectingState->assignProperty(ui->networkButton, "enabled", false);
-void MainWindow::serverError()
-{
- ui->textEdit->setText(serverSocket.errorString());
- ui->actionConnect->setChecked(serverSocket.state() == QTcpSocket::ConnectedState);
- // clean the error window after 2 secs
- QTimer::singleShot(2000, this, SLOT(cleanError()));
-}
+ normalState = new QState(connectedState);
+ normalState->assignProperty(ui->networkButton, "text", "Disconnect");
+ normalState->assignProperty(ui->networkButton, "enabled", true);
-void MainWindow::cleanError()
-{
- ui->textEdit->clear();
+ disconnectingState = new QState(connectedState);
+ disconnectingState->assignProperty(ui->networkButton, "text", "Disconnecting");
+ disconnectingState->assignProperty(ui->networkButton, "enabled", false);
}
-void MainWindow::on_testButton_clicked()
+void MainWindow::createTransitions()
{
- QTextStream stream(&serverSocket);
- stream << JsonEngine().playerGetActivePlayers();
+ disconnectedState->addTransition(ui->networkButton, SIGNAL(clicked()), connectingState);
+
+ connectedState->addTransition(&serverSocket, SIGNAL(disconnected()), disconnectedState);
+
+ connectingState->addTransition(&serverSocket, SIGNAL(connected()), normalState);
+ connectingState->addTransition(&serverSocket, SIGNAL(error(QAbstractSocket::SocketError)), disconnectedState);
+
+ normalState->addTransition(ui->networkButton, SIGNAL(clicked()), disconnectingState);
}
-void MainWindow::on_actionConnect_triggered(bool checked)
+void MainWindow::createConnections()
{
- qDebug("menu state: %d", checked);
- if (checked) {
- connectToServer();
- } else {
- disconnectFromServer();
- }
+ connect(connectingState, SIGNAL(entered()), this, SLOT(connectToServer()));
+ connect(disconnectingState, SIGNAL(entered()), this, SLOT(disconnectFromServer()));
}
#include <QtGui/QMainWindow>
#include <QtNetwork/QTcpSocket>
+#include <QStateMachine>
+#include <QState>
namespace Ui {
class MainWindow;
private slots:
// manual connected slots
- void serverConnected();
- void serverDisconnected();
- void serverDataAvailable();
- void serverError();
- void cleanError();
+ void connectToServer();
+ void disconnectFromServer();
// auto-connected slots
void on_actionSetup_triggered();
- void on_actionConnect_triggered(bool checked);
- void on_testButton_clicked();
private:
void pendingNetworkOperation(bool pending);
- void connectToServer();
- void disconnectFromServer();
+ void createStates();
+ void createTransitions();
+ void createConnections();
QTcpSocket serverSocket;
Ui::MainWindow *ui;
+
+ QStateMachine stateMachine;
+ QState* disconnectedState;
+ QState* connectedState;
+ QState* disconnectingState;
+ QState* normalState;
+ QState* connectingState;
};
#endif // MAINWINDOW_H
<string>XBMC Net Movies RC</string>
</property>
<widget class="QWidget" name="centralWidget">
- <layout class="QVBoxLayout" name="verticalLayout">
+ <layout class="QVBoxLayout" name="verticalLayout_2">
<item>
- <widget class="QPushButton" name="testButton">
- <property name="enabled">
- <bool>false</bool>
- </property>
+ <widget class="QPushButton" name="networkButton">
<property name="text">
- <string>test</string>
+ <string>PushButton</string>
</property>
</widget>
</item>
<item>
- <widget class="QTextEdit" name="textEdit">
- <property name="enabled">
- <bool>false</bool>
+ <widget class="QStackedWidget" name="stackedWidget">
+ <property name="currentIndex">
+ <number>0</number>
</property>
+ <widget class="QWidget" name="infoPage">
+ <layout class="QVBoxLayout" name="verticalLayout">
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <item>
+ <widget class="QTextEdit" name="textEdit">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
</widget>
</item>
</layout>
<string>MainMenu</string>
</property>
<addaction name="actionSetup"/>
- <addaction name="actionConnect"/>
</widget>
<addaction name="menuSetup"/>
</widget>