From 92746e585ae2d55b57ac8ebf4feb185cd075bf8d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Dutkiewicz?= Date: Tue, 20 Dec 2011 13:56:37 +0100 Subject: [PATCH 01/20] Initial port to QGraphicsView --- SubtitlesEditor.cpp | 358 +++++++++++++++++++------------- SubtitlesEditor.h | 9 +- SubtitlesEditor.ui | 493 ++++++++++++++------------------------------ 3 files changed, 380 insertions(+), 480 deletions(-) diff --git a/SubtitlesEditor.cpp b/SubtitlesEditor.cpp index 9f826dd..73f0e6f 100644 --- a/SubtitlesEditor.cpp +++ b/SubtitlesEditor.cpp @@ -27,11 +27,16 @@ #include #include #include +#include #include +#include MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), m_ui(new Ui::MainWindow), + m_videoWidget(new QGraphicsProxyWidget()), + m_subtitlesTopWidget(new QGraphicsTextItem(m_videoWidget)), + m_subtitlesBottomWidget(new QGraphicsTextItem(m_videoWidget)), m_currentSubtitle(0), m_currentTrack(0) { @@ -40,15 +45,42 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), m_ui->setupUi(this); + Phonon::VideoWidget *videoWidget = new Phonon::VideoWidget(); Phonon::AudioOutput *audioOutput = new Phonon::AudioOutput(this); audioOutput->setVolume(QSettings().value("volume", 0.8).toReal()); m_mediaObject = new Phonon::MediaObject(this); m_mediaObject->setTickInterval(100); - Phonon::createPath(m_mediaObject, m_ui->videoWidget); + Phonon::createPath(m_mediaObject, videoWidget); Phonon::createPath(m_mediaObject, audioOutput); + m_videoWidget->setWidget(videoWidget); + m_videoWidget->resize(300, 300); + + m_subtitlesTopWidget->setDefaultTextColor(QColor(Qt::white)); + m_subtitlesBottomWidget->setDefaultTextColor(QColor(Qt::white)); + + QGraphicsDropShadowEffect *topShadowEffect = new QGraphicsDropShadowEffect(m_subtitlesTopWidget); + topShadowEffect->setOffset(0, 0); + topShadowEffect->setBlurRadius(3); + topShadowEffect->setColor(QColor(Qt::black)); + + m_subtitlesTopWidget->setGraphicsEffect(topShadowEffect); + + QGraphicsDropShadowEffect *bottomShadowEffect = new QGraphicsDropShadowEffect(m_subtitlesBottomWidget); + bottomShadowEffect->setOffset(0, 0); + bottomShadowEffect->setBlurRadius(3); + bottomShadowEffect->setColor(QColor(Qt::black)); + + m_subtitlesBottomWidget->setGraphicsEffect(bottomShadowEffect); + + m_ui->graphicsView->setScene(new QGraphicsScene(this)); + m_ui->graphicsView->scene()->addItem(m_videoWidget); + m_ui->graphicsView->scene()->addItem(m_subtitlesTopWidget); + m_ui->graphicsView->scene()->addItem(m_subtitlesBottomWidget); + m_ui->graphicsView->installEventFilter(this); + m_ui->actionPlayPause->setIcon(QIcon::fromTheme("media-playback-start", style()->standardIcon(QStyle::SP_MediaPlay))); m_ui->actionPlayPause->setShortcut(tr("Space")); m_ui->actionPlayPause->setDisabled(true); @@ -87,6 +119,8 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), setWindowTitle(tr("%1 - Unnamed").arg("Subtitles Editor")); + updateVideo(); + connect(m_ui->actionOpen, SIGNAL(triggered()), this, SLOT(actionOpen())); connect(m_ui->actionSave, SIGNAL(triggered()), this, SLOT(actionSave())); connect(m_ui->actionSaveAs, SIGNAL(triggered()), this, SLOT(actionSaveAs())); @@ -136,148 +170,6 @@ void MainWindow::closeEvent(QCloseEvent *event) event->accept(); } -QString MainWindow::timeToString(qint64 time) -{ - QString string; - int fractions = (time / 100); - int seconds = (fractions / 10); - int minutes = (seconds / 60); - - if (minutes < 10) - { - string.append('0'); - } - - string.append(QString::number(minutes)); - string.append(':'); - - seconds = (seconds - (minutes * 60)); - - if (seconds < 10) - { - string.append('0'); - } - - string.append(QString::number(seconds)); - string.append('.'); - - fractions = (fractions - (seconds * 10) - (minutes * 600)); - - string.append(QString::number(fractions)); - - return string; -} - -QList MainWindow::readSubtitles(const QString &fileName) -{ - QFile file(fileName); - QList subtitles; - - if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) - { - QMessageBox::warning(this, tr("Error"), tr("Can not read subtitle file:\n%1").arg(fileName)); - - return subtitles; - } - - QTextStream textStream(&file); - - while (!textStream.atEnd()) - { - QString line = textStream.readLine().trimmed(); - - if (line.isEmpty() || line.startsWith("//")) - { - continue; - } - - QRegExp expression("(\\d+)\\s+(\\d+)\\s+([\\d\\.]+)\\s+([\\d\\.]+)\\s+_?\\(?\"(.+)\"\\)?"); - - if (expression.exactMatch(line)) - { - QStringList capturedTexts = expression.capturedTexts(); - Subtitle subtitle; - - subtitle.text = capturedTexts.at(5); - subtitle.beginTime = capturedTexts.at(3).toDouble(); - subtitle.endTime = capturedTexts.at(4).toDouble(); - subtitle.positionX = capturedTexts.at(1).toInt(); - subtitle.positionY = capturedTexts.at(2).toInt(); - - subtitles.append(subtitle); - } - } - - file.close(); - - QString title = QFileInfo(fileName).fileName(); - title = title.left(title.indexOf('.')); - - setWindowTitle(tr("%1 - %2").arg("Subtitles Editor").arg(title)); - - m_fileNameLabel->setText(title); - - - return subtitles; -} - -double MainWindow::timeToSeconds(QTime time) -{ - double seconds = (time.minute() * 60); - seconds += time.second(); - seconds += (time.msec() / 1000); - - return seconds; -} - -bool MainWindow::saveSubtitles(QString fileName) -{ - for (int i = 0; i < 2; ++i) - { - if (m_subtitles[i].isEmpty()) - { - continue; - } - - if (i > 0) - { - fileName = fileName.left(fileName.length() - 3) + "txa"; - } - - QFile file(fileName); - - if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) - { - QMessageBox::warning(this, tr("Error"), tr("Can not save subtitle file:\n%1").arg(fileName)); - - return false; - } - - QTextStream textStream(&file); - - for (int j = 0; j < m_subtitles[i].count(); ++j) - { - textStream << QString("%1\t%2\t\t%3\t%4\t_(\"%5\")\n").arg(m_subtitles[i][j].positionX).arg(m_subtitles[i][j].positionY).arg(m_subtitles[i][j].beginTime).arg(m_subtitles[i][j].endTime).arg(m_subtitles[i][j].text); - - if ((j + 1) < m_subtitles[i].count() && m_subtitles[i][j].beginTime != m_subtitles[i][j + 1].beginTime) - { - textStream << "\n"; - } - } - - file.close(); - } - - QString title = QFileInfo(fileName).fileName(); - title = title.left(title.indexOf('.')); - - setWindowTitle(tr("%1 - %2").arg("Subtitles Editor").arg(title)); - - m_fileNameLabel->setText(title); - - return true; -} - void MainWindow::openMovie(const QString &fileName) { QString title = QFileInfo(fileName).fileName(); @@ -290,6 +182,9 @@ void MainWindow::openMovie(const QString &fileName) m_mediaObject->setCurrentSource(Phonon::MediaSource(fileName)); + m_videoWidget->widget()->show(); + m_videoWidget->widget()->update(); + m_ui->actionPlayPause->setEnabled(true); } @@ -419,6 +314,9 @@ void MainWindow::stateChanged(Phonon::State state) void MainWindow::finished() { m_mediaObject->stop(); + + m_videoWidget->widget()->show(); + m_videoWidget->widget()->update(); } void MainWindow::tick() @@ -438,6 +336,7 @@ void MainWindow::tick() m_currentSubtitle = i; } } + for (int i = 0; i < m_subtitles[1].count(); ++i) { if (m_subtitles[1].at(i).beginTime < currentTime && m_subtitles[1].at(i).endTime > currentTime) @@ -450,8 +349,11 @@ void MainWindow::tick() showSubtitle(); currentTopSubtitles = currentTopSubtitles.left(currentTopSubtitles.length() - 3); currentBottomSubtitles = currentBottomSubtitles.left(currentBottomSubtitles.length() - 3); - m_ui->bottomSubs->setText(currentBottomSubtitles); - m_ui->topSubs->setText(currentTopSubtitles); + + m_subtitlesTopWidget->setHtml(currentTopSubtitles.replace('|', "
")); + m_subtitlesBottomWidget->setHtml(currentBottomSubtitles.replace('|', "
")); + + updateVideo(); } void MainWindow::selectTrack(int track) @@ -590,6 +492,20 @@ void MainWindow::rescaleSubtitles() showSubtitle(); } +void MainWindow::updateVideo() +{ + m_videoWidget->resize(m_ui->graphicsView->size()); + + m_ui->graphicsView->centerOn(m_videoWidget); + m_ui->graphicsView->scene()->setSceneRect(m_ui->graphicsView->rect()); + + m_subtitlesTopWidget->setY(0); + m_subtitlesTopWidget->setTextWidth(m_ui->graphicsView->scene()->width()); + + m_subtitlesBottomWidget->setY(m_ui->graphicsView->scene()->height() - m_subtitlesBottomWidget->shape().controlPointRect().height()); + m_subtitlesBottomWidget->setTextWidth(m_ui->graphicsView->scene()->width()); +} + void MainWindow::playPause() { if (m_mediaObject->state() == Phonon::PlayingState) @@ -601,3 +517,155 @@ void MainWindow::playPause() m_mediaObject->play(); } } + +QString MainWindow::timeToString(qint64 time) +{ + QString string; + int fractions = (time / 100); + int seconds = (fractions / 10); + int minutes = (seconds / 60); + + if (minutes < 10) + { + string.append('0'); + } + + string.append(QString::number(minutes)); + string.append(':'); + + seconds = (seconds - (minutes * 60)); + + if (seconds < 10) + { + string.append('0'); + } + + string.append(QString::number(seconds)); + string.append('.'); + + fractions = (fractions - (seconds * 10) - (minutes * 600)); + + string.append(QString::number(fractions)); + + return string; +} + +QList MainWindow::readSubtitles(const QString &fileName) +{ + QFile file(fileName); + QList subtitles; + + if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) + { + QMessageBox::warning(this, tr("Error"), tr("Can not read subtitle file:\n%1").arg(fileName)); + + return subtitles; + } + + QTextStream textStream(&file); + + while (!textStream.atEnd()) + { + QString line = textStream.readLine().trimmed(); + + if (line.isEmpty() || line.startsWith("//")) + { + continue; + } + + QRegExp expression("(\\d+)\\s+(\\d+)\\s+([\\d\\.]+)\\s+([\\d\\.]+)\\s+_?\\(?\"(.+)\"\\)?"); + + if (expression.exactMatch(line)) + { + QStringList capturedTexts = expression.capturedTexts(); + Subtitle subtitle; + + subtitle.text = capturedTexts.at(5); + subtitle.beginTime = capturedTexts.at(3).toDouble(); + subtitle.endTime = capturedTexts.at(4).toDouble(); + subtitle.positionX = capturedTexts.at(1).toInt(); + subtitle.positionY = capturedTexts.at(2).toInt(); + + subtitles.append(subtitle); + } + } + + file.close(); + + QString title = QFileInfo(fileName).fileName(); + title = title.left(title.indexOf('.')); + + setWindowTitle(tr("%1 - %2").arg("Subtitles Editor").arg(title)); + + m_fileNameLabel->setText(title); + + + return subtitles; +} + +double MainWindow::timeToSeconds(QTime time) +{ + double seconds = (time.minute() * 60); + seconds += time.second(); + seconds += (time.msec() / 1000); + + return seconds; +} + +bool MainWindow::saveSubtitles(QString fileName) +{ + for (int i = 0; i < 2; ++i) + { + if (m_subtitles[i].isEmpty()) + { + continue; + } + + if (i > 0) + { + fileName = fileName.left(fileName.length() - 3) + "txa"; + } + + QFile file(fileName); + + if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) + { + QMessageBox::warning(this, tr("Error"), tr("Can not save subtitle file:\n%1").arg(fileName)); + + return false; + } + + QTextStream textStream(&file); + + for (int j = 0; j < m_subtitles[i].count(); ++j) + { + textStream << QString("%1\t%2\t\t%3\t%4\t_(\"%5\")\n").arg(m_subtitles[i][j].positionX).arg(m_subtitles[i][j].positionY).arg(m_subtitles[i][j].beginTime).arg(m_subtitles[i][j].endTime).arg(m_subtitles[i][j].text); + + if ((j + 1) < m_subtitles[i].count() && m_subtitles[i][j].beginTime != m_subtitles[i][j + 1].beginTime) + { + textStream << "\n"; + } + } + + file.close(); + } + + QString title = QFileInfo(fileName).fileName(); + title = title.left(title.indexOf('.')); + + setWindowTitle(tr("%1 - %2").arg("Subtitles Editor").arg(title)); + + m_fileNameLabel->setText(title); + + return true; +} + +bool MainWindow::eventFilter(QObject *object, QEvent *event) +{ + if (event->type() == QEvent::Resize) + { + updateVideo(); + } + + return QObject::eventFilter(object, event); +} diff --git a/SubtitlesEditor.h b/SubtitlesEditor.h index aab5e03..b6b3946 100644 --- a/SubtitlesEditor.h +++ b/SubtitlesEditor.h @@ -21,8 +21,10 @@ #ifndef SUBTITLESEDITOR_H #define SUBTITLESEDITOR_H -#include #include +#include +#include +#include #include @@ -66,6 +68,7 @@ public slots: void updateSubtitle(); void rescaleSubtitles(); void playPause(); + void updateVideo(); protected: void changeEvent(QEvent *event); @@ -74,10 +77,14 @@ public slots: QList readSubtitles(const QString &fileName); double timeToSeconds(QTime time); bool saveSubtitles(QString fileName); + bool eventFilter(QObject *object, QEvent *event); private: Ui::MainWindow *m_ui; Phonon::MediaObject *m_mediaObject; + QGraphicsProxyWidget *m_videoWidget; + QGraphicsTextItem *m_subtitlesTopWidget; + QGraphicsTextItem *m_subtitlesBottomWidget; QString m_currentPath; QLabel *m_fileNameLabel; QLabel *m_timeLabel; diff --git a/SubtitlesEditor.ui b/SubtitlesEditor.ui index 0f0c69c..34e18e8 100644 --- a/SubtitlesEditor.ui +++ b/SubtitlesEditor.ui @@ -28,332 +28,165 @@ 0 - - - - 0 - 0 - + + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 157 + 155 + 149 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + true + + + QFrame::NoFrame + + + Qt::ScrollBarAlwaysOff + + + Qt::ScrollBarAlwaysOff - - - 0 - - - 0 - - - 0 - - - - - - 0 - 64 - - - - - - - - - 255 - 255 - 255 - - - - - - - 247 - 246 - 240 - - - - - - - 0 - 0 - 0 - - - - - - - - - 255 - 255 - 255 - - - - - - - 247 - 246 - 240 - - - - - - - 0 - 0 - 0 - - - - - - - - - 157 - 155 - 149 - - - - - - - 0 - 0 - 0 - - - - - - - 0 - 0 - 0 - - - - - - - - - 12 - 75 - true - - - - true - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop - - - true - - - 10 - - - - - - - - 0 - 0 - - - - - - - - - 0 - 64 - - - - - - - - - 255 - 255 - 255 - - - - - - - 247 - 246 - 240 - - - - - - - 0 - 0 - 0 - - - - - - - - - 255 - 255 - 255 - - - - - - - 247 - 246 - 240 - - - - - - - 0 - 0 - 0 - - - - - - - - - 157 - 155 - 149 - - - - - - - 0 - 0 - 0 - - - - - - - 0 - 0 - 0 - - - - - - - - - 12 - 75 - true - - - - true - - - - - - Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft - - - true - - - 10 - - - - - - - - - - - - true - - - - - - - - - - true - - - - - - - - 0 - 0 - - - - false - - - - - - - - 0 - 0 - - - - - 200 - 16777215 - - - - - - - + + + + + + + + + true + + + + + + + + + + true + + + + + + + + 0 + 0 + + + + false + + + + + + + + 0 + 0 + + + + + 200 + 16777215 + + + + + + @@ -431,8 +264,8 @@ - 40 - 20 + 0 + 0 @@ -481,9 +314,6 @@ 200 - - Text - @@ -538,7 +368,7 @@ - 20 + 0 0 @@ -704,11 +534,6 @@ QWidget
phonon/seekslider.h
- - Phonon::VideoWidget - QWidget -
phonon/videowidget.h
-
Phonon::VolumeSlider QWidget From a12159cf02f2f0eb7b145b6d68acc37f4962668d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Dutkiewicz?= Date: Tue, 20 Dec 2011 13:58:06 +0100 Subject: [PATCH 02/20] Clear subtitles after finishing track --- SubtitlesEditor.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/SubtitlesEditor.cpp b/SubtitlesEditor.cpp index 73f0e6f..ab7843b 100644 --- a/SubtitlesEditor.cpp +++ b/SubtitlesEditor.cpp @@ -317,6 +317,8 @@ void MainWindow::finished() m_videoWidget->widget()->show(); m_videoWidget->widget()->update(); + m_subtitlesTopWidget->setHtml(QString()); + m_subtitlesBottomWidget->setHtml(QString()); } void MainWindow::tick() From d3d1e7f8755c2618f715f3aa5c32090767bbd8ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Dutkiewicz?= Date: Tue, 20 Dec 2011 15:10:47 +0100 Subject: [PATCH 03/20] Better subtitle data structure --- SubtitlesEditor.cpp | 92 +++++++++++++++++++-------------------------- SubtitlesEditor.h | 13 ++++--- 2 files changed, 45 insertions(+), 60 deletions(-) diff --git a/SubtitlesEditor.cpp b/SubtitlesEditor.cpp index ab7843b..2502b8a 100644 --- a/SubtitlesEditor.cpp +++ b/SubtitlesEditor.cpp @@ -32,6 +32,8 @@ #include #include +#include + MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), m_ui(new Ui::MainWindow), m_videoWidget(new QGraphicsProxyWidget()), @@ -327,33 +329,31 @@ void MainWindow::tick() QString currentBottomSubtitles; QString currentTopSubtitles; - qint64 currentTime = (m_mediaObject->currentTime() / 1000); + const QTime currentTime = QTime().addMSecs(m_mediaObject->currentTime()); for (int i = 0; i < m_subtitles[0].count(); ++i) { - if (m_subtitles[0].at(i).beginTime < currentTime && m_subtitles[0].at(i).endTime > currentTime) + if (m_subtitles[0].at(i).begin < currentTime && m_subtitles[0].at(i).end > currentTime) { currentBottomSubtitles.append(m_subtitles[0].at(i).text); - currentBottomSubtitles.append(" | "); + currentBottomSubtitles.append("
"); m_currentSubtitle = i; } } for (int i = 0; i < m_subtitles[1].count(); ++i) { - if (m_subtitles[1].at(i).beginTime < currentTime && m_subtitles[1].at(i).endTime > currentTime) + if (m_subtitles[1].at(i).begin < currentTime && m_subtitles[1].at(i).end > currentTime) { currentTopSubtitles.append(m_subtitles[1].at(i).text); - currentTopSubtitles.append(" | "); + currentTopSubtitles.append("
"); } } - showSubtitle(); - currentTopSubtitles = currentTopSubtitles.left(currentTopSubtitles.length() - 3); - currentBottomSubtitles = currentBottomSubtitles.left(currentBottomSubtitles.length() - 3); + selectSubtitle(); - m_subtitlesTopWidget->setHtml(currentTopSubtitles.replace('|', "
")); - m_subtitlesBottomWidget->setHtml(currentBottomSubtitles.replace('|', "
")); + m_subtitlesTopWidget->setHtml(currentTopSubtitles.left(currentTopSubtitles.length() - 6)); + m_subtitlesBottomWidget->setHtml(currentBottomSubtitles.left(currentBottomSubtitles.length() - 6)); updateVideo(); } @@ -363,16 +363,13 @@ void MainWindow::selectTrack(int track) m_currentSubtitle = 0; m_currentTrack = track; - showSubtitle(); + selectSubtitle(); } void MainWindow::addSubtitle() { Subtitle subtitle; - subtitle.positionX = 20; - subtitle.positionY = 432; - subtitle.beginTime = 0; - subtitle.endTime = 0; + subtitle.position = QPoint(20, 432); m_subtitles[m_currentTrack].insert(m_currentSubtitle, subtitle); @@ -385,7 +382,7 @@ void MainWindow::removeSubtitle() { m_subtitles[m_currentTrack].removeAt(m_currentSubtitle); - showSubtitle(); + selectSubtitle(); } } @@ -393,17 +390,17 @@ void MainWindow::previousSubtitle() { --m_currentSubtitle; - showSubtitle(); + selectSubtitle(); } void MainWindow::nextSubtitle() { ++m_currentSubtitle; - showSubtitle(); + selectSubtitle(); } -void MainWindow::showSubtitle() +void MainWindow::selectSubtitle() { disconnect(m_ui->subtitleTextEdit, SIGNAL(textChanged()), this, SLOT(updateSubtitle())); disconnect(m_ui->xPositionSpinBox, SIGNAL(valueChanged(int)), this, SLOT(updateSubtitle())); @@ -434,13 +431,11 @@ void MainWindow::showSubtitle() if (m_currentSubtitle < m_subtitles[m_currentTrack].count()) { - QTime nullTime(0, 0, 0, 0); - m_ui->subtitleTextEdit->setPlainText(m_subtitles[m_currentTrack].at(m_currentSubtitle).text); - m_ui->beginTimeEdit->setTime(nullTime.addMSecs((m_subtitles[m_currentTrack].at(m_currentSubtitle).beginTime * 1000))); - m_ui->lengthTimeEdit->setTime(nullTime.addMSecs(((m_subtitles[m_currentTrack].at(m_currentSubtitle).endTime * 1000) - (m_subtitles[m_currentTrack].at(m_currentSubtitle).beginTime * 1000)))); - m_ui->xPositionSpinBox->setValue(m_subtitles[m_currentTrack].at(m_currentSubtitle).positionX); - m_ui->yPositionSpinBox->setValue(m_subtitles[m_currentTrack].at(m_currentSubtitle).positionY); + m_ui->beginTimeEdit->setTime(m_subtitles[m_currentTrack].at(m_currentSubtitle).begin); + m_ui->lengthTimeEdit->setTime(QTime().addMSecs(m_subtitles[m_currentTrack].at(m_currentSubtitle).begin.msecsTo(m_subtitles[m_currentTrack].at(m_currentSubtitle).end))); + m_ui->xPositionSpinBox->setValue(m_subtitles[m_currentTrack].at(m_currentSubtitle).position.x()); + m_ui->yPositionSpinBox->setValue(m_subtitles[m_currentTrack].at(m_currentSubtitle).position.y()); } else { @@ -468,10 +463,9 @@ void MainWindow::updateSubtitle() } m_subtitles[m_currentTrack][m_currentSubtitle].text = m_ui->subtitleTextEdit->toPlainText(); - m_subtitles[m_currentTrack][m_currentSubtitle].positionX = m_ui->xPositionSpinBox->value(); - m_subtitles[m_currentTrack][m_currentSubtitle].positionY = m_ui->yPositionSpinBox->value(); - m_subtitles[m_currentTrack][m_currentSubtitle].beginTime = timeToSeconds(m_ui->beginTimeEdit->time()); - m_subtitles[m_currentTrack][m_currentSubtitle].endTime = (timeToSeconds(m_ui->beginTimeEdit->time()) + timeToSeconds(m_ui->lengthTimeEdit->time())); + m_subtitles[m_currentTrack][m_currentSubtitle].position = QPoint(m_ui->xPositionSpinBox->value(), m_ui->yPositionSpinBox->value()); + m_subtitles[m_currentTrack][m_currentSubtitle].begin = m_ui->beginTimeEdit->time(); + m_subtitles[m_currentTrack][m_currentSubtitle].end = m_ui->beginTimeEdit->time().addMSecs(m_ui->lengthTimeEdit->time().msecsTo(QTime())); } void MainWindow::rescaleSubtitles() @@ -481,17 +475,17 @@ void MainWindow::rescaleSubtitles() for (int i = 0; i < m_subtitles[0].count(); ++i) { - m_subtitles[0][i].beginTime *= scale; - m_subtitles[0][i].endTime *= scale; + m_subtitles[0][i].begin = QTime().addMSecs(QTime().msecsTo(m_subtitles[0][i].begin) * scale); + m_subtitles[0][i].end = QTime().addMSecs(QTime().msecsTo(m_subtitles[0][i].end) * scale); } for (int i = 0; i < m_subtitles[1].count(); ++i) { - m_subtitles[1][i].beginTime *= scale; - m_subtitles[1][i].endTime *= scale; + m_subtitles[1][i].begin = QTime().addMSecs(QTime().msecsTo(m_subtitles[1][i].begin) * scale); + m_subtitles[1][i].end = QTime().addMSecs(QTime().msecsTo(m_subtitles[1][i].end) * scale); } - showSubtitle(); + selectSubtitle(); } void MainWindow::updateVideo() @@ -501,11 +495,11 @@ void MainWindow::updateVideo() m_ui->graphicsView->centerOn(m_videoWidget); m_ui->graphicsView->scene()->setSceneRect(m_ui->graphicsView->rect()); - m_subtitlesTopWidget->setY(0); - m_subtitlesTopWidget->setTextWidth(m_ui->graphicsView->scene()->width()); + m_subtitlesTopWidget->setPos(5, 5); + m_subtitlesTopWidget->setTextWidth(m_ui->graphicsView->scene()->width() - 10); - m_subtitlesBottomWidget->setY(m_ui->graphicsView->scene()->height() - m_subtitlesBottomWidget->shape().controlPointRect().height()); - m_subtitlesBottomWidget->setTextWidth(m_ui->graphicsView->scene()->width()); + m_subtitlesBottomWidget->setPos(5, (m_ui->graphicsView->scene()->height()- 5 - m_subtitlesBottomWidget->shape().controlPointRect().height())); + m_subtitlesBottomWidget->setTextWidth(m_ui->graphicsView->scene()->width() - 10); } void MainWindow::playPause() @@ -582,11 +576,10 @@ QList MainWindow::readSubtitles(const QString &fileName) QStringList capturedTexts = expression.capturedTexts(); Subtitle subtitle; - subtitle.text = capturedTexts.at(5); - subtitle.beginTime = capturedTexts.at(3).toDouble(); - subtitle.endTime = capturedTexts.at(4).toDouble(); - subtitle.positionX = capturedTexts.at(1).toInt(); - subtitle.positionY = capturedTexts.at(2).toInt(); + subtitle.text = capturedTexts.value(5); + subtitle.begin = QTime().addMSecs(capturedTexts.value(3).toFloat() * 1000); + subtitle.end = QTime().addMSecs(capturedTexts.value(4).toFloat() * 1000); + subtitle.position = QPoint(capturedTexts.value(1).toInt(), capturedTexts.value(2).toInt()); subtitles.append(subtitle); } @@ -605,15 +598,6 @@ QList MainWindow::readSubtitles(const QString &fileName) return subtitles; } -double MainWindow::timeToSeconds(QTime time) -{ - double seconds = (time.minute() * 60); - seconds += time.second(); - seconds += (time.msec() / 1000); - - return seconds; -} - bool MainWindow::saveSubtitles(QString fileName) { for (int i = 0; i < 2; ++i) @@ -641,9 +625,9 @@ bool MainWindow::saveSubtitles(QString fileName) for (int j = 0; j < m_subtitles[i].count(); ++j) { - textStream << QString("%1\t%2\t\t%3\t%4\t_(\"%5\")\n").arg(m_subtitles[i][j].positionX).arg(m_subtitles[i][j].positionY).arg(m_subtitles[i][j].beginTime).arg(m_subtitles[i][j].endTime).arg(m_subtitles[i][j].text); + textStream << QString("%1\t%2\t\t%3\t%4\t_(\"%5\")\n").arg(m_subtitles[i][j].position.x()).arg(m_subtitles[i][j].position.y()).arg(timeToString(m_subtitles[i][j].begin.msecsTo(QTime()))).arg(timeToString(m_subtitles[i][j].end.msecsTo(QTime()))).arg(m_subtitles[i][j].text); - if ((j + 1) < m_subtitles[i].count() && m_subtitles[i][j].beginTime != m_subtitles[i][j + 1].beginTime) + if ((j + 1) < m_subtitles[i].count() && m_subtitles[i][j].begin != m_subtitles[i][j + 1].begin) { textStream << "\n"; } diff --git a/SubtitlesEditor.h b/SubtitlesEditor.h index b6b3946..95785a5 100644 --- a/SubtitlesEditor.h +++ b/SubtitlesEditor.h @@ -21,6 +21,8 @@ #ifndef SUBTITLESEDITOR_H #define SUBTITLESEDITOR_H +#include + #include #include #include @@ -36,10 +38,9 @@ namespace Ui struct Subtitle { QString text; - double beginTime; - double endTime; - int positionX; - int positionY; + QTime begin; + QTime end; + QPoint position; }; class SubtitlesWidget; @@ -47,6 +48,7 @@ class SubtitlesWidget; class MainWindow : public QMainWindow { Q_OBJECT + public: MainWindow(QWidget *parent = 0); ~MainWindow(); @@ -64,7 +66,7 @@ public slots: void removeSubtitle(); void previousSubtitle(); void nextSubtitle(); - void showSubtitle(); + void selectSubtitle(); void updateSubtitle(); void rescaleSubtitles(); void playPause(); @@ -75,7 +77,6 @@ public slots: void closeEvent(QCloseEvent *event); QString timeToString(qint64 time); QList readSubtitles(const QString &fileName); - double timeToSeconds(QTime time); bool saveSubtitles(QString fileName); bool eventFilter(QObject *object, QEvent *event); From cb23f123ae24a9ed5726ca5eb961475dc125548a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Dutkiewicz?= Date: Tue, 20 Dec 2011 15:28:39 +0100 Subject: [PATCH 04/20] Move subtitle properties to dock widget --- SubtitlesEditor.cpp | 6 +- SubtitlesEditor.ui | 375 +++++++++++++++++++++----------------------- 2 files changed, 183 insertions(+), 198 deletions(-) diff --git a/SubtitlesEditor.cpp b/SubtitlesEditor.cpp index 2502b8a..08fac6c 100644 --- a/SubtitlesEditor.cpp +++ b/SubtitlesEditor.cpp @@ -58,10 +58,6 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), Phonon::createPath(m_mediaObject, audioOutput); m_videoWidget->setWidget(videoWidget); - m_videoWidget->resize(300, 300); - - m_subtitlesTopWidget->setDefaultTextColor(QColor(Qt::white)); - m_subtitlesBottomWidget->setDefaultTextColor(QColor(Qt::white)); QGraphicsDropShadowEffect *topShadowEffect = new QGraphicsDropShadowEffect(m_subtitlesTopWidget); topShadowEffect->setOffset(0, 0); @@ -69,6 +65,7 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), topShadowEffect->setColor(QColor(Qt::black)); m_subtitlesTopWidget->setGraphicsEffect(topShadowEffect); + m_subtitlesTopWidget->setDefaultTextColor(QColor(230, 230, 230)); QGraphicsDropShadowEffect *bottomShadowEffect = new QGraphicsDropShadowEffect(m_subtitlesBottomWidget); bottomShadowEffect->setOffset(0, 0); @@ -76,6 +73,7 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), bottomShadowEffect->setColor(QColor(Qt::black)); m_subtitlesBottomWidget->setGraphicsEffect(bottomShadowEffect); + m_subtitlesBottomWidget->setDefaultTextColor(QColor(230, 230, 230)); m_ui->graphicsView->setScene(new QGraphicsScene(this)); m_ui->graphicsView->scene()->addItem(m_videoWidget); diff --git a/SubtitlesEditor.ui b/SubtitlesEditor.ui index 34e18e8..d716455 100644 --- a/SubtitlesEditor.ui +++ b/SubtitlesEditor.ui @@ -187,200 +187,6 @@
- - - - Qt::Horizontal - - - - - - - - 0 - 0 - - - - - 0 - 0 - - - - - 16777215 - 180 - - - - - 0 - - - - - - - true - - - - Bottom - - - - - Top - - - - - - - - - - - true - - - - - - - - - - true - - - - - - - Qt::Horizontal - - - - 0 - 0 - - - - - - - - - - - false - - - true - - - - - - - - - - false - - - true - - - - - - - - - - - - 0 - 0 - - - - - 16777215 - 200 - - - - - - - - - - Begin - - - mm:ss:zzz - - - - - - - Length - - - mm:ss:zzz - - - - - - - X Coordinate - - - 99999 - - - - - - - Y Coordinate - - - 99999 - - - - - - - Qt::Vertical - - - QSizePolicy::MinimumExpanding - - - - 0 - 0 - - - - - - - - - - - @@ -434,6 +240,187 @@ + + + Subtitle Properties + + + 8 + + + + + 0 + + + 0 + + + + + + + true + + + + Bottom + + + + + Top + + + + + + + + + + + true + + + + + + + + + + true + + + + + + + Qt::Horizontal + + + + 0 + 0 + + + + + + + + + + + false + + + true + + + + + + + + + + false + + + true + + + + + + + + + 0 + + + + + + 0 + 0 + + + + + 16777215 + 200 + + + + + + + + + + Begin + + + mm:ss:zzz + + + + + + + Length + + + mm:ss:zzz + + + + + + + X Coordinate + + + 99999 + + + + + + + Y Coordinate + + + 99999 + + + + + + + Qt::Vertical + + + QSizePolicy::MinimumExpanding + + + + 0 + 0 + + + + + + + + + + + Open... From 3feb34821d38a450b03b57641324031d34cc080f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Dutkiewicz?= Date: Tue, 20 Dec 2011 17:01:19 +0100 Subject: [PATCH 05/20] Redo subtitles editor widget plus some small fixes --- SubtitlesEditor.cpp | 54 +++++------ SubtitlesEditor.h | 5 +- SubtitlesEditor.ui | 219 +++++++++++++++++++++----------------------- 3 files changed, 132 insertions(+), 146 deletions(-) diff --git a/SubtitlesEditor.cpp b/SubtitlesEditor.cpp index 08fac6c..9452ea6 100644 --- a/SubtitlesEditor.cpp +++ b/SubtitlesEditor.cpp @@ -23,6 +23,7 @@ #include +#include #include #include #include @@ -32,8 +33,6 @@ #include #include -#include - MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), m_ui(new Ui::MainWindow), m_videoWidget(new QGraphicsProxyWidget()), @@ -77,10 +76,17 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), m_ui->graphicsView->setScene(new QGraphicsScene(this)); m_ui->graphicsView->scene()->addItem(m_videoWidget); - m_ui->graphicsView->scene()->addItem(m_subtitlesTopWidget); - m_ui->graphicsView->scene()->addItem(m_subtitlesBottomWidget); m_ui->graphicsView->installEventFilter(this); + QTabBar *tabBar = new QTabBar(m_ui->centralWidget); + tabBar->setDocumentMode(true); + tabBar->setShape(QTabBar::RoundedWest); + tabBar->addTab(tr("Top")); + tabBar->addTab(tr("Bottom")); + tabBar->setCurrentIndex(1); + + m_ui->tabBarLayout->insertWidget(0, tabBar); + m_ui->actionPlayPause->setIcon(QIcon::fromTheme("media-playback-start", style()->standardIcon(QStyle::SP_MediaPlay))); m_ui->actionPlayPause->setShortcut(tr("Space")); m_ui->actionPlayPause->setDisabled(true); @@ -134,7 +140,7 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), connect(m_ui->actionStop, SIGNAL(triggered()), m_mediaObject, SLOT(stop())); connect(m_ui->actionAboutQt, SIGNAL(triggered()), QApplication::instance(), SLOT(aboutQt())); connect(m_ui->actionAboutApplication, SIGNAL(triggered()), this, SLOT(actionAboutApplication())); - connect(m_ui->trackComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(selectTrack(int))); + connect(tabBar, SIGNAL(currentChanged(int)), this, SLOT(selectTrack(int))); connect(m_mediaObject, SIGNAL(stateChanged(Phonon::State,Phonon::State)), this, SLOT(stateChanged(Phonon::State))); connect(m_mediaObject, SIGNAL(tick(qint64)), this, SLOT(tick())); connect(m_mediaObject, SIGNAL(finished()), this, SLOT(finished())); @@ -188,11 +194,6 @@ void MainWindow::openMovie(const QString &fileName) m_ui->actionPlayPause->setEnabled(true); } -void MainWindow::openSubtitle(const QString &fileName, int index) -{ - m_subtitles[index] = readSubtitles(fileName); -} - void MainWindow::actionOpen() { QString fileName = QFileDialog::getOpenFileName(this, tr("Open Video or Subtitle file"), @@ -228,19 +229,19 @@ void MainWindow::actionOpen() if (QFile::exists(txtfile)) { - openSubtitle(txtfile, 0); + openSubtitles(txtfile, 1); m_currentPath = fileName; } if (QFile::exists(txafile)) { - openSubtitle(txafile, 1); + openSubtitles(txafile, 0); m_currentPath = fileName; } - selectTrack(0); + selectTrack(1); QSettings().setValue("lastUsedDir", QFileInfo(fileName).dir().path()); } @@ -333,9 +334,8 @@ void MainWindow::tick() { if (m_subtitles[0].at(i).begin < currentTime && m_subtitles[0].at(i).end > currentTime) { - currentBottomSubtitles.append(m_subtitles[0].at(i).text); - currentBottomSubtitles.append("
"); - m_currentSubtitle = i; + currentTopSubtitles.append(m_subtitles[0].at(i).text); + currentTopSubtitles.append("
"); } } @@ -343,8 +343,10 @@ void MainWindow::tick() { if (m_subtitles[1].at(i).begin < currentTime && m_subtitles[1].at(i).end > currentTime) { - currentTopSubtitles.append(m_subtitles[1].at(i).text); - currentTopSubtitles.append("
"); + currentBottomSubtitles.append(m_subtitles[1].at(i).text); + currentBottomSubtitles.append("
"); + + m_currentSubtitle = i; } } @@ -544,18 +546,19 @@ QString MainWindow::timeToString(qint64 time) return string; } -QList MainWindow::readSubtitles(const QString &fileName) +void MainWindow::openSubtitles(const QString &fileName, int index) { QFile file(fileName); - QList subtitles; if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { QMessageBox::warning(this, tr("Error"), tr("Can not read subtitle file:\n%1").arg(fileName)); - return subtitles; + return; } + m_subtitles[index].clear(); + QTextStream textStream(&file); while (!textStream.atEnd()) @@ -579,7 +582,7 @@ QList MainWindow::readSubtitles(const QString &fileName) subtitle.end = QTime().addMSecs(capturedTexts.value(4).toFloat() * 1000); subtitle.position = QPoint(capturedTexts.value(1).toInt(), capturedTexts.value(2).toInt()); - subtitles.append(subtitle); + m_subtitles[index].append(subtitle); } } @@ -591,21 +594,18 @@ QList MainWindow::readSubtitles(const QString &fileName) setWindowTitle(tr("%1 - %2").arg("Subtitles Editor").arg(title)); m_fileNameLabel->setText(title); - - - return subtitles; } bool MainWindow::saveSubtitles(QString fileName) { - for (int i = 0; i < 2; ++i) + for (int i = 1; i >= 0; --i) { if (m_subtitles[i].isEmpty()) { continue; } - if (i > 0) + if (i == 0) { fileName = fileName.left(fileName.length() - 3) + "txa"; } diff --git a/SubtitlesEditor.h b/SubtitlesEditor.h index 95785a5..e598ba0 100644 --- a/SubtitlesEditor.h +++ b/SubtitlesEditor.h @@ -75,8 +75,9 @@ public slots: protected: void changeEvent(QEvent *event); void closeEvent(QCloseEvent *event); + void openMovie(const QString &filename); + void openSubtitles(const QString &fileName, int index); QString timeToString(qint64 time); - QList readSubtitles(const QString &fileName); bool saveSubtitles(QString fileName); bool eventFilter(QObject *object, QEvent *event); @@ -93,8 +94,6 @@ public slots: int m_currentSubtitle; int m_currentTrack; - void openMovie(const QString &filename); - void openSubtitle(const QString &filename, int index); }; #endif // SUBTITLESEDITOR_H diff --git a/SubtitlesEditor.ui b/SubtitlesEditor.ui index d716455..0438dd8 100644 --- a/SubtitlesEditor.ui +++ b/SubtitlesEditor.ui @@ -248,7 +248,7 @@ 8 - + 0 @@ -256,48 +256,14 @@ 0
- - - - - true - - - - Bottom - - - - - Top - - - - - - - - - - - true - - - - - - - - - - true - - - + + + 0 + - + - Qt::Horizontal + Qt::Vertical @@ -307,84 +273,105 @@ - - - - - - - false - - - true - - - - - - - - - - false - - - true - - - - - - 0 - - - - - - 0 - 0 - - - - - 16777215 - 200 - - - - + + + + - + - - - Begin + + + - - mm:ss:zzz + + true - - - Length + + + - - mm:ss:zzz + + true + + + + Qt::Horizontal + + + + 0 + 0 + + + + + + + + false + + + Qt::ToolButtonIconOnly + + + true + + + + + + + false + + + Qt::ToolButtonIconOnly + + + true + + + + + + + + + Begin + + + mm:ss:zzz + + + + + + + Length + + + mm:ss:zzz + + + + + X Coordinate - 99999 + 999 @@ -394,28 +381,28 @@ Y Coordinate - 99999 + 999
- - - - Qt::Vertical - - - QSizePolicy::MinimumExpanding - - - - 0 - 0 - - - - + + + + Qt::Vertical + + + QSizePolicy::MinimumExpanding + + + + 0 + 0 + + + + From 14ad1d1125eb2d7bd42f971aea9e4fc627c90556 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Dutkiewicz?= Date: Tue, 20 Dec 2011 18:47:54 +0100 Subject: [PATCH 06/20] Enable actions only if they are available --- SubtitlesEditor.cpp | 37 +++++++++++++++++++++++++++---------- SubtitlesEditor.h | 1 + SubtitlesEditor.ui | 13 ++++++++----- 3 files changed, 36 insertions(+), 15 deletions(-) diff --git a/SubtitlesEditor.cpp b/SubtitlesEditor.cpp index 9452ea6..8eb0bd6 100644 --- a/SubtitlesEditor.cpp +++ b/SubtitlesEditor.cpp @@ -245,6 +245,8 @@ void MainWindow::actionOpen() QSettings().setValue("lastUsedDir", QFileInfo(fileName).dir().path()); } + + updateActions(); } void MainWindow::actionSave() @@ -364,6 +366,7 @@ void MainWindow::selectTrack(int track) m_currentTrack = track; selectSubtitle(); + updateActions(); } void MainWindow::addSubtitle() @@ -374,6 +377,7 @@ void MainWindow::addSubtitle() m_subtitles[m_currentTrack].insert(m_currentSubtitle, subtitle); nextSubtitle(); + updateActions(); } void MainWindow::removeSubtitle() @@ -383,6 +387,7 @@ void MainWindow::removeSubtitle() m_subtitles[m_currentTrack].removeAt(m_currentSubtitle); selectSubtitle(); + updateActions(); } } @@ -488,6 +493,18 @@ void MainWindow::rescaleSubtitles() selectSubtitle(); } +void MainWindow::playPause() +{ + if (m_mediaObject->state() == Phonon::PlayingState) + { + m_mediaObject->pause(); + } + else + { + m_mediaObject->play(); + } +} + void MainWindow::updateVideo() { m_videoWidget->resize(m_ui->graphicsView->size()); @@ -502,16 +519,16 @@ void MainWindow::updateVideo() m_subtitlesBottomWidget->setTextWidth(m_ui->graphicsView->scene()->width() - 10); } -void MainWindow::playPause() +void MainWindow::updateActions() { - if (m_mediaObject->state() == Phonon::PlayingState) - { - m_mediaObject->pause(); - } - else - { - m_mediaObject->play(); - } + const bool available = (!m_subtitles[0].isEmpty() || !m_subtitles[1].isEmpty()); + + m_ui->actionSave->setEnabled(available); + m_ui->actionSaveAs->setEnabled(available); + m_ui->actionPrevious->setEnabled(available && m_subtitles[m_currentTrack].count() > 1); + m_ui->actionNext->setEnabled(available && m_subtitles[m_currentTrack].count() > 1); + m_ui->actionRemove->setEnabled(available); + m_ui->actionRescale->setEnabled(available); } QString MainWindow::timeToString(qint64 time) @@ -594,7 +611,7 @@ void MainWindow::openSubtitles(const QString &fileName, int index) setWindowTitle(tr("%1 - %2").arg("Subtitles Editor").arg(title)); m_fileNameLabel->setText(title); -} + } bool MainWindow::saveSubtitles(QString fileName) { diff --git a/SubtitlesEditor.h b/SubtitlesEditor.h index e598ba0..443ccdc 100644 --- a/SubtitlesEditor.h +++ b/SubtitlesEditor.h @@ -71,6 +71,7 @@ public slots: void rescaleSubtitles(); void playPause(); void updateVideo(); + void updateActions(); protected: void changeEvent(QEvent *event); diff --git a/SubtitlesEditor.ui b/SubtitlesEditor.ui index 0438dd8..0795c86 100644 --- a/SubtitlesEditor.ui +++ b/SubtitlesEditor.ui @@ -427,6 +427,9 @@ + + false + Save As... @@ -444,7 +447,7 @@ - true + false Save @@ -460,7 +463,7 @@ - true + false Remove @@ -468,7 +471,7 @@ - true + false Previous @@ -476,7 +479,7 @@ - true + false Next @@ -484,7 +487,7 @@ - true + false Rescale From a967cab7d46fa4b8872f8a493bd7af526d0fbb15 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Dutkiewicz?= Date: Tue, 20 Dec 2011 19:15:27 +0100 Subject: [PATCH 07/20] Keep track of subtitles modification (basic) --- SubtitlesEditor.cpp | 37 ++++++++++++++++++++++++++++--------- SubtitlesEditor.ui | 2 +- 2 files changed, 29 insertions(+), 10 deletions(-) diff --git a/SubtitlesEditor.cpp b/SubtitlesEditor.cpp index 8eb0bd6..03a4840 100644 --- a/SubtitlesEditor.cpp +++ b/SubtitlesEditor.cpp @@ -122,9 +122,7 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), resize(QSettings().value("Window/size", size()).toSize()); move(QSettings().value("Window/position", pos()).toPoint()); restoreState(QSettings().value("Window/state", QByteArray()).toByteArray()); - - setWindowTitle(tr("%1 - Unnamed").arg("Subtitles Editor")); - + setWindowTitle(tr("%1 - Unnamed[*]").arg("Subtitles Editor")); updateVideo(); connect(m_ui->actionOpen, SIGNAL(triggered()), this, SLOT(actionOpen())); @@ -167,6 +165,13 @@ void MainWindow::changeEvent(QEvent *event) void MainWindow::closeEvent(QCloseEvent *event) { + if (isWindowModified() && QMessageBox::warning(this, tr("Question"), tr("Do you really want to close current subtitles without saving?"), QMessageBox::Yes | QMessageBox::No) == QMessageBox::No) + { + event->ignore(); + + return; + } + QSettings settings; settings.setValue("Window/size", size()); settings.setValue("Window/position", pos()); @@ -181,7 +186,7 @@ void MainWindow::openMovie(const QString &fileName) QString title = QFileInfo(fileName).fileName(); title = title.left(title.indexOf('.')); - setWindowTitle(tr("%1 - %2").arg("Subtitles Editor").arg(title)); + setWindowTitle(tr("%1 - %2[*]").arg("Subtitles Editor").arg(title)); m_fileNameLabel->setText(title); m_timeLabel->setText(QString("00:00.0 / %1").arg(timeToString(m_mediaObject->totalTime()))); @@ -196,6 +201,11 @@ void MainWindow::openMovie(const QString &fileName) void MainWindow::actionOpen() { + if (isWindowModified() && QMessageBox::warning(this, tr("Question"), tr("Do you really want to close current subtitles without saving?"), QMessageBox::Yes | QMessageBox::No) == QMessageBox::No) + { + return; + } + QString fileName = QFileDialog::getOpenFileName(this, tr("Open Video or Subtitle file"), QSettings().value("lastUsedDir", QDesktopServices::storageLocation(QDesktopServices::HomeLocation)).toString(), tr("Video and subtitle files (*.txt *.og?)")); @@ -246,6 +256,7 @@ void MainWindow::actionOpen() QSettings().setValue("lastUsedDir", QFileInfo(fileName).dir().path()); } + selectSubtitle(); updateActions(); } @@ -378,6 +389,8 @@ void MainWindow::addSubtitle() nextSubtitle(); updateActions(); + + setWindowModified(true); } void MainWindow::removeSubtitle() @@ -389,6 +402,8 @@ void MainWindow::removeSubtitle() selectSubtitle(); updateActions(); } + + setWindowModified(true); } void MainWindow::previousSubtitle() @@ -471,6 +486,8 @@ void MainWindow::updateSubtitle() m_subtitles[m_currentTrack][m_currentSubtitle].position = QPoint(m_ui->xPositionSpinBox->value(), m_ui->yPositionSpinBox->value()); m_subtitles[m_currentTrack][m_currentSubtitle].begin = m_ui->beginTimeEdit->time(); m_subtitles[m_currentTrack][m_currentSubtitle].end = m_ui->beginTimeEdit->time().addMSecs(m_ui->lengthTimeEdit->time().msecsTo(QTime())); + + setWindowModified(true); } void MainWindow::rescaleSubtitles() @@ -574,6 +591,7 @@ void MainWindow::openSubtitles(const QString &fileName, int index) return; } + setWindowModified(false); m_subtitles[index].clear(); QTextStream textStream(&file); @@ -608,10 +626,10 @@ void MainWindow::openSubtitles(const QString &fileName, int index) QString title = QFileInfo(fileName).fileName(); title = title.left(title.indexOf('.')); - setWindowTitle(tr("%1 - %2").arg("Subtitles Editor").arg(title)); - m_fileNameLabel->setText(title); - } + + setWindowTitle(tr("%1 - %2[*]").arg("Subtitles Editor").arg(title)); +} bool MainWindow::saveSubtitles(QString fileName) { @@ -654,10 +672,11 @@ bool MainWindow::saveSubtitles(QString fileName) QString title = QFileInfo(fileName).fileName(); title = title.left(title.indexOf('.')); - setWindowTitle(tr("%1 - %2").arg("Subtitles Editor").arg(title)); - m_fileNameLabel->setText(title); + setWindowTitle(tr("%1 - %2[*]").arg("Subtitles Editor").arg(title)); + setWindowModified(false); + return true; } diff --git a/SubtitlesEditor.ui b/SubtitlesEditor.ui index 0795c86..4308e82 100644 --- a/SubtitlesEditor.ui +++ b/SubtitlesEditor.ui @@ -17,7 +17,7 @@ - Subtitles Editor - Unnamed + Subtitles Editor - Unnamed[*] From c2a148f5fce8bc1b25052befb8474dae5b792171 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Dutkiewicz?= Date: Tue, 20 Dec 2011 20:15:40 +0100 Subject: [PATCH 08/20] Add recent files list --- SubtitlesEditor.cpp | 146 +++++++++++++++++++++++++++++++------------- SubtitlesEditor.h | 6 +- SubtitlesEditor.ui | 33 ++++++++++ 3 files changed, 140 insertions(+), 45 deletions(-) diff --git a/SubtitlesEditor.cpp b/SubtitlesEditor.cpp index 03a4840..3f72de4 100644 --- a/SubtitlesEditor.cpp +++ b/SubtitlesEditor.cpp @@ -99,6 +99,8 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), m_timeLabel = new QLabel("00:00.0 / 00:00.0", this); m_ui->actionOpen->setIcon(QIcon::fromTheme("document-open", style()->standardIcon(QStyle::SP_DirOpenIcon))); + m_ui->menuOpenRecent->setIcon(QIcon::fromTheme("document-open-recent")); + m_ui->actionClearRecentFiles->setIcon(QIcon::fromTheme("edit-clear-list")); m_ui->actionSave->setIcon(QIcon::fromTheme("document-save", style()->standardIcon(QStyle::SP_DialogSaveButton))); m_ui->actionSaveAs->setIcon(QIcon::fromTheme("document-save-as")); m_ui->actionExit->setIcon(QIcon::fromTheme("application-exit", style()->standardIcon(QStyle::SP_DialogCloseButton))); @@ -125,7 +127,10 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), setWindowTitle(tr("%1 - Unnamed[*]").arg("Subtitles Editor")); updateVideo(); + connect(m_ui->menuFile, SIGNAL(aboutToShow()), this, SLOT(updateRecentFilesMenu())); connect(m_ui->actionOpen, SIGNAL(triggered()), this, SLOT(actionOpen())); + connect(m_ui->menuOpenRecent, SIGNAL(triggered(QAction*)), this, SLOT(actionOpenRecent(QAction*))); + connect(m_ui->actionClearRecentFiles, SIGNAL(triggered()), this, SLOT(actionClearRecentFiles())); connect(m_ui->actionSave, SIGNAL(triggered()), this, SLOT(actionSave())); connect(m_ui->actionSaveAs, SIGNAL(triggered()), this, SLOT(actionSaveAs())); connect(m_ui->actionExit, SIGNAL(triggered()), this, SLOT(close())); @@ -212,54 +217,26 @@ void MainWindow::actionOpen() if (!fileName.isEmpty()) { - const QString basename = fileName.left(fileName.length() - 3); - const QString oggfile = basename + "ogg"; - const QString ogmfile = basename + "ogm"; - const QString ogvfile = basename + "ogv"; - const QString txtfile = basename + "txt"; - const QString txafile = basename + "txa"; - - m_subtitles[0].clear(); - m_subtitles[1].clear(); - - if (QFile::exists(oggfile)) - { - openMovie(oggfile); - } - - if (QFile::exists(ogmfile)) - { - openMovie(ogmfile); - } - - if (QFile::exists(ogvfile)) - { - openMovie(ogvfile); - } - - if (QFile::exists(txtfile)) - { - openSubtitles(txtfile, 1); - - m_currentPath = fileName; - } - - if (QFile::exists(txafile)) - { - openSubtitles(txafile, 0); - - m_currentPath = fileName; - } - - selectTrack(1); - - QSettings().setValue("lastUsedDir", QFileInfo(fileName).dir().path()); + openFile(fileName); } selectSubtitle(); updateActions(); } +void MainWindow::actionOpenRecent(QAction *action) +{ + if (!action->data().toString().isEmpty()) + { + openFile(action->data().toString()); + } +} + +void MainWindow::actionClearRecentFiles() +{ + QSettings().remove("recentFiles"); +} + void MainWindow::actionSave() { if (m_currentPath.isEmpty()) @@ -548,6 +525,29 @@ void MainWindow::updateActions() m_ui->actionRescale->setEnabled(available); } +void MainWindow::updateRecentFilesMenu() +{ + QStringList recentFiles = QSettings().value("recentFiles").toStringList(); + + for (int i = 0; i < 10; ++i) + { + if (i < recentFiles.count()) + { + QFileInfo fileInfo(recentFiles.at(i)); + + m_ui->menuOpenRecent->actions().at(i)->setText(QString("%1. %2 (%3)").arg(i + 1).arg(fileInfo.fileName()).arg(recentFiles.at(i))); + m_ui->menuOpenRecent->actions().at(i)->setData(recentFiles.at(i)); + m_ui->menuOpenRecent->actions().at(i)->setVisible(true); + } + else + { + m_ui->menuOpenRecent->actions().at(i)->setVisible(false); + } + } + + m_ui->menuOpenRecent->setEnabled(recentFiles.count()); +} + QString MainWindow::timeToString(qint64 time) { QString string; @@ -580,7 +580,63 @@ QString MainWindow::timeToString(qint64 time) return string; } -void MainWindow::openSubtitles(const QString &fileName, int index) +bool MainWindow::openFile(const QString &fileName) +{ + const QString basename = fileName.left(fileName.length() - 3); + const QString oggfile = basename + "ogg"; + const QString ogmfile = basename + "ogm"; + const QString ogvfile = basename + "ogv"; + const QString txtfile = basename + "txt"; + const QString txafile = basename + "txa"; + bool status = true; + + m_subtitles[0].clear(); + m_subtitles[1].clear(); + + if (QFile::exists(oggfile)) + { + openMovie(oggfile); + } + + if (QFile::exists(ogmfile)) + { + openMovie(ogmfile); + } + + if (QFile::exists(ogvfile)) + { + openMovie(ogvfile); + } + + if (QFile::exists(txtfile)) + { + status = openSubtitles(txtfile, 1); + + m_currentPath = fileName; + } + + if (QFile::exists(txafile)) + { + status = openSubtitles(txafile, 0); + + m_currentPath = fileName; + } + + selectTrack(1); + + QFileInfo fileInfo(fileName); + QStringList recentFiles = QSettings().value("recentFiles").toStringList(); + recentFiles.removeAll(fileInfo.absoluteFilePath()); + recentFiles.prepend(fileInfo.absoluteFilePath()); + recentFiles = recentFiles.mid(0, 10); + + QSettings().setValue("recentFiles", recentFiles); + QSettings().setValue("lastUsedDir", fileInfo.dir().path()); + + return status; +} + +bool MainWindow::openSubtitles(const QString &fileName, int index) { QFile file(fileName); @@ -588,7 +644,7 @@ void MainWindow::openSubtitles(const QString &fileName, int index) { QMessageBox::warning(this, tr("Error"), tr("Can not read subtitle file:\n%1").arg(fileName)); - return; + return false; } setWindowModified(false); @@ -629,6 +685,8 @@ void MainWindow::openSubtitles(const QString &fileName, int index) m_fileNameLabel->setText(title); setWindowTitle(tr("%1 - %2[*]").arg("Subtitles Editor").arg(title)); + + return true; } bool MainWindow::saveSubtitles(QString fileName) diff --git a/SubtitlesEditor.h b/SubtitlesEditor.h index 443ccdc..eab7ba9 100644 --- a/SubtitlesEditor.h +++ b/SubtitlesEditor.h @@ -55,6 +55,8 @@ class MainWindow : public QMainWindow public slots: void actionOpen(); + void actionOpenRecent(QAction *action); + void actionClearRecentFiles(); void actionSave(); void actionSaveAs(); void actionAboutApplication(); @@ -72,13 +74,15 @@ public slots: void playPause(); void updateVideo(); void updateActions(); + void updateRecentFilesMenu(); protected: void changeEvent(QEvent *event); void closeEvent(QCloseEvent *event); void openMovie(const QString &filename); - void openSubtitles(const QString &fileName, int index); QString timeToString(qint64 time); + bool openFile(const QString &fileName); + bool openSubtitles(const QString &fileName, int index); bool saveSubtitles(QString fileName); bool eventFilter(QObject *object, QEvent *event); diff --git a/SubtitlesEditor.ui b/SubtitlesEditor.ui index 4308e82..59edb46 100644 --- a/SubtitlesEditor.ui +++ b/SubtitlesEditor.ui @@ -202,7 +202,25 @@ &File + + + Recent Files + + + + + + + + + + + + + + + @@ -503,6 +521,21 @@ Stop + + + + + + + + + + + + + Clear List + + From 5b9f165a8ee80782661dba719f8c490d4fc91640 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Dutkiewicz?= Date: Tue, 20 Dec 2011 20:24:35 +0100 Subject: [PATCH 09/20] Add file to recent files list also when saving with different name --- SubtitlesEditor.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/SubtitlesEditor.cpp b/SubtitlesEditor.cpp index 3f72de4..e6d7933 100644 --- a/SubtitlesEditor.cpp +++ b/SubtitlesEditor.cpp @@ -253,9 +253,15 @@ void MainWindow::actionSaveAs() { QString fileName = QFileDialog::getSaveFileName(this, tr("Save Subtitle file"), (m_currentPath.isEmpty()?QDesktopServices::storageLocation(QDesktopServices::HomeLocation):QFileInfo(m_currentPath).dir().path())); - if (!fileName.isEmpty()) + if (!fileName.isEmpty() && saveSubtitles(fileName)) { - saveSubtitles(fileName); + QFileInfo fileInfo(fileName); + QStringList recentFiles = QSettings().value("recentFiles").toStringList(); + recentFiles.removeAll(fileInfo.absoluteFilePath()); + recentFiles.prepend(fileInfo.absoluteFilePath()); + recentFiles = recentFiles.mid(0, 10); + + QSettings().setValue("recentFiles", recentFiles); } } From 61512e4f9c01690eebe6eef47333fc00cf1080a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Dutkiewicz?= Date: Tue, 20 Dec 2011 20:26:28 +0100 Subject: [PATCH 10/20] Enable saving for some edge cases --- SubtitlesEditor.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/SubtitlesEditor.cpp b/SubtitlesEditor.cpp index e6d7933..41836e2 100644 --- a/SubtitlesEditor.cpp +++ b/SubtitlesEditor.cpp @@ -471,6 +471,7 @@ void MainWindow::updateSubtitle() m_subtitles[m_currentTrack][m_currentSubtitle].end = m_ui->beginTimeEdit->time().addMSecs(m_ui->lengthTimeEdit->time().msecsTo(QTime())); setWindowModified(true); + updateActions(); } void MainWindow::rescaleSubtitles() @@ -523,8 +524,8 @@ void MainWindow::updateActions() { const bool available = (!m_subtitles[0].isEmpty() || !m_subtitles[1].isEmpty()); - m_ui->actionSave->setEnabled(available); - m_ui->actionSaveAs->setEnabled(available); + m_ui->actionSave->setEnabled(available || isWindowModified()); + m_ui->actionSaveAs->setEnabled(available || isWindowModified()); m_ui->actionPrevious->setEnabled(available && m_subtitles[m_currentTrack].count() > 1); m_ui->actionNext->setEnabled(available && m_subtitles[m_currentTrack].count() > 1); m_ui->actionRemove->setEnabled(available); From afebfb1630c4de4a776b77259aad31f6fa0ce103 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Dutkiewicz?= Date: Tue, 20 Dec 2011 20:51:13 +0100 Subject: [PATCH 11/20] Store path without extension to fix some issues --- SubtitlesEditor.cpp | 19 +++++++------------ SubtitlesEditor.h | 2 +- 2 files changed, 8 insertions(+), 13 deletions(-) diff --git a/SubtitlesEditor.cpp b/SubtitlesEditor.cpp index 41836e2..9edd327 100644 --- a/SubtitlesEditor.cpp +++ b/SubtitlesEditor.cpp @@ -618,15 +618,11 @@ bool MainWindow::openFile(const QString &fileName) if (QFile::exists(txtfile)) { status = openSubtitles(txtfile, 1); - - m_currentPath = fileName; } if (QFile::exists(txafile)) { status = openSubtitles(txafile, 0); - - m_currentPath = fileName; } selectTrack(1); @@ -655,6 +651,7 @@ bool MainWindow::openSubtitles(const QString &fileName, int index) } setWindowModified(false); + m_subtitles[index].clear(); QTextStream textStream(&file); @@ -686,6 +683,8 @@ bool MainWindow::openSubtitles(const QString &fileName, int index) file.close(); + m_currentPath = fileName.left(fileName.indexOf('.')); + QString title = QFileInfo(fileName).fileName(); title = title.left(title.indexOf('.')); @@ -696,7 +695,7 @@ bool MainWindow::openSubtitles(const QString &fileName, int index) return true; } -bool MainWindow::saveSubtitles(QString fileName) +bool MainWindow::saveSubtitles(const QString &fileName) { for (int i = 1; i >= 0; --i) { @@ -705,16 +704,12 @@ bool MainWindow::saveSubtitles(QString fileName) continue; } - if (i == 0) - { - fileName = fileName.left(fileName.length() - 3) + "txa"; - } - - QFile file(fileName); + QString path = (fileName.endsWith(".txt")?fileName.left(fileName.indexOf(".txt")):fileName) + (i?".txt":".txa"); + QFile file(path); if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) { - QMessageBox::warning(this, tr("Error"), tr("Can not save subtitle file:\n%1").arg(fileName)); + QMessageBox::warning(this, tr("Error"), tr("Can not save subtitle file:\n%1").arg(path)); return false; } diff --git a/SubtitlesEditor.h b/SubtitlesEditor.h index eab7ba9..9d4fc18 100644 --- a/SubtitlesEditor.h +++ b/SubtitlesEditor.h @@ -83,7 +83,7 @@ public slots: QString timeToString(qint64 time); bool openFile(const QString &fileName); bool openSubtitles(const QString &fileName, int index); - bool saveSubtitles(QString fileName); + bool saveSubtitles(const QString &fileName); bool eventFilter(QObject *object, QEvent *event); private: From a959447ac3518ea02ba0ece5e68e2c85af396308 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Dutkiewicz?= Date: Tue, 20 Dec 2011 21:11:26 +0100 Subject: [PATCH 12/20] Some cleanups etc. --- SubtitlesEditor.cpp | 91 +++++++++++++++++++++++---------------------- SubtitlesEditor.h | 2 +- 2 files changed, 47 insertions(+), 46 deletions(-) diff --git a/SubtitlesEditor.cpp b/SubtitlesEditor.cpp index 9edd327..aaa804f 100644 --- a/SubtitlesEditor.cpp +++ b/SubtitlesEditor.cpp @@ -186,24 +186,6 @@ void MainWindow::closeEvent(QCloseEvent *event) event->accept(); } -void MainWindow::openMovie(const QString &fileName) -{ - QString title = QFileInfo(fileName).fileName(); - title = title.left(title.indexOf('.')); - - setWindowTitle(tr("%1 - %2[*]").arg("Subtitles Editor").arg(title)); - - m_fileNameLabel->setText(title); - m_timeLabel->setText(QString("00:00.0 / %1").arg(timeToString(m_mediaObject->totalTime()))); - - m_mediaObject->setCurrentSource(Phonon::MediaSource(fileName)); - - m_videoWidget->widget()->show(); - m_videoWidget->widget()->update(); - - m_ui->actionPlayPause->setEnabled(true); -} - void MainWindow::actionOpen() { if (isWindowModified() && QMessageBox::warning(this, tr("Question"), tr("Do you really want to close current subtitles without saving?"), QMessageBox::Yes | QMessageBox::No) == QMessageBox::No) @@ -213,7 +195,7 @@ void MainWindow::actionOpen() QString fileName = QFileDialog::getOpenFileName(this, tr("Open Video or Subtitle file"), QSettings().value("lastUsedDir", QDesktopServices::storageLocation(QDesktopServices::HomeLocation)).toString(), - tr("Video and subtitle files (*.txt *.og?)")); + tr("Video and subtitle files (*.txt *.txa *.og?)")); if (!fileName.isEmpty()) { @@ -590,43 +572,53 @@ QString MainWindow::timeToString(qint64 time) bool MainWindow::openFile(const QString &fileName) { const QString basename = fileName.left(fileName.length() - 3); - const QString oggfile = basename + "ogg"; - const QString ogmfile = basename + "ogm"; - const QString ogvfile = basename + "ogv"; - const QString txtfile = basename + "txt"; - const QString txafile = basename + "txa"; + const QString oggFile = basename + "ogg"; + const QString ogmFile = basename + "ogm"; + const QString ogvFile = basename + "ogv"; + const QString txtFile = basename + "txt"; + const QString txaFile = basename + "txa"; bool status = true; m_subtitles[0].clear(); m_subtitles[1].clear(); - if (QFile::exists(oggfile)) + if (QFile::exists(oggFile) && !openMovie(oggFile)) { - openMovie(oggfile); + status = false; } - if (QFile::exists(ogmfile)) + if (QFile::exists(ogmFile) && !openMovie(ogmFile)) { - openMovie(ogmfile); + status = false; } - if (QFile::exists(ogvfile)) + if (QFile::exists(ogvFile) && !openMovie(ogvFile)) { - openMovie(ogvfile); + status = false; } - if (QFile::exists(txtfile)) + if (QFile::exists(txaFile) && !openSubtitles(txaFile, 0)) { - status = openSubtitles(txtfile, 1); + status = false; } - if (QFile::exists(txafile)) + if (QFile::exists(txtFile) && !openSubtitles(txtFile, 1)) { - status = openSubtitles(txafile, 0); + status = false; } selectTrack(1); + m_currentPath = fileName.left(fileName.indexOf('.')); + + QString title = QFileInfo(fileName).fileName(); + title = title.left(title.indexOf('.')); + + m_fileNameLabel->setText(title); + + setWindowModified(false); + setWindowTitle(tr("%1 - %2[*]").arg("Subtitles Editor").arg(title)); + QFileInfo fileInfo(fileName); QStringList recentFiles = QSettings().value("recentFiles").toStringList(); recentFiles.removeAll(fileInfo.absoluteFilePath()); @@ -639,6 +631,26 @@ bool MainWindow::openFile(const QString &fileName) return status; } +bool MainWindow::openMovie(const QString &fileName) +{ + QString title = QFileInfo(fileName).fileName(); + title = title.left(title.indexOf('.')); + + setWindowTitle(tr("%1 - %2[*]").arg("Subtitles Editor").arg(title)); + + m_fileNameLabel->setText(title); + m_timeLabel->setText(QString("00:00.0 / %1").arg(timeToString(m_mediaObject->totalTime()))); + + m_mediaObject->setCurrentSource(Phonon::MediaSource(fileName)); + + m_videoWidget->widget()->show(); + m_videoWidget->widget()->update(); + + m_ui->actionPlayPause->setEnabled(true); + + return true; +} + bool MainWindow::openSubtitles(const QString &fileName, int index) { QFile file(fileName); @@ -650,8 +662,6 @@ bool MainWindow::openSubtitles(const QString &fileName, int index) return false; } - setWindowModified(false); - m_subtitles[index].clear(); QTextStream textStream(&file); @@ -683,15 +693,6 @@ bool MainWindow::openSubtitles(const QString &fileName, int index) file.close(); - m_currentPath = fileName.left(fileName.indexOf('.')); - - QString title = QFileInfo(fileName).fileName(); - title = title.left(title.indexOf('.')); - - m_fileNameLabel->setText(title); - - setWindowTitle(tr("%1 - %2[*]").arg("Subtitles Editor").arg(title)); - return true; } diff --git a/SubtitlesEditor.h b/SubtitlesEditor.h index 9d4fc18..4dca1fd 100644 --- a/SubtitlesEditor.h +++ b/SubtitlesEditor.h @@ -79,9 +79,9 @@ public slots: protected: void changeEvent(QEvent *event); void closeEvent(QCloseEvent *event); - void openMovie(const QString &filename); QString timeToString(qint64 time); bool openFile(const QString &fileName); + bool openMovie(const QString &filename); bool openSubtitles(const QString &fileName, int index); bool saveSubtitles(const QString &fileName); bool eventFilter(QObject *object, QEvent *event); From edbd90c8a53642eb53d8f7a3bfff97439b5c23d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Dutkiewicz?= Date: Tue, 20 Dec 2011 21:23:25 +0100 Subject: [PATCH 13/20] Fix saving --- SubtitlesEditor.cpp | 33 +++++++++++++++++++-------------- SubtitlesEditor.h | 2 +- 2 files changed, 20 insertions(+), 15 deletions(-) diff --git a/SubtitlesEditor.cpp b/SubtitlesEditor.cpp index aaa804f..3d5a0a4 100644 --- a/SubtitlesEditor.cpp +++ b/SubtitlesEditor.cpp @@ -271,7 +271,7 @@ void MainWindow::stateChanged(Phonon::State state) m_ui->actionPlayPause->setText(tr("Play")); m_ui->actionPlayPause->setIcon(QIcon::fromTheme("media-playback-play", style()->standardIcon(QStyle::SP_MediaPlay))); m_ui->actionStop->setEnabled(false); - m_timeLabel->setText(QString("00:00.0 / %1").arg(timeToString(m_mediaObject->totalTime()))); + m_timeLabel->setText(QString("00:00.0 / %1").arg(timeToString(m_mediaObject->totalTime(), true))); break; case Phonon::PlayingState: m_ui->actionPlayPause->setText(tr("Pause")); @@ -537,26 +537,31 @@ void MainWindow::updateRecentFilesMenu() m_ui->menuOpenRecent->setEnabled(recentFiles.count()); } -QString MainWindow::timeToString(qint64 time) +QString MainWindow::timeToString(qint64 time, bool readable) { QString string; int fractions = (time / 100); int seconds = (fractions / 10); - int minutes = (seconds / 60); + int minutes = 0; - if (minutes < 10) + if (readable) { - string.append('0'); - } + minutes = (seconds / 60); - string.append(QString::number(minutes)); - string.append(':'); + if (minutes < 10) + { + string.append('0'); + } - seconds = (seconds - (minutes * 60)); + string.append(QString::number(minutes)); + string.append(':'); - if (seconds < 10) - { - string.append('0'); + seconds = (seconds - (minutes * 60)); + + if (seconds < 10) + { + string.append('0'); + } } string.append(QString::number(seconds)); @@ -639,7 +644,7 @@ bool MainWindow::openMovie(const QString &fileName) setWindowTitle(tr("%1 - %2[*]").arg("Subtitles Editor").arg(title)); m_fileNameLabel->setText(title); - m_timeLabel->setText(QString("00:00.0 / %1").arg(timeToString(m_mediaObject->totalTime()))); + m_timeLabel->setText(QString("00:00.0 / %1").arg(timeToString(m_mediaObject->totalTime(), true))); m_mediaObject->setCurrentSource(Phonon::MediaSource(fileName)); @@ -719,7 +724,7 @@ bool MainWindow::saveSubtitles(const QString &fileName) for (int j = 0; j < m_subtitles[i].count(); ++j) { - textStream << QString("%1\t%2\t\t%3\t%4\t_(\"%5\")\n").arg(m_subtitles[i][j].position.x()).arg(m_subtitles[i][j].position.y()).arg(timeToString(m_subtitles[i][j].begin.msecsTo(QTime()))).arg(timeToString(m_subtitles[i][j].end.msecsTo(QTime()))).arg(m_subtitles[i][j].text); + textStream << QString("%1\t%2\t\t%3\t%4\t_(\"%5\")\n").arg(m_subtitles[i][j].position.x()).arg(m_subtitles[i][j].position.y()).arg(timeToString(QTime().msecsTo(m_subtitles[i][j].begin))).arg(timeToString(QTime().msecsTo(m_subtitles[i][j].end))).arg(m_subtitles[i][j].text); if ((j + 1) < m_subtitles[i].count() && m_subtitles[i][j].begin != m_subtitles[i][j + 1].begin) { diff --git a/SubtitlesEditor.h b/SubtitlesEditor.h index 4dca1fd..0853eb4 100644 --- a/SubtitlesEditor.h +++ b/SubtitlesEditor.h @@ -79,7 +79,7 @@ public slots: protected: void changeEvent(QEvent *event); void closeEvent(QCloseEvent *event); - QString timeToString(qint64 time); + QString timeToString(qint64 time, bool readable = false); bool openFile(const QString &fileName); bool openMovie(const QString &filename); bool openSubtitles(const QString &fileName, int index); From 78b389a0f115e212b65e3c42c7e9c046727c75be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Dutkiewicz?= Date: Tue, 20 Dec 2011 21:30:52 +0100 Subject: [PATCH 14/20] Do not keep pointers to labels --- SubtitlesEditor.cpp | 32 ++++++++++++++++++++------------ SubtitlesEditor.h | 7 ++++--- 2 files changed, 24 insertions(+), 15 deletions(-) diff --git a/SubtitlesEditor.cpp b/SubtitlesEditor.cpp index 3d5a0a4..a217fb8 100644 --- a/SubtitlesEditor.cpp +++ b/SubtitlesEditor.cpp @@ -23,6 +23,7 @@ #include +#include #include #include #include @@ -94,9 +95,9 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), m_ui->actionStop->setIcon(QIcon::fromTheme("media-playback-stop", style()->standardIcon(QStyle::SP_MediaStop))); m_ui->actionStop->setDisabled(true); - m_fileNameLabel = new QLabel(tr("No file loaded"), this); - m_fileNameLabel->setMaximumWidth(300); - m_timeLabel = new QLabel("00:00.0 / 00:00.0", this); + QLabel *timeLabel = new QLabel("00:00.0 / 00:00.0", this); + QLabel *fileNameLabel = new QLabel(tr("No file loaded"), this); + fileNameLabel->setMaximumWidth(300); m_ui->actionOpen->setIcon(QIcon::fromTheme("document-open", style()->standardIcon(QStyle::SP_DirOpenIcon))); m_ui->menuOpenRecent->setIcon(QIcon::fromTheme("document-open-recent")); @@ -118,8 +119,8 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), m_ui->nextButton->setDefaultAction(m_ui->actionNext); m_ui->seekSlider->setMediaObject(m_mediaObject); m_ui->volumeSlider->setAudioOutput(audioOutput); - m_ui->statusBar->addPermanentWidget(m_fileNameLabel); - m_ui->statusBar->addPermanentWidget(m_timeLabel); + m_ui->statusBar->addPermanentWidget(fileNameLabel); + m_ui->statusBar->addPermanentWidget(timeLabel); resize(QSettings().value("Window/size", size()).toSize()); move(QSettings().value("Window/position", pos()).toPoint()); @@ -127,6 +128,8 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), setWindowTitle(tr("%1 - Unnamed[*]").arg("Subtitles Editor")); updateVideo(); + connect(this, SIGNAL(fileChanged(QString)), fileNameLabel, SLOT(setText(QString))); + connect(this, SIGNAL(timeChanged(QString)), timeLabel, SLOT(setText(QString))); connect(m_ui->menuFile, SIGNAL(aboutToShow()), this, SLOT(updateRecentFilesMenu())); connect(m_ui->actionOpen, SIGNAL(triggered()), this, SLOT(actionOpen())); connect(m_ui->menuOpenRecent, SIGNAL(triggered(QAction*)), this, SLOT(actionOpenRecent(QAction*))); @@ -267,23 +270,28 @@ void MainWindow::stateChanged(Phonon::State state) } m_ui->actionPlayPause->setEnabled(false); + case Phonon::StoppedState: m_ui->actionPlayPause->setText(tr("Play")); m_ui->actionPlayPause->setIcon(QIcon::fromTheme("media-playback-play", style()->standardIcon(QStyle::SP_MediaPlay))); m_ui->actionStop->setEnabled(false); - m_timeLabel->setText(QString("00:00.0 / %1").arg(timeToString(m_mediaObject->totalTime(), true))); + + emit timeChanged(QString("00:00.0 / %1").arg(timeToString(m_mediaObject->totalTime(), true))); + break; case Phonon::PlayingState: m_ui->actionPlayPause->setText(tr("Pause")); m_ui->actionPlayPause->setEnabled(true); m_ui->actionPlayPause->setIcon(QIcon::fromTheme("media-playback-pause", style()->standardIcon(QStyle::SP_MediaPause))); m_ui->actionStop->setEnabled(true); + break; case Phonon::PausedState: m_ui->actionPlayPause->setText(tr("Play")); m_ui->actionPlayPause->setEnabled(true); m_ui->actionPlayPause->setIcon(QIcon::fromTheme("media-playback-play", style()->standardIcon(QStyle::SP_MediaPlay))); m_ui->actionStop->setEnabled(true); + break; default: break; @@ -302,12 +310,12 @@ void MainWindow::finished() void MainWindow::tick() { - m_timeLabel->setText(QString("%1 / %2").arg(timeToString(m_mediaObject->currentTime())).arg(timeToString(m_mediaObject->totalTime()))); - QString currentBottomSubtitles; QString currentTopSubtitles; const QTime currentTime = QTime().addMSecs(m_mediaObject->currentTime()); + emit timeChanged(QString("%1 / %2").arg(timeToString(m_mediaObject->currentTime())).arg(timeToString(m_mediaObject->totalTime()))); + for (int i = 0; i < m_subtitles[0].count(); ++i) { if (m_subtitles[0].at(i).begin < currentTime && m_subtitles[0].at(i).end > currentTime) @@ -619,7 +627,7 @@ bool MainWindow::openFile(const QString &fileName) QString title = QFileInfo(fileName).fileName(); title = title.left(title.indexOf('.')); - m_fileNameLabel->setText(title); + emit fileChanged(title); setWindowModified(false); setWindowTitle(tr("%1 - %2[*]").arg("Subtitles Editor").arg(title)); @@ -643,8 +651,8 @@ bool MainWindow::openMovie(const QString &fileName) setWindowTitle(tr("%1 - %2[*]").arg("Subtitles Editor").arg(title)); - m_fileNameLabel->setText(title); - m_timeLabel->setText(QString("00:00.0 / %1").arg(timeToString(m_mediaObject->totalTime(), true))); + emit fileChanged(title); + emit timeChanged(QString("00:00.0 / %1").arg(timeToString(m_mediaObject->totalTime(), true))); m_mediaObject->setCurrentSource(Phonon::MediaSource(fileName)); @@ -738,7 +746,7 @@ bool MainWindow::saveSubtitles(const QString &fileName) QString title = QFileInfo(fileName).fileName(); title = title.left(title.indexOf('.')); - m_fileNameLabel->setText(title); + emit fileChanged(title); setWindowTitle(tr("%1 - %2[*]").arg("Subtitles Editor").arg(title)); setWindowModified(false); diff --git a/SubtitlesEditor.h b/SubtitlesEditor.h index 0853eb4..4516d5f 100644 --- a/SubtitlesEditor.h +++ b/SubtitlesEditor.h @@ -23,7 +23,6 @@ #include -#include #include #include #include @@ -93,12 +92,14 @@ public slots: QGraphicsTextItem *m_subtitlesTopWidget; QGraphicsTextItem *m_subtitlesBottomWidget; QString m_currentPath; - QLabel *m_fileNameLabel; - QLabel *m_timeLabel; QList > m_subtitles; int m_currentSubtitle; int m_currentTrack; +signals: + void timeChanged(QString time); + void fileChanged(QString file); + }; #endif // SUBTITLESEDITOR_H From 1b5d6d53c67d829e30be318b700e924810f88dd0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Dutkiewicz?= Date: Tue, 20 Dec 2011 21:45:36 +0100 Subject: [PATCH 15/20] Better pathes handling --- SubtitlesEditor.cpp | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/SubtitlesEditor.cpp b/SubtitlesEditor.cpp index a217fb8..58d1ec2 100644 --- a/SubtitlesEditor.cpp +++ b/SubtitlesEditor.cpp @@ -584,12 +584,13 @@ QString MainWindow::timeToString(qint64 time, bool readable) bool MainWindow::openFile(const QString &fileName) { - const QString basename = fileName.left(fileName.length() - 3); - const QString oggFile = basename + "ogg"; - const QString ogmFile = basename + "ogm"; - const QString ogvFile = basename + "ogv"; - const QString txtFile = basename + "txt"; - const QString txaFile = basename + "txa"; + m_currentPath = fileName.left(fileName.lastIndexOf('.')); + + const QString oggFile = m_currentPath + ".ogg"; + const QString ogmFile = m_currentPath + ".ogm"; + const QString ogvFile = m_currentPath + ".ogv"; + const QString txtFile = m_currentPath + ".txt"; + const QString txaFile = m_currentPath + ".txa"; bool status = true; m_subtitles[0].clear(); @@ -622,8 +623,6 @@ bool MainWindow::openFile(const QString &fileName) selectTrack(1); - m_currentPath = fileName.left(fileName.indexOf('.')); - QString title = QFileInfo(fileName).fileName(); title = title.left(title.indexOf('.')); @@ -718,7 +717,7 @@ bool MainWindow::saveSubtitles(const QString &fileName) continue; } - QString path = (fileName.endsWith(".txt")?fileName.left(fileName.indexOf(".txt")):fileName) + (i?".txt":".txa"); + QString path = (fileName.contains(QRegExp("\\.(txt|txa|ogg|ogm|ogv)$", Qt::CaseInsensitive))?fileName.left(fileName.lastIndexOf('.')):fileName) + (i?".txt":".txa"); QFile file(path); if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) From e1e7f21f5ab47c88f6d6e468d988e493f7ea6d4c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Dutkiewicz?= Date: Sun, 19 Feb 2012 19:23:53 +0100 Subject: [PATCH 16/20] Minor menus change --- SubtitlesEditor.ui | 54 ++++++++++++++++++++++------------------------ 1 file changed, 26 insertions(+), 28 deletions(-) diff --git a/SubtitlesEditor.ui b/SubtitlesEditor.ui index 59edb46..b80d9dd 100644 --- a/SubtitlesEditor.ui +++ b/SubtitlesEditor.ui @@ -206,21 +206,22 @@ Recent Files - - - - - - - - - - + + + + + + + + + + + @@ -426,14 +427,6 @@ - - - Open... - - - Ctrl+O - - About Qt... @@ -521,21 +514,26 @@ Stop - - - - - - - - - - + + + + + + + + + + Clear List + + + Open... + + From 7d36251aae53775d8e29d2911b5ada3d7cfe9dfc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Dutkiewicz?= Date: Sun, 23 Jun 2013 21:57:39 +0200 Subject: [PATCH 17/20] Initial port to Qt5 --- SubtitlesEditor.pro | 16 +- .../SubtitlesEditor.cpp | 166 +++++++++--------- SubtitlesEditor.h => src/SubtitlesEditor.h | 54 +++--- SubtitlesEditor.ui => src/SubtitlesEditor.ui | 60 +++---- main.cpp => src/main.cpp | 4 +- 5 files changed, 142 insertions(+), 158 deletions(-) rename SubtitlesEditor.cpp => src/SubtitlesEditor.cpp (86%) rename SubtitlesEditor.h => src/SubtitlesEditor.h (80%) rename SubtitlesEditor.ui => src/SubtitlesEditor.ui (93%) rename main.cpp => src/main.cpp (94%) diff --git a/SubtitlesEditor.pro b/SubtitlesEditor.pro index 54d2911..7995dfc 100644 --- a/SubtitlesEditor.pro +++ b/SubtitlesEditor.pro @@ -1,14 +1,12 @@ # ------------------------------------------------- # Project created by QtCreator 2010-04-20T08:57:59 # ------------------------------------------------- -QT += phonon +QT += multimedia +QT += multimediawidgets +QT += widgets TARGET = SubtitlesEditor TEMPLATE = app -SOURCES += main.cpp \ - SubtitlesEditor.cpp -HEADERS += SubtitlesEditor.h -FORMS += SubtitlesEditor.ui - -UI_DIR = ui -MOC_DIR = moc -OBJECTS_DIR = obj +SOURCES += src/main.cpp \ + src/SubtitlesEditor.cpp +HEADERS += src/SubtitlesEditor.h +FORMS += src/SubtitlesEditor.ui diff --git a/SubtitlesEditor.cpp b/src/SubtitlesEditor.cpp similarity index 86% rename from SubtitlesEditor.cpp rename to src/SubtitlesEditor.cpp index 58d1ec2..2831e4c 100644 --- a/SubtitlesEditor.cpp +++ b/src/SubtitlesEditor.cpp @@ -1,6 +1,6 @@ /*********************************************************************************** -* Warzone 2100 Subtitles Editor. -* Copyright (C) 2010 - 2011 Michal Dutkiewicz aka Emdek +* Warzone 2100 Subtitles Editor +* Copyright (C) 2010 - 2013 Michal Dutkiewicz aka Emdek * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -19,45 +19,35 @@ ***********************************************************************************/ #include "SubtitlesEditor.h" + #include "ui_SubtitlesEditor.h" #include - -#include -#include -#include -#include -#include -#include -#include - -#include -#include +#include +#include +#include +#include +#include +#include +#include MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), m_ui(new Ui::MainWindow), - m_videoWidget(new QGraphicsProxyWidget()), + m_mediaPlayer(new QMediaPlayer(this)), + m_videoWidget(new QGraphicsVideoItem()), m_subtitlesTopWidget(new QGraphicsTextItem(m_videoWidget)), m_subtitlesBottomWidget(new QGraphicsTextItem(m_videoWidget)), m_currentSubtitle(0), m_currentTrack(0) { - m_subtitles.append(QList()); - m_subtitles.append(QList()); - m_ui->setupUi(this); - Phonon::VideoWidget *videoWidget = new Phonon::VideoWidget(); - Phonon::AudioOutput *audioOutput = new Phonon::AudioOutput(this); - audioOutput->setVolume(QSettings().value("volume", 0.8).toReal()); - - m_mediaObject = new Phonon::MediaObject(this); - m_mediaObject->setTickInterval(100); - - Phonon::createPath(m_mediaObject, videoWidget); - Phonon::createPath(m_mediaObject, audioOutput); + m_subtitles.append(QList()); + m_subtitles.append(QList()); - m_videoWidget->setWidget(videoWidget); + m_mediaPlayer->setVolume(QSettings().value("Player/volume", 80).toInt()); + m_mediaPlayer->setVideoOutput(m_videoWidget); + m_mediaPlayer->setNotifyInterval(100); QGraphicsDropShadowEffect *topShadowEffect = new QGraphicsDropShadowEffect(m_subtitlesTopWidget); topShadowEffect->setOffset(0, 0); @@ -117,10 +107,9 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), m_ui->removeButton->setDefaultAction(m_ui->actionRemove); m_ui->previousButton->setDefaultAction(m_ui->actionPrevious); m_ui->nextButton->setDefaultAction(m_ui->actionNext); - m_ui->seekSlider->setMediaObject(m_mediaObject); - m_ui->volumeSlider->setAudioOutput(audioOutput); m_ui->statusBar->addPermanentWidget(fileNameLabel); m_ui->statusBar->addPermanentWidget(timeLabel); + m_ui->volumeSlider->setValue(m_mediaPlayer->volume()); resize(QSettings().value("Window/size", size()).toSize()); move(QSettings().value("Window/position", pos()).toPoint()); @@ -143,13 +132,16 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), connect(m_ui->actionNext, SIGNAL(triggered()), this, SLOT(nextSubtitle())); connect(m_ui->actionRescale, SIGNAL(triggered()), this, SLOT(rescaleSubtitles())); connect(m_ui->actionPlayPause, SIGNAL(triggered()), this, SLOT(playPause())); - connect(m_ui->actionStop, SIGNAL(triggered()), m_mediaObject, SLOT(stop())); + connect(m_ui->actionStop, SIGNAL(triggered()), m_mediaPlayer, SLOT(stop())); connect(m_ui->actionAboutQt, SIGNAL(triggered()), QApplication::instance(), SLOT(aboutQt())); connect(m_ui->actionAboutApplication, SIGNAL(triggered()), this, SLOT(actionAboutApplication())); + connect(m_ui->seekSlider, SIGNAL(sliderMoved(int)), this, SLOT(seek(int))); + connect(m_ui->volumeSlider, SIGNAL(sliderMoved(int)), m_mediaPlayer, SLOT(setVolume(int))); connect(tabBar, SIGNAL(currentChanged(int)), this, SLOT(selectTrack(int))); - connect(m_mediaObject, SIGNAL(stateChanged(Phonon::State,Phonon::State)), this, SLOT(stateChanged(Phonon::State))); - connect(m_mediaObject, SIGNAL(tick(qint64)), this, SLOT(tick())); - connect(m_mediaObject, SIGNAL(finished()), this, SLOT(finished())); + connect(m_mediaPlayer, SIGNAL(error(QMediaPlayer::Error)), this, SLOT(errorOccured(QMediaPlayer::Error))); + connect(m_mediaPlayer, SIGNAL(stateChanged(QMediaPlayer::State)), this, SLOT(stateChanged(QMediaPlayer::State))); + connect(m_mediaPlayer, SIGNAL(durationChanged(qint64)), this, SLOT(durationChanged(qint64))); + connect(m_mediaPlayer, SIGNAL(positionChanged(qint64)), this, SLOT(positionChanged(qint64))); } MainWindow::~MainWindow() @@ -165,6 +157,7 @@ void MainWindow::changeEvent(QEvent *event) { case QEvent::LanguageChange: m_ui->retranslateUi(this); + break; default: break; @@ -184,7 +177,7 @@ void MainWindow::closeEvent(QCloseEvent *event) settings.setValue("Window/size", size()); settings.setValue("Window/position", pos()); settings.setValue("Window/state", saveState()); - settings.setValue("volume", m_ui->volumeSlider->audioOutput()->volume()); + settings.setValue("Player/volume", m_mediaPlayer->volume()); event->accept(); } @@ -196,9 +189,7 @@ void MainWindow::actionOpen() return; } - QString fileName = QFileDialog::getOpenFileName(this, tr("Open Video or Subtitle file"), - QSettings().value("lastUsedDir", QDesktopServices::storageLocation(QDesktopServices::HomeLocation)).toString(), - tr("Video and subtitle files (*.txt *.txa *.og?)")); + QString fileName = QFileDialog::getOpenFileName(this, tr("Open Video or Subtitle file"), QSettings().value("lastUsedDir", QStandardPaths::standardLocations(QStandardPaths::HomeLocation).first()).toString(), tr("Video and subtitle files (*.txt *.txa *.og?)")); if (!fileName.isEmpty()) { @@ -236,7 +227,7 @@ void MainWindow::actionSave() void MainWindow::actionSaveAs() { - QString fileName = QFileDialog::getSaveFileName(this, tr("Save Subtitle file"), (m_currentPath.isEmpty()?QDesktopServices::storageLocation(QDesktopServices::HomeLocation):QFileInfo(m_currentPath).dir().path())); + QString fileName = QFileDialog::getSaveFileName(this, tr("Save Subtitle file"), (m_currentPath.isEmpty() ? QStandardPaths::standardLocations(QStandardPaths::HomeLocation).first() : QFileInfo(m_currentPath).dir().path())); if (!fileName.isEmpty() && saveSubtitles(fileName)) { @@ -252,41 +243,43 @@ void MainWindow::actionSaveAs() void MainWindow::actionAboutApplication() { - QMessageBox::about(this, tr("About Subtitles Editor"), QString(tr("Subtitles Editor %1
Subtitles previewer and editor for Warzone 2100.").arg(QApplication::instance()->applicationVersion()))); + QMessageBox::about(this, tr("About Subtitles Editor"), QString(tr("Subtitles Editor %1
Subtitles previewer and editor for Warzone 2100.").arg(QApplication::instance()->applicationVersion()))); } -void MainWindow::stateChanged(Phonon::State state) +void MainWindow::errorOccured(QMediaPlayer::Error error) { - switch (state) - { - case Phonon::ErrorState: - if (m_mediaObject->errorType() == Phonon::FatalError) - { - QMessageBox::warning(this, tr("Fatal Error"), m_mediaObject->errorString()); - } - else - { - QMessageBox::warning(this, tr("Error"), m_mediaObject->errorString()); - } + Q_UNUSED(error) - m_ui->actionPlayPause->setEnabled(false); + QMessageBox::warning(this, tr("Error"), m_mediaPlayer->errorString()); +} - case Phonon::StoppedState: +void MainWindow::stateChanged(QMediaPlayer::State state) +{ + switch (state) + { + case QMediaPlayer::StoppedState: m_ui->actionPlayPause->setText(tr("Play")); m_ui->actionPlayPause->setIcon(QIcon::fromTheme("media-playback-play", style()->standardIcon(QStyle::SP_MediaPlay))); m_ui->actionStop->setEnabled(false); + m_ui->seekSlider->setValue(0); + m_ui->seekSlider->setRange(0, 0); + m_subtitlesTopWidget->setHtml(QString()); + m_subtitlesBottomWidget->setHtml(QString()); + m_videoWidget->hide(); - emit timeChanged(QString("00:00.0 / %1").arg(timeToString(m_mediaObject->totalTime(), true))); + emit timeChanged(QString("00:00.0 / %1").arg(timeToString(m_mediaPlayer->duration(), true))); break; - case Phonon::PlayingState: + case QMediaPlayer::PlayingState: m_ui->actionPlayPause->setText(tr("Pause")); m_ui->actionPlayPause->setEnabled(true); m_ui->actionPlayPause->setIcon(QIcon::fromTheme("media-playback-pause", style()->standardIcon(QStyle::SP_MediaPause))); m_ui->actionStop->setEnabled(true); + m_ui->seekSlider->setRange(0, m_mediaPlayer->duration()); + m_videoWidget->show(); break; - case Phonon::PausedState: + case QMediaPlayer::PausedState: m_ui->actionPlayPause->setText(tr("Play")); m_ui->actionPlayPause->setEnabled(true); m_ui->actionPlayPause->setIcon(QIcon::fromTheme("media-playback-play", style()->standardIcon(QStyle::SP_MediaPlay))); @@ -298,30 +291,27 @@ void MainWindow::stateChanged(Phonon::State state) } } -void MainWindow::finished() +void MainWindow::durationChanged(qint64 duration) { - m_mediaObject->stop(); - - m_videoWidget->widget()->show(); - m_videoWidget->widget()->update(); - m_subtitlesTopWidget->setHtml(QString()); - m_subtitlesBottomWidget->setHtml(QString()); + m_ui->seekSlider->setRange(0, duration); } -void MainWindow::tick() +void MainWindow::positionChanged(qint64 position) { + m_ui->seekSlider->setValue(position); + QString currentBottomSubtitles; QString currentTopSubtitles; - const QTime currentTime = QTime().addMSecs(m_mediaObject->currentTime()); + const QTime currentTime = QTime().addMSecs(m_mediaPlayer->position()); - emit timeChanged(QString("%1 / %2").arg(timeToString(m_mediaObject->currentTime())).arg(timeToString(m_mediaObject->totalTime()))); + emit timeChanged(QString("%1 / %2").arg(timeToString(m_mediaPlayer->position())).arg(timeToString(m_mediaPlayer->duration()))); for (int i = 0; i < m_subtitles[0].count(); ++i) { if (m_subtitles[0].at(i).begin < currentTime && m_subtitles[0].at(i).end > currentTime) { currentTopSubtitles.append(m_subtitles[0].at(i).text); - currentTopSubtitles.append("
"); + currentTopSubtitles.append("
"); } } @@ -330,7 +320,7 @@ void MainWindow::tick() if (m_subtitles[1].at(i).begin < currentTime && m_subtitles[1].at(i).end > currentTime) { currentBottomSubtitles.append(m_subtitles[1].at(i).text); - currentBottomSubtitles.append("
"); + currentBottomSubtitles.append("
"); m_currentSubtitle = i; } @@ -344,6 +334,23 @@ void MainWindow::tick() updateVideo(); } +void MainWindow::playPause() +{ + if (m_mediaPlayer->state() == QMediaPlayer::PlayingState) + { + m_mediaPlayer->pause(); + } + else + { + m_mediaPlayer->play(); + } +} + +void MainWindow::seek(int position) +{ + m_mediaPlayer->setPosition(position); +} + void MainWindow::selectTrack(int track) { m_currentSubtitle = 0; @@ -484,21 +491,9 @@ void MainWindow::rescaleSubtitles() selectSubtitle(); } -void MainWindow::playPause() -{ - if (m_mediaObject->state() == Phonon::PlayingState) - { - m_mediaObject->pause(); - } - else - { - m_mediaObject->play(); - } -} - void MainWindow::updateVideo() { - m_videoWidget->resize(m_ui->graphicsView->size()); + m_videoWidget->setSize(m_ui->graphicsView->size()); m_ui->graphicsView->centerOn(m_videoWidget); m_ui->graphicsView->scene()->setSceneRect(m_ui->graphicsView->rect()); @@ -651,12 +646,9 @@ bool MainWindow::openMovie(const QString &fileName) setWindowTitle(tr("%1 - %2[*]").arg("Subtitles Editor").arg(title)); emit fileChanged(title); - emit timeChanged(QString("00:00.0 / %1").arg(timeToString(m_mediaObject->totalTime(), true))); - - m_mediaObject->setCurrentSource(Phonon::MediaSource(fileName)); + emit timeChanged(QString("00:00.0 / %1").arg(timeToString(m_mediaPlayer->duration(), true))); - m_videoWidget->widget()->show(); - m_videoWidget->widget()->update(); + m_mediaPlayer->setMedia(QUrl::fromLocalFile(fileName)); m_ui->actionPlayPause->setEnabled(true); @@ -717,7 +709,7 @@ bool MainWindow::saveSubtitles(const QString &fileName) continue; } - QString path = (fileName.contains(QRegExp("\\.(txt|txa|ogg|ogm|ogv)$", Qt::CaseInsensitive))?fileName.left(fileName.lastIndexOf('.')):fileName) + (i?".txt":".txa"); + QString path = (fileName.contains(QRegExp("\\.(txt|txa|ogg|ogm|ogv)$", Qt::CaseInsensitive)) ? fileName.left(fileName.lastIndexOf('.')) : fileName) + (i ? ".txt" : ".txa"); QFile file(path); if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) diff --git a/SubtitlesEditor.h b/src/SubtitlesEditor.h similarity index 80% rename from SubtitlesEditor.h rename to src/SubtitlesEditor.h index 4516d5f..d60ecea 100644 --- a/SubtitlesEditor.h +++ b/src/SubtitlesEditor.h @@ -1,6 +1,6 @@ /*********************************************************************************** -* Warzone 2100 Subtitles Editor. -* Copyright (C) 2010 - 2011 Michal Dutkiewicz aka Emdek +* Warzone 2100 Subtitles Editor +* Copyright (C) 2010 - 2013 Michal Dutkiewicz aka Emdek * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -22,12 +22,10 @@ #define SUBTITLESEDITOR_H #include - -#include -#include -#include - -#include +#include +#include +#include +#include namespace Ui { @@ -49,19 +47,32 @@ class MainWindow : public QMainWindow Q_OBJECT public: - MainWindow(QWidget *parent = 0); + MainWindow(QWidget *parent = NULL); ~MainWindow(); -public slots: +protected: + void changeEvent(QEvent *event); + void closeEvent(QCloseEvent *event); + QString timeToString(qint64 time, bool readable = false); + bool openFile(const QString &fileName); + bool openMovie(const QString &filename); + bool openSubtitles(const QString &fileName, int index); + bool saveSubtitles(const QString &fileName); + bool eventFilter(QObject *object, QEvent *event); + +protected slots: void actionOpen(); void actionOpenRecent(QAction *action); void actionClearRecentFiles(); void actionSave(); void actionSaveAs(); void actionAboutApplication(); - void stateChanged(Phonon::State state); - void finished(); - void tick(); + void errorOccured(QMediaPlayer::Error error); + void stateChanged(QMediaPlayer::State state); + void durationChanged(qint64 duration); + void positionChanged(qint64 position); + void playPause(); + void seek(int position); void selectTrack(int track); void addSubtitle(); void removeSubtitle(); @@ -70,25 +81,14 @@ public slots: void selectSubtitle(); void updateSubtitle(); void rescaleSubtitles(); - void playPause(); void updateVideo(); void updateActions(); void updateRecentFilesMenu(); -protected: - void changeEvent(QEvent *event); - void closeEvent(QCloseEvent *event); - QString timeToString(qint64 time, bool readable = false); - bool openFile(const QString &fileName); - bool openMovie(const QString &filename); - bool openSubtitles(const QString &fileName, int index); - bool saveSubtitles(const QString &fileName); - bool eventFilter(QObject *object, QEvent *event); - private: Ui::MainWindow *m_ui; - Phonon::MediaObject *m_mediaObject; - QGraphicsProxyWidget *m_videoWidget; + QMediaPlayer *m_mediaPlayer; + QGraphicsVideoItem *m_videoWidget; QGraphicsTextItem *m_subtitlesTopWidget; QGraphicsTextItem *m_subtitlesBottomWidget; QString m_currentPath; @@ -102,4 +102,4 @@ public slots: }; -#endif // SUBTITLESEDITOR_H +#endif diff --git a/SubtitlesEditor.ui b/src/SubtitlesEditor.ui similarity index 93% rename from SubtitlesEditor.ui rename to src/SubtitlesEditor.ui index b80d9dd..b838234 100644 --- a/SubtitlesEditor.ui +++ b/src/SubtitlesEditor.ui @@ -136,6 +136,16 @@ + + + + 0 + + + Qt::Horizontal + + + @@ -157,31 +167,18 @@ - + - + 0 0 - - false + + 100 - - - - - - - 0 - 0 - - - - - 200 - 16777215 - + + Qt::Horizontal @@ -195,7 +192,7 @@ 0 0 648 - 25 + 24 @@ -271,7 +268,16 @@ 0 - + + 0 + + + 0 + + + 0 + + 0 @@ -536,18 +542,6 @@
- - - Phonon::SeekSlider - QWidget -
phonon/seekslider.h
-
- - Phonon::VolumeSlider - QWidget -
phonon/volumeslider.h
-
-
diff --git a/main.cpp b/src/main.cpp similarity index 94% rename from main.cpp rename to src/main.cpp index 6e9a3ea..a4fbe92 100644 --- a/main.cpp +++ b/src/main.cpp @@ -20,13 +20,13 @@ #include "SubtitlesEditor.h" -#include +#include int main(int argc, char *argv[]) { QApplication application(argc, argv); application.setApplicationName("WZSubtitlesEditor"); - application.setApplicationVersion("1.0"); + application.setApplicationVersion("1.1"); application.setOrganizationName("Warzone2100"); application.setOrganizationDomain("wz2100.net"); From 15d1a665b885e90595bd701f48025a7d2b2073ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Dutkiewicz?= Date: Sun, 23 Jun 2013 22:01:57 +0200 Subject: [PATCH 18/20] Nicer values for status bar --- src/SubtitlesEditor.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/SubtitlesEditor.cpp b/src/SubtitlesEditor.cpp index 2831e4c..23bccde 100644 --- a/src/SubtitlesEditor.cpp +++ b/src/SubtitlesEditor.cpp @@ -304,7 +304,7 @@ void MainWindow::positionChanged(qint64 position) QString currentTopSubtitles; const QTime currentTime = QTime().addMSecs(m_mediaPlayer->position()); - emit timeChanged(QString("%1 / %2").arg(timeToString(m_mediaPlayer->position())).arg(timeToString(m_mediaPlayer->duration()))); + emit timeChanged(QString("%1 / %2").arg(timeToString(m_mediaPlayer->position(), true)).arg(timeToString(m_mediaPlayer->duration(), true))); for (int i = 0; i < m_subtitles[0].count(); ++i) { From 27f67c2a6e27ee2dc873240bb236c05979588676 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Dutkiewicz?= Date: Sun, 23 Jun 2013 22:52:02 +0200 Subject: [PATCH 19/20] Use another QTime constructor --- src/SubtitlesEditor.cpp | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/SubtitlesEditor.cpp b/src/SubtitlesEditor.cpp index 23bccde..988d846 100644 --- a/src/SubtitlesEditor.cpp +++ b/src/SubtitlesEditor.cpp @@ -302,7 +302,7 @@ void MainWindow::positionChanged(qint64 position) QString currentBottomSubtitles; QString currentTopSubtitles; - const QTime currentTime = QTime().addMSecs(m_mediaPlayer->position()); + const QTime currentTime = QTime(0, 0, 0).addMSecs(m_mediaPlayer->position()); emit timeChanged(QString("%1 / %2").arg(timeToString(m_mediaPlayer->position(), true)).arg(timeToString(m_mediaPlayer->duration(), true))); @@ -433,15 +433,15 @@ void MainWindow::selectSubtitle() { m_ui->subtitleTextEdit->setPlainText(m_subtitles[m_currentTrack].at(m_currentSubtitle).text); m_ui->beginTimeEdit->setTime(m_subtitles[m_currentTrack].at(m_currentSubtitle).begin); - m_ui->lengthTimeEdit->setTime(QTime().addMSecs(m_subtitles[m_currentTrack].at(m_currentSubtitle).begin.msecsTo(m_subtitles[m_currentTrack].at(m_currentSubtitle).end))); + m_ui->lengthTimeEdit->setTime(QTime(0, 0, 0).addMSecs(m_subtitles[m_currentTrack].at(m_currentSubtitle).begin.msecsTo(m_subtitles[m_currentTrack].at(m_currentSubtitle).end))); m_ui->xPositionSpinBox->setValue(m_subtitles[m_currentTrack].at(m_currentSubtitle).position.x()); m_ui->yPositionSpinBox->setValue(m_subtitles[m_currentTrack].at(m_currentSubtitle).position.y()); } else { m_ui->subtitleTextEdit->clear(); - m_ui->beginTimeEdit->setTime(QTime()); - m_ui->lengthTimeEdit->setTime(QTime()); + m_ui->beginTimeEdit->setTime(QTime(0, 0, 0)); + m_ui->lengthTimeEdit->setTime(QTime(0, 0, 0)); m_ui->xPositionSpinBox->setValue(0); m_ui->yPositionSpinBox->setValue(0); } @@ -465,7 +465,7 @@ void MainWindow::updateSubtitle() m_subtitles[m_currentTrack][m_currentSubtitle].text = m_ui->subtitleTextEdit->toPlainText(); m_subtitles[m_currentTrack][m_currentSubtitle].position = QPoint(m_ui->xPositionSpinBox->value(), m_ui->yPositionSpinBox->value()); m_subtitles[m_currentTrack][m_currentSubtitle].begin = m_ui->beginTimeEdit->time(); - m_subtitles[m_currentTrack][m_currentSubtitle].end = m_ui->beginTimeEdit->time().addMSecs(m_ui->lengthTimeEdit->time().msecsTo(QTime())); + m_subtitles[m_currentTrack][m_currentSubtitle].end = m_ui->beginTimeEdit->time().addMSecs(m_ui->lengthTimeEdit->time().msecsTo(QTime(0, 0, 0))); setWindowModified(true); updateActions(); @@ -478,14 +478,14 @@ void MainWindow::rescaleSubtitles() for (int i = 0; i < m_subtitles[0].count(); ++i) { - m_subtitles[0][i].begin = QTime().addMSecs(QTime().msecsTo(m_subtitles[0][i].begin) * scale); - m_subtitles[0][i].end = QTime().addMSecs(QTime().msecsTo(m_subtitles[0][i].end) * scale); + m_subtitles[0][i].begin = QTime(0, 0, 0).addMSecs(QTime(0, 0, 0).msecsTo(m_subtitles[0][i].begin) * scale); + m_subtitles[0][i].end = QTime(0, 0, 0).addMSecs(QTime(0, 0, 0).msecsTo(m_subtitles[0][i].end) * scale); } for (int i = 0; i < m_subtitles[1].count(); ++i) { - m_subtitles[1][i].begin = QTime().addMSecs(QTime().msecsTo(m_subtitles[1][i].begin) * scale); - m_subtitles[1][i].end = QTime().addMSecs(QTime().msecsTo(m_subtitles[1][i].end) * scale); + m_subtitles[1][i].begin = QTime(0, 0, 0).addMSecs(QTime(0, 0, 0).msecsTo(m_subtitles[1][i].begin) * scale); + m_subtitles[1][i].end = QTime(0, 0, 0).addMSecs(QTime(0, 0, 0).msecsTo(m_subtitles[1][i].end) * scale); } selectSubtitle(); @@ -687,8 +687,8 @@ bool MainWindow::openSubtitles(const QString &fileName, int index) Subtitle subtitle; subtitle.text = capturedTexts.value(5); - subtitle.begin = QTime().addMSecs(capturedTexts.value(3).toFloat() * 1000); - subtitle.end = QTime().addMSecs(capturedTexts.value(4).toFloat() * 1000); + subtitle.begin = QTime(0, 0, 0).addMSecs(capturedTexts.value(3).toFloat() * 1000); + subtitle.end = QTime(0, 0, 0).addMSecs(capturedTexts.value(4).toFloat() * 1000); subtitle.position = QPoint(capturedTexts.value(1).toInt(), capturedTexts.value(2).toInt()); m_subtitles[index].append(subtitle); @@ -723,7 +723,7 @@ bool MainWindow::saveSubtitles(const QString &fileName) for (int j = 0; j < m_subtitles[i].count(); ++j) { - textStream << QString("%1\t%2\t\t%3\t%4\t_(\"%5\")\n").arg(m_subtitles[i][j].position.x()).arg(m_subtitles[i][j].position.y()).arg(timeToString(QTime().msecsTo(m_subtitles[i][j].begin))).arg(timeToString(QTime().msecsTo(m_subtitles[i][j].end))).arg(m_subtitles[i][j].text); + textStream << QString("%1\t%2\t\t%3\t%4\t_(\"%5\")\n").arg(m_subtitles[i][j].position.x()).arg(m_subtitles[i][j].position.y()).arg(timeToString(QTime(0, 0, 0).msecsTo(m_subtitles[i][j].begin))).arg(timeToString(QTime(0, 0, 0).msecsTo(m_subtitles[i][j].end))).arg(m_subtitles[i][j].text); if ((j + 1) < m_subtitles[i].count() && m_subtitles[i][j].begin != m_subtitles[i][j + 1].begin) { From 8f9a503b8f0b3ad528566e09ea670e6ca9fc9247 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Dutkiewicz?= Date: Sun, 23 Jun 2013 22:54:24 +0200 Subject: [PATCH 20/20] Set minimum size for video view --- src/SubtitlesEditor.ui | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/SubtitlesEditor.ui b/src/SubtitlesEditor.ui index b838234..65e63e0 100644 --- a/src/SubtitlesEditor.ui +++ b/src/SubtitlesEditor.ui @@ -6,8 +6,8 @@ 0 0 - 648 - 818 + 394 + 503 @@ -29,6 +29,12 @@ + + + 300 + 200 + + @@ -191,7 +197,7 @@ 0 0 - 648 + 394 24