diff --git a/src/gui/qt/gametable/log/guilog.cpp b/src/gui/qt/gametable/log/guilog.cpp index 0cabece4..ccf31055 100644 --- a/src/gui/qt/gametable/log/guilog.cpp +++ b/src/gui/qt/gametable/log/guilog.cpp @@ -27,7 +27,7 @@ using namespace std; -guiLog::guiLog(gameTableImpl* w, ConfigFile *c) : myW(w), myConfig(c), myLogDir(0), myHtmlLogFile(0) +guiLog::guiLog(gameTableImpl* w, ConfigFile *c) : myW(w), myConfig(c), myLogDir(0), myHtmlLogFile(0), myHtmlLogFile_old(0), myTxtLogFile(0), tb(0) { myW->setGuiLog(this); @@ -67,28 +67,28 @@ guiLog::guiLog(gameTableImpl* w, ConfigFile *c) : myW(w), myConfig(c), myLogDir( myLogDir = new QDir(QString::fromUtf8(myConfig->readConfigString("LogDir").c_str())); QDateTime currentTime = QDateTime::currentDateTime(); if(SQLITE_LOG) { - myHtmlLogFile = new QFile(myLogDir->absolutePath()+"/pokerth-log-"+currentTime.toString("yyyy-MM-dd_hh.mm.ss")+"_old.html"); + myHtmlLogFile_old = new QFile(myLogDir->absolutePath()+"/pokerth-log-"+currentTime.toString("yyyy-MM-dd_hh.mm.ss")+"_old.html"); } else { - myHtmlLogFile = new QFile(myLogDir->absolutePath()+"/pokerth-log-"+currentTime.toString("yyyy-MM-dd_hh.mm.ss")+".html"); + myHtmlLogFile_old = new QFile(myLogDir->absolutePath()+"/pokerth-log-"+currentTime.toString("yyyy-MM-dd_hh.mm.ss")+".html"); } //Logo-Pixmap extrahieren QPixmap logoChipPixmapFile(":/gfx/logoChip3D.png"); logoChipPixmapFile.save(myLogDir->absolutePath()+"/logo.png"); -// myW->textBrowser_Log->append(myHtmlLogFile->fileName()); +// myW->textBrowser_Log->append(myHtmlLogFile_old->fileName()); // erstelle html-Datei - myHtmlLogFile->open( QIODevice::WriteOnly ); - QTextStream stream( myHtmlLogFile ); - stream << "\n"; - stream << "\n"; - stream << ""; - stream << "\n"; - stream << "\n"; - stream << "\n"; - stream << QString("

Log-File for PokerTH %1 Session started on ").arg(POKERTH_BETA_RELEASE_STRING)+QDate::currentDate().toString("yyyy-MM-dd")+" at "+QTime::currentTime().toString("hh:mm:ss")+"

\n"; - myHtmlLogFile->close(); + myHtmlLogFile_old->open( QIODevice::WriteOnly ); + QTextStream stream_old( myHtmlLogFile_old ); + stream_old << "\n"; + stream_old << "\n"; + stream_old << ""; + stream_old << "\n"; + stream_old << "\n"; + stream_old << "\n"; + stream_old << QString("

Log-File for PokerTH %1 Session started on ").arg(POKERTH_BETA_RELEASE_STRING)+QDate::currentDate().toString("yyyy-MM-dd")+" at "+QTime::currentTime().toString("hh:mm:ss")+"

\n"; + myHtmlLogFile_old->close(); } @@ -130,6 +130,7 @@ guiLog::~guiLog() { delete myLogDir; delete myHtmlLogFile; + delete myHtmlLogFile_old; } @@ -541,12 +542,12 @@ QStringList guiLog::translateCardCode(int cardCode) void guiLog::writeLogFileStream(QString streamString) { - if(myHtmlLogFile) { - if(myHtmlLogFile->open( QIODevice::ReadWrite )) { - QTextStream stream( myHtmlLogFile ); - stream.readAll(); - stream << streamString; - myHtmlLogFile->close(); + if(myHtmlLogFile_old) { + if(myHtmlLogFile_old->open( QIODevice::ReadWrite )) { + QTextStream stream_old( myHtmlLogFile_old ); + stream_old.readAll(); + stream_old << streamString; + myHtmlLogFile_old->close(); } else { cout << "Could not open log-file to write log-messages!" << endl; } @@ -555,6 +556,34 @@ void guiLog::writeLogFileStream(QString streamString) } } +void guiLog::writeLogFileStream(string log_string, QFile *LogFile) +{ + + QTextStream stream( LogFile ); + stream.readAll(); + stream << log_string.data(); + +} + +void guiLog::writeLog(string log_string, int modus) +{ + + switch(modus) { + case 1: + writeLogFileStream(log_string,myHtmlLogFile); + break; + case 2: + writeLogFileStream(log_string,myTxtLogFile); + break; + case 3: + tb->append(log_string.data()); + break; + default: + ; + } + +} + void guiLog::flushLogAtHand() { @@ -580,26 +609,796 @@ void guiLog::flushLogAtGame(int gameID) } } -void guiLog::exportLogPdbToHtml(QString fileString) +void guiLog::exportLogPdbToHtml(QString fileStringPdb, QString exportFileString) { - qDebug() << "Export pdb to html" << fileString; + myHtmlLogFile = new QFile(exportFileString); + + myHtmlLogFile->open( QIODevice::ReadWrite | QFile::Truncate); + + string log_string = "\n"; + log_string += "\n"; + log_string += ""; + log_string += "\n"; + log_string += "\n"; + writeLog(log_string,1); + + exportLog(fileStringPdb,1); + + myHtmlLogFile->close(); } -void guiLog::exportLogPdbToTxt(QString fileString) +void guiLog::exportLogPdbToTxt(QString fileStringPdb, QString exportFileString) { - qDebug() << "Export pdb to txt" << fileString; + myTxtLogFile = new QFile(exportFileString); + + myTxtLogFile->open( QIODevice::ReadWrite | QFile::Truncate ); + + exportLog(fileStringPdb,2); + + myTxtLogFile->close(); } -void guiLog::showLog(QString fileString, QTextBrowser *tb) +void guiLog::showLog(QString fileStringPdb, QTextBrowser *tb_tmp) { + tb = tb_tmp; tb->clear(); - for(int i=0; i<5; i++) { - tb->append(fileString); + exportLog(fileStringPdb,3); + +} + +int guiLog::exportLog(QString fileStringPdb,int modus) +{ + bool neu = false; + + string sql = ""; + string log_string = ""; + bool data_found = false; + char **result_Session = 0, **result_Game = 0, **result_Hand = 0, **result_Hand_ID = 0, **result_Action = 0; + int nRow_Session=0, nRow_Game=0, nRow_Hand=0, nRow_Hand_ID=0, nRow_Action=0; + int nCol_Session=0, nCol_Game=0, nCol_Hand=0, nCol_Action=0; + char *errmsg = 0; + int game_ctr = 0, hand_ctr = 0, round_ctr = 0, action_ctr = 0; + int i = 0, j = 0; + int gameID = 0; + string cmpString = "", string_tmp = ""; + string player[MAX_NUMBER_OF_PLAYERS]; + for(i=1; i<=MAX_NUMBER_OF_PLAYERS; i++) { + player[i-1] = ""; } + // open sqlite log-db + sqlite3 *mySqliteLogDb; + sqlite3_open(fileStringPdb.toStdString().data(), &mySqliteLogDb); + if( mySqliteLogDb != 0 ) { + + // read session + sql = "SELECT * FROM Session"; + if(sqlite3_get_table(mySqliteLogDb,sql.data(),&result_Session,&nRow_Session,&nCol_Session,&errmsg) != SQLITE_OK) { + cout << "Error in statement: " << sql.data() << "[" << errmsg << "]." << endl; + sqlite3_close(mySqliteLogDb); + return 1; + } + if(nRow_Session<1 || nRow_Session>1) { + cout << "Number of Sessions implausible!" << endl; + sqlite3_close(mySqliteLogDb); + return 1; + } + + log_string += "Log-File for PokerTH "; + + // pokerth version + data_found = false; + for(i=0; i(result_Session[i]) == "PokerTH_Version") { + log_string += boost::lexical_cast(result_Session[i+nCol_Session]); + data_found = true; + } + } + if(!data_found) { + cout << "Missing PokerTH version information!" << endl; + sqlite3_close(mySqliteLogDb); + return 1; + } + + log_string += " Session started on "; + + // logging date + data_found = false; + for(i=0; i(result_Session[i]) == "Date") { + log_string += boost::lexical_cast(result_Session[i+nCol_Session]); + data_found = true; + } + } + if(!data_found) { + cout << "Missing date information!" << endl; + sqlite3_close(mySqliteLogDb); + return 1; + } + + log_string += " at "; + + // logging time + data_found = false; + for(i=0; i(result_Session[i]) == "Time") { + log_string += boost::lexical_cast(result_Session[i+nCol_Session]); + data_found = true; + } + } + if(!data_found) { + cout << "Missing time information!" << endl; + sqlite3_close(mySqliteLogDb); + return 1; + } + + sqlite3_free_table(result_Session); + + switch(modus) { + case 1: + log_string = "

" + log_string + "

"; + if(!neu) log_string = "" + log_string; + break; + case 2: + log_string += "\n"; + break; + case 3: + log_string = "

" + log_string + "

"; + break; + default: + ; + } + writeLog(log_string,modus); + log_string = ""; + + // read game + sql = "SELECT * FROM Game"; + if(sqlite3_get_table(mySqliteLogDb,sql.data(),&result_Game,&nRow_Game,&nCol_Game,&errmsg) != SQLITE_OK) { + cout << "Error in statement: " << sql.data() << "[" << errmsg << "]." << endl; + sqlite3_close(mySqliteLogDb); + return 1; + } + + // run through all games + for(game_ctr=1; game_ctr<=nRow_Game; game_ctr++) { + + // game id + data_found = false; + for(i=0; i(result_Game[i]) == "GameID") { + gameID = boost::lexical_cast(result_Game[i+nCol_Game*game_ctr]); + data_found = true; + } + } + + if(!data_found) { + sqlite3_close(mySqliteLogDb); + return 1; + } + + // read player + for(i=1; i<=MAX_NUMBER_OF_PLAYERS; i++) { + data_found = false; + for(j=0; j(i); + if(boost::lexical_cast(result_Game[j]) == cmpString) { + // Seat found + if(result_Game[j+nCol_Game*game_ctr]) { + // the Seat is not empty + player[i-1] = boost::lexical_cast(result_Game[j+nCol_Game*game_ctr]); + } else { + player[i-1] = ""; + } + data_found = true; + } + } + if(!data_found) { + cout << "Missing some seats!" << endl; + sqlite3_close(mySqliteLogDb); + return 1; + } + } + + // read all hand id + sql = "SELECT HandID FROM Hand WHERE GameID="; + sql+= boost::lexical_cast(gameID); + if(sqlite3_get_table(mySqliteLogDb,sql.data(),&result_Hand_ID,&nRow_Hand_ID,&nCol_Hand,&errmsg) != SQLITE_OK) { + cout << "Error in statement: " << sql.data() << "[" << errmsg << "]." << endl; + sqlite3_close(mySqliteLogDb); + return 1; + } + + // run through all hands + for(hand_ctr=1; hand_ctr<=nRow_Hand_ID-1; hand_ctr++) { + + // log game and hand id + log_string += "Game: "; + log_string += boost::lexical_cast(gameID); + log_string += " | Hand: "; + log_string += boost::lexical_cast(result_Hand_ID[hand_ctr]); + + switch(modus) { + case 1: + log_string = "

" + log_string; + log_string += "
"; + break; + case 2: + log_string += "\n"; + break; + case 3: + log_string = "----------- " + log_string; + log_string += " -----------
"; + break; + default: + ; + } + + // read current hand + sql = "SELECT * FROM Hand WHERE GameID="; + sql+= boost::lexical_cast(gameID); + sql+= " AND HandID="; + sql+= boost::lexical_cast(result_Hand_ID[hand_ctr]); + if(sqlite3_get_table(mySqliteLogDb,sql.data(),&result_Hand,&nRow_Hand,&nCol_Hand,&errmsg) != SQLITE_OK) { + cout << "Error in statement: " << sql.data() << "[" << errmsg << "]." << endl; + sqlite3_close(mySqliteLogDb); + return 1; + } + + + // log blind level + log_string += "BLIND LEVEL: $"; + + // read small blind amount + data_found = false; + for(i=0; i(result_Hand[i]) == "Sb_Amount") { + log_string += boost::lexical_cast(result_Hand[i+nCol_Hand]); + data_found = true; + } + } + if(!data_found) { + cout << "Missing small blind information!" << endl; + sqlite3_close(mySqliteLogDb); + return 1; + } + + log_string += " / $"; + + // read big blind amount + data_found = false; + for(i=0; i(result_Hand[i]) == "Bb_Amount") { + log_string += boost::lexical_cast(result_Hand[i+nCol_Hand]); + data_found = true; + } + } + if(!data_found) { + cout << "Missing big blind information!" << endl; + sqlite3_close(mySqliteLogDb); + return 1; + } + + switch(modus) { + case 1: + log_string += "
"; + break; + case 2: + log_string += "\n"; + break; + case 3: + log_string += "
"; + break; + default: + ; + } + + // read seat cash + for(i=1; i<=MAX_NUMBER_OF_PLAYERS; i++) { + + data_found = false; + for(j=0; j(i); + cmpString+= "_Cash"; + if(boost::lexical_cast(result_Hand[j]) == cmpString) { // seat found + if(result_Hand[j+nCol_Hand]) { // player has cash > 0 + log_string += "Seat "; + log_string += boost::lexical_cast(i); + log_string += ": "; + if(modus == 1 || modus == 3) { + log_string += ""; + } + log_string += player[i-1]; + if(modus == 1 || modus == 3) { + log_string += ""; + } + log_string += "($"; + log_string += boost::lexical_cast(result_Hand[j+nCol_Hand]); + log_string += ")"; + switch(modus) { + case 1: + log_string += "
"; + break; + case 2: + log_string += "\n"; + break; + case 3: + log_string += "
"; + break; + default: + ; + } + } + data_found = true; + } + } + if(!data_found) { + cout << "Missing seat information in game " << gameID << " and hand " << result_Hand_ID[hand_ctr] << "!" << endl; + sqlite3_close(mySqliteLogDb); + return 1; + } + } + + if(neu) { + + if(modus == 1) log_string += "
"; + + // read dealer and blinds + sql = "SELECT Player,Action,Amount FROM Action WHERE GameID="; + sql += boost::lexical_cast(gameID); + sql += " AND HandID="; + sql += boost::lexical_cast(result_Hand_ID[hand_ctr]); + sql += " AND BeRo=0"; + + if(sqlite3_get_table(mySqliteLogDb,sql.data(),&result_Action,&nRow_Action,&nCol_Action,&errmsg) != SQLITE_OK) { + cout << "Error in statement: " << sql.data() << "[" << errmsg << "]." << endl; + sqlite3_close(mySqliteLogDb); + return 1; + } + if(nRow_Action<1) { + cout << "Missing information about dealer and blinds in game " << gameID << " hand " << result_Hand_ID[hand_ctr] << "!" << endl; + sqlite3_close(mySqliteLogDb); + return 1; + } + // log dealer and blind setting + for(i=1; i<=nRow_Action; i++) { + log_string += player[boost::lexical_cast(result_Action[3*i])-1]; + log_string += " "; + log_string += boost::lexical_cast(result_Action[3*i+1]); + if(result_Action[3*i+2]) { + // with amount + log_string += " $"; + log_string += boost::lexical_cast(result_Action[3*i+2]); + } + log_string += "."; + switch(modus) { + case 1: + log_string += "
"; + break; + case 2: + log_string += "\n"; + break; + case 3: + ; + break; + default: + ; + } + } + + sqlite3_free_table(result_Action); + + } else { + + log_string += "BLINDS: "; + + // read small blind + sql = "SELECT Player,Amount FROM Action WHERE GameID="; + sql += boost::lexical_cast(gameID); + sql += " AND HandID="; + sql += boost::lexical_cast(result_Hand_ID[hand_ctr]); + sql += " AND BeRo=0 AND Action='posts small blind'"; + + if(sqlite3_get_table(mySqliteLogDb,sql.data(),&result_Action,&nRow_Action,&nCol_Action,&errmsg) != SQLITE_OK) { + cout << "Error in statement: " << sql.data() << "[" << errmsg << "]." << endl; + sqlite3_close(mySqliteLogDb); + return 1; + } + if(nRow_Action<1 || nRow_Action>1) { + cout << "Missing information about small blinds in game " << gameID << " hand " << result_Hand_ID[hand_ctr] << "!" << endl; + sqlite3_close(mySqliteLogDb); + return 1; + } + + // log small blind + log_string += player[boost::lexical_cast(result_Action[2])-1]; + log_string += " ($"; + log_string += boost::lexical_cast(result_Action[3]); + log_string += "), "; + + sqlite3_free_table(result_Action); + + // read big blind + sql = "SELECT Player,Amount FROM Action WHERE GameID="; + sql += boost::lexical_cast(gameID); + sql += " AND HandID="; + sql += boost::lexical_cast(result_Hand_ID[hand_ctr]); + sql += " AND BeRo=0 AND Action='posts big blind'"; + + if(sqlite3_get_table(mySqliteLogDb,sql.data(),&result_Action,&nRow_Action,&nCol_Action,&errmsg) != SQLITE_OK) { + cout << "Error in statement: " << sql.data() << "[" << errmsg << "]." << endl; + sqlite3_close(mySqliteLogDb); + return 1; + } + if(nRow_Action<1 || nRow_Action>1) { + cout << "Missing information about small blinds in game " << gameID << " hand " << result_Hand_ID[hand_ctr] << "!" << endl; + sqlite3_close(mySqliteLogDb); + return 1; + } + + // log big blind + log_string += player[boost::lexical_cast(result_Action[2])-1]; + log_string += " ($"; + log_string += boost::lexical_cast(result_Action[3]); + log_string += ")"; + + sqlite3_free_table(result_Action); + + // read dealer + sql = "SELECT Player,Amount FROM Action WHERE GameID="; + sql += boost::lexical_cast(gameID); + sql += " AND HandID="; + sql += boost::lexical_cast(result_Hand_ID[hand_ctr]); + sql += " AND BeRo=0 AND Action='starts as dealer'"; + + if(sqlite3_get_table(mySqliteLogDb,sql.data(),&result_Action,&nRow_Action,&nCol_Action,&errmsg) != SQLITE_OK) { + cout << "Error in statement: " << sql.data() << "[" << errmsg << "]." << endl; + sqlite3_close(mySqliteLogDb); + return 1; + } + if(nRow_Action>1) { + cout << "Implausible information about dealer in game " << gameID << " hand " << result_Hand_ID[hand_ctr] << "!" << endl; + sqlite3_close(mySqliteLogDb); + return 1; + } + + if(nRow_Action == 1) { + if(modus == 1 || modus == 3) log_string += "
"; + log_string += player[boost::lexical_cast(result_Action[2])-1]; + log_string += " starts as dealer."; + } + + sqlite3_free_table(result_Action); + + } + + writeLog(log_string,modus); + log_string = ""; + + for(round_ctr=GAME_STATE_PREFLOP; round_ctr<=GAME_STATE_POST_RIVER; round_ctr++) { + + // write round name and board cards + if(round_ctr<=GAME_STATE_RIVER) { + switch(round_ctr) { + case GAME_STATE_PREFLOP: + log_string += "PREFLOP"; + break; + case GAME_STATE_FLOP: + log_string += "FLOP"; + break; + case GAME_STATE_TURN: + log_string += "TURN"; + break; + case GAME_STATE_RIVER: + log_string += "RIVER"; + break; + default: + ; + } + switch(modus) { + case 1: + log_string = "
" + log_string + ""; + break; + case 3: + log_string = "" + log_string + ""; + break; + default: + ; + } + log_string += " [board cards "; + for(i=1; i<=round_ctr+2; i++) { + data_found = false; + for(j=0; j(result_Hand[j]) == "BoardCard_"+boost::lexical_cast(i)) { + if(result_Hand[j+nCol_Hand]) { + if(modus == 1 || modus == 3) log_string += ""; + string_tmp = convertCardIntToString(boost::lexical_cast(result_Hand[j+nCol_Hand])); + if(string_tmp == "") { + cout << "Implausible board card in game " << gameID << " hand " << result_Hand_ID[hand_ctr] << "!" << endl; + sqlite3_close(mySqliteLogDb); + return 1; + } + log_string += boost::lexical_cast(string_tmp.at(0)); + if(modus==1 || modus == 3) log_string += ""; + log_string += boost::lexical_cast(string_tmp.at(1)); + if(round_ctr+2-i > 0) log_string += ","; + + data_found = true; + } + } + } + } + log_string += "]"; + if(modus == 1 || modus == 3) log_string += "
"; + } + + // read round action + sql = "SELECT Player,Action,Amount FROM Action WHERE GameID="; + sql += boost::lexical_cast(gameID); + sql += " AND HandID="; + sql += boost::lexical_cast(result_Hand_ID[hand_ctr]); + sql += " AND BeRo="; + sql += boost::lexical_cast(round_ctr); + sql += " AND Action<>'starts as dealer' AND Action<>'posts big blind' AND Action<>'posts small blind'"; + + if(sqlite3_get_table(mySqliteLogDb,sql.data(),&result_Action,&nRow_Action,&nCol_Action,&errmsg) != SQLITE_OK) { + cout << "Error in statement: " << sql.data() << "[" << errmsg << "]." << endl; + sqlite3_close(mySqliteLogDb); + return 1; + } + + for(action_ctr=1; action_ctr<=nRow_Action; action_ctr++) { + log_string += player[boost::lexical_cast(result_Action[3*action_ctr])-1]; + log_string += " "; + log_string += boost::lexical_cast(result_Action[3*action_ctr+1]); + if(result_Action[3*action_ctr+2]) { + // with amount + log_string += " $"; + log_string += boost::lexical_cast(result_Action[3*action_ctr+2]); + } + + // show + if(boost::lexical_cast(result_Action[3*action_ctr+1]) == "shows") { + // log cards + log_string += " ["; + if(modus == 1 || modus == 3) log_string += ""; + + // find hole card 1 + data_found = false; + for(i=0; i(result_Action[3*action_ctr]); + cmpString += "_Card_1"; + if(boost::lexical_cast(result_Hand[i]) == cmpString) { + string_tmp = convertCardIntToString(boost::lexical_cast(result_Hand[i+nCol_Hand])); + if(string_tmp == "") { + cout << "Hole card information implausible in game " << gameID << " hand " << result_Hand_ID[hand_ctr] << "!" << endl; + sqlite3_close(mySqliteLogDb); + return 1; + } + log_string += boost::lexical_cast(string_tmp.at(0)); + if(modus == 1 || modus == 3) log_string += ""; + log_string += boost::lexical_cast(string_tmp.at(1)); + if(modus == 1 || modus == 3) log_string += ","; + data_found = true; + } + } + if(!data_found) { + cout << "Missing hole card information in game " << gameID << " hand " << result_Hand_ID[hand_ctr] << "!" << endl; + sqlite3_close(mySqliteLogDb); + return 1; + } + + // find hole card 2 + data_found = false; + for(i=0; i(result_Action[3*action_ctr]); + cmpString += "_Card_2"; + if(boost::lexical_cast(result_Hand[i]) == cmpString) { + string_tmp = convertCardIntToString(boost::lexical_cast(result_Hand[i+nCol_Hand])); + if(string_tmp == "") { + cout << "Hole card information implausible in game " << gameID << " hand " << result_Hand_ID[hand_ctr] << "!" << endl; + sqlite3_close(mySqliteLogDb); + return 1; + } + log_string += boost::lexical_cast(string_tmp.at(0)); + if(modus == 1 || modus == 3) log_string += ""; + log_string += boost::lexical_cast(string_tmp.at(1)); + log_string += "]"; + data_found = true; + } + } + if(!data_found) { + cout << "Missing hole card information in game " << gameID << " hand " << result_Hand_ID[hand_ctr] << "!" << endl; + sqlite3_close(mySqliteLogDb); + return 1; + } + + } + + log_string += "."; + if(action_ctrtext(0), + QString::fromUtf8(myConfig->readConfigString("LogDir").c_str())+"/"+selectedItem->text(0), tr("PokerTH HTML log (*.html)")); if(!fileName.isEmpty()) { - myGuiLog->exportLogPdbToHtml(fileName); + myGuiLog->exportLogPdbToHtml(selectedItem->data(0, Qt::UserRole).toString(),fileName); } } } @@ -1330,11 +1330,11 @@ void settingsDialogImpl::exportLogToTxt() if(selectedItem) { QString fileName = QFileDialog::getSaveFileName(this, tr("Export PokerTH log file to plain text"), - QDir::homePath()+"/"+selectedItem->text(0), + QString::fromUtf8(myConfig->readConfigString("LogDir").c_str())+"/"+selectedItem->text(0), tr("PokerTH plain text log (*.txt)")); if(!fileName.isEmpty()) { - myGuiLog->exportLogPdbToTxt(fileName); + myGuiLog->exportLogPdbToTxt(selectedItem->data(0, Qt::UserRole).toString(),fileName); } } }