Skip to content

Commit

Permalink
Extract PhotoData to new file
Browse files Browse the repository at this point in the history
Inspired by upstream commit telegramdesktop/tdesktop@ffc20e4
Related to #174
  • Loading branch information
leha-bot committed Apr 4, 2019
1 parent 792a88d commit 94682f3
Show file tree
Hide file tree
Showing 5 changed files with 247 additions and 209 deletions.
1 change: 1 addition & 0 deletions Telegram/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -247,6 +247,7 @@ add_executable(Kepka WIN32 MACOSX_BUNDLE

SourceFiles/data/data_abstract_structure.cpp
SourceFiles/data/data_drafts.cpp
SourceFiles/data/data_photo.cpp

SourceFiles/dialogs/dialogs_indexed_list.cpp
SourceFiles/dialogs/dialogs_inner_widget.cpp
Expand Down
134 changes: 134 additions & 0 deletions Telegram/SourceFiles/data/data_photo.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,134 @@
#include "data/data_photo.h"
#include "messenger.h" // Messenger::
#include "app.h" // App::
#include "facades.h" // Notify::historyItemLayoutChanged
#include "history/history_media.h" // HistoryMedia definition
#include "history/history_media_types.h" // HistoryPhoto
#include "mainwidget.h" // MainWidget

PhotoData::PhotoData(const PhotoId &id, const quint64 &access, qint32 date, const ImagePtr &thumb,
const ImagePtr &medium, const ImagePtr &full)
: id(id)
, access(access)
, date(date)
, thumb(thumb)
, medium(medium)
, full(full) {}

void PhotoData::automaticLoad(const HistoryItem *item) {
full->automaticLoad(item);
}

void PhotoData::automaticLoadSettingsChanged() {
full->automaticLoadSettingsChanged();
}

void PhotoData::download() {
full->loadEvenCancelled();
notifyLayoutChanged();
}

bool PhotoData::loaded() const {
bool wasLoading = loading();
if (full->loaded()) {
if (wasLoading) {
notifyLayoutChanged();
}
return true;
}
return false;
}

bool PhotoData::loading() const {
return full->loading();
}

bool PhotoData::displayLoading() const {
return full->loading() ? full->displayLoading() : uploading();
}

void PhotoData::cancel() {
full->cancel();
notifyLayoutChanged();
}

void PhotoData::notifyLayoutChanged() const {
auto &items = App::photoItems();
auto i = items.constFind(const_cast<PhotoData *>(this));
if (i != items.cend()) {
for_const (auto item, i.value()) { Notify::historyItemLayoutChanged(item); }
}
}

double PhotoData::progress() const {
if (uploading()) {
if (uploadingData->size > 0) {
return double(uploadingData->offset) / uploadingData->size;
}
return 0;
}
return full->progress();
}

qint32 PhotoData::loadOffset() const {
return full->loadOffset();
}

bool PhotoData::uploading() const {
return !!uploadingData;
}

void PhotoData::forget() {
thumb->forget();
replyPreview->forget();
medium->forget();
full->forget();
}

ImagePtr PhotoData::makeReplyPreview() {
if (replyPreview->isNull() && !thumb->isNull()) {
if (thumb->loaded()) {
int w = thumb->width(), h = thumb->height();
if (w <= 0) w = 1;
if (h <= 0) h = 1;
replyPreview =
ImagePtr(w > h ? thumb->pix(w * st::msgReplyBarSize.height() / h, st::msgReplyBarSize.height()) :
thumb->pix(st::msgReplyBarSize.height()),
"PNG");
} else {
thumb->load();
}
}
return replyPreview;
}

void PhotoOpenClickHandler::onClickImpl() const {
Messenger::Instance().showPhoto(this, App::hoveredLinkItem() ? App::hoveredLinkItem() : App::contextItem());
}

void PhotoSaveClickHandler::onClickImpl() const {
auto data = photo();
if (!data->date) return;

data->download();
}

void PhotoCancelClickHandler::onClickImpl() const {
auto data = photo();
if (!data->date) return;

if (data->uploading()) {
if (auto item =
App::hoveredLinkItem() ? App::hoveredLinkItem() : (App::contextItem() ? App::contextItem() : nullptr)) {
if (auto media = item->getMedia()) {
if (media->type() == MediaTypePhoto && static_cast<HistoryPhoto *>(media)->photo() == data) {
App::contextItem(item);
App::main()->cancelUploadLayer();
}
}
}
} else {
data->cancel();
}
}

111 changes: 111 additions & 0 deletions Telegram/SourceFiles/data/data_photo.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
//
// This file is part of Kepka,
// an unofficial desktop version of Telegram messaging app,
// see https://github.com/procxx/kepka
//
// Kepka is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// It is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// In addition, as a special exception, the copyright holders give permission
// to link the code of portions of this program with the OpenSSL library.
//
// Full license: https://github.com/procxx/kepka/blob/master/LICENSE
// Copyright (c) 2014-2017 John Preston, https://desktop.telegram.org
// Copyright (c) 2017- Kepka Contributors, https://github.com/procxx
//
#pragma once
#include <qglobal.h> // qint64, quint64
#include "core/click_handler.h" // LeftButtonClickHandler
#include "ui/images.h" // ImagePtr

using PhotoId = quint64;

class PhotoData {
public:
PhotoData(const PhotoId &id, const quint64 &access = 0, qint32 date = 0, const ImagePtr &thumb = ImagePtr(),
const ImagePtr &medium = ImagePtr(), const ImagePtr &full = ImagePtr());

void automaticLoad(const HistoryItem *item);
void automaticLoadSettingsChanged();

void download();
bool loaded() const;
bool loading() const;
bool displayLoading() const;
void cancel();
double progress() const;
qint32 loadOffset() const;
bool uploading() const;

void forget();
ImagePtr makeReplyPreview();

PhotoId id;
quint64 access;
qint32 date;
ImagePtr thumb, replyPreview;
ImagePtr medium;
ImagePtr full;

PeerData *peer = nullptr; // for chat and channel photos connection
// geo, caption

struct UploadingData {
UploadingData(int size)
: size(size) {}
int offset = 0;
int size = 0;
};
std::unique_ptr<UploadingData> uploadingData;

private:
void notifyLayoutChanged() const;
};

class PhotoClickHandler : public LeftButtonClickHandler {
public:
PhotoClickHandler(not_null<PhotoData *> photo, PeerData *peer = nullptr)
: _photo(photo)
, _peer(peer) {}
not_null<PhotoData *> photo() const {
return _photo;
}
PeerData *peer() const {
return _peer;
}

private:
not_null<PhotoData *> _photo;
PeerData *_peer;
};

class PhotoOpenClickHandler : public PhotoClickHandler {
public:
using PhotoClickHandler::PhotoClickHandler;

protected:
void onClickImpl() const override;
};

class PhotoSaveClickHandler : public PhotoClickHandler {
public:
using PhotoClickHandler::PhotoClickHandler;

protected:
void onClickImpl() const override;
};

class PhotoCancelClickHandler : public PhotoClickHandler {
public:
using PhotoClickHandler::PhotoClickHandler;

protected:
void onClickImpl() const override;
};
126 changes: 0 additions & 126 deletions Telegram/SourceFiles/structs.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1156,132 +1156,6 @@ bool PtsWaiter::check(ChannelData *channel, qint32 pts,
return !count;
}

PhotoData::PhotoData(const PhotoId &id, const quint64 &access, qint32 date, const ImagePtr &thumb,
const ImagePtr &medium, const ImagePtr &full)
: id(id)
, access(access)
, date(date)
, thumb(thumb)
, medium(medium)
, full(full) {}

void PhotoData::automaticLoad(const HistoryItem *item) {
full->automaticLoad(item);
}

void PhotoData::automaticLoadSettingsChanged() {
full->automaticLoadSettingsChanged();
}

void PhotoData::download() {
full->loadEvenCancelled();
notifyLayoutChanged();
}

bool PhotoData::loaded() const {
bool wasLoading = loading();
if (full->loaded()) {
if (wasLoading) {
notifyLayoutChanged();
}
return true;
}
return false;
}

bool PhotoData::loading() const {
return full->loading();
}

bool PhotoData::displayLoading() const {
return full->loading() ? full->displayLoading() : uploading();
}

void PhotoData::cancel() {
full->cancel();
notifyLayoutChanged();
}

void PhotoData::notifyLayoutChanged() const {
auto &items = App::photoItems();
auto i = items.constFind(const_cast<PhotoData *>(this));
if (i != items.cend()) {
for_const (auto item, i.value()) { Notify::historyItemLayoutChanged(item); }
}
}

double PhotoData::progress() const {
if (uploading()) {
if (uploadingData->size > 0) {
return double(uploadingData->offset) / uploadingData->size;
}
return 0;
}
return full->progress();
}

qint32 PhotoData::loadOffset() const {
return full->loadOffset();
}

bool PhotoData::uploading() const {
return !!uploadingData;
}

void PhotoData::forget() {
thumb->forget();
replyPreview->forget();
medium->forget();
full->forget();
}

ImagePtr PhotoData::makeReplyPreview() {
if (replyPreview->isNull() && !thumb->isNull()) {
if (thumb->loaded()) {
int w = thumb->width(), h = thumb->height();
if (w <= 0) w = 1;
if (h <= 0) h = 1;
replyPreview =
ImagePtr(w > h ? thumb->pix(w * st::msgReplyBarSize.height() / h, st::msgReplyBarSize.height()) :
thumb->pix(st::msgReplyBarSize.height()),
"PNG");
} else {
thumb->load();
}
}
return replyPreview;
}

void PhotoOpenClickHandler::onClickImpl() const {
Messenger::Instance().showPhoto(this, App::hoveredLinkItem() ? App::hoveredLinkItem() : App::contextItem());
}

void PhotoSaveClickHandler::onClickImpl() const {
auto data = photo();
if (!data->date) return;

data->download();
}

void PhotoCancelClickHandler::onClickImpl() const {
auto data = photo();
if (!data->date) return;

if (data->uploading()) {
if (auto item =
App::hoveredLinkItem() ? App::hoveredLinkItem() : (App::contextItem() ? App::contextItem() : nullptr)) {
if (auto media = item->getMedia()) {
if (media->type() == MediaTypePhoto && static_cast<HistoryPhoto *>(media)->photo() == data) {
App::contextItem(item);
App::main()->cancelUploadLayer();
}
}
}
} else {
data->cancel();
}
}

QString joinList(const QStringList &list, const QString &sep) {
QString result;
if (list.isEmpty()) return result;
Expand Down
Loading

0 comments on commit 94682f3

Please sign in to comment.