void ClangDiagnosticConfigsWidget::syncOtherWidgetsToComboBox()
{
    if (isConfigChooserEmpty())
        return;

    const ClangDiagnosticConfig &config = currentConfig();

    // Update main button row
    m_ui->removeButton->setEnabled(!config.isReadOnly());

    // Update Text Edit
    const QString options = m_notAcceptedOptions.contains(config.id())
            ? m_notAcceptedOptions.value(config.id())
            : config.clangOptions().join(QLatin1Char(' '));
    setDiagnosticOptions(options);
    m_clangBaseChecksWidget->setEnabled(!config.isReadOnly());

    if (config.isReadOnly()) {
        m_ui->infoIcon->setPixmap(Utils::Icons::INFO.pixmap());
        m_ui->infoLabel->setText(tr("Copy this configuration to customize it."));
        m_ui->infoLabel->setStyleSheet(QString());
    }

    syncClangTidyWidgets(config);
    syncClazyWidgets(config);
}
void ClangDiagnosticConfigsWidget::onClangTidyModeChanged(int index)
{
    ClangDiagnosticConfig config = currentConfig();
    config.setClangTidyMode(static_cast<ClangDiagnosticConfig::TidyMode>(index));
    updateConfig(config);
    syncClangTidyWidgets(config);
}
void ClangDiagnosticConfigsWidget::onClangTidyItemChanged(QListWidgetItem *item)
{
    const QString prefix = item->text();
    ClangDiagnosticConfig config = currentConfig();
    QString checks = config.clangTidyChecksPrefixes();
    item->checkState() == Qt::Checked
            ? checks.append(',' + prefix)
            : checks.remove(',' + prefix);
    config.setClangTidyChecksPrefixes(checks);
    updateConfig(config);
}
void ClangDiagnosticConfigsWidget::onDiagnosticOptionsEdited()
{
    const QString diagnosticOptions
            = m_ui->diagnosticOptionsTextEdit->document()->toPlainText().trimmed();
    const QStringList updatedCommandLine
            = diagnosticOptions.trimmed().split(QLatin1Char(' '), QString::SkipEmptyParts);

    ClangDiagnosticConfig updatedConfig = currentConfig();
    updatedConfig.setCommandLineOptions(updatedCommandLine);

    m_diagnosticConfigsModel.appendOrUpdate(updatedConfig);
    emit customConfigsChanged(customConfigs());
}
void ClangDiagnosticConfigsWidget::syncOtherWidgetsToComboBox()
{
    if (isConfigChooserEmpty())
        return;

    const ClangDiagnosticConfig &config = currentConfig();

    // Update main button row
    m_ui->removeButton->setEnabled(!config.isReadOnly());

    // Update child widgets
    const QString commandLineOptions = config.commandLineOptions().join(QLatin1Char(' '));
    setDiagnosticOptions(commandLineOptions);
    m_ui->diagnosticOptionsTextEdit->setReadOnly(config.isReadOnly());
}
void ClangDiagnosticConfigsWidget::onCopyButtonClicked()
{
    const ClangDiagnosticConfig &config = currentConfig();

    bool diaglogAccepted = false;
    const QString newName = QInputDialog::getText(this,
                                                  tr("Copy Diagnostic Configuration"),
                                                  tr("Diagnostic configuration name:"),
                                                  QLineEdit::Normal,
                                                  tr("%1 (Copy)").arg(config.displayName()),
                                                  &diaglogAccepted);
    if (diaglogAccepted) {
        const ClangDiagnosticConfig customConfig = createCustomConfig(config, newName);
        m_diagnosticConfigsModel.appendOrUpdate(customConfig);
        emit customConfigsChanged(customConfigs());

        syncConfigChooserToModel(customConfig.id());
        m_ui->diagnosticOptionsTextEdit->setFocus();
    }
}
void ClangDiagnosticConfigsWidget::onClazyRadioButtonChanged(bool checked)
{
    if (!checked)
        return;

    QString checks;
    if (m_clazyChecks->clazyRadioDisabled->isChecked())
        checks = QString();
    else if (m_clazyChecks->clazyRadioLevel0->isChecked())
        checks = "level0";
    else if (m_clazyChecks->clazyRadioLevel1->isChecked())
        checks = "level1";
    else if (m_clazyChecks->clazyRadioLevel2->isChecked())
        checks = "level2";
    else if (m_clazyChecks->clazyRadioLevel3->isChecked())
        checks = "level3";

    ClangDiagnosticConfig config = currentConfig();
    config.setClazyChecks(checks);
    updateConfig(config);
}
void ClangDiagnosticConfigsWidget::onDiagnosticOptionsEdited()
{
    // Clean up input
    const QString diagnosticOptions = m_clangBaseChecks->diagnosticOptionsTextEdit->document()
                                          ->toPlainText();
    const QStringList normalizedOptions = normalizeDiagnosticInputOptions(diagnosticOptions);

    // Validate
    const QString errorMessage = validateDiagnosticOptions(normalizedOptions);
    updateValidityWidgets(errorMessage);
    if (!errorMessage.isEmpty()) {
        // Remember the entered options in case the user will switch back.
        m_notAcceptedOptions.insert(currentConfigId(), diagnosticOptions);
        return;
    }
    m_notAcceptedOptions.remove(currentConfigId());

    // Commit valid changes
    ClangDiagnosticConfig updatedConfig = currentConfig();
    updatedConfig.setClangOptions(normalizedOptions);
    updateConfig(updatedConfig);
}
void ClangDiagnosticConfigsWidget::onClangTidyLineEdited(const QString &text)
{
    ClangDiagnosticConfig config = currentConfig();
    config.setClangTidyChecksString(text);
    updateConfig(config);
}