Add new ItemView settingspage
[quassel.git] / src / qtui / chatitem.h
index cc37dac..e31ce81 100644 (file)
@@ -48,7 +48,7 @@ public:
 
   void initLayoutHelper(QTextLayout *layout, QTextOption::WrapMode, Qt::Alignment = Qt::AlignLeft) const;
   virtual inline void initLayout(QTextLayout *layout) const {
-    initLayoutHelper(layout, QTextOption::WrapAnywhere);
+    initLayoutHelper(layout, QTextOption::NoWrap);
     doLayout(layout);
   }
   virtual void doLayout(QTextLayout *) const;
@@ -186,13 +186,15 @@ protected:
   virtual QVector<QTextLayout::FormatRange> 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;
 
 private:
   struct Clickable;
   class ActionProxy;
+  class WrapColumnFinder;
 
   ContentsChatItemPrivate *_data;
   ContentsChatItemPrivate *privateData() const;
@@ -241,6 +243,23 @@ struct ContentsChatItemPrivate {
   ContentsChatItemPrivate(const QList<ContentsChatItem::Clickable> &c, ContentsChatItem *parent) : contentsItem(parent), clickables(c) {}
 };
 
+class ContentsChatItem::WrapColumnFinder {
+public:
+  WrapColumnFinder(const ChatItem *parent);
+  ~WrapColumnFinder();
+
+  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
 /** Since a ChatItem is not a QObject, hence cannot receive signals, we use a static ActionProxy
  *  as a receiver instead. This avoids having to handle ChatItem actions (e.g. context menu entries)