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

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

parent 3566f3fd
......@@ -51,6 +51,8 @@
<file>ui/modules/Common/InvertedMouseArea.qml</file>
<file>ui/modules/Common/Menu.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/PopupShadow.qml</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
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()
}
AbstractDropDownMenu {
function _computeHeight () {
var model = _content[0].model
if (model == null || !Utils.qmlTypeof(model, 'QQmlListModel')) {
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()
}
return content.height
}
}
......@@ -63,7 +63,7 @@ Item {
}
}
DropDownMenu {
DropDownDynamicMenu {
id: menu
anchors.top: searchField.bottom
......
......@@ -55,6 +55,7 @@ Menu 1.0 Menu.qml
Paned 1.0 Paned.qml
# Popup
DropDownDynamicMenu 1.0 Popup/DropDownDynamicMenu.qml
DropDownMenu 1.0 Popup/DropDownMenu.qml
PopupShadow 1.0 Popup/PopupShadow.qml
......
......@@ -52,7 +52,6 @@ RowLayout {
DropDownMenu {
id: menu
entryHeight: 22
implicitHeight: toto.height
launcher: 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