1 /* 2 This file is part of Telegram Desktop, 3 the official desktop application for the Telegram messaging service. 4 5 For license and copyright information please follow this link: 6 https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL 7 */ 8 #pragma once 9 10 #include "boxes/abstract_box.h" 11 12 namespace Ui { 13 14 class InformBox; 15 class ConfirmBox : public Ui::BoxContent, public ClickHandlerHost { 16 public: 17 18 using ConfirmedCallback = std::variant< 19 v::null_t, 20 FnMut<void()>, 21 FnMut<void(Fn<void()>)>>; 22 23 ConfirmBox( 24 QWidget*, 25 const QString &text, 26 ConfirmedCallback confirmedCallback = FnMut<void()>(), 27 FnMut<void()> cancelledCallback = FnMut<void()>()); 28 ConfirmBox( 29 QWidget*, 30 const QString &text, 31 const QString &confirmText, 32 ConfirmedCallback confirmedCallback = FnMut<void()>(), 33 FnMut<void()> cancelledCallback = FnMut<void()>()); 34 ConfirmBox( 35 QWidget*, 36 const QString &text, 37 const QString &confirmText, 38 const style::RoundButton &confirmStyle, 39 ConfirmedCallback confirmedCallback = FnMut<void()>(), 40 FnMut<void()> cancelledCallback = FnMut<void()>()); 41 ConfirmBox( 42 QWidget*, 43 const QString &text, 44 const QString &confirmText, 45 const QString &cancelText, 46 ConfirmedCallback confirmedCallback = FnMut<void()>(), 47 FnMut<void()> cancelledCallback = FnMut<void()>()); 48 ConfirmBox( 49 QWidget*, 50 const QString &text, 51 const QString &confirmText, 52 const style::RoundButton &confirmStyle, 53 const QString &cancelText, 54 ConfirmedCallback confirmedCallback = FnMut<void()>(), 55 FnMut<void()> cancelledCallback = FnMut<void()>()); 56 ConfirmBox( 57 QWidget*, 58 const TextWithEntities &text, 59 const QString &confirmText, 60 ConfirmedCallback confirmedCallback = v::null, 61 FnMut<void()> cancelledCallback = nullptr); 62 63 void updateLink(); 64 65 // If strict cancel is set the cancelledCallback is only called 66 // if the cancel button was pressed. setStrictCancel(bool strictCancel)67 void setStrictCancel(bool strictCancel) { 68 _strictCancel = strictCancel; 69 } 70 71 void setMaxLineCount(int count); 72 73 // ClickHandlerHost interface 74 void clickHandlerActiveChanged( 75 const ClickHandlerPtr &p, 76 bool active) override; 77 void clickHandlerPressedChanged( 78 const ClickHandlerPtr &p, 79 bool pressed) override; 80 81 protected: 82 void prepare() override; 83 84 void keyPressEvent(QKeyEvent *e) override; 85 void paintEvent(QPaintEvent *e) override; 86 void mouseMoveEvent(QMouseEvent *e) override; 87 void mousePressEvent(QMouseEvent *e) override; 88 void mouseReleaseEvent(QMouseEvent *e) override; 89 void leaveEventHook(QEvent *e) override; 90 91 private: 92 struct InformBoxTag { 93 }; 94 ConfirmBox( 95 const InformBoxTag &, 96 const QString &text, 97 const QString &doneText, 98 Fn<void()> closedCallback); 99 ConfirmBox( 100 const InformBoxTag &, 101 const TextWithEntities &text, 102 const QString &doneText, 103 Fn<void()> closedCallback); 104 FnMut<void()> generateInformCallback(Fn<void()> closedCallback); 105 friend class InformBox; 106 107 void confirmed(); 108 void init(const QString &text); 109 void init(const TextWithEntities &text); 110 void textUpdated(); 111 void updateHover(); 112 113 QString _confirmText; 114 QString _cancelText; 115 const style::RoundButton &_confirmStyle; 116 bool _informative = false; 117 118 Ui::Text::String _text; 119 int _textWidth = 0; 120 int _textHeight = 0; 121 int _maxLineCount = 16; 122 123 QPoint _lastMousePos; 124 125 bool _confirmed = false; 126 bool _cancelled = false; 127 bool _strictCancel = false; 128 ConfirmBox::ConfirmedCallback _confirmedCallback; 129 FnMut<void()> _cancelledCallback; 130 131 }; 132 133 class InformBox : public ConfirmBox { 134 public: 135 InformBox( 136 QWidget*, 137 const QString &text, 138 Fn<void()> closedCallback = nullptr); 139 InformBox( 140 QWidget*, 141 const QString &text, 142 const QString &doneText, 143 Fn<void()> closedCallback = nullptr); 144 InformBox( 145 QWidget*, 146 const TextWithEntities &text, 147 Fn<void()> closedCallback = nullptr); 148 InformBox( 149 QWidget*, 150 const TextWithEntities &text, 151 const QString &doneText, 152 Fn<void()> closedCallback = nullptr); 153 154 }; 155 156 class ConfirmDontWarnBox : public Ui::BoxContent { 157 public: 158 ConfirmDontWarnBox( 159 QWidget*, 160 rpl::producer<TextWithEntities> text, 161 const QString &checkbox, 162 rpl::producer<QString> confirm, 163 FnMut<void(bool)> callback); 164 165 protected: 166 void prepare() override; 167 168 private: 169 not_null<Ui::RpWidget*> setupContent( 170 rpl::producer<TextWithEntities> text, 171 const QString &checkbox, 172 FnMut<void(bool)> callback); 173 174 rpl::producer<QString> _confirm; 175 FnMut<void()> _callback; 176 not_null<Ui::RpWidget*> _content; 177 178 }; 179 180 } // namespace Ui 181