/* This file is part of Telegram Desktop, the official desktop application for the Telegram messaging service. For license and copyright information please follow this link: https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL */ #pragma once #include "overview/overview_layout.h" namespace Overview::Layout { class MosaicLayout final { public: struct FoundItem { ClickHandlerPtr link; ItemBase *item = nullptr; int index = -1; }; MosaicLayout(); [[nodiscard]] int rowHeightAt(int row) const; [[nodiscard]] int countDesiredHeight(int newWidth); [[nodiscard]] FoundItem findByPoint(const QPoint &globalPoint) const; [[nodiscard]] QRect findRect(int index) const; void addItems(const std::vector> &items); void setRightSkip(int rightSkip); void setFullWidth(int w); void setOffset(int left, int top); [[nodiscard]] bool empty() const; [[nodiscard]] int rowsCount() const; [[nodiscard]] int columnsCountAt(int row) const; [[nodiscard]] not_null itemAt(int row, int column) const; [[nodiscard]] not_null itemAt(int index) const; [[nodiscard]] ItemBase *maybeItemAt(int row, int column) const; [[nodiscard]] ItemBase *maybeItemAt(int index) const; void clearRows(bool resultsDeleted); void preloadImages(); void paint( Fn, QPoint)> paintItemCallback, const QRect &clip) const; private: struct Row { int maxWidth = 0; int height = 0; std::vector items; }; void addItem(not_null item, Row &row, int &sumWidth); bool rowFinalize(Row &row, int &sumWidth, bool force); void layoutRow(Row &row, int fullWidth); int _bigWidth; int _width = 0; int _rightSkip = 0; QPoint _offset; std::vector _rows; }; } // namespace Overview::Layout