From 869ad18f08ede9457cf85436de881c95b8e8d8b6 Mon Sep 17 00:00:00 2001 From: markuspg Date: Sun, 9 Oct 2016 10:23:50 +0200 Subject: [PATCH] Implemented all still missing functionality of 'lc::SessionStarter' --- src/Lib/client.h | 5 ++ src/sessionstarter.cpp | 146 +++++++++++++++++++++++++++++++++++++++++ src/sessionstarter.h | 21 ++++++ src/sessionstarter.ui | 19 +++++- 4 files changed, 190 insertions(+), 1 deletion(-) diff --git a/src/Lib/client.h b/src/Lib/client.h index fe6a0bb..be2774e 100644 --- a/src/Lib/client.h +++ b/src/Lib/client.h @@ -84,6 +84,7 @@ public: @return The current state of the client */ state_t GetClientState() const { return state; } + QString GetSessionPort() const { return sessionPort; } /*! * \brief Kills all processes 'zleaf.exe' on the client */ @@ -99,6 +100,8 @@ public: * \param argOpenAsRoot Run the terminal session as root (true) or as normal user (false) */ void OpenTerminal( const QString &argCommand, const bool &argOpenAsRoot ); + void SetSessionPort( const QString &argSP ) { sessionPort = argSP; } + void SetzLeafVersion( const QString &argzLeafV ) { zLeafVersion = argzLeafV; } //! Shows the desktop of the given client void ShowDesktop(); /*! @@ -120,6 +123,8 @@ private: QThread pingerThread; state_t state = state_t::UNINITIALIZED; QTimer *pingTimer = nullptr; //! QTimer used to trigger pings by pinger's ClientPinger instance + QString sessionPort; + QString zLeafVersion; private slots: void GotStatusChanged( state_t argState ); diff --git a/src/sessionstarter.cpp b/src/sessionstarter.cpp index 8a28d44..540e53f 100644 --- a/src/sessionstarter.cpp +++ b/src/sessionstarter.cpp @@ -19,6 +19,10 @@ #include +#include +#include +#include + #include "sessionstarter.h" #include "ui_sessionstarter.h" #include "Lib/settings.h" @@ -27,6 +31,7 @@ extern std::unique_ptr< lc::Settings > settings; lc::SessionStarter::SessionStarter( QWidget *argParent ) : QWidget{ argParent }, + clientsViewModel{ new QStandardItemModel{ this } }, ui{ new Ui::SessionStarter } { ui->setupUi( this ); @@ -34,8 +39,149 @@ lc::SessionStarter::SessionStarter( QWidget *argParent ) : if ( settings->GetChosenZTreePort() ) { ui->SBPort->setValue( settings->GetChosenZTreePort() ); } + + if ( settings->dvipsCmd.isEmpty() || settings->latexCmd.isEmpty() + || settings->lcInstDir.isEmpty() || settings->lprCmd.isEmpty() + || settings->postscriptViewer.isEmpty() || settings->ps2pdfCmd.isEmpty() + || settings->rmCmd.isEmpty() || settings->vncViewer.isEmpty() ) { + ui->GBReceipts->setEnabled( false ); + QMessageBox::information( this, tr( "Receipts printing will not work" ), + tr( "Some component essential for receipts creation and" + " printing is missing. No receipts will be created or" + " printed." ), QMessageBox::Ok ); + } else { + ui->CBReceiptsHeader->addItems( settings->installedLaTeXHeaders ); + + if ( settings->defaultReceiptIndex + && settings->defaultReceiptIndex < ui->CBReceiptsHeader->count() ) { + ui->CBReceiptsHeader->setCurrentIndex( settings->defaultReceiptIndex ); + } + } + + ui->CBzTreeVersion->addItem( tr( "Please choose a version:" ) ); + ui->CBzTreeVersion->addItems( settings->installedZTreeVersions ); + + ui->CBDataTargetPath->addItem( tr( "Set a new path HERE" ) ); + ui->CBDataTargetPath->addItem( QDir::homePath() ); + ui->CBDataTargetPath->addItem( QDir::homePath() + "/zTreeData" ); + ui->CBDataTargetPath->setCurrentIndex( 2 ); + connect( this, &SessionStarter::RequestNewDataTargetPath, + this, &SessionStarter::GetNewDataTargetPath ); + + for ( auto *s : settings->GetClients() ) { + int tempXPos = s->xPosition - 1, tempYPos = s->yPosition; + + if ( clientsViewModel->item( tempYPos, tempXPos ) ) { + QMessageBox::information( this, tr( "Double assignment to one position" ), + tr( "Two client where set for the same position. Client" + " '%1' will be dropped." ).arg( s->name ) ); + continue; + } + + QStandardItem *item = new QStandardItem( s->name ); + item->setEditable( false ); + const QString sessionPort{ s->GetSessionPort() }; + if ( sessionPort.isEmpty() ) { + item->setText( s->name ); + } else { + item->setBackground( QBrush{ QColor{ 196, 196, 255 } } ); + item->setSelectable( false ); + item->setText( QString{ "(" + sessionPort + ") " + s->name } ); + } + QVariant v = qVariantFromValue( static_cast< void* >( s ) ); + item->setData( v, Qt::UserRole ); + clientsViewModel->setItem( tempYPos, tempXPos, item ); + } + ui->TVClients->setModel( clientsViewModel ); } lc::SessionStarter::~SessionStarter() { delete ui; } + +void lc::SessionStarter::GetNewDataTargetPath() { + QFileDialog fileDialog{ this }; + fileDialog.setFileMode( QFileDialog::Directory ); + fileDialog.setDirectory( QDir::homePath() ); + fileDialog.setOption( QFileDialog::ShowDirsOnly, true ); + fileDialog.setOption( QFileDialog::DontUseNativeDialog, true ); + if ( fileDialog.exec() ) { + const QString fileName = fileDialog.selectedFiles().at( 0 ); + ui->CBDataTargetPath->addItem( fileName ); + ui->CBDataTargetPath->setCurrentText( fileName ); + } +} + +void lc::SessionStarter::on_CBDataTargetPath_activated( int argIndex ) { + if ( !argIndex ) { + emit RequestNewDataTargetPath(); + } + + ui->CBDataTargetPath->setStyleSheet( "" ); +} + +void lc::SessionStarter::on_CBReceiptsHeader_activated( int argIndex ) { + Q_UNUSED( argIndex ); + ui->CBReceiptsHeader->setStyleSheet( "" ); +} + +void lc::SessionStarter::on_CBzTreeVersion_activated( int argIndex ) { + Q_UNUSED( argIndex ); + ui->CBzTreeVersion->setStyleSheet( "" ); +} + +void lc::SessionStarter::on_ChBPrintAnonymousReceipts_clicked( bool argChecked ) { + ui->ChBPrintAnonymousReceipts->setStyleSheet( "" ); + + ui->LReplaceParticipantNames->setEnabled( argChecked ); + ui->CBReplaceParticipantNames->setEnabled( argChecked ); +} + +void lc::SessionStarter::on_PBStartSession_clicked() { + if ( ui->CBzTreeVersion->currentIndex() == 0 ) { + QMessageBox::information( this, tr( "No z-Tree version chosen" ), + tr( "A z-Tree version was not chosen, yet. This setting is" + " mandatory." ), QMessageBox::Ok ); + return; + } + + const QModelIndexList activatedItems = ui->TVClients->selectionModel()->selectedIndexes(); + if( !ui->ChBSessionWithoutClients->isChecked() ) { + if ( !activatedItems.length() ) { + QMessageBox::information( this, tr( "Canceled, no clients were chosen" ), + tr( "The start of a new session was canceled." + " Some clients have to be selected first or the" + " creation of sessions without clients must be" + " allowed with the checkbox close to the bottom" ) ); + return; + } + } + + QString anonymousReceiptsPlaceholder; + if ( ui->ChBPrintAnonymousReceipts->isChecked() ) { + anonymousReceiptsPlaceholder = ui->CBReplaceParticipantNames->currentText(); + } + + QVector< Client* > associatedClients; + for ( auto cit = activatedItems.cbegin(); cit != activatedItems.cend(); ++cit ) { + if ( ( *cit ).data( Qt::DisplayRole ).type() != 0 ) { + Client *client = static_cast< Client* >( ( *cit ).data( Qt::UserRole ).value< void* >() ); + client->SetSessionPort( QString::number( ui->SBPort->value() ) ); + client->SetzLeafVersion( ui->CBzTreeVersion->currentText() ); + associatedClients.append( client ); + } + } + + emit RequestNewSession( associatedClients, anonymousReceiptsPlaceholder, + ui->ChBPrintAnonymousReceipts->isChecked(), + ui->CBReceiptsHeader->currentText(), + ui->CBDataTargetPath->currentText(), + static_cast< quint16 >( ui->SBPort->value() ), + ui->CBzTreeVersion->currentText() ); + + this->deleteLater(); +} + +void lc::SessionStarter::on_SBPort_editingFinished() { + ui->SBPort->setStyleSheet( "" ); +} diff --git a/src/sessionstarter.h b/src/sessionstarter.h index a692af3..5ee155e 100644 --- a/src/sessionstarter.h +++ b/src/sessionstarter.h @@ -22,8 +22,12 @@ #include +class QStandardItemModel; + namespace lc { +class Client; + namespace Ui { class SessionStarter; } @@ -35,8 +39,25 @@ public: explicit SessionStarter( QWidget *argParent = nullptr ); ~SessionStarter(); +signals: + void RequestNewDataTargetPath(); + void RequestNewSession( QVector< Client* > argAssocCl, QString argParticipNameReplacement, + bool argPrintAnonReceipts, QString argReceiptsHeader, + QString argzTreeDataTargetPath, quint16 argzTreePort, + QString argzTreeVersion ); + private: + QStandardItemModel *clientsViewModel = nullptr; Ui::SessionStarter *ui = nullptr; + +private slots: + void GetNewDataTargetPath(); + void on_CBDataTargetPath_activated( int argIndex ); + void on_CBReceiptsHeader_activated( int argIndex ); + void on_CBzTreeVersion_activated( int argIndex ); + void on_ChBPrintAnonymousReceipts_clicked( bool argChecked ); + void on_PBStartSession_clicked(); + void on_SBPort_editingFinished(); }; } diff --git a/src/sessionstarter.ui b/src/sessionstarter.ui index 28726ad..54bb526 100644 --- a/src/sessionstarter.ui +++ b/src/sessionstarter.ui @@ -270,5 +270,22 @@ Please take care that it does not contain any spaces or other special characters - + + + PBCancel + clicked() + lc::SessionStarter + deleteLater() + + + 319 + 552 + + + 319 + 287 + + + +