mirror of
https://gitlab.linphone.org/BC/public/linphone-desktop.git
synced 2026-01-24 07:08:07 +00:00
feat(Popup): create DropDownDynamixMenu and DropDownMenu
This commit is contained in:
parent
3566f3fdff
commit
7b08e105e4
7 changed files with 118 additions and 112 deletions
|
|
@ -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>
|
||||
|
|
|
|||
100
tests/ui/modules/Common/Popup/AbstractDropDownMenu.qml
Normal file
100
tests/ui/modules/Common/Popup/AbstractDropDownMenu.qml
Normal file
|
|
@ -0,0 +1,100 @@
|
|||
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()
|
||||
}
|
||||
}
|
||||
}
|
||||
12
tests/ui/modules/Common/Popup/DropDownDynamicMenu.qml
Normal file
12
tests/ui/modules/Common/Popup/DropDownDynamicMenu.qml
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
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
|
||||
}
|
||||
}
|
||||
|
|
@ -1,113 +1,5 @@
|
|||
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
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue