2021-05-04 22:35:50 +03:00
|
|
|
/****************************************************************************
|
|
|
|
|
**
|
|
|
|
|
** 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.Controls 2.15
|
|
|
|
|
import QtQuick.Layouts 1.15
|
|
|
|
|
import QtQuickDesignerTheme 1.0
|
|
|
|
|
import HelperWidgets 2.0
|
|
|
|
|
import StudioControls 1.0 as StudioControls
|
|
|
|
|
import StudioTheme 1.0 as StudioTheme
|
|
|
|
|
|
|
|
|
|
Item {
|
2021-06-15 17:24:24 +03:00
|
|
|
property var selectedAssets: ({})
|
2021-06-24 14:08:40 +03:00
|
|
|
property int allExpandedState: 0
|
2021-06-15 17:24:24 +03:00
|
|
|
|
2021-05-04 22:35:50 +03:00
|
|
|
DropArea {
|
|
|
|
|
id: dropArea
|
|
|
|
|
|
|
|
|
|
property var files // list of supported dropped files
|
|
|
|
|
|
|
|
|
|
enabled: true
|
|
|
|
|
anchors.fill: parent
|
|
|
|
|
|
2021-06-17 18:22:11 +03:00
|
|
|
onEntered: (drag)=> {
|
2021-05-04 22:35:50 +03:00
|
|
|
files = []
|
|
|
|
|
for (var i = 0; i < drag.urls.length; ++i) {
|
|
|
|
|
var url = drag.urls[i].toString();
|
|
|
|
|
if (url.startsWith("file:///")) // remove file scheme (happens on Windows)
|
|
|
|
|
url = url.substr(8)
|
|
|
|
|
var ext = url.slice(url.lastIndexOf('.') + 1).toLowerCase()
|
|
|
|
|
if (rootView.supportedSuffixes().includes('*.' + ext))
|
|
|
|
|
files.push(url)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (files.length === 0)
|
|
|
|
|
drag.accepted = false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
onDropped: {
|
|
|
|
|
if (files.length > 0)
|
|
|
|
|
rootView.handleFilesDrop(files)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2021-06-08 20:14:14 +03:00
|
|
|
// called from C++ to close context menu on focus out
|
2021-06-23 17:39:08 +03:00
|
|
|
function handleViewFocusOut()
|
2021-06-08 20:14:14 +03:00
|
|
|
{
|
|
|
|
|
contextMenu.close()
|
2021-06-23 17:39:08 +03:00
|
|
|
selectedAssets = {}
|
|
|
|
|
selectedAssetsChanged()
|
2021-06-08 20:14:14 +03:00
|
|
|
}
|
|
|
|
|
|
2021-05-04 22:35:50 +03:00
|
|
|
ScrollView { // TODO: experiment using ListView instead of ScrollView + Column
|
|
|
|
|
id: assetsView
|
|
|
|
|
anchors.fill: parent
|
|
|
|
|
|
2021-06-08 20:14:14 +03:00
|
|
|
Item {
|
|
|
|
|
StudioControls.Menu {
|
|
|
|
|
id: contextMenu
|
|
|
|
|
|
|
|
|
|
StudioControls.MenuItem {
|
|
|
|
|
text: qsTr("Expand All")
|
2021-06-24 14:08:40 +03:00
|
|
|
enabled: allExpandedState !== 1
|
2021-06-08 20:14:14 +03:00
|
|
|
onTriggered: assetsModel.toggleExpandAll(true)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
StudioControls.MenuItem {
|
|
|
|
|
text: qsTr("Collapse All")
|
2021-06-24 14:08:40 +03:00
|
|
|
enabled: allExpandedState !== 2
|
2021-06-08 20:14:14 +03:00
|
|
|
onTriggered: assetsModel.toggleExpandAll(false)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2021-05-04 22:35:50 +03:00
|
|
|
Column {
|
|
|
|
|
spacing: 2
|
|
|
|
|
Repeater {
|
|
|
|
|
model: assetsModel // context property
|
|
|
|
|
delegate: dirSection
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Component {
|
|
|
|
|
id: dirSection
|
|
|
|
|
|
|
|
|
|
Section {
|
|
|
|
|
width: assetsView.width -
|
|
|
|
|
(assetsView.verticalScrollBarVisible ? assetsView.verticalThickness : 0)
|
|
|
|
|
caption: dirName
|
|
|
|
|
sectionHeight: 30
|
|
|
|
|
sectionFontSize: 15
|
|
|
|
|
levelShift: 20
|
|
|
|
|
leftPadding: 0
|
|
|
|
|
hideHeader: dirDepth === 0
|
|
|
|
|
showLeftBorder: true
|
|
|
|
|
expanded: dirExpanded
|
|
|
|
|
visible: dirVisible
|
|
|
|
|
expandOnClick: false
|
|
|
|
|
onToggleExpand: {
|
|
|
|
|
dirExpanded = !dirExpanded
|
|
|
|
|
}
|
2021-06-08 20:14:14 +03:00
|
|
|
onShowContextMenu: {
|
2021-06-24 14:08:40 +03:00
|
|
|
allExpandedState = assetsModel.getAllExpandedState()
|
2021-06-08 20:14:14 +03:00
|
|
|
contextMenu.popup()
|
|
|
|
|
}
|
2021-05-04 22:35:50 +03:00
|
|
|
|
|
|
|
|
Column {
|
|
|
|
|
spacing: 5
|
|
|
|
|
leftPadding: 15
|
|
|
|
|
|
|
|
|
|
Repeater {
|
|
|
|
|
model: dirsModel
|
|
|
|
|
delegate: dirSection
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Repeater {
|
|
|
|
|
model: filesModel
|
|
|
|
|
delegate: fileSection
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Component {
|
|
|
|
|
id: fileSection
|
|
|
|
|
|
|
|
|
|
Rectangle {
|
|
|
|
|
width: assetsView.width -
|
|
|
|
|
(assetsView.verticalScrollBarVisible ? assetsView.verticalThickness : 0)
|
|
|
|
|
height: img.height
|
2021-06-15 17:24:24 +03:00
|
|
|
color: selectedAssets[filePath] ? StudioTheme.Values.themeInteraction
|
|
|
|
|
: (mouseArea.containsMouse ? "#444444" : "transparent")
|
2021-05-04 22:35:50 +03:00
|
|
|
|
|
|
|
|
Row {
|
|
|
|
|
spacing: 5
|
|
|
|
|
|
|
|
|
|
Image {
|
|
|
|
|
id: img
|
|
|
|
|
asynchronous: true
|
|
|
|
|
width: 48
|
|
|
|
|
height: 48
|
|
|
|
|
source: "image://qmldesigner_assets/" + filePath
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Text {
|
|
|
|
|
text: fileName
|
|
|
|
|
color: StudioTheme.Values.themeTextColor
|
|
|
|
|
font.pixelSize: 14
|
|
|
|
|
anchors.verticalCenter: parent.verticalCenter
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
readonly property string suffix: fileName.substr(-4)
|
|
|
|
|
readonly property bool isFont: suffix === ".ttf" || suffix === ".otf"
|
|
|
|
|
|
|
|
|
|
MouseArea {
|
|
|
|
|
id: mouseArea
|
|
|
|
|
|
|
|
|
|
anchors.fill: parent
|
|
|
|
|
hoverEnabled: true
|
|
|
|
|
acceptedButtons: Qt.LeftButton | Qt.RightButton
|
|
|
|
|
|
|
|
|
|
onExited: tooltipBackend.hideTooltip()
|
|
|
|
|
onCanceled: tooltipBackend.hideTooltip()
|
|
|
|
|
onPositionChanged: tooltipBackend.reposition()
|
2021-06-17 18:22:11 +03:00
|
|
|
onPressed: (mouse)=> {
|
2021-05-04 22:35:50 +03:00
|
|
|
forceActiveFocus()
|
2021-06-15 17:24:24 +03:00
|
|
|
if (mouse.button === Qt.LeftButton) {
|
|
|
|
|
var ctrlDown = mouse.modifiers & Qt.ControlModifier
|
|
|
|
|
if (!selectedAssets[filePath] && !ctrlDown)
|
|
|
|
|
selectedAssets = {}
|
|
|
|
|
selectedAssets[filePath] = true
|
|
|
|
|
selectedAssetsChanged()
|
|
|
|
|
|
|
|
|
|
var selectedAssetsArr = []
|
|
|
|
|
for (var assetPath in selectedAssets) {
|
|
|
|
|
if (selectedAssets[assetPath])
|
|
|
|
|
selectedAssetsArr.push(assetPath)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
rootView.startDragAsset(selectedAssetsArr, mapToGlobal(mouse.x, mouse.y))
|
|
|
|
|
} else {
|
2021-05-04 22:35:50 +03:00
|
|
|
print("TODO: impl context menu")
|
2021-06-15 17:24:24 +03:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2021-06-17 18:22:11 +03:00
|
|
|
onReleased: (mouse)=> {
|
2021-06-15 17:24:24 +03:00
|
|
|
if (mouse.button === Qt.LeftButton) {
|
|
|
|
|
if (!(mouse.modifiers & Qt.ControlModifier))
|
|
|
|
|
selectedAssets = {}
|
|
|
|
|
selectedAssets[filePath] = true
|
|
|
|
|
selectedAssetsChanged()
|
|
|
|
|
}
|
2021-05-04 22:35:50 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ToolTip {
|
|
|
|
|
visible: !isFont && mouseArea.containsMouse
|
|
|
|
|
text: filePath
|
|
|
|
|
delay: 1000
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Timer {
|
|
|
|
|
interval: 1000
|
|
|
|
|
running: mouseArea.containsMouse
|
|
|
|
|
onTriggered: {
|
|
|
|
|
if (suffix === ".ttf" || suffix === ".otf") {
|
|
|
|
|
tooltipBackend.name = fileName
|
|
|
|
|
tooltipBackend.path = filePath
|
|
|
|
|
tooltipBackend.showTooltip()
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|