X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fqtui%2Fchatitem.h;h=e94bda198a6283739ad71bafaa0182cc855cd67d;hp=cf71ad9b159ee6fb7ad4ce1f380677d742d01536;hb=55579f53f3bd37f2a20d9be7458bdc54b345a052;hpb=b62a657656223ee79dc0de04ac0194c90709c1de diff --git a/src/qtui/chatitem.h b/src/qtui/chatitem.h index cf71ad9b..e94bda19 100644 --- a/src/qtui/chatitem.h +++ b/src/qtui/chatitem.h @@ -27,6 +27,7 @@ #include "chatlinemodel.h" #include "chatscene.h" +#include "clickable.h" #include "uistyle.h" #include "qtui.h" @@ -52,6 +53,7 @@ public: doLayout(layout); } virtual void doLayout(QTextLayout *) const; + virtual UiStyle::FormatList formatList() const; virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0); enum { Type = ChatScene::ChatItemType }; @@ -85,7 +87,8 @@ protected: void paintBackground(QPainter *); QVector selectionFormats() const; - virtual inline QVector additionalFormats() const { return QVector(); } + virtual QVector additionalFormats() const; + void overlayFormat(UiStyle::FormatList &fmtList, int start, int end, quint32 overlayFmt) const; inline qint16 selectionStart() const { return _selectionStart; } inline void setSelectionStart(qint16 start) { _selectionStart = start; } @@ -186,18 +189,19 @@ protected: virtual QVector additionalFormats() const; virtual inline void initLayout(QTextLayout *layout) const { - initLayoutHelper(layout, QTextOption::WrapAtWordBoundaryOrAnywhere); + initLayoutHelper(layout, QTextOption::WrapAnywhere); doLayout(layout); } + virtual void doLayout(QTextLayout *layout) const; + virtual UiStyle::FormatList formatList() const; private: - struct Clickable; class ActionProxy; + class WrapColumnFinder; ContentsChatItemPrivate *_data; ContentsChatItemPrivate *privateData() const; - QList findClickables() const; Clickable clickableAt(const QPointF &pos) const; void endHoverMode(); @@ -214,31 +218,30 @@ private: static ActionProxy _actionProxy; }; -struct ContentsChatItem::Clickable { - // Don't change these enums without also changing the regexps in analyze()! - enum Type { - Invalid = -1, - Url = 0, - Channel = 1, - Nick = 2 - }; - - Type type; - quint16 start; - quint16 length; +struct ContentsChatItemPrivate { + ContentsChatItem *contentsItem; + ClickableList clickables; + Clickable currentClickable; + Clickable activeClickable; - inline Clickable() : type(Invalid) {}; - inline Clickable(Type type_, quint16 start_, quint16 length_) : type(type_), start(start_), length(length_) {}; - inline bool isValid() const { return type != Invalid; } + ContentsChatItemPrivate(const ClickableList &c, ContentsChatItem *parent) : contentsItem(parent), clickables(c) {} }; -struct ContentsChatItemPrivate { - ContentsChatItem *contentsItem; - QList clickables; - ContentsChatItem::Clickable currentClickable; - ContentsChatItem::Clickable activeClickable; +class ContentsChatItem::WrapColumnFinder { +public: + WrapColumnFinder(const ChatItem *parent); + ~WrapColumnFinder(); - ContentsChatItemPrivate(const QList &c, ContentsChatItem *parent) : contentsItem(parent), clickables(c) {} + qint16 nextWrapColumn(qreal width); + +private: + const ChatItem *item; + QTextLayout layout; + QTextLine line; + ChatLineModel::WrapList wrapList; + qint16 wordidx; + qint16 lineCount; + qreal choppedTrailing; }; //! Acts as a proxy for Action signals targetted at a ContentsChatItem