Merge "Merge remote-tracking branch 'origin/6.0'"

This commit is contained in:
The Qt Project
2022-01-24 09:52:22 +00:00
18 changed files with 238 additions and 53 deletions

View File

@@ -1157,12 +1157,16 @@ QStandardItemModel *ListField::itemModel()
return m_itemModel;
}
void ListField::selectRow(int row)
bool ListField::selectRow(int row)
{
auto index = itemModel()->index(row, 0);
QModelIndex index = itemModel()->index(row, 0);
if (!index.isValid())
return false;
selectionModel()->setCurrentIndex(index, QItemSelectionModel::ClearAndSelect);
this->updateIndex();
return true;
}
QItemSelectionModel *ListField::selectionModel() const
@@ -1271,12 +1275,15 @@ QVariant ComboBoxField::toSettings() const
return {};
}
void ComboBoxField::selectRow(int row)
bool ComboBoxField::selectRow(int row)
{
ListField::selectRow(row);
if (!ListField::selectRow(row))
return false;
auto w = qobject_cast<QComboBox *>(widget());
w->setCurrentIndex(row);
return true;
}
int ComboBoxField::selectedRow() const

View File

@@ -282,7 +282,7 @@ public:
~ListField() override;
QStandardItemModel *model() { return m_itemModel; }
virtual void selectRow(int row);
virtual bool selectRow(int row);
protected:
bool parseData(const QVariant &data, QString *errorMessage) override;
@@ -351,7 +351,7 @@ private:
}
public:
void selectRow(int row) override;
bool selectRow(int row) override;
int selectedRow() const;
};

View File

@@ -78,6 +78,7 @@ using namespace LanguageUtils;
using namespace QmlJS;
static Q_LOGGING_CATEGORY(rewriterBenchmark, "qtc.rewriter.load", QtWarningMsg)
static Q_LOGGING_CATEGORY(texttomodelMergerDebug, "qtc.texttomodelmerger.debug", QtDebugMsg)
namespace {
@@ -574,7 +575,7 @@ public:
if (parentObject)
*parentObject = objectValue;
if (!value) {
qWarning() << Q_FUNC_INFO << "Skipping invalid property name" << propertyName;
qCInfo(texttomodelMergerDebug) << Q_FUNC_INFO << "Skipping invalid property name" << propertyName;
return false;
}
@@ -655,9 +656,10 @@ public:
const ObjectValue *containingObject = nullptr;
QString name;
if (!lookupProperty(propertyPrefix, propertyId, &property, &containingObject, &name)) {
qWarning() << Q_FUNC_INFO << "Unknown property" << propertyPrefix + QLatin1Char('.') + toString(propertyId)
<< "on line" << propertyId->identifierToken.startLine
<< "column" << propertyId->identifierToken.startColumn;
qCInfo(texttomodelMergerDebug) << Q_FUNC_INFO << "Unknown property"
<< propertyPrefix + QLatin1Char('.') + toString(propertyId)
<< "on line" << propertyId->identifierToken.startLine
<< "column" << propertyId->identifierToken.startColumn;
return hasQuotes ? QVariant(cleanedValue) : cleverConvert(cleanedValue);
}

View File

@@ -97,17 +97,20 @@ public:
Sqlite::JournalMode::Wal,
Sqlite::LockingMode::Normal};
ImageCacheStorage<Sqlite::Database> storage{database};
ImageCacheConnectionManager connectionManager;
ImageCacheCollector collector{connectionManager,
ImageCacheCollectorNullImageHandling::DontCaptureNullImage};
TimeStampProvider timeStampProvider;
AsynchronousExplicitImageCache cache{storage};
AsynchronousImageFactory factory{storage, timeStampProvider, collector};
};
class QmlDesignerProjectManagerProjectData
{
public:
QmlDesignerProjectManagerProjectData(ImageCacheStorage<Sqlite::Database> &storage)
: factory{storage, timeStampProvider, collector}
{}
ImageCacheConnectionManager connectionManager;
ImageCacheCollector collector{connectionManager,
ImageCacheCollectorNullImageHandling::DontCaptureNullImage};
TimeStampProvider timeStampProvider;
AsynchronousImageFactory factory;
::ProjectExplorer::Target *activeTarget = nullptr;
};
@@ -157,8 +160,8 @@ void QmlDesignerProjectManager::currentEditorChanged(::Core::IEditor *)
m_projectData->activeTarget);
if (qmlBuildSystem) {
m_imageCacheData->collector.setTarget(m_projectData->activeTarget);
m_imageCacheData->factory.generate(qmlBuildSystem->mainFilePath().toString().toUtf8());
m_projectData->collector.setTarget(m_projectData->activeTarget);
m_projectData->factory.generate(qmlBuildSystem->mainFilePath().toString().toUtf8());
}
}
@@ -166,16 +169,14 @@ void QmlDesignerProjectManager::editorsClosed(const QList<::Core::IEditor *> &)
void QmlDesignerProjectManager::projectAdded(::ProjectExplorer::Project *project)
{
m_projectData = std::make_unique<QmlDesignerProjectManagerProjectData>();
m_projectData = std::make_unique<QmlDesignerProjectManagerProjectData>(m_imageCacheData->storage);
m_projectData->activeTarget = project->activeTarget();
}
void QmlDesignerProjectManager::aboutToRemoveProject(::ProjectExplorer::Project *)
{
if (m_projectData) {
m_imageCacheData->collector.setTarget(m_projectData->activeTarget);
if (m_projectData)
m_projectData.reset();
}
}
void QmlDesignerProjectManager::projectRemoved(::ProjectExplorer::Project *) {}

