common: Make SyncableObject non-copyable
[quassel.git] / src / qtui / settingspages / aliasesmodel.cpp
index 39f2877..780b152 100644 (file)
@@ -1,5 +1,5 @@
 /***************************************************************************
- *   Copyright (C) 2005-2018 by the Quassel Project                        *
+ *   Copyright (C) 2005-2020 by the Quassel Project                        *
  *   devel@quassel-irc.org                                                 *
  *                                                                         *
  *   This program is free software; you can redistribute it and/or modify  *
 #include "client.h"
 #include "signalproxy.h"
 
-AliasesModel::AliasesModel(QObject *parent)
+AliasesModel::AliasesModel(QObjectparent)
     : QAbstractItemModel(parent)
 {
     // we need this signal for future connects to reset the data;
-    connect(Client::instance(), SIGNAL(connected()), this, SLOT(clientConnected()));
-    connect(Client::instance(), SIGNAL(disconnected()), this, SLOT(clientDisconnected()));
+    connect(Client::instance(), &Client::connected, this, &AliasesModel::clientConnected);
+    connect(Client::instance(), &Client::disconnected, this, &AliasesModel::clientDisconnected);
 
     if (Client::isConnected())
         clientConnected();
@@ -39,8 +39,7 @@ AliasesModel::AliasesModel(QObject *parent)
         emit modelReady(false);
 }
 
-
-QVariant AliasesModel::data(const QModelIndex &index, int role) const
+QVariant AliasesModel::data(const QModelIndex& index, int role) const
 {
     if (!_modelReady)
         return QVariant();
@@ -55,32 +54,27 @@ QVariant AliasesModel::data(const QModelIndex &index, int role) const
             return tr("<b>The shortcut for the alias</b><br />"
                       "It can be used as a regular slash command.<br /><br />"
                       "<b>Example:</b> \"foo\" can be used per /foo");
-        case 1:
-        {
+        case 1: {
             // To avoid overwhelming the user, organize things into a table
             QString strTooltip;
-            QTextStream tooltip( &strTooltip, QIODevice::WriteOnly );
+            QTextStream tooltip(&strTooltip, QIODevice::WriteOnly);
             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 = QString(), bool condition = true) {
+            auto addRow = [&](const QString& key, const QString& value = QString(), bool condition = true) {
                 if (condition) {
                     if (value.isEmpty()) {
-                        tooltip << "<tr><td class='italic' align='left' colspan='2'>"
-                                      << key << "</td></tr>";
-                    } else {
-                        tooltip << "<tr><td class='bold' align='left'>"
-                                      << key << "</td><td>" << value << "</td></tr>";
+                        tooltip << "<tr><td class='italic' align='left' colspan='2'>" << key << "</td></tr>";
+                    }
+                    else {
+                        tooltip << "<tr><td class='bold' align='left'>" << key << "</td><td>" << value << "</td></tr>";
                     }
                 }
             };
 
-            tooltip << "<p class='bold'>"
-                    << tr("The string the shortcut will be expanded to") << "</p>";
+            tooltip << "<p class='bold'>" << tr("The string the shortcut will be expanded to") << "</p>";
 
-            tooltip << "<p class='bold' align='center'>"
-                    << tr("Special variables") << "</p>";
+            tooltip << "<p class='bold' align='center'>" << tr("Special variables") << "</p>";
 
             // Variable option table
             tooltip << "<table cellspacing='5' cellpadding='0'>";
@@ -96,10 +90,8 @@ QVariant AliasesModel::data(const QModelIndex &index, int role) const
             addRow("$i:account",
                    tr("account of user identified by i'th parameter, or a '*' if logged out or "
                       "unknown"));
-            addRow("$i:hostname",
-                   tr("hostname of user identified by i'th parameter, or a '*' if unknown"));
-            addRow("$i:ident",
-                   tr("ident of user identified by i'th parameter, or a '*' if unknown"));
+            addRow("$i:hostname", tr("hostname of user identified by i'th parameter, or a '*' if unknown"));
+            addRow("$i:ident", tr("ident of user identified by i'th parameter, or a '*' if unknown"));
             addRow("$i:identd",
                    tr("ident of user identified by i'th parameter if verified, or a '*' if unknown "
                       "or unverified (prefixed with '~')"));
@@ -114,12 +106,10 @@ QVariant AliasesModel::data(const QModelIndex &index, int role) const
             tooltip << "</table>";
 
             // Example header
-            tooltip << "<p>"
-                    << tr("Multiple commands can be separated with semicolons") << "</p>";
+            tooltip << "<p>" << tr("Multiple commands can be separated with semicolons") << "</p>";
             // Example
             tooltip << "<p>";
-            tooltip << QString("<p><span class='bold'>%1</span> %2<br />").arg(
-                           tr("Example:"), tr("\"Test $1; Test $2; Test All $0\""));
+            tooltip << QString("<p><span class='bold'>%1</span> %2<br />").arg(tr("Example:"), tr("\"Test $1; Test $2; Test All $0\""));
             tooltip << tr("...will be expanded to three separate messages \"Test 1\", \"Test 2\" "
                           "and \"Test All 1 2 3\" when called like <i>/test 1 2 3</i>")
                     << "</p>";
@@ -146,8 +136,7 @@ QVariant AliasesModel::data(const QModelIndex &index, int role) const
     }
 }
 
-
-bool AliasesModel::setData(const QModelIndex &index, const QVariant &value, int role)
+bool AliasesModel::setData(const QModelIndex& index, const QVariant& value, int role)
 {
     if (!_modelReady)
         return false;
@@ -176,12 +165,11 @@ bool AliasesModel::setData(const QModelIndex &index, const QVariant &value, int
     }
 }
 
-
 void AliasesModel::newAlias()
 {
     QString newName("alias");
     int i = 0;
-    AliasManager &manager = cloneAliasManager();
+    AliasManagermanager = cloneAliasManager();
     while (manager.contains(newName)) {
         i++;
         newName = QString("alias%1").arg(i);
@@ -191,13 +179,12 @@ void AliasesModel::newAlias()
     endInsertRows();
 }
 
-
 void AliasesModel::loadDefaults()
 {
     if (!_modelReady)
         return;
 
-    AliasManager &manager = cloneAliasManager();
+    AliasManagermanager = cloneAliasManager();
 
     if (!manager.isEmpty()) {
         beginRemoveRows(QModelIndex(), 0, rowCount() - 1);
@@ -208,26 +195,24 @@ void AliasesModel::loadDefaults()
 
     AliasManager::AliasList defaults = AliasManager::defaults();
     beginInsertRows(QModelIndex(), 0, defaults.count() - 1);
-    foreach(AliasManager::Alias alias, defaults) {
+    foreach (AliasManager::Alias alias, defaults) {
         manager.addAlias(alias.name, alias.expansion);
     }
     endInsertRows();
 }
 
-
 void AliasesModel::removeAlias(int index)
 {
     if (index < 0 || index >= rowCount())
         return;
 
-    AliasManager &manager = cloneAliasManager();
+    AliasManagermanager = cloneAliasManager();
     beginRemoveRows(QModelIndex(), index, index);
     manager.removeAt(index);
     endRemoveRows();
 }
 
-
-Qt::ItemFlags AliasesModel::flags(const QModelIndex &index) const
+Qt::ItemFlags AliasesModel::flags(const QModelIndex& index) const
 {
     if (!index.isValid()) {
         return Qt::ItemIsDropEnabled;
@@ -237,12 +222,10 @@ Qt::ItemFlags AliasesModel::flags(const QModelIndex &index) const
     }
 }
 
-
 QVariant AliasesModel::headerData(int section, Qt::Orientation orientation, int role) const
 {
     QStringList header;
-    header << tr("Alias")
-           << tr("Expansion");
+    header << tr("Alias") << tr("Expansion");
 
     if (orientation == Qt::Horizontal && role == Qt::DisplayRole)
         return header[section];
@@ -250,68 +233,55 @@ QVariant AliasesModel::headerData(int section, Qt::Orientation orientation, int
     return QVariant();
 }
 
-
-QModelIndex AliasesModel::index(int row, int column, const QModelIndex &parent) const
+QModelIndex AliasesModel::index(int row, int column, const QModelIndex& parent) const
 {
     Q_UNUSED(parent);
     if (row >= rowCount() || column >= columnCount())
-        return QModelIndex();
+        return {};
 
     return createIndex(row, column);
 }
 
-
-const AliasManager &AliasesModel::aliasManager() const
+const AliasManager& AliasesModel::aliasManager() const
 {
-    if (_configChanged)
-        return _clonedAliasManager;
-    else
-        return *Client::aliasManager();
+    return _clonedAliasManager ? *_clonedAliasManager : *Client::aliasManager();
 }
 
-
-AliasManager &AliasesModel::aliasManager()
+AliasManager& AliasesModel::aliasManager()
 {
-    if (_configChanged)
-        return _clonedAliasManager;
-    else
-        return *Client::aliasManager();
+    return _clonedAliasManager ? *_clonedAliasManager : *Client::aliasManager();
 }
 
-
-AliasManager &AliasesModel::cloneAliasManager()
+AliasManager& AliasesModel::cloneAliasManager()
 {
-    if (!_configChanged) {
-        _clonedAliasManager = *Client::aliasManager();
-        _configChanged = true;
+    if (!_clonedAliasManager) {
+        _clonedAliasManager = std::make_unique<ClientAliasManager>();
+        _clonedAliasManager->fromVariantMap(Client::aliasManager()->toVariantMap());
         emit configChanged(true);
     }
-    return _clonedAliasManager;
+    return *_clonedAliasManager;
 }
 
-
 void AliasesModel::revert()
 {
-    if (!_configChanged)
+    if (!_clonedAliasManager)
         return;
 
-    _configChanged = false;
-    emit configChanged(false);
     beginResetModel();
+    _clonedAliasManager.reset();
     endResetModel();
+    emit configChanged(false);
 }
 
-
 void AliasesModel::commit()
 {
-    if (!_configChanged)
+    if (!_clonedAliasManager)
         return;
 
-    Client::aliasManager()->requestUpdate(_clonedAliasManager.toVariantMap());
+    Client::aliasManager()->requestUpdate(_clonedAliasManager->toVariantMap());
     revert();
 }
 
-
 void AliasesModel::initDone()
 {
     _modelReady = true;
@@ -320,23 +290,20 @@ void AliasesModel::initDone()
     emit modelReady(true);
 }
 
-
 void AliasesModel::clientConnected()
 {
-    connect(Client::aliasManager(), SIGNAL(updated()), SLOT(revert()));
+    connect(Client::aliasManager(), &AliasManager::updated, this, &AliasesModel::revert);
     if (Client::aliasManager()->isInitialized())
         initDone();
     else
-        connect(Client::aliasManager(), SIGNAL(initDone()), SLOT(initDone()));
+        connect(Client::aliasManager(), &SyncableObject::initDone, this, &AliasesModel::initDone);
 }
 
-
 void AliasesModel::clientDisconnected()
 {
-    // clear
-    _clonedAliasManager = ClientAliasManager();
     _modelReady = false;
     beginResetModel();
+    _clonedAliasManager.reset();
     endResetModel();
     emit modelReady(false);
 }