#include "chatlinemodel.h"
#include "chatscene.h"
+#include "clickable.h"
#include "uistyle.h"
#include "qtui.h"
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 };
void paintBackground(QPainter *);
QVector<QTextLayout::FormatRange> selectionFormats() const;
- virtual inline QVector<QTextLayout::FormatRange> additionalFormats() const { return QVector<QTextLayout::FormatRange>(); }
+ virtual QVector<QTextLayout::FormatRange> 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; }
//! 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);
initLayoutHelper(layout, QTextOption::WrapAtWordBoundaryOrAnywhere);
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<Clickable> findClickables() const;
Clickable clickableAt(const QPointF &pos) const;
void endHoverMode();
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<ContentsChatItem::Clickable> clickables;
- ContentsChatItem::Clickable currentClickable;
- ContentsChatItem::Clickable activeClickable;
+class ContentsChatItem::WrapColumnFinder {
+public:
+ WrapColumnFinder(const ChatItem *parent);
+ ~WrapColumnFinder();
- ContentsChatItemPrivate(const QList<ContentsChatItem::Clickable> &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