Ripped the guts out of the BufferWidget (which is basically the StackedWidget contain...
authorMarcus Eggenberger <egs@quassel-irc.org>
Thu, 25 Oct 2007 08:43:31 +0000 (08:43 +0000)
committerMarcus Eggenberger <egs@quassel-irc.org>
Thu, 25 Oct 2007 08:43:31 +0000 (08:43 +0000)
src/client/buffer.cpp
src/client/buffer.h
src/qtui/bufferwidget.cpp
src/qtui/bufferwidget.h
src/qtui/ui/bufferwidget.ui
src/qtui/ui/mainwin.ui

index b82a695..3e6e339 100644 (file)
@@ -74,6 +74,10 @@ void Buffer::updateBufferInfo(BufferInfo bufferid) {
   _bufferInfo = bufferid;
 }
 
+uint Buffer::uid() const {
+  return bufferInfo().uid();
+}
+
 uint Buffer::networkId() const {
   return bufferInfo().networkId();
 }
index b67a0f4..fa2e472 100644 (file)
@@ -60,7 +60,8 @@ public:
 
   BufferInfo bufferInfo() const;
   void updateBufferInfo(BufferInfo bufferid);
-  
+
+  uint uid() const;
   uint networkId() const;
   
   QString networkName() const;
index dbeb571..5448221 100644 (file)
 
 BufferWidget::BufferWidget(QWidget *parent) : QWidget(parent) {
   ui.setupUi(this);
-
-  curBuf = 0;
-  //setBaseSize(QSize(600,400));
-  //setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
   connect(ui.inputEdit, SIGNAL(returnPressed()), this, SLOT(enterPressed()));
-  connect(this, SIGNAL(nickListUpdated(QStringList)), ui.inputEdit, SLOT(updateNickList(QStringList)));
-
 }
 
 void BufferWidget::init() {
-
 }
 
 BufferWidget::~BufferWidget() {
-  foreach(BufferState *s, states.values()) {
-    delete s;
-  }
 }
 
 void BufferWidget::setBuffer(Buffer *buf) {
-  BufferState *state;
-  curBuf = buf;
-  if(states.contains(buf)) {
-    state = states[buf];
+  ChatWidget *chatWidget;
+  if(_chatWidgets.contains(buf->uid())) {
+     chatWidget = _chatWidgets[buf->uid()];
   } else {
-    BufferState *s = new BufferState;
-    s->currentLine = Settings::guiValue(QString("BufferStates/%1/%2/currentLine").arg(buf->networkName()).arg(buf->bufferName()), -1).toInt();
-    if(buf->bufferType() == Buffer::ChannelType) {
-      s->splitterState = Settings::guiValue(QString("BufferStates/%1/%2/splitter").arg(buf->networkName()).arg(buf->bufferName())).toByteArray();
-      s->splitter = new QSplitter(this);
-      s->chatWidget = new ChatWidget(s->splitter);
-      s->nickTree = new QTreeWidget(s->splitter);
-      s->nickTree->headerItem()->setHidden(true);
-      s->nickTree->setRootIsDecorated(false);
-      s->page = s->splitter;
-      s->ownNick = buf->ownNick();
-      s->topic = buf->topic();
-      updateNickList(s, buf->nickList());
-      s->splitter->restoreState(s->splitterState);
-      connect(buf, SIGNAL(nickListChanged(QVariantMap)), this, SLOT(updateNickList(QVariantMap)));
-      connect(s->nickTree, SIGNAL(itemExpanded(QTreeWidgetItem *)), this, SLOT(itemExpansionChanged(QTreeWidgetItem*)));
-      connect(s->nickTree, SIGNAL(itemCollapsed(QTreeWidgetItem *)), this, SLOT(itemExpansionChanged(QTreeWidgetItem*)));
-    } else {
-      s->splitter = 0; s->nickTree = 0;
-      s->chatWidget = new ChatWidget(this);
-      s->page = s->chatWidget;
-      s->ownNick = buf->ownNick();
-      s->topic = buf->bufferName();
-    }
-    s->opsExpanded = Settings::guiValue(QString("BufferStates/%1/%2/opsExpanded").arg(buf->networkName()).arg(buf->bufferName()), true).toBool();
-    s->voicedExpanded = Settings::guiValue(QString("BufferStates/%1/%2/voicedExpanded").arg(buf->networkName()).arg(buf->bufferName()), true).toBool();
-    s->usersExpanded = Settings::guiValue(QString("BufferStates/%1/%2/usersExpanded").arg(buf->networkName()).arg(buf->bufferName()), true).toBool();
-    states[buf] = s;
-    state = s;
-    state->chatWidget->init(networkName, bufferName);
+    chatWidget = new ChatWidget(this);
+    chatWidget->init(networkName, bufferName);
     QList<ChatLine *> lines;
     QList<AbstractUiMsg *> msgs = buf->contents();
     foreach(AbstractUiMsg *msg, msgs) {
       lines.append(dynamic_cast<ChatLine*>(msg));
     }
-    state->chatWidget->setContents(lines);
-    connect(buf, SIGNAL(msgAppended(AbstractUiMsg *)), state->chatWidget, SLOT(appendMsg(AbstractUiMsg *)));
-    connect(buf, SIGNAL(msgPrepended(AbstractUiMsg *)), state->chatWidget, SLOT(prependMsg(AbstractUiMsg *)));
-    connect(buf, SIGNAL(topicSet(QString)), this, SLOT(setTopic(QString)));
-    connect(buf, SIGNAL(ownNickSet(QString)), this, SLOT(setOwnNick(QString)));
-    ui.stackedWidget->addWidget(s->page);
+    chatWidget->setContents(lines);
+    connect(buf, SIGNAL(msgAppended(AbstractUiMsg *)), chatWidget, SLOT(appendMsg(AbstractUiMsg *)));
+    connect(buf, SIGNAL(msgPrepended(AbstractUiMsg *)), chatWidget, SLOT(prependMsg(AbstractUiMsg *)));
+    _chatWidgets[buf->uid()] = chatWidget;
+    ui.stackedWidget->addWidget(chatWidget);
   }
-  ui.stackedWidget->setCurrentWidget(state->page);
-  ui.topicEdit->setText(buf->topic());
-  chatWidget = state->chatWidget;
-  nickTree = state->nickTree;
-  splitter = state->splitter;
-  //ui.ownNick->set
+  ui.stackedWidget->setCurrentWidget(chatWidget);
   disconnect(this, SIGNAL(userInput(QString)), 0, 0);
   connect(this, SIGNAL(userInput(QString)), buf, SLOT(processUserInput(QString)));
-  state->chatWidget->setFocusProxy(ui.inputEdit);
+  chatWidget->setFocusProxy(ui.inputEdit);
   ui.inputEdit->setFocus();
-  ui.topicEdit->setText(state->topic);
   ui.ownNick->clear();  // TODO add nick history
-  ui.ownNick->addItem(state->ownNick);
-  updateTitle();
+  // ui.ownNick->addItem(state->ownNick);
 }
 
 void BufferWidget::saveState() {
-  foreach(Buffer *buf, states.keys()) {
-    BufferState *s = states[buf];
-    if(s->splitter) Settings::setGuiValue(QString("BufferStates/%1/%2/splitter").arg(buf->networkName()).arg(buf->bufferName()), s->splitter->saveState());
-    Settings::setGuiValue(QString("BufferStates/%1/%2/currentLine").arg(buf->networkName()).arg(buf->bufferName()), s->currentLine);
-    Settings::setGuiValue(QString("BufferStates/%1/%2/opsExpanded").arg(buf->networkName()).arg(buf->bufferName()), s->opsExpanded);
-    Settings::setGuiValue(QString("BufferStates/%1/%2/voicedExpanded").arg(buf->networkName()).arg(buf->bufferName()), s->voicedExpanded);
-    Settings::setGuiValue(QString("BufferStates/%1/%2/usersExpanded").arg(buf->networkName()).arg(buf->bufferName()), s->usersExpanded);
-  }
 }
 
 QSize BufferWidget::sizeHint() const {
   return QSize(800,400);
 }
 
-void BufferWidget::updateTitle() {
-  QString title = QString("%1 in %2 [%3]: %4").arg(ui.ownNick->currentText()).arg(bufferName).arg(networkName).arg(ui.topicEdit->text());
-  setWindowTitle(title);
-}
-
 void BufferWidget::enterPressed() {
   QStringList lines = ui.inputEdit->text().split('\n', QString::SkipEmptyParts);
   foreach(QString msg, lines) {
@@ -146,11 +86,6 @@ void BufferWidget::setActive(bool act) {
   }
 }
 
-void BufferWidget::resizeEvent ( QResizeEvent * event ) {
-  //qDebug() << "resizing:" << bufferName << event->size();
-  QWidget::resizeEvent(event);
-
-}
 
 /*
 void BufferWidget::displayMsg(Message msg) {
@@ -158,76 +93,3 @@ void BufferWidget::displayMsg(Message msg) {
 }
 */
 
-void BufferWidget::setOwnNick(QString nick) {
-  Buffer *buf = qobject_cast<Buffer*>(sender());
-  Q_ASSERT(buf);
-  states[buf]->ownNick = nick;
-  if(buf == curBuf) {
-    ui.ownNick->clear();
-    ui.ownNick->addItem(nick);
-    updateTitle();
-  }
-}
-
-void BufferWidget::setTopic(QString topic) {
-  Buffer *buf = qobject_cast<Buffer*>(sender());
-  Q_ASSERT(buf);
-  states[buf]->topic = topic;
-  if(buf == curBuf) {
-    ui.topicEdit->setText(topic);
-    updateTitle();
-  }
-}
-
-
-void BufferWidget::updateNickList(QVariantMap nicks) {
-  Buffer *buf = qobject_cast<Buffer*>(sender());
-  Q_ASSERT(buf);
-  updateNickList(states[buf], nicks);
-}
-
-// TODO Use 005
-void BufferWidget::updateNickList(BufferState *state, QVariantMap nicks) {
-  emit nickListUpdated(nicks.keys());
-  QTreeWidget *tree = state->nickTree;
-  if(!tree) return;
-  tree->clear();
-  if(nicks.count() != 1) tree->setHeaderLabel(tr("%1 Users").arg(nicks.count()));
-  else tree->setHeaderLabel(tr("1 User"));
-  QTreeWidgetItem *ops = new QTreeWidgetItem();
-  QTreeWidgetItem *voiced = new QTreeWidgetItem();
-  QTreeWidgetItem *users = new QTreeWidgetItem();
-  // To sort case-insensitive, we have to put all nicks in a map which is sorted by (lowercase) key...
-  QMap<QString, QString> sorted;
-  foreach(QString n, nicks.keys()) { sorted[n.toLower()] = n; }
-  foreach(QString n, sorted.keys()) {
-    QString nick = sorted[n];
-    QString mode = nicks[nick].toMap()["Channels"].toMap()[bufferName].toMap()["Mode"].toString();
-    if(mode.contains('o')) { new QTreeWidgetItem(ops, QStringList(QString("@%1").arg(nick))); }
-    else if(mode.contains('v')) { new QTreeWidgetItem(voiced, QStringList(QString("+%1").arg(nick))); }
-    else new QTreeWidgetItem(users, QStringList(nick));
-  }
-  if(ops->childCount()) {
-    ops->setText(0, tr("%1 Operators").arg(ops->childCount()));
-    tree->addTopLevelItem(ops);
-    ops->setExpanded(state->opsExpanded);
-  } else delete ops;
-  if(voiced->childCount()) {
-    voiced->setText(0, tr("%1 Voiced").arg(voiced->childCount()));
-    tree->addTopLevelItem(voiced);
-    voiced->setExpanded(state->voicedExpanded);
-  } else delete voiced;
-  if(users->childCount()) {
-    users->setText(0, tr("%1 Users").arg(users->childCount()));
-    tree->addTopLevelItem(users);
-    users->setExpanded(state->usersExpanded);
-  } else delete users;
-}
-
-// TODO Use 005 and additional user modes
-void BufferWidget::itemExpansionChanged(QTreeWidgetItem *item) {
-  if(item->child(0)->text(0).startsWith('@')) states[curBuf]->opsExpanded = item->isExpanded();
-  else if(item->child(0)->text(0).startsWith('+')) states[curBuf]->voicedExpanded = item->isExpanded();
-  else states[curBuf]->usersExpanded = item->isExpanded();
-}
-
index 251643f..c3c7aa3 100644 (file)
@@ -38,75 +38,34 @@ class LayoutThread;
 class BufferWidget : public QWidget {
   Q_OBJECT
 
-  public:
-    BufferWidget(QWidget *parent = 0);
-    ~BufferWidget();
-    void init();
-
-    QSize sizeHint() const;
-
-  signals:
-    void userInput(QString msg);
-    void aboutToClose();
+public:
+  BufferWidget(QWidget *parent = 0);
+  virtual ~BufferWidget();
+  void init();
+
+  QSize sizeHint() const;
+
+signals:
+  void userInput(QString msg);
+  void aboutToClose();
+    
+public slots:
+  void setBuffer(Buffer *);
+  void saveState();
+                 
+private slots:
+  void enterPressed();
+  void setActive(bool act = true);
   
-    //void layoutMessages(LayoutTask);
-    void nickListUpdated(QStringList l);
-      
-  protected:
-
-  public slots:
-    void setBuffer(Buffer *);
-    void saveState();
-    //void prependMessages(Buffer *, QList<Message>);  // for backlog processing
-
-  protected:
-    void resizeEvent ( QResizeEvent * event );
-
-  private slots:
-    void enterPressed();
-    void itemExpansionChanged(QTreeWidgetItem *);
-    void updateTitle();
-
-    //void displayMsg(Message);
-    void updateNickList(BufferState *state, QVariantMap nicks);
-    void updateNickList(QVariantMap nicks);
-    void setOwnNick(QString ownNick);
-    void setTopic(QString topic);
-    void setActive(bool act = true);
-
-    //void messagesLayouted(LayoutTask);
-
-
-  private:
-    Ui::BufferWidget ui;
-    Buffer *curBuf;
-    QHash<Buffer *, BufferState *> states;
-    bool active;
-
-    ChatWidget *chatWidget;
-    QSplitter *splitter;
-    QTreeWidget *nickTree;
-
-    QString networkName;
-    QString bufferName;
-
-    //LayoutThread *layoutThread;
-    //QHash<Buffer *, QList<ChatLine*> > chatLineCache;
-    //QHash<Buffer *, QList<Message> > msgCache;
+  
+private:
+  Ui::BufferWidget ui;
+  QHash<uint, ChatWidget*> _chatWidgets;
+  bool active;
+  
+  QString networkName;
+  QString bufferName;
 };
 
-struct BufferState {
-  ChatWidget *chatWidget;
-  QTreeWidget *nickTree;
-  QSplitter *splitter;
-  QWidget *page;
-  Buffer *buffer;
-  QByteArray splitterState;
-  QString topic, ownNick;
-  QString inputLine;
-  int currentLine;
-  int lineOffset;
-  bool opsExpanded, voicedExpanded, usersExpanded;
-};
 
 #endif
index 0c4c22e..68c8950 100644 (file)
    <property name="bottomMargin" >
     <number>0</number>
    </property>
-   <item>
-    <layout class="QHBoxLayout" >
-     <property name="spacing" >
-      <number>6</number>
-     </property>
-     <property name="leftMargin" >
-      <number>0</number>
-     </property>
-     <property name="topMargin" >
-      <number>0</number>
-     </property>
-     <property name="rightMargin" >
-      <number>0</number>
-     </property>
-     <property name="bottomMargin" >
-      <number>0</number>
-     </property>
-     <item>
-      <widget class="QLineEdit" name="topicEdit" >
-       <property name="enabled" >
-        <bool>false</bool>
-       </property>
-       <property name="focusPolicy" >
-        <enum>Qt::ClickFocus</enum>
-       </property>
-       <property name="readOnly" >
-        <bool>true</bool>
-       </property>
-      </widget>
-     </item>
-     <item>
-      <widget class="QToolButton" name="chanSettingsButton" >
-       <property name="windowModality" >
-        <enum>Qt::NonModal</enum>
-       </property>
-       <property name="sizePolicy" >
-        <sizepolicy vsizetype="Fixed" hsizetype="Fixed" >
-         <horstretch>0</horstretch>
-         <verstretch>0</verstretch>
-        </sizepolicy>
-       </property>
-       <property name="layoutDirection" >
-        <enum>Qt::LeftToRight</enum>
-       </property>
-       <property name="text" >
-        <string>...</string>
-       </property>
-      </widget>
-     </item>
-    </layout>
-   </item>
    <item>
     <widget class="QStackedWidget" name="stackedWidget" >
      <property name="sizePolicy" >
@@ -223,8 +172,6 @@ p, li { white-space: pre-wrap; }
  <tabstops>
   <tabstop>inputEdit</tabstop>
   <tabstop>ownNick</tabstop>
-  <tabstop>topicEdit</tabstop>
-  <tabstop>chanSettingsButton</tabstop>
  </tabstops>
  <resources/>
  <connections/>
index 9a35511..794f50c 100644 (file)
      <number>6</number>
     </property>
     <property name="leftMargin" >
-     <number>9</number>
+     <number>0</number>
     </property>
     <property name="topMargin" >
-     <number>9</number>
+     <number>0</number>
     </property>
     <property name="rightMargin" >
-     <number>9</number>
+     <number>0</number>
     </property>
     <property name="bottomMargin" >
-     <number>9</number>
+     <number>0</number>
     </property>
     <item>
      <widget class="BufferWidget" native="1" name="bufferWidget" />
@@ -46,7 +46,7 @@
      <x>0</x>
      <y>0</y>
      <width>800</width>
-     <height>32</height>
+     <height>22</height>
     </rect>
    </property>
    <widget class="QMenu" name="menuConnection" >