custom_field_object.h 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. // This file is part of Desktop App Toolkit,
  2. // a set of libraries for developing nice desktop applications.
  3. //
  4. // For license and copyright information please follow this link:
  5. // https://github.com/desktop-app/legal/blob/master/LEGAL
  6. //
  7. #pragma once
  8. #include <QtGui/QTextObjectInterface>
  9. #include "ui/effects/animations.h"
  10. #include "ui/text/text.h"
  11. #include "ui/text/text_custom_emoji.h"
  12. namespace Ui {
  13. class InputField;
  14. class RpWidget;
  15. struct InputFieldTextRange;
  16. class CustomFieldObject : public QObject, public QTextObjectInterface {
  17. public:
  18. CustomFieldObject(
  19. not_null<InputField*> field,
  20. Text::MarkedContext context,
  21. Fn<bool()> pausedEmoji,
  22. Fn<bool()> pausedSpoiler);
  23. ~CustomFieldObject();
  24. void *qt_metacast(const char *iid) override;
  25. QSizeF intrinsicSize(
  26. QTextDocument *doc,
  27. int posInDocument,
  28. const QTextFormat &format) override;
  29. void drawObject(
  30. QPainter *painter,
  31. const QRectF &rect,
  32. QTextDocument *doc,
  33. int posInDocument,
  34. const QTextFormat &format) override;
  35. void setCollapsedText(int quoteId, TextWithTags text);
  36. [[nodiscard]] const TextWithTags &collapsedText(int quoteId) const;
  37. void setNow(crl::time now);
  38. void clearEmoji();
  39. void clearQuotes();
  40. [[nodiscard]] std::unique_ptr<RpWidget> createSpoilerOverlay();
  41. void refreshSpoilerShown(InputFieldTextRange range);
  42. private:
  43. struct Quote {
  44. TextWithTags text;
  45. Text::String string;
  46. };
  47. using Factory = Fn<std::unique_ptr<Text::CustomEmoji>(QStringView)>;
  48. [[nodiscard]] Factory makeFactory();
  49. [[nodiscard]] Text::MarkedContext makeFieldContext();
  50. const not_null<InputField*> _field;
  51. const Text::MarkedContext _context;
  52. const Fn<bool()> _pausedEmoji;
  53. const Fn<bool()> _pausedSpoiler;
  54. const Factory _factory;
  55. base::flat_map<uint64, std::unique_ptr<Text::CustomEmoji>> _emoji;
  56. base::flat_map<int, Quote> _quotes;
  57. crl::time _now = 0;
  58. int _skip = 0;
  59. Animations::Simple _spoilerOpacity;
  60. bool _spoilerHidden = false;
  61. };
  62. } // namespace Ui