multi_select.h 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. /*
  2. This file is part of Telegram Desktop,
  3. the official desktop application for the Telegram messaging service.
  4. For license and copyright information please follow this link:
  5. https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
  6. */
  7. #pragma once
  8. #include "base/object_ptr.h"
  9. #include "ui/rp_widget.h"
  10. namespace style {
  11. struct MultiSelect;
  12. } // namespace style
  13. namespace Ui {
  14. class ScrollArea;
  15. class MultiSelect : public RpWidget {
  16. public:
  17. MultiSelect(
  18. QWidget *parent,
  19. const style::MultiSelect &st,
  20. rpl::producer<QString> placeholder = nullptr,
  21. const QString &query = QString());
  22. [[nodiscard]] QString getQuery() const;
  23. void setQuery(const QString &query);
  24. void setInnerFocus();
  25. void clearQuery();
  26. void setQueryChangedCallback(Fn<void(const QString &query)> callback);
  27. void setSubmittedCallback(Fn<void(Qt::KeyboardModifiers)> callback);
  28. void setCancelledCallback(Fn<void()> callback);
  29. void setResizedCallback(Fn<void()> callback);
  30. enum class AddItemWay {
  31. Default,
  32. SkipAnimation,
  33. };
  34. using PaintRoundImage = Fn<void(Painter &p, int x, int y, int outerWidth, int size)>;
  35. void addItem(uint64 itemId, const QString &text, style::color color, PaintRoundImage paintRoundImage, AddItemWay way = AddItemWay::Default);
  36. void addItemInBunch(uint64 itemId, const QString &text, style::color color, PaintRoundImage paintRoundImage);
  37. void finishItemsBunch();
  38. void setItemText(uint64 itemId, const QString &text);
  39. void setItemRemovedCallback(Fn<void(uint64 itemId)> callback);
  40. void removeItem(uint64 itemId);
  41. int getItemsCount() const;
  42. QVector<uint64> getItems() const;
  43. bool hasItem(uint64 itemId) const;
  44. protected:
  45. int resizeGetHeight(int newWidth) override;
  46. bool eventFilter(QObject *o, QEvent *e) override;
  47. private:
  48. void scrollTo(int activeTop, int activeBottom);
  49. const style::MultiSelect &_st;
  50. object_ptr<Ui::ScrollArea> _scroll;
  51. class Inner;
  52. QPointer<Inner> _inner;
  53. Fn<void()> _resizedCallback;
  54. Fn<void(const QString &query)> _queryChangedCallback;
  55. };
  56. } // namespace Ui