# HG changeset patch # User Stepan777 # Date 1341587744 -14400 # Node ID 0e55228e130397ab93dd4d75516f496f13dbf466 # Parent 1dbf3f4340e09580ee12c5ac506dfbf93cc84e66 When there are videos that are being encoded and user tries to quit display dialog with warning. diff -r 1dbf3f4340e0 -r 0e55228e1303 QTfrontend/hwform.cpp --- a/QTfrontend/hwform.cpp Fri Jul 06 13:22:33 2012 +0400 +++ b/QTfrontend/hwform.cpp Fri Jul 06 19:15:44 2012 +0400 @@ -520,6 +520,11 @@ GoToPage(ID_PAGE_SCHEME); } +void HWForm::GoToVideos() +{ + GoToPage(ID_PAGE_VIDEOS); +} + void HWForm::OnPageShown(quint8 id, quint8 lastid) { #ifdef USE_XFIRE @@ -717,6 +722,8 @@ int curid = ui.Pages->currentIndex(); if (curid == ID_PAGE_MAIN) { + if (!ui.pageVideos->tryQuit(this)) + return; stopAnim = true; exit(); } diff -r 1dbf3f4340e0 -r 0e55228e1303 QTfrontend/hwform.h --- a/QTfrontend/hwform.h Fri Jul 06 13:22:33 2012 +0400 +++ b/QTfrontend/hwform.h Fri Jul 06 19:15:44 2012 +0400 @@ -67,6 +67,7 @@ void exit(); void setButtonDescription(QString desc); void backDescription(); + void GoToVideos(); private slots: void GoToSaves(); diff -r 1dbf3f4340e0 -r 0e55228e1303 QTfrontend/ui/dialog/ask_quit.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QTfrontend/ui/dialog/ask_quit.cpp Fri Jul 06 19:15:44 2012 +0400 @@ -0,0 +1,79 @@ +/* + * Hedgewars, a free turn based strategy game + * Copyright (c) 2004-2012 Andrey Korotaev + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include +#include +#include +#include +#include + +#include "hwform.h" +#include "ask_quit.h" +#include "pagevideos.h" + +HWAskQuitDialog::HWAskQuitDialog(QWidget* parent, HWForm * form) : QDialog(parent) +{ + this->form = form; + + setWindowTitle(tr("Do yot really want to quit?")); + + QVBoxLayout * layout = new QVBoxLayout(this); + + QLabel * lbLabel = new QLabel(this); + lbLabel->setText(QLabel::tr("There are videos that are currently being encoded.\n" + "Exiting now will abort them.\n" + "Do yot really want to quit?")); + layout->addWidget(lbLabel); + + lbList = new QLabel(this); + layout->addWidget(lbList); + updateList(); + + QDialogButtonBox* dbbButtons = new QDialogButtonBox(this); + QPushButton * pbYes = dbbButtons->addButton(QDialogButtonBox::Yes); + QPushButton * pbNo = dbbButtons->addButton(QDialogButtonBox::No); + QPushButton * pbMore = dbbButtons->addButton(QPushButton::tr("More info"), QDialogButtonBox::HelpRole); + layout->addWidget(dbbButtons); + + connect(pbYes, SIGNAL(clicked()), this, SLOT(accept())); + connect(pbNo, SIGNAL(clicked()), this, SLOT(reject())); + connect(pbMore, SIGNAL(clicked()), this, SLOT(goToPageVideos())); + + // update list periodically + QTimer * timer = new QTimer(this); + connect(timer, SIGNAL(timeout()), this, SLOT(updateList())); + timer->start(200); +} + +void HWAskQuitDialog::goToPageVideos() +{ + reject(); + form->GoToVideos(); +} + +void HWAskQuitDialog::updateList() +{ + QString text = form->ui.pageVideos->getVideosInProgress(); + if (text.isEmpty()) + { + // automatically exit when everything is finished + accept(); + return; + } + lbList->setText(text); +} diff -r 1dbf3f4340e0 -r 0e55228e1303 QTfrontend/ui/dialog/ask_quit.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QTfrontend/ui/dialog/ask_quit.h Fri Jul 06 19:15:44 2012 +0400 @@ -0,0 +1,45 @@ +/* + * Hedgewars, a free turn based strategy game + * Copyright (c) 2004-2012 Andrey Korotaev + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#ifndef ASK_QUIT_H +#define ASK_QUIT_H + +#include + +class QLabel; +class HWForm; +class PageVideos; + +class HWAskQuitDialog : public QDialog +{ + Q_OBJECT + + public: + HWAskQuitDialog(QWidget* parent, HWForm *form); + + private slots: + void goToPageVideos(); + void updateList(); + + private: + HWForm * form; + QLabel * lbList; +}; + + +#endif // INPUT_PASSWORD_H diff -r 1dbf3f4340e0 -r 0e55228e1303 QTfrontend/ui/page/pagevideos.cpp --- a/QTfrontend/ui/page/pagevideos.cpp Fri Jul 06 13:22:33 2012 +0400 +++ b/QTfrontend/ui/page/pagevideos.cpp Fri Jul 06 19:15:44 2012 +0400 @@ -44,6 +44,7 @@ #include "libav_iteraction.h" #include "gameuiconfig.h" #include "recorder.h" +#include "ask_quit.h" const int ThumbnailSize = 400; @@ -70,6 +71,7 @@ HWRecorder * pRecorder; // non NULL if file is being encoded bool seen; // used when updating directory float lastSizeUpdate; + float progress; bool ready() { return !pRecorder; } @@ -84,6 +86,7 @@ this->name = name; pRecorder = NULL; lastSizeUpdate = 0; + progress = 0; } VideoItem::~VideoItem() @@ -300,6 +303,7 @@ config(0) { nameChangedFromCode = false; + numRecorders = 0; initPage(); } @@ -496,6 +500,8 @@ connect(pRecorder, SIGNAL(onProgress(float)), this, SLOT(updateProgress(float))); connect(pRecorder, SIGNAL(encodingFinished(bool)), this, SLOT(encodingFinished(bool))); filesTable->setCellWidget(row, vcProgress, progressBar); + + numRecorders++; } void PageVideos::updateProgress(float value) @@ -515,10 +521,13 @@ QProgressBar * progressBar = (QProgressBar*)filesTable->cellWidget(row, vcProgress); progressBar->setValue(value*10000); progressBar->setFormat(QString("%1%").arg(value*100, 0, 'f', 2)); + item->progress = value; } void PageVideos::encodingFinished(bool success) { + numRecorders--; + HWRecorder * pRecorder = (HWRecorder*)sender(); VideoItem * item = (VideoItem*)pRecorder->item; int row = filesTable->row(item); @@ -583,6 +592,7 @@ setName(item, oldName); } } + updateDescription(); } void PageVideos::setName(VideoItem * item, const QString & newName) @@ -616,8 +626,6 @@ item->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable); filesTable->setItem(row, vcProgress, item); - // filesTable->horizontalHeader()->resizeSections(QHeaderView::ResizeToContents); - return row; } @@ -763,3 +771,32 @@ { QDesktopServices::openUrl(QUrl("file:///"+cfgdir->absolutePath() + "/Videos")); } + +bool PageVideos::tryQuit(HWForm * form) +{ + if (numRecorders == 0) + return true; + + // ask user what to do - abort or wait + HWAskQuitDialog * askd = new HWAskQuitDialog(this, form); + bool answer = askd->exec(); + delete askd; + return answer; +} + +// returns multi-line string with list of videos in progress +QString PageVideos::getVideosInProgress() +{ + QString list = ""; + int count = filesTable->rowCount(); + for (int i = 0; i < count; i++) + { + VideoItem * item = nameItem(i); + float progress = 100*item->progress; + if (progress > 99.99) + progress = 99.99; // displaying 100% may be confusing + if (!item->ready()) + list += item->name + " (" + QString::number(progress, 'f', 2) + "%)\n"; + } + return list; +} diff -r 1dbf3f4340e0 -r 0e55228e1303 QTfrontend/ui/page/pagevideos.h --- a/QTfrontend/ui/page/pagevideos.h Fri Jul 06 13:22:33 2012 +0400 +++ b/QTfrontend/ui/page/pagevideos.h Fri Jul 06 19:15:44 2012 +0400 @@ -26,6 +26,7 @@ class GameUIConfig; class HWRecorder; class VideoItem; +class HWForm; class PageVideos : public AbstractPage { @@ -54,6 +55,8 @@ void setDefaultCodecs(); bool tryCodecs(const QString & format, const QString & vcodec, const QString & acodec); void addRecorder(HWRecorder* pRecorder); + bool tryQuit(HWForm *form); + QString getVideosInProgress(); // get multi-line string with list of videos in progress private: // virtuals from AbstractPage @@ -91,6 +94,8 @@ // (in signal cellChanged) bool nameChangedFromCode; + int numRecorders; + private slots: void changeAVFormat(int index); void changeUseGameRes(int state); diff -r 1dbf3f4340e0 -r 0e55228e1303 QTfrontend/util/libav_iteraction.cpp --- a/QTfrontend/util/libav_iteraction.cpp Fri Jul 06 13:22:33 2012 +0400 +++ b/QTfrontend/util/libav_iteraction.cpp Fri Jul 06 19:15:44 2012 +0400 @@ -170,7 +170,7 @@ codec.isRecomended = true; // FIXME: remove next line - codec.longName += QString(" (%1)").arg(codec.shortName); + // codec.longName += QString(" (%1)").arg(codec.shortName); } // get list of all formats @@ -204,7 +204,7 @@ format.longName = QString("%1 (*.%2)").arg(pFormat->long_name).arg(ext); // FIXME: remove next line - format.longName += QString(" (%1)").arg(format.shortName); + // format.longName += QString(" (%1)").arg(format.shortName); format.isRecomended = strcmp(pFormat->name, "mp4") == 0 || strcmp(pFormat->name, "avi") == 0; diff -r 1dbf3f4340e0 -r 0e55228e1303 project_files/hedgewars.pro --- a/project_files/hedgewars.pro Fri Jul 06 13:22:33 2012 +0400 +++ b/project_files/hedgewars.pro Fri Jul 06 19:15:44 2012 +0400 @@ -107,7 +107,8 @@ ../QTfrontend/model/GameStyleModel.h \ ../QTfrontend/util/libav_iteraction.h \ ../QTfrontend/ui/page/pagevideos.h \ - ../QTfrontend/net/recorder.h + ../QTfrontend/net/recorder.h \ + ../QTfrontend/ui/dialog/ask_quit.h SOURCES += ../QTfrontend/model/ammoSchemeModel.cpp \ ../QTfrontend/model/MapModel.cpp \ @@ -192,7 +193,8 @@ ../QTfrontend/model/GameStyleModel.cpp \ ../QTfrontend/util/libav_iteraction.cpp \ ../QTfrontend/ui/page/pagevideos.cpp \ - ../QTfrontend/net/recorder.cpp + ../QTfrontend/net/recorder.cpp \ + ../QTfrontend/ui/dialog/ask_quit.cpp win32 { SOURCES += ../QTfrontend/xfire.cpp