Pressing enter in the topic line now sets the channel topic.
authorManuel Nickschas <sputnick@quassel-irc.org>
Wed, 20 Feb 2008 21:08:20 +0000 (21:08 +0000)
committerManuel Nickschas <sputnick@quassel-irc.org>
Wed, 20 Feb 2008 21:08:20 +0000 (21:08 +0000)
Also fixed a core crash resulting from receiving an empty topic message.

src/core/ircserverhandler.cpp
src/core/userinputhandler.cpp
src/qtui/mainwin.cpp
src/qtui/mainwin.h
src/qtui/topicwidget.cpp
src/qtui/topicwidget.h

index 335bd3a..0499c85 100644 (file)
@@ -312,7 +312,7 @@ void IrcServerHandler::handlePrivmsg(const QString &prefix, const QList<QByteArr
 
 void IrcServerHandler::handleQuit(const QString &prefix, const QList<QByteArray> &params) {
   IrcUser *ircuser = network()->updateNickFromMask(prefix);
-  Q_ASSERT(ircuser);
+  if(!ircuser) return;
 
   QString msg;
   if(params.count())
@@ -326,9 +326,10 @@ void IrcServerHandler::handleQuit(const QString &prefix, const QList<QByteArray>
 
 void IrcServerHandler::handleTopic(const QString &prefix, const QList<QByteArray> &params) {
   IrcUser *ircuser = network()->updateNickFromMask(prefix);
+  if(!ircuser) return;
   QString channel = serverDecode(params[0]);
-  QString topic = channelDecode(channel, params[1]);
-  Q_ASSERT(ircuser);
+  QString topic;
+  if(params.count() >= 2) topic = channelDecode(channel, params[1]);
 
   network()->ircChannel(channel)->setTopic(topic);
 
index 0856134..d7b827e 100644 (file)
@@ -222,9 +222,13 @@ void UserInputHandler::handleSay(const BufferInfo &bufferInfo, const QString &ms
 
 void UserInputHandler::handleTopic(const BufferInfo &bufferInfo, const QString &msg) {
   if(bufferInfo.bufferName().isEmpty()) return;
-  QList<QByteArray> params;
-  params << serverEncode(bufferInfo.bufferName()) << channelEncode(bufferInfo.bufferName(), msg);
-  emit putCmd("TOPIC", params);
+  if(!msg.isEmpty()) {
+    QList<QByteArray> params;
+    params << serverEncode(bufferInfo.bufferName()) << channelEncode(bufferInfo.bufferName(), msg);
+    emit putCmd("TOPIC", params);
+  } else {
+    emit networkConnection()->putRawLine("TOPIC " + serverEncode(bufferInfo.bufferName()) + " :");
+  }
 }
 
 void UserInputHandler::handleVoice(const BufferInfo &bufferInfo, const QString &msg) {
index b44f7dd..e6f3a54 100644 (file)
@@ -254,6 +254,8 @@ void MainWin::setupTopicWidget() {
   VerticalDock *dock = new VerticalDock(tr("Topic"), this);
   dock->setObjectName("TopicDock");
   TopicWidget *topicwidget = new TopicWidget(dock);
+  connect(topicwidget, SIGNAL(topicChanged(const QString &)), this, SLOT(changeTopic(const QString &)));
+
   dock->setWidget(topicwidget);
 
   Client::bufferModel()->mapProperty(1, Qt::DisplayRole, topicwidget, "topic");
@@ -303,6 +305,14 @@ void MainWin::changeEvent(QEvent *event) {
   }
 }
 
+// FIXME this should be made prettier...
+void MainWin::changeTopic(const QString &topic) {
+  BufferId id = ui.bufferWidget->currentBuffer();
+  if(!id.isValid()) return;
+  Buffer *buffer = Client::buffer(id);
+  if(buffer) Client::userInput(buffer->bufferInfo(), QString("/topic %1").arg(topic));
+}
+
 void MainWin::connectedToCore() {
   foreach(BufferInfo id, Client::allBufferInfos()) {
     emit requestBacklog(id, 1000, -1);
index 40764f3..57c8bb3 100644 (file)
@@ -73,6 +73,8 @@ class MainWin : public QMainWindow {
     void clientNetworkUpdated();
     void connectOrDisconnectFromNet();
 
+    void changeTopic(const QString &topic);
+
   signals:
     void connectToCore(const QVariantMap &connInfo);
     void disconnectFromCore();
index 06303c8..40e7ae8 100644 (file)
@@ -28,13 +28,12 @@ TopicWidget::TopicWidget(QWidget *parent)
   ui.setupUi(this);
 }
 
-QString TopicWidget::topic() const {
-  return ui.topicLineEdit->text();
-}
-
 void TopicWidget::setTopic(const QString &newtopic) {
   ui.topicLineEdit->setText(newtopic);
+  ui.topicLineEdit->setCursorPosition(0);
 }
 
-TopicWidget::~TopicWidget() {
+void TopicWidget::on_topicLineEdit_returnPressed() {
+  ui.topicLineEdit->setCursorPosition(0);
+  emit topicChanged(topic());
 }
index c28a2eb..f899a2b 100644 (file)
@@ -29,15 +29,20 @@ class TopicWidget : public QWidget {
   Q_OBJECT
   Q_PROPERTY(QString topic READ topic WRITE setTopic STORED false)
 
-public:
-  TopicWidget(QWidget *parent = 0);
-  virtual ~TopicWidget();
+  public:
+    TopicWidget(QWidget *parent = 0);
 
-  QString topic() const;
-  void setTopic(const QString &newtopic);
+    inline QString topic() const { return ui.topicLineEdit->text(); }
+    void setTopic(const QString &newtopic);
+
+  signals:
+    void topicChanged(const QString &text);
+
+  private slots:
+    void on_topicLineEdit_returnPressed();
   
-private:
-  Ui::TopicWidget ui;
+  private:
+    Ui::TopicWidget ui;
 };