X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fqtui%2Fchatitem.h;h=3d5ad2ff6d57b450115497325edf9f82c5e566d9;hp=d68f3151946512444df4542f128b14b6d62edc5d;hb=960ed1ea65124794286c15a2d03bce60577556ee;hpb=7c78f651ee68ac7f9028f9a3640d4c8ae808c826 diff --git a/src/qtui/chatitem.h b/src/qtui/chatitem.h index d68f3151..3d5ad2ff 100644 --- a/src/qtui/chatitem.h +++ b/src/qtui/chatitem.h @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2005-08 by the Quassel Project * + * Copyright (C) 2005-09 by the Quassel Project * * devel@quassel-irc.org * * * * This program is free software; you can redistribute it and/or modify * @@ -27,16 +27,15 @@ #include "chatlinemodel.h" #include "chatscene.h" +#include "clickable.h" #include "uistyle.h" #include "qtui.h" -class QTextLayout; -struct ChatItemPrivate; +#include class ChatItem : public QGraphicsItem { protected: ChatItem(const qreal &width, const qreal &height, const QPointF &pos, QGraphicsItem *parent); - virtual ~ChatItem(); public: inline const QAbstractItemModel *model() const; @@ -48,9 +47,13 @@ public: inline qreal width() const { return _boundingRect.width(); } inline qreal height() const { return _boundingRect.height(); } - QTextLayout *createLayout(QTextOption::WrapMode, Qt::Alignment = Qt::AlignLeft) const; - virtual void doLayout(); - void clearLayout(); + void initLayoutHelper(QTextLayout *layout, QTextOption::WrapMode, Qt::Alignment = Qt::AlignLeft) const; + virtual inline void initLayout(QTextLayout *layout) const { + initLayoutHelper(layout, QTextOption::NoWrap); + 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 }; @@ -82,10 +85,10 @@ protected: virtual void mousePressEvent(QGraphicsSceneMouseEvent *event); virtual void mouseReleaseEvent(QGraphicsSceneMouseEvent *event); - inline QTextLayout *layout() const; - - virtual QTextLayout::FormatRange selectionFormat() const; - virtual inline QVector additionalFormats() const { return QVector(); } + void paintBackground(QPainter *); + QVector selectionFormats() const; + 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; } @@ -97,10 +100,6 @@ protected: qint16 posToCursor(const QPointF &pos) const; - inline bool hasPrivateData() const { return (bool)_data; } - ChatItemPrivate *privateData() const; - virtual inline ChatItemPrivate *newPrivateData(); - // WARNING: setGeometry and setHeight should not be used without either: // a) calling prepareGeometryChange() immediately before setColumns() // b) calling Chatline::setPos() immediately afterwards @@ -119,7 +118,6 @@ private: // internal selection stuff void setSelection(int start, int length); - ChatItemPrivate *_data; QRectF _boundingRect; SelectionMode _selectionMode; @@ -128,18 +126,6 @@ private: friend class ChatLine; }; -struct ChatItemPrivate { - QTextLayout *layout; - ChatItemPrivate(QTextLayout *l) : layout(l) {} - virtual ~ChatItemPrivate() { - delete layout; - } -}; - -// inlines of ChatItem -QTextLayout *ChatItem::layout() const { return privateData()->layout; } -ChatItemPrivate *ChatItem::newPrivateData() { return new ChatItemPrivate(createLayout(QTextOption::WrapAnywhere)); } - // ************************************************************ // TimestampChatItem // ************************************************************ @@ -166,7 +152,10 @@ protected: virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0); enum { Type = ChatScene::SenderChatItemType }; virtual inline int type() const { return Type; } - virtual inline ChatItemPrivate *newPrivateData() { return new ChatItemPrivate(createLayout(QTextOption::ManualWrap, Qt::AlignRight)); } + virtual inline void initLayout(QTextLayout *layout) const { + initLayoutHelper(layout, QTextOption::ManualWrap, Qt::AlignRight); + doLayout(layout); + } }; // ************************************************************ @@ -176,16 +165,17 @@ struct ContentsChatItemPrivate; //! A ChatItem for the contents column class ContentsChatItem : public ChatItem { - Q_DECLARE_TR_FUNCTIONS(ContentsChatItem); + Q_DECLARE_TR_FUNCTIONS(ContentsChatItem) public: ContentsChatItem(const qreal &width, const QPointF &pos, QGraphicsItem *parent); + ~ContentsChatItem(); enum { Type = ChatScene::ContentsChatItemType }; virtual inline int type() const { return Type; } inline ChatLineModel::ColumnType column() const { return ChatLineModel::ContentsColumn; } - inline QFontMetricsF *fontMetrics() const { return _fontMetrics; } + QFontMetricsF *fontMetrics() const; protected: virtual void mouseMoveEvent(QGraphicsSceneMouseEvent *event); @@ -198,17 +188,20 @@ protected: virtual QVector additionalFormats() const; - virtual void doLayout(); - virtual inline ChatItemPrivate *newPrivateData(); + virtual inline void initLayout(QTextLayout *layout) const { + initLayoutHelper(layout, QTextOption::WrapAtWordBoundaryOrAnywhere); + doLayout(layout); + } + virtual void doLayout(QTextLayout *layout) const; + virtual UiStyle::FormatList formatList() const; private: - struct Clickable; class ActionProxy; class WrapColumnFinder; - inline ContentsChatItemPrivate *privateData() const; + ContentsChatItemPrivate *_data; + ContentsChatItemPrivate *privateData() const; - QList findClickables() const; Clickable clickableAt(const QPointF &pos) const; void endHoverMode(); @@ -225,50 +218,25 @@ 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; - - 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; } -}; - -struct ContentsChatItemPrivate : ChatItemPrivate { +struct ContentsChatItemPrivate { ContentsChatItem *contentsItem; - QList clickables; - ContentsChatItem::Clickable currentClickable; - ContentsChatItem::Clickable activeClickable; + ClickableList clickables; + Clickable currentClickable; + Clickable activeClickable; - ContentsChatItemPrivate(QTextLayout *l, const QList &c, ContentsChatItem *parent) - : ChatItemPrivate(l), contentsItem(parent), clickables(c) {} + ContentsChatItemPrivate(const ClickableList &c, ContentsChatItem *parent) : contentsItem(parent), clickables(c) {} }; -//inlines regarding ContentsChatItemPrivate -ChatItemPrivate *ContentsChatItem::newPrivateData() { - return new ContentsChatItemPrivate(createLayout(QTextOption::WrapAnywhere), findClickables(), this); -} -ContentsChatItemPrivate *ContentsChatItem::privateData() const { return (ContentsChatItemPrivate *)ChatItem::privateData(); } - class ContentsChatItem::WrapColumnFinder { public: - WrapColumnFinder(ChatItem *parent); + WrapColumnFinder(const ChatItem *parent); ~WrapColumnFinder(); - qint16 nextWrapColumn(); + qint16 nextWrapColumn(qreal width); private: - ChatItem *item; - QTextLayout *layout; + const ChatItem *item; + QTextLayout layout; QTextLine line; ChatLineModel::WrapList wrapList; qint16 wordidx;