forked from qt-creator/qt-creator
QmlDesigner: Add states to ImageCache
Task-number: QDS-2998 Change-Id: I8e65881181ae1010ef1f8bab92fa71d92c961bcd Reviewed-by: Thomas Hartmann <thomas.hartmann@qt.io>
This commit is contained in:
@@ -44,6 +44,7 @@ ImageCache::ImageCache(ImageCacheStorageInterface &storage,
|
||||
while (isRunning()) {
|
||||
if (auto [hasEntry, entry] = getEntry(); hasEntry) {
|
||||
request(entry.name,
|
||||
entry.state,
|
||||
entry.requestType,
|
||||
std::move(entry.captureCallback),
|
||||
std::move(entry.abortCallback),
|
||||
@@ -64,6 +65,7 @@ ImageCache::~ImageCache()
|
||||
}
|
||||
|
||||
void ImageCache::request(Utils::SmallStringView name,
|
||||
Utils::SmallStringView state,
|
||||
ImageCache::RequestType requestType,
|
||||
ImageCache::CaptureCallback captureCallback,
|
||||
ImageCache::AbortCallback abortCallback,
|
||||
@@ -71,9 +73,11 @@ void ImageCache::request(Utils::SmallStringView name,
|
||||
ImageCacheGeneratorInterface &generator,
|
||||
TimeStampProviderInterface &timeStampProvider)
|
||||
{
|
||||
const auto id = state.empty() ? Utils::PathString{name} : Utils::PathString{name, "+", state};
|
||||
|
||||
const auto timeStamp = timeStampProvider.timeStamp(name);
|
||||
const auto entry = requestType == RequestType::Image ? storage.fetchImage(name, timeStamp)
|
||||
: storage.fetchIcon(name, timeStamp);
|
||||
const auto entry = requestType == RequestType::Image ? storage.fetchImage(id, timeStamp)
|
||||
: storage.fetchIcon(id, timeStamp);
|
||||
|
||||
if (entry.hasEntry) {
|
||||
if (entry.image.isNull())
|
||||
@@ -81,7 +85,11 @@ void ImageCache::request(Utils::SmallStringView name,
|
||||
else
|
||||
captureCallback(entry.image);
|
||||
} else {
|
||||
generator.generateImage(name, timeStamp, std::move(captureCallback), std::move(abortCallback));
|
||||
generator.generateImage(name,
|
||||
state,
|
||||
timeStamp,
|
||||
std::move(captureCallback),
|
||||
std::move(abortCallback));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -95,17 +103,27 @@ void ImageCache::wait()
|
||||
|
||||
void ImageCache::requestImage(Utils::PathString name,
|
||||
ImageCache::CaptureCallback captureCallback,
|
||||
AbortCallback abortCallback)
|
||||
AbortCallback abortCallback,
|
||||
Utils::SmallString state)
|
||||
{
|
||||
addEntry(std::move(name), std::move(captureCallback), std::move(abortCallback), RequestType::Image);
|
||||
addEntry(std::move(name),
|
||||
std::move(state),
|
||||
std::move(captureCallback),
|
||||
std::move(abortCallback),
|
||||
RequestType::Image);
|
||||
m_condition.notify_all();
|
||||
}
|
||||
|
||||
void ImageCache::requestIcon(Utils::PathString name,
|
||||
ImageCache::CaptureCallback captureCallback,
|
||||
ImageCache::AbortCallback abortCallback)
|
||||
ImageCache::AbortCallback abortCallback,
|
||||
Utils::SmallString state)
|
||||
{
|
||||
addEntry(std::move(name), std::move(captureCallback), std::move(abortCallback), RequestType::Icon);
|
||||
addEntry(std::move(name),
|
||||
std::move(state),
|
||||
std::move(captureCallback),
|
||||
std::move(abortCallback),
|
||||
RequestType::Icon);
|
||||
m_condition.notify_all();
|
||||
}
|
||||
|
||||
@@ -136,6 +154,7 @@ std::tuple<bool, ImageCache::Entry> ImageCache::getEntry()
|
||||
}
|
||||
|
||||
void ImageCache::addEntry(Utils::PathString &&name,
|
||||
Utils::SmallString &&state,
|
||||
ImageCache::CaptureCallback &&captureCallback,
|
||||
AbortCallback &&abortCallback,
|
||||
RequestType requestType)
|
||||
@@ -143,6 +162,7 @@ void ImageCache::addEntry(Utils::PathString &&name,
|
||||
std::unique_lock lock{m_mutex};
|
||||
|
||||
m_entries.emplace_back(std::move(name),
|
||||
std::move(state),
|
||||
std::move(captureCallback),
|
||||
std::move(abortCallback),
|
||||
requestType);
|
||||
|
||||
@@ -67,6 +67,7 @@ ImageCacheCollector::ImageCacheCollector(ImageCacheConnectionManager &connection
|
||||
ImageCacheCollector::~ImageCacheCollector() = default;
|
||||
|
||||
void ImageCacheCollector::start(Utils::SmallStringView name,
|
||||
Utils::SmallStringView state,
|
||||
CaptureCallback captureCallback,
|
||||
AbortCallback abortCallback)
|
||||
{
|
||||
@@ -91,6 +92,11 @@ void ImageCacheCollector::start(Utils::SmallStringView name,
|
||||
return;
|
||||
}
|
||||
|
||||
ModelNode stateNode = rewriterView.modelNodeForId(QString{state});
|
||||
|
||||
if (stateNode.isValid())
|
||||
rewriterView.setCurrentStateNode(stateNode);
|
||||
|
||||
m_connectionManager.setCallback(std::move(captureCallback));
|
||||
|
||||
nodeInstanceView.setTarget(m_target.get());
|
||||
|
||||
@@ -53,6 +53,7 @@ public:
|
||||
~ImageCacheCollector();
|
||||
|
||||
void start(Utils::SmallStringView filePath,
|
||||
Utils::SmallStringView state,
|
||||
CaptureCallback captureCallback,
|
||||
AbortCallback abortCallback) override;
|
||||
|
||||
|
||||
@@ -38,6 +38,7 @@ public:
|
||||
using AbortCallback = std::function<void()>;
|
||||
|
||||
virtual void start(Utils::SmallStringView filePath,
|
||||
Utils::SmallStringView state,
|
||||
CaptureCallback captureCallback,
|
||||
AbortCallback abortCallback)
|
||||
= 0;
|
||||
|
||||
@@ -47,14 +47,20 @@ ImageCacheGenerator::~ImageCacheGenerator()
|
||||
waitForFinished();
|
||||
}
|
||||
|
||||
void ImageCacheGenerator::generateImage(Utils::SmallStringView name,
|
||||
Sqlite::TimeStamp timeStamp,
|
||||
ImageCacheGeneratorInterface::CaptureCallback &&captureCallback,
|
||||
AbortCallback &&abortCallback)
|
||||
void ImageCacheGenerator::generateImage(
|
||||
Utils::SmallStringView name,
|
||||
Utils::SmallStringView state,
|
||||
Sqlite::TimeStamp timeStamp,
|
||||
ImageCacheGeneratorInterface::CaptureCallback &&captureCallback,
|
||||
AbortCallback &&abortCallback)
|
||||
{
|
||||
{
|
||||
std::lock_guard lock{m_mutex};
|
||||
m_tasks.emplace_back(name, timeStamp, std::move(captureCallback), std::move(abortCallback));
|
||||
m_tasks.emplace_back(name,
|
||||
state,
|
||||
timeStamp,
|
||||
std::move(captureCallback),
|
||||
std::move(abortCallback));
|
||||
}
|
||||
|
||||
m_condition.notify_all();
|
||||
@@ -99,6 +105,7 @@ void ImageCacheGenerator::startGeneration()
|
||||
|
||||
m_collector.start(
|
||||
task.filePath,
|
||||
task.state,
|
||||
[this, task](QImage &&image) {
|
||||
if (image.isNull())
|
||||
task.abortCallback();
|
||||
|
||||
@@ -51,6 +51,7 @@ public:
|
||||
~ImageCacheGenerator();
|
||||
|
||||
void generateImage(Utils::SmallStringView filePath,
|
||||
Utils::SmallStringView state,
|
||||
Sqlite::TimeStamp timeStamp,
|
||||
CaptureCallback &&captureCallback,
|
||||
AbortCallback &&abortCallback) override;
|
||||
@@ -63,16 +64,19 @@ private:
|
||||
{
|
||||
Task() = default;
|
||||
Task(Utils::SmallStringView filePath,
|
||||
Utils::SmallStringView state,
|
||||
Sqlite::TimeStamp timeStamp,
|
||||
CaptureCallback &&captureCallback,
|
||||
AbortCallback &&abortCallback)
|
||||
: filePath(filePath)
|
||||
, state(std::move(state))
|
||||
, captureCallback(std::move(captureCallback))
|
||||
, abortCallback(std::move(abortCallback))
|
||||
, timeStamp(timeStamp)
|
||||
{}
|
||||
|
||||
Utils::PathString filePath;
|
||||
Utils::SmallString state;
|
||||
CaptureCallback captureCallback;
|
||||
AbortCallback abortCallback;
|
||||
Sqlite::TimeStamp timeStamp;
|
||||
|
||||
@@ -39,6 +39,7 @@ public:
|
||||
using AbortCallback = std::function<void()>;
|
||||
|
||||
virtual void generateImage(Utils::SmallStringView name,
|
||||
Utils::SmallStringView state,
|
||||
Sqlite::TimeStamp timeStamp,
|
||||
CaptureCallback &&captureCallback,
|
||||
AbortCallback &&abortCallback)
|
||||
|
||||
@@ -54,10 +54,12 @@ public:
|
||||
|
||||
void requestImage(Utils::PathString name,
|
||||
CaptureCallback captureCallback,
|
||||
AbortCallback abortCallback);
|
||||
AbortCallback abortCallback,
|
||||
Utils::SmallString state = {});
|
||||
void requestIcon(Utils::PathString name,
|
||||
CaptureCallback captureCallback,
|
||||
AbortCallback abortCallback);
|
||||
AbortCallback abortCallback,
|
||||
Utils::SmallString state = {});
|
||||
|
||||
void clean();
|
||||
void waitForFinished();
|
||||
@@ -68,16 +70,19 @@ private:
|
||||
{
|
||||
Entry() = default;
|
||||
Entry(Utils::PathString name,
|
||||
Utils::SmallString state,
|
||||
CaptureCallback &&captureCallback,
|
||||
AbortCallback &&abortCallback,
|
||||
RequestType requestType)
|
||||
: name{std::move(name)}
|
||||
, state{std::move(state)}
|
||||
, captureCallback{std::move(captureCallback)}
|
||||
, abortCallback{std::move(abortCallback)}
|
||||
, requestType{requestType}
|
||||
{}
|
||||
|
||||
Utils::PathString name;
|
||||
Utils::SmallString state;
|
||||
CaptureCallback captureCallback;
|
||||
AbortCallback abortCallback;
|
||||
RequestType requestType = RequestType::Image;
|
||||
@@ -85,6 +90,7 @@ private:
|
||||
|
||||
std::tuple<bool, Entry> getEntry();
|
||||
void addEntry(Utils::PathString &&name,
|
||||
Utils::SmallString &&state,
|
||||
CaptureCallback &&captureCallback,
|
||||
AbortCallback &&abortCallback,
|
||||
RequestType requestType);
|
||||
@@ -93,6 +99,7 @@ private:
|
||||
void stopThread();
|
||||
bool isRunning();
|
||||
static void request(Utils::SmallStringView name,
|
||||
Utils::SmallStringView state,
|
||||
ImageCache::RequestType requestType,
|
||||
ImageCache::CaptureCallback captureCallback,
|
||||
ImageCache::AbortCallback abortCallback,
|
||||
|
||||
@@ -856,7 +856,7 @@ CreateSceneCommand NodeInstanceView::createCreateSceneCommand()
|
||||
QList<ModelNode> nodeList = allModelNodes();
|
||||
QList<NodeInstance> instanceList;
|
||||
|
||||
foreach (const ModelNode &node, nodeList) {
|
||||
for (const ModelNode &node : std::as_const(nodeList)) {
|
||||
NodeInstance instance = loadNode(node);
|
||||
if (!isSkippedNode(node))
|
||||
instanceList.append(instance);
|
||||
@@ -868,7 +868,7 @@ CreateSceneCommand NodeInstanceView::createCreateSceneCommand()
|
||||
QList<BindingProperty> bindingPropertyList;
|
||||
|
||||
QVector<PropertyValueContainer> auxiliaryContainerVector;
|
||||
foreach (const ModelNode &node, nodeList) {
|
||||
for (const ModelNode &node : std::as_const(nodeList)) {
|
||||
variantPropertyList.append(node.variantProperties());
|
||||
bindingPropertyList.append(node.bindingProperties());
|
||||
if (node.isValid() && hasInstanceForModelNode(node)) {
|
||||
@@ -883,9 +883,8 @@ CreateSceneCommand NodeInstanceView::createCreateSceneCommand()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
QVector<InstanceContainer> instanceContainerList;
|
||||
foreach (const NodeInstance &instance, instanceList) {
|
||||
for (const NodeInstance &instance : std::as_const(instanceList)) {
|
||||
InstanceContainer::NodeSourceType nodeSourceType = static_cast<InstanceContainer::NodeSourceType>(instance.modelNode().nodeSourceType());
|
||||
|
||||
InstanceContainer::NodeMetaType nodeMetaType = InstanceContainer::ObjectMetaType;
|
||||
@@ -911,7 +910,7 @@ CreateSceneCommand NodeInstanceView::createCreateSceneCommand()
|
||||
}
|
||||
|
||||
QVector<ReparentContainer> reparentContainerList;
|
||||
foreach (const NodeInstance &instance, instanceList) {
|
||||
for (const NodeInstance &instance : std::as_const(instanceList)) {
|
||||
if (instance.modelNode().hasParentProperty()) {
|
||||
NodeAbstractProperty parentProperty = instance.modelNode().parentProperty();
|
||||
ReparentContainer container(instance.instanceId(), -1, PropertyName(), instanceForModelNode(parentProperty.parentModelNode()).instanceId(), parentProperty.name());
|
||||
@@ -920,7 +919,7 @@ CreateSceneCommand NodeInstanceView::createCreateSceneCommand()
|
||||
}
|
||||
|
||||
QVector<IdContainer> idContainerList;
|
||||
foreach (const NodeInstance &instance, instanceList) {
|
||||
for (const NodeInstance &instance : std::as_const(instanceList)) {
|
||||
QString id = instance.modelNode().id();
|
||||
if (!id.isEmpty()) {
|
||||
IdContainer container(instance.instanceId(), id);
|
||||
@@ -929,7 +928,7 @@ CreateSceneCommand NodeInstanceView::createCreateSceneCommand()
|
||||
}
|
||||
|
||||
QVector<PropertyValueContainer> valueContainerList;
|
||||
foreach (const VariantProperty &property, variantPropertyList) {
|
||||
for (const VariantProperty &property : std::as_const(variantPropertyList)) {
|
||||
ModelNode node = property.parentModelNode();
|
||||
if (node.isValid() && hasInstanceForModelNode(node)) {
|
||||
NodeInstance instance = instanceForModelNode(node);
|
||||
@@ -939,7 +938,7 @@ CreateSceneCommand NodeInstanceView::createCreateSceneCommand()
|
||||
}
|
||||
|
||||
QVector<PropertyBindingContainer> bindingContainerList;
|
||||
foreach (const BindingProperty &property, bindingPropertyList) {
|
||||
for (const BindingProperty &property : std::as_const(bindingPropertyList)) {
|
||||
ModelNode node = property.parentModelNode();
|
||||
if (node.isValid() && hasInstanceForModelNode(node)) {
|
||||
NodeInstance instance = instanceForModelNode(node);
|
||||
@@ -949,7 +948,7 @@ CreateSceneCommand NodeInstanceView::createCreateSceneCommand()
|
||||
}
|
||||
|
||||
QVector<AddImportContainer> importVector;
|
||||
foreach (const Import &import, model()->imports())
|
||||
for (const Import &import : model()->imports())
|
||||
importVector.append(AddImportContainer(import.url(), import.file(), import.version(), import.alias(), import.importPaths()));
|
||||
|
||||
QVector<MockupTypeContainer> mockupTypesVector;
|
||||
@@ -993,19 +992,23 @@ CreateSceneCommand NodeInstanceView::createCreateSceneCommand()
|
||||
if (auto multiLanguageAspect = QmlProjectManager::QmlMultiLanguageAspect::current(m_currentTarget))
|
||||
lastUsedLanguage = multiLanguageAspect->currentLocale();
|
||||
|
||||
return CreateSceneCommand(
|
||||
instanceContainerList,
|
||||
reparentContainerList,
|
||||
idContainerList,
|
||||
valueContainerList,
|
||||
bindingContainerList,
|
||||
auxiliaryContainerVector,
|
||||
importVector,
|
||||
mockupTypesVector,
|
||||
model()->fileUrl(),
|
||||
m_edit3DToolStates[model()->fileUrl()],
|
||||
lastUsedLanguage
|
||||
);
|
||||
ModelNode stateNode = currentStateNode();
|
||||
qint32 stateInstanceId = 0;
|
||||
if (stateNode.isValid() && stateNode.metaInfo().isSubclassOf("QtQuick.State", 1, 0))
|
||||
stateInstanceId = stateNode.internalId();
|
||||
|
||||
return CreateSceneCommand(instanceContainerList,
|
||||
reparentContainerList,
|
||||
idContainerList,
|
||||
valueContainerList,
|
||||
bindingContainerList,
|
||||
auxiliaryContainerVector,
|
||||
importVector,
|
||||
mockupTypesVector,
|
||||
model()->fileUrl(),
|
||||
m_edit3DToolStates[model()->fileUrl()],
|
||||
lastUsedLanguage,
|
||||
stateInstanceId);
|
||||
}
|
||||
|
||||
ClearSceneCommand NodeInstanceView::createClearSceneCommand() const
|
||||
|
||||
Reference in New Issue
Block a user