mirror of
https://github.com/AyuGram/AyuGramDesktop.git
synced 2025-06-05 06:33:57 +02:00
Improved style of list of credits history entries for entry photo.
This commit is contained in:
parent
58c060c59d
commit
d3a01b6235
6 changed files with 85 additions and 36 deletions
|
@ -1467,6 +1467,8 @@ PRIVATE
|
||||||
ui/controls/silent_toggle.h
|
ui/controls/silent_toggle.h
|
||||||
ui/controls/userpic_button.cpp
|
ui/controls/userpic_button.cpp
|
||||||
ui/controls/userpic_button.h
|
ui/controls/userpic_button.h
|
||||||
|
ui/effects/credits_graphics.cpp
|
||||||
|
ui/effects/credits_graphics.h
|
||||||
ui/effects/emoji_fly_animation.cpp
|
ui/effects/emoji_fly_animation.cpp
|
||||||
ui/effects/emoji_fly_animation.h
|
ui/effects/emoji_fly_animation.h
|
||||||
ui/effects/message_sending_animation_common.h
|
ui/effects/message_sending_animation_common.h
|
||||||
|
|
|
@ -713,6 +713,7 @@ public:
|
||||||
Data::CreditsHistoryEntry entry;
|
Data::CreditsHistoryEntry entry;
|
||||||
not_null<QImage*> creditIcon;
|
not_null<QImage*> creditIcon;
|
||||||
int rowHeight = 0;
|
int rowHeight = 0;
|
||||||
|
Fn<void(not_null<PeerListRow*>)> updateCallback;
|
||||||
};
|
};
|
||||||
|
|
||||||
CreditsRow(not_null<PeerData*> peer, const Descriptor &descriptor);
|
CreditsRow(not_null<PeerData*> peer, const Descriptor &descriptor);
|
||||||
|
@ -752,6 +753,14 @@ CreditsRow::CreditsRow(not_null<PeerData*> peer, const Descriptor &descriptor)
|
||||||
, _entry(descriptor.entry)
|
, _entry(descriptor.entry)
|
||||||
, _creditIcon(descriptor.creditIcon)
|
, _creditIcon(descriptor.creditIcon)
|
||||||
, _rowHeight(descriptor.rowHeight) {
|
, _rowHeight(descriptor.rowHeight) {
|
||||||
|
const auto photo = _entry.photoId
|
||||||
|
? peer->session().data().photo(_entry.photoId).get()
|
||||||
|
: nullptr;
|
||||||
|
if (photo) {
|
||||||
|
_paintUserpicCallback = Ui::GenerateCreditsPaintEntryCallback(
|
||||||
|
photo,
|
||||||
|
[this, update = descriptor.updateCallback] { update(this); });
|
||||||
|
}
|
||||||
init();
|
init();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -772,9 +781,11 @@ void CreditsRow::init() {
|
||||||
(!_entry.bareId ? QChar('+') : kMinus)
|
(!_entry.bareId ? QChar('+') : kMinus)
|
||||||
+ Lang::FormatCountDecimal(std::abs(int64(_entry.credits))));
|
+ Lang::FormatCountDecimal(std::abs(int64(_entry.credits))));
|
||||||
}
|
}
|
||||||
_paintUserpicCallback = !PeerListRow::special()
|
if (!_paintUserpicCallback) {
|
||||||
? PeerListRow::generatePaintUserpicCallback(false)
|
_paintUserpicCallback = !PeerListRow::special()
|
||||||
: Ui::GenerateCreditsPaintUserpicCallback(_entry);
|
? PeerListRow::generatePaintUserpicCallback(false)
|
||||||
|
: Ui::GenerateCreditsPaintUserpicCallback(_entry);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const Data::CreditsHistoryEntry &CreditsRow::entry() const {
|
const Data::CreditsHistoryEntry &CreditsRow::entry() const {
|
||||||
|
@ -912,6 +923,9 @@ void CreditsController::applySlice(const Data::CreditsStatusSlice &slice) {
|
||||||
.entry = item,
|
.entry = item,
|
||||||
.creditIcon = _creditIcon,
|
.creditIcon = _creditIcon,
|
||||||
.rowHeight = computeListSt().item.height,
|
.rowHeight = computeListSt().item.height,
|
||||||
|
.updateCallback = [=](not_null<PeerListRow*> row) {
|
||||||
|
delegate()->peerListUpdateRow(row);
|
||||||
|
},
|
||||||
};
|
};
|
||||||
using Type = Data::CreditsHistoryEntry::PeerType;
|
using Type = Data::CreditsHistoryEntry::PeerType;
|
||||||
if (item.bareId) {
|
if (item.bareId) {
|
||||||
|
|
|
@ -568,44 +568,18 @@ object_ptr<Ui::RpWidget> HistoryEntryPhoto(
|
||||||
not_null<Ui::RpWidget*> parent,
|
not_null<Ui::RpWidget*> parent,
|
||||||
not_null<PhotoData*> photo,
|
not_null<PhotoData*> photo,
|
||||||
int photoSize) {
|
int photoSize) {
|
||||||
struct State {
|
|
||||||
std::shared_ptr<Data::PhotoMedia> view;
|
|
||||||
Image *image = nullptr;
|
|
||||||
rpl::lifetime downloadLifetime;
|
|
||||||
};
|
|
||||||
const auto state = parent->lifetime().make_state<State>();
|
|
||||||
auto owned = object_ptr<Ui::RpWidget>(parent);
|
auto owned = object_ptr<Ui::RpWidget>(parent);
|
||||||
const auto widget = owned.data();
|
const auto widget = owned.data();
|
||||||
state->view = photo->createMediaView();
|
|
||||||
photo->load(Data::PhotoSize::Thumbnail, {});
|
|
||||||
|
|
||||||
widget->resize(Size(photoSize));
|
widget->resize(Size(photoSize));
|
||||||
|
|
||||||
rpl::single(rpl::empty_value()) | rpl::then(
|
const auto draw = Ui::GenerateCreditsPaintEntryCallback(
|
||||||
photo->owner().session().downloaderTaskFinished()
|
photo,
|
||||||
) | rpl::start_with_next([=] {
|
[=] { widget->update(); });
|
||||||
using Size = Data::PhotoSize;
|
|
||||||
if (const auto large = state->view->image(Size::Large)) {
|
|
||||||
state->image = large;
|
|
||||||
} else if (const auto small = state->view->image(Size::Small)) {
|
|
||||||
state->image = small;
|
|
||||||
} else if (const auto t = state->view->image(Size::Thumbnail)) {
|
|
||||||
state->image = t;
|
|
||||||
}
|
|
||||||
widget->update();
|
|
||||||
if (state->view->loaded()) {
|
|
||||||
state->downloadLifetime.destroy();
|
|
||||||
}
|
|
||||||
}, state->downloadLifetime);
|
|
||||||
|
|
||||||
widget->paintRequest(
|
widget->paintRequest(
|
||||||
) | rpl::start_with_next([=] {
|
) | rpl::start_with_next([=] {
|
||||||
auto p = QPainter(widget);
|
auto p = Painter(widget);
|
||||||
if (state->image) {
|
draw(p, 0, 0, photoSize, photoSize);
|
||||||
p.drawPixmap(0, 0, state->image->pix(widget->width(), {
|
|
||||||
.options = Images::Option::RoundCircle,
|
|
||||||
}));
|
|
||||||
}
|
|
||||||
}, widget->lifetime());
|
}, widget->lifetime());
|
||||||
|
|
||||||
return owned;
|
return owned;
|
||||||
|
|
|
@ -10,7 +10,12 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||||
#include <QtCore/QDateTime>
|
#include <QtCore/QDateTime>
|
||||||
|
|
||||||
#include "data/data_credits.h"
|
#include "data/data_credits.h"
|
||||||
|
#include "data/data_file_origin.h"
|
||||||
|
#include "data/data_photo.h"
|
||||||
|
#include "data/data_photo_media.h"
|
||||||
|
#include "data/data_session.h"
|
||||||
#include "lang/lang_keys.h"
|
#include "lang/lang_keys.h"
|
||||||
|
#include "main/main_session.h"
|
||||||
#include "ui/empty_userpic.h"
|
#include "ui/empty_userpic.h"
|
||||||
#include "ui/painter.h"
|
#include "ui/painter.h"
|
||||||
#include "styles/style_credits.h"
|
#include "styles/style_credits.h"
|
||||||
|
@ -67,6 +72,56 @@ PaintRoundImageCallback GenerateCreditsPaintUserpicCallback(
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Fn<void(Painter &, int, int, int, int)> GenerateCreditsPaintEntryCallback(
|
||||||
|
not_null<PhotoData*> photo,
|
||||||
|
Fn<void()> update) {
|
||||||
|
struct State {
|
||||||
|
std::shared_ptr<Data::PhotoMedia> view;
|
||||||
|
Image *imagePtr = nullptr;
|
||||||
|
QImage image;
|
||||||
|
rpl::lifetime downloadLifetime;
|
||||||
|
bool entryImageLoaded = false;
|
||||||
|
};
|
||||||
|
const auto state = std::make_shared<State>();
|
||||||
|
state->view = photo->createMediaView();
|
||||||
|
photo->load(Data::PhotoSize::Thumbnail, {});
|
||||||
|
|
||||||
|
rpl::single(rpl::empty_value()) | rpl::then(
|
||||||
|
photo->owner().session().downloaderTaskFinished()
|
||||||
|
) | rpl::start_with_next([=] {
|
||||||
|
using Size = Data::PhotoSize;
|
||||||
|
if (const auto large = state->view->image(Size::Large)) {
|
||||||
|
state->imagePtr = large;
|
||||||
|
} else if (const auto small = state->view->image(Size::Small)) {
|
||||||
|
state->imagePtr = small;
|
||||||
|
} else if (const auto t = state->view->image(Size::Thumbnail)) {
|
||||||
|
state->imagePtr = t;
|
||||||
|
}
|
||||||
|
update();
|
||||||
|
if (state->view->loaded()) {
|
||||||
|
state->entryImageLoaded = true;
|
||||||
|
state->downloadLifetime.destroy();
|
||||||
|
}
|
||||||
|
}, state->downloadLifetime);
|
||||||
|
|
||||||
|
return [=](Painter &p, int x, int y, int outerWidth, int size) {
|
||||||
|
if (state->imagePtr
|
||||||
|
&& (!state->entryImageLoaded || state->image.isNull())) {
|
||||||
|
const auto image = state->imagePtr->original();
|
||||||
|
const auto minSize = std::min(image.width(), image.height());
|
||||||
|
state->image = Images::Prepare(
|
||||||
|
image.copy(
|
||||||
|
(image.width() - minSize) / 2,
|
||||||
|
(image.height() - minSize) / 2,
|
||||||
|
minSize,
|
||||||
|
minSize),
|
||||||
|
size * style::DevicePixelRatio(),
|
||||||
|
{ .options = Images::Option::RoundCircle });
|
||||||
|
}
|
||||||
|
p.drawImage(x, y, state->image);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
TextWithEntities GenerateEntryName(const Data::CreditsHistoryEntry &entry) {
|
TextWithEntities GenerateEntryName(const Data::CreditsHistoryEntry &entry) {
|
||||||
return ((entry.peerType == Data::CreditsHistoryEntry::PeerType::Fragment)
|
return ((entry.peerType == Data::CreditsHistoryEntry::PeerType::Fragment)
|
||||||
? tr::lng_bot_username_description1_link
|
? tr::lng_bot_username_description1_link
|
||||||
|
|
|
@ -7,6 +7,8 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||||
*/
|
*/
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
class PhotoData;
|
||||||
|
|
||||||
namespace Data {
|
namespace Data {
|
||||||
struct CreditsHistoryEntry;
|
struct CreditsHistoryEntry;
|
||||||
} // namespace Data
|
} // namespace Data
|
||||||
|
@ -16,6 +18,10 @@ namespace Ui {
|
||||||
Fn<void(Painter &, int, int, int, int)> GenerateCreditsPaintUserpicCallback(
|
Fn<void(Painter &, int, int, int, int)> GenerateCreditsPaintUserpicCallback(
|
||||||
const Data::CreditsHistoryEntry &entry);
|
const Data::CreditsHistoryEntry &entry);
|
||||||
|
|
||||||
|
Fn<void(Painter &, int, int, int, int)> GenerateCreditsPaintEntryCallback(
|
||||||
|
not_null<PhotoData*> photo,
|
||||||
|
Fn<void()> update);
|
||||||
|
|
||||||
[[nodiscard]] TextWithEntities GenerateEntryName(
|
[[nodiscard]] TextWithEntities GenerateEntryName(
|
||||||
const Data::CreditsHistoryEntry &entry);
|
const Data::CreditsHistoryEntry &entry);
|
||||||
|
|
||||||
|
|
|
@ -358,8 +358,6 @@ PRIVATE
|
||||||
ui/effects/fireworks_animation.h
|
ui/effects/fireworks_animation.h
|
||||||
ui/effects/glare.cpp
|
ui/effects/glare.cpp
|
||||||
ui/effects/glare.h
|
ui/effects/glare.h
|
||||||
ui/effects/credits_graphics.cpp
|
|
||||||
ui/effects/credits_graphics.h
|
|
||||||
ui/effects/loading_element.cpp
|
ui/effects/loading_element.cpp
|
||||||
ui/effects/loading_element.h
|
ui/effects/loading_element.h
|
||||||
ui/effects/outline_segments.cpp
|
ui/effects/outline_segments.cpp
|
||||||
|
|
Loading…
Add table
Reference in a new issue