From 06629e8cd959a66c668283808a1a0f5ddcfbc868 Mon Sep 17 00:00:00 2001 From: John Preston Date: Sat, 6 Oct 2018 21:51:07 +0300 Subject: [PATCH] Improved calendar layout for export. --- Telegram/Resources/langs/lang.strings | 10 +- Telegram/SourceFiles/boxes/boxes.style | 18 +++- Telegram/SourceFiles/boxes/calendar_box.cpp | 99 ++++++++++++------- Telegram/SourceFiles/boxes/calendar_box.h | 14 +++ Telegram/SourceFiles/export/view/export.style | 7 ++ .../export/view/export_view_settings.cpp | 3 +- 6 files changed, 107 insertions(+), 44 deletions(-) diff --git a/Telegram/Resources/langs/lang.strings b/Telegram/Resources/langs/lang.strings index 1e60d6eea..fb386684c 100644 --- a/Telegram/Resources/langs/lang.strings +++ b/Telegram/Resources/langs/lang.strings @@ -1744,11 +1744,11 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_export_option_location" = "Download path: {path}"; "lng_export_option_html" = "Human-readable HTML"; "lng_export_option_json" = "Machine-readable JSON"; -"lng_export_limits" = "From: {from}, Till: {till}"; -"lng_export_beginning" = "Beginning"; -"lng_export_end" = "End"; -"lng_export_from_beginning" = "From Beginning"; -"lng_export_till_end" = "Till End"; +"lng_export_limits" = "From: {from}, to: {till}"; +"lng_export_beginning" = "the oldest message"; +"lng_export_end" = "present"; +"lng_export_from_beginning" = "Reset"; +"lng_export_till_end" = "Reset"; "lng_export_start" = "Export"; "lng_export_state_initializing" = "Initializing..."; "lng_export_state_userpics" = "Profile pictures"; diff --git a/Telegram/SourceFiles/boxes/boxes.style b/Telegram/SourceFiles/boxes/boxes.style index e98d5aa91..6630cd8aa 100644 --- a/Telegram/SourceFiles/boxes/boxes.style +++ b/Telegram/SourceFiles/boxes/boxes.style @@ -573,14 +573,24 @@ calendarPreviousDisabled: icon {{ "title_back", menuIconFg }}; calendarNext: IconButton(calendarPrevious) { icon: icon {{ "title_back-flip_horizontal", boxTitleFg }}; } +CalendarSizes { + width: pixels; + daysHeight: pixels; + cellSize: size; + cellInner: pixels; + padding: margins; +} calendarNextDisabled: icon {{ "title_back-flip_horizontal", menuIconFg }}; calendarTitleFont: boxTitleFont; +defaultCalendarSizes: CalendarSizes { + width: boxWideWidth; + daysHeight: 32px; + cellSize: size(48px, 40px); + cellInner: 34px; + padding: margins(14px, 15px, 14px, 10px); +} calendarDaysFont: normalFont; calendarDaysFg: boxTitleAdditionalFg; -calendarDaysHeight: 32px; -calendarCellSize: size(48px, 40px); -calendarCellInner: 34px; -calendarPadding: margins(14px, 15px, 14px, 10px); calendarScroll: backgroundScroll; passcodeTextStyle: TextStyle(defaultTextStyle) { diff --git a/Telegram/SourceFiles/boxes/calendar_box.cpp b/Telegram/SourceFiles/boxes/calendar_box.cpp index 8c6c3d292..4b1e7febb 100644 --- a/Telegram/SourceFiles/boxes/calendar_box.cpp +++ b/Telegram/SourceFiles/boxes/calendar_box.cpp @@ -185,16 +185,13 @@ QString CalendarBox::Context::labelFromIndex(int index) const { class CalendarBox::Inner : public TWidget, public RPCSender, private base::Subscriber { public: - Inner(QWidget *parent, Context *context); + Inner( + QWidget *parent, + not_null context, + const style::CalendarSizes &st); - int countHeight() { - auto innerHeight = st::calendarDaysHeight + _context->rowsCount() * st::calendarCellSize.height(); - return st::calendarPadding.top() + innerHeight + st::calendarPadding.bottom(); - } - - void setDateChosenCallback(Fn callback) { - _dateChosenCallback = std::move(callback); - } + int countHeight(); + void setDateChosenCallback(Fn callback); ~Inner(); @@ -215,7 +212,8 @@ private: void paintDayNames(Painter &p, QRect clip); void paintRows(Painter &p, QRect clip); - Context *_context = nullptr; + const style::CalendarSizes &_st; + not_null _context; std::map> _ripples; @@ -227,8 +225,12 @@ private: }; -CalendarBox::Inner::Inner(QWidget *parent, Context *context) +CalendarBox::Inner::Inner( + QWidget *parent, + not_null context, + const style::CalendarSizes &st) : TWidget(parent) +, _st(st) , _context(context) { setMouseTracking(true); subscribe(context->month(), [this](QDate month) { @@ -245,7 +247,7 @@ void CalendarBox::Inner::monthChanged(QDate month) { } void CalendarBox::Inner::resizeToCurrent() { - resize(st::boxWideWidth, countHeight()); + resize(_st.width, countHeight()); } void CalendarBox::Inner::paintEvent(QPaintEvent *e) { @@ -260,13 +262,13 @@ void CalendarBox::Inner::paintEvent(QPaintEvent *e) { void CalendarBox::Inner::paintDayNames(Painter &p, QRect clip) { p.setFont(st::calendarDaysFont); p.setPen(st::calendarDaysFg); - auto y = st::calendarPadding.top(); + auto y = _st.padding.top(); auto x = rowsLeft(); - if (!myrtlrect(x, y, st::calendarCellSize.width() * kDaysInWeek, st::calendarDaysHeight).intersects(clip)) { + if (!myrtlrect(x, y, _st.cellSize.width() * kDaysInWeek, _st.daysHeight).intersects(clip)) { return; } - for (auto i = 0; i != kDaysInWeek; ++i, x += st::calendarCellSize.width()) { - auto rect = myrtlrect(x, y, st::calendarCellSize.width(), st::calendarDaysHeight); + for (auto i = 0; i != kDaysInWeek; ++i, x += _st.cellSize.width()) { + auto rect = myrtlrect(x, y, _st.cellSize.width(), _st.daysHeight); if (!rect.intersects(clip)) { continue; } @@ -275,11 +277,11 @@ void CalendarBox::Inner::paintDayNames(Painter &p, QRect clip) { } int CalendarBox::Inner::rowsLeft() const { - return st::calendarPadding.left(); + return _st.padding.left(); } int CalendarBox::Inner::rowsTop() const { - return st::calendarPadding.top() + st::calendarDaysHeight; + return _st.padding.top() + _st.daysHeight; } void CalendarBox::Inner::paintRows(Painter &p, QRect clip) { @@ -290,24 +292,24 @@ void CalendarBox::Inner::paintRows(Painter &p, QRect clip) { auto highlightedIndex = _context->highlightedIndex(); for (auto row = 0, rowsCount = _context->rowsCount(), daysCount = _context->daysCount() ; row != rowsCount - ; ++row, y += st::calendarCellSize.height()) { + ; ++row, y += _st.cellSize.height()) { auto x = rowsLeft(); - if (!myrtlrect(x, y, st::calendarCellSize.width() * kDaysInWeek, st::calendarCellSize.height()).intersects(clip)) { + if (!myrtlrect(x, y, _st.cellSize.width() * kDaysInWeek, _st.cellSize.height()).intersects(clip)) { index += kDaysInWeek; continue; } - for (auto col = 0; col != kDaysInWeek; ++col, ++index, x += st::calendarCellSize.width()) { - auto rect = myrtlrect(x, y, st::calendarCellSize.width(), st::calendarCellSize.height()); + for (auto col = 0; col != kDaysInWeek; ++col, ++index, x += _st.cellSize.width()) { + auto rect = myrtlrect(x, y, _st.cellSize.width(), _st.cellSize.height()); auto grayedOut = (index < 0 || index >= daysCount || !rect.intersects(clip)); auto highlighted = (index == highlightedIndex); auto enabled = _context->isEnabled(index); - auto innerLeft = x + (st::calendarCellSize.width() - st::calendarCellInner) / 2; - auto innerTop = y + (st::calendarCellSize.height() - st::calendarCellInner) / 2; + auto innerLeft = x + (_st.cellSize.width() - _st.cellInner) / 2; + auto innerTop = y + (_st.cellSize.height() - _st.cellInner) / 2; if (highlighted) { PainterHighQualityEnabler hq(p); p.setPen(Qt::NoPen); p.setBrush(grayedOut ? st::windowBgOver : st::dialogsBgActive); - p.drawEllipse(myrtlrect(innerLeft, innerTop, st::calendarCellInner, st::calendarCellInner)); + p.drawEllipse(myrtlrect(innerLeft, innerTop, _st.cellInner, _st.cellInner)); p.setBrush(Qt::NoBrush); } auto it = _ripples.find(index); @@ -336,7 +338,7 @@ void CalendarBox::Inner::paintRows(Painter &p, QRect clip) { } void CalendarBox::Inner::mouseMoveEvent(QMouseEvent *e) { - const auto size = st::calendarCellSize; + const auto size = _st.cellSize; const auto point = e->pos(); const auto inner = QRect( rowsLeft(), @@ -371,14 +373,14 @@ void CalendarBox::Inner::mousePressEvent(QMouseEvent *e) { auto row = index / kDaysInWeek; auto col = index % kDaysInWeek; - auto cell = QRect(rowsLeft() + col * st::calendarCellSize.width(), rowsTop() + row * st::calendarCellSize.height(), st::calendarCellSize.width(), st::calendarCellSize.height()); + auto cell = QRect(rowsLeft() + col * _st.cellSize.width(), rowsTop() + row * _st.cellSize.height(), _st.cellSize.width(), _st.cellSize.height()); auto it = _ripples.find(_selected); if (it == _ripples.cend()) { - auto mask = Ui::RippleAnimation::ellipseMask(QSize(st::calendarCellInner, st::calendarCellInner)); + auto mask = Ui::RippleAnimation::ellipseMask(QSize(_st.cellInner, _st.cellInner)); auto update = [this, cell] { rtlupdate(cell); }; it = _ripples.emplace(_selected, std::make_unique(st::defaultRippleAnimation, std::move(mask), std::move(update))).first; } - auto ripplePosition = QPoint(cell.x() + (st::calendarCellSize.width() - st::calendarCellInner) / 2, cell.y() + (st::calendarCellSize.height() - st::calendarCellInner) / 2); + auto ripplePosition = QPoint(cell.x() + (_st.cellSize.width() - _st.cellInner) / 2, cell.y() + (_st.cellSize.height() - _st.cellInner) / 2); it->second->add(e->pos() - ripplePosition); } } @@ -403,11 +405,23 @@ void CalendarBox::Inner::setPressed(int pressed) { } } +int CalendarBox::Inner::countHeight() { + const auto innerHeight = _st.daysHeight + + _context->rowsCount() * _st.cellSize.height(); + return _st.padding.top() + + innerHeight + + _st.padding.bottom(); +} + +void CalendarBox::Inner::setDateChosenCallback(Fn callback) { + _dateChosenCallback = std::move(callback); +} + CalendarBox::Inner::~Inner() = default; class CalendarBox::Title : public TWidget, private base::Subscriber { public: - Title(QWidget *parent, Context *context) + Title(QWidget *parent, not_null context) : TWidget(parent) , _context(context) { subscribe(_context->month(), [this](QDate date) { monthChanged(date); }); @@ -419,7 +433,7 @@ protected: private: void monthChanged(QDate month); - Context *_context = nullptr; + not_null _context; QString _text; int _textWidth = 0; @@ -446,8 +460,25 @@ CalendarBox::CalendarBox( QDate highlighted, Fn callback, FnMut)> finalize) -: _context(std::make_unique(month, highlighted)) -, _inner(this, _context.get()) +: CalendarBox( + nullptr, + month, + highlighted, + std::move(callback), + std::move(finalize), + st::defaultCalendarSizes) { +} + +CalendarBox::CalendarBox( + QWidget*, + QDate month, + QDate highlighted, + Fn callback, + FnMut)> finalize, + const style::CalendarSizes &st) +: _st(st) +, _context(std::make_unique(month, highlighted)) +, _inner(this, _context.get(), _st) , _title(this, _context.get()) , _previous(this, st::calendarPrevious) , _next(this, st::calendarNext) @@ -498,7 +529,7 @@ bool CalendarBox::isNextEnabled() const { } void CalendarBox::monthChanged(QDate month) { - setDimensions(st::boxWideWidth, st::calendarTitleHeight + _inner->countHeight()); + setDimensions(_st.width, st::calendarTitleHeight + _inner->countHeight()); auto previousEnabled = isPreviousEnabled(); _previous->setIconOverride(previousEnabled ? nullptr : &st::calendarPreviousDisabled); _previous->setRippleColorOverride(previousEnabled ? nullptr : &st::boxBg); diff --git a/Telegram/SourceFiles/boxes/calendar_box.h b/Telegram/SourceFiles/boxes/calendar_box.h index e2385bcd9..2f8b65004 100644 --- a/Telegram/SourceFiles/boxes/calendar_box.h +++ b/Telegram/SourceFiles/boxes/calendar_box.h @@ -9,6 +9,10 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "abstract_box.h" +namespace style { +struct CalendarSizes; +} // namespace style + namespace Ui { class IconButton; } // namespace Ui @@ -21,6 +25,14 @@ public: QDate highlighted, Fn callback, FnMut)> finalize = nullptr); + CalendarBox( + QWidget*, + QDate month, + QDate highlighted, + Fn callback, + FnMut)> finalize, + const style::CalendarSizes &st); + void setMinDate(QDate date); void setMaxDate(QDate date); @@ -38,6 +50,8 @@ private: bool isPreviousEnabled() const; bool isNextEnabled() const; + const style::CalendarSizes &_st; + class Context; std::unique_ptr _context; diff --git a/Telegram/SourceFiles/export/view/export.style b/Telegram/SourceFiles/export/view/export.style index 463bb5a98..90c641750 100644 --- a/Telegram/SourceFiles/export/view/export.style +++ b/Telegram/SourceFiles/export/view/export.style @@ -94,3 +94,10 @@ exportTopBarLabel: FlatLabel(defaultFlatLabel) { linkFg: windowSubTextFg; } } +exportCalendarSizes: CalendarSizes(defaultCalendarSizes) { + width: 320px; + daysHeight: 32px; + cellSize: size(42px, 38px); + cellInner: 32px; + padding: margins(14px, 15px, 14px, 10px); +} diff --git a/Telegram/SourceFiles/export/view/export_view_settings.cpp b/Telegram/SourceFiles/export/view/export_view_settings.cpp index 85b9765df..fa7317f0f 100644 --- a/Telegram/SourceFiles/export/view/export_view_settings.cpp +++ b/Telegram/SourceFiles/export/view/export_view_settings.cpp @@ -388,7 +388,8 @@ void SettingsWidget::editDateLimit( month, highlighted, callback, - finalize); + finalize, + st::exportCalendarSizes); *shared = make_weak(box.data()); _showBoxCallback(std::move(box)); }