QmlDesigner: Generate material browser texture icons using provider

Provider allows using special generation methods for hdr images, which
QImage doesn't support.

Task-number: QDS-8296
Change-Id: I829199264ff4a5eb677d65c908eacd1e20ad94e5
Reviewed-by: Mahmoud Badri <mahmoud.badri@qt.io>
Reviewed-by: <github-actions-qt-creator@cristianadam.eu>
This commit is contained in:
Miikka Heikkinen
2022-11-14 16:26:42 +02:00
parent 96b0cda1c9
commit 69461e4c68
13 changed files with 43 additions and 6 deletions

View File

@@ -37,7 +37,7 @@ Rectangle {
}
Image {
source: textureSource
source: "image://materialBrowserTex/" + textureSource
sourceSize.width: root.width - 10
sourceSize.height: root.height - 10
anchors.centerIn: parent

View File

@@ -1,7 +1,5 @@
<RCC>
<qresource prefix="/AssetsLibrary">
<file>images/asset_default.png</file>
<file>images/asset_default@2x.png</file>
<file>images/asset_shader.png</file>
<file>images/asset_shader@2x.png</file>
<file>images/asset_shader_128.png</file>
@@ -12,5 +10,8 @@
<file>images/asset_video@2x.png</file>
<file>images/browse.png</file>
<file>images/browse@2x.png</file>
<file>images/assets_default.png</file>
<file>images/assets_default@2x.png</file>
<file>images/assets_default_128.png</file>
</qresource>
</RCC>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 312 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 346 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 KiB

View File

@@ -35,7 +35,7 @@ QVariant MaterialBrowserTexturesModel::data(const QModelIndex &index, int role)
QByteArray roleName = roleNames().value(role);
if (roleName == "textureSource") {
QString source = m_textureList.at(index.row()).variantProperty("source").value().toString();
return QUrl::fromLocalFile(DocumentManager::currentResourcePath().path() + '/' + source);
return QVariant(DocumentManager::currentResourcePath().path() + '/' + source);
}
if (roleName == "textureVisible")

View File

@@ -18,6 +18,7 @@
#include <utils/algorithm.h>
#include <utils/environment.h>
#include <utils/hdrimage.h>
#include <utils/qtcassert.h>
#include <utils/stylehelper.h>
@@ -88,6 +89,33 @@ public:
}
};
class TextureImageProvider : public QQuickImageProvider
{
public:
TextureImageProvider() : QQuickImageProvider(Pixmap) {}
QPixmap requestPixmap(const QString &id, QSize *size, const QSize &requestedSize) override
{
QPixmap pixmap;
const QString suffix = id.split('.').last().toLower();
if (suffix == "hdr")
pixmap = HdrImage{id}.toPixmap();
else
pixmap = Utils::StyleHelper::dpiSpecificImageFile(id);
if (pixmap.isNull())
pixmap = Utils::StyleHelper::dpiSpecificImageFile(":/materialeditor/images/texture_default.png");
if (size)
*size = pixmap.size();
if (requestedSize.isValid())
return pixmap.scaled(requestedSize, Qt::KeepAspectRatio);
return pixmap;
}
};
bool MaterialBrowserWidget::eventFilter(QObject *obj, QEvent *event)
{
if (event->type() == QEvent::FocusOut) {
@@ -119,8 +147,9 @@ bool MaterialBrowserWidget::eventFilter(QObject *obj, QEvent *event)
QString iconPath = QLatin1String("%1/%2")
.arg(DocumentManager::currentResourcePath().path(),
m_textureToDrag.variantProperty("source").value().toString());
model->startDrag(mimeData, QPixmap(iconPath).scaled({128, 128}));
model->startDrag(mimeData,
m_textureImageProvider->requestPixmap(iconPath, nullptr,
{128, 128}));
}
m_materialToDrag = {};
m_textureToDrag = {};
@@ -140,6 +169,7 @@ MaterialBrowserWidget::MaterialBrowserWidget(MaterialBrowserView *view)
, m_materialBrowserTexturesModel(new MaterialBrowserTexturesModel(this))
, m_quickWidget(new QQuickWidget(this))
, m_previewImageProvider(new PreviewImageProvider())
, m_textureImageProvider(new TextureImageProvider())
{
setWindowTitle(tr("Material Browser", "Title of material browser widget"));
setMinimumWidth(120);
@@ -160,6 +190,8 @@ MaterialBrowserWidget::MaterialBrowserWidget(MaterialBrowserView *view)
});
m_quickWidget->engine()->addImageProvider("materialBrowser", m_previewImageProvider);
m_quickWidget->engine()->addImageProvider("materialBrowserTex", m_textureImageProvider);
Theme::setupTheme(m_quickWidget->engine());
m_quickWidget->installEventFilter(this);

View File

@@ -28,6 +28,7 @@ class MaterialBrowserView;
class MaterialBrowserModel;
class MaterialBrowserTexturesModel;
class PreviewImageProvider;
class TextureImageProvider;
class MaterialBrowserWidget : public QFrame
{
@@ -70,6 +71,7 @@ private:
QShortcut *m_qmlSourceUpdateShortcut = nullptr;
PreviewImageProvider *m_previewImageProvider = nullptr;
TextureImageProvider *m_textureImageProvider = nullptr;
Core::IContext *m_context = nullptr;
QString m_filterText;

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.5 KiB

View File

@@ -1,5 +1,7 @@
<RCC>
<qresource prefix="/materialeditor">
<file>images/defaultmaterialpreview.png</file>
<file>images/texture_default.png</file>
<file>images/texture_default@2x.png</file>
</qresource>
</RCC>