diff --git a/Telegram/Resources/langs/lang.strings b/Telegram/Resources/langs/lang.strings index 4666a3b16..9c4b5adb6 100644 --- a/Telegram/Resources/langs/lang.strings +++ b/Telegram/Resources/langs/lang.strings @@ -163,7 +163,6 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_pinned_unpin" = "Unpin"; "lng_pinned_notify" = "Notify all members"; -"lng_edit_media" = "Edit media"; "lng_edit_media_album_error" = "This file cannot be saved as a part of an album."; "lng_edit_media_invalid_file" = "Sorry, no way to use this file."; diff --git a/Telegram/SourceFiles/boxes/boxes.style b/Telegram/SourceFiles/boxes/boxes.style index ce528cd60..a5f98b63e 100644 --- a/Telegram/SourceFiles/boxes/boxes.style +++ b/Telegram/SourceFiles/boxes/boxes.style @@ -595,6 +595,23 @@ backgroundScroll: ScrollArea(boxLayerScroll) { deltab: 10px; } +editMediaButtonSize: 29px; +editMediaButtonSkip: 8px; +editMediaButtonFileSkipRight: 1px; +editMediaButtonFileSkipTop: 7px; + +editMediaButtonIconFile: icon {{ "settings_edit", menuIconFg }}; +editMediaButtonIconPhoto: icon {{ "settings_edit", msgServiceFg }}; +editMediaButton: IconButton { + width: editMediaButtonSize; + height: editMediaButtonSize; + + icon: editMediaButtonIconPhoto; + + rippleAreaSize: editMediaButtonSize; + ripple: defaultRippleAnimation; +} + calendarTitleHeight: boxTitleHeight; calendarPrevious: IconButton { width: calendarTitleHeight; diff --git a/Telegram/SourceFiles/boxes/edit_caption_box.cpp b/Telegram/SourceFiles/boxes/edit_caption_box.cpp index 2d11638cc..f85a2288a 100644 --- a/Telegram/SourceFiles/boxes/edit_caption_box.cpp +++ b/Telegram/SourceFiles/boxes/edit_caption_box.cpp @@ -174,8 +174,17 @@ EditCaptionBox::EditCaptionBox( if (!tw || !th) { tw = th = 1; } + + // Edit media button takes place on thumb preview + // And its height can be greater than height of thumb. + const auto minThumbHeight = st::editMediaButtonSize + + st::editMediaButtonSkip * 2; + const auto minThumbWidth = minThumbHeight * tw / th; + if (thumbWidth < st::sendMediaPreviewSize) { - thumbWidth = (thumbWidth > 20) ? thumbWidth : 20; + thumbWidth = (thumbWidth > minThumbWidth) + ? thumbWidth + : minThumbWidth; } else { thumbWidth = st::sendMediaPreviewSize; } @@ -211,7 +220,7 @@ EditCaptionBox::EditCaptionBox( _thumb = App::pixmapFromImageInPlace(_thumb.toImage().scaled( _thumbw * cIntRetinaFactor(), _thumbh * cIntRetinaFactor(), - Qt::IgnoreAspectRatio, + Qt::KeepAspectRatio, Qt::SmoothTransformation)); _thumb.setDevicePixelRatio(cRetinaFactor()); }; @@ -397,9 +406,20 @@ void EditCaptionBox::updateEditPreview() { _thumbh = _thumb.height() / cIntRetinaFactor(); _thumbx = (st::boxWideWidth - _thumbw) / 2; } + updateEditMediaButton(); captionResized(); } +void EditCaptionBox::updateEditMediaButton() { + const auto icon = _doc + ? &st::editMediaButtonIconFile + : &st::editMediaButtonIconPhoto; + const auto color = _doc ? &st::windowBgRipple : &st::callFingerprintBg; + _editMedia->setIconOverride(icon); + _editMedia->setRippleColorOverride(color); + _editMedia->setForceRippled(!_doc, anim::type::instant); +} + void EditCaptionBox::createEditMediaButton() { const auto callback = [=](FileDialog::OpenResult &&result) { if (result.paths.isEmpty() && result.remoteContent.isEmpty()) { @@ -494,11 +514,15 @@ void EditCaptionBox::createEditMediaButton() { crl::guard(this, callback)); }; - _editMediaClicks.events() | rpl::start_with_next([=] { - buttonCallback(); - }, lifetime()); + _editMediaClicks.events( + ) | rpl::start_with_next( + buttonCallback, + lifetime()); - addButton(langFactory(lng_edit_media), buttonCallback); + // Create edit media button. + _editMedia.create(this, st::editMediaButton); + updateEditMediaButton(); + _editMedia->setClickedCallback(buttonCallback); } void EditCaptionBox::prepare() { @@ -702,11 +726,8 @@ void EditCaptionBox::paintEvent(QPaintEvent *e) { nameright = 0; statustop = st::msgFileStatusTop - st::msgFilePadding.top(); } - const auto namewidth = w - nameleft - 0; - if (namewidth > _statusw) { - //w -= (namewidth - _statusw); - //namewidth = _statusw; - } + const auto editButton = _editMedia->width() + st::editMediaButtonSkip; + const auto namewidth = w - nameleft - editButton; const auto x = (width() - w) / 2, y = st::boxPhotoPadding.top(); // App::roundRect(p, x, y, w, h, st::msgInBg, MessageInCorners, &st::msgInShadow); @@ -746,6 +767,16 @@ void EditCaptionBox::paintEvent(QPaintEvent *e) { p.setPen(st::boxTextFgError); p.drawTextLeft(_field->x(), _field->y() + _field->height() + errorTopSkip(), width(), _error); } + + if (_isAllowedEditMedia) { + _editMedia->moveToRight( + st::boxPhotoPadding.right() + (_doc + ? st::editMediaButtonFileSkipRight + : st::editMediaButtonSkip), + st::boxPhotoPadding.top() + (_doc + ? st::editMediaButtonFileSkipTop + : st::editMediaButtonSkip)); + } } void EditCaptionBox::resizeEvent(QResizeEvent *e) { @@ -866,9 +897,6 @@ void EditCaptionBox::setName(QString nameString, qint64 size) { nameString, Ui::NameTextOptions()); _status = formatSizeText(size); - _statusw = std::max( - _name.maxWidth(), - st::normalFont->width(_status)); } void EditCaptionBox::keyPressEvent(QKeyEvent *e) { diff --git a/Telegram/SourceFiles/boxes/edit_caption_box.h b/Telegram/SourceFiles/boxes/edit_caption_box.h index 5b03c0550..0676c7353 100644 --- a/Telegram/SourceFiles/boxes/edit_caption_box.h +++ b/Telegram/SourceFiles/boxes/edit_caption_box.h @@ -27,6 +27,7 @@ class Media; namespace Ui { class InputField; class EmojiButton; +class IconButton; class Checkbox; } // namespace Ui @@ -67,6 +68,7 @@ private: void setName(QString nameString, qint64 size); bool fileFromClipboard(not_null data); void updateEditPreview(); + void updateEditMediaButton(); int errorTopSkip() const; @@ -100,7 +102,6 @@ private: int _thumbh = 0; Text _name; QString _status; - int _statusw = 0; bool _isAudio = false; bool _isImage = false; @@ -113,11 +114,12 @@ private: bool _previewCancelled = false; mtpRequestId _saveRequestId = 0; - bool _asFile = false; + object_ptr _editMedia = nullptr; Ui::SlideWrap *_wayWrap = nullptr; QString _newMediaPath; bool _isAllowedEditMedia = false; bool _isAlbum = false; + bool _asFile = false; rpl::event_stream<> _editMediaClicks; QString _error;