monero-gui/components/TableDropdown.qml

230 lines
7.6 KiB
QML
Raw Normal View History

2015-04-01 08:56:05 +00:00
// Copyright (c) 2014-2015, The Monero Project
//
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without modification, are
// permitted provided that the following conditions are met:
//
// 1. Redistributions of source code must retain the above copyright notice, this list of
// conditions and the following disclaimer.
//
// 2. Redistributions in binary form must reproduce the above copyright notice, this list
// of conditions and the following disclaimer in the documentation and/or other
// materials provided with the distribution.
//
// 3. Neither the name of the copyright holder nor the names of its contributors may be
// used to endorse or promote products derived from this software without specific
// prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2014-07-07 17:08:30 +00:00
import QtQuick 2.0
Item {
id: dropdown
property bool expanded: false
property alias dataModel: repeater.model
2014-07-07 17:08:30 +00:00
signal collapsed()
signal optionClicked(int option)
2014-07-07 17:08:30 +00:00
width: 72
height: 37
onExpandedChanged: if(expanded) appWindow.currentItem = dropdown
function hide() { dropdown.expanded = false }
function containsPoint(px, py) {
if(px < 0)
return false
if(px > width)
return false
if(py < 0)
return false
if(py > height + dropArea.height)
return false
return true
}
2014-07-07 17:08:30 +00:00
Item {
id: head
anchors.fill: parent
Rectangle {
2014-07-09 15:44:13 +00:00
anchors.left: parent.left
anchors.right: parent.right
height: parent.height - 1
y: dropdown.expanded || dropArea.height > 0 ? 0 : 1
//radius: 3
color: dropdown.expanded || dropArea.height > 0 ? "#888888" : "#DBDBDB"
2014-07-07 17:08:30 +00:00
}
Rectangle {
2014-07-09 15:44:13 +00:00
anchors.left: parent.left
anchors.right: parent.right
height: parent.height - 1
y: dropdown.expanded || dropArea.height > 0 ? 1 : 0
//radius: 3
color: dropdown.expanded || dropArea.height > 0 ? "#DBDBDB" : "#F0EEEE"
2014-07-07 17:08:30 +00:00
}
2014-07-09 15:44:13 +00:00
Rectangle {
anchors.left: parent.left
anchors.bottom: parent.bottom
height: 3
width: 3
color: "#DBDBDB"
visible: dropdown.expanded || dropArea.height > 0
}
Rectangle {
anchors.right: parent.right
anchors.bottom: parent.bottom
height: 3
width: 3
color: "#DBDBDB"
visible: dropdown.expanded || dropArea.height > 0
}
2014-07-07 17:08:30 +00:00
Image {
anchors.verticalCenter: parent.verticalCenter
anchors.left: parent.left
anchors.leftMargin: 10
source: "../images/tableOptions.png"
}
Rectangle {
anchors.centerIn: parent
anchors.horizontalCenterOffset: 1
height: 23
width: 1
color: dropdown.expanded || dropArea.height > 0 ? "#FFFFFF" : "#DBDBDB"
2014-07-07 17:08:30 +00:00
}
Image {
anchors.verticalCenter: parent.verticalCenter
anchors.right: parent.right
anchors.rightMargin: 10
source: "../images/dropIndicator.png"
}
}
Timer {
id: timer
interval: 50
2014-07-23 11:01:20 +00:00
repeat: true
running: false
onTriggered: {
if(((tipItem.visible && !tipItem.containsMouse) || !tipItem.visible) && !mouseArea.containsMouse) {
tipItem.visible = false
dropdown.expanded = false
currentIndex = -1
2014-07-23 11:01:20 +00:00
timer.stop()
}
}
}
2014-07-10 22:18:36 +00:00
MouseArea {
id: mouseArea
2014-07-10 22:18:36 +00:00
anchors.left: head.left
anchors.right: head.right
anchors.top: head.top
height: head.height + dropArea.height
hoverEnabled: true
onEntered: dropdown.expanded = true
property int currentIndex: -1
onMouseYChanged: {
if(mouseY > head.height) {
var posY = parseInt((mouseY - head.height) / 30)
currentIndex = posY
} else {
currentIndex = -1
}
}
2016-12-10 01:01:04 +00:00
onClicked: {
optionClicked(currentIndex)
}
2014-07-23 11:01:20 +00:00
onExited: timer.start()
preventStealing: true
z: 1
2014-07-10 22:18:36 +00:00
Item {
id: dropArea
2014-07-07 17:08:30 +00:00
anchors.left: parent.left
anchors.right: parent.right
2014-07-10 22:18:36 +00:00
y: head.height
height: dropdown.expanded ? column.height : 0
onHeightChanged: if(height === 0) dropdown.collapsed()
clip: true
2014-07-07 17:08:30 +00:00
2014-07-10 22:18:36 +00:00
Behavior on height {
NumberAnimation { duration: 100; easing.type: Easing.InQuad }
2014-07-07 17:08:30 +00:00
}
2014-07-10 22:18:36 +00:00
Column {
id: column
anchors.left: parent.left
anchors.right: parent.right
anchors.top: parent.top
Repeater {
id: repeater
delegate: Rectangle {
id: delegate
property bool containsMouse: index === mouseArea.currentIndex
2014-07-07 17:08:30 +00:00
anchors.left: parent.left
anchors.right: parent.right
2014-07-10 22:18:36 +00:00
height: 30
color: containsMouse ? "#F0EEEE" : "#DBDBDB"
//radius: index === repeater.count - 1 ? 5 : 0
2014-07-10 22:18:36 +00:00
Rectangle {
anchors.left: parent.left
anchors.top: parent.top
width: 5
height: 5
color: delegate.color
}
2014-07-07 17:08:30 +00:00
2014-07-10 22:18:36 +00:00
Rectangle {
anchors.right: parent.right
anchors.top: parent.top
width: 5
height: 5
color: delegate.color
}
2014-07-07 17:08:30 +00:00
2014-07-10 22:18:36 +00:00
Image {
anchors.verticalCenter: parent.verticalCenter
anchors.left: parent.left
anchors.leftMargin: 10
source: icon
2014-07-07 17:08:30 +00:00
}
2014-07-10 22:18:36 +00:00
onContainsMouseChanged: {
if(containsMouse) {
var pos = rootItem.mapFromItem(delegate, 30, -20)
2014-07-10 22:18:36 +00:00
tipItem.text = name
tipItem.x = pos.x + appWindow.x
2014-07-10 22:18:36 +00:00
if(tipItem.height > 30)
pos.y -= tipItem.height - 30
tipItem.y = pos.y + appWindow.y
2014-07-10 22:18:36 +00:00
tipItem.visible = true
}
}
2016-12-10 01:01:04 +00:00
2014-07-07 17:08:30 +00:00
}
}
}
}
}
}