void CoreHighlightSettingsPage::ignoredTableChanged(QTableWidgetItem *item)
{
    if (item->row() + 1 > ignoredList.size())
        return;

    auto ignoredRule = ignoredList.value(item->row());


    switch (item->column()) {
        case CoreHighlightSettingsPage::EnableColumn:
            ignoredRule.isEnabled = (item->checkState() == Qt::Checked);
            break;
        case CoreHighlightSettingsPage::NameColumn:
            ignoredRule.name = item->text();
            break;
        case CoreHighlightSettingsPage::RegExColumn:
            ignoredRule.isRegEx = (item->checkState() == Qt::Checked);
            break;
        case CoreHighlightSettingsPage::CsColumn:
            ignoredRule.isCaseSensitive = (item->checkState() == Qt::Checked);
            break;
        case CoreHighlightSettingsPage::SenderColumn:
            if (!item->text().isEmpty() && item->text().trimmed().isEmpty())
                item->setText("");
            ignoredRule.sender = item->text();
            break;
        case CoreHighlightSettingsPage::ChanColumn:
            if (!item->text().isEmpty() && item->text().trimmed().isEmpty())
                item->setText("");
            ignoredRule.chanName = item->text();
            break;
    }
    ignoredList[item->row()] = ignoredRule;
    emit widgetHasChanged();
}
void HighlightSettingsPage::defaults()
{
    ui.highlightNoNick->setChecked(true);
    ui.nicksCaseSensitive->setChecked(false);
    emptyTable();

    widgetHasChanged();
}
void CoreAccountSettingsPage::on_addAccountButton_clicked() {
  CoreAccountEditDlg dlg(CoreAccount(), this);
  if(dlg.exec() == QDialog::Accepted) {
    AccountId id =model()->createOrUpdateAccount(dlg.account());
    ui.accountView->setCurrentIndex(filteredModel()->mapFromSource(model()->accountIndex(id)));
    widgetHasChanged();
  }
}
HighlightSettingsPage::HighlightSettingsPage(QWidget *parent)
    : SettingsPage(tr("Interface"), tr("Highlight"), parent)
{
    ui.setupUi(this);
    ui.highlightTable->verticalHeader()->hide();
    ui.highlightTable->setShowGrid(false);

    ui.highlightTable->horizontalHeaderItem(HighlightSettingsPage::RegExColumn)->setToolTip("<b>RegEx</b>: This option determines if the highlight rule should be interpreted as a <b>regular expression</b> or just as a keyword.");
    ui.highlightTable->horizontalHeaderItem(HighlightSettingsPage::RegExColumn)->setWhatsThis("<b>RegEx</b>: This option determines if the highlight rule should be interpreted as a <b>regular expression</b> or just as a keyword.");

    ui.highlightTable->horizontalHeaderItem(HighlightSettingsPage::CsColumn)->setToolTip("<b>CS</b>: This option determines if the highlight rule should be interpreted <b>case sensitive</b>.");
    ui.highlightTable->horizontalHeaderItem(HighlightSettingsPage::CsColumn)->setWhatsThis("<b>CS</b>: This option determines if the highlight rule should be interpreted <b>case sensitive</b>.");

    ui.highlightTable->horizontalHeaderItem(HighlightSettingsPage::ChanColumn)->setToolTip("<b>Channel</b>: This regular expression determines for which <b>channels</b> the highlight rule works. Leave blank to match any channel. Put <b>!</b> in the beginning to negate. Case insensitive.");
    ui.highlightTable->horizontalHeaderItem(HighlightSettingsPage::ChanColumn)->setWhatsThis("<b>Channel</b>: This regular expression determines for which <b>channels</b> the highlight rule works. Leave blank to match any channel. Put <b>!</b> in the beginning to negate. Case insensitive.");

#if QT_VERSION < 0x050000
    ui.highlightTable->horizontalHeader()->setResizeMode(HighlightSettingsPage::NameColumn, QHeaderView::Stretch);
    ui.highlightTable->horizontalHeader()->setResizeMode(HighlightSettingsPage::RegExColumn, QHeaderView::ResizeToContents);
    ui.highlightTable->horizontalHeader()->setResizeMode(HighlightSettingsPage::CsColumn, QHeaderView::ResizeToContents);
    ui.highlightTable->horizontalHeader()->setResizeMode(HighlightSettingsPage::EnableColumn, QHeaderView::ResizeToContents);
    ui.highlightTable->horizontalHeader()->setResizeMode(HighlightSettingsPage::ChanColumn, QHeaderView::ResizeToContents);
#else
    ui.highlightTable->horizontalHeader()->setSectionResizeMode(HighlightSettingsPage::NameColumn, QHeaderView::Stretch);
    ui.highlightTable->horizontalHeader()->setSectionResizeMode(HighlightSettingsPage::RegExColumn, QHeaderView::ResizeToContents);
    ui.highlightTable->horizontalHeader()->setSectionResizeMode(HighlightSettingsPage::CsColumn, QHeaderView::ResizeToContents);
    ui.highlightTable->horizontalHeader()->setSectionResizeMode(HighlightSettingsPage::EnableColumn, QHeaderView::ResizeToContents);
    ui.highlightTable->horizontalHeader()->setSectionResizeMode(HighlightSettingsPage::ChanColumn, QHeaderView::ResizeToContents);
#endif

    connect(ui.add, SIGNAL(clicked(bool)), this, SLOT(addNewRow()));
    connect(ui.remove, SIGNAL(clicked(bool)), this, SLOT(removeSelectedRows()));
    //TODO: search for a better signal (one that emits everytime a selection has been changed for one item)
    connect(ui.highlightTable, SIGNAL(itemClicked(QTableWidgetItem *)), this, SLOT(selectRow(QTableWidgetItem *)));

    connect(ui.highlightAllNicks, SIGNAL(clicked(bool)), this, SLOT(widgetHasChanged()));
    connect(ui.highlightCurrentNick, SIGNAL(clicked(bool)), this, SLOT(widgetHasChanged()));
    connect(ui.highlightNoNick, SIGNAL(clicked(bool)), this, SLOT(widgetHasChanged()));
    connect(ui.nicksCaseSensitive, SIGNAL(clicked(bool)), this, SLOT(widgetHasChanged()));
    connect(ui.add, SIGNAL(clicked()), this, SLOT(widgetHasChanged()));
    connect(ui.remove, SIGNAL(clicked()), this, SLOT(widgetHasChanged()));
    connect(ui.highlightTable, SIGNAL(itemChanged(QTableWidgetItem *)), this, SLOT(tableChanged(QTableWidgetItem *)));
}
void IdentityEditWidget::on_deleteNick_clicked()
{
    // no confirmation, since a nickname is really nothing hard to recreate
    if (ui.nicknameList->selectedItems().count()) {
        delete ui.nicknameList->takeItem(ui.nicknameList->row(ui.nicknameList->selectedItems()[0]));
        ui.nicknameList->setCurrentRow(qMin(ui.nicknameList->currentRow()+1, ui.nicknameList->count()-1));
        setWidgetStates();
        emit widgetHasChanged();
    }
}
void CoreAccountSettingsPage::on_deleteAccountButton_clicked() {
  if(!ui.accountView->selectionModel()->selectedIndexes().count())
    return;

  AccountId id = ui.accountView->selectionModel()->selectedIndexes().at(0).data(CoreAccountModel::AccountIdRole).value<AccountId>();
  if(id.isValid()) {
    model()->removeAccount(id);
    widgetHasChanged();
  }
}
void IdentityEditWidget::on_nickDown_clicked()
{
    if (!ui.nicknameList->selectedItems().count()) return;
    int row = ui.nicknameList->row(ui.nicknameList->selectedItems()[0]);
    if (row < ui.nicknameList->count()-1) {
        ui.nicknameList->insertItem(row+1, ui.nicknameList->takeItem(row));
        ui.nicknameList->setCurrentRow(row+1);
        setWidgetStates();
        emit widgetHasChanged();
    }
}
void CoreHighlightSettingsPage::defaults()
{
    int highlightNickType = HighlightRuleManager::HighlightNickType::CurrentNick;
    int defaultIndex = ui.highlightNicksComboBox->findData(QVariant(highlightNickType));
    ui.highlightNicksComboBox->setCurrentIndex(defaultIndex);
    ui.nicksCaseSensitive->setChecked(false);
    emptyHighlightTable();
    emptyIgnoredTable();

    widgetHasChanged();
}
void CoreAccountSettingsPage::editAccount(const QModelIndex &index) {
  if(!index.isValid())
    return;

  CoreAccountEditDlg dlg(model()->account(filteredModel()->mapToSource(index)), this);
  if(dlg.exec() == QDialog::Accepted) {
    AccountId id = model()->createOrUpdateAccount(dlg.account());
    ui.accountView->setCurrentIndex(filteredModel()->mapFromSource(model()->accountIndex(id)));
    widgetHasChanged();
  }
}
void IdentityEditWidget::on_addNick_clicked()
{
    QStringList existing;
    for (int i = 0; i < ui.nicknameList->count(); i++) existing << ui.nicknameList->item(i)->text();
    NickEditDlg dlg(QString(), existing, this);
    if (dlg.exec() == QDialog::Accepted) {
        ui.nicknameList->addItem(dlg.nick());
        ui.nicknameList->setCurrentRow(ui.nicknameList->count()-1);
        setWidgetStates();
        emit widgetHasChanged();
    }
}
void IdentityEditWidget::on_clearOrLoadCertButton_clicked()
{
    QSslCertificate cert;

    if (ui.certOrgLabel->property("sslCert").toByteArray().isEmpty())
        cert = certByFilename(QFileDialog::getOpenFileName(this, tr("Load a Certificate"),
#if QT_VERSION < 0x050000
                                                           QDesktopServices::storageLocation(QDesktopServices::HomeLocation)));
#else
                                                           QStandardPaths::writableLocation(QStandardPaths::HomeLocation)));
