Commit 7b08e105 authored by Ronan Abhamon's avatar Ronan Abhamon

feat(Popup): create `DropDownDynamixMenu` and `DropDownMenu`

parent 3566f3fd
...@@ -51,6 +51,8 @@ ...@@ -51,6 +51,8 @@
<file>ui/modules/Common/InvertedMouseArea.qml</file> <file>ui/modules/Common/InvertedMouseArea.qml</file>
<file>ui/modules/Common/Menu.qml</file> <file>ui/modules/Common/Menu.qml</file>
<file>ui/modules/Common/Paned.qml</file> <file>ui/modules/Common/Paned.qml</file>
<file>ui/modules/Common/Popup/AbstractDropDownMenu.qml</file>
<file>ui/modules/Common/Popup/DropDownDynamicMenu.qml</file>
<file>ui/modules/Common/Popup/DropDownMenu.qml</file> <file>ui/modules/Common/Popup/DropDownMenu.qml</file>
<file>ui/modules/Common/Popup/PopupShadow.qml</file> <file>ui/modules/Common/Popup/PopupShadow.qml</file>
<file>ui/modules/Common/qmldir</file> <file>ui/modules/Common/qmldir</file>
......
import QtQuick 2.7
import Common 1.0
import Common.Styles 1.0
import Utils 1.0
// ===================================================================
// Low component to display a list/menu in a popup.
// ===================================================================
Item {
// Optionnal parameter, if defined and if a click is detected
// on it, menu is not closed.
property var launcher
// Optionnal parameters, set the position of Menu relative
// to this item.
property var relativeTo
property int relativeX: 0
property int relativeY: 0
default property alias _content: content.data
signal menuClosed
signal menuOpened
// -----------------------------------------------------------------
function isOpen () {
return visible
}
function showMenu () {
if (visible) {
return
}
if (relativeTo != null) {
this.x = relativeTo.mapToItem(null, relativeX, relativeY).x
this.y = relativeTo.mapToItem(null, relativeX, relativeY).y
}
visible = true
menuOpened()
}
function hideMenu () {
if (!visible) {
return
}
visible = false
menuClosed()
}
function _computeHeight () {
console.exception('Virtual method must be implemented.')
}
// -----------------------------------------------------------------
implicitHeight: _computeHeight()
visible: false
z: Constants.zPopup
Keys.onEscapePressed: hideMenu()
// Set parent menu to root.
Component.onCompleted: {
if (relativeTo != null) {
parent = Utils.getTopParent(this)
}
}
// Menu content.
Rectangle {
id: content
anchors.fill: parent
color: PopupStyle.backgroundColor
layer {
enabled: true
effect: PopupShadow {}
}
}
// Inverted mouse area to detect click outside menu.
InvertedMouseArea {
anchors.fill: parent
enabled: parent.visible
onPressed: {
if (launcher != null && pointIsInItem(launcher)) {
return
}
hideMenu()
}
}
}
AbstractDropDownMenu {
property int entryHeight
property int maxMenuHeight
function _computeHeight () {
var model = _content[0].model
var height = model.count * entryHeight
return (maxMenuHeight !== undefined && height > maxMenuHeight)
? maxMenuHeight
: height
}
}
import QtQuick 2.7 AbstractDropDownMenu {
import Common 1.0
import Common.Styles 1.0
import Utils 1.0
// ===================================================================
// Low component to display a list/menu in a popup.
// ===================================================================
Rectangle {
// Attributes used only with a ListView child.
property int entryHeight
property int maxMenuHeight
// Optionnal parameter, if defined and if a click is detected
// on it, menu is not closed.
property var launcher
// Optionnal parameters, set the position of Menu relative
// to this item.
property var relativeTo
property int relativeX: 0
property int relativeY: 0
default property alias _content: content.data
signal menuClosed
signal menuOpened
function isOpen () {
return visible
}
function showMenu () {
if (visible) {
return
}
if (relativeTo != null) {
this.x = relativeTo.mapToItem(null, relativeX, relativeY).x
this.y = relativeTo.mapToItem(null, relativeX, relativeY).y
}
visible = true
menuOpened()
}
function hideMenu () {
if (!visible) {
return
}
visible = false
menuClosed()
}
function _computeHeight () { function _computeHeight () {
var model = _content[0].model
if (model == null || !Utils.qmlTypeof(model, 'QQmlListModel')) {
return content.height return content.height
} }
console.assert(
entryHeight != null,
'`entryHeight` must be defined when used with `ListView`.'
)
var height = model.count * entryHeight
return (maxMenuHeight !== undefined && height > maxMenuHeight)
? maxMenuHeight
: height
}
implicitHeight: _computeHeight()
visible: false
z: Constants.zPopup
Keys.onEscapePressed: hideMenu()
// Set parent menu to root.
Component.onCompleted: {
if (relativeTo != null) {
parent = Utils.getTopParent(this)
}
}
// Menu content.
Rectangle {
id: content
anchors.fill: parent
color: PopupStyle.backgroundColor
layer {
enabled: true
effect: PopupShadow {}
}
}
// Inverted mouse area to detect click outside menu.
InvertedMouseArea {
anchors.fill: parent
enabled: parent.visible
onPressed: {
if (launcher != null && pointIsInItem(launcher)) {
return
}
hideMenu()
}
}
} }
...@@ -63,7 +63,7 @@ Item { ...@@ -63,7 +63,7 @@ Item {
} }
} }
DropDownMenu { DropDownDynamicMenu {
id: menu id: menu
anchors.top: searchField.bottom anchors.top: searchField.bottom
......
...@@ -55,6 +55,7 @@ Menu 1.0 Menu.qml ...@@ -55,6 +55,7 @@ Menu 1.0 Menu.qml
Paned 1.0 Paned.qml Paned 1.0 Paned.qml
# Popup # Popup
DropDownDynamicMenu 1.0 Popup/DropDownDynamicMenu.qml
DropDownMenu 1.0 Popup/DropDownMenu.qml DropDownMenu 1.0 Popup/DropDownMenu.qml
PopupShadow 1.0 Popup/PopupShadow.qml PopupShadow 1.0 Popup/PopupShadow.qml
......
...@@ -52,7 +52,6 @@ RowLayout { ...@@ -52,7 +52,6 @@ RowLayout {
DropDownMenu { DropDownMenu {
id: menu id: menu
entryHeight: 22
implicitHeight: toto.height implicitHeight: toto.height
launcher: button launcher: button
relativeTo: button relativeTo: button
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment