Update audio player icons.
After Width: | Height: | Size: 284 B |
After Width: | Height: | Size: 410 B |
After Width: | Height: | Size: 593 B |
After Width: | Height: | Size: 314 B |
After Width: | Height: | Size: 524 B |
After Width: | Height: | Size: 736 B |
Before Width: | Height: | Size: 133 B |
Before Width: | Height: | Size: 197 B |
Before Width: | Height: | Size: 342 B |
After Width: | Height: | Size: 297 B |
After Width: | Height: | Size: 510 B |
After Width: | Height: | Size: 775 B |
After Width: | Height: | Size: 540 B |
After Width: | Height: | Size: 995 B |
After Width: | Height: | Size: 1.5 KiB |
After Width: | Height: | Size: 412 B |
After Width: | Height: | Size: 665 B |
After Width: | Height: | Size: 951 B |
After Width: | Height: | Size: 306 B |
After Width: | Height: | Size: 450 B |
After Width: | Height: | Size: 647 B |
Before Width: | Height: | Size: 219 B |
Before Width: | Height: | Size: 319 B |
Before Width: | Height: | Size: 554 B |
After Width: | Height: | Size: 314 B |
After Width: | Height: | Size: 527 B |
After Width: | Height: | Size: 772 B |
Before Width: | Height: | Size: 188 B |
Before Width: | Height: | Size: 297 B |
Before Width: | Height: | Size: 629 B |
Before Width: | Height: | Size: 349 B |
Before Width: | Height: | Size: 547 B |
Before Width: | Height: | Size: 825 B |
Before Width: | Height: | Size: 215 B After Width: | Height: | Size: 229 B |
Before Width: | Height: | Size: 400 B After Width: | Height: | Size: 306 B |
Before Width: | Height: | Size: 593 B After Width: | Height: | Size: 422 B |
Before Width: | Height: | Size: 362 B After Width: | Height: | Size: 298 B |
Before Width: | Height: | Size: 659 B After Width: | Height: | Size: 437 B |
Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 609 B |
Before Width: | Height: | Size: 211 B After Width: | Height: | Size: 396 B |
Before Width: | Height: | Size: 235 B After Width: | Height: | Size: 606 B |
Before Width: | Height: | Size: 303 B After Width: | Height: | Size: 1011 B |
Before Width: | Height: | Size: 262 B |
Before Width: | Height: | Size: 304 B |
Before Width: | Height: | Size: 377 B |
Before Width: | Height: | Size: 246 B |
Before Width: | Height: | Size: 301 B |
Before Width: | Height: | Size: 371 B |
Before Width: | Height: | Size: 269 B |
Before Width: | Height: | Size: 290 B |
Before Width: | Height: | Size: 387 B |
After Width: | Height: | Size: 449 B |
After Width: | Height: | Size: 731 B |
After Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 346 B After Width: | Height: | Size: 514 B |
Before Width: | Height: | Size: 537 B After Width: | Height: | Size: 924 B |
Before Width: | Height: | Size: 761 B After Width: | Height: | Size: 1.4 KiB |
Before Width: | Height: | Size: 129 B |
Before Width: | Height: | Size: 167 B |
Before Width: | Height: | Size: 362 B |
Before Width: | Height: | Size: 139 B |
Before Width: | Height: | Size: 217 B |
Before Width: | Height: | Size: 478 B |
Before Width: | Height: | Size: 154 B |
Before Width: | Height: | Size: 226 B |
Before Width: | Height: | Size: 646 B |
Before Width: | Height: | Size: 157 B |
Before Width: | Height: | Size: 242 B |
Before Width: | Height: | Size: 875 B |
|
@ -29,12 +29,11 @@ mediaPlayerButton: MediaPlayerButton {
|
||||||
mediaPlayerButtonSize: size(25px, 30px);
|
mediaPlayerButtonSize: size(25px, 30px);
|
||||||
|
|
||||||
mediaPlayerButtonPosition: point(5px, 10px);
|
mediaPlayerButtonPosition: point(5px, 10px);
|
||||||
mediaPlayerSkipIconPosition: point(5px, 12px);
|
|
||||||
|
|
||||||
mediaPlayerHeight: 35px;
|
mediaPlayerHeight: 35px;
|
||||||
mediaPlayerPadding: 8px;
|
mediaPlayerPadding: 8px;
|
||||||
mediaPlayerNameTop: 22px;
|
mediaPlayerNameTop: 22px;
|
||||||
mediaPlayerPlayLeft: 7px;
|
mediaPlayerPlayLeft: 9px;
|
||||||
mediaPlayerPlaySkip: 1px;
|
mediaPlayerPlaySkip: 1px;
|
||||||
mediaPlayerPlayTop: 0px;
|
mediaPlayerPlayTop: 0px;
|
||||||
mediaPlayerCloseRight: 0px;
|
mediaPlayerCloseRight: 0px;
|
||||||
|
@ -47,61 +46,65 @@ mediaPlayerTime: LabelSimple(defaultLabelSimple) {
|
||||||
}
|
}
|
||||||
|
|
||||||
mediaPlayerRepeatButton: IconButton {
|
mediaPlayerRepeatButton: IconButton {
|
||||||
width: 31px;
|
width: 30px;
|
||||||
height: 30px;
|
height: 34px;
|
||||||
|
|
||||||
icon: icon {
|
icon: icon {
|
||||||
{ "player/player_repeat", mediaPlayerActiveFg, point(9px, 11px) }
|
{ "player/player_repeat", mediaPlayerActiveFg }
|
||||||
};
|
};
|
||||||
iconPosition: point(0px, 0px);
|
iconPosition: point(3px, 6px);
|
||||||
|
|
||||||
rippleAreaPosition: point(3px, 5px);
|
rippleAreaPosition: point(2px, 5px);
|
||||||
rippleAreaSize: 25px;
|
rippleAreaSize: 26px;
|
||||||
ripple: RippleAnimation(defaultRippleAnimation) {
|
ripple: RippleAnimation(defaultRippleAnimation) {
|
||||||
color: lightButtonBgOver;
|
color: lightButtonBgOver;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
mediaPlayerRepeatDisabledIcon: icon {
|
mediaPlayerRepeatDisabledIcon: icon {
|
||||||
{ "player/player_repeat", menuIconFg, point(9px, 11px)}
|
{ "player/player_repeat", menuIconFg }
|
||||||
};
|
};
|
||||||
mediaPlayerRepeatDisabledIconOver: icon {
|
mediaPlayerRepeatDisabledIconOver: icon {
|
||||||
{ "player/player_repeat", menuIconFgOver, point(9px, 11px)}
|
{ "player/player_repeat", menuIconFgOver }
|
||||||
};
|
};
|
||||||
mediaPlayerRepeatOneIcon: icon {
|
mediaPlayerRepeatOneIcon: icon {
|
||||||
{ "player/player_repeat_one", mediaPlayerActiveFg, point(9px, 11px)}
|
{ "player/player_repeat_single", mediaPlayerActiveFg }
|
||||||
};
|
};
|
||||||
mediaPlayerRepeatOneDisabledIcon: icon {
|
mediaPlayerRepeatOneDisabledIcon: icon {
|
||||||
{ "player/player_repeat_one", menuIconFg, point(9px, 11px)}
|
{ "player/player_repeat_single", menuIconFg }
|
||||||
};
|
};
|
||||||
mediaPlayerRepeatOneDisabledIconOver: icon {
|
mediaPlayerRepeatOneDisabledIconOver: icon {
|
||||||
{ "player/player_repeat_one", menuIconFgOver, point(9px, 11px)}
|
{ "player/player_repeat_single", menuIconFgOver }
|
||||||
};
|
};
|
||||||
mediaPlayerReverseIcon: icon {
|
mediaPlayerReverseIcon: icon {
|
||||||
{ "player/player_reverse", mediaPlayerActiveFg, point(9px, 11px)}
|
{ "player/player_order", mediaPlayerActiveFg }
|
||||||
};
|
};
|
||||||
mediaPlayerReverseDisabledIcon: icon {
|
mediaPlayerReverseDisabledIcon: icon {
|
||||||
{ "player/player_reverse", menuIconFg, point(9px, 11px)}
|
{ "player/player_order", menuIconFg }
|
||||||
};
|
};
|
||||||
mediaPlayerReverseDisabledIconOver: icon {
|
mediaPlayerReverseDisabledIconOver: icon {
|
||||||
{ "player/player_reverse", menuIconFgOver, point(9px, 11px)}
|
{ "player/player_order", menuIconFgOver }
|
||||||
};
|
};
|
||||||
mediaPlayerShuffleIcon: icon {
|
mediaPlayerShuffleIcon: icon {
|
||||||
{ "player/player_shuffle", mediaPlayerActiveFg, point(9px, 11px)}
|
{ "player/player_shuffle", mediaPlayerActiveFg }
|
||||||
};
|
|
||||||
mediaPlayerShuffleDisabledIcon: icon {
|
|
||||||
{ "player/player_shuffle", menuIconFg, point(9px, 11px)}
|
|
||||||
};
|
|
||||||
mediaPlayerShuffleDisabledIconOver: icon {
|
|
||||||
{ "player/player_shuffle", menuIconFgOver, point(9px, 11px)}
|
|
||||||
};
|
|
||||||
mediaPlayerRepeatReverseIcon: icon {
|
|
||||||
{ "player/player_repeat_reverse", mediaPlayerActiveFg, point(9px, 11px)}
|
|
||||||
};
|
|
||||||
mediaPlayerRepeatShuffleIcon: icon {
|
|
||||||
{ "player/player_repeat_shuffle", mediaPlayerActiveFg, point(9px, 11px)}
|
|
||||||
};
|
};
|
||||||
mediaPlayerRepeatDisabledRippleBg: windowBgOver;
|
mediaPlayerRepeatDisabledRippleBg: windowBgOver;
|
||||||
|
|
||||||
|
mediaPlayerPlayButton: IconButton(mediaPlayerRepeatButton) {
|
||||||
|
width: 24px;
|
||||||
|
icon: icon{
|
||||||
|
{ "player/player_play", mediaPlayerActiveFg }
|
||||||
|
};
|
||||||
|
iconPosition: point(0px, 5px);
|
||||||
|
rippleAreaPosition: point(0px, 5px);
|
||||||
|
rippleAreaSize: 24px;
|
||||||
|
}
|
||||||
|
mediaPlayerPauseIcon: icon{
|
||||||
|
{ "player/player_pause", mediaPlayerActiveFg }
|
||||||
|
};
|
||||||
|
mediaPlayerCancelIcon: icon{
|
||||||
|
{ "player/panel_close", mediaPlayerActiveFg }
|
||||||
|
};
|
||||||
|
|
||||||
mediaPlayerSpeedButton: IconButton {
|
mediaPlayerSpeedButton: IconButton {
|
||||||
width: 31px;
|
width: 31px;
|
||||||
height: 30px;
|
height: 30px;
|
||||||
|
@ -152,66 +155,52 @@ mediaPlayerPopupMenu: PopupMenu(defaultPopupMenu) {
|
||||||
mediaPlayerMenuCheck: icon {{ "player/player_check", mediaPlayerActiveFg }};
|
mediaPlayerMenuCheck: icon {{ "player/player_check", mediaPlayerActiveFg }};
|
||||||
|
|
||||||
mediaPlayerVolumeIcon0: icon {
|
mediaPlayerVolumeIcon0: icon {
|
||||||
{ "player/player_volume0", mediaPlayerActiveFg },
|
{ "player/player_mini_off", mediaPlayerActiveFg },
|
||||||
};
|
};
|
||||||
mediaPlayerVolumeIcon1: icon {
|
mediaPlayerVolumeIcon1: icon {
|
||||||
{ "player/player_volume1", mediaPlayerActiveFg },
|
{ "player/player_mini_half", mediaPlayerActiveFg },
|
||||||
};
|
};
|
||||||
mediaPlayerVolumeIcon2: icon {
|
mediaPlayerVolumeToggle: IconButton(mediaPlayerRepeatButton) {
|
||||||
{ "player/player_volume2", mediaPlayerActiveFg },
|
width: 34px;
|
||||||
};
|
icon: icon {
|
||||||
mediaPlayerVolumeIcon3: icon {
|
{ "player/player_mini_full", mediaPlayerActiveFg },
|
||||||
{ "player/player_volume3", mediaPlayerActiveFg },
|
};
|
||||||
};
|
iconPosition: point(5px, 6px);
|
||||||
mediaPlayerVolumeToggle: IconButton {
|
rippleAreaPosition: point(4px, 5px);
|
||||||
width: 31px;
|
|
||||||
height: 30px;
|
|
||||||
|
|
||||||
icon: mediaPlayerVolumeIcon0;
|
|
||||||
iconPosition: point(8px, 11px);
|
|
||||||
|
|
||||||
rippleAreaPosition: point(3px, 5px);
|
|
||||||
rippleAreaSize: 25px;
|
|
||||||
ripple: RippleAnimation(defaultRippleAnimation) {
|
|
||||||
color: lightButtonBgOver;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
mediaPlayerVolumeMargin: 10px;
|
mediaPlayerVolumeMargin: 10px;
|
||||||
mediaPlayerVolumeSize: size(27px, 100px);
|
mediaPlayerVolumeSize: size(27px, 100px);
|
||||||
|
|
||||||
mediaPlayerNextButton: IconButton(mediaPlayerRepeatButton) {
|
mediaPlayerNextButton: IconButton(mediaPlayerPlayButton) {
|
||||||
width: 25px;
|
|
||||||
icon: icon {
|
icon: icon {
|
||||||
{ "player/player_next", mediaPlayerActiveFg, mediaPlayerSkipIconPosition },
|
{ "player/player_forward", mediaPlayerActiveFg },
|
||||||
};
|
};
|
||||||
|
|
||||||
rippleAreaPosition: point(0px, 5px);
|
|
||||||
}
|
}
|
||||||
mediaPlayerNextDisabledIcon: icon {
|
mediaPlayerNextDisabledIcon: icon {
|
||||||
{ "player/player_next", mediaPlayerInactiveFg, mediaPlayerSkipIconPosition },
|
{ "player/player_forward", mediaPlayerInactiveFg },
|
||||||
};
|
};
|
||||||
mediaPlayerPreviousButton: IconButton(mediaPlayerNextButton) {
|
mediaPlayerPreviousButton: IconButton(mediaPlayerNextButton) {
|
||||||
icon: icon {
|
icon: icon {
|
||||||
{ "player/player_next-flip_horizontal", mediaPlayerActiveFg, mediaPlayerSkipIconPosition },
|
{ "player/player_backward", mediaPlayerActiveFg },
|
||||||
};
|
};
|
||||||
rippleAreaPosition: point(1px, 5px);
|
|
||||||
}
|
}
|
||||||
mediaPlayerPreviousDisabledIcon: icon {
|
mediaPlayerPreviousDisabledIcon: icon {
|
||||||
{ "player/player_next-flip_horizontal", mediaPlayerInactiveFg, mediaPlayerSkipIconPosition },
|
{ "player/player_backward", mediaPlayerInactiveFg },
|
||||||
};
|
};
|
||||||
|
|
||||||
touchBarIconPlayerClose: icon {{ "player/player_close", windowFg }};
|
touchBarIconPlayerClose: icon {{ "player/panel_close", windowFg }};
|
||||||
touchBarIconPlayerPlay: icon {{ "media_play", windowFg }};
|
touchBarIconPlayerPlay: icon {{ "media_play", windowFg }};
|
||||||
touchBarIconPlayerPause: icon {{ "media_pause", windowFg }};
|
touchBarIconPlayerPause: icon {{ "media_pause", windowFg }};
|
||||||
touchBarIconPlayerNext: icon {{ "player/player_next", windowFg }};
|
touchBarIconPlayerNext: icon {{ "player/player_forward", windowFg }};
|
||||||
touchBarIconPlayerPrevious: icon {{ "player/player_next-flip_horizontal", windowFg }};
|
touchBarIconPlayerPrevious: icon {{ "player/player_backward", windowFg }};
|
||||||
|
|
||||||
mediaPlayerClose: IconButton(mediaPlayerRepeatButton) {
|
mediaPlayerClose: IconButton(mediaPlayerRepeatButton) {
|
||||||
width: 37px;
|
width: 39px;
|
||||||
icon: icon {{ "player/player_close", menuIconFg, point(10px, 12px) }};
|
icon: icon {{ "player/panel_close", menuIconFg }};
|
||||||
iconOver: icon {{ "player/player_close", menuIconFgOver, point(10px, 12px) }};
|
iconOver: icon {{ "player/panel_close", menuIconFgOver }};
|
||||||
|
iconPosition: point(5px, 6px);
|
||||||
|
|
||||||
rippleAreaPosition: point(3px, 5px);
|
rippleAreaPosition: point(4px, 5px);
|
||||||
ripple: RippleAnimation(defaultRippleAnimation) {
|
ripple: RippleAnimation(defaultRippleAnimation) {
|
||||||
color: windowBgOver;
|
color: windowBgOver;
|
||||||
}
|
}
|
||||||
|
@ -245,25 +234,18 @@ mediaPlayerPanelMarginBottom: 10px;
|
||||||
mediaPlayerPanelWidth: 344px;
|
mediaPlayerPanelWidth: 344px;
|
||||||
mediaPlayerCoverHeight: 102px;
|
mediaPlayerCoverHeight: 102px;
|
||||||
|
|
||||||
mediaPlayerPanelClose: IconButton(mediaPlayerClose) {
|
|
||||||
width: 43px;
|
|
||||||
height: 28px;
|
|
||||||
icon: icon {{ "player/player_close", menuIconFg, point(16px, 14px) }};
|
|
||||||
iconOver: icon {{ "player/player_close", menuIconFgOver, point(16px, 14px) }};
|
|
||||||
}
|
|
||||||
|
|
||||||
mediaPlayerPanelNextButton: IconButton(mediaPlayerRepeatButton) {
|
mediaPlayerPanelNextButton: IconButton(mediaPlayerRepeatButton) {
|
||||||
width: 37px;
|
width: 37px;
|
||||||
icon: icon {{ "player/player_panel_next", mediaPlayerActiveFg, point(10px, 10px) }};
|
icon: icon {{ "player/player_forward", mediaPlayerActiveFg, point(6px, 4px) }};
|
||||||
}
|
}
|
||||||
mediaPlayerPanelNextDisabledIcon: icon {
|
mediaPlayerPanelNextDisabledIcon: icon {
|
||||||
{ "player/player_panel_next", mediaPlayerInactiveFg, point(10px, 10px) },
|
{ "player/player_forward", mediaPlayerInactiveFg, point(6px, 4px) },
|
||||||
};
|
};
|
||||||
mediaPlayerPanelPreviousButton: IconButton(mediaPlayerPanelNextButton) {
|
mediaPlayerPanelPreviousButton: IconButton(mediaPlayerPanelNextButton) {
|
||||||
icon: icon {{ "player/player_panel_next-flip_horizontal", mediaPlayerActiveFg, point(10px, 10px) }};
|
icon: icon {{ "player/player_backward", mediaPlayerActiveFg, point(6px, 4px) }};
|
||||||
}
|
}
|
||||||
mediaPlayerPanelPreviousDisabledIcon: icon {
|
mediaPlayerPanelPreviousDisabledIcon: icon {
|
||||||
{ "player/player_panel_next-flip_horizontal", mediaPlayerInactiveFg, point(10px, 10px) },
|
{ "player/player_backward", mediaPlayerInactiveFg, point(6px, 4px) },
|
||||||
};
|
};
|
||||||
|
|
||||||
mediaPlayerPanelPadding: 16px;
|
mediaPlayerPanelPadding: 16px;
|
||||||
|
|
|
@ -497,6 +497,7 @@ bool Instance::moveInPlaylist(
|
||||||
const auto jumpById = [&](FullMsgId id) {
|
const auto jumpById = [&](FullMsgId id) {
|
||||||
return jumpByItem(data->history->owner().message(id));
|
return jumpByItem(data->history->owner().message(id));
|
||||||
};
|
};
|
||||||
|
const auto repeatAll = (repeat(data) == RepeatMode::All);
|
||||||
|
|
||||||
if (order(data) == OrderMode::Shuffle) {
|
if (order(data) == OrderMode::Shuffle) {
|
||||||
const auto raw = data->shuffleData.get();
|
const auto raw = data->shuffleData.get();
|
||||||
|
@ -516,7 +517,7 @@ bool Instance::moveInPlaylist(
|
||||||
raw->nonPlayedIds.erase(i);
|
raw->nonPlayedIds.erase(i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (repeat(data) == RepeatMode::All) {
|
if (repeatAll) {
|
||||||
ensureShuffleMove(data, delta);
|
ensureShuffleMove(data, delta);
|
||||||
}
|
}
|
||||||
if (raw->nonPlayedIds.empty()
|
if (raw->nonPlayedIds.empty()
|
||||||
|
@ -544,7 +545,8 @@ bool Instance::moveInPlaylist(
|
||||||
|
|
||||||
const auto newIndex = *data->playlistIndex
|
const auto newIndex = *data->playlistIndex
|
||||||
+ (order(data) == OrderMode::Reverse ? -delta : delta);
|
+ (order(data) == OrderMode::Reverse ? -delta : delta);
|
||||||
const auto useIndex = (!data->playlistSlice
|
const auto useIndex = (!repeatAll
|
||||||
|
|| !data->playlistSlice
|
||||||
|| data->playlistSlice->skippedAfter() != 0
|
|| data->playlistSlice->skippedAfter() != 0
|
||||||
|| data->playlistSlice->skippedBefore() != 0
|
|| data->playlistSlice->skippedBefore() != 0
|
||||||
|| !data->playlistSlice->size())
|
|| !data->playlistSlice->size())
|
||||||
|
@ -553,7 +555,7 @@ bool Instance::moveInPlaylist(
|
||||||
% int(data->playlistSlice->size()));
|
% int(data->playlistSlice->size()));
|
||||||
if (const auto item = itemByIndex(data, useIndex)) {
|
if (const auto item = itemByIndex(data, useIndex)) {
|
||||||
return jumpByItem(item);
|
return jumpByItem(item);
|
||||||
} else if (repeat(data) == RepeatMode::All
|
} else if (repeatAll
|
||||||
&& data->playlistOtherSlice
|
&& data->playlistOtherSlice
|
||||||
&& data->playlistOtherSlice->size() > 0) {
|
&& data->playlistOtherSlice->size() > 0) {
|
||||||
const auto &other = *data->playlistOtherSlice;
|
const auto &other = *data->playlistOtherSlice;
|
||||||
|
|
|
@ -53,8 +53,8 @@ void PrepareRepeatDropdown(not_null<Dropdown*> dropdown) {
|
||||||
const auto shuffled = (mode == OrderMode::Shuffle);
|
const auto shuffled = (mode == OrderMode::Shuffle);
|
||||||
shuffle->setIconOverride(shuffled
|
shuffle->setIconOverride(shuffled
|
||||||
? &st::mediaPlayerShuffleIcon
|
? &st::mediaPlayerShuffleIcon
|
||||||
: &st::mediaPlayerShuffleDisabledIcon,
|
: &st::mediaPlayerShuffleIcon,
|
||||||
shuffled ? nullptr : &st::mediaPlayerShuffleDisabledIconOver);
|
shuffled ? nullptr : &st::mediaPlayerShuffleIcon);
|
||||||
shuffle->setRippleColorOverride(
|
shuffle->setRippleColorOverride(
|
||||||
shuffled ? nullptr : &st::mediaPlayerRepeatDisabledRippleBg);
|
shuffled ? nullptr : &st::mediaPlayerRepeatDisabledRippleBg);
|
||||||
const auto reversed = (mode == OrderMode::Reverse);
|
const auto reversed = (mode == OrderMode::Reverse);
|
||||||
|
|
|
@ -18,6 +18,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||||
#include "ui/widgets/shadow.h"
|
#include "ui/widgets/shadow.h"
|
||||||
#include "ui/widgets/buttons.h"
|
#include "ui/widgets/buttons.h"
|
||||||
#include "ui/widgets/popup_menu.h"
|
#include "ui/widgets/popup_menu.h"
|
||||||
|
#include "ui/wrap/fade_wrap.h"
|
||||||
#include "ui/effects/ripple_animation.h"
|
#include "ui/effects/ripple_animation.h"
|
||||||
#include "ui/text/format_values.h"
|
#include "ui/text/format_values.h"
|
||||||
#include "ui/text/format_song_document_name.h"
|
#include "ui/text/format_song_document_name.h"
|
||||||
|
@ -236,11 +237,13 @@ Widget::Widget(QWidget *parent, not_null<Main::Session*> session)
|
||||||
: RpWidget(parent)
|
: RpWidget(parent)
|
||||||
, _session(session)
|
, _session(session)
|
||||||
, _nameLabel(this, st::mediaPlayerName)
|
, _nameLabel(this, st::mediaPlayerName)
|
||||||
, _timeLabel(this, st::mediaPlayerTime)
|
, _rightControls(this, object_ptr<Ui::RpWidget>(this))
|
||||||
, _playPause(this)
|
, _timeLabel(rightControls(), st::mediaPlayerTime)
|
||||||
, _volumeToggle(this, st::mediaPlayerVolumeToggle)
|
, _playPause(this, st::mediaPlayerPlayButton)
|
||||||
, _repeatToggle(this, st::mediaPlayerRepeatButton)
|
, _volumeToggle(rightControls(), st::mediaPlayerVolumeToggle)
|
||||||
, _playbackSpeed(this, st::mediaPlayerSpeedButton)
|
, _repeatToggle(rightControls(), st::mediaPlayerRepeatButton)
|
||||||
|
, _orderToggle(rightControls(), st::mediaPlayerRepeatButton)
|
||||||
|
, _playbackSpeed(rightControls(), st::mediaPlayerSpeedButton)
|
||||||
, _close(this, st::mediaPlayerClose)
|
, _close(this, st::mediaPlayerClose)
|
||||||
, _shadow(this)
|
, _shadow(this)
|
||||||
, _playbackSlider(this, st::mediaPlayerPlayback)
|
, _playbackSlider(this, st::mediaPlayerPlayback)
|
||||||
|
@ -249,6 +252,8 @@ Widget::Widget(QWidget *parent, not_null<Main::Session*> session)
|
||||||
setMouseTracking(true);
|
setMouseTracking(true);
|
||||||
resize(width(), st::mediaPlayerHeight + st::lineWidth);
|
resize(width(), st::mediaPlayerHeight + st::lineWidth);
|
||||||
|
|
||||||
|
_rightControls->show(anim::type::instant);
|
||||||
|
|
||||||
_nameLabel->setAttribute(Qt::WA_TransparentForMouseEvents);
|
_nameLabel->setAttribute(Qt::WA_TransparentForMouseEvents);
|
||||||
_timeLabel->setAttribute(Qt::WA_TransparentForMouseEvents);
|
_timeLabel->setAttribute(Qt::WA_TransparentForMouseEvents);
|
||||||
|
|
||||||
|
@ -290,13 +295,16 @@ Widget::Widget(QWidget *parent, not_null<Main::Session*> session)
|
||||||
updateVolumeToggleIcon();
|
updateVolumeToggleIcon();
|
||||||
}, lifetime());
|
}, lifetime());
|
||||||
|
|
||||||
rpl::combine(
|
Core::App().settings().playerRepeatModeValue(
|
||||||
Core::App().settings().playerRepeatModeValue(),
|
|
||||||
Core::App().settings().playerOrderModeValue()
|
|
||||||
) | rpl::start_with_next([=] {
|
) | rpl::start_with_next([=] {
|
||||||
updateRepeatToggleIcon();
|
updateRepeatToggleIcon();
|
||||||
}, lifetime());
|
}, lifetime());
|
||||||
|
|
||||||
|
Core::App().settings().playerOrderModeValue(
|
||||||
|
) | rpl::start_with_next([=] {
|
||||||
|
updateOrderToggleIcon();
|
||||||
|
}, lifetime());
|
||||||
|
|
||||||
_repeatToggle->setClickedCallback([=] {
|
_repeatToggle->setClickedCallback([=] {
|
||||||
auto &settings = Core::App().settings();
|
auto &settings = Core::App().settings();
|
||||||
settings.setPlayerRepeatMode([&] {
|
settings.setPlayerRepeatMode([&] {
|
||||||
|
@ -342,23 +350,18 @@ Widget::Widget(QWidget *parent, not_null<Main::Session*> session)
|
||||||
}, lifetime());
|
}, lifetime());
|
||||||
|
|
||||||
setType(AudioMsgId::Type::Song);
|
setType(AudioMsgId::Type::Song);
|
||||||
_playPause->finishTransform();
|
//_playPause->finishTransform();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Widget::updateVolumeToggleIcon() {
|
void Widget::updateVolumeToggleIcon() {
|
||||||
auto icon = []() -> const style::icon * {
|
_volumeToggle->setIconOverride([] {
|
||||||
auto volume = Core::App().settings().songVolume();
|
const auto volume = Core::App().settings().songVolume();
|
||||||
if (volume > 0) {
|
return (volume == 0.)
|
||||||
if (volume < 1 / 3.) {
|
? &st::mediaPlayerVolumeIcon0
|
||||||
return &st::mediaPlayerVolumeIcon1;
|
: (volume < 0.5)
|
||||||
} else if (volume < 2 / 3.) {
|
? &st::mediaPlayerVolumeIcon1
|
||||||
return &st::mediaPlayerVolumeIcon2;
|
: nullptr;
|
||||||
}
|
}());
|
||||||
return &st::mediaPlayerVolumeIcon3;
|
|
||||||
}
|
|
||||||
return nullptr;
|
|
||||||
};
|
|
||||||
_volumeToggle->setIconOverride(icon());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Widget::setCloseCallback(Fn<void()> callback) {
|
void Widget::setCloseCallback(Fn<void()> callback) {
|
||||||
|
@ -401,7 +404,7 @@ void Widget::hideShadow() {
|
||||||
}
|
}
|
||||||
|
|
||||||
QPoint Widget::getPositionForVolumeWidget() const {
|
QPoint Widget::getPositionForVolumeWidget() const {
|
||||||
auto x = _volumeToggle->x();
|
auto x = _volumeToggle->x() + _rightControls->x();
|
||||||
x += (_volumeToggle->width() - st::mediaPlayerVolumeSize.width()) / 2;
|
x += (_volumeToggle->width() - st::mediaPlayerVolumeSize.width()) / 2;
|
||||||
if (rtl()) x = width() - x - st::mediaPlayerVolumeSize.width();
|
if (rtl()) x = width() - x - st::mediaPlayerVolumeSize.width();
|
||||||
return QPoint(x, height());
|
return QPoint(x, height());
|
||||||
|
@ -412,18 +415,22 @@ void Widget::volumeWidgetCreated(Dropdown *widget) {
|
||||||
}
|
}
|
||||||
|
|
||||||
QPoint Widget::getPositionForRepeatWidget() const {
|
QPoint Widget::getPositionForRepeatWidget() const {
|
||||||
auto x = _repeatToggle->x();
|
auto x = _orderToggle->x() + _rightControls->x();
|
||||||
x += (_repeatToggle->width() - st::mediaPlayerVolumeSize.width()) / 2;
|
x += (_orderToggle->width() - st::mediaPlayerVolumeSize.width()) / 2;
|
||||||
if (rtl()) x = width() - x - st::mediaPlayerVolumeSize.width();
|
if (rtl()) x = width() - x - st::mediaPlayerVolumeSize.width();
|
||||||
return QPoint(x, height());
|
return QPoint(x, height());
|
||||||
}
|
}
|
||||||
|
|
||||||
void Widget::repeatWidgetCreated(Dropdown *widget) {
|
void Widget::repeatWidgetCreated(Dropdown *widget) {
|
||||||
_repeatToggle->installEventFilter(widget);
|
_orderToggle->installEventFilter(widget);
|
||||||
}
|
}
|
||||||
|
|
||||||
Widget::~Widget() = default;
|
Widget::~Widget() = default;
|
||||||
|
|
||||||
|
not_null<Ui::RpWidget*> Widget::rightControls() {
|
||||||
|
return _rightControls->entity();
|
||||||
|
}
|
||||||
|
|
||||||
void Widget::handleSeekProgress(float64 progress) {
|
void Widget::handleSeekProgress(float64 progress) {
|
||||||
if (!_lastDurationMs) return;
|
if (!_lastDurationMs) return;
|
||||||
|
|
||||||
|
@ -452,19 +459,29 @@ void Widget::resizeEvent(QResizeEvent *e) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void Widget::updateControlsGeometry() {
|
void Widget::updateControlsGeometry() {
|
||||||
auto right = st::mediaPlayerCloseRight;
|
_close->moveToRight(st::mediaPlayerCloseRight, st::mediaPlayerPlayTop);
|
||||||
_close->moveToRight(right, st::mediaPlayerPlayTop); right += _close->width();
|
auto right = 0;
|
||||||
if (hasPlaybackSpeedControl()) {
|
if (hasPlaybackSpeedControl()) {
|
||||||
_playbackSpeed->moveToRight(right, st::mediaPlayerPlayTop); right += _playbackSpeed->width();
|
_playbackSpeed->moveToRight(right, 0); right += _playbackSpeed->width();
|
||||||
}
|
}
|
||||||
_repeatToggle->moveToRight(right, st::mediaPlayerPlayTop); right += _repeatToggle->width();
|
_repeatToggle->moveToRight(right, 0); right += _repeatToggle->width();
|
||||||
_volumeToggle->moveToRight(right, st::mediaPlayerPlayTop); right += _volumeToggle->width();
|
_orderToggle->moveToRight(right, 0); right += _orderToggle->width();
|
||||||
|
_volumeToggle->moveToRight(right, 0); right += _volumeToggle->width();
|
||||||
|
|
||||||
|
updateControlsWrapGeometry();
|
||||||
|
|
||||||
updatePlayPrevNextPositions();
|
updatePlayPrevNextPositions();
|
||||||
|
|
||||||
_playbackSlider->setGeometry(0, height() - st::mediaPlayerPlayback.fullWidth, width(), st::mediaPlayerPlayback.fullWidth);
|
_playbackSlider->setGeometry(0, height() - st::mediaPlayerPlayback.fullWidth, width(), st::mediaPlayerPlayback.fullWidth);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Widget::updateControlsWrapGeometry() {
|
||||||
|
rightControls()->resize(getTimeRight() + _timeLabel->width(), _repeatToggle->height());
|
||||||
|
_rightControls->moveToRight(
|
||||||
|
st::mediaPlayerCloseRight + _close->width(),
|
||||||
|
st::mediaPlayerPlayTop);
|
||||||
|
}
|
||||||
|
|
||||||
void Widget::paintEvent(QPaintEvent *e) {
|
void Widget::paintEvent(QPaintEvent *e) {
|
||||||
Painter p(this);
|
Painter p(this);
|
||||||
auto fill = e->rect().intersected(QRect(0, 0, width(), st::mediaPlayerHeight));
|
auto fill = e->rect().intersected(QRect(0, 0, width(), st::mediaPlayerHeight));
|
||||||
|
@ -504,10 +521,10 @@ void Widget::mouseReleaseEvent(QMouseEvent *e) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void Widget::updateOverLabelsState(QPoint pos) {
|
void Widget::updateOverLabelsState(QPoint pos) {
|
||||||
auto left = getLabelsLeft();
|
const auto left = getNameLeft();
|
||||||
auto right = getLabelsRight();
|
const auto right = getNameRight();
|
||||||
auto labels = myrtlrect(left, 0, width() - right - left, height() - st::mediaPlayerPlayback.fullWidth);
|
const auto labels = myrtlrect(left, 0, width() - right - left, height() - st::mediaPlayerPlayback.fullWidth);
|
||||||
auto over = labels.contains(pos);
|
const auto over = labels.contains(pos);
|
||||||
updateOverLabelsState(over);
|
updateOverLabelsState(over);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -531,7 +548,7 @@ void Widget::updatePlayPrevNextPositions() {
|
||||||
updateLabelsGeometry();
|
updateLabelsGeometry();
|
||||||
}
|
}
|
||||||
|
|
||||||
int Widget::getLabelsLeft() const {
|
int Widget::getNameLeft() const {
|
||||||
auto result = st::mediaPlayerPlayLeft + _playPause->width();
|
auto result = st::mediaPlayerPlayLeft + _playPause->width();
|
||||||
if (_previousTrack) {
|
if (_previousTrack) {
|
||||||
result += _previousTrack->width() + st::mediaPlayerPlaySkip + _nextTrack->width() + st::mediaPlayerPlaySkip;
|
result += _previousTrack->width() + st::mediaPlayerPlaySkip + _nextTrack->width() + st::mediaPlayerPlaySkip;
|
||||||
|
@ -540,10 +557,18 @@ int Widget::getLabelsLeft() const {
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
int Widget::getLabelsRight() const {
|
int Widget::getNameRight() const {
|
||||||
auto result = st::mediaPlayerCloseRight + _close->width();
|
return st::mediaPlayerCloseRight
|
||||||
|
+ _close->width()
|
||||||
|
+ st::mediaPlayerPadding;
|
||||||
|
}
|
||||||
|
|
||||||
|
int Widget::getTimeRight() const {
|
||||||
|
auto result = 0;
|
||||||
if (_type == AudioMsgId::Type::Song) {
|
if (_type == AudioMsgId::Type::Song) {
|
||||||
result += _repeatToggle->width() + _volumeToggle->width();
|
result += _repeatToggle->width()
|
||||||
|
+ _orderToggle->width()
|
||||||
|
+ _volumeToggle->width();
|
||||||
}
|
}
|
||||||
if (hasPlaybackSpeedControl()) {
|
if (hasPlaybackSpeedControl()) {
|
||||||
result += _playbackSpeed->width();
|
result += _playbackSpeed->width();
|
||||||
|
@ -553,49 +578,57 @@ int Widget::getLabelsRight() const {
|
||||||
}
|
}
|
||||||
|
|
||||||
void Widget::updateLabelsGeometry() {
|
void Widget::updateLabelsGeometry() {
|
||||||
auto left = getLabelsLeft();
|
const auto left = getNameLeft();
|
||||||
auto right = getLabelsRight();
|
const auto widthForName = width()
|
||||||
|
- left
|
||||||
auto widthForName = width() - left - right;
|
- getNameRight();
|
||||||
widthForName -= _timeLabel->width() + 2 * st::normalFont->spacew;
|
|
||||||
_nameLabel->resizeToWidth(widthForName);
|
_nameLabel->resizeToWidth(widthForName);
|
||||||
|
|
||||||
_nameLabel->moveToLeft(left, st::mediaPlayerNameTop - st::mediaPlayerName.style.font->ascent);
|
_nameLabel->moveToLeft(left, st::mediaPlayerNameTop - st::mediaPlayerName.style.font->ascent);
|
||||||
|
|
||||||
|
const auto right = getTimeRight();
|
||||||
_timeLabel->moveToRight(right, st::mediaPlayerNameTop - st::mediaPlayerTime.font->ascent);
|
_timeLabel->moveToRight(right, st::mediaPlayerNameTop - st::mediaPlayerTime.font->ascent);
|
||||||
|
|
||||||
|
updateControlsWrapGeometry();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Widget::updateRepeatToggleIcon() {
|
void Widget::updateRepeatToggleIcon() {
|
||||||
const auto type = AudioMsgId::Type::Song;
|
switch (Core::App().settings().playerRepeatMode()) {
|
||||||
const auto repeat = Core::App().settings().playerRepeatMode();
|
case RepeatMode::None:
|
||||||
const auto order = Core::App().settings().playerOrderMode();
|
|
||||||
if (repeat == RepeatMode::None && order == OrderMode::Default) {
|
|
||||||
_repeatToggle->setIconOverride(
|
_repeatToggle->setIconOverride(
|
||||||
&st::mediaPlayerRepeatDisabledIcon,
|
&st::mediaPlayerRepeatDisabledIcon,
|
||||||
&st::mediaPlayerRepeatDisabledIconOver);
|
&st::mediaPlayerRepeatDisabledIconOver);
|
||||||
_repeatToggle->setRippleColorOverride(
|
_repeatToggle->setRippleColorOverride(
|
||||||
&st::mediaPlayerRepeatDisabledRippleBg);
|
&st::mediaPlayerRepeatDisabledRippleBg);
|
||||||
return;
|
|
||||||
}
|
|
||||||
const auto &icon = [&]() -> const style::icon& {
|
|
||||||
switch (repeat) {
|
|
||||||
case RepeatMode::None:
|
|
||||||
switch (order) {
|
|
||||||
case OrderMode::Reverse: return st::mediaPlayerReverseIcon;
|
|
||||||
case OrderMode::Shuffle: return st::mediaPlayerShuffleIcon;
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case RepeatMode::One: return st::mediaPlayerRepeatOneIcon;
|
case RepeatMode::One:
|
||||||
|
_repeatToggle->setIconOverride(&st::mediaPlayerRepeatOneIcon);
|
||||||
|
_repeatToggle->setRippleColorOverride(nullptr);
|
||||||
|
break;
|
||||||
case RepeatMode::All:
|
case RepeatMode::All:
|
||||||
switch (order) {
|
_repeatToggle->setIconOverride(nullptr);
|
||||||
case OrderMode::Default: return st::mediaPlayerRepeatButton.icon;
|
_repeatToggle->setRippleColorOverride(nullptr);
|
||||||
case OrderMode::Reverse: return st::mediaPlayerRepeatReverseIcon;
|
break;
|
||||||
case OrderMode::Shuffle: return st::mediaPlayerRepeatShuffleIcon;
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Widget::updateOrderToggleIcon() {
|
||||||
|
switch (Core::App().settings().playerOrderMode()) {
|
||||||
|
case OrderMode::Default:
|
||||||
|
_orderToggle->setIconOverride(
|
||||||
|
&st::mediaPlayerReverseDisabledIcon,
|
||||||
|
&st::mediaPlayerReverseDisabledIconOver);
|
||||||
|
_orderToggle->setRippleColorOverride(
|
||||||
|
&st::mediaPlayerRepeatDisabledRippleBg);
|
||||||
|
break;
|
||||||
|
case OrderMode::Reverse:
|
||||||
|
_orderToggle->setIconOverride(nullptr);
|
||||||
|
_orderToggle->setRippleColorOverride(nullptr);
|
||||||
|
break;
|
||||||
|
case OrderMode::Shuffle:
|
||||||
|
_orderToggle->setIconOverride(&st::mediaPlayerShuffleIcon);
|
||||||
|
_orderToggle->setRippleColorOverride(nullptr);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
Unexpected("Repeat / order values in Settings.");
|
|
||||||
}();
|
|
||||||
_repeatToggle->setIconOverride(&icon);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Widget::checkForTypeChange() {
|
void Widget::checkForTypeChange() {
|
||||||
|
@ -662,15 +695,11 @@ void Widget::handleSongUpdate(const TrackState &state) {
|
||||||
if (instance()->isSeeking(_type)) {
|
if (instance()->isSeeking(_type)) {
|
||||||
showPause = true;
|
showPause = true;
|
||||||
}
|
}
|
||||||
auto buttonState = [audio = state.id.audio(), showPause] {
|
_playPause->setIconOverride(state.id.audio()->loading()
|
||||||
if (audio->loading()) {
|
? &st::mediaPlayerCancelIcon
|
||||||
return ButtonState::Cancel;
|
: showPause
|
||||||
} else if (showPause) {
|
? &st::mediaPlayerPauseIcon
|
||||||
return ButtonState::Pause;
|
: nullptr);
|
||||||
}
|
|
||||||
return ButtonState::Play;
|
|
||||||
};
|
|
||||||
_playPause->setState(buttonState());
|
|
||||||
|
|
||||||
updateTimeText(state);
|
updateTimeText(state);
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,6 +19,8 @@ class LabelSimple;
|
||||||
class IconButton;
|
class IconButton;
|
||||||
class PlainShadow;
|
class PlainShadow;
|
||||||
class FilledSlider;
|
class FilledSlider;
|
||||||
|
template <typename Widget>
|
||||||
|
class FadeWrap;
|
||||||
} // namespace Ui
|
} // namespace Ui
|
||||||
|
|
||||||
namespace Media {
|
namespace Media {
|
||||||
|
@ -72,19 +74,24 @@ protected:
|
||||||
void mouseReleaseEvent(QMouseEvent *e) override;
|
void mouseReleaseEvent(QMouseEvent *e) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
[[nodiscard]] not_null<Ui::RpWidget*> rightControls();
|
||||||
|
|
||||||
void handleSeekProgress(float64 progress);
|
void handleSeekProgress(float64 progress);
|
||||||
void handleSeekFinished(float64 progress);
|
void handleSeekFinished(float64 progress);
|
||||||
|
|
||||||
int getLabelsLeft() const;
|
[[nodiscard]] int getNameLeft() const;
|
||||||
int getLabelsRight() const;
|
[[nodiscard]] int getNameRight() const;
|
||||||
|
[[nodiscard]] int getTimeRight() const;
|
||||||
void updateOverLabelsState(QPoint pos);
|
void updateOverLabelsState(QPoint pos);
|
||||||
void updateOverLabelsState(bool over);
|
void updateOverLabelsState(bool over);
|
||||||
|
|
||||||
void updatePlayPrevNextPositions();
|
void updatePlayPrevNextPositions();
|
||||||
void updateLabelsGeometry();
|
void updateLabelsGeometry();
|
||||||
void updateRepeatToggleIcon();
|
void updateRepeatToggleIcon();
|
||||||
|
void updateOrderToggleIcon();
|
||||||
void updateControlsVisibility();
|
void updateControlsVisibility();
|
||||||
void updateControlsGeometry();
|
void updateControlsGeometry();
|
||||||
|
void updateControlsWrapGeometry();
|
||||||
void createPrevNextButtons();
|
void createPrevNextButtons();
|
||||||
void destroyPrevNextButtons();
|
void destroyPrevNextButtons();
|
||||||
|
|
||||||
|
@ -123,12 +130,14 @@ private:
|
||||||
class PlayButton;
|
class PlayButton;
|
||||||
class SpeedButton;
|
class SpeedButton;
|
||||||
object_ptr<Ui::FlatLabel> _nameLabel;
|
object_ptr<Ui::FlatLabel> _nameLabel;
|
||||||
|
object_ptr<Ui::FadeWrap<Ui::RpWidget>> _rightControls;
|
||||||
object_ptr<Ui::LabelSimple> _timeLabel;
|
object_ptr<Ui::LabelSimple> _timeLabel;
|
||||||
object_ptr<Ui::IconButton> _previousTrack = { nullptr };
|
object_ptr<Ui::IconButton> _previousTrack = { nullptr };
|
||||||
object_ptr<PlayButton> _playPause;
|
object_ptr<Ui::IconButton> _playPause;
|
||||||
object_ptr<Ui::IconButton> _nextTrack = { nullptr };
|
object_ptr<Ui::IconButton> _nextTrack = { nullptr };
|
||||||
object_ptr<Ui::IconButton> _volumeToggle;
|
object_ptr<Ui::IconButton> _volumeToggle;
|
||||||
object_ptr<Ui::IconButton> _repeatToggle;
|
object_ptr<Ui::IconButton> _repeatToggle;
|
||||||
|
object_ptr<Ui::IconButton> _orderToggle;
|
||||||
object_ptr<SpeedButton> _playbackSpeed;
|
object_ptr<SpeedButton> _playbackSpeed;
|
||||||
object_ptr<Ui::IconButton> _close;
|
object_ptr<Ui::IconButton> _close;
|
||||||
object_ptr<Ui::PlainShadow> _shadow = { nullptr };
|
object_ptr<Ui::PlainShadow> _shadow = { nullptr };
|
||||||
|
|