diff --git a/Telegram/SourceFiles/ui/boxes/calendar_box.cpp b/Telegram/SourceFiles/ui/boxes/calendar_box.cpp index 600fd985fb..77d50a88a8 100644 --- a/Telegram/SourceFiles/ui/boxes/calendar_box.cpp +++ b/Telegram/SourceFiles/ui/boxes/calendar_box.cpp @@ -532,6 +532,7 @@ public: [[nodiscard]] int countMaxHeight() const; void setDateChosenCallback(Fn callback); void setDynamicImage(QDate date, std::shared_ptr image); + void setRequireImage(bool require); ~Inner(); @@ -556,6 +557,7 @@ private: const style::CalendarColors &_styleColors; const not_null _context; bool _twoPressSelectionStarted = false; + bool _requireImage = false; Fn _dynamicImageForDate; struct DynamicImageState { @@ -945,6 +947,13 @@ void CalendarBox::Inner::setSelected(int selected) { if (selected != kEmptySelection && !_context->isEnabled(selected)) { selected = kEmptySelection; } + if (selected != kEmptySelection && _requireImage) { + const auto date = _context->dateFromIndex(selected); + const auto it = _dynamicImageStates.find(date); + if (it == end(_dynamicImageStates) || !it->second.image) { + selected = kEmptySelection; + } + } _selected = selected; const auto pointer = (_selected != kEmptySelection); const auto force = (_mouseMoved && _cursorSetWithoutMouseMove); @@ -1053,6 +1062,10 @@ void CalendarBox::Inner::setDynamicImage( update(); } +void CalendarBox::Inner::setRequireImage(bool require) { + _requireImage = require; +} + CalendarBox::Inner::~Inner() = default; class CalendarBox::Title final : public AbstractButton { @@ -1185,6 +1198,7 @@ CalendarBox::CalendarBox(QWidget*, CalendarBoxArgs &&args) , _finalize(std::move(args.finalize)) , _jumpTimer([=] { jump(_jumpButton); }) , _selectionChanged(std::move(args.selectionChanged)) { + _inner->setRequireImage(args.requireImage); _context->setAllowsSelection(args.allowsSelection); _context->setMinDate(args.minDate); _context->setMaxDate(args.maxDate); diff --git a/Telegram/SourceFiles/ui/boxes/calendar_box.h b/Telegram/SourceFiles/ui/boxes/calendar_box.h index 362b9e8c96..cf65aee6f6 100644 --- a/Telegram/SourceFiles/ui/boxes/calendar_box.h +++ b/Telegram/SourceFiles/ui/boxes/calendar_box.h @@ -51,6 +51,7 @@ struct CalendarBoxArgs { std::optional)> selectionChanged; const style::CalendarColors &stColors = st::defaultCalendarColors; Fn dynamicImageForDate; + bool requireImage = false; }; class CalendarBox final : public BoxContent, private AbstractTooltipShower { diff --git a/Telegram/SourceFiles/window/window_session_controller.cpp b/Telegram/SourceFiles/window/window_session_controller.cpp index f1fbe1b9d9..07de157154 100644 --- a/Telegram/SourceFiles/window/window_session_controller.cpp +++ b/Telegram/SourceFiles/window/window_session_controller.cpp @@ -2875,6 +2875,7 @@ void SessionController::showCalendar(ShowCalendarDescriptor &&descriptor) { session().api().resolveJumpToDate(chat, date, open); } }; + const auto requireImage = !!searchCalendarResult.customJump; show(Box(Ui::CalendarBoxArgs{ .month = highlighted, .highlighted = highlighted, @@ -2886,6 +2887,7 @@ void SessionController::showCalendar(ShowCalendarDescriptor &&descriptor) { .allowsSelection = history->peer->isUser(), .selectionChanged = selectionChanged, .dynamicImageForDate = std::move(searchCalendarResult.factory), + .requireImage = requireImage, })); }