// Copyright (C) 2022 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only import QtQuick import QtQuick.Controls import QtQuick.Layouts Item { id: editorView property alias qmlEditor: qmlEdit property alias vertexEditor: vertEdit property alias fragmentEditor: fragEdit property var currentEditorComponent: tabBarEditors.currentIndex == 0 ? qmlEdit.textArea : tabBarEditors.currentIndex == 1 ? vertEdit.textArea : fragEdit.textArea property alias qmlText: qmlEdit.text property alias vertexText: vertEdit.text property alias fragmentText: fragEdit.text property bool showLineNumbers: true property bool editable: true function showErrorCodeLine() { // UI combines QML error types let tabIndex = (effectManager.effectError.type === 0 || effectManager.effectError.type === 3) ? 0 : effectManager.effectError.type tabIndex = Math.max(0, Math.min(2, tabIndex)); tabBarEditors.currentIndex = tabIndex; const codeLine = effectManager.effectError.line; if (tabIndex === 0) qmlEditor.scrollToLine(codeLine); else if (tabIndex === 1) vertexEditor.scrollToLine(codeLine); else fragmentEditor.scrollToLine(codeLine); } ColumnLayout { width: parent.width height: parent.height Item { id: tabBarItem Layout.fillWidth: true height: tabBarEditors.height Rectangle { anchors.fill: tabBarItem color: backgroundColor1 } TabBar { id: tabBarEditors currentIndex: 2 TabButton { id: qmlTabText text: "QML" width: 80 opacity: qmlText.length === 0 ? 0.3 : 1.0 } TabButton { id: vertexTabText text: "VERT" width: 80 opacity: vertexText.length === 0 ? 0.3 : 1.0 } TabButton { id: fragTabtext text: "FRAG" width: 80 opacity: fragmentText.length === 0 ? 0.3 : 1.0 } } Rectangle { anchors.fill: editToolbar color: mainView.backgroundColor1 opacity: 0.8 } Row { id: editToolbar visible: editorView.editable anchors.right: parent.right height: tabBarEditors.height CustomIconButton { id: autoplayButton anchors.verticalCenter: parent.verticalCenter height: parent.height * 0.8 width: height icon: "images/icon_autoplay.png" toggledIcon: "images/icon_autoplay_on.png" description: "Autoplay when the shader changes" toggleButton: true toggled: effectManager.autoPlayEffect onClicked: { effectManager.autoPlayEffect = !effectManager.autoPlayEffect; if (effectManager.autoPlayEffect) updateShaders(true); } } CustomIconButton { id: playButton anchors.verticalCenter: parent.verticalCenter height: parent.height * 0.8 width: height icon: "images/icon_play.png" description: "Play the shader" onClicked: { updateShaders(true); } Rectangle { anchors.fill: playButton anchors.margins: 2 z: -1 color: effectManager.shadersUpToDate ? "transparent" : "#912c2c" radius: width / 2 } } CustomIconButton { id: exportButton anchors.verticalCenter: parent.verticalCenter height: parent.height * 0.6 width: height icon: "images/icon_export.png" description: "Export the effect" enabled: (effectManager.hasProjectFilename && effectManager.effectError.message === "") onClicked: { mainWindow.exportAction(); } } } Row { id: previewToolbar visible: !editToolbar.visible anchors.right: parent.right height: tabBarEditors.height CustomIconButton { id: showQsbButton anchors.verticalCenter: parent.verticalCenter height: parent.height * 0.8 width: height * (288 / 128) icon: "images/button_qsb.png" description: "Show QSB Inspector" enabled: (tabBarEditors.currentIndex === 1 || tabBarEditors.currentIndex === 2) onClicked: { if (tabBarEditors.currentIndex === 1) qsbInspectorAction(effectManager.vertexShaderFilename); else qsbInspectorAction(effectManager.fragmentShaderFilename); } } } } // Editors Item { id: editorStack Layout.fillWidth: true Layout.fillHeight: true MouseArea { anchors.fill: parent onWheel: {} } CodeEditor { id: qmlEdit anchors.fill: parent showLineNumbers: editorView.showLineNumbers editable: editorView.editable contentType: 1 editorIndex: 0 visible: tabBarEditors.currentIndex === 0 } CodeEditor { id: vertEdit anchors.fill: parent showLineNumbers: editorView.showLineNumbers editable: editorView.editable contentType: 0 editorIndex: 1 visible: tabBarEditors.currentIndex === 1 } CodeEditor { id: fragEdit anchors.fill: parent showLineNumbers: editorView.showLineNumbers editable: editorView.editable contentType: 0 editorIndex: 2 visible: tabBarEditors.currentIndex === 2 } } FindBar { id: findBar show: mainView.showFindBar && editorView.editable } } Rectangle { anchors.fill: parent color: "#000000" opacity: editable ? 0.4 : 0.9 z: -1 } }