Added framework for a net play host status dialog window.
This commit is contained in:
parent
d212b894a7
commit
75e9627aa8
|
@ -1695,6 +1695,25 @@ void consoleWin_t::createMainMenu(void)
|
||||||
|
|
||||||
netPlayMenu->addAction(act);
|
netPlayMenu->addAction(act);
|
||||||
|
|
||||||
|
// NetPlay -> Client Status Dialog
|
||||||
|
act = new QAction(tr("Host &Status"), this);
|
||||||
|
//act->setShortcut( QKeySequence(tr("Shift+F7")));
|
||||||
|
act->setStatusTip(tr("Open Netplay Host Status Dialog"));
|
||||||
|
connect(act, SIGNAL(triggered()), this, SLOT(openNetPlayStatusWindow(void)) );
|
||||||
|
netPlayHostStatAct = act;
|
||||||
|
|
||||||
|
netPlayMenu->addAction(act);
|
||||||
|
|
||||||
|
// NetPlay -> Client Status Dialog
|
||||||
|
act = new QAction(tr("Client &Status"), this);
|
||||||
|
//act->setShortcut( QKeySequence(tr("Shift+F7")));
|
||||||
|
act->setStatusTip(tr("Open Netplay Client Status Dialog"));
|
||||||
|
connect(act, SIGNAL(triggered()), this, SLOT(openNetPlayStatusWindow(void)) );
|
||||||
|
netPlayClientStatAct = act;
|
||||||
|
|
||||||
|
netPlayMenu->addAction(act);
|
||||||
|
|
||||||
|
|
||||||
//netPlayMenu->setEnabled(false);
|
//netPlayMenu->setEnabled(false);
|
||||||
//-----------------------------------------------------------------------
|
//-----------------------------------------------------------------------
|
||||||
// Tools
|
// Tools
|
||||||
|
@ -3202,6 +3221,20 @@ void consoleWin_t::openNetPlayJoinWindow(void)
|
||||||
openNetPlayJoinDialog(this);
|
openNetPlayJoinDialog(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void consoleWin_t::openNetPlayStatusWindow(void)
|
||||||
|
{
|
||||||
|
//printf("Open NetPlay Status Window\n");
|
||||||
|
|
||||||
|
if (isNetPlayHost())
|
||||||
|
{
|
||||||
|
openNetPlayHostStatusDialog(this);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
openNetPlayClientStatusDialog(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void consoleWin_t::closeNetPlaySession(void)
|
void consoleWin_t::closeNetPlaySession(void)
|
||||||
{
|
{
|
||||||
NetPlayCloseSession();
|
NetPlayCloseSession();
|
||||||
|
@ -4766,11 +4799,27 @@ void consoleWin_t::updatePeriodic(void)
|
||||||
stopWavAct->setEnabled( FCEUI_WaveRecordRunning() );
|
stopWavAct->setEnabled( FCEUI_WaveRecordRunning() );
|
||||||
tasEditorAct->setEnabled( FCEU_IsValidUI(FCEUI_TASEDITOR) );
|
tasEditorAct->setEnabled( FCEU_IsValidUI(FCEUI_TASEDITOR) );
|
||||||
|
|
||||||
bool netPlayactv = NetPlayActive();
|
const bool netPlayactv = NetPlayActive();
|
||||||
|
|
||||||
netPlayHostAct->setEnabled( !netPlayactv );
|
netPlayHostAct->setEnabled( !netPlayactv );
|
||||||
netPlayJoinAct->setEnabled( !netPlayactv );
|
netPlayJoinAct->setEnabled( !netPlayactv );
|
||||||
netPlayDiscAct->setEnabled( netPlayactv );
|
netPlayDiscAct->setEnabled( netPlayactv );
|
||||||
|
|
||||||
|
if (netPlayactv)
|
||||||
|
{
|
||||||
|
const bool isHost = isNetPlayHost();
|
||||||
|
netPlayHostStatAct->setEnabled(isHost);
|
||||||
|
netPlayHostStatAct->setVisible(isHost);
|
||||||
|
netPlayClientStatAct->setEnabled(!isHost);
|
||||||
|
netPlayClientStatAct->setVisible(!isHost);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
netPlayHostStatAct->setEnabled(false);
|
||||||
|
netPlayHostStatAct->setVisible(false);
|
||||||
|
netPlayClientStatAct->setEnabled(false);
|
||||||
|
netPlayClientStatAct->setVisible(false);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( errorMsgValid )
|
if ( errorMsgValid )
|
||||||
|
|
|
@ -263,6 +263,8 @@ class consoleWin_t : public QMainWindow
|
||||||
QAction *netPlayHostAct;
|
QAction *netPlayHostAct;
|
||||||
QAction *netPlayJoinAct;
|
QAction *netPlayJoinAct;
|
||||||
QAction *netPlayDiscAct;
|
QAction *netPlayDiscAct;
|
||||||
|
QAction *netPlayHostStatAct;
|
||||||
|
QAction *netPlayClientStatAct;
|
||||||
//QAction *aviHudAct;
|
//QAction *aviHudAct;
|
||||||
//QAction *aviMsgAct;
|
//QAction *aviMsgAct;
|
||||||
|
|
||||||
|
@ -362,6 +364,7 @@ class consoleWin_t : public QMainWindow
|
||||||
void openPaletteEditorWin(void);
|
void openPaletteEditorWin(void);
|
||||||
void openNetPlayHostWindow(void);
|
void openNetPlayHostWindow(void);
|
||||||
void openNetPlayJoinWindow(void);
|
void openNetPlayJoinWindow(void);
|
||||||
|
void openNetPlayStatusWindow(void);
|
||||||
void closeNetPlaySession(void);
|
void closeNetPlaySession(void);
|
||||||
void openAviRiffViewer(void);
|
void openAviRiffViewer(void);
|
||||||
void openTimingStatWin(void);
|
void openTimingStatWin(void);
|
||||||
|
|
|
@ -134,6 +134,32 @@ struct NetPlayFrameDataHist_t
|
||||||
};
|
};
|
||||||
static NetPlayFrameDataHist_t netPlayFrameData;
|
static NetPlayFrameDataHist_t netPlayFrameData;
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
|
const char* NetPlayPlayerRoleToString(int role)
|
||||||
|
{
|
||||||
|
const char* roleString = nullptr;
|
||||||
|
|
||||||
|
switch (role)
|
||||||
|
{
|
||||||
|
default:
|
||||||
|
case netPlayerId::NETPLAY_SPECTATOR:
|
||||||
|
roleString = "Spectator";
|
||||||
|
break;
|
||||||
|
case netPlayerId::NETPLAY_PLAYER1:
|
||||||
|
roleString = "Player 1";
|
||||||
|
break;
|
||||||
|
case netPlayerId::NETPLAY_PLAYER2:
|
||||||
|
roleString = "Player 2";
|
||||||
|
break;
|
||||||
|
case netPlayerId::NETPLAY_PLAYER3:
|
||||||
|
roleString = "Player 3";
|
||||||
|
break;
|
||||||
|
case netPlayerId::NETPLAY_PLAYER4:
|
||||||
|
roleString = "Player 4";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return roleString;
|
||||||
|
}
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
//--- NetPlayServer
|
//--- NetPlayServer
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
NetPlayServer *NetPlayServer::instance = nullptr;
|
NetPlayServer *NetPlayServer::instance = nullptr;
|
||||||
|
@ -365,6 +391,7 @@ bool NetPlayServer::claimRole(NetPlayClient* client, int _role)
|
||||||
success = true;
|
success = true;
|
||||||
roleMask |= mask;
|
roleMask |= mask;
|
||||||
clientPlayer[_role] = client;
|
clientPlayer[_role] = client;
|
||||||
|
client->role = _role;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return success;
|
return success;
|
||||||
|
@ -1417,6 +1444,113 @@ void NetPlayJoinDialog::onSocketError(const QString& errorMsg)
|
||||||
client = nullptr;
|
client = nullptr;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
//--- NetPlayJoinDialog
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
NetPlayHostStatusDialog* NetPlayHostStatusDialog::instance = nullptr;
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
NetPlayHostStatusDialog::NetPlayHostStatusDialog(QWidget *parent)
|
||||||
|
: QDialog(parent)
|
||||||
|
{
|
||||||
|
QVBoxLayout *mainLayout;
|
||||||
|
QHBoxLayout *hbox;
|
||||||
|
//QGridLayout *grid;
|
||||||
|
QPushButton *closeButton;
|
||||||
|
//QLabel *lbl;
|
||||||
|
|
||||||
|
instance = this;
|
||||||
|
|
||||||
|
setWindowTitle("NetPlay Status");
|
||||||
|
|
||||||
|
mainLayout = new QVBoxLayout();
|
||||||
|
|
||||||
|
clientTree = new QTreeWidget();
|
||||||
|
mainLayout->addWidget( clientTree );
|
||||||
|
|
||||||
|
clientTree->setColumnCount(3);
|
||||||
|
|
||||||
|
auto* item = new QTreeWidgetItem();
|
||||||
|
item->setText( 0, QString::fromStdString( "Player" ) );
|
||||||
|
item->setText( 1, QString::fromStdString( "Role" ) );
|
||||||
|
item->setText( 2, QString::fromStdString( "State" ) );
|
||||||
|
item->setTextAlignment( 0, Qt::AlignLeft);
|
||||||
|
item->setTextAlignment( 1, Qt::AlignLeft);
|
||||||
|
item->setTextAlignment( 2, Qt::AlignLeft);
|
||||||
|
|
||||||
|
//connect( clientTree, SIGNAL(itemClicked(QTreeWidgetItem*, int)),
|
||||||
|
//this, SLOT(watchClicked( QTreeWidgetItem*, int)) );
|
||||||
|
|
||||||
|
clientTree->setHeaderItem( item );
|
||||||
|
|
||||||
|
closeButton = new QPushButton( tr("Close") );
|
||||||
|
closeButton->setIcon(style()->standardIcon(QStyle::SP_DialogCloseButton));
|
||||||
|
connect(closeButton, SIGNAL(clicked(void)), this, SLOT(closeWindow(void)));
|
||||||
|
|
||||||
|
hbox = new QHBoxLayout();
|
||||||
|
hbox->addStretch(5);
|
||||||
|
hbox->addWidget( closeButton, 1 );
|
||||||
|
mainLayout->addLayout( hbox );
|
||||||
|
|
||||||
|
setLayout(mainLayout);
|
||||||
|
|
||||||
|
loadClientTree();
|
||||||
|
}
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
NetPlayHostStatusDialog::~NetPlayHostStatusDialog(void)
|
||||||
|
{
|
||||||
|
instance = nullptr;
|
||||||
|
//printf("Destroy NetPlay Status Window\n");
|
||||||
|
}
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
void NetPlayHostStatusDialog::closeEvent(QCloseEvent *event)
|
||||||
|
{
|
||||||
|
//printf("NetPlay Host Close Window Event\n");
|
||||||
|
done(0);
|
||||||
|
deleteLater();
|
||||||
|
event->accept();
|
||||||
|
}
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
void NetPlayHostStatusDialog::closeWindow(void)
|
||||||
|
{
|
||||||
|
//printf("Close Window\n");
|
||||||
|
done(0);
|
||||||
|
deleteLater();
|
||||||
|
}
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
void NetPlayHostStatusDialog::loadClientTree()
|
||||||
|
{
|
||||||
|
auto* server = NetPlayServer::GetInstance();
|
||||||
|
|
||||||
|
if (server == nullptr)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const char *roleString = NetPlayPlayerRoleToString( server->getRole() );
|
||||||
|
auto* serverTopLvlItem = new NetPlayClientTreeItem();
|
||||||
|
|
||||||
|
serverTopLvlItem->server = server;
|
||||||
|
serverTopLvlItem->setText( 0, tr("Host") );
|
||||||
|
serverTopLvlItem->setText( 1, tr(roleString) );
|
||||||
|
|
||||||
|
clientTree->addTopLevelItem( serverTopLvlItem );
|
||||||
|
|
||||||
|
auto& clientList = server->getClientList();
|
||||||
|
|
||||||
|
for (auto& client : clientList)
|
||||||
|
{
|
||||||
|
roleString = NetPlayPlayerRoleToString( client->role );
|
||||||
|
|
||||||
|
auto* clientTopLvlItem = new NetPlayClientTreeItem();
|
||||||
|
|
||||||
|
clientTopLvlItem->client = client;
|
||||||
|
|
||||||
|
clientTopLvlItem->setText( 0, client->userName );
|
||||||
|
clientTopLvlItem->setText( 1, tr(roleString) );
|
||||||
|
|
||||||
|
clientTree->addTopLevelItem( clientTopLvlItem );
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
//----------------------------------------------------------------------------
|
//----------------------------------------------------------------------------
|
||||||
//---- Global Functions
|
//---- Global Functions
|
||||||
//----------------------------------------------------------------------------
|
//----------------------------------------------------------------------------
|
||||||
|
@ -1515,13 +1649,13 @@ void NetPlayCloseSession(void)
|
||||||
NetPlayServer::Destroy();
|
NetPlayServer::Destroy();
|
||||||
}
|
}
|
||||||
//----------------------------------------------------------------------------
|
//----------------------------------------------------------------------------
|
||||||
void openNetPlayHostDialog(QWidget* parent)
|
template <typename T> void openSingletonDialog(QWidget* parent)
|
||||||
{
|
{
|
||||||
NetPlayHostDialog* win = NetPlayHostDialog::GetInstance();
|
T* win = T::GetInstance();
|
||||||
|
|
||||||
if (win == nullptr)
|
if (win == nullptr)
|
||||||
{
|
{
|
||||||
win = new NetPlayHostDialog(parent);
|
win = new T(parent);
|
||||||
|
|
||||||
win->show();
|
win->show();
|
||||||
}
|
}
|
||||||
|
@ -1532,21 +1666,24 @@ void openNetPlayHostDialog(QWidget* parent)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//----------------------------------------------------------------------------
|
//----------------------------------------------------------------------------
|
||||||
|
void openNetPlayHostDialog(QWidget* parent)
|
||||||
|
{
|
||||||
|
openSingletonDialog<NetPlayHostDialog>(parent);
|
||||||
|
}
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
void openNetPlayJoinDialog(QWidget* parent)
|
void openNetPlayJoinDialog(QWidget* parent)
|
||||||
{
|
{
|
||||||
NetPlayJoinDialog* win = NetPlayJoinDialog::GetInstance();
|
openSingletonDialog<NetPlayJoinDialog>(parent);
|
||||||
|
}
|
||||||
if (win == nullptr)
|
//----------------------------------------------------------------------------
|
||||||
{
|
void openNetPlayHostStatusDialog(QWidget* parent)
|
||||||
win = new NetPlayJoinDialog(parent);
|
{
|
||||||
|
openSingletonDialog<NetPlayHostStatusDialog>(parent);
|
||||||
win->show();
|
}
|
||||||
}
|
//----------------------------------------------------------------------------
|
||||||
else
|
void openNetPlayClientStatusDialog(QWidget* parent)
|
||||||
{
|
{
|
||||||
win->activateWindow();
|
//openSingletonDialog<NetPlayHostStatusDialog>(parent);
|
||||||
win->raise();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
//----------------------------------------------------------------------------
|
//----------------------------------------------------------------------------
|
||||||
//---- Network Byte Swap Utilities
|
//---- Network Byte Swap Utilities
|
||||||
|
|
|
@ -22,6 +22,9 @@
|
||||||
#include <QFrame>
|
#include <QFrame>
|
||||||
#include <QGroupBox>
|
#include <QGroupBox>
|
||||||
#include <QCloseEvent>
|
#include <QCloseEvent>
|
||||||
|
#include <QTreeView>
|
||||||
|
#include <QTreeWidget>
|
||||||
|
#include <QTreeWidgetItem>
|
||||||
|
|
||||||
#include <QTcpSocket>
|
#include <QTcpSocket>
|
||||||
#include <QTcpServer>
|
#include <QTcpServer>
|
||||||
|
@ -73,6 +76,8 @@ class NetPlayServer : public QTcpServer
|
||||||
static int Create(QObject *parent = 0);
|
static int Create(QObject *parent = 0);
|
||||||
static int Destroy();
|
static int Destroy();
|
||||||
|
|
||||||
|
typedef std::list <NetPlayClient*> ClientList_t;
|
||||||
|
|
||||||
int closeAllConnections(void);
|
int closeAllConnections(void);
|
||||||
|
|
||||||
void update(void);
|
void update(void);
|
||||||
|
@ -123,6 +128,7 @@ class NetPlayServer : public QTcpServer
|
||||||
int sendRomLoadReq( NetPlayClient *client );
|
int sendRomLoadReq( NetPlayClient *client );
|
||||||
int sendStateSyncReq( NetPlayClient *client );
|
int sendStateSyncReq( NetPlayClient *client );
|
||||||
void setRole(int _role);
|
void setRole(int _role);
|
||||||
|
int getRole(void){ return role; }
|
||||||
bool claimRole(NetPlayClient* client, int _role);
|
bool claimRole(NetPlayClient* client, int _role);
|
||||||
|
|
||||||
uint32_t getMaxLeadFrames(){ return maxLeadFrames; }
|
uint32_t getMaxLeadFrames(){ return maxLeadFrames; }
|
||||||
|
@ -130,6 +136,8 @@ class NetPlayServer : public QTcpServer
|
||||||
|
|
||||||
void serverProcessMessage( NetPlayClient *client, void *msgBuf, size_t msgSize );
|
void serverProcessMessage( NetPlayClient *client, void *msgBuf, size_t msgSize );
|
||||||
|
|
||||||
|
ClientList_t& getClientList(){ return clientList; }
|
||||||
|
|
||||||
QString sessionName;
|
QString sessionName;
|
||||||
QString sessionPasswd;
|
QString sessionPasswd;
|
||||||
private:
|
private:
|
||||||
|
@ -137,7 +145,7 @@ class NetPlayServer : public QTcpServer
|
||||||
|
|
||||||
void processPendingConnections(void);
|
void processPendingConnections(void);
|
||||||
|
|
||||||
std::list <NetPlayClient*> clientList;
|
ClientList_t clientList;
|
||||||
std::list <NetPlayFrameInput> input;
|
std::list <NetPlayFrameInput> input;
|
||||||
FCEU::mutex inputMtx;
|
FCEU::mutex inputMtx;
|
||||||
int role = -1;
|
int role = -1;
|
||||||
|
@ -330,6 +338,42 @@ public slots:
|
||||||
void onSocketError(const QString& errorMsg);
|
void onSocketError(const QString& errorMsg);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class NetPlayClientTreeItem : public QTreeWidgetItem
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
NetPlayClientTreeItem()
|
||||||
|
: QTreeWidgetItem()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
NetPlayClient* client = nullptr;
|
||||||
|
NetPlayServer* server = nullptr;
|
||||||
|
private:
|
||||||
|
};
|
||||||
|
|
||||||
|
class NetPlayHostStatusDialog : public QDialog
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
NetPlayHostStatusDialog(QWidget *parent = 0);
|
||||||
|
~NetPlayHostStatusDialog(void);
|
||||||
|
|
||||||
|
static NetPlayHostStatusDialog *GetInstance(void){ return instance; };
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void closeEvent(QCloseEvent *event);
|
||||||
|
void loadClientTree(void);
|
||||||
|
|
||||||
|
QTreeWidget *clientTree;
|
||||||
|
|
||||||
|
static NetPlayHostStatusDialog* instance;
|
||||||
|
|
||||||
|
public slots:
|
||||||
|
void closeWindow(void);
|
||||||
|
};
|
||||||
|
|
||||||
bool NetPlayActive(void);
|
bool NetPlayActive(void);
|
||||||
bool isNetPlayHost(void);
|
bool isNetPlayHost(void);
|
||||||
void NetPlayPeriodicUpdate(void);
|
void NetPlayPeriodicUpdate(void);
|
||||||
|
@ -341,3 +385,6 @@ void NetPlayCloseSession(void);
|
||||||
void NetPlayTraceInstruction(uint8_t *opcode, int size);
|
void NetPlayTraceInstruction(uint8_t *opcode, int size);
|
||||||
void openNetPlayHostDialog(QWidget* parent = nullptr);
|
void openNetPlayHostDialog(QWidget* parent = nullptr);
|
||||||
void openNetPlayJoinDialog(QWidget* parent = nullptr);
|
void openNetPlayJoinDialog(QWidget* parent = nullptr);
|
||||||
|
void openNetPlayHostStatusDialog(QWidget* parent = nullptr);
|
||||||
|
void openNetPlayClientStatusDialog(QWidget* parent = nullptr);
|
||||||
|
const char* NetPlayPlayerRoleToString(int role);
|
||||||
|
|
Loading…
Reference in New Issue