fb2icon.cpp 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. #include <QApplication>
  2. #include <QTextDocument>
  3. #include <QTextCharFormat>
  4. #include <QVariant>
  5. static const int IconFormatType = 0x1000;
  6. //----------------------------------------------------------------------------
  7. // TextIconFormat
  8. //----------------------------------------------------------------------------
  9. class TextIconFormat : public QTextCharFormat
  10. {
  11. public:
  12. static void TextIconFormat::insert(QTextCursor &cursor, const QString &name, const QString &text);
  13. TextIconFormat(const QString &iconName, const QString &text);
  14. enum Property {
  15. IconName = QTextFormat::UserProperty + 1,
  16. IconText = QTextFormat::UserProperty + 2
  17. };
  18. };
  19. TextIconFormat::TextIconFormat(const QString &iconName, const QString &text)
  20. {
  21. setObjectType(IconFormatType);
  22. QTextFormat::setProperty(IconName, iconName);
  23. QTextFormat::setProperty(IconText, text);
  24. }
  25. void TextIconFormat::insertIcon(QTextCursor &cursor, const QString &name, const QString &text)
  26. {
  27. QTextCharFormat format = cursor.charFormat();
  28. TextIconFormat icon(iconName, iconText);
  29. cursor.insertText(QString(QChar::ObjectReplacementCharacter), icon);
  30. cursor.setCharFormat(format);
  31. }
  32. //----------------------------------------------------------------------------
  33. // IconTextObjectInterface
  34. //----------------------------------------------------------------------------
  35. class TextIconHandler : public QObject, public QTextObjectInterface
  36. {
  37. Q_OBJECT
  38. Q_INTERFACES(QTextObjectInterface)
  39. public:
  40. static void TextIconHandler::install(QTextDocument *doc);
  41. TextIconHandler(QObject *parent = 0): QObject(parent) {}
  42. virtual QSizeF intrinsicSize(QTextDocument *doc, int posInDocument, const QTextFormat &format);
  43. virtual void drawObject(QPainter *painter, const QRectF &rect, QTextDocument *doc, int posInDocument, const QTextFormat &format);
  44. };
  45. QSizeF TextIconHandler::intrinsicSize(QTextDocument *doc, int posInDocument, const QTextFormat &format)
  46. {
  47. Q_UNUSED(doc);
  48. Q_UNUSED(posInDocument);
  49. const QTextCharFormat charFormat = format.toCharFormat();
  50. return IconsetFactory::iconPixmap(charFormat.stringProperty(TextIconFormat::IconName)).size();
  51. }
  52. void TextIconHandler::drawObject(QPainter *painter, const QRectF &rect, QTextDocument *doc, int posInDocument, const QTextFormat &format)
  53. {
  54. Q_UNUSED(doc);
  55. Q_UNUSED(posInDocument);
  56. const QTextCharFormat charFormat = format.toCharFormat();
  57. const QPixmap pixmap = IconsetFactory::iconPixmap(charFormat.stringProperty(TextIconFormat::IconName));
  58. painter->drawPixmap(rect, pixmap, pixmap.rect());
  59. }
  60. void TextIconHandler::install(QTextDocument *doc)
  61. {
  62. static TextIconHandler *handler = 0;
  63. if (!handler) handler = new TextIconHandler(qApp);
  64. doc->documentLayout()->registerHandler(IconFormatType, handler);
  65. }