added playback speed and time lalbe
This commit is contained in:
parent
fed4560268
commit
be6b8984c0
@ -4504,87 +4504,127 @@ Login tokens expiration: %2</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/librssguard/gui/reusable/mediaplayer.cpp" line="167"/>
|
||||
<location filename="../src/librssguard/gui/reusable/mediaplayer.ui" line="35"/>
|
||||
<source>Play/pause</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/librssguard/gui/reusable/mediaplayer.ui" line="42"/>
|
||||
<source>Stop</source>
|
||||
<translation type="unfinished">Stop</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/librssguard/gui/reusable/mediaplayer.ui" line="49"/>
|
||||
<source>Speed</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/librssguard/gui/reusable/mediaplayer.ui" line="77"/>
|
||||
<source>Progress</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/librssguard/gui/reusable/mediaplayer.ui" line="87"/>
|
||||
<source>Duration</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/librssguard/gui/reusable/mediaplayer.ui" line="94"/>
|
||||
<source>Mute/unmute</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/librssguard/gui/reusable/mediaplayer.ui" line="107"/>
|
||||
<source>Volume</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/librssguard/gui/reusable/mediaplayer.ui" line="126"/>
|
||||
<source>Download</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/librssguard/gui/reusable/mediaplayer.cpp" line="199"/>
|
||||
<source>Cannot load media (missing codecs)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/librssguard/gui/reusable/mediaplayer.cpp" line="170"/>
|
||||
<location filename="../src/librssguard/gui/reusable/mediaplayer.cpp" line="202"/>
|
||||
<source>Unrecognized format</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/librssguard/gui/reusable/mediaplayer.cpp" line="173"/>
|
||||
<location filename="../src/librssguard/gui/reusable/mediaplayer.cpp" line="205"/>
|
||||
<source>Network problem</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/librssguard/gui/reusable/mediaplayer.cpp" line="176"/>
|
||||
<location filename="../src/librssguard/gui/reusable/mediaplayer.cpp" line="208"/>
|
||||
<source>Access denied</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/librssguard/gui/reusable/mediaplayer.cpp" line="180"/>
|
||||
<location filename="../src/librssguard/gui/reusable/mediaplayer.cpp" line="212"/>
|
||||
<source>Service is missing</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/librssguard/gui/reusable/mediaplayer.cpp" line="183"/>
|
||||
<location filename="../src/librssguard/gui/reusable/mediaplayer.cpp" line="215"/>
|
||||
<source>This is playlist</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/librssguard/gui/reusable/mediaplayer.cpp" line="187"/>
|
||||
<location filename="../src/librssguard/gui/reusable/mediaplayer.cpp" line="219"/>
|
||||
<source>No errors</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/librssguard/gui/reusable/mediaplayer.cpp" line="190"/>
|
||||
<location filename="../src/librssguard/gui/reusable/mediaplayer.cpp" line="222"/>
|
||||
<source>Unknown error</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/librssguard/gui/reusable/mediaplayer.cpp" line="205"/>
|
||||
<location filename="../src/librssguard/gui/reusable/mediaplayer.cpp" line="237"/>
|
||||
<source>No media</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/librssguard/gui/reusable/mediaplayer.cpp" line="208"/>
|
||||
<location filename="../src/librssguard/gui/reusable/mediaplayer.cpp" line="240"/>
|
||||
<source>Loading...</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/librssguard/gui/reusable/mediaplayer.cpp" line="211"/>
|
||||
<location filename="../src/librssguard/gui/reusable/mediaplayer.cpp" line="243"/>
|
||||
<source>Media loaded</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/librssguard/gui/reusable/mediaplayer.cpp" line="214"/>
|
||||
<location filename="../src/librssguard/gui/reusable/mediaplayer.cpp" line="246"/>
|
||||
<source>Media stalled</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/librssguard/gui/reusable/mediaplayer.cpp" line="217"/>
|
||||
<location filename="../src/librssguard/gui/reusable/mediaplayer.cpp" line="249"/>
|
||||
<source>Buffering...</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/librssguard/gui/reusable/mediaplayer.cpp" line="220"/>
|
||||
<location filename="../src/librssguard/gui/reusable/mediaplayer.cpp" line="252"/>
|
||||
<source>Loaded</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/librssguard/gui/reusable/mediaplayer.cpp" line="223"/>
|
||||
<location filename="../src/librssguard/gui/reusable/mediaplayer.cpp" line="255"/>
|
||||
<source>Ended</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/librssguard/gui/reusable/mediaplayer.cpp" line="226"/>
|
||||
<location filename="../src/librssguard/gui/reusable/mediaplayer.cpp" line="258"/>
|
||||
<source>Media is invalid</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/librssguard/gui/reusable/mediaplayer.cpp" line="229"/>
|
||||
<location filename="../src/librssguard/gui/reusable/mediaplayer.cpp" line="261"/>
|
||||
<source>Unknown</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
|
@ -82,6 +82,10 @@ void MediaPlayer::muteUnmute() {
|
||||
m_muted = !m_muted;
|
||||
}
|
||||
|
||||
void MediaPlayer::setSpeed(int speed) {
|
||||
m_player->setPlaybackRate(convertSpeed(speed));
|
||||
}
|
||||
|
||||
void MediaPlayer::setVolume(int volume) {
|
||||
#if QT_VERSION_MAJOR == 6
|
||||
m_player->audioOutput()->setVolume(convertSliderVolume(volume));
|
||||
@ -96,19 +100,36 @@ void MediaPlayer::seek(int position) {
|
||||
m_player->setPosition(convertSliderProgress(position));
|
||||
}
|
||||
|
||||
void MediaPlayer::onPlaybackRateChanged(qreal speed) {
|
||||
m_ui.m_spinSpeed->blockSignals(true);
|
||||
m_ui.m_spinSpeed->setValue(convertSpinSpeed(speed));
|
||||
m_ui.m_spinSpeed->blockSignals(false);
|
||||
}
|
||||
|
||||
void MediaPlayer::onDurationChanged(qint64 duration) {
|
||||
m_ui.m_slidProgress->blockSignals(true);
|
||||
m_ui.m_slidProgress->setMaximum(duration / 1000);
|
||||
m_ui.m_slidProgress->setMaximum(convertDuration(duration));
|
||||
m_ui.m_slidProgress->blockSignals(false);
|
||||
|
||||
updateTimeAndProgress(convertToSliderProgress(m_player->position()), convertDuration(duration));
|
||||
}
|
||||
|
||||
void MediaPlayer::onPositionChanged(qint64 position) {
|
||||
m_ui.m_slidProgress->blockSignals(true);
|
||||
m_ui.m_slidProgress->setValue(convertToSliderProgress(position));
|
||||
m_ui.m_slidProgress->blockSignals(false);
|
||||
|
||||
updateTimeAndProgress(convertToSliderProgress(position), convertDuration(m_player->duration()));
|
||||
}
|
||||
|
||||
void MediaPlayer::updateTimeAndProgress(int progress, int total) {
|
||||
m_ui.m_lblTime->setText(QSL("%1/%2").arg(QDateTime::fromSecsSinceEpoch(progress).toUTC().toString("hh:mm:ss"),
|
||||
QDateTime::fromSecsSinceEpoch(total).toUTC().toString("hh:mm:ss")));
|
||||
}
|
||||
|
||||
void MediaPlayer::onErrorOccurred(QMediaPlayer::Error error, const QString& error_string) {
|
||||
if (error_string.isEmpty()) {
|
||||
m_ui.m_lblStatus->setText(errorToString(error));
|
||||
}
|
||||
else {
|
||||
m_ui.m_lblStatus->setText(error_string);
|
||||
}
|
||||
QString err = error_string.isEmpty() ? errorToString(error) : error_string;
|
||||
m_ui.m_lblStatus->setStatus(WidgetWithStatus::StatusType::Error, err, err);
|
||||
}
|
||||
|
||||
void MediaPlayer::onAudioAvailable(bool available) {
|
||||
@ -121,7 +142,12 @@ void MediaPlayer::onVideoAvailable(bool available) {
|
||||
}
|
||||
|
||||
void MediaPlayer::onMediaStatusChanged(QMediaPlayer::MediaStatus status) {
|
||||
m_ui.m_lblStatus->setText(mediaStatusToString(status));
|
||||
QString st = mediaStatusToString(status);
|
||||
m_ui.m_lblStatus->setStatus(status == QMediaPlayer::MediaStatus::InvalidMedia
|
||||
? WidgetWithStatus::StatusType::Error
|
||||
: WidgetWithStatus::StatusType::Information,
|
||||
st,
|
||||
st);
|
||||
}
|
||||
|
||||
void MediaPlayer::onPlaybackStateChanged(QMediaPlayer::PLAYBACK_STATE state) {
|
||||
@ -143,16 +169,22 @@ void MediaPlayer::onPlaybackStateChanged(QMediaPlayer::PLAYBACK_STATE state) {
|
||||
}
|
||||
}
|
||||
|
||||
void MediaPlayer::onPositionChanged(qint64 position) {
|
||||
m_ui.m_slidProgress->blockSignals(true);
|
||||
m_ui.m_slidProgress->setValue(convertToSliderProgress(position));
|
||||
m_ui.m_slidProgress->blockSignals(false);
|
||||
}
|
||||
|
||||
int MediaPlayer::convertToSliderProgress(qint64 player_progress) const {
|
||||
return player_progress / 1000;
|
||||
}
|
||||
|
||||
int MediaPlayer::convertDuration(qint64 duration) const {
|
||||
return duration / 1000;
|
||||
}
|
||||
|
||||
qreal MediaPlayer::convertSpeed(int speed) const {
|
||||
return speed / 100.0;
|
||||
}
|
||||
|
||||
int MediaPlayer::convertSpinSpeed(qreal speed) const {
|
||||
return speed * 100;
|
||||
}
|
||||
|
||||
void MediaPlayer::onSeekableChanged(bool seekable) {
|
||||
m_ui.m_slidProgress->setEnabled(seekable);
|
||||
|
||||
@ -264,6 +296,7 @@ void MediaPlayer::createConnections() {
|
||||
connect(m_player, &QMediaPlayer::mediaStatusChanged, this, &MediaPlayer::onMediaStatusChanged);
|
||||
connect(m_player, &QMediaPlayer::positionChanged, this, &MediaPlayer::onPositionChanged);
|
||||
connect(m_player, &QMediaPlayer::seekableChanged, this, &MediaPlayer::onSeekableChanged);
|
||||
connect(m_player, &QMediaPlayer::playbackRateChanged, this, &MediaPlayer::onPlaybackRateChanged);
|
||||
|
||||
connect(m_ui.m_btnPlayPause, &PlainToolButton::clicked, this, &MediaPlayer::playPause);
|
||||
connect(m_ui.m_btnStop, &PlainToolButton::clicked, this, &MediaPlayer::stop);
|
||||
@ -271,4 +304,5 @@ void MediaPlayer::createConnections() {
|
||||
connect(m_ui.m_btnVolume, &PlainToolButton::clicked, this, &MediaPlayer::muteUnmute);
|
||||
connect(m_ui.m_slidVolume, &QSlider::valueChanged, this, &MediaPlayer::setVolume);
|
||||
connect(m_ui.m_slidProgress, &QSlider::valueChanged, this, &MediaPlayer::seek);
|
||||
connect(m_ui.m_spinSpeed, &QSpinBox::valueChanged, this, &MediaPlayer::setSpeed);
|
||||
}
|
||||
|
@ -36,6 +36,7 @@ class MediaPlayer : public TabContent {
|
||||
void stop();
|
||||
void download();
|
||||
void muteUnmute();
|
||||
void setSpeed(int speed);
|
||||
|
||||
// NOTE: Volume is from 0 to 100 taken directly from slider or
|
||||
// elsewhere.
|
||||
@ -45,14 +46,13 @@ class MediaPlayer : public TabContent {
|
||||
// for "int" data type, therefore we seek by second.
|
||||
void seek(int position);
|
||||
|
||||
void onPlaybackRateChanged(qreal speed);
|
||||
void onDurationChanged(qint64 duration);
|
||||
void onErrorOccurred(QMediaPlayer::Error error, const QString& error_string = {});
|
||||
void onAudioAvailable(bool available);
|
||||
void onVideoAvailable(bool available);
|
||||
void onMediaStatusChanged(QMediaPlayer::MediaStatus status);
|
||||
|
||||
void onPlaybackStateChanged(QMediaPlayer::PLAYBACK_STATE state);
|
||||
|
||||
void onPositionChanged(qint64 position);
|
||||
void onSeekableChanged(bool seekable);
|
||||
|
||||
@ -63,10 +63,14 @@ class MediaPlayer : public TabContent {
|
||||
float convertSliderVolume(int slider_volume) const;
|
||||
qint64 convertSliderProgress(int slider_progress) const;
|
||||
int convertToSliderProgress(qint64 player_progress) const;
|
||||
int convertDuration(qint64 duration) const;
|
||||
qreal convertSpeed(int speed) const;
|
||||
int convertSpinSpeed(qreal speed) const;
|
||||
|
||||
QString errorToString(QMediaPlayer::Error error) const;
|
||||
QString mediaStatusToString(QMediaPlayer::MediaStatus status) const;
|
||||
|
||||
void updateTimeAndProgress(int progress, int total);
|
||||
void setupIcons();
|
||||
void createConnections();
|
||||
|
||||
|
@ -27,26 +27,73 @@
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout">
|
||||
<item>
|
||||
<widget class="QLabel" name="m_lblStatus"/>
|
||||
<widget class="LabelWithStatus" name="m_lblStatus" native="true"/>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="PlainToolButton" name="m_btnPlayPause"/>
|
||||
<widget class="PlainToolButton" name="m_btnPlayPause">
|
||||
<property name="toolTip">
|
||||
<string>Play/pause</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="PlainToolButton" name="m_btnStop"/>
|
||||
<widget class="PlainToolButton" name="m_btnStop">
|
||||
<property name="toolTip">
|
||||
<string>Stop</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QSpinBox" name="m_spinSpeed">
|
||||
<property name="toolTip">
|
||||
<string>Speed</string>
|
||||
</property>
|
||||
<property name="accelerated">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="correctionMode">
|
||||
<enum>QAbstractSpinBox::CorrectToNearestValue</enum>
|
||||
</property>
|
||||
<property name="suffix">
|
||||
<string notr="true"> %</string>
|
||||
</property>
|
||||
<property name="minimum">
|
||||
<number>1</number>
|
||||
</property>
|
||||
<property name="maximum">
|
||||
<number>1000</number>
|
||||
</property>
|
||||
<property name="singleStep">
|
||||
<number>10</number>
|
||||
</property>
|
||||
<property name="value">
|
||||
<number>100</number>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QSlider" name="m_slidProgress">
|
||||
<property name="toolTip">
|
||||
<string>Progress</string>
|
||||
</property>
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLabel" name="m_lblTime"/>
|
||||
<widget class="QLabel" name="m_lblTime">
|
||||
<property name="toolTip">
|
||||
<string>Duration</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="PlainToolButton" name="m_btnVolume"/>
|
||||
<widget class="PlainToolButton" name="m_btnVolume">
|
||||
<property name="toolTip">
|
||||
<string>Mute/unmute</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QSlider" name="m_slidVolume">
|
||||
@ -56,6 +103,9 @@
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>Volume</string>
|
||||
</property>
|
||||
<property name="maximum">
|
||||
<number>100</number>
|
||||
</property>
|
||||
@ -71,7 +121,11 @@
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="PlainToolButton" name="m_btnDownload"/>
|
||||
<widget class="PlainToolButton" name="m_btnDownload">
|
||||
<property name="toolTip">
|
||||
<string>Download</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
@ -89,7 +143,22 @@
|
||||
<extends>QToolButton</extends>
|
||||
<header>plaintoolbutton.h</header>
|
||||
</customwidget>
|
||||
<customwidget>
|
||||
<class>LabelWithStatus</class>
|
||||
<extends>QWidget</extends>
|
||||
<header>labelwithstatus.h</header>
|
||||
<container>1</container>
|
||||
</customwidget>
|
||||
</customwidgets>
|
||||
<tabstops>
|
||||
<tabstop>m_btnPlayPause</tabstop>
|
||||
<tabstop>m_btnStop</tabstop>
|
||||
<tabstop>m_spinSpeed</tabstop>
|
||||
<tabstop>m_slidProgress</tabstop>
|
||||
<tabstop>m_btnVolume</tabstop>
|
||||
<tabstop>m_slidVolume</tabstop>
|
||||
<tabstop>m_btnDownload</tabstop>
|
||||
</tabstops>
|
||||
<resources/>
|
||||
<connections/>
|
||||
</ui>
|
||||
|
Loading…
x
Reference in New Issue
Block a user