aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/cmakeprojectmanager/cmakeformattersettings.cpp
blob: 4bb2218340dba8a6ca45aa655124829622f21ec9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
// Copyright (C) 2016 Lorenz Haas
// Copyright (C) 2022 Xavier BESSON
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0

#include "cmakeformattersettings.h"
#include "cmakeprojectconstants.h"

#include <coreplugin/icore.h>
#include <coreplugin/idocument.h>
#include <utils/algorithm.h>
#include <utils/genericconstants.h>
#include <utils/mimeutils.h>
#include <utils/qtcprocess.h>

namespace CMakeProjectManager {
namespace Internal {

namespace {
const char AUTO_FORMAT_COMMAND[] = "autoFormatCommand";
const char AUTO_FORMAT_MIME[] = "autoFormatMime";
const char AUTO_FORMAT_ONLY_CURRENT_PROJECT[] = "autoFormatOnlyCurrentProject";
const char AUTO_FORMAT_ON_SAVE[] = "autoFormatOnSave";
}

CMakeFormatterSettings::CMakeFormatterSettings(QObject* parent)
    : QObject(parent)
{
    read();
}

CMakeFormatterSettings *CMakeFormatterSettings::instance()
{
    static CMakeFormatterSettings m_instance;
    return &m_instance;
}

void CMakeFormatterSettings::read()
{
    QSettings *s = Core::ICore::settings();
    s->beginGroup(Constants::CMAKEFORMATTER_SETTINGS_GROUP);
    s->beginGroup(Constants::CMAKEFORMATTER_GENERAL_GROUP);
    setCommand(s->value(AUTO_FORMAT_COMMAND, QString("cmake-format")).toString());
    m_autoFormatOnSave = s->value(AUTO_FORMAT_ON_SAVE, false).toBool();
    setAutoFormatMime(s->value(AUTO_FORMAT_MIME, QString("text/x-cmake")).toString());
    m_autoFormatOnlyCurrentProject = s->value(AUTO_FORMAT_ONLY_CURRENT_PROJECT, true).toBool();
    s->endGroup();
    s->endGroup();
}

void CMakeFormatterSettings::save()
{
    QSettings *s = Core::ICore::settings();
    s->beginGroup(Constants::CMAKEFORMATTER_SETTINGS_GROUP);
    s->beginGroup(Constants::CMAKEFORMATTER_GENERAL_GROUP);
    Utils::QtcSettings::setValueWithDefault(s, AUTO_FORMAT_COMMAND, m_command, QString("cmake-format"));
    Utils::QtcSettings::setValueWithDefault(s, AUTO_FORMAT_ON_SAVE, m_autoFormatOnSave, false);
    Utils::QtcSettings::setValueWithDefault(s, AUTO_FORMAT_MIME, autoFormatMimeAsString(), QString("text/x-cmake"));
    Utils::QtcSettings::setValueWithDefault(s, AUTO_FORMAT_ONLY_CURRENT_PROJECT, m_autoFormatOnlyCurrentProject, true);
    s->endGroup();
    s->endGroup();
}

Utils::FilePath CMakeFormatterSettings::command() const
{
    return Utils::FilePath::fromString(m_command);
}

void CMakeFormatterSettings::setCommand(const QString &cmd)
{
    if (cmd == m_command)
        return;

    m_command = cmd;
}

bool CMakeFormatterSettings::autoFormatOnSave() const
{
    return m_autoFormatOnSave;
}

void CMakeFormatterSettings::setAutoFormatOnSave(bool autoFormatOnSave)
{
    m_autoFormatOnSave = autoFormatOnSave;
}

QStringList CMakeFormatterSettings::autoFormatMime() const
{
    return m_autoFormatMime;
}

QString CMakeFormatterSettings::autoFormatMimeAsString() const
{
    return m_autoFormatMime.join("; ");
}

void CMakeFormatterSettings::setAutoFormatMime(const QStringList &autoFormatMime)
{
    if (m_autoFormatMime == autoFormatMime)
        return;

    m_autoFormatMime = autoFormatMime;
    emit supportedMimeTypesChanged();
}

void CMakeFormatterSettings::setAutoFormatMime(const QString &mimeList)
{
    setAutoFormatMime(mimeList.split(';'));
}

bool CMakeFormatterSettings::autoFormatOnlyCurrentProject() const
{
    return m_autoFormatOnlyCurrentProject;
}

void CMakeFormatterSettings::setAutoFormatOnlyCurrentProject(bool autoFormatOnlyCurrentProject)
{
    m_autoFormatOnlyCurrentProject = autoFormatOnlyCurrentProject;
}

bool CMakeFormatterSettings::isApplicable(const Core::IDocument *document) const
{
    if (!document)
        return false;

    if (m_autoFormatMime.isEmpty())
        return true;

    const Utils::MimeType documentMimeType = Utils::mimeTypeForName(document->mimeType());
    return Utils::anyOf(m_autoFormatMime, [&documentMimeType](const QString &mime) {
        return documentMimeType.inherits(mime);
    });
}

} // namespace Internal
} // namespace CMakeProjectManager