Perforce: Merge Settings and PerforceSettings classes

Structurally more similar to what the other plugins do.

Change-Id: Ic664277b089ebf60241fc8627353721e0e2f3002
Reviewed-by: Orgad Shaneh <orgads@gmail.com>
This commit is contained in:
hjk
2021-04-13 08:09:58 +02:00
parent f7310dd8fb
commit c4631271d4
3 changed files with 67 additions and 130 deletions

View File

@@ -395,7 +395,7 @@ PerforcePluginPrivate::PerforcePluginPrivate()
dd = this;
m_settings.settings().readSettings(ICore::settings());
m_settings.readSettings(ICore::settings());
const QString prefix = QLatin1String("p4");
m_commandLocator = new CommandLocator("Perforce", prefix, prefix, this);
@@ -572,7 +572,7 @@ PerforcePluginPrivate::PerforcePluginPrivate()
connect(m_filelogAction, &QAction::triggered, this, &PerforcePluginPrivate::filelogFile);
perforceContainer->addAction(command);
QObject::connect(&m_settings.settings(), &AspectContainer::applied, [this] {
QObject::connect(&m_settings, &AspectContainer::applied, [this] {
m_settings.clearTopLevel();
applySettings();
});
@@ -913,8 +913,8 @@ void PerforcePluginPrivate::filelog(const QString &workingDir, const QString &fi
QTextCodec *codec = VcsBaseEditor::getCodec(workingDir, QStringList(fileName));
QStringList args;
args << QLatin1String("filelog") << QLatin1String("-li");
if (m_settings.logCount() > 0)
args << QLatin1String("-m") << QString::number(m_settings.logCount());
if (m_settings.logCount.value() > 0)
args << "-m" << QString::number(m_settings.logCount.value());
if (!fileName.isEmpty())
args.append(fileName);
const PerforceResponse result = runP4Cmd(workingDir, args,
@@ -935,8 +935,8 @@ void PerforcePluginPrivate::changelists(const QString &workingDir, const QString
QTextCodec *codec = VcsBaseEditor::getCodec(workingDir, QStringList(fileName));
QStringList args;
args << QLatin1String("changelists") << QLatin1String("-lit");
if (m_settings.logCount() > 0)
args << QLatin1String("-m") << QString::number(m_settings.logCount());
if (m_settings.logCount.value() > 0)
args << "-m" << QString::number(m_settings.logCount.value());
if (!fileName.isEmpty())
args.append(fileName);
const PerforceResponse result = runP4Cmd(workingDir, args,
@@ -1132,7 +1132,7 @@ bool PerforcePluginPrivate::isVcsFileOrDirectory(const FilePath &fileName) const
bool PerforcePluginPrivate::isConfigured() const
{
const QString binary = m_settings.p4BinaryPath();
const QString binary = m_settings.p4BinaryPath.value();
if (binary.isEmpty())
return false;
QFileInfo fi(binary);
@@ -1171,8 +1171,8 @@ bool PerforcePluginPrivate::vcsOpen(const QString &fileName)
IVersionControl::SettingsFlags PerforcePluginPrivate::settingsFlags() const
{
SettingsFlags rc;
if (m_settings.autoOpen())
rc|= AutoOpen;
if (m_settings.autoOpen.value())
rc |= AutoOpen;
return rc;
}
@@ -1250,7 +1250,7 @@ PerforceResponse PerforcePluginPrivate::synchronousProcess(const QString &workin
VcsOutputWindow *outputWindow = VcsOutputWindow::instance();
// Run, connect stderr to the output window
SynchronousProcess process;
const int timeOutS = (flags & LongTimeOut) ? m_settings.longTimeOutS() : m_settings.timeOutS();
const int timeOutS = (flags & LongTimeOut) ? m_settings.longTimeOutS() : m_settings.timeOutS.value();
process.setTimeoutS(timeOutS);
if (outputCodec)
process.setCodec(outputCodec);
@@ -1282,7 +1282,7 @@ PerforceResponse PerforcePluginPrivate::synchronousProcess(const QString &workin
}
}
process.setTimeOutMessageBoxEnabled(true);
const SynchronousProcessResponse sp_resp = process.run({m_settings.p4BinaryPath(), args});
const SynchronousProcessResponse sp_resp = process.run({m_settings.p4BinaryPath.value(), args});
PerforceResponse response;
response.error = true;
@@ -1301,7 +1301,7 @@ PerforceResponse PerforcePluginPrivate::synchronousProcess(const QString &workin
response.message = msgCrash();
break;
case SynchronousProcessResponse::StartFailed:
response.message = msgNotStarted(m_settings.p4BinaryPath());
response.message = msgNotStarted(m_settings.p4BinaryPath.value());
break;
case SynchronousProcessResponse::Hang:
response.message = msgCrash();
@@ -1325,13 +1325,13 @@ PerforceResponse PerforcePluginPrivate::fullySynchronousProcess(const QString &w
process.setWorkingDirectory(workingDir);
PerforceResponse response;
process.start(m_settings.p4BinaryPath(), args);
process.start(m_settings.p4BinaryPath.value(), args);
if (stdInput.isEmpty())
process.closeWriteChannel();
if (!process.waitForStarted(3000)) {
response.error = true;
response.message = msgNotStarted(m_settings.p4BinaryPath());
response.message = msgNotStarted(m_settings.p4BinaryPath.value());
return response;
}
if (!stdInput.isEmpty()) {
@@ -1339,7 +1339,7 @@ PerforceResponse PerforcePluginPrivate::fullySynchronousProcess(const QString &w
SynchronousProcess::stopProcess(process);
response.error = true;
response.message = tr("Unable to write input data to process %1: %2").
arg(QDir::toNativeSeparators(m_settings.p4BinaryPath()),
arg(QDir::toNativeSeparators(m_settings.p4BinaryPath.value()),
process.errorString());
return response;
}
@@ -1348,7 +1348,7 @@ PerforceResponse PerforcePluginPrivate::fullySynchronousProcess(const QString &w
QByteArray stdOut;
QByteArray stdErr;
const int timeOutS = (flags & LongTimeOut) ? m_settings.longTimeOutS() : m_settings.timeOutS();
const int timeOutS = (flags & LongTimeOut) ? m_settings.longTimeOutS() : m_settings.timeOutS.value();
if (!SynchronousProcess::readDataFromProcess(process, timeOutS, &stdOut, &stdErr, true)) {
SynchronousProcess::stopProcess(process);
response.error = true;
@@ -1404,7 +1404,7 @@ PerforceResponse PerforcePluginPrivate::runP4Cmd(const QString &workingDir,
actualArgs.append(args);
if (flags & CommandToWindow)
VcsOutputWindow::appendCommand(workingDir, {m_settings.p4BinaryPath(), actualArgs});
VcsOutputWindow::appendCommand(workingDir, {m_settings.p4BinaryPath.value(), actualArgs});
if (flags & ShowBusyCursor)
QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
@@ -1586,7 +1586,7 @@ bool PerforcePluginPrivate::submitEditorAboutToClose()
QTC_ASSERT(editorDocument, return true);
// Prompt the user. Force a prompt unless submit was actually invoked (that
// is, the editor was closed or shutdown).
bool wantsPrompt = m_settings.promptToSubmit();
bool wantsPrompt = m_settings.promptToSubmit.value();
const VcsBaseSubmitEditor::PromptSubmitResult answer =
perforceEditor->promptSubmit(this, &wantsPrompt, !m_submitActionTriggered);
m_submitActionTriggered = false;
@@ -1595,9 +1595,9 @@ bool PerforcePluginPrivate::submitEditorAboutToClose()
return false;
// Set without triggering the checking mechanism
if (wantsPrompt != m_settings.promptToSubmit()) {
m_settings.setPromptToSubmit(wantsPrompt);
m_settings.settings().writeSettings(ICore::settings());
if (wantsPrompt != m_settings.promptToSubmit.value()) {
m_settings.promptToSubmit.setValue(wantsPrompt);
m_settings.writeSettings(ICore::settings());
}
if (!DocumentManager::saveDocument(editorDocument))
return false;
@@ -1724,7 +1724,7 @@ void PerforcePluginPrivate::setTopLevel(const QString &topLevel)
void PerforcePluginPrivate::applySettings()
{
m_settings.settings().writeSettings(ICore::settings());
m_settings.writeSettings(ICore::settings());
m_managedDirectoryCache.clear();
getTopLevel();
emit configurationChanged();
@@ -1738,7 +1738,7 @@ void PerforcePluginPrivate::slotTopLevelFailed(const QString &errorMessage)
void PerforcePluginPrivate::getTopLevel(const QString &workingDirectory, bool isSync)
{
// Run a new checker
if (m_settings.p4BinaryPath().isEmpty())
if (m_settings.p4BinaryPath.value().isEmpty())
return;
auto checker = new PerforceChecker(dd);
connect(checker, &PerforceChecker::failed, dd, &PerforcePluginPrivate::slotTopLevelFailed);
@@ -1746,7 +1746,7 @@ void PerforcePluginPrivate::getTopLevel(const QString &workingDirectory, bool is
connect(checker, &PerforceChecker::succeeded, dd, &PerforcePluginPrivate::setTopLevel);
connect(checker, &PerforceChecker::succeeded,checker, &QObject::deleteLater);
checker->start(m_settings.p4BinaryPath(), workingDirectory,
checker->start(m_settings.p4BinaryPath.value(), workingDirectory,
m_settings.commonP4Arguments(QString()), 30000);
if (isSync)

View File

@@ -52,7 +52,7 @@ static QString defaultCommand()
return QLatin1String("p4" QTC_HOST_EXE_SUFFIX);
}
Settings::Settings()
PerforceSettings::PerforceSettings()
{
setSettingsGroup("Perforce");
setAutoApply(false);
@@ -114,7 +114,13 @@ Settings::Settings()
autoOpen.setLabelText(tr("Automatically open files when editing"));
}
QStringList Settings::commonP4Arguments() const
// --------------------PerforceSettings
PerforceSettings::~PerforceSettings()
{
delete m_topLevelDir;
}
QStringList PerforceSettings::commonP4Arguments() const
{
QStringList lst;
if (customEnv.value()) {
@@ -128,60 +134,14 @@ QStringList Settings::commonP4Arguments() const
return lst;
}
// --------------------PerforceSettings
PerforceSettings::~PerforceSettings()
{
delete m_topLevelDir;
}
bool PerforceSettings::isValid() const
{
return !m_topLevel.isEmpty() && !m_settings.p4BinaryPath.value().isEmpty();
}
QString PerforceSettings::p4BinaryPath() const
{
return m_settings.p4BinaryPath.value();
}
QString PerforceSettings::p4Port() const
{
return m_settings.p4Port.value();
}
QString PerforceSettings::p4Client() const
{
return m_settings.p4Client.value();
}
QString PerforceSettings::p4User() const
{
return m_settings.p4User.value();
return !m_topLevel.isEmpty() && !p4BinaryPath.value().isEmpty();
}
bool PerforceSettings::defaultEnv() const
{
return !m_settings.customEnv.value(); // Note: negated
}
bool PerforceSettings::promptToSubmit() const
{
return m_settings.promptToSubmit.value();
}
void PerforceSettings::setPromptToSubmit(bool p)
{
m_settings.promptToSubmit.setValue(p);
}
bool PerforceSettings::autoOpen() const
{
return m_settings.autoOpen.value();
}
void PerforceSettings::setAutoOpen(bool b)
{
m_settings.autoOpen.setValue(b);
return !customEnv.value(); // Note: negated
}
QString PerforceSettings::topLevel() const
@@ -256,7 +216,7 @@ QStringList PerforceSettings::commonP4Arguments(const QString &workingDir) const
rc << QLatin1String("-d")
<< QDir::toNativeSeparators(mapPathRoot(workingDir, m_topLevelSymLinkTarget, m_topLevel));
}
rc.append(m_settings.commonP4Arguments());
rc.append(commonP4Arguments());
return rc;
}
@@ -270,16 +230,16 @@ QString PerforceSettings::mapToFileSystem(const QString &perforceFilePath) const
PerforceSettingsPage::PerforceSettingsPage(PerforceSettings *settings)
{
setId(VcsBase::Constants::VCS_ID_PERFORCE);
setDisplayName(Settings::tr("Perforce"));
setDisplayName(PerforceSettings::tr("Perforce"));
setCategory(VcsBase::Constants::VCS_SETTINGS_CATEGORY);
setSettings(&settings->settings());
setSettings(settings);
setLayouter([settings, this](QWidget *widget) {
Settings &s = settings->settings();
PerforceSettings &s = *settings;
using namespace Layouting;
auto errorLabel = new QLabel;
auto testButton = new QPushButton(Settings::tr("Test"));
auto testButton = new QPushButton(PerforceSettings::tr("Test"));
connect(testButton, &QPushButton::clicked, this, [this, settings, errorLabel, testButton] {
testButton->setEnabled(false);
auto checker = new PerforceChecker(errorLabel);
@@ -300,23 +260,22 @@ PerforceSettingsPage::PerforceSettingsPage(PerforceSettings *settings)
});
errorLabel->setStyleSheet(QString());
errorLabel->setText(Settings::tr("Testing..."));
const Settings &s = settings->settings();
checker->start(s.p4BinaryPath.value(), QString(), s.commonP4Arguments(), 10000);
errorLabel->setText(PerforceSettings::tr("Testing..."));
checker->start(settings->p4BinaryPath.value(), QString(), settings->commonP4Arguments(), 10000);
});
Group config {
Title(Settings::tr("Configuration")),
Title(PerforceSettings::tr("Configuration")),
Row { s.p4BinaryPath }
};
Group environment {
Title(Settings::tr("Environment Variables"), &s.customEnv),
Title(PerforceSettings::tr("Environment Variables"), &s.customEnv),
Row { s.p4Port, s.p4Client, s.p4User }
};
Group misc {
Title(Settings::tr("Miscellaneous")),
Title(PerforceSettings::tr("Miscellaneous")),
Row { s.logCount, s.timeOutS, Stretch() },
s.promptToSubmit,
s.autoOpen

View File

@@ -36,32 +36,7 @@ QT_END_NAMESPACE
namespace Perforce {
namespace Internal {
class Settings : public Utils::AspectContainer
{
Q_DECLARE_TR_FUNCTIONS(Perforce::Internal::SettingsPage)
public:
Settings();
QStringList commonP4Arguments() const;
// Checks. On success, errorMessage will contains the client root.
bool check(QString *repositoryRoot /* = 0*/, QString *errorMessage) const;
static bool doCheck(const QString &binary, const QStringList &basicArgs,
QString *repositoryRoot /* = 0 */,
QString *errorMessage);
Utils::StringAspect p4BinaryPath;
Utils::StringAspect p4Port;
Utils::StringAspect p4Client;
Utils::StringAspect p4User;
Utils::IntegerAspect logCount;
Utils::BoolAspect customEnv;
Utils::IntegerAspect timeOutS;
Utils::BoolAspect promptToSubmit;
Utils::BoolAspect autoOpen;
};
/* PerforceSettings: Aggregates settings struct and toplevel directory
/* PerforceSettings: Aggregates settings items and toplevel directory
* which is determined externally by background checks and provides a convenience
* for determining the common arguments.
* Those must contain (apart from server connection settings) the working directory
@@ -75,22 +50,24 @@ public:
* p4. This is why the client root portion of working directory must be mapped for the
* "-d" option, so that running p4 in "/depot/dev/foo" results in "-d $HOME/dev/foo". */
class PerforceSettings
class PerforceSettings : public Utils::AspectContainer
{
Q_DECLARE_TR_FUNCTIONS(Perforce::Internal::SettingsPage)
public:
PerforceSettings() = default;
PerforceSettings();
~PerforceSettings();
PerforceSettings(const PerforceSettings &other) = delete;
bool isValid() const;
const Settings &settings() const { return m_settings; }
Settings &settings() { return m_settings; }
// Checks. On success, errorMessage will contains the client root.
bool check(QString *repositoryRoot /* = 0*/, QString *errorMessage) const;
static bool doCheck(const QString &binary, const QStringList &basicArgs,
QString *repositoryRoot /* = 0 */,
QString *errorMessage);
int timeOutS() const { return m_settings.timeOutS.value(); }
int longTimeOutS() const { return m_settings.timeOutS.value() * 10; }
int timeOutMS() const { return m_settings.timeOutS.value() * 1000; }
int logCount() const { return m_settings.logCount.value(); }
int longTimeOutS() const { return timeOutS.value() * 10; }
int timeOutMS() const { return timeOutS.value() * 1000; }
QString topLevel() const;
QString topLevelSymLinkTarget() const;
@@ -107,25 +84,26 @@ public:
// Map p4 path back to file system in case of a symlinked top-level
QString mapToFileSystem(const QString &perforceFilePath) const;
QString p4BinaryPath() const;
QString p4Port() const;
QString p4Client() const;
QString p4User() const;
bool defaultEnv() const;
bool promptToSubmit() const;
void setPromptToSubmit(bool p);
bool autoOpen() const;
void setAutoOpen(bool p);
// Return basic arguments, including -d and server connection parameters.
QStringList commonP4Arguments() const;
QStringList commonP4Arguments(const QString &workingDir) const;
void clearTopLevel();
Utils::StringAspect p4BinaryPath;
Utils::StringAspect p4Port;
Utils::StringAspect p4Client;
Utils::StringAspect p4User;
Utils::IntegerAspect logCount;
Utils::BoolAspect customEnv;
Utils::IntegerAspect timeOutS;
Utils::BoolAspect promptToSubmit;
Utils::BoolAspect autoOpen;
private:
QStringList workingDirectoryArguments(const QString &workingDir) const;
Settings m_settings;
QString m_topLevel;
QString m_topLevelSymLinkTarget;
QDir *m_topLevelDir = nullptr;