mirror of
https://github.com/AyuGram/AyuGramDesktop.git
synced 2025-06-05 06:33:57 +02:00
Add video tiles in narrow members column.
This commit is contained in:
parent
6a967948de
commit
0e49bf5dee
6 changed files with 62 additions and 62 deletions
|
@ -1167,7 +1167,8 @@ desktopCaptureSubmit: RoundButton(desktopCaptureCancel) {
|
||||||
}
|
}
|
||||||
|
|
||||||
groupCallNarrowSkip: 9px;
|
groupCallNarrowSkip: 9px;
|
||||||
groupCallNarrowMembersWidth: 202px;
|
groupCallNarrowMembersWidth: 204px;
|
||||||
|
groupCallNarrowVideoHeight: 120px;
|
||||||
//groupCallNarrowRowSkip: 4px;
|
//groupCallNarrowRowSkip: 4px;
|
||||||
//groupCallNarrowSize: size(144px, 90px);
|
//groupCallNarrowSize: size(144px, 90px);
|
||||||
//groupCallNarrowUserpicTop: 13px;
|
//groupCallNarrowUserpicTop: 13px;
|
||||||
|
|
|
@ -783,9 +783,6 @@ Row *Members::Controller::findRow(
|
||||||
}
|
}
|
||||||
|
|
||||||
void Members::Controller::setMode(PanelMode mode) {
|
void Members::Controller::setMode(PanelMode mode) {
|
||||||
if (_mode == mode) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
_mode = mode;
|
_mode = mode;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1648,27 +1645,30 @@ std::unique_ptr<Row> Members::Controller::createInvitedRow(
|
||||||
Members::Members(
|
Members::Members(
|
||||||
not_null<QWidget*> parent,
|
not_null<QWidget*> parent,
|
||||||
not_null<GroupCall*> call,
|
not_null<GroupCall*> call,
|
||||||
not_null<Viewport*> viewport,
|
|
||||||
PanelMode mode)
|
PanelMode mode)
|
||||||
: RpWidget(parent)
|
: RpWidget(parent)
|
||||||
, _call(call)
|
, _call(call)
|
||||||
, _viewport(viewport)
|
|
||||||
, _mode(mode)
|
, _mode(mode)
|
||||||
, _scroll(this)
|
, _scroll(this)
|
||||||
, _listController(std::make_unique<Controller>(call, parent, mode))
|
, _listController(std::make_unique<Controller>(call, parent, mode))
|
||||||
, _layout(_scroll->setOwnedWidget(
|
, _layout(_scroll->setOwnedWidget(
|
||||||
object_ptr<Ui::VerticalLayout>(_scroll.data())))
|
object_ptr<Ui::VerticalLayout>(_scroll.data())))
|
||||||
, _videoWrap(_layout->add(object_ptr<Ui::RpWidget>(_layout.get()))) {
|
, _videoWrap(_layout->add(object_ptr<Ui::RpWidget>(_layout.get())))
|
||||||
|
, _viewport(
|
||||||
|
std::make_unique<Viewport>(
|
||||||
|
_videoWrap.get(),
|
||||||
|
PanelMode::Default)) {
|
||||||
setupAddMember(call);
|
setupAddMember(call);
|
||||||
setupList();
|
setupList();
|
||||||
setContent(_list);
|
setContent(_list);
|
||||||
setupFakeRoundCorners();
|
setupFakeRoundCorners();
|
||||||
_listController->setDelegate(static_cast<PeerListDelegate*>(this));
|
_listController->setDelegate(static_cast<PeerListDelegate*>(this));
|
||||||
grabViewport();
|
|
||||||
trackViewportGeometry();
|
trackViewportGeometry();
|
||||||
}
|
}
|
||||||
|
|
||||||
Members::~Members() = default;
|
Members::~Members() {
|
||||||
|
_viewport = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
auto Members::toggleMuteRequests() const
|
auto Members::toggleMuteRequests() const
|
||||||
-> rpl::producer<Group::MuteRequest> {
|
-> rpl::producer<Group::MuteRequest> {
|
||||||
|
@ -1685,6 +1685,10 @@ auto Members::kickParticipantRequests() const
|
||||||
return _listController->kickParticipantRequests();
|
return _listController->kickParticipantRequests();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
not_null<Viewport*> Members::viewport() const {
|
||||||
|
return _viewport.get();
|
||||||
|
}
|
||||||
|
|
||||||
int Members::desiredHeight() const {
|
int Members::desiredHeight() const {
|
||||||
const auto count = [&] {
|
const auto count = [&] {
|
||||||
if (const auto real = _call->lookupReal()) {
|
if (const auto real = _call->lookupReal()) {
|
||||||
|
@ -1808,10 +1812,8 @@ void Members::setMode(PanelMode mode) {
|
||||||
if (_mode.current() == mode) {
|
if (_mode.current() == mode) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
grabViewport(mode);
|
|
||||||
_mode = mode;
|
_mode = mode;
|
||||||
_listController->setMode(mode);
|
_listController->setMode(mode);
|
||||||
trackViewportGeometry();
|
|
||||||
//_list->setMode((mode == PanelMode::Wide)
|
//_list->setMode((mode == PanelMode::Wide)
|
||||||
// ? PeerListContent::Mode::Custom
|
// ? PeerListContent::Mode::Custom
|
||||||
// : PeerListContent::Mode::Default);
|
// : PeerListContent::Mode::Default);
|
||||||
|
@ -1861,23 +1863,12 @@ void Members::setupList() {
|
||||||
updateControlsGeometry();
|
updateControlsGeometry();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Members::grabViewport() {
|
|
||||||
grabViewport(_mode.current());
|
|
||||||
}
|
|
||||||
|
|
||||||
void Members::grabViewport(PanelMode mode) {
|
|
||||||
if (mode != PanelMode::Default) {
|
|
||||||
_viewportGrabLifetime.destroy();
|
|
||||||
_videoWrap->resize(_videoWrap->width(), 0);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
_viewport->setMode(mode, _videoWrap.get());
|
|
||||||
}
|
|
||||||
|
|
||||||
void Members::trackViewportGeometry() {
|
void Members::trackViewportGeometry() {
|
||||||
if (_mode.current() != PanelMode::Default) {
|
_call->videoEndpointPinnedValue(
|
||||||
return;
|
) | rpl::start_with_next([=](const VideoEndpoint &pinned) {
|
||||||
}
|
_viewport->showLarge(pinned);
|
||||||
|
}, _viewport->lifetime());
|
||||||
|
|
||||||
const auto move = [=] {
|
const auto move = [=] {
|
||||||
const auto maxTop = _viewport->fullHeight()
|
const auto maxTop = _viewport->fullHeight()
|
||||||
- _viewport->widget()->height();
|
- _viewport->widget()->height();
|
||||||
|
@ -1900,20 +1891,20 @@ void Members::trackViewportGeometry() {
|
||||||
) | rpl::start_with_next([=](int width) {
|
) | rpl::start_with_next([=](int width) {
|
||||||
_viewport->resizeToWidth(width);
|
_viewport->resizeToWidth(width);
|
||||||
resize();
|
resize();
|
||||||
}, _viewportGrabLifetime);
|
}, _viewport->lifetime());
|
||||||
|
|
||||||
_scroll->heightValue(
|
_scroll->heightValue(
|
||||||
) | rpl::skip(1) | rpl::start_with_next(resize, _viewportGrabLifetime);
|
) | rpl::skip(1) | rpl::start_with_next(resize, _viewport->lifetime());
|
||||||
|
|
||||||
_scroll->scrollTopValue(
|
_scroll->scrollTopValue(
|
||||||
) | rpl::skip(1) | rpl::start_with_next(move, _viewportGrabLifetime);
|
) | rpl::skip(1) | rpl::start_with_next(move, _viewport->lifetime());
|
||||||
|
|
||||||
_viewport->fullHeightValue(
|
_viewport->fullHeightValue(
|
||||||
) | rpl::start_with_next([=](int height) {
|
) | rpl::start_with_next([=](int height) {
|
||||||
_videoWrap->resize(_videoWrap->width(), height);
|
_videoWrap->resize(_videoWrap->width(), height);
|
||||||
move();
|
move();
|
||||||
resize();
|
resize();
|
||||||
}, _viewportGrabLifetime);
|
}, _viewport->lifetime());
|
||||||
}
|
}
|
||||||
|
|
||||||
void Members::resizeEvent(QResizeEvent *e) {
|
void Members::resizeEvent(QResizeEvent *e) {
|
||||||
|
|
|
@ -39,10 +39,10 @@ public:
|
||||||
Members(
|
Members(
|
||||||
not_null<QWidget*> parent,
|
not_null<QWidget*> parent,
|
||||||
not_null<GroupCall*> call,
|
not_null<GroupCall*> call,
|
||||||
not_null<Viewport*> viewport,
|
|
||||||
PanelMode mode);
|
PanelMode mode);
|
||||||
~Members();
|
~Members();
|
||||||
|
|
||||||
|
[[nodiscard]] not_null<Viewport*> viewport() const;
|
||||||
[[nodiscard]] int desiredHeight() const;
|
[[nodiscard]] int desiredHeight() const;
|
||||||
[[nodiscard]] rpl::producer<int> desiredHeightValue() const override;
|
[[nodiscard]] rpl::producer<int> desiredHeightValue() const override;
|
||||||
[[nodiscard]] rpl::producer<int> fullCountValue() const;
|
[[nodiscard]] rpl::producer<int> fullCountValue() const;
|
||||||
|
@ -89,18 +89,16 @@ private:
|
||||||
void setupList();
|
void setupList();
|
||||||
void setupFakeRoundCorners();
|
void setupFakeRoundCorners();
|
||||||
|
|
||||||
void grabViewport();
|
|
||||||
void grabViewport(PanelMode mode);
|
|
||||||
void trackViewportGeometry();
|
void trackViewportGeometry();
|
||||||
void updateControlsGeometry();
|
void updateControlsGeometry();
|
||||||
|
|
||||||
const not_null<GroupCall*> _call;
|
const not_null<GroupCall*> _call;
|
||||||
const not_null<Viewport*> _viewport;
|
|
||||||
rpl::variable<PanelMode> _mode = PanelMode();
|
rpl::variable<PanelMode> _mode = PanelMode();
|
||||||
object_ptr<Ui::ScrollArea> _scroll;
|
object_ptr<Ui::ScrollArea> _scroll;
|
||||||
std::unique_ptr<Controller> _listController;
|
std::unique_ptr<Controller> _listController;
|
||||||
not_null<Ui::VerticalLayout*> _layout;
|
not_null<Ui::VerticalLayout*> _layout;
|
||||||
const not_null<Ui::RpWidget*> _videoWrap;
|
const not_null<Ui::RpWidget*> _videoWrap;
|
||||||
|
std::unique_ptr<Viewport> _viewport;
|
||||||
rpl::event_stream<> _enlargeVideoClicks;
|
rpl::event_stream<> _enlargeVideoClicks;
|
||||||
rpl::variable<Ui::RpWidget*> _addMemberButton = nullptr;
|
rpl::variable<Ui::RpWidget*> _addMemberButton = nullptr;
|
||||||
ListWidget *_list = nullptr;
|
ListWidget *_list = nullptr;
|
||||||
|
@ -108,8 +106,6 @@ private:
|
||||||
|
|
||||||
rpl::variable<bool> _canAddMembers;
|
rpl::variable<bool> _canAddMembers;
|
||||||
|
|
||||||
rpl::lifetime _viewportGrabLifetime;
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace Calls
|
} // namespace Calls
|
||||||
|
|
|
@ -404,7 +404,7 @@ Panel::Panel(not_null<GroupCall*> call)
|
||||||
_window->body(),
|
_window->body(),
|
||||||
st::groupCallTitle))
|
st::groupCallTitle))
|
||||||
#endif // !Q_OS_MAC
|
#endif // !Q_OS_MAC
|
||||||
, _viewport(std::make_unique<Viewport>(widget(), _mode.current()))
|
, _viewport(std::make_unique<Viewport>(widget(), PanelMode::Wide))
|
||||||
, _mute(std::make_unique<Ui::CallMuteButton>(
|
, _mute(std::make_unique<Ui::CallMuteButton>(
|
||||||
widget(),
|
widget(),
|
||||||
st::callMuteButton,
|
st::callMuteButton,
|
||||||
|
@ -425,6 +425,7 @@ Panel::Panel(not_null<GroupCall*> call)
|
||||||
_layerBg->setStyleOverrides(&st::groupCallBox, &st::groupCallLayerBox);
|
_layerBg->setStyleOverrides(&st::groupCallBox, &st::groupCallLayerBox);
|
||||||
_layerBg->setHideByBackgroundClick(true);
|
_layerBg->setHideByBackgroundClick(true);
|
||||||
|
|
||||||
|
_viewport->widget()->hide();
|
||||||
if (!_viewport->requireARGB32()) {
|
if (!_viewport->requireARGB32()) {
|
||||||
_call->setNotRequireARGB32();
|
_call->setNotRequireARGB32();
|
||||||
}
|
}
|
||||||
|
@ -975,8 +976,9 @@ void Panel::setupMembers() {
|
||||||
_countdown.destroy();
|
_countdown.destroy();
|
||||||
_startsWhen.destroy();
|
_startsWhen.destroy();
|
||||||
|
|
||||||
_members.create(widget(), _call, _viewport.get(), mode());
|
_members.create(widget(), _call, mode());
|
||||||
setupVideo();
|
setupVideo(_viewport.get());
|
||||||
|
setupVideo(_members->viewport());
|
||||||
_members->show();
|
_members->show();
|
||||||
|
|
||||||
refreshControlsBackground();
|
refreshControlsBackground();
|
||||||
|
@ -1117,16 +1119,14 @@ void Panel::raiseControls() {
|
||||||
_mute->raise();
|
_mute->raise();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Panel::setupVideo() {
|
void Panel::setupVideo(not_null<Viewport*> viewport) {
|
||||||
const auto raw = _viewport.get();
|
|
||||||
|
|
||||||
const auto setupTile = [=](
|
const auto setupTile = [=](
|
||||||
const VideoEndpoint &endpoint,
|
const VideoEndpoint &endpoint,
|
||||||
const GroupCall::VideoTrack &track) {
|
const GroupCall::VideoTrack &track) {
|
||||||
using namespace rpl::mappers;
|
using namespace rpl::mappers;
|
||||||
const auto row = _members->lookupRow(track.peer);
|
const auto row = _members->lookupRow(track.peer);
|
||||||
Assert(row != nullptr);
|
Assert(row != nullptr);
|
||||||
_viewport->add(
|
viewport->add(
|
||||||
endpoint,
|
endpoint,
|
||||||
LargeVideoTrack{ track.track.get(), row },
|
LargeVideoTrack{ track.track.get(), row },
|
||||||
_call->videoEndpointPinnedValue() | rpl::map(_1 == endpoint));
|
_call->videoEndpointPinnedValue() | rpl::map(_1 == endpoint));
|
||||||
|
@ -1138,7 +1138,7 @@ void Panel::setupVideo() {
|
||||||
) | rpl::start_with_next([=](const VideoEndpoint &endpoint) {
|
) | rpl::start_with_next([=](const VideoEndpoint &endpoint) {
|
||||||
if (_call->activeVideoTracks().contains(endpoint)) {
|
if (_call->activeVideoTracks().contains(endpoint)) {
|
||||||
// Add async (=> the participant row is definitely in Members).
|
// Add async (=> the participant row is definitely in Members).
|
||||||
crl::on_main(widget(), [=] {
|
crl::on_main(viewport->widget(), [=] {
|
||||||
const auto &tracks = _call->activeVideoTracks();
|
const auto &tracks = _call->activeVideoTracks();
|
||||||
const auto i = tracks.find(endpoint);
|
const auto i = tracks.find(endpoint);
|
||||||
if (i != end(tracks)) {
|
if (i != end(tracks)) {
|
||||||
|
@ -1147,32 +1147,32 @@ void Panel::setupVideo() {
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
// Remove sync.
|
// Remove sync.
|
||||||
_viewport->remove(endpoint);
|
viewport->remove(endpoint);
|
||||||
}
|
}
|
||||||
}, raw->lifetime());
|
}, viewport->lifetime());
|
||||||
|
|
||||||
raw->pinToggled(
|
viewport->pinToggled(
|
||||||
) | rpl::start_with_next([=](const VideoPinToggle &value) {
|
) | rpl::start_with_next([=](const VideoPinToggle &value) {
|
||||||
_call->pinVideoEndpoint(
|
_call->pinVideoEndpoint(
|
||||||
value.pinned ? value.endpoint : VideoEndpoint{});
|
value.pinned ? value.endpoint : VideoEndpoint{});
|
||||||
}, raw->lifetime());
|
}, viewport->lifetime());
|
||||||
|
|
||||||
raw->clicks(
|
viewport->clicks(
|
||||||
) | rpl::filter([=] {
|
) | rpl::filter([=] {
|
||||||
return (_mode.current() == PanelMode::Default);
|
return (_mode.current() == PanelMode::Default);
|
||||||
}) | rpl::start_with_next([=] {
|
}) | rpl::start_with_next([=] {
|
||||||
enlargeVideo();
|
enlargeVideo();
|
||||||
}, raw->lifetime());
|
}, viewport->lifetime());
|
||||||
|
|
||||||
raw->qualityRequests(
|
viewport->qualityRequests(
|
||||||
) | rpl::start_with_next([=](const VideoQualityRequest &request) {
|
) | rpl::start_with_next([=](const VideoQualityRequest &request) {
|
||||||
_call->requestVideoQuality(request.endpoint, request.quality);
|
_call->requestVideoQuality(request.endpoint, request.quality);
|
||||||
}, raw->lifetime());
|
}, viewport->lifetime());
|
||||||
|
|
||||||
raw->mouseInsideValue(
|
viewport->mouseInsideValue(
|
||||||
) | rpl::start_with_next([=](bool inside) {
|
) | rpl::start_with_next([=](bool inside) {
|
||||||
toggleWideControls(inside);
|
toggleWideControls(inside);
|
||||||
}, raw->lifetime());
|
}, viewport->lifetime());
|
||||||
}
|
}
|
||||||
|
|
||||||
void Panel::toggleWideControls(bool shown) {
|
void Panel::toggleWideControls(bool shown) {
|
||||||
|
@ -1808,9 +1808,7 @@ bool Panel::updateMode() {
|
||||||
}
|
}
|
||||||
_wideControlsShown = _showWideControls = true;
|
_wideControlsShown = _showWideControls = true;
|
||||||
_wideControlsAnimation.stop();
|
_wideControlsAnimation.stop();
|
||||||
if (wide) {
|
_viewport->widget()->setVisible(wide);
|
||||||
_viewport->setMode(mode, widget());
|
|
||||||
}
|
|
||||||
if (_members) {
|
if (_members) {
|
||||||
_members->setMode(mode);
|
_members->setMode(mode);
|
||||||
}
|
}
|
||||||
|
|
|
@ -87,7 +87,7 @@ private:
|
||||||
void initGeometry();
|
void initGeometry();
|
||||||
void setupScheduledLabels(rpl::producer<TimeId> date);
|
void setupScheduledLabels(rpl::producer<TimeId> date);
|
||||||
void setupMembers();
|
void setupMembers();
|
||||||
void setupVideo();
|
void setupVideo(not_null<Viewport*> viewport);
|
||||||
void setupToasts();
|
void setupToasts();
|
||||||
void setupJoinAsChangedToasts();
|
void setupJoinAsChangedToasts();
|
||||||
void setupTitleChangedToasts();
|
void setupTitleChangedToasts();
|
||||||
|
|
|
@ -241,9 +241,7 @@ void Viewport::showLarge(const VideoEndpoint &endpoint) {
|
||||||
const auto large = (i != end(_tiles)) ? i->get() : nullptr;
|
const auto large = (i != end(_tiles)) ? i->get() : nullptr;
|
||||||
if (_large != large) {
|
if (_large != large) {
|
||||||
_large = large;
|
_large = large;
|
||||||
if (wide()) {
|
updateTilesGeometry();
|
||||||
updateTilesGeometry();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -387,6 +385,22 @@ void Viewport::updateTilesGeometryWide(int outerWidth, int outerHeight) {
|
||||||
void Viewport::updateTilesGeometryNarrow(int outerWidth) {
|
void Viewport::updateTilesGeometryNarrow(int outerWidth) {
|
||||||
const auto y = -_scrollTop;
|
const auto y = -_scrollTop;
|
||||||
|
|
||||||
|
if (outerWidth <= st::groupCallNarrowMembersWidth) {
|
||||||
|
auto top = 0;
|
||||||
|
for (const auto &tile : _tiles) {
|
||||||
|
const auto video = tile.get();
|
||||||
|
const auto size = video->trackSize();
|
||||||
|
const auto shown = !size.isEmpty() && _large && video != _large;
|
||||||
|
const auto height = shown
|
||||||
|
? st::groupCallNarrowVideoHeight
|
||||||
|
: 0;
|
||||||
|
video->setGeometry({ 0, y + top, outerWidth, height });
|
||||||
|
top += height ? (height + st::groupCallVideoSmallSkip) : 0;
|
||||||
|
}
|
||||||
|
_fullHeight = top;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
auto sizes = base::flat_map<not_null<VideoTile*>, QSize>();
|
auto sizes = base::flat_map<not_null<VideoTile*>, QSize>();
|
||||||
sizes.reserve(_tiles.size());
|
sizes.reserve(_tiles.size());
|
||||||
for (const auto &tile : _tiles) {
|
for (const auto &tile : _tiles) {
|
||||||
|
|
Loading…
Add table
Reference in a new issue