1//=============================================================================
2//  MuseScore
3//  Music Composition & Notation
4//
5//  Copyright (C) 2019 Werner Schweer and others
6//
7//  This program is free software; you can redistribute it and/or modify
8//  it under the terms of the GNU General Public License version 2.
9//
10//  This program is distributed in the hope that it will be useful,
11//  but WITHOUT ANY WARRANTY; without even the implied warranty of
12//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13//  GNU General Public License for more details.
14//
15//  You should have received a copy of the GNU General Public License
16//  along with this program; if not, write to the Free Software
17//  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18//=============================================================================
19
20import QtQuick 2.8
21import QtQuick.Controls 2.1
22
23import MuseScore.Palette 3.3
24import MuseScore.Utils 3.3
25
26Item {
27    id: paletteHeader
28
29    property bool expanded: false
30    property bool hovered: false
31    property string text: ""
32    property bool hidePaletteElementVisible
33    property bool editingEnabled: true
34    property bool custom: false
35    property bool unresolved: false
36
37    property PaletteWorkspace paletteWorkspace
38    property var modelIndex: null
39
40    signal toggleExpandRequested()
41    signal enableEditingToggled(bool val)
42    signal hideSelectedElementsRequested()
43    signal insertNewPaletteRequested()
44    signal hidePaletteRequested()
45    signal editPalettePropertiesRequested()
46
47    implicitHeight: paletteExpandArrow.height
48    implicitWidth: paletteExpandArrow.implicitWidth + textItem.implicitWidth + paletteHeaderMenuButton.implicitWidth + 8 // 8 for margins
49
50    function showPaletteMenu() {
51        paletteHeaderMenu.x = paletteHeaderMenuButton.x + paletteHeaderMenuButton.width - paletteHeaderMenu.width;
52        paletteHeaderMenu.y = paletteHeaderMenuButton.y;
53        paletteHeaderMenu.open();
54    }
55
56    StyledToolButton {
57        id: paletteExpandArrow
58        z: 1000
59        width: height
60        visible: !paletteHeader.unresolved // TODO: make a separate palette placeholder component
61        activeFocusOnTab: false // same focus object as parent palette
62        text: paletteHeader.expanded ? qsTr("Collapse") : qsTr("Expand")
63
64        padding: 4
65
66        contentItem: StyledIcon {
67            source: paletteHeader.expanded ? "icons/ArrowDown.svg" : "icons/ArrowRight.svg"
68        }
69
70        onClicked: paletteHeader.toggleExpandRequested()
71    }
72    Text {
73        id: textItem
74        height: parent.height
75        verticalAlignment: Text.AlignVCenter
76        horizontalAlignment: Text.AlignHLeft
77        anchors {
78            left: paletteExpandArrow.right; leftMargin: 4;
79            right: deleteButton.visible ? deleteButton.left : (paletteHeaderMenuButton.visible ? paletteHeaderMenuButton.left : parent.right)
80        }
81        text: paletteHeader.text
82        font: globalStyle.font
83        color: globalStyle.text
84        elide: Text.ElideRight
85    }
86//     StyledToolButton {
87//         z: 1000
88//         height: parent.height
89//         anchors { left: paletteExpandArrow.right }
90//         text: paletteHeader.text
91//     }
92
93    StyledToolButton {
94        id: deleteButton
95        z: 1000
96        height: parent.height
97        width: height
98        anchors.right: paletteHeaderMenuButton.left
99//         icon.name: "delete" // can't use icon until Qt 5.10... https://doc.qt.io/qt-5/qtquickcontrols2-icons.html
100//         icon.source: "icons/delete.png"
101        text: qsTr("Remove element")
102        visible: paletteHeader.hidePaletteElementVisible && paletteHeader.editingEnabled
103        activeFocusOnTab: mainPalette.currentItem === paletteTree.currentTreeItem
104
105        KeyNavigation.backtab: mainPalette.currentItem
106        KeyNavigation.tab: focusBreaker
107
108        onHoveredChanged: {
109            if (hovered) {
110                mscore.tooltip.item = deleteButton;
111                mscore.tooltip.text = deleteButton.text;
112            } else if (mscore.tooltip.item == deleteButton)
113                mscore.tooltip.item = null;
114        }
115
116        padding: 4
117
118        contentItem: StyledIcon {
119            source: "icons/TrashCan.svg"
120        }
121
122        onClicked: hideSelectedElementsRequested()
123    }
124
125    StyledToolButton {
126        id: paletteHeaderMenuButton
127        z: 1000
128        height: parent.height
129        anchors.right: parent.right
130
131        visible: paletteHeader.expanded || paletteHeader.hovered || paletteHeaderMenu.visible
132
133        activeFocusOnTab: parent.parent.parent === paletteTree.currentTreeItem
134
135        padding: 4
136
137        contentItem: StyledIcon {
138            source: "icons/ThreeDotMenu.svg"
139        }
140
141        text: qsTr("Palette menu") // used by screen readers (they ignore Accessible.name for buttons)
142
143        onClicked: showPaletteMenu()
144    }
145
146    MouseArea {
147        id: rightClickArea
148        anchors.fill: parent
149        acceptedButtons: Qt.RightButton
150
151        onClicked: {
152            if (paletteHeaderMenu.popup) // Menu.popup() is available since Qt 5.10 only
153                paletteHeaderMenu.popup();
154            else {
155                paletteHeaderMenu.x = mouseX;
156                paletteHeaderMenu.y = mouseY;
157                paletteHeaderMenu.open();
158            }
159        }
160    }
161
162    Menu {
163        id: paletteHeaderMenu
164        MenuItem {
165            text: custom ? qsTr("Hide/Delete Palette") : qsTr("Hide Palette")
166            onTriggered: paletteHeader.hidePaletteRequested()
167        }
168        MenuItem {
169            text: qsTr("Insert New Palette")
170            onTriggered: paletteHeader.insertNewPaletteRequested()
171        }
172        MenuSeparator {}
173        MenuItem {
174            text: qsTr("Enable Editing")
175            checkable: true
176            checked: paletteHeader.editingEnabled
177            onTriggered: paletteHeader.enableEditingToggled(checked)
178        }
179        MenuSeparator {}
180        MenuItem {
181            text: qsTr("Reset Palette")
182            onTriggered: paletteHeader.paletteWorkspace.resetPalette(paletteHeader.modelIndex)
183        }
184        MenuItem {
185            text: qsTr("Save Palette…")
186            onTriggered: paletteHeader.paletteWorkspace.savePalette(paletteHeader.modelIndex)
187        }
188        MenuItem {
189            text: qsTr("Load Palette…")
190            onTriggered: paletteHeader.paletteWorkspace.loadPalette(paletteHeader.modelIndex)
191        }
192        MenuSeparator {}
193        MenuItem {
194            text: qsTr("Palette Properties…")
195            enabled: paletteHeader.editingEnabled
196            onTriggered: paletteHeader.editPalettePropertiesRequested()
197        }
198    }
199}
200