diff -r 9bb6abdb5675 -r 01111960a48d QTfrontend/ui/page/pagevideos.cpp --- a/QTfrontend/ui/page/pagevideos.cpp Thu Jul 26 21:56:47 2012 +0400 +++ b/QTfrontend/ui/page/pagevideos.cpp Thu Jul 26 21:58:25 2012 +0400 @@ -39,6 +39,9 @@ #include #include #include +#include +#include +#include #include "hwconsts.h" #include "pagevideos.h" @@ -47,8 +50,9 @@ #include "gameuiconfig.h" #include "recorder.h" #include "ask_quit.h" +#include "upload_video.h" -const QSize ThumbnailSize(350, 350*3/5); +static const QSize ThumbnailSize(350, 350*3/5); // columns in table with list of video files enum VideosColumns @@ -70,7 +74,9 @@ QString name; QString desc; // description + QString uploadReply; HWRecorder * pRecorder; // non NULL if file is being encoded + QNetworkReply * pUploading; // non NULL if file is being uploaded bool seen; // used when updating directory float lastSizeUpdate; float progress; @@ -87,6 +93,7 @@ { this->name = name; pRecorder = NULL; + pUploading = NULL; lastSizeUpdate = 0; progress = 0; } @@ -217,6 +224,7 @@ filesTable->setColumnCount(vcNumColumns); filesTable->setHorizontalHeaderLabels(columns); filesTable->setSelectionBehavior(QAbstractItemView::SelectRows); + filesTable->setSelectionMode(QAbstractItemView::SingleSelection); filesTable->setEditTriggers(QAbstractItemView::SelectedClicked); filesTable->verticalHeader()->hide(); filesTable->setMinimumWidth(400); @@ -272,6 +280,9 @@ btnDelete = new QPushButton(QPushButton::tr("Delete"), pDescGroup); btnDelete->setEnabled(false); pBottomDescLayout->addWidget(btnDelete); + btnToYouTube = new QPushButton(QPushButton::tr("Upload to YouTube"), pDescGroup); + btnToYouTube->setEnabled(false); + pBottomDescLayout->addWidget(btnToYouTube); pDescLayout->addStretch(1); pDescLayout->addLayout(pTopDescLayout, 0); @@ -300,14 +311,16 @@ connect(filesTable, SIGNAL(currentCellChanged(int,int,int,int)), this, SLOT(currentCellChanged(int,int,int,int))); connect(btnPlay, SIGNAL(clicked()), this, SLOT(playSelectedFile())); connect(btnDelete, SIGNAL(clicked()), this, SLOT(deleteSelectedFiles())); + connect(btnToYouTube, SIGNAL(clicked()), this, SLOT(uploadToYouTube())); connect(btnOpenDir, SIGNAL(clicked()), this, SLOT(openVideosDirectory())); } PageVideos::PageVideos(QWidget* parent) : AbstractPage(parent), - config(0) + config(0), netManager(0) { nameChangedFromCode = false; numRecorders = 0; + numUploads = 0; initPage(); } @@ -521,6 +534,14 @@ numRecorders++; } +void PageVideos::setProgress(int row, VideoItem* item, float value) +{ + 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::updateProgress(float value) { HWRecorder * pRecorder = (HWRecorder*)sender(); @@ -534,11 +555,7 @@ item->lastSizeUpdate = value; } - // update progress bar - QProgressBar * progressBar = (QProgressBar*)filesTable->cellWidget(row, vcProgress); - progressBar->setValue(value*10000); - progressBar->setFormat(QString("%1%").arg(value*100, 0, 'f', 2)); - item->progress = value; + setProgress(row, item, value); } void PageVideos::encodingFinished(bool success) @@ -674,11 +691,13 @@ clearThumbnail(); btnPlay->setEnabled(false); btnDelete->setEnabled(false); + btnToYouTube->setEnabled(false); return; } btnPlay->setEnabled(item->ready()); btnDelete->setEnabled(true); + btnToYouTube->setEnabled(item->ready()); QString desc = item->name + "\n\n"; QString thumbName = ""; @@ -701,6 +720,8 @@ desc.remove(prefixBegin, prefixEnd + 7 - prefixBegin); thumbName = prefix; } + + desc += item->uploadReply; } else desc += tr("(in progress...)"); @@ -823,12 +844,12 @@ bool PageVideos::tryQuit(HWForm * form) { bool quit = true; - if (numRecorders != 0) + if (numRecorders != 0 || numUploads != 0) { // ask user what to do - abort or wait HWAskQuitDialog * askd = new HWAskQuitDialog(this, form); + askd->deleteLater(); quit = askd->exec(); - delete askd; } if (quit) clearTemp(); @@ -836,6 +857,10 @@ } // returns multi-line string with list of videos in progress +/* it will look like this: +foo.avi (15.21% - encoding) +bar.avi (18.21% - uploading) +*/ QString PageVideos::getVideosInProgress() { QString list = ""; @@ -843,11 +868,17 @@ for (int i = 0; i < count; i++) { VideoItem * item = nameItem(i); + QString process; + if (!item->ready()) + process = tr("encoding"); + else if (item->pUploading) + process = tr("uploading"); + else + continue; 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"; + list += item->name + " (" + QString::number(progress, 'f', 2) + "% - " + process + ")\n"; } return list; } @@ -880,3 +911,87 @@ addRecorder(pRecorder); } } + +void PageVideos::uploadProgress(qint64 bytesSent, qint64 bytesTotal) +{ + QNetworkReply* reply = (QNetworkReply*)sender(); + + VideoItem * item = NULL; + int row; + int count = filesTable->rowCount(); + // find corresponding item (maybe there is a better wat to implement this?) + for (int i = 0; i < count; i++) + { + item = nameItem(i); + if (item->pUploading == reply) + { + row = i; + break; + } + } + Q_ASSERT(item); + + setProgress(row, item, bytesSent*1.0/bytesTotal); +} + +void PageVideos::uploadFinished() +{ + QNetworkReply* reply = (QNetworkReply*)sender(); + + VideoItem * item = NULL; + int row; + int count = filesTable->rowCount(); + for (int i = 0; i < count; i++) + { + item = nameItem(i); + if (item->pUploading == reply) + { + row = i; + break; + } + } + Q_ASSERT(item); + + item->pUploading = NULL; + QByteArray answer = reply->readAll(); + item->uploadReply = QString::fromUtf8(answer.data()); + // QMessageBox::information(this,"",item->uploadReply,0); + filesTable->setCellWidget(row, vcProgress, NULL); // remove progress bar + numUploads--; +} + +void PageVideos::uploadToYouTube() +{ + int row = filesTable->currentRow(); + VideoItem * item = nameItem(row); + + if (!netManager) + netManager = new QNetworkAccessManager(this); + + HWUploadVideoDialog* dlg = new HWUploadVideoDialog(this, item->name, netManager); + dlg->deleteLater(); + if (!dlg->exec()) + return; + + QNetworkRequest request(QUrl(dlg->location)); + request.setRawHeader("Content-Type", "application/octet-stream"); + + QFile * file = new QFile(item->path(), this); + if (!file->open(QIODevice::ReadOnly)) + return; + + // add progress bar + QProgressBar * progressBar = new QProgressBar(filesTable); + progressBar->setMinimum(0); + progressBar->setMaximum(10000); + progressBar->setValue(0); + // make it different from encoding progress-bar + progressBar->setStyleSheet("* {color: #00ccff; selection-background-color: #00ccff;}" ); + filesTable->setCellWidget(row, vcProgress, progressBar); + + QNetworkReply* reply = netManager->put(request, file); + item->pUploading = reply; + connect(reply, SIGNAL(uploadProgress(qint64, qint64)), this, SLOT(uploadProgress(qint64, qint64))); + connect(reply, SIGNAL(finished()), this, SLOT(uploadFinished())); + numUploads++; +}