diff --git a/Telegram/Resources/art/sprite.png b/Telegram/Resources/art/sprite.png index e4de99008f..e8cdf61df2 100644 Binary files a/Telegram/Resources/art/sprite.png and b/Telegram/Resources/art/sprite.png differ diff --git a/Telegram/Resources/art/sprite_200x.png b/Telegram/Resources/art/sprite_200x.png index cd36753b0c..366203ca32 100644 Binary files a/Telegram/Resources/art/sprite_200x.png and b/Telegram/Resources/art/sprite_200x.png differ diff --git a/Telegram/Resources/basic.style b/Telegram/Resources/basic.style index cf96f7d40e..3685b2be29 100644 --- a/Telegram/Resources/basic.style +++ b/Telegram/Resources/basic.style @@ -68,7 +68,7 @@ semiboldButtonBlueText: #2b99d5; wndMinHeight: 480px; wndDefWidth: 800px; wndDefHeight: 600px; -wndShadow: sprite(209px, 46px, 19px, 19px); +wndShadow: icon {{ "window_shadow", windowShadowFg }}; wndShadowShift: 1px; layerAlpha: 0.5; @@ -298,10 +298,11 @@ solidScroll: flatScroll { duration: 150; hiding: 0; } +defaultDropdownShadow: icon {{ "dropdown_shadow", windowShadowFg }}; defaultPopupMenu: PopupMenu { skip: 5px; - shadow: sprite(241px, 46px, 6px, 6px); + shadow: defaultDropdownShadow; shadowShift: 1px; itemBg: white; @@ -320,7 +321,7 @@ defaultPopupMenu: PopupMenu { separatorWidth: 1px; separatorFg: #f1f1f1; - arrow: sprite(0px, 126px, 4px, 7px); + arrow: icon {{ "dropdown_submenu_arrow", #373737 }}; duration: 120; @@ -687,7 +688,7 @@ btnIntroNext: flatButton(btnDefNext, btnDefBig) { radius: buttonRadius; } -boxShadow: sprite(363px, 50px, 15px, 15px); +boxShadow: icon {{ "box_shadow", windowShadowFg }}; boxShadowShift: 2px; introCountry: countryInput { @@ -1211,12 +1212,12 @@ btnBotKbHide: iconedButton(btnAttachEmoji) { downIcon: sprite(373px, 95px, 23px, 14px); downIconPos: point(5px, 17px); } -broadcastToggle: flatCheckbox { +silentToggle: flatCheckbox { textColor: black; bgColor: white; disColor: black; - width: 34px; + width: 33px; height: 46px; duration: 200; bgFunc: transition(easeOutCirc); @@ -1224,24 +1225,14 @@ broadcastToggle: flatCheckbox { font: normalFont; - imageRect: sprite(18px, 125px, 22px, 21px); - chkImageRect: sprite(40px, 125px, 22px, 21px); - overImageRect: sprite(40px, 104px, 22px, 21px); - chkOverImageRect: sprite(40px, 125px, 22px, 21px); - disImageRect: sprite(18px, 125px, 22px, 21px); - chkDisImageRect: sprite(18px, 125px, 22px, 21px); - - imagePos: point(6px, 12px); -} -silentToggle: flatCheckbox(broadcastToggle) { - width: 33px; - imageRect: sprite(354px, 242px, 21px, 21px); chkImageRect: sprite(354px, 221px, 21px, 21px); overImageRect: sprite(375px, 242px, 21px, 21px); chkOverImageRect: sprite(375px, 221px, 21px, 21px); disImageRect: sprite(354px, 242px, 21px, 21px); chkDisImageRect: sprite(354px, 221px, 21px, 21px); + + imagePos: point(6px, 12px); } btnRecordAudio: sprite(379px, 390px, 16px, 24px); btnRecordAudioActive: sprite(379px, 366px, 16px, 24px); @@ -1538,17 +1529,15 @@ dropdownDef: dropdown { borderColor: #ebebeb; padding: margins(10px, 10px, 10px, 10px); - shadow: sprite(241px, 46px, 6px, 6px); + shadow: defaultDropdownShadow; shadowShift: 1px; duration: 150; width: 0px; } - -defaultInnerDropdownShadow: icon {{ "dropdown_shadow", windowShadowFg }}; defaultInnerDropdown: InnerDropdown { padding: margins(10px, 10px, 10px, 10px); - shadow: defaultInnerDropdownShadow; + shadow: defaultDropdownShadow; shadowShift: 1px; duration: 150; @@ -1838,7 +1827,7 @@ mvControlSize: 90px; mvIconSize: size(60px, 56px); mvDropdown: dropdown(dropdownDef) { - shadow: sprite(0px, 0px, 0px, 0px); + shadow: icon {}; padding: margins(11px, 12px, 11px, 12px); border: 0px; @@ -1863,7 +1852,7 @@ mvButton: iconedButton(btnDefIconed) { duration: 0; } mvPopupMenu: PopupMenu(defaultPopupMenu) { - shadow: sprite(0px, 0px, 0px, 0px); + shadow: icon {}; itemBg: #383838; itemBgOver: #505050; diff --git a/Telegram/Resources/basic_types.style b/Telegram/Resources/basic_types.style index 29724f60b6..73918d110e 100644 --- a/Telegram/Resources/basic_types.style +++ b/Telegram/Resources/basic_types.style @@ -233,7 +233,7 @@ dropdown { borderColor: color; padding: margins; - shadow: sprite; + shadow: icon; shadowShift: pixels; duration: int; @@ -255,7 +255,7 @@ InnerDropdown { PopupMenu { skip: pixels; - shadow: sprite; + shadow: icon; shadowShift: pixels; itemBg: color; @@ -273,7 +273,7 @@ PopupMenu { separatorWidth: pixels; separatorFg: color; - arrow: sprite; + arrow: icon; duration: int; diff --git a/Telegram/Resources/icons/box_shadow.png b/Telegram/Resources/icons/box_shadow.png new file mode 100644 index 0000000000..44d17254e6 Binary files /dev/null and b/Telegram/Resources/icons/box_shadow.png differ diff --git a/Telegram/Resources/icons/box_shadow@2x.png b/Telegram/Resources/icons/box_shadow@2x.png new file mode 100644 index 0000000000..06293b7405 Binary files /dev/null and b/Telegram/Resources/icons/box_shadow@2x.png differ diff --git a/Telegram/Resources/icons/dropdown_submenu_arrow.png b/Telegram/Resources/icons/dropdown_submenu_arrow.png new file mode 100644 index 0000000000..d7015e7e52 Binary files /dev/null and b/Telegram/Resources/icons/dropdown_submenu_arrow.png differ diff --git a/Telegram/Resources/icons/dropdown_submenu_arrow@2x.png b/Telegram/Resources/icons/dropdown_submenu_arrow@2x.png new file mode 100644 index 0000000000..49ca1c3936 Binary files /dev/null and b/Telegram/Resources/icons/dropdown_submenu_arrow@2x.png differ diff --git a/Telegram/Resources/icons/window_shadow.png b/Telegram/Resources/icons/window_shadow.png new file mode 100644 index 0000000000..88f5ee95a5 Binary files /dev/null and b/Telegram/Resources/icons/window_shadow.png differ diff --git a/Telegram/Resources/icons/window_shadow@2x.png b/Telegram/Resources/icons/window_shadow@2x.png new file mode 100644 index 0000000000..d2e968fdb7 Binary files /dev/null and b/Telegram/Resources/icons/window_shadow@2x.png differ diff --git a/Telegram/Resources/langs/lang_ko.strings b/Telegram/Resources/langs/lang_ko.strings index 11bfb8444d..b5da76074b 100644 --- a/Telegram/Resources/langs/lang_ko.strings +++ b/Telegram/Resources/langs/lang_ko.strings @@ -772,12 +772,12 @@ Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org "lng_allow_bot" = "허용"; "lng_bot_start" = "시작"; -"lng_bot_choose_group" = "Select a Group"; +"lng_bot_choose_group" = "그룹방 선택"; "lng_bot_no_groups" = "그룹이 존재하지 않습니다."; "lng_bot_groups_not_found" = "그룹을 찾을 수 없습니다."; "lng_bot_sure_invite" = "<<{group}>>에 봇을 추가 하시겠습니까?"; "lng_bot_already_in_group" = "봇이 이미 그룹의 멤버입니다."; -"lng_bot_choose_chat" = "Select a Chat"; +"lng_bot_choose_chat" = "채팅방 선택"; "lng_bot_no_chats" = "채팅방이 없습니다."; "lng_bot_chats_not_found" = "채팅방을 찾 을 수 없음"; "lng_bot_sure_share_game" = "{user}에게 게임을 공유하겠습니까?"; @@ -787,10 +787,10 @@ Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org "lng_user_typing" = "{user}님이 입력중입니다."; "lng_users_typing" = "{user}님과 {second_user}님이 입력중입니다."; "lng_many_typing" = "{count:_not_used_|#명이|#명이} 입력중입니다"; -"lng_playing_game" = "playing a game"; -"lng_user_playing_game" = "{user} is playing a game"; -"lng_users_playing_game" = "{user} and {second_user} are playing a game"; -"lng_many_playing_game" = "{count:_not_used_|# is|# are} playing a game"; +"lng_playing_game" = "게임 중"; +"lng_user_playing_game" = "{user}님이 게임 중입니다."; +"lng_users_playing_game" = "{user}님과 {second_user}님이 게임 중입니다."; +"lng_many_playing_game" = "{count:_not_used_|#명이|#명이} 게임 중입니다"; "lng_send_action_record_video" = "비디오 녹화 중"; "lng_user_action_record_video" = "{user}님이 녹화중입니다"; "lng_send_action_upload_video" = "비디오 전송 중"; diff --git a/Telegram/SourceFiles/application.cpp b/Telegram/SourceFiles/application.cpp index f46009d49a..9a21f66af3 100644 --- a/Telegram/SourceFiles/application.cpp +++ b/Telegram/SourceFiles/application.cpp @@ -28,6 +28,7 @@ Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org #include "lang.h" #include "boxes/confirmbox.h" #include "ui/filedialog.h" +#include "ui/popupmenu.h" #include "langloaderplain.h" #include "localstorage.h" #include "autoupdater.h" diff --git a/Telegram/SourceFiles/boxes/abstractbox.cpp b/Telegram/SourceFiles/boxes/abstractbox.cpp index 7e6846c007..a9f4974f4f 100644 --- a/Telegram/SourceFiles/boxes/abstractbox.cpp +++ b/Telegram/SourceFiles/boxes/abstractbox.cpp @@ -160,7 +160,7 @@ void AbstractBox::resizeMaxHeight(int32 newWidth, int32 maxHeight) { move(r.left(), newTop); } } - parentWidget()->update(geometry().united(g).marginsAdded(QMargins(st::boxShadow.pxWidth(), st::boxShadow.pxHeight(), st::boxShadow.pxWidth(), st::boxShadow.pxHeight()))); + parentWidget()->update(geometry().united(g).marginsAdded(QMargins(st::boxShadow.width(), st::boxShadow.height(), st::boxShadow.width(), st::boxShadow.height()))); } } } diff --git a/Telegram/SourceFiles/boxes/stickersetbox.h b/Telegram/SourceFiles/boxes/stickersetbox.h index 113ac8aa32..71001d8f92 100644 --- a/Telegram/SourceFiles/boxes/stickersetbox.h +++ b/Telegram/SourceFiles/boxes/stickersetbox.h @@ -337,7 +337,7 @@ private: int _dragging = -1; int _above = -1; - BoxShadow _aboveShadow; + Ui::RectShadow _aboveShadow; int32 _scrollbar = 0; }; diff --git a/Telegram/SourceFiles/codegen/style/parsed_file.cpp b/Telegram/SourceFiles/codegen/style/parsed_file.cpp index a7acde2317..f45ecebad5 100644 --- a/Telegram/SourceFiles/codegen/style/parsed_file.cpp +++ b/Telegram/SourceFiles/codegen/style/parsed_file.cpp @@ -769,10 +769,6 @@ structure::Value ParsedFile::readIconValue() { } } - if (parts.empty()) { - logErrorUnexpectedToken() << "at least one icon part"; - return {}; - } return { structure::data::icon { parts } }; } file_.putBack(); diff --git a/Telegram/SourceFiles/core/click_handler_types.cpp b/Telegram/SourceFiles/core/click_handler_types.cpp index 45f331df3a..53ea0b47d5 100644 --- a/Telegram/SourceFiles/core/click_handler_types.cpp +++ b/Telegram/SourceFiles/core/click_handler_types.cpp @@ -27,6 +27,7 @@ Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org #include "core/qthelp_regex.h" #include "core/qthelp_url.h" #include "localstorage.h" +#include "ui/popupmenu.h" QString UrlClickHandler::copyToClipboardContextItemText() const { return lang(isEmail() ? lng_context_copy_email : lng_context_copy_link); diff --git a/Telegram/SourceFiles/dialogswidget.cpp b/Telegram/SourceFiles/dialogswidget.cpp index 757f55c108..b6b7dee00d 100644 --- a/Telegram/SourceFiles/dialogswidget.cpp +++ b/Telegram/SourceFiles/dialogswidget.cpp @@ -25,6 +25,7 @@ Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org #include "dialogs/dialogs_layout.h" #include "styles/style_dialogs.h" #include "ui/buttons/round_button.h" +#include "ui/popupmenu.h" #include "data/data_drafts.h" #include "lang.h" #include "application.h" diff --git a/Telegram/SourceFiles/dialogswidget.h b/Telegram/SourceFiles/dialogswidget.h index 743705025d..78ed3d010c 100644 --- a/Telegram/SourceFiles/dialogswidget.h +++ b/Telegram/SourceFiles/dialogswidget.h @@ -22,7 +22,6 @@ Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org #include "window/section_widget.h" -class MainWidget; namespace Dialogs { class Row; class FakeRow; @@ -33,6 +32,9 @@ namespace Ui { class RoundButton; } // namespace Ui +class MainWidget; +class PopupMenu; + enum DialogsSearchRequestType { DialogsSearchFromStart, DialogsSearchFromOffset, diff --git a/Telegram/SourceFiles/dropdown.cpp b/Telegram/SourceFiles/dropdown.cpp index 1045d9bb08..5876eeff9c 100644 --- a/Telegram/SourceFiles/dropdown.cpp +++ b/Telegram/SourceFiles/dropdown.cpp @@ -122,7 +122,7 @@ void Dropdown::resizeEvent(QResizeEvent *e) { } void Dropdown::paintEvent(QPaintEvent *e) { - QPainter p(this); + Painter p(this); if (_a_appearance.animating()) { p.setOpacity(a_opacity.current()); @@ -358,7 +358,7 @@ void DragArea::setText(const QString &text, const QString &subtext) { } void DragArea::paintEvent(QPaintEvent *e) { - QPainter p(this); + Painter p(this); if (_a_appearance.animating()) { p.setOpacity(a_opacity.current()); diff --git a/Telegram/SourceFiles/dropdown.h b/Telegram/SourceFiles/dropdown.h index 836b2a5315..a9ed3f6992 100644 --- a/Telegram/SourceFiles/dropdown.h +++ b/Telegram/SourceFiles/dropdown.h @@ -21,7 +21,7 @@ Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org #pragma once #include "ui/twidget.h" -#include "ui/boxshadow.h" +#include "ui/effects/rect_shadow.h" class Dropdown : public TWidget { Q_OBJECT @@ -91,7 +91,7 @@ private: QTimer _hideTimer; - BoxShadow _shadow; + Ui::RectShadow _shadow; }; @@ -101,13 +101,6 @@ class DragArea : public TWidget { public: DragArea(QWidget *parent); - void paintEvent(QPaintEvent *e); - void mouseMoveEvent(QMouseEvent *e); - void dragEnterEvent(QDragEnterEvent *e); - void dragLeaveEvent(QDragLeaveEvent *e); - void dropEvent(QDropEvent *e); - void dragMoveEvent(QDragMoveEvent *e); - void setText(const QString &text, const QString &subtext); void otherEnter(); @@ -127,6 +120,14 @@ public: ).contains(QRect(mapFromGlobal(globalRect.topLeft()), globalRect.size())); } +protected: + void paintEvent(QPaintEvent *e) override; + void mouseMoveEvent(QMouseEvent *e) override; + void dragEnterEvent(QDragEnterEvent *e) override; + void dragLeaveEvent(QDragLeaveEvent *e) override; + void dropEvent(QDropEvent *e) override; + void dragMoveEvent(QDragMoveEvent *e) override; + signals: void dropped(const QMimeData *data); @@ -143,7 +144,7 @@ private: anim::cvalue a_color; Animation _a_appearance; - BoxShadow _shadow; + Ui::RectShadow _shadow; QString _text, _subtext; diff --git a/Telegram/SourceFiles/history/field_autocomplete.cpp b/Telegram/SourceFiles/history/field_autocomplete.cpp index 5b710363fc..df5f5a7b61 100644 --- a/Telegram/SourceFiles/history/field_autocomplete.cpp +++ b/Telegram/SourceFiles/history/field_autocomplete.cpp @@ -28,13 +28,8 @@ Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org FieldAutocomplete::FieldAutocomplete(QWidget *parent) : TWidget(parent) , _scroll(this, st::mentionScroll) , _inner(this, &_mrows, &_hrows, &_brows, &_srows) -, _chat(0) -, _user(0) -, _channel(0) -, _hiding(false) , a_opacity(0) -, _a_appearance(animation(this, &FieldAutocomplete::step_appearance)) -, _shadow(st::dropdownDef.shadow) { +, _a_appearance(animation(this, &FieldAutocomplete::step_appearance)) { _hideTimer.setSingleShot(true); connect(&_hideTimer, SIGNAL(timeout()), this, SLOT(hideStart())); diff --git a/Telegram/SourceFiles/history/field_autocomplete.h b/Telegram/SourceFiles/history/field_autocomplete.h index 9f824a8297..d0579b16b7 100644 --- a/Telegram/SourceFiles/history/field_autocomplete.h +++ b/Telegram/SourceFiles/history/field_autocomplete.h @@ -21,7 +21,7 @@ Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org #pragma once #include "ui/twidget.h" -#include "ui/boxshadow.h" +#include "ui/effects/rect_shadow.h" namespace internal { @@ -91,9 +91,10 @@ public slots: void showStart(); -private: +protected: void paintEvent(QPaintEvent *e) override; +private: void updateFiltered(bool resetScroll = false); void recount(bool resetScroll = false); @@ -108,9 +109,9 @@ private: ChildWidget _scroll; ChildWidget _inner; - ChatData *_chat; - UserData *_user; - ChannelData *_channel; + ChatData *_chat = nullptr; + UserData *_user = nullptr; + ChannelData *_channel = nullptr; EmojiPtr _emoji; enum class Type { Mentions, @@ -124,14 +125,13 @@ private: bool _addInlineBots; int32 _width, _height; - bool _hiding; + bool _hiding = false; anim::fvalue a_opacity; Animation _a_appearance; QTimer _hideTimer; - BoxShadow _shadow; friend class internal::FieldAutocompleteInner; }; diff --git a/Telegram/SourceFiles/historywidget.cpp b/Telegram/SourceFiles/historywidget.cpp index 84987f2d94..581d15b8ef 100644 --- a/Telegram/SourceFiles/historywidget.cpp +++ b/Telegram/SourceFiles/historywidget.cpp @@ -2638,85 +2638,53 @@ void BotKeyboard::updateSelected() { } HistoryHider::HistoryHider(MainWidget *parent, bool forwardSelected) : TWidget(parent) -, _sharedContact(0) , _forwardSelected(forwardSelected) -, _sendPath(false) , _send(this, lang(lng_forward_send), st::defaultBoxButton) , _cancel(this, lang(lng_cancel), st::cancelBoxButton) -, offered(0) , a_opacity(0, 1) , _a_appearance(animation(this, &HistoryHider::step_appearance)) -, hiding(false) -, _forwardRequest(0) -, toTextWidth(0) -, shadow(st::boxShadow) { +, _shadow(st::boxShadow) { init(); } HistoryHider::HistoryHider(MainWidget *parent, UserData *sharedContact) : TWidget(parent) , _sharedContact(sharedContact) -, _forwardSelected(false) -, _sendPath(false) , _send(this, lang(lng_forward_send), st::defaultBoxButton) , _cancel(this, lang(lng_cancel), st::cancelBoxButton) -, offered(0) , a_opacity(0, 1) , _a_appearance(animation(this, &HistoryHider::step_appearance)) -, hiding(false) -, _forwardRequest(0) -, toTextWidth(0) -, shadow(st::boxShadow) { +, _shadow(st::boxShadow) { init(); } HistoryHider::HistoryHider(MainWidget *parent) : TWidget(parent) -, _sharedContact(0) -, _forwardSelected(false) , _sendPath(true) , _send(this, lang(lng_forward_send), st::defaultBoxButton) , _cancel(this, lang(lng_cancel), st::cancelBoxButton) -, offered(0) , a_opacity(0, 1) , _a_appearance(animation(this, &HistoryHider::step_appearance)) -, hiding(false) -, _forwardRequest(0) -, toTextWidth(0) -, shadow(st::boxShadow) { +, _shadow(st::boxShadow) { init(); } HistoryHider::HistoryHider(MainWidget *parent, const QString &botAndQuery) : TWidget(parent) -, _sharedContact(0) -, _forwardSelected(false) -, _sendPath(false) , _botAndQuery(botAndQuery) , _send(this, lang(lng_forward_send), st::defaultBoxButton) , _cancel(this, lang(lng_cancel), st::cancelBoxButton) -, offered(0) , a_opacity(0, 1) , _a_appearance(animation(this, &HistoryHider::step_appearance)) -, hiding(false) -, _forwardRequest(0) -, toTextWidth(0) -, shadow(st::boxShadow) { +, _shadow(st::boxShadow) { init(); } HistoryHider::HistoryHider(MainWidget *parent, const QString &url, const QString &text) : TWidget(parent) -, _sharedContact(0) -, _forwardSelected(false) -, _sendPath(false) , _shareUrl(url) , _shareText(text) , _send(this, lang(lng_forward_send), st::defaultBoxButton) , _cancel(this, lang(lng_cancel), st::cancelBoxButton) -, offered(0) , a_opacity(0, 1) , _a_appearance(animation(this, &HistoryHider::step_appearance)) -, hiding(false) -, _forwardRequest(0) -, toTextWidth(0) -, shadow(st::boxShadow) { +, _shadow(st::boxShadow) { init(); } @@ -2736,7 +2704,7 @@ void HistoryHider::step_appearance(float64 ms, bool timer) { if (dt >= 1) { _a_appearance.stop(); a_opacity.finish(); - if (hiding) { + if (_hiding) { QTimer::singleShot(0, this, SLOT(deleteLater())); } } else { @@ -2752,45 +2720,45 @@ bool HistoryHider::withConfirm() const { void HistoryHider::paintEvent(QPaintEvent *e) { Painter p(this); - if (!hiding || !cacheForAnim.isNull() || !offered) { + if (!_hiding || !_cacheForAnim.isNull() || !_offered) { p.setOpacity(a_opacity.current() * st::layerAlpha); p.fillRect(rect(), st::layerBg->b); p.setOpacity(a_opacity.current()); } - if (cacheForAnim.isNull() || !offered) { - p.setFont(st::forwardFont->f); - if (offered) { - shadow.paint(p, box, st::boxShadowShift); + if (_cacheForAnim.isNull() || !_offered) { + p.setFont(st::forwardFont); + if (_offered) { + _shadow.paint(p, _box, st::boxShadowShift); // fill bg - p.fillRect(box, st::boxBg->b); + p.fillRect(_box, st::boxBg); - p.setPen(st::black->p); - toText.drawElided(p, box.left() + st::boxPadding.left(), box.top() + st::boxPadding.top(), toTextWidth + 2); + p.setPen(st::black); + _toText.drawElided(p, _box.left() + st::boxPadding.left(), _box.top() + st::boxPadding.top(), _toTextWidth + 2); } else { int32 w = st::forwardMargins.left() + _chooseWidth + st::forwardMargins.right(), h = st::forwardMargins.top() + st::forwardFont->height + st::forwardMargins.bottom(); App::roundRect(p, (width() - w) / 2, (height() - st::titleHeight - h) / 2, w, h, st::forwardBg, ForwardCorners); - p.setPen(st::white->p); - p.drawText(box, lang(_botAndQuery.isEmpty() ? lng_forward_choose : lng_inline_switch_choose), QTextOption(style::al_center)); + p.setPen(st::white); + p.drawText(_box, lang(_botAndQuery.isEmpty() ? lng_forward_choose : lng_inline_switch_choose), QTextOption(style::al_center)); } } else { - p.drawPixmap(box.left(), box.top(), cacheForAnim); + p.drawPixmap(_box.left(), _box.top(), _cacheForAnim); } } void HistoryHider::keyPressEvent(QKeyEvent *e) { if (e->key() == Qt::Key_Escape) { - if (offered) { - offered = 0; - resizeEvent(0); + if (_offered) { + _offered = nullptr; + resizeEvent(nullptr); update(); App::main()->dialogsActivate(); } else { startHide(); } } else if (e->key() == Qt::Key_Enter || e->key() == Qt::Key_Return) { - if (offered) { + if (_offered) { forward(); } } @@ -2798,19 +2766,19 @@ void HistoryHider::keyPressEvent(QKeyEvent *e) { void HistoryHider::mousePressEvent(QMouseEvent *e) { if (e->button() == Qt::LeftButton) { - if (!box.contains(e->pos())) { + if (!_box.contains(e->pos())) { startHide(); } } } void HistoryHider::startHide() { - if (hiding) return; - hiding = true; + if (_hiding) return; + _hiding = true; if (Adaptive::OneColumn()) { QTimer::singleShot(0, this, SLOT(deleteLater())); } else { - if (offered) cacheForAnim = myGrab(this, box); + if (_offered) _cacheForAnim = myGrab(this, _box); if (_forwardRequest) MTP::cancel(_forwardRequest); a_opacity.start(0); _send.hide(); @@ -2820,17 +2788,17 @@ void HistoryHider::startHide() { } void HistoryHider::forward() { - if (!hiding && offered) { + if (!_hiding && _offered) { if (_sharedContact) { - parent()->onShareContact(offered->id, _sharedContact); + parent()->onShareContact(_offered->id, _sharedContact); } else if (_sendPath) { - parent()->onSendPaths(offered->id); + parent()->onSendPaths(_offered->id); } else if (!_shareUrl.isEmpty()) { - parent()->onShareUrl(offered->id, _shareUrl, _shareText); + parent()->onShareUrl(_offered->id, _shareUrl, _shareText); } else if (!_botAndQuery.isEmpty()) { - parent()->onInlineSwitchChosen(offered->id, _botAndQuery); + parent()->onInlineSwitchChosen(_offered->id, _botAndQuery); } else { - parent()->onForward(offered->id, _forwardSelected ? ForwardSelectedMessages : ForwardContextMessage); + parent()->onForward(_offered->id, _forwardSelected ? ForwardSelectedMessages : ForwardContextMessage); } } emit forwarded(); @@ -2847,8 +2815,8 @@ MainWidget *HistoryHider::parent() { void HistoryHider::resizeEvent(QResizeEvent *e) { int32 w = st::boxWidth, h = st::boxPadding.top() + st::boxPadding.bottom(); - if (offered) { - if (!hiding) { + if (_offered) { + if (!_hiding) { _send.show(); _cancel.show(); } @@ -2858,22 +2826,22 @@ void HistoryHider::resizeEvent(QResizeEvent *e) { _send.hide(); _cancel.hide(); } - box = QRect((width() - w) / 2, (height() - st::titleHeight - h) / 2, w, h); - _send.moveToRight(width() - (box.x() + box.width()) + st::boxButtonPadding.right(), box.y() + h - st::boxButtonPadding.bottom() - _send.height()); - _cancel.moveToRight(width() - (box.x() + box.width()) + st::boxButtonPadding.right() + _send.width() + st::boxButtonPadding.left(), _send.y()); + _box = QRect((width() - w) / 2, (height() - st::titleHeight - h) / 2, w, h); + _send.moveToRight(width() - (_box.x() + _box.width()) + st::boxButtonPadding.right(), _box.y() + h - st::boxButtonPadding.bottom() - _send.height()); + _cancel.moveToRight(width() - (_box.x() + _box.width()) + st::boxButtonPadding.right() + _send.width() + st::boxButtonPadding.left(), _send.y()); } bool HistoryHider::offerPeer(PeerId peer) { if (!peer) { - offered = 0; - toText.setText(st::boxTextFont, QString()); - toTextWidth = 0; - resizeEvent(0); + _offered = nullptr; + _toText.setText(st::boxTextFont, QString()); + _toTextWidth = 0; + resizeEvent(nullptr); return false; } - offered = App::peer(peer); + _offered = App::peer(peer); LangString phrase; - QString recipient = offered->isUser() ? offered->name : '\xAB' + offered->name + '\xBB'; + QString recipient = _offered->isUser() ? _offered->name : '\xAB' + _offered->name + '\xBB'; if (_sharedContact) { phrase = lng_forward_share_contact(lt_recipient, recipient); } else if (_sendPath) { @@ -2887,35 +2855,35 @@ bool HistoryHider::offerPeer(PeerId peer) { phrase = lng_forward_send_file_confirm(lt_name, name, lt_recipient, recipient); } } else if (!_shareUrl.isEmpty()) { - PeerId to = offered->id; - offered = 0; + PeerId to = _offered->id; + _offered = nullptr; if (parent()->onShareUrl(to, _shareUrl, _shareText)) { startHide(); } return false; } else if (!_botAndQuery.isEmpty()) { - PeerId to = offered->id; - offered = 0; + PeerId to = _offered->id; + _offered = nullptr; if (parent()->onInlineSwitchChosen(to, _botAndQuery)) { startHide(); } return false; } else { - PeerId to = offered->id; - offered = 0; + PeerId to = _offered->id; + _offered = nullptr; if (parent()->onForward(to, _forwardSelected ? ForwardSelectedMessages : ForwardContextMessage)) { startHide(); } return false; } - toText.setText(st::boxTextFont, phrase, _textNameOptions); - toTextWidth = toText.maxWidth(); - if (toTextWidth > box.width() - st::boxPadding.left() - st::boxButtonPadding.right()) { - toTextWidth = box.width() - st::boxPadding.left() - st::boxButtonPadding.right(); + _toText.setText(st::boxTextFont, phrase, _textNameOptions); + _toTextWidth = _toText.maxWidth(); + if (_toTextWidth > _box.width() - st::boxPadding.left() - st::boxButtonPadding.right()) { + _toTextWidth = _box.width() - st::boxPadding.left() - st::boxButtonPadding.right(); } - resizeEvent(0); + resizeEvent(nullptr); update(); setFocus(); @@ -2923,11 +2891,11 @@ bool HistoryHider::offerPeer(PeerId peer) { } QString HistoryHider::offeredText() const { - return toText.originalText(); + return _toText.originalText(); } bool HistoryHider::wasOffered() const { - return !!offered; + return _offered != nullptr; } HistoryHider::~HistoryHider() { diff --git a/Telegram/SourceFiles/historywidget.h b/Telegram/SourceFiles/historywidget.h index ab8d8282c8..cf6c62bca8 100644 --- a/Telegram/SourceFiles/historywidget.h +++ b/Telegram/SourceFiles/historywidget.h @@ -21,7 +21,8 @@ Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org #pragma once #include "localimageloader.h" -#include "ui/boxshadow.h" +#include "ui/effects/rect_shadow.h" +#include "ui/popupmenu.h" #include "history/history_common.h" #include "history/field_autocomplete.h" #include "window/section_widget.h" @@ -479,30 +480,31 @@ private: void init(); MainWidget *parent(); - UserData *_sharedContact; - bool _forwardSelected, _sendPath; + UserData *_sharedContact = nullptr; + bool _forwardSelected = false; + bool _sendPath = false; QString _shareUrl, _shareText; QString _botAndQuery; BoxButton _send, _cancel; - PeerData *offered; + PeerData *_offered = nullptr; anim::fvalue a_opacity; Animation _a_appearance; - QRect box; - bool hiding; + QRect _box; + bool _hiding = false; - mtpRequestId _forwardRequest; + mtpRequestId _forwardRequest = 0; - int32 _chooseWidth; + int _chooseWidth = 0; - Text toText; - int32 toTextWidth; - QPixmap cacheForAnim; + Text _toText; + int32 _toTextWidth = 0; + QPixmap _cacheForAnim; - BoxShadow shadow; + Ui::RectShadow _shadow; }; diff --git a/Telegram/SourceFiles/layerwidget.cpp b/Telegram/SourceFiles/layerwidget.cpp index 700ea01747..ca803e083e 100644 --- a/Telegram/SourceFiles/layerwidget.cpp +++ b/Telegram/SourceFiles/layerwidget.cpp @@ -83,7 +83,7 @@ private: QRect _box, _hiddenSpecialBox; float64 _opacity = 0.; - BoxShadow _shadow; + Ui::RectShadow _shadow; }; diff --git a/Telegram/SourceFiles/layerwidget.h b/Telegram/SourceFiles/layerwidget.h index ff6a668e62..8e0585547b 100644 --- a/Telegram/SourceFiles/layerwidget.h +++ b/Telegram/SourceFiles/layerwidget.h @@ -20,7 +20,7 @@ Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org */ #pragma once -#include "ui/boxshadow.h" +#include "ui/effects/rect_shadow.h" class LayerWidget : public TWidget { Q_OBJECT diff --git a/Telegram/SourceFiles/mainwindow.cpp b/Telegram/SourceFiles/mainwindow.cpp index 5ce17b79c9..706fbfe8ab 100644 --- a/Telegram/SourceFiles/mainwindow.cpp +++ b/Telegram/SourceFiles/mainwindow.cpp @@ -43,7 +43,9 @@ Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org #include "apiwrap.h" #include "settings/settings_widget.h" -ConnectingWidget::ConnectingWidget(QWidget *parent, const QString &text, const QString &reconnect) : QWidget(parent), _shadow(st::boxShadow), _reconnect(this, QString()) { +ConnectingWidget::ConnectingWidget(QWidget *parent, const QString &text, const QString &reconnect) : QWidget(parent) +, _shadow(st::boxShadow) +, _reconnect(this, QString()) { set(text, reconnect); connect(&_reconnect, SIGNAL(clicked()), this, SLOT(onReconnect())); } @@ -57,21 +59,21 @@ void ConnectingWidget::set(const QString &text, const QString &reconnect) { } else { _reconnect.setText(reconnect); _reconnect.show(); - _reconnect.move(st::connectingPadding.left() + _textWidth, st::boxShadow.pxHeight() + st::connectingPadding.top()); + _reconnect.move(st::connectingPadding.left() + _textWidth, st::boxShadow.height() + st::connectingPadding.top()); _reconnectWidth = _reconnect.width(); } - resize(st::connectingPadding.left() + _textWidth + _reconnectWidth + st::connectingPadding.right() + st::boxShadow.pxWidth(), st::boxShadow.pxHeight() + st::connectingPadding.top() + st::linkFont->height + st::connectingPadding.bottom()); + resize(st::connectingPadding.left() + _textWidth + _reconnectWidth + st::connectingPadding.right() + st::boxShadow.width(), st::boxShadow.height() + st::connectingPadding.top() + st::linkFont->height + st::connectingPadding.bottom()); update(); } void ConnectingWidget::paintEvent(QPaintEvent *e) { - QPainter p(this); + Painter p(this); - _shadow.paint(p, QRect(0, st::boxShadow.pxHeight(), width() - st::boxShadow.pxWidth(), height() - st::boxShadow.pxHeight()), 0, BoxShadow::Top | BoxShadow::Right); - p.fillRect(0, st::boxShadow.pxHeight(), width() - st::boxShadow.pxWidth(), height() - st::boxShadow.pxHeight(), st::connectingBG->b); + _shadow.paint(p, QRect(0, st::boxShadow.height(), width() - st::boxShadow.width(), height() - st::boxShadow.height()), 0, Ui::RectShadow::Side::Top | Ui::RectShadow::Side::Right); + p.fillRect(0, st::boxShadow.height(), width() - st::boxShadow.width(), height() - st::boxShadow.height(), st::connectingBG->b); p.setFont(st::linkFont->f); p.setPen(st::connectingColor->p); - p.drawText(st::connectingPadding.left(), st::boxShadow.pxHeight() + st::connectingPadding.top() + st::linkFont->ascent, _text); + p.drawText(st::connectingPadding.left(), st::boxShadow.height() + st::connectingPadding.top() + st::linkFont->ascent, _text); } void ConnectingWidget::onReconnect() { diff --git a/Telegram/SourceFiles/mainwindow.h b/Telegram/SourceFiles/mainwindow.h index 804a6b01ad..c091e5e919 100644 --- a/Telegram/SourceFiles/mainwindow.h +++ b/Telegram/SourceFiles/mainwindow.h @@ -22,7 +22,7 @@ Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org #include "title.h" #include "pspecific.h" -#include "ui/boxshadow.h" +#include "ui/effects/rect_shadow.h" #include "platform/platform_main_window.h" class MediaView; @@ -54,7 +54,7 @@ public slots: private: - BoxShadow _shadow; + Ui::RectShadow _shadow; QString _text; int32 _textWidth; LinkButton _reconnect; diff --git a/Telegram/SourceFiles/mediaview.cpp b/Telegram/SourceFiles/mediaview.cpp index 9423c45ef6..cb086d89d4 100644 --- a/Telegram/SourceFiles/mediaview.cpp +++ b/Telegram/SourceFiles/mediaview.cpp @@ -26,6 +26,7 @@ Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org #include "mainwindow.h" #include "application.h" #include "ui/filedialog.h" +#include "ui/popupmenu.h" #include "media/media_clip_reader.h" #include "media/view/media_clip_controller.h" #include "styles/style_mediaview.h" diff --git a/Telegram/SourceFiles/mediaview.h b/Telegram/SourceFiles/mediaview.h index 5b9dc024e7..ae04b731f8 100644 --- a/Telegram/SourceFiles/mediaview.h +++ b/Telegram/SourceFiles/mediaview.h @@ -29,6 +29,8 @@ class Controller; } // namespace Clip } // namespace Media +class PopupMenu; + struct AudioPlaybackState; class MediaView : public TWidget, public RPCSender, public ClickHandlerHost { diff --git a/Telegram/SourceFiles/overviewwidget.h b/Telegram/SourceFiles/overviewwidget.h index cd785b2b8a..1549d5019c 100644 --- a/Telegram/SourceFiles/overviewwidget.h +++ b/Telegram/SourceFiles/overviewwidget.h @@ -21,6 +21,7 @@ Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org #pragma once #include "window/section_widget.h" +#include "ui/popupmenu.h" namespace Overview { namespace Layout { diff --git a/Telegram/SourceFiles/platform/win/main_window_win.cpp b/Telegram/SourceFiles/platform/win/main_window_win.cpp index af4744cb96..fee28b53fc 100644 --- a/Telegram/SourceFiles/platform/win/main_window_win.cpp +++ b/Telegram/SourceFiles/platform/win/main_window_win.cpp @@ -138,12 +138,12 @@ public: } bool init(QColor c) { - _fullsize = st::wndShadow.rect().width(); + _fullsize = st::wndShadow.width(); _shift = st::wndShadowShift; QImage cornersImage(_fullsize, _fullsize, QImage::Format_ARGB32_Premultiplied); { Painter p(&cornersImage); - p.drawSprite(0, 0, st::wndShadow); + st::wndShadow.paint(p, 0, 0, _fullsize); } if (rtl()) cornersImage = cornersImage.mirrored(true, false); uchar *bits = cornersImage.bits(); @@ -253,6 +253,12 @@ public: SelectObject(dcs[i], bitmaps[i]); } + QStringList alphasForLog; + for_const (auto alpha, _alphas) { + alphasForLog.append(QString::number(alpha)); + } + LOG(("Window Shadow: %1").arg(alphasForLog.join(", "))); + initCorners(); return true; } diff --git a/Telegram/SourceFiles/stdafx.h b/Telegram/SourceFiles/stdafx.h index 41c554fad0..5a62d11287 100644 --- a/Telegram/SourceFiles/stdafx.h +++ b/Telegram/SourceFiles/stdafx.h @@ -72,8 +72,6 @@ Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org #include "ui/flatinput.h" #include "ui/flattextarea.h" #include "ui/flatbutton.h" -#include "ui/boxshadow.h" -#include "ui/popupmenu.h" #include "ui/scrollarea.h" #include "ui/images.h" #include "ui/text/text.h" diff --git a/Telegram/SourceFiles/stickers/emoji_pan.cpp b/Telegram/SourceFiles/stickers/emoji_pan.cpp index d7a73e2217..d515e3506a 100644 --- a/Telegram/SourceFiles/stickers/emoji_pan.cpp +++ b/Telegram/SourceFiles/stickers/emoji_pan.cpp @@ -48,8 +48,8 @@ EmojiColorPicker::EmojiColorPicker() : TWidget() setMouseTracking(true); setFocusPolicy(Qt::NoFocus); - int32 w = st::emojiPanSize.width() * (EmojiColorsCount + 1) + 4 * st::emojiColorsPadding + st::emojiColorsSep + st::dropdownDef.shadow.pxWidth() * 2; - int32 h = 2 * st::emojiColorsPadding + st::emojiPanSize.height() + st::dropdownDef.shadow.pxHeight() * 2; + int32 w = st::emojiPanSize.width() * (EmojiColorsCount + 1) + 4 * st::emojiColorsPadding + st::emojiColorsSep + st::dropdownDef.shadow.width() * 2; + int32 h = 2 * st::emojiColorsPadding + st::emojiPanSize.height() + st::dropdownDef.shadow.height() * 2; resize(w, h); _hideTimer.setSingleShot(true); @@ -84,7 +84,7 @@ void EmojiColorPicker::paintEvent(QPaintEvent *e) { p.setClipRect(e->rect()); } - int32 w = st::dropdownDef.shadow.pxWidth(), h = st::dropdownDef.shadow.pxHeight(); + int32 w = st::dropdownDef.shadow.width(), h = st::dropdownDef.shadow.height(); QRect r = QRect(w, h, width() - 2 * w, height() - 2 * h); _shadow.paint(p, r, st::dropdownDef.shadowShift); @@ -174,7 +174,7 @@ void EmojiColorPicker::step_selected(uint64 ms, bool timer) { _hovers[index] = (i.key() > 0) ? dt : (1 - dt); ++i; } - toUpdate += QRect(st::dropdownDef.shadow.pxWidth() + st::emojiColorsPadding + index * st::emojiPanSize.width() + (index ? 2 * st::emojiColorsPadding + st::emojiColorsSep : 0), st::dropdownDef.shadow.pxHeight() + st::emojiColorsPadding, st::emojiPanSize.width(), st::emojiPanSize.height()); + toUpdate += QRect(st::dropdownDef.shadow.width() + st::emojiColorsPadding + index * st::emojiPanSize.width() + (index ? 2 * st::emojiColorsPadding + st::emojiColorsSep : 0), st::dropdownDef.shadow.height() + st::emojiColorsPadding, st::emojiPanSize.width(), st::emojiPanSize.height()); } if (timer) rtlupdate(toUpdate.boundingRect()); if (_emojiAnimations.isEmpty()) _a_selected.stop(); @@ -191,7 +191,7 @@ void EmojiColorPicker::hideStart(bool fast) { emit hidden(); } else { if (_cache.isNull()) { - int32 w = st::dropdownDef.shadow.pxWidth(), h = st::dropdownDef.shadow.pxHeight(); + int32 w = st::dropdownDef.shadow.width(), h = st::dropdownDef.shadow.height(); _cache = myGrab(this, QRect(w, h, width() - 2 * w, height() - 2 * h)); clearSelection(true); } @@ -213,7 +213,7 @@ void EmojiColorPicker::showStart() { return; } if (_cache.isNull()) { - int32 w = st::dropdownDef.shadow.pxWidth(), h = st::dropdownDef.shadow.pxHeight(); + int32 w = st::dropdownDef.shadow.width(), h = st::dropdownDef.shadow.height(); _cache = myGrab(this, QRect(w, h, width() - 2 * w, height() - 2 * h)); clearSelection(true); } @@ -237,9 +237,9 @@ void EmojiColorPicker::clearSelection(bool fast) { void EmojiColorPicker::updateSelected() { int32 selIndex = -1; QPoint p(mapFromGlobal(_lastMousePos)); - int32 sx = rtl() ? (width() - p.x()) : p.x(), y = p.y() - st::dropdownDef.shadow.pxHeight() - st::emojiColorsPadding; + int32 sx = rtl() ? (width() - p.x()) : p.x(), y = p.y() - st::dropdownDef.shadow.height() - st::emojiColorsPadding; if (y >= 0 && y < st::emojiPanSize.height()) { - int32 x = sx - st::dropdownDef.shadow.pxWidth() - st::emojiColorsPadding; + int32 x = sx - st::dropdownDef.shadow.width() - st::emojiColorsPadding; if (x >= 0 && x < st::emojiPanSize.width()) { selIndex = 0; } else { @@ -275,7 +275,7 @@ void EmojiColorPicker::updateSelected() { void EmojiColorPicker::drawVariant(Painter &p, int variant) { float64 hover = _hovers[variant]; - QPoint w(st::dropdownDef.shadow.pxWidth() + st::emojiColorsPadding + variant * st::emojiPanSize.width() + (variant ? 2 * st::emojiColorsPadding + st::emojiColorsSep : 0), st::dropdownDef.shadow.pxHeight() + st::emojiColorsPadding); + QPoint w(st::dropdownDef.shadow.width() + st::emojiColorsPadding + variant * st::emojiPanSize.width() + (variant ? 2 * st::emojiColorsPadding + st::emojiColorsSep : 0), st::dropdownDef.shadow.height() + st::emojiColorsPadding); if (hover > 0) { p.setOpacity(hover); QPoint tl(w); diff --git a/Telegram/SourceFiles/stickers/emoji_pan.h b/Telegram/SourceFiles/stickers/emoji_pan.h index 71b542af7f..488f5c86f3 100644 --- a/Telegram/SourceFiles/stickers/emoji_pan.h +++ b/Telegram/SourceFiles/stickers/emoji_pan.h @@ -21,7 +21,7 @@ Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org #pragma once #include "ui/twidget.h" -#include "ui/boxshadow.h" +#include "ui/effects/rect_shadow.h" namespace InlineBots { namespace Layout { @@ -108,7 +108,7 @@ private: QTimer _hideTimer; - BoxShadow _shadow; + Ui::RectShadow _shadow; }; @@ -616,7 +616,7 @@ private: QTimer _hideTimer; - BoxShadow _shadow; + Ui::RectShadow _shadow; FlatRadiobutton _recent, _people, _nature, _food, _activity, _travel, _objects, _symbols; QList _icons; diff --git a/Telegram/SourceFiles/structs.cpp b/Telegram/SourceFiles/structs.cpp index bb33e2d24f..43bd13f5d3 100644 --- a/Telegram/SourceFiles/structs.cpp +++ b/Telegram/SourceFiles/structs.cpp @@ -1161,7 +1161,7 @@ void DocumentData::setattributes(const QVector &attributes } } break; case mtpc_documentAttributeVideo: { - const auto &d(attributes[i].c_documentAttributeVideo()); + auto &d = attributes[i].c_documentAttributeVideo(); if (type == FileDocument) { type = VideoDocument; } @@ -1169,7 +1169,7 @@ void DocumentData::setattributes(const QVector &attributes dimensions = QSize(d.vw.v, d.vh.v); } break; case mtpc_documentAttributeAudio: { - const auto &d(attributes[i].c_documentAttributeAudio()); + auto &d = attributes[i].c_documentAttributeAudio(); if (type == FileDocument) { if (d.is_voice()) { type = VoiceDocument; diff --git a/Telegram/SourceFiles/ui/boxshadow.cpp b/Telegram/SourceFiles/ui/boxshadow.cpp deleted file mode 100644 index b556d5719f..0000000000 --- a/Telegram/SourceFiles/ui/boxshadow.cpp +++ /dev/null @@ -1,191 +0,0 @@ -/* -This file is part of Telegram Desktop, -the official desktop version of Telegram messaging app, see https://telegram.org - -Telegram Desktop 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/telegramdesktop/tdesktop/blob/master/LICENSE -Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org -*/ -#include "stdafx.h" - -#include "boxshadow.h" - -BoxShadow::BoxShadow(const style::sprite &topLeft) : _size(topLeft.pxWidth()), _pixsize(_size * cIntRetinaFactor()) { - if (!_size) return; - - QImage cornersImage(_pixsize * 2, _pixsize * 2, QImage::Format_ARGB32_Premultiplied); - cornersImage.setDevicePixelRatio(cRetinaFactor()); - { - Painter p(&cornersImage); - p.drawSprite(QPoint(rtl() ? _size : 0, 0), topLeft); - } - if (rtl()) cornersImage = cornersImage.mirrored(true, false); - uchar *bits = cornersImage.bits(); - if (bits) { - for ( - quint32 *p = (quint32*)bits, *end = (quint32*)(bits + cornersImage.byteCount()); - p < end; - ++p - ) { - *p = (*p ^ 0x00ffffff) << 24; - } - } - { - QPainter p(&cornersImage); - p.setCompositionMode(QPainter::CompositionMode_Source); - QImage m = cornersImage.mirrored(); - m.setDevicePixelRatio(cRetinaFactor()); - p.drawImage(0, _size, m, 0, _pixsize, _pixsize, _pixsize); - } - { - QPainter p(&cornersImage); - p.setCompositionMode(QPainter::CompositionMode_Source); - QImage m = cornersImage.mirrored(true, false); - m.setDevicePixelRatio(cRetinaFactor()); - p.drawImage(_size, 0, m, _pixsize, 0, _pixsize, _pixsize * 2); - } - _colors.reserve(_pixsize); - uchar prev = 0; - for (int i = 0; i < _pixsize; ++i) { - uchar a = (cornersImage.pixel(QPoint(i, _pixsize - 1)) >> 24); - if (a < prev) break; - - _colors.push_back(style::color(0, 0, 0, a)); - prev = a; - } - if (cRetina()) { - _left = App::pixmapFromImageInPlace(cornersImage.copy(0, _pixsize - 1, _colors.size(), 1)); - _left.setDevicePixelRatio(cRetinaFactor()); - _top = App::pixmapFromImageInPlace(cornersImage.copy(_pixsize - 1, 0, 1, _colors.size())); - _top.setDevicePixelRatio(cRetinaFactor()); - _right = App::pixmapFromImageInPlace(cornersImage.copy(_pixsize * 2 - _colors.size(), _pixsize, _colors.size(), 1)); - _right.setDevicePixelRatio(cRetinaFactor()); - _bottom = App::pixmapFromImageInPlace(cornersImage.copy(_pixsize, _pixsize * 2 - _colors.size(), 1, _colors.size())); - _bottom.setDevicePixelRatio(cRetinaFactor()); - } - _corners = App::pixmapFromImageInPlace(std_::move(cornersImage)); - _corners.setDevicePixelRatio(cRetinaFactor()); -} - -void BoxShadow::paint(QPainter &p, const QRect &box, int32 shifty, int32 flags) { - if (!_size) return; - - int32 rshifty = shifty * cIntRetinaFactor(); - int32 count = _colors.size(), countsize = count / cIntRetinaFactor(), minus = _size - countsize + shifty; - bool left = (flags & Left), top = (flags & Top), right = (flags & Right), bottom = (flags & Bottom); - if (left && top) p.drawPixmap(box.left() - _size + minus, box.top() - _size + minus + shifty, _corners, 0, 0, _pixsize, _pixsize); - if (right && top) p.drawPixmap(box.left() + box.width() - minus, box.top() - _size + minus + shifty, _corners, _pixsize, 0, _pixsize, _pixsize); - if (right && bottom) p.drawPixmap(box.left() + box.width() - minus, box.top() + box.height() - minus + shifty, _corners, _pixsize, _pixsize, _pixsize, _pixsize); - if (left && bottom) p.drawPixmap(box.left() - _size + minus, box.top() + box.height() - minus + shifty, _corners, 0, _pixsize, _pixsize, _pixsize); - if (cRetina()) { - bool wasSmooth = p.renderHints().testFlag(QPainter::SmoothPixmapTransform); - if (wasSmooth) p.setRenderHint(QPainter::SmoothPixmapTransform, false); - if (left) p.drawPixmap(box.left() - countsize + shifty, box.top() + (top ? minus : 0) + shifty, countsize - shifty, box.height() - (bottom ? minus : 0) - (top ? minus : 0), _left, 0, 0, count - rshifty, 1); - if (top) p.drawPixmap(box.left() + (left ? minus : 0), box.top() - countsize + 2 * shifty, box.width() - (right ? minus : 0) - (left ? minus : 0), countsize - 2 * shifty, _top, 0, 0, 1, count - 2 * rshifty); - if (right) p.drawPixmap(box.left() + box.width(), box.top() + (top ? minus : 0) + shifty, countsize - shifty, box.height() - (bottom ? minus : 0) - (top ? minus : 0), _right, rshifty, 0, count - rshifty, 1); - if (bottom) p.drawPixmap(box.left() + (left ? minus : 0), box.top() + box.height(), box.width() - (right ? minus : 0) - (left ? minus : 0), countsize, _bottom, 0, 0, 1, count); - if (wasSmooth) p.setRenderHint(QPainter::SmoothPixmapTransform); - } else { - p.setPen(Qt::NoPen); - for (int32 i = 0; i < count; ++i) { - if (left && i + shifty < count) p.fillRect(box.left() - count + i + shifty, box.top() + (top ? minus : 0) + shifty, 1, box.height() - (bottom ? minus : 0) - (top ? minus : 0), _colors[i]->b); - if (top && i + 2 * shifty < count) p.fillRect(box.left() + (left ? minus : 0), box.top() - count + i + 2 * shifty, box.width() - (right ? minus : 0) - (left ? minus : 0), 1, _colors[i]->b); - if (right && i + shifty < count) p.fillRect(box.left() + box.width() + count - i - shifty - 1, box.top() + (top ? minus : 0) + shifty, 1, box.height() - (bottom ? minus : 0) - (top ? minus : 0), _colors[i]->b); - if (bottom) p.fillRect(box.left() + (left ? minus : 0), box.top() + box.height() + count - i - 1, box.width() - (right ? minus : 0) - (left ? minus : 0), 1, _colors[i]->b); - } - } -} - -style::margins BoxShadow::getDimensions(int32 shifty) const { - int32 d = _colors.size() / cIntRetinaFactor(); - return style::margins(d - shifty, d - 2 * shifty, d - shifty, d); -} - -namespace Ui { - -RectShadow::RectShadow(const style::icon &topLeft) : _size(topLeft.width()), _pixsize(_size * cIntRetinaFactor()) { - if (!_size) return; - - QImage cornersImage(_pixsize * 2, _pixsize * 2, QImage::Format_ARGB32_Premultiplied); - cornersImage.setDevicePixelRatio(cRetinaFactor()); - { - Painter p(&cornersImage); - p.setCompositionMode(QPainter::CompositionMode_Source); - topLeft.paint(p, QPoint(0, 0), _size); - } - if (rtl()) cornersImage = cornersImage.mirrored(true, false); - { - QPainter p(&cornersImage); - p.setCompositionMode(QPainter::CompositionMode_Source); - QImage m = cornersImage.mirrored(); - m.setDevicePixelRatio(cRetinaFactor()); - p.drawImage(0, _size, m, 0, _pixsize, _pixsize, _pixsize); - } - { - QPainter p(&cornersImage); - p.setCompositionMode(QPainter::CompositionMode_Source); - QImage m = cornersImage.mirrored(true, false); - m.setDevicePixelRatio(cRetinaFactor()); - p.drawImage(_size, 0, m, _pixsize, 0, _pixsize, _pixsize * 2); - } - - uchar prev = 0; - for (int i = 0; i < _pixsize; ++i) { - uchar a = (cornersImage.pixel(QPoint(i, _pixsize - 1)) >> 24); - if (a < prev) break; - - ++_thickness; - prev = a; - } - - _left = App::pixmapFromImageInPlace(cornersImage.copy(0, _pixsize - 1, _thickness, 1)); - _left.setDevicePixelRatio(cRetinaFactor()); - _top = App::pixmapFromImageInPlace(cornersImage.copy(_pixsize - 1, 0, 1, _thickness)); - _top.setDevicePixelRatio(cRetinaFactor()); - _right = App::pixmapFromImageInPlace(cornersImage.copy(_pixsize * 2 - _thickness, _pixsize, _thickness, 1)); - _right.setDevicePixelRatio(cRetinaFactor()); - _bottom = App::pixmapFromImageInPlace(cornersImage.copy(_pixsize, _pixsize * 2 - _thickness, 1, _thickness)); - _bottom.setDevicePixelRatio(cRetinaFactor()); - - _corners = App::pixmapFromImageInPlace(std_::move(cornersImage)); - _corners.setDevicePixelRatio(cRetinaFactor()); -} - -void RectShadow::paint(Painter &p, const QRect &box, int shifty, Sides sides) { - if (!_size) return; - - int32 rshifty = shifty * cIntRetinaFactor(); - int32 count = _thickness, countsize = count / cIntRetinaFactor(), minus = _size - countsize + shifty; - bool left = (sides & Side::Left), top = (sides & Side::Top), right = (sides & Side::Right), bottom = (sides & Side::Bottom); - if (left && top) p.drawPixmap(box.left() - _size + minus, box.top() - _size + minus + shifty, _corners, 0, 0, _pixsize, _pixsize); - if (right && top) p.drawPixmap(box.left() + box.width() - minus, box.top() - _size + minus + shifty, _corners, _pixsize, 0, _pixsize, _pixsize); - if (right && bottom) p.drawPixmap(box.left() + box.width() - minus, box.top() + box.height() - minus + shifty, _corners, _pixsize, _pixsize, _pixsize, _pixsize); - if (left && bottom) p.drawPixmap(box.left() - _size + minus, box.top() + box.height() - minus + shifty, _corners, 0, _pixsize, _pixsize, _pixsize); - - bool wasSmooth = p.renderHints().testFlag(QPainter::SmoothPixmapTransform); - if (wasSmooth) p.setRenderHint(QPainter::SmoothPixmapTransform, false); - if (left) p.drawPixmap(box.left() - countsize + shifty, box.top() + (top ? minus : 0) + shifty, countsize - shifty, box.height() - (bottom ? minus : 0) - (top ? minus : 0), _left, 0, 0, count - rshifty, 1); - if (top) p.drawPixmap(box.left() + (left ? minus : 0), box.top() - countsize + 2 * shifty, box.width() - (right ? minus : 0) - (left ? minus : 0), countsize - 2 * shifty, _top, 0, 0, 1, count - 2 * rshifty); - if (right) p.drawPixmap(box.left() + box.width(), box.top() + (top ? minus : 0) + shifty, countsize - shifty, box.height() - (bottom ? minus : 0) - (top ? minus : 0), _right, rshifty, 0, count - rshifty, 1); - if (bottom) p.drawPixmap(box.left() + (left ? minus : 0), box.top() + box.height(), box.width() - (right ? minus : 0) - (left ? minus : 0), countsize, _bottom, 0, 0, 1, count); - if (wasSmooth) p.setRenderHint(QPainter::SmoothPixmapTransform); -} - -style::margins RectShadow::getDimensions(int32 shifty) const { - int d = _thickness / cIntRetinaFactor(); - return style::margins(d - shifty, d - 2 * shifty, d - shifty, d); -} - -} // namespace Ui diff --git a/Telegram/SourceFiles/ui/countryinput.h b/Telegram/SourceFiles/ui/countryinput.h index d23e422a34..8292f0187b 100644 --- a/Telegram/SourceFiles/ui/countryinput.h +++ b/Telegram/SourceFiles/ui/countryinput.h @@ -23,7 +23,7 @@ Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org #include "ui/flatinput.h" #include "ui/scrollarea.h" #include "ui/flatbutton.h" -#include "ui/boxshadow.h" +#include "ui/effects/rect_shadow.h" #include "boxes/abstractbox.h" QString findValidCode(QString fullCode); diff --git a/Telegram/SourceFiles/ui/effects/rect_shadow.cpp b/Telegram/SourceFiles/ui/effects/rect_shadow.cpp new file mode 100644 index 0000000000..e50c0bc22e --- /dev/null +++ b/Telegram/SourceFiles/ui/effects/rect_shadow.cpp @@ -0,0 +1,101 @@ +/* +This file is part of Telegram Desktop, +the official desktop version of Telegram messaging app, see https://telegram.org + +Telegram Desktop 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/telegramdesktop/tdesktop/blob/master/LICENSE +Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org +*/ +#include "stdafx.h" +#include "ui/effects/rect_shadow.h" + +namespace Ui { + +RectShadow::RectShadow(const style::icon &topLeft) : _size(topLeft.width()), _pixsize(_size * cIntRetinaFactor()) { + if (!_size) return; + + QImage cornersImage(_pixsize * 2, _pixsize * 2, QImage::Format_ARGB32_Premultiplied); + cornersImage.setDevicePixelRatio(cRetinaFactor()); + { + Painter p(&cornersImage); + p.setCompositionMode(QPainter::CompositionMode_Source); + topLeft.paint(p, QPoint(0, 0), _size); + } + if (rtl()) cornersImage = cornersImage.mirrored(true, false); + { + QPainter p(&cornersImage); + p.setCompositionMode(QPainter::CompositionMode_Source); + QImage m = cornersImage.mirrored(); + m.setDevicePixelRatio(cRetinaFactor()); + p.drawImage(0, _size, m, 0, _pixsize, _pixsize, _pixsize); + } + { + QPainter p(&cornersImage); + p.setCompositionMode(QPainter::CompositionMode_Source); + QImage m = cornersImage.mirrored(true, false); + m.setDevicePixelRatio(cRetinaFactor()); + p.drawImage(_size, 0, m, _pixsize, 0, _pixsize, _pixsize * 2); + } + + uchar prev = 0; + for (int i = 0; i < _pixsize; ++i) { + uchar a = (cornersImage.pixel(QPoint(i, _pixsize - 1)) >> 24); + if (a < prev) break; + + ++_thickness; + prev = a; + } + + _left = App::pixmapFromImageInPlace(cornersImage.copy(0, _pixsize - 1, _thickness, 1)); + _left.setDevicePixelRatio(cRetinaFactor()); + _top = App::pixmapFromImageInPlace(cornersImage.copy(_pixsize - 1, 0, 1, _thickness)); + _top.setDevicePixelRatio(cRetinaFactor()); + _right = App::pixmapFromImageInPlace(cornersImage.copy(_pixsize * 2 - _thickness, _pixsize, _thickness, 1)); + _right.setDevicePixelRatio(cRetinaFactor()); + _bottom = App::pixmapFromImageInPlace(cornersImage.copy(_pixsize, _pixsize * 2 - _thickness, 1, _thickness)); + _bottom.setDevicePixelRatio(cRetinaFactor()); + + _corners = App::pixmapFromImageInPlace(std_::move(cornersImage)); + _corners.setDevicePixelRatio(cRetinaFactor()); +} + +void RectShadow::paint(Painter &p, const QRect &box, int shifty, Sides sides) { + if (!_size) return; + + int32 rshifty = shifty * cIntRetinaFactor(); + int32 count = _thickness, countsize = count / cIntRetinaFactor(), minus = _size - countsize + shifty; + bool left = (sides & Side::Left), top = (sides & Side::Top), right = (sides & Side::Right), bottom = (sides & Side::Bottom); + if (left && top) p.drawPixmap(box.left() - _size + minus, box.top() - _size + minus + shifty, _corners, 0, 0, _pixsize, _pixsize); + if (right && top) p.drawPixmap(box.left() + box.width() - minus, box.top() - _size + minus + shifty, _corners, _pixsize, 0, _pixsize, _pixsize); + if (right && bottom) p.drawPixmap(box.left() + box.width() - minus, box.top() + box.height() - minus + shifty, _corners, _pixsize, _pixsize, _pixsize, _pixsize); + if (left && bottom) p.drawPixmap(box.left() - _size + minus, box.top() + box.height() - minus + shifty, _corners, 0, _pixsize, _pixsize, _pixsize); + + bool wasSmooth = p.renderHints().testFlag(QPainter::SmoothPixmapTransform); + if (wasSmooth) p.setRenderHint(QPainter::SmoothPixmapTransform, false); + if (left) p.drawPixmap(box.left() - countsize + shifty, box.top() + (top ? minus : 0) + shifty, countsize - shifty, box.height() - (bottom ? minus : 0) - (top ? minus : 0), _left, 0, 0, count - rshifty, 1); + if (top) p.drawPixmap(box.left() + (left ? minus : 0), box.top() - countsize + 2 * shifty, box.width() - (right ? minus : 0) - (left ? minus : 0), countsize - 2 * shifty, _top, 0, 0, 1, count - 2 * rshifty); + if (right) p.drawPixmap(box.left() + box.width(), box.top() + (top ? minus : 0) + shifty, countsize - shifty, box.height() - (bottom ? minus : 0) - (top ? minus : 0), _right, rshifty, 0, count - rshifty, 1); + if (bottom) p.drawPixmap(box.left() + (left ? minus : 0), box.top() + box.height(), box.width() - (right ? minus : 0) - (left ? minus : 0), countsize, _bottom, 0, 0, 1, count); + if (wasSmooth) p.setRenderHint(QPainter::SmoothPixmapTransform); +} + +style::margins RectShadow::getDimensions(int32 shifty) const { + if (!_size) return style::margins(0, 0, 0, 0); + + int d = _thickness / cIntRetinaFactor(); + return style::margins(d - shifty, d - 2 * shifty, d - shifty, d); +} + +} // namespace Ui diff --git a/Telegram/SourceFiles/ui/boxshadow.h b/Telegram/SourceFiles/ui/effects/rect_shadow.h similarity index 77% rename from Telegram/SourceFiles/ui/boxshadow.h rename to Telegram/SourceFiles/ui/effects/rect_shadow.h index 3eeb302926..6822046b9b 100644 --- a/Telegram/SourceFiles/ui/boxshadow.h +++ b/Telegram/SourceFiles/ui/effects/rect_shadow.h @@ -20,29 +20,6 @@ Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org */ #pragma once -class BoxShadow { -public: - - enum { - Left = 1, - Top = 2, - Right = 4, - Bottom = 8 - }; - - BoxShadow(const style::sprite &topLeft); - - void paint(QPainter &p, const QRect &box, int32 shifty, int32 flags = Left | Top | Right | Bottom); - style::margins getDimensions(int32 shifty) const; - -private: - - int32 _size, _pixsize; - QPixmap _corners, _left, _top, _right, _bottom; - QVector _colors; - -}; - namespace Ui { class RectShadow { @@ -62,7 +39,6 @@ public: style::margins getDimensions(int shifty) const; private: - int _size, _pixsize; int _thickness = 0; QPixmap _corners, _left, _top, _right, _bottom; @@ -70,4 +46,4 @@ private: }; Q_DECLARE_OPERATORS_FOR_FLAGS(RectShadow::Sides); -} // namespace Ui \ No newline at end of file +} // namespace Ui diff --git a/Telegram/SourceFiles/ui/flatinput.cpp b/Telegram/SourceFiles/ui/flatinput.cpp index 8dbdb173ed..6385060a27 100644 --- a/Telegram/SourceFiles/ui/flatinput.cpp +++ b/Telegram/SourceFiles/ui/flatinput.cpp @@ -21,6 +21,7 @@ Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org #include "stdafx.h" #include "ui/flatinput.h" +#include "ui/popupmenu.h" #include "mainwindow.h" #include "countryinput.h" #include "lang.h" diff --git a/Telegram/SourceFiles/ui/flatlabel.cpp b/Telegram/SourceFiles/ui/flatlabel.cpp index 909f4e1728..98aaa94eec 100644 --- a/Telegram/SourceFiles/ui/flatlabel.cpp +++ b/Telegram/SourceFiles/ui/flatlabel.cpp @@ -19,8 +19,9 @@ Full license: https://github.com/telegramdesktop/tdesktop/blob/master/LICENSE Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org */ #include "stdafx.h" - #include "ui/flatlabel.h" + +#include "ui/popupmenu.h" #include "mainwindow.h" #include "lang.h" diff --git a/Telegram/SourceFiles/ui/flatlabel.h b/Telegram/SourceFiles/ui/flatlabel.h index 24e5a3942c..f0c424cac1 100644 --- a/Telegram/SourceFiles/ui/flatlabel.h +++ b/Telegram/SourceFiles/ui/flatlabel.h @@ -20,6 +20,8 @@ Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org */ #pragma once +class PopupMenu; + class FlatLabel : public TWidget, public ClickHandlerHost { Q_OBJECT diff --git a/Telegram/SourceFiles/ui/flattextarea.cpp b/Telegram/SourceFiles/ui/flattextarea.cpp index 1aae737710..c6230c438a 100644 --- a/Telegram/SourceFiles/ui/flattextarea.cpp +++ b/Telegram/SourceFiles/ui/flattextarea.cpp @@ -21,6 +21,7 @@ Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org #include "stdafx.h" #include "flattextarea.h" +#include "ui/popupmenu.h" #include "mainwindow.h" QByteArray FlatTextarea::serializeTagsList(const TagList &tags) { diff --git a/Telegram/SourceFiles/ui/inner_dropdown.h b/Telegram/SourceFiles/ui/inner_dropdown.h index 56f28caecb..2115679a4d 100644 --- a/Telegram/SourceFiles/ui/inner_dropdown.h +++ b/Telegram/SourceFiles/ui/inner_dropdown.h @@ -20,7 +20,7 @@ Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org */ #pragma once -#include "ui/boxshadow.h" +#include "ui/effects/rect_shadow.h" class ScrollArea; diff --git a/Telegram/SourceFiles/ui/popupmenu.cpp b/Telegram/SourceFiles/ui/popupmenu.cpp index 2bbf658904..e6649b6293 100644 --- a/Telegram/SourceFiles/ui/popupmenu.cpp +++ b/Telegram/SourceFiles/ui/popupmenu.cpp @@ -25,43 +25,27 @@ #include "lang.h" -PopupMenu::PopupMenu(const style::PopupMenu &st) : TWidget(0) +PopupMenu::PopupMenu(const style::PopupMenu &st) : TWidget(nullptr) , _st(st) -, _menu(0) -, _parent(0) , _itemHeight(_st.itemPadding.top() + _st.itemFont->height + _st.itemPadding.bottom()) , _separatorHeight(_st.separatorPadding.top() + _st.separatorWidth + _st.separatorPadding.bottom()) -, _mouseSelection(false) , _shadow(_st.shadow) -, _selected(-1) -, _childMenuIndex(-1) , a_opacity(1) -, _a_hide(animation(this, &PopupMenu::step_hide)) -, _deleteOnHide(true) -, _triggering(false) -, _deleteLater(false) { +, _a_hide(animation(this, &PopupMenu::step_hide)) { init(); } PopupMenu::PopupMenu(QMenu *menu, const style::PopupMenu &st) : TWidget(0) , _st(st) , _menu(menu) -, _parent(0) , _itemHeight(_st.itemPadding.top() + _st.itemFont->height + _st.itemPadding.bottom()) , _separatorHeight(_st.separatorPadding.top() + _st.separatorWidth + _st.separatorPadding.bottom()) -, _mouseSelection(false) , _shadow(_st.shadow) -, _selected(-1) -, _childMenuIndex(-1) , a_opacity(1) -, _a_hide(animation(this, &PopupMenu::step_hide)) -, _deleteOnHide(true) -, _triggering(false) -, _deleteLater(false) { +, _a_hide(animation(this, &PopupMenu::step_hide)) { init(); - QList actions(menu->actions()); - for (int32 i = 0, l = actions.size(); i < l; ++i) { - addAction(actions.at(i)); + for (auto action : menu->actions()) { + addAction(action); } } @@ -117,7 +101,7 @@ int32 PopupMenu::processAction(QAction *a, int32 index, int32 w) { int32 textw = _st.itemFont->width(texts.at(0)); int32 goodw = _padding.left() + _st.itemPadding.left() + textw + _st.itemPadding.right() + _padding.right(); if (_menus.at(index)) { - goodw += _st.itemPadding.left() + _st.arrow.pxWidth(); + goodw += _st.itemPadding.left() + _st.arrow.width(); } else if (texts.size() > 1) { goodw += _st.itemPadding.left() + _st.itemFont->width(texts.at(1)); } @@ -212,7 +196,7 @@ void PopupMenu::paintEvent(QPaintEvent *e) { p.setPen(selected ? _st.itemFgOver : (enabled ? _st.itemFg : _st.itemFgDisabled)); p.drawTextLeft(_st.itemPadding.left(), _st.itemPadding.top(), _inner.width(), _texts.at(i)); if (_menus.at(i)) { - p.drawSpriteRight(_st.itemPadding.right(), (_itemHeight - _st.arrow.pxHeight()) / 2, _inner.width(), _st.arrow); + _st.arrow.paint(p, _inner.width() - _st.itemPadding.right() - _st.arrow.width(), (_itemHeight - _st.arrow.height()) / 2, _inner.width()); } else if (!_shortcutTexts.at(i).isEmpty()) { p.setPen(selected ? _st.itemFgShortcutOver : (enabled ? _st.itemFgShortcut : _st.itemFgShortcutDisabled)); p.drawTextRight(_st.itemPadding.right(), _st.itemPadding.top(), _inner.width(), _shortcutTexts.at(i)); diff --git a/Telegram/SourceFiles/ui/popupmenu.h b/Telegram/SourceFiles/ui/popupmenu.h index ccc1e8cfb8..aa4dc29e62 100644 --- a/Telegram/SourceFiles/ui/popupmenu.h +++ b/Telegram/SourceFiles/ui/popupmenu.h @@ -18,12 +18,12 @@ #pragma once #include "ui/text/text.h" +#include "ui/effects/rect_shadow.h" class PopupMenu : public TWidget { Q_OBJECT public: - PopupMenu(const style::PopupMenu &st = st::defaultPopupMenu); PopupMenu(QMenu *menu, const style::PopupMenu &st = st::defaultPopupMenu); QAction *addAction(const QString &text, const QObject *receiver, const char* member); @@ -41,23 +41,20 @@ public: ~PopupMenu(); protected: - - void resizeEvent(QResizeEvent *e); - void paintEvent(QPaintEvent *e); - void keyPressEvent(QKeyEvent *e); - void mouseMoveEvent(QMouseEvent *e); - void mousePressEvent(QMouseEvent *e); - void leaveEvent(QEvent *e); - void enterEvent(QEvent *e); - void focusOutEvent(QFocusEvent *e); - void hideEvent(QHideEvent *e); + void resizeEvent(QResizeEvent *e) override; + void paintEvent(QPaintEvent *e) override; + void keyPressEvent(QKeyEvent *e) override; + void mouseMoveEvent(QMouseEvent *e) override; + void mousePressEvent(QMouseEvent *e) override; + void leaveEvent(QEvent *e) override; + void enterEvent(QEvent *e) override; + void focusOutEvent(QFocusEvent *e) override; + void hideEvent(QHideEvent *e) override; public slots: - void actionChanged(); private: - void updateSelected(); void childHiding(PopupMenu *child); @@ -85,10 +82,10 @@ private: typedef QVector PopupMenus; - QMenu *_menu; + QMenu *_menu = nullptr; Actions _actions; PopupMenus _menus; - PopupMenu *_parent; + PopupMenu *_parent = nullptr; QStringList _texts, _shortcutTexts; int32 _itemHeight, _separatorHeight; @@ -96,16 +93,19 @@ private: style::margins _padding; QPoint _mouse; - bool _mouseSelection; + bool _mouseSelection = false; - BoxShadow _shadow; - int32 _selected, _childMenuIndex; + Ui::RectShadow _shadow; + int _selected = -1; + int _childMenuIndex = -1; QPixmap _cache; anim::fvalue a_opacity; Animation _a_hide; - bool _deleteOnHide, _triggering, _deleteLater; + bool _deleteOnHide = true; + bool _triggering = false; + bool _deleteLater = false; }; @@ -123,7 +123,6 @@ class PopupTooltip : public TWidget { Q_OBJECT public: - bool eventFilter(QObject *o, QEvent *e); static void Show(int32 delay, const AbstractTooltipShower *shower); @@ -132,18 +131,15 @@ public: ~PopupTooltip(); public slots: - void onShow(); void onWndActiveChanged(); void onHideByLeave(); protected: - void paintEvent(QPaintEvent *e); void hideEvent(QHideEvent *e); private: - PopupTooltip(); void popup(const QPoint &p, const QString &text, const style::Tooltip *st); diff --git a/Telegram/gyp/Telegram.gyp b/Telegram/gyp/Telegram.gyp index 4e82727aad..69abfe22aa 100644 --- a/Telegram/gyp/Telegram.gyp +++ b/Telegram/gyp/Telegram.gyp @@ -412,6 +412,8 @@ '<(src_loc)/ui/effects/fade_animation.h', '<(src_loc)/ui/effects/radial_animation.cpp', '<(src_loc)/ui/effects/radial_animation.h', + '<(src_loc)/ui/effects/rect_shadow.cpp', + '<(src_loc)/ui/effects/rect_shadow.h', '<(src_loc)/ui/style/style_core.cpp', '<(src_loc)/ui/style/style_core.h', '<(src_loc)/ui/style/style_core_color.cpp', @@ -439,8 +441,6 @@ '<(src_loc)/ui/widgets/widget_slide_wrap.h', '<(src_loc)/ui/animation.cpp', '<(src_loc)/ui/animation.h', - '<(src_loc)/ui/boxshadow.cpp', - '<(src_loc)/ui/boxshadow.h', '<(src_loc)/ui/button.cpp', '<(src_loc)/ui/button.h', '<(src_loc)/ui/popupmenu.cpp',