#endif
    showCertState(cert);
    emit widgetHasChanged();
}
void IdentityEditWidget::on_clearOrLoadKeyButton_clicked()
{
    QSslKey key;

    if (ui.keyTypeLabel->property("sslKey").toByteArray().isEmpty())
        key = keyByFilename(QFileDialog::getOpenFileName(this, tr("Load a Key"),
#if QT_VERSION < 0x050000
                                                         QDesktopServices::storageLocation(QDesktopServices::HomeLocation)));
#else
                                                         QStandardPaths::writableLocation(QStandardPaths::HomeLocation)));
#endif

    showKeyState(key);
    emit widgetHasChanged();
}
AppearanceSettingsPage::AppearanceSettingsPage(QWidget *parent)
    : SettingsPage(tr("Interface"), QString(), parent)
{
    ui.setupUi(this);

#ifdef QT_NO_SYSTEMTRAYICON
    ui.useSystemTrayIcon->hide();
#endif

    initAutoWidgets();
    initStyleComboBox();
    initLanguageComboBox();
    initIconThemeComboBox();

    foreach(QComboBox *comboBox, findChildren<QComboBox *>()) {
        connect(comboBox, SIGNAL(currentIndexChanged(QString)), this, SLOT(widgetHasChanged()));
    }
void IdentityEditWidget::sslDropEvent(QDropEvent *event, bool isCert)
{
    QByteArray rawUris;
    if (event->mimeData()->hasFormat("text/uri-list"))
        rawUris = event->mimeData()->data("text/uri-list");
    else
        rawUris = event->mimeData()->data("text/uri");

    QTextStream uriStream(rawUris);
    QString filename = QUrl(uriStream.readLine()).toLocalFile();

    if (isCert) {
        QSslCertificate cert = certByFilename(filename);
        if (!cert.isNull())
            showCertState(cert);
    }
    else {
        QSslKey key = keyByFilename(filename);
        if (!key.isNull())
            showKeyState(key);
    }
    event->accept();
    emit widgetHasChanged();
}
 foreach(QCheckBox *checkBox, findChildren<QCheckBox *>()) {
     connect(checkBox, SIGNAL(clicked()), this, SLOT(widgetHasChanged()));
 }
HighlightSettingsPage::HighlightSettingsPage(QWidget *parent)
    : SettingsPage(tr("Interface"),
                   // In Monolithic mode, local highlights are replaced by remote highlights
                   Quassel::runMode() == Quassel::Monolithic ?
                       tr("Legacy Highlights") : tr("Local Highlights"),
                   parent)
{
    ui.setupUi(this);
    ui.highlightTable->verticalHeader()->hide();
    ui.highlightTable->setShowGrid(false);


    ui.highlightTable->horizontalHeaderItem(HighlightSettingsPage::EnableColumn)->setToolTip(
                tr("Enable/disable this rule"));
    ui.highlightTable->horizontalHeaderItem(HighlightSettingsPage::EnableColumn)->setWhatsThis(
                ui.highlightTable->horizontalHeaderItem(HighlightSettingsPage::EnableColumn)->toolTip());

    ui.highlightTable->horizontalHeaderItem(HighlightSettingsPage::NameColumn)->setToolTip(
                tr("Phrase to match"));
    ui.highlightTable->horizontalHeaderItem(HighlightSettingsPage::NameColumn)->setWhatsThis(
                ui.highlightTable->horizontalHeaderItem(HighlightSettingsPage::NameColumn)->toolTip());

    ui.highlightTable->horizontalHeaderItem(HighlightSettingsPage::RegExColumn)->setToolTip(
                tr("<b>RegEx</b>: This option determines if the highlight rule and <i>Channel</i> "
                   "should be interpreted as <b>regular expressions</b> or just as keywords."));
    ui.highlightTable->horizontalHeaderItem(HighlightSettingsPage::RegExColumn)->setWhatsThis(
                ui.highlightTable->horizontalHeaderItem(HighlightSettingsPage::RegExColumn)->toolTip());

    ui.highlightTable->horizontalHeaderItem(HighlightSettingsPage::CsColumn)->setToolTip(
                tr("<b>CS</b>: This option determines if the highlight rule and <i>Channel</i> "
                   "should be interpreted <b>case sensitive</b>."));
    ui.highlightTable->horizontalHeaderItem(HighlightSettingsPage::CsColumn)->setWhatsThis(
                ui.highlightTable->horizontalHeaderItem(HighlightSettingsPage::CsColumn)->toolTip());

    ui.highlightTable->horizontalHeaderItem(HighlightSettingsPage::ChanColumn)->setToolTip(
                tr("<p><b>Channel</b>: Semicolon separated list of channel names, leave blank to "
                   "match any name.</p>"
                   "<p><i>Example:</i><br />"
                   "<i>#quassel*; #foobar; !#quasseldroid</i><br />"
                   "would match on <i>#foobar</i> and any channel starting with <i>#quassel</i> "
                   "except for <i>#quasseldroid</i><br />"
                   "<p>If only inverted names are specified, it will match anything except for "
                   "what's specified (implicit wildcard).</p>"
                   "<p><i>Example:</i><br />"
                   "<i>!#quassel*; !#foobar</i><br />"
                   "would match anything except for <i>#foobar</i> or any channel starting with "
                   "<i>#quassel</i></p>"));
    ui.highlightTable->horizontalHeaderItem(HighlightSettingsPage::ChanColumn)->setWhatsThis(
                ui.highlightTable->horizontalHeaderItem(HighlightSettingsPage::ChanColumn)->toolTip());

#if QT_VERSION < 0x050000
    ui.highlightTable->horizontalHeader()->setResizeMode(HighlightSettingsPage::NameColumn, QHeaderView::Stretch);
    ui.highlightTable->horizontalHeader()->setResizeMode(HighlightSettingsPage::RegExColumn, QHeaderView::ResizeToContents);
    ui.highlightTable->horizontalHeader()->setResizeMode(HighlightSettingsPage::CsColumn, QHeaderView::ResizeToContents);
    ui.highlightTable->horizontalHeader()->setResizeMode(HighlightSettingsPage::EnableColumn, QHeaderView::ResizeToContents);
    ui.highlightTable->horizontalHeader()->setResizeMode(HighlightSettingsPage::ChanColumn, QHeaderView::ResizeToContents);
#else
    ui.highlightTable->horizontalHeader()->setSectionResizeMode(HighlightSettingsPage::NameColumn, QHeaderView::Stretch);
    ui.highlightTable->horizontalHeader()->setSectionResizeMode(HighlightSettingsPage::RegExColumn, QHeaderView::ResizeToContents);
    ui.highlightTable->horizontalHeader()->setSectionResizeMode(HighlightSettingsPage::CsColumn, QHeaderView::ResizeToContents);
    ui.highlightTable->horizontalHeader()->setSectionResizeMode(HighlightSettingsPage::EnableColumn, QHeaderView::ResizeToContents);
    ui.highlightTable->horizontalHeader()->setSectionResizeMode(HighlightSettingsPage::ChanColumn, QHeaderView::ResizeToContents);
#endif

    // Information icon
    ui.localHighlightsIcon->setPixmap(icon::get("dialog-information").pixmap(16));

    // Set up client/monolithic local highlights information
    if (Quassel::runMode() == Quassel::Monolithic) {
        // We're running in Monolithic mode, core/client version in total sync.  Discourage the use
        // of local (legacy) highlights as it's identical to setting remote highlights.
        ui.localHighlightsLabel->setText(
                    tr("Legacy Highlights are replaced by Highlights"));
    } else {
        // We're running in client/split mode, allow for splitting the details.
        ui.localHighlightsLabel->setText(tr("Local Highlights apply to this device only"));
    }

    connect(ui.add, SIGNAL(clicked(bool)), this, SLOT(addNewRow()));
    connect(ui.remove, SIGNAL(clicked(bool)), this, SLOT(removeSelectedRows()));
    //TODO: search for a better signal (one that emits everytime a selection has been changed for one item)
    connect(ui.highlightTable, SIGNAL(itemClicked(QTableWidgetItem *)), this, SLOT(selectRow(QTableWidgetItem *)));

    connect(ui.highlightAllNicks, SIGNAL(clicked(bool)), this, SLOT(widgetHasChanged()));
    connect(ui.highlightCurrentNick, SIGNAL(clicked(bool)), this, SLOT(widgetHasChanged()));
    connect(ui.highlightNoNick, SIGNAL(clicked(bool)), this, SLOT(widgetHasChanged()));
    connect(ui.nicksCaseSensitive, SIGNAL(clicked(bool)), this, SLOT(widgetHasChanged()));
    connect(ui.add, SIGNAL(clicked()), this, SLOT(widgetHasChanged()));
    connect(ui.remove, SIGNAL(clicked()), this, SLOT(widgetHasChanged()));
    connect(ui.highlightTable, SIGNAL(itemChanged(QTableWidgetItem *)), this, SLOT(tableChanged(QTableWidgetItem *)));
}
CoreHighlightSettingsPage::CoreHighlightSettingsPage(QWidget *parent)
    : SettingsPage(tr("Interface"),
                   // In Monolithic mode, local highlights are replaced by remote highlights
                   Quassel::runMode() == Quassel::Monolithic ?
                       tr("Highlights") : tr("Remote Highlights"),
                   parent)
{
    ui.setupUi(this);

    setupRuleTable(ui.highlightTable);
    setupRuleTable(ui.ignoredTable);

    ui.highlightNicksComboBox->addItem(tr("All Nicks from Identity"), QVariant(HighlightRuleManager::AllNicks));
    ui.highlightNicksComboBox->addItem(tr("Current Nick"), QVariant(HighlightRuleManager::CurrentNick));
    ui.highlightNicksComboBox->addItem(tr("None"), QVariant(HighlightRuleManager::NoNick));

    coreConnectionStateChanged(Client::isConnected()); // need a core connection!
    connect(Client::instance(), SIGNAL(coreConnectionStateChanged(bool)), this, SLOT(coreConnectionStateChanged(bool)));

    connect(ui.highlightAdd, SIGNAL(clicked(bool)), this, SLOT(addNewHighlightRow()));
    connect(ui.highlightRemove, SIGNAL(clicked(bool)), this, SLOT(removeSelectedHighlightRows()));
    connect(ui.highlightImport, SIGNAL(clicked(bool)), this, SLOT(importRules()));

    connect(ui.ignoredAdd, SIGNAL(clicked(bool)), this, SLOT(addNewIgnoredRow()));
    connect(ui.ignoredRemove, SIGNAL(clicked(bool)), this, SLOT(removeSelectedIgnoredRows()));

    // TODO: search for a better signal (one that emits everytime a selection has been changed for one item)
    connect(ui.highlightTable,
            SIGNAL(itemClicked(QTableWidgetItem * )),
            this,
            SLOT(selectHighlightRow(QTableWidgetItem * )));
    connect(ui.ignoredTable,
            SIGNAL(itemClicked(QTableWidgetItem * )),
            this,
            SLOT(selectIgnoredRow(QTableWidgetItem * )));

    // Update the "Case sensitive" checkbox
    connect(ui.highlightNicksComboBox,
            SIGNAL(currentIndexChanged(int)),
            this,
            SLOT(highlightNicksChanged(int)));

    connect(ui.highlightNicksComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(widgetHasChanged()));
    connect(ui.nicksCaseSensitive, SIGNAL(clicked(bool)), this, SLOT(widgetHasChanged()));

    connect(ui.highlightAdd, SIGNAL(clicked()), this, SLOT(widgetHasChanged()));
    connect(ui.highlightRemove, SIGNAL(clicked()), this, SLOT(widgetHasChanged()));

    connect(ui.ignoredAdd, SIGNAL(clicked()), this, SLOT(widgetHasChanged()));
    connect(ui.ignoredRemove, SIGNAL(clicked()), this, SLOT(widgetHasChanged()));

    connect(ui.highlightTable,
            SIGNAL(itemChanged(QTableWidgetItem * )),
            this,
            SLOT(highlightTableChanged(QTableWidgetItem * )));

    connect(ui.ignoredTable,
            SIGNAL(itemChanged(QTableWidgetItem * )),
            this,
            SLOT(ignoredTableChanged(QTableWidgetItem * )));

    connect(Client::instance(), SIGNAL(connected()), this, SLOT(clientConnected()));

    // Warning icon
    ui.coreUnsupportedIcon->setPixmap(icon::get("dialog-warning").pixmap(16));

    // Set up client/monolithic remote highlights information
    if (Quassel::runMode() == Quassel::Monolithic) {
        // We're running in Monolithic mode, local highlights are considered legacy
        ui.highlightImport->setText(tr("Import Legacy"));
        ui.highlightImport->setToolTip(tr("Import highlight rules configured in <i>%1</i>.")
                                       .arg(tr("Legacy Highlights").replace(" ", "&nbsp;")));
        // Re-use translations of "Legacy Highlights" as this is a word-for-word reference, forcing
        // all spaces to be non-breaking
    } else {
        // We're running in client/split mode, local highlights are distinguished from remote
        ui.highlightImport->setText(tr("Import Local"));
        ui.highlightImport->setToolTip(tr("Import highlight rules configured in <i>%1</i>.")
                                       .arg(tr("Local Highlights").replace(" ", "&nbsp;")));
        // Re-use translations of "Local Highlights" as this is a word-for-word reference, forcing
        // all spaces to be non-breaking
    }
}
  }
  ui.sendEncoding->model()->sort(0);
  ui.recvEncoding->model()->sort(0);
  ui.serverEncoding->model()->sort(0);
  currentId = 0;
  setEnabled(Client::isConnected());  // need a core connection!
  setWidgetStates();
  connect(Client::instance(), SIGNAL(coreConnectionStateChanged(bool)), this, SLOT(coreConnectionStateChanged(bool)));
  connect(Client::instance(), SIGNAL(networkCreated(NetworkId)), this, SLOT(clientNetworkAdded(NetworkId)));
  connect(Client::instance(), SIGNAL(networkRemoved(NetworkId)), this, SLOT(clientNetworkRemoved(NetworkId)));
  connect(Client::instance(), SIGNAL(identityCreated(IdentityId)), this, SLOT(clientIdentityAdded(IdentityId)));
  connect(Client::instance(), SIGNAL(identityRemoved(IdentityId)), this, SLOT(clientIdentityRemoved(IdentityId)));

  connect(ui.identityList, SIGNAL(currentIndexChanged(int)), this, SLOT(widgetHasChanged()));
  //connect(ui.randomServer, SIGNAL(clicked(bool)), this, SLOT(widgetHasChanged()));
  connect(ui.performEdit, SIGNAL(textChanged()), this, SLOT(widgetHasChanged()));
  connect(ui.autoIdentify, SIGNAL(clicked(bool)), this, SLOT(widgetHasChanged()));
  connect(ui.autoIdentifyService, SIGNAL(textEdited(const QString &)), this, SLOT(widgetHasChanged()));
  connect(ui.autoIdentifyPassword, SIGNAL(textEdited(const QString &)), this, SLOT(widgetHasChanged()));
  connect(ui.sasl, SIGNAL(clicked(bool)), this, SLOT(widgetHasChanged()));
  connect(ui.saslAccount, SIGNAL(textEdited(QString)), this, SLOT(widgetHasChanged()));
  connect(ui.saslPassword, SIGNAL(textEdited(QString)), this, SLOT(widgetHasChanged()));
  connect(ui.useCustomEncodings, SIGNAL(clicked(bool)), this, SLOT(widgetHasChanged()));
  connect(ui.sendEncoding, SIGNAL(currentIndexChanged(int)), this, SLOT(widgetHasChanged()));
  connect(ui.recvEncoding, SIGNAL(currentIndexChanged(int)), this, SLOT(widgetHasChanged()));
  connect(ui.serverEncoding, SIGNAL(currentIndexChanged(int)), this, SLOT(widgetHasChanged()));
  connect(ui.autoReconnect, SIGNAL(clicked(bool)), this, SLOT(widgetHasChanged()));
  connect(ui.reconnectInterval, SIGNAL(valueChanged(int)), this, SLOT(widgetHasChanged()));
  connect(ui.reconnectRetries, SIGNAL(valueChanged(int)), this, SLOT(widgetHasChanged()));
  connect(ui.unlimitedRetries, SIGNAL(clicked(bool)), this, SLOT(widgetHasChanged()));
  connect(ui.rejoinOnReconnect, SIGNAL(clicked(bool)), this, SLOT(widgetHasChanged()));
void BlankSettingsPage::defaults() {
  ui.exampleCheckbox->setChecked(true);

  widgetHasChanged();
}