Implement authenticator class used for logging in users
[quassel.git] / src / client / networkmodel.cpp
index bba2175..974f31a 100644 (file)
@@ -76,7 +76,7 @@ QVariant NetworkItem::data(int column, int role) const
 
 QString NetworkItem::escapeHTML(const QString &string, bool useNonbreakingSpaces)
 {
-    // QString.replace() doesn't guarentee the source string will remain constant.
+    // QString.replace() doesn't guarantee the source string will remain constant.
     // Use a local variable to avoid compiler errors.
 #if QT_VERSION < 0x050000
     QString formattedString = Qt::escape(string);
@@ -522,8 +522,7 @@ QString QueryBufferItem::toolTip(int column) const
     Q_UNUSED(column);
     QString strTooltip;
     QTextStream tooltip( &strTooltip, QIODevice::WriteOnly );
-    tooltip << "<qt><style>.bold { font-weight: bold; }</style>"
-            << "<style>.italic { font-style: italic; }</style>";
+    tooltip << "<qt><style>.bold { font-weight: bold; } .italic { font-style: italic; }</style>";
 
     // Keep track of whether or not information has been added
     bool infoAdded = false;
@@ -552,11 +551,13 @@ QString QueryBufferItem::toolTip(int column) const
 
         tooltip << "<table cellspacing='5' cellpadding='0'>";
         if (_ircUser->isAway()) {
-            QString awayMessage(tr("(unknown)"));
-            if(!_ircUser->awayMessage().isEmpty()) {
-                awayMessage = _ircUser->awayMessage();
+            QString awayMessageHTML = QString("<p class='italic'>%1</p>").arg(tr("Unknown"));
+
+            // If away message is known, replace with the escaped message.
+            if (!_ircUser->awayMessage().isEmpty()) {
+                awayMessageHTML = NetworkItem::escapeHTML(_ircUser->awayMessage());
             }
-            addRow(NetworkItem::escapeHTML(tr("Away message"), true), NetworkItem::escapeHTML(awayMessage), true);
+            addRow(NetworkItem::escapeHTML(tr("Away message"), true), awayMessageHTML, true);
         }
         addRow(tr("Realname"),
                NetworkItem::escapeHTML(_ircUser->realName()),
@@ -629,7 +630,7 @@ QString QueryBufferItem::toolTip(int column) const
 
     // If no further information found, offer an explanatory message
     if (!infoAdded)
-        tooltip << "<p class='italic'>" << tr("No information available") << "</p>";
+        tooltip << "<p class='italic' align='center'>" << tr("No information available") << "</p>";
 
     tooltip << "</qt>";
     return strTooltip;
@@ -659,8 +660,22 @@ void QueryBufferItem::setIrcUser(IrcUser *ircUser)
 
 void QueryBufferItem::removeIrcUser()
 {
-    _ircUser = 0;
-    emit dataChanged();
+    if (_ircUser) {
+        // Disconnect the active IrcUser before removing it, otherwise it will fire removeIrcUser()
+        // a second time when the object's destroyed due to QueryBufferItem::setIrcUser() connecting
+        // SIGNAL destroyed(QObject*) to SLOT removeIrcUser().
+        // This fixes removing an active IrcUser if the user had quit then rejoined in a nonstandard
+        // manner (e.g. updateNickFromHost calling newIrcUser, triggered by an away-notify message).
+        disconnect(_ircUser, 0, this, 0);
+
+        // Clear IrcUser (only set to 0 if not already 0)
+        _ircUser = 0;
+
+        // Only emit dataChanged() if data actually changed.  This might serve as a small
+        // optimization, but it can be moved outside the if statement if other behavior depends on
+        // it always being called.
+        emit dataChanged();
+    }
 }
 
 
@@ -671,6 +686,7 @@ ChannelBufferItem::ChannelBufferItem(const BufferInfo &bufferInfo, AbstractTreeI
     : BufferItem(bufferInfo, parent),
     _ircChannel(0)
 {
+    setFlags(flags() | Qt::ItemIsDropEnabled);
 }
 
 
@@ -690,8 +706,7 @@ QString ChannelBufferItem::toolTip(int column) const
     Q_UNUSED(column);
     QString strTooltip;
     QTextStream tooltip( &strTooltip, QIODevice::WriteOnly );
-    tooltip << "<qt><style>.bold { font-weight: bold; }</style>"
-            << "<qt><style>.italic { font-style: italic; }</style>";
+    tooltip << "<qt><style>.bold { font-weight: bold; } .italic { font-style: italic; }</style>";
 
     // Function to add a row to the tooltip table
     auto addRow = [&](const QString& key, const QString& value, bool condition) {
@@ -726,7 +741,7 @@ QString ChannelBufferItem::toolTip(int column) const
 
         tooltip << "</table>";
     } else {
-        tooltip << "<p class='italic'>" << tr("Not active, double-click to join") << "</p>";
+        tooltip << "<p class='italic' align='center'>" << tr("Not active, double-click to join") << "</p>";
     }
 
     tooltip << "</qt>";
@@ -1076,8 +1091,7 @@ QString IrcUserItem::toolTip(int column) const
     Q_UNUSED(column);
     QString strTooltip;
     QTextStream tooltip( &strTooltip, QIODevice::WriteOnly );
-    tooltip << "<qt><style>.bold { font-weight: bold; }</style>"
-            << "<style>.italic { font-style: italic; }</style>";
+    tooltip << "<qt><style>.bold { font-weight: bold; } .italic { font-style: italic; }</style>";
 
     // Keep track of whether or not information has been added
     bool infoAdded = false;
@@ -1103,11 +1117,13 @@ QString IrcUserItem::toolTip(int column) const
            NetworkItem::escapeHTML(channelModes()),
            !channelModes().isEmpty());
     if (_ircUser->isAway()) {
-        QString awayMessage(tr("(unknown)"));
-        if(!_ircUser->awayMessage().isEmpty()) {
-            awayMessage = _ircUser->awayMessage();
+        QString awayMessageHTML = QString("<p class='italic'>%1</p>").arg(tr("Unknown"));
+
+        // If away message is known, replace with the escaped message.
+        if (!_ircUser->awayMessage().isEmpty()) {
+            awayMessageHTML = NetworkItem::escapeHTML(_ircUser->awayMessage());
         }
-        addRow(NetworkItem::escapeHTML(tr("Away message"), true), NetworkItem::escapeHTML(awayMessage), true);
+        addRow(NetworkItem::escapeHTML(tr("Away message"), true), awayMessageHTML, true);
     }
     addRow(tr("Realname"),
            NetworkItem::escapeHTML(_ircUser->realName()),
@@ -1180,7 +1196,7 @@ QString IrcUserItem::toolTip(int column) const
 
     // If no further information found, offer an explanatory message
     if (!infoAdded)
-        tooltip << "<p class='italic'>" << tr("No information available") << "</p>";
+        tooltip << "<p class='italic' align='center'>" << tr("No information available") << "</p>";
 
     tooltip << "</qt>";
     return strTooltip;