From 84cb69e12768b1d4b87c272045be9e2dc3ae89f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C3=ABl=20Lemaire?= Date: Mon, 14 Sep 2015 01:35:25 +0200 Subject: [PATCH] Added cancel button on render dialog --- .../modeler/quickapp/MainModelerWindow.cpp | 2 -- .../quickapp/RenderPreviewProvider.cpp | 7 +++++ .../modeler/quickapp/RenderPreviewProvider.h | 5 ++++ .../modeler/quickapp/RenderProcess.cpp | 16 ++++++++++- .../modeler/quickapp/RenderProcess.h | 10 +++---- .../modeler/quickapp/qml/RenderDialog.qml | 25 +++++++++++++++++- .../modeler/quickapp/qml/ToolbarButton.qml | 21 +++++++++------ src/interface/modeler/quickapp/qml/app.qrc | 1 + .../quickapp/qml/images/icon_cancel.png | Bin 0 -> 13086 bytes 9 files changed, 70 insertions(+), 17 deletions(-) create mode 100644 src/interface/modeler/quickapp/qml/images/icon_cancel.png diff --git a/src/interface/modeler/quickapp/MainModelerWindow.cpp b/src/interface/modeler/quickapp/MainModelerWindow.cpp index 6f0b9aa..b93a975 100644 --- a/src/interface/modeler/quickapp/MainModelerWindow.cpp +++ b/src/interface/modeler/quickapp/MainModelerWindow.cpp @@ -131,8 +131,6 @@ void MainModelerWindow::keyReleaseEvent(QKeyEvent *event) if (event->key() == Qt::Key_Escape) { render_process->stopRender(); - - setState(rootObject()->property("previous_state").toString()); } } else diff --git a/src/interface/modeler/quickapp/RenderPreviewProvider.cpp b/src/interface/modeler/quickapp/RenderPreviewProvider.cpp index 68eb364..f562466 100644 --- a/src/interface/modeler/quickapp/RenderPreviewProvider.cpp +++ b/src/interface/modeler/quickapp/RenderPreviewProvider.cpp @@ -15,6 +15,7 @@ RenderPreviewProvider::RenderPreviewProvider() : { canvas = NULL; pixbuf = new QImage(1, 1, QImage::Format_ARGB32); + hide(); } RenderPreviewProvider::~RenderPreviewProvider() @@ -42,6 +43,7 @@ void RenderPreviewProvider::setCanvas(const Canvas *canvas) if (not this->canvas) { this->canvas = canvas; + pixbuf->fill(Qt::black); canvas->getPreview()->initLive(this); } } @@ -55,6 +57,11 @@ void RenderPreviewProvider::releaseCanvas() } } +void RenderPreviewProvider::hide() +{ + pixbuf->fill(Qt::black); +} + void RenderPreviewProvider::setToneMapping(const ColorProfile &profile) { if (canvas) diff --git a/src/interface/modeler/quickapp/RenderPreviewProvider.h b/src/interface/modeler/quickapp/RenderPreviewProvider.h index d11708c..4164c73 100644 --- a/src/interface/modeler/quickapp/RenderPreviewProvider.h +++ b/src/interface/modeler/quickapp/RenderPreviewProvider.h @@ -30,6 +30,11 @@ public: */ void releaseCanvas(); + /** + * Call when the image is hidden, to clear it for next render. + */ + void hide(); + /** * Set the tone mapping to apply to pixel colors. */ diff --git a/src/interface/modeler/quickapp/RenderProcess.cpp b/src/interface/modeler/quickapp/RenderProcess.cpp index ce2958b..c625ea7 100644 --- a/src/interface/modeler/quickapp/RenderProcess.cpp +++ b/src/interface/modeler/quickapp/RenderProcess.cpp @@ -2,6 +2,7 @@ #include #include +#include #include "MainModelerWindow.h" #include "SoftwareCanvasRenderer.h" #include "RenderPreviewProvider.h" @@ -55,6 +56,11 @@ RenderProcess::RenderProcess(MainModelerWindow *window, RenderPreviewProvider *d connect(button_show, SIGNAL(clicked()), this, SLOT(showPreviousRender())); } + QObject *button_cancel = window->findQmlObject("render_cancel"); + if (button_cancel) { + connect(button_cancel, SIGNAL(clicked()), this, SLOT(stopRender())); + } + startTimer(100); } @@ -107,7 +113,7 @@ void RenderProcess::startRender(Scenery *scenery, const RenderConfig &config) // Resize preview QSize preview_size = getPreviewSize(); - QObject *image = window->findQmlObject("preview_image"); + QObject *image = window->findQmlObject("render_preview_image"); if (image) { image->setProperty("width", preview_size.width()); image->setProperty("height", preview_size.height()); @@ -143,6 +149,9 @@ void RenderProcess::showPreviousRender() { if (not rendering and has_render) { + destination->setCanvas(renderer->getCanvas()); + destination->releaseCanvas(); + window->setState("Render Dialog"); } } @@ -153,6 +162,11 @@ void RenderProcess::stopRender() { renderer->interrupt(); } + else + { + destination->hide(); + window->setState(window->rootObject()->property("previous_state").toString()); + } } const QSize RenderProcess::getPreviewSize() diff --git a/src/interface/modeler/quickapp/RenderProcess.h b/src/interface/modeler/quickapp/RenderProcess.h index 273f6ca..e5dc0b7 100644 --- a/src/interface/modeler/quickapp/RenderProcess.h +++ b/src/interface/modeler/quickapp/RenderProcess.h @@ -21,11 +21,6 @@ public: */ void startRender(Scenery *scenery, const RenderConfig &config); - /** - * Stop any currently running render. - */ - void stopRender(); - /** * Get the size of the preview image. */ @@ -54,6 +49,11 @@ public slots: */ void showPreviousRender(); + /** + * Stop any currently running render. + */ + void stopRender(); + protected: virtual void timerEvent(QTimerEvent *event) override; diff --git a/src/interface/modeler/quickapp/qml/RenderDialog.qml b/src/interface/modeler/quickapp/qml/RenderDialog.qml index 20b2c47..5b088bd 100644 --- a/src/interface/modeler/quickapp/qml/RenderDialog.qml +++ b/src/interface/modeler/quickapp/qml/RenderDialog.qml @@ -1,9 +1,11 @@ import QtQuick 2.2 import QtQuick.Controls 1.2 +import QtGraphicalEffects 1.0 BaseRectangle { width: 400 height: 300 + color: "#222429" function refresh() { preview_image.source = ""; @@ -18,9 +20,29 @@ BaseRectangle { } } + ToolbarButton { + id: render_cancel + objectName: "render_cancel" + picture: "images/icon_cancel.png" + anchors.top: parent.top + anchors.right: parent.right + anchors.margins: 10 + checkable: false + image_width: 48 + image_height: 48 + } + + RectangularGlow { + anchors.fill: preview_image + glowRadius: 8 + spread: 0.2 + color: "#e0e0e8" + cornerRadius: glowRadius + } + Image { id: preview_image - objectName: "preview_image" + objectName: "render_preview_image" anchors.centerIn: parent width: 100 height: 100 @@ -43,6 +65,7 @@ BaseRectangle { anchors.top: render_progress.bottom anchors.horizontalCenter: render_progress.horizontalCenter anchors.topMargin: 20 + color: "#dddddd" } Timer { diff --git a/src/interface/modeler/quickapp/qml/ToolbarButton.qml b/src/interface/modeler/quickapp/qml/ToolbarButton.qml index 2453030..9ec71c7 100644 --- a/src/interface/modeler/quickapp/qml/ToolbarButton.qml +++ b/src/interface/modeler/quickapp/qml/ToolbarButton.qml @@ -9,6 +9,7 @@ Item { property bool checked: false property bool hovered: false property bool toggle: false + property bool checkable: true property ExclusiveGroup exclusiveGroup: null property string helptext property string hovertext @@ -98,18 +99,22 @@ Item { return; } - button.checked = !button.checked; - if (!button.toggle) + if (button.checkable) { - if (button.checked) + button.checked = !button.checked; + if (!button.toggle) { - tooltip_widget.helptext = helptext; - } - else - { - tooltip_widget.helptext = ""; + if (button.checked) + { + tooltip_widget.helptext = helptext; + } + else + { + tooltip_widget.helptext = ""; + } } } + button.clicked(); } } diff --git a/src/interface/modeler/quickapp/qml/app.qrc b/src/interface/modeler/quickapp/qml/app.qrc index b4b14f1..81d6070 100644 --- a/src/interface/modeler/quickapp/qml/app.qrc +++ b/src/interface/modeler/quickapp/qml/app.qrc @@ -51,5 +51,6 @@ images/icon_preset.png images/icon_render_medium.png images/icon_render_final.png + images/icon_cancel.png diff --git a/src/interface/modeler/quickapp/qml/images/icon_cancel.png b/src/interface/modeler/quickapp/qml/images/icon_cancel.png new file mode 100644 index 0000000000000000000000000000000000000000..121c3bac8df91356579e1e170b5c8733b3cf49ec GIT binary patch literal 13086 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