Merge remote-tracking branch 'origin/4.14'

Change-Id: I62523c4733e617c46131048f5f62a2ca9be47d80
This commit is contained in:
Eike Ziller
2021-01-06 08:42:15 +01:00
19 changed files with 425 additions and 156 deletions

View File

@@ -49,10 +49,10 @@ MakeStep::MakeStep(ProjectExplorer::BuildStepList *bsl, Utils::Id id)
{
setAvailableBuildTargets({"all", "clean"});
if (bsl->id() == ProjectExplorer::Constants::BUILDSTEPS_CLEAN) {
setBuildTarget("clean", true);
setSelectedBuildTarget("clean");
setIgnoreReturnValue(true);
} else {
setBuildTarget("all", true);
setSelectedBuildTarget("all");
}
}

View File

@@ -51,7 +51,7 @@ void HeaderPathFilter::process()
for (const HeaderPath &headerPath : headerPaths)
filterHeaderPath(headerPath);
if (useTweakedHeaderPaths == UseTweakedHeaderPaths::Yes)
if (useTweakedHeaderPaths != UseTweakedHeaderPaths::No)
tweakHeaderPaths();
}

View File

@@ -43,13 +43,13 @@ public:
GenericMakeStep::GenericMakeStep(BuildStepList *parent, Utils::Id id)
: MakeStep(parent, id)
{
setAvailableBuildTargets({"all", "clean"});
if (parent->id() == ProjectExplorer::Constants::BUILDSTEPS_BUILD) {
setBuildTarget("all");
setSelectedBuildTarget("all");
} else if (parent->id() == ProjectExplorer::Constants::BUILDSTEPS_CLEAN) {
setBuildTarget("clean");
setSelectedBuildTarget("clean");
setIgnoreReturnValue(true);
}
setAvailableBuildTargets({"all", "clean"});
}
GenericMakeStepFactory::GenericMakeStepFactory()

View File

@@ -49,8 +49,6 @@
#include <QFormLayout>
#include <QLabel>
#include <QLineEdit>
#include <QListWidget>
#include <QSpinBox>
#include <QThread>
using namespace Core;
@@ -105,8 +103,9 @@ MakeStep::MakeStep(BuildStepList *parent, Id id)
.arg(text) + "</p></body></html>");
m_nonOverrideWarning->setIconType(InfoLabel::Warning);
m_buildTargetsAspect = addAspect<StringListAspect>();
m_buildTargetsAspect = addAspect<MultiSelectionAspect>();
m_buildTargetsAspect->setSettingsKey(id.withSuffix(BUILD_TARGETS_SUFFIX).toString());
m_buildTargetsAspect->setLabelText(tr("Targets:"));
const auto updateMakeLabel = [this] {
const QString defaultMake = defaultMakeCommand().toString();
@@ -121,15 +120,14 @@ MakeStep::MakeStep(BuildStepList *parent, Id id)
connect(m_makeCommandAspect, &StringAspect::changed, this, updateMakeLabel);
}
void MakeStep::setBuildTarget(const QString &buildTarget)
void MakeStep::setSelectedBuildTarget(const QString &buildTarget)
{
if (!buildTarget.isEmpty())
setBuildTarget(buildTarget, true);
m_buildTargetsAspect->setValue({buildTarget});
}
void MakeStep::setAvailableBuildTargets(const QStringList &buildTargets)
{
m_availableTargets = buildTargets;
m_buildTargetsAspect->setAllValues(buildTargets);
}
bool MakeStep::init()
@@ -342,11 +340,6 @@ QWidget *MakeStep::createConfigWidget()
{
auto widget = new QWidget;
auto targetsLabel = new QLabel(widget);
targetsLabel->setText(tr("Targets:"));
auto targetsList = new QListWidget(widget);
auto disableInSubDirsLabel = new QLabel(tr("Disable in subdirectories:"), widget);
auto disableInSubDirsCheckBox = new QCheckBox(widget);
disableInSubDirsCheckBox->setToolTip(tr("Runs this step only for a top-level build."));
@@ -356,7 +349,7 @@ QWidget *MakeStep::createConfigWidget()
builder.addRow(m_userArgumentsAspect);
builder.addRow(m_jobCountContainer);
builder.addRow({disableInSubDirsLabel, disableInSubDirsCheckBox});
builder.addRow({targetsLabel, targetsList});
builder.addRow(m_buildTargetsAspect);
if (!m_disablingForSubDirsSupported) {
disableInSubDirsLabel->hide();
@@ -367,16 +360,6 @@ QWidget *MakeStep::createConfigWidget()
});
}
for (const QString &target : qAsConst(m_availableTargets)) {
auto item = new QListWidgetItem(target, targetsList);
item->setFlags(item->flags() | Qt::ItemIsUserCheckable);
item->setCheckState(buildsTarget(item->text()) ? Qt::Checked : Qt::Unchecked);
}
if (m_availableTargets.isEmpty()) {
targetsLabel->hide();
targetsList->hide();
}
VariableChooser::addSupportForChildWidgets(widget, macroExpander());
setSummaryUpdater([this] {
@@ -420,12 +403,7 @@ QWidget *MakeStep::createConfigWidget()
connect(m_userArgumentsAspect, &StringAspect::changed, widget, updateDetails);
connect(m_userJobCountAspect, &IntegerAspect::changed, widget, updateDetails);
connect(m_overrideMakeflagsAspect, &BoolAspect::changed, widget, updateDetails);
connect(targetsList, &QListWidget::itemChanged, this,
[this, updateDetails](QListWidgetItem *item) {
setBuildTarget(item->text(), item->checkState() & Qt::Checked);
updateDetails();
});
connect(m_buildTargetsAspect, &BaseAspect::changed, widget, updateDetails);
connect(ProjectExplorerPlugin::instance(), &ProjectExplorerPlugin::settingsChanged,
widget, updateDetails);
@@ -439,25 +417,9 @@ QWidget *MakeStep::createConfigWidget()
return widget;
}
bool MakeStep::buildsTarget(const QString &target) const
{
return m_buildTargetsAspect->value().contains(target);
}
void MakeStep::setBuildTarget(const QString &target, bool on)
{
QStringList old = m_buildTargetsAspect->value();
if (on && !old.contains(target))
old << target;
else if (!on && old.contains(target))
old.removeOne(target);
m_buildTargetsAspect->setValue(old);
}
QStringList MakeStep::availableTargets() const
{
return m_availableTargets;
return m_buildTargetsAspect->allValues();
}
} // namespace ProjectExplorer

View File

@@ -45,14 +45,13 @@ public:
};
explicit MakeStep(ProjectExplorer::BuildStepList *parent, Utils::Id id);
void setBuildTarget(const QString &buildTarget);
void setAvailableBuildTargets(const QStringList &buildTargets);
void setSelectedBuildTarget(const QString &buildTarget);
bool init() override;
void setupOutputFormatter(Utils::OutputFormatter *formatter) override;
QWidget *createConfigWidget() override;
bool buildsTarget(const QString &target) const;
void setBuildTarget(const QString &target, bool on);
QStringList availableTargets() const;
QString userArguments() const;
void setUserArguments(const QString &args);
@@ -87,8 +86,7 @@ private:
static int defaultJobCount();
QStringList jobArguments() const;
Utils::StringListAspect *m_buildTargetsAspect = nullptr;
QStringList m_availableTargets;
Utils::MultiSelectionAspect *m_buildTargetsAspect = nullptr;
Utils::StringAspect *m_makeCommandAspect = nullptr;
Utils::StringAspect *m_userArgumentsAspect = nullptr;
Utils::AspectContainer *m_jobCountContainer = nullptr;

View File

@@ -206,10 +206,13 @@ QList<QMakeAssignment> MakeFileParse::parseAssignments(const QList<QMakeAssignme
else
foundForceDebugInfo = false;
} else if (value == QLatin1String("separate_debug_info")) {
if (qa.op == QLatin1String("+="))
if (qa.op == QLatin1String("+=")) {
foundSeparateDebugInfo = true;
else
m_config.separateDebugInfo = TriState::Enabled;
} else {
foundSeparateDebugInfo = false;
m_config.separateDebugInfo = TriState::Disabled;
}
} else {
newValues.append(value);
}

View File

@@ -28,8 +28,14 @@
#include "richtexteditor/richtexteditor.h"
#include <QCryptographicHash>
#include "QStringListModel"
#include "projectexplorer/session.h"
#include "projectexplorer/target.h"
#include "qmldesignerplugin.h"
#include "qmlprojectmanager/qmlproject.h"
namespace QmlDesigner {
AnnotationCommentTab::AnnotationCommentTab(QWidget *parent)
@@ -38,7 +44,17 @@ AnnotationCommentTab::AnnotationCommentTab(QWidget *parent)
{
ui->setupUi(this);
m_editor = new RichTextEditor;
m_editor = new RichTextEditor{this};
connect(m_editor, &RichTextEditor::insertingImage, this, [this](QString &filePath) {
filePath = backupFile(filePath);
});
Utils::FilePath projPath = ProjectExplorer::SessionManager::startupProject()->projectFilePath();
m_editor->setDocumentBaseUrl(QUrl::fromLocalFile(projPath.toString()));
m_editor->setImageActionVisible(true);
ui->formLayout->setWidget(3, QFormLayout::FieldRole, m_editor);
ui->titleEdit->setModel(new QStringListModel{QStringList{"Description",
@@ -113,4 +129,64 @@ void AnnotationCommentTab::commentTitleChanged(const QString &text)
emit titleChanged(text, this);
}
QString AnnotationCommentTab::backupFile(const QString &filePath)
{
const QDir projDir(
ProjectExplorer::SessionManager::startupProject()->projectDirectory().toString());
const QString imageSubDir(".AnnotationImages");
const QDir imgDir(projDir.absolutePath() + QDir::separator() + imageSubDir);
ensureDir(imgDir);
const QFileInfo oldFile(filePath);
QFileInfo newFile(imgDir, oldFile.fileName());
QString newName = newFile.baseName() + "_%1." + newFile.completeSuffix();
for (size_t i = 1; true; ++i) {
if (!newFile.exists()) {
QFile(oldFile.absoluteFilePath()).copy(newFile.absoluteFilePath());
break;
} else if (compareFileChecksum(oldFile.absoluteFilePath(),
newFile.absoluteFilePath()) == 0) {
break;
}
newFile.setFile(imgDir, newName.arg(i));
}
return projDir.relativeFilePath(newFile.absoluteFilePath());
}
void AnnotationCommentTab::ensureDir(const QDir &dir)
{
if (!dir.exists()) {
dir.mkdir(".");
}
}
int AnnotationCommentTab::compareFileChecksum(const QString &firstFile, const QString &secondFile)
{
QCryptographicHash sum1(QCryptographicHash::Md5);
{
QFile f1(firstFile);
if (f1.open(QFile::ReadOnly)) {
sum1.addData(&f1);
}
}
QCryptographicHash sum2(QCryptographicHash::Md5);
{
QFile f2(secondFile);
if (f2.open(QFile::ReadOnly)) {
sum2.addData(&f2);
}
}
return sum1.result().compare(sum2.result());
}
} //namespace QmlDesigner

View File

@@ -29,6 +29,8 @@
#include "annotation.h"
class QDir;
namespace QmlDesigner {
namespace Ui {
@@ -64,6 +66,10 @@ private:
RichTextEditor *m_editor;
Comment m_comment;
QString backupFile(const QString &filePath);
void ensureDir(const QDir &dir);
int compareFileChecksum(const QString &firstFile, const QString &secondFile);
};
} //namespace QmlDesigner

View File

@@ -1087,7 +1087,7 @@ static int counterClockWise(const std::vector<QPointF> &points)
};
const int m = findLR(points);
const int n = points.size();
const int n = static_cast<int>(points.size());
// Determine previous and next point to m (the lowest, rightmost point).
const QPointF a = points[(m + (n - 1)) % n];

View File

@@ -89,7 +89,7 @@ void ItemLibraryAssetImporter::importQuick3D(const QStringList &inputFiles,
if (m_qmlPuppetProcesses.empty()) {
finalizeQuick3DImport();
} else {
m_qmlPuppetCount = m_qmlPuppetProcesses.size();
m_qmlPuppetCount = static_cast<int>(m_qmlPuppetProcesses.size());
const QString progressTitle = tr("Generating icons.");
addInfo(progressTitle);
notifyProgress(0, progressTitle);

View File

@@ -32,6 +32,7 @@
#include <QAction>
#include <QActionGroup>
#include <QColorDialog>
#include <QFileDialog>
#include <QPainter>
#include <QPointer>
#include <QScopeGuard>
@@ -120,6 +121,7 @@ RichTextEditor::RichTextEditor(QWidget *parent)
setupEditActions();
setupTextActions();
setupImageActions();
setupHyperlinkActions();
setupAlignActions();
setupListActions();
@@ -184,6 +186,16 @@ void RichTextEditor::setTabChangesFocus(bool change)
ui->textEdit->setTabChangesFocus(change);
}
void RichTextEditor::setImageActionVisible(bool change)
{
m_actionImage->setVisible(change);
}
void RichTextEditor::setDocumentBaseUrl(const QUrl& url)
{
ui->textEdit->document()->setBaseUrl(url);
}
QIcon RichTextEditor::getIcon(Theme::Icon icon)
{
const QString fontName = "qtds_propertyIconFont.ttf";
@@ -363,6 +375,30 @@ void RichTextEditor::setupTextActions()
ui->toolBar->addSeparator();
}
void RichTextEditor::setupImageActions()
{
auto insertImage = [this]() {
QFileDialog dialog(this);
dialog.setFileMode(QFileDialog::ExistingFile);
dialog.setWindowTitle(tr("Select Image"));
dialog.setNameFilters({tr("Image files (*.png *.jpg)")});
if (dialog.exec()) {
QStringList files = dialog.selectedFiles();
for (QString& filePath : files) {
emit insertingImage(filePath);
ui->textEdit->insertHtml("<img src=\"" + filePath + "\" />");
}
}
};
m_actionImage = ui->toolBar
->addAction(getIcon(Theme::Icon::addFile), tr("Insert &Image"), insertImage);
setImageActionVisible(false);
}
void RichTextEditor::setupHyperlinkActions()
{
const QIcon bulletIcon(getIcon(Theme::Icon::actionIconBinding));

View File

@@ -63,6 +63,13 @@ public:
void setTabChangesFocus(bool change);
void setImageActionVisible(bool change);
void setDocumentBaseUrl(const QUrl &url);
signals:
void insertingImage(QString &filePath);
private slots:
void currentCharFormatChanged(const QTextCharFormat &format);
void cursorPositionChanged();
@@ -79,6 +86,7 @@ private:
void setupEditActions();
void setupTextActions();
void setupImageActions();
void setupHyperlinkActions();
void setupAlignActions();
void setupListActions();
@@ -97,6 +105,7 @@ private:
QAction *m_actionTextItalic;
QAction *m_actionTextUnderline;
QAction *m_actionImage;
QAction *m_actionHyperlink;
QAction *m_actionAlignLeft;

View File

@@ -768,7 +768,7 @@ FontSettings SyntaxHighlighter::fontSettings() const
return d->fontSettings;
}
/*!
The syntax highlighter is not anymore reacting to the text document if \a noAutmatic is
The syntax highlighter is not anymore reacting to the text document if \a noAutomatic is
\c true.
*/
void SyntaxHighlighter::setNoAutomaticHighlighting(bool noAutomatic)