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