Also fixed a core crash resulting from receiving an empty topic message.
void IrcServerHandler::handleQuit(const QString &prefix, const QList<QByteArray> ¶ms) {
IrcUser *ircuser = network()->updateNickFromMask(prefix);
- Q_ASSERT(ircuser);
+ if(!ircuser) return;
QString msg;
if(params.count())
void IrcServerHandler::handleTopic(const QString &prefix, const QList<QByteArray> ¶ms) {
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);
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) {
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");
}
}
+// 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);
void clientNetworkUpdated();
void connectOrDisconnectFromNet();
+ void changeTopic(const QString &topic);
+
signals:
void connectToCore(const QVariantMap &connInfo);
void disconnectFromCore();
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());
}
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;
};