View File

@@ -62,7 +62,7 @@ private:
void projectRemoved(::ProjectExplorer::Project *project);
private:
std::unique_ptr<QmlDesignerProjectManagerProjectData> m_projectData;
std::unique_ptr<PreviewImageCacheData> m_imageCacheData;
std::unique_ptr<QmlDesignerProjectManagerProjectData> m_projectData;
};
} // namespace QmlDesigner

View File

@@ -99,6 +99,11 @@ QmlProjectItem *QmlProjectFileFormat::parseProjectFile(const Utils::FilePath &fi
if (fileSelectorsProperty.isValid())
projectItem->setFileSelectors(fileSelectorsProperty.value.toStringList());
const auto multilanguageSupportProperty = rootNode->property(
QLatin1String("multilanguageSupport"));
if (multilanguageSupportProperty.isValid())
projectItem->setMultilanguageSupport(multilanguageSupportProperty.value.toBool());
const auto languagesProperty = rootNode->property(QLatin1String("supportedLanguages"));
if (languagesProperty.isValid())
projectItem->setSupportedLanguages(languagesProperty.value.toStringList());

View File

@@ -77,6 +77,11 @@ void QmlProjectItem::setFileSelectors(const QStringList &selectors)
m_fileSelectors = selectors;
}
void QmlProjectItem::setMultilanguageSupport(const bool isEnabled)
{
m_multilanguageSupport = isEnabled;
}
void QmlProjectItem::setSupportedLanguages(const QStringList &languages)
{
if (m_supportedLanguages != languages)

View File

@@ -63,6 +63,9 @@ public:
QStringList fileSelectors() const { return m_fileSelectors; }
void setFileSelectors(const QStringList &selectors);
bool multilanguageSupport() const { return m_multilanguageSupport; }
void setMultilanguageSupport(const bool isEnabled);
QStringList supportedLanguages() const { return m_supportedLanguages; }
void setSupportedLanguages(const QStringList &languages);
@@ -94,6 +97,7 @@ protected:
QString m_targetDirectory;
QStringList m_importPaths;
QStringList m_fileSelectors;
bool m_multilanguageSupport;
QStringList m_supportedLanguages;
QString m_primaryLanguage;
QString m_mainFile;

View File

@@ -75,8 +75,9 @@ QmlMultiLanguageAspect::QmlMultiLanguageAspect(ProjectExplorer::Target *target)
{
setVisible(isMultilanguagePresent());
setSettingsKey(Constants::USE_MULTILANGUAGE_KEY);
setLabel(tr("Use MultiLanguage translation database."), BoolAspect::LabelPlacement::AtCheckBox);
setToolTip(tr("Enable loading application with special desktop SQLite translation database."));
setLabel(tr("Use MultiLanguage in Form Editor."), BoolAspect::LabelPlacement::AtCheckBox);
setToolTip(tr("By enabling this Form Editor can read translations\n"
"from MultiLanguage plugin."));
setDefaultValue(!databaseFilePath().isEmpty());
QVariantMap getDefaultValues;

View File

@@ -340,6 +340,13 @@ QStringList QmlBuildSystem::customFileSelectors() const
return {};
}
bool QmlBuildSystem::multilanguageSupport() const
{
if (m_projectItem)
return m_projectItem->multilanguageSupport();
return false;
}
QStringList QmlBuildSystem::supportedLanguages() const
{
if (m_projectItem)

View File

@@ -88,6 +88,7 @@ public:
Utils::EnvironmentItems environment() const;
QStringList customImportPaths() const;
QStringList customFileSelectors() const;
bool multilanguageSupport() const;
QStringList supportedLanguages() const;
void setSupportedLanguages(QStringList languages);
QString primaryLanguage() const;

View File

@@ -120,16 +120,24 @@ QmlProjectRunConfiguration::QmlProjectRunConfiguration(Target *target, Id id)
connect(target, &Target::kitChanged, this, &RunConfiguration::update);
m_multiLanguageAspect = addAspect<QmlMultiLanguageAspect>(target);
auto buildSystem = qobject_cast<const QmlBuildSystem *>(activeBuildSystem());
if (buildSystem)
m_multiLanguageAspect->setValue(buildSystem->multilanguageSupport());
auto envAspect = addAspect<EnvironmentAspect>();
connect(m_multiLanguageAspect, &QmlMultiLanguageAspect::changed, envAspect, &EnvironmentAspect::environmentChanged);
connect(m_multiLanguageAspect,
&QmlMultiLanguageAspect::changed,
envAspect,
&EnvironmentAspect::environmentChanged);
auto envModifier = [this](Environment env) {
if (auto bs = dynamic_cast<const QmlBuildSystem *>(activeBuildSystem()))
if (auto bs = qobject_cast<const QmlBuildSystem *>(activeBuildSystem()))
env.modify(bs->environment());
if (m_multiLanguageAspect && m_multiLanguageAspect->value() && !m_multiLanguageAspect->databaseFilePath().isEmpty()) {
env.set("QT_MULTILANGUAGE_DATABASE", m_multiLanguageAspect->databaseFilePath().toString());
if (m_multiLanguageAspect && m_multiLanguageAspect->value()
&& !m_multiLanguageAspect->databaseFilePath().isEmpty()) {
env.set("QT_MULTILANGUAGE_DATABASE",
m_multiLanguageAspect->databaseFilePath().toString());
env.set("QT_MULTILANGUAGE_LANGUAGE", m_multiLanguageAspect->currentLocale());
} else {
env.unset("QT_MULTILANGUAGE_DATABASE");

View File

@@ -68,6 +68,7 @@ void CreateProject::processFieldPage(ProjectExplorer::JsonFieldPage *page)
auto widthField = dynamic_cast<ProjectExplorer::LineEditField *>(page->jsonField("CustomScreenWidth"));
auto heightField = dynamic_cast<ProjectExplorer::LineEditField *>(page->jsonField("CustomScreenHeight"));
// TODO: use m_wizard to set these text items?
if (widthField && heightField) {
if (!m_customWidth.isEmpty() && !m_customHeight.isEmpty()) {
widthField->setText(m_customWidth);

View File

@@ -170,17 +170,26 @@ void QdsNewDialog::onProjectCanBeCreatedChanged(bool value)
emit fieldsValidChanged();
}
void QdsNewDialog::updateScreenSizes()
{
int index = m_wizard.screenSizeIndex(m_currentPreset->screenSizeName);
if (index > -1) {
setScreenSizeIndex(index);
} else {
index = m_screenSizeModel->appendItem(m_currentPreset->screenSizeName);
setScreenSizeIndex(index);
}
m_screenSizeModel->reset();
}
void QdsNewDialog::onWizardCreated(QStandardItemModel *screenSizeModel, QStandardItemModel *styleModel)
{
m_screenSizeModel->setBackendModel(screenSizeModel);
m_styleModel->setBackendModel(styleModel);
if (m_qmlDetailsLoaded) {
int index = m_wizard.screenSizeIndex(m_currentPreset->screenSizeName);
if (index > -1)
setScreenSizeIndex(index);
m_screenSizeModel->reset();
updateScreenSizes();
emit haveVirtualKeyboardChanged();
emit haveTargetQtVersionChanged();
@@ -288,11 +297,7 @@ void QdsNewDialog::setWizardFactories(QList<Core::IWizardFactory *> factories_,
emit projectLocationChanged(); // So that QML knows to update the field
if (m_qmlDetailsLoaded) {
int index = m_wizard.screenSizeIndex(m_currentPreset->screenSizeName);
if (index > -1)
setScreenSizeIndex(index);
m_screenSizeModel->reset();
updateScreenSizes();
}
if (m_qmlStylesLoaded)
@@ -334,9 +339,9 @@ void QdsNewDialog::accept()
.execute();
PresetItem item = m_wizard.preset();
QString screenSize = m_wizard.screenSizeName(m_qmlScreenSizeIndex);
QString customSizeName = m_qmlCustomWidth + " x " + m_qmlCustomHeight;
m_recentsStore.add(item.categoryId, item.name, screenSize);
m_recentsStore.add(item.categoryId, item.name, customSizeName);
m_dialog->close();
m_dialog->deleteLater();

View File

@@ -131,6 +131,8 @@ private:
QString projectDescription() const { return m_qmlProjectDescription; }
void updateScreenSizes();
private slots:
void onDeletingWizard();
void onWizardCreated(QStandardItemModel *screenSizeModel, QStandardItemModel *styleModel);

View File

@@ -0,0 +1,119 @@
/****************************************************************************
**
** Copyright (C) 2021 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of Qt Creator.
**
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 3 as published by the Free Software
** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
**
****************************************************************************/
import QtQuick 2.15
import QtQuick.Templates 2.15
import ExampleCheckout 1.0
import StudioTheme 1.0
Button {
id: control
implicitWidth: Math.max(
buttonBackground ? buttonBackground.implicitWidth : 0,
textItem.implicitWidth + leftPadding + rightPadding)
implicitHeight: Math.max(
buttonBackground ? buttonBackground.implicitHeight : 0,
textItem.implicitHeight + topPadding + bottomPadding)
leftPadding: 4
rightPadding: 4
text: "My Button"
property alias fontpixelSize: textItem.font.pixelSize
//property bool decorated: false
state: "normal"
background: buttonBackground
Rectangle {
id: buttonBackground
color: "#00000000"
implicitWidth: 100
implicitHeight: 40
opacity: enabled ? 1 : 0.3
radius: 2
border.color: "#047eff"
anchors.fill: parent
}
contentItem: textItem
Text {
id: textItem
text: control.text
font.pixelSize: 18
opacity: enabled ? 1.0 : 0.3
color: Values.themeTextColor
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter
}
states: [
State {
name: "normal"
when: !control.down && !control.hovered
PropertyChanges {
target: buttonBackground
color: Values.themeControlBackground
border.color: Values.themeControlOutline
}
PropertyChanges {
target: textItem
color: Values.themeTextColor
}
},
State {
name: "hover"
when: control.hovered && !control.down
PropertyChanges {
target: textItem
color: Values.themeTextColor
}
PropertyChanges {
target: buttonBackground
color: Values.themeControlBackgroundHover
border.color: Values.themeControlOutline
}
},
State {
name: "activeQds"
when: control.down
PropertyChanges {
target: textItem
color: "#ffffff"
}
PropertyChanges {
target: buttonBackground
color: "#2e769e"
border.color: "#00000000"
}
}
]
}

View File

@@ -30,17 +30,23 @@ import ExampleCheckout 1.0
import QtQuick.Layouts 1.11
import StudioFonts 1.0
import StudioTheme 1.0
Rectangle {
property color currentThemeBackground: Values.welcomeScreenBackground
property color themeTextColor: Values.themeTextColor
id: root
property alias url: downloader.url
property string path: fileExtractor.targetPath
width: 620
height: 300
color: "#2d2e30"
color: root.currentThemeBackground
property color textColor: "#b9b9ba"
property color textColor: Values.themeTextColor
signal canceled
signal accepted
@@ -51,7 +57,7 @@ Rectangle {
StackLayout {
id: stackLayout
anchors.fill: parent
currentIndex: root.tempFile.length === 0 ? 0 : 1
currentIndex: root.tempFile.length === 0 ? 1 : 1
FileExtractor {
id: fileExtractor
@@ -76,7 +82,7 @@ Rectangle {
Layout.fillHeight: true
Layout.fillWidth: true
DialogButton {
PushButton {
id: button
x: 532
y: 432
@@ -87,6 +93,7 @@ Rectangle {
anchors.rightMargin: 20
enabled: false
onClicked: stackLayout.currentIndex = 1
}
CoolProgressBar {
@@ -106,7 +113,7 @@ Rectangle {
anchors.horizontalCenter: parent.horizontalCenter
}
DialogButton {
PushButton{
id: downloadbutton
y: 420
enabled: !button.enabled
@@ -119,6 +126,7 @@ Rectangle {
downloadbutton.enabled = false
downloader.start()
}
}
CircularIndicator {
@@ -138,7 +146,7 @@ Rectangle {
Layout.fillHeight: true
Layout.fillWidth: true
DialogButton {
PushButton {
id: nextPageDestination
x: 532
y: 432
@@ -152,6 +160,7 @@ Rectangle {
stackLayout.currentIndex = 2
fileExtractor.extract()
}
}
RowLayout {
@@ -171,7 +180,7 @@ Rectangle {
readOnly: true
}
DialogButton {
PushButton{
id: browse
text: qsTr("Browse")
onClicked: fileExtractor.browse()
@@ -189,7 +198,7 @@ Rectangle {
visible: !nextPageDestination.enabled
}
DialogButton {
PushButton{
id: button5
x: 400
y: 420
@@ -199,6 +208,7 @@ Rectangle {
anchors.bottomMargin: 20
anchors.rightMargin: 20
onClicked: root.canceled()
}
DialogLabel {
@@ -215,8 +225,7 @@ Rectangle {
Layout.fillHeight: true
Layout.fillWidth: true
DialogButton {
PushButton{
id: done
x: 532
y: 432
@@ -227,6 +236,7 @@ Rectangle {
anchors.rightMargin: 20
enabled: fileExtractor.finished
onClicked: root.accepted()
}
@@ -241,8 +251,7 @@ Rectangle {
anchors.bottomMargin: 20
}
DialogButton {
PushButton{
id: details
x: 8
text: qsTr("Details")
@@ -250,6 +259,7 @@ Rectangle {
anchors.topMargin: 66
anchors.horizontalCenter: parent.horizontalCenter
checkable: true
}
@@ -291,7 +301,7 @@ Rectangle {
Layout.fillHeight: true
Layout.fillWidth: true
DialogButton {
PushButton{
id: finish
x: 532
y: 432
@@ -301,6 +311,7 @@ Rectangle {
anchors.bottomMargin: 20
anchors.rightMargin: 20
onClicked: root.canceled()
}
DialogLabel {

View File

@@ -87,6 +87,12 @@ public:
return {};
}
int appendItem(const QString &text)
{
m_backendModel->appendRow(new QStandardItem{text});
return rowCount(QModelIndex{}) - 1;
}
QHash<int, QByteArray> roleNames() const override
{
if (m_backendModel)