Add a shortcut on username in chat room to put its address in smartSearchBar

This commit is contained in:
Julien Wadel 2021-09-09 18:53:44 +02:00
parent da844225d2
commit 95e6c2e120
5 changed files with 182 additions and 164 deletions

View file

@ -7,165 +7,173 @@ import Utils 1.0
// =============================================================================
Item {
id: searchBox
// ---------------------------------------------------------------------------
readonly property alias filter: searchField.text
readonly property alias isOpen: searchBox._isOpen
readonly property var view: _content[0]
property alias entryHeight: menu.entryHeight
property alias maxMenuHeight: menu.maxMenuHeight
property alias placeholderText: searchField.placeholderText
property alias tooltipText : tooltip.text
default property alias _content: menu._content
property bool _isOpen: false
// ---------------------------------------------------------------------------
signal menuClosed
signal menuOpened
signal menuRequested
signal enterPressed
// ---------------------------------------------------------------------------
function closeMenu () {
if (!_isOpen) {
return
}
searchBox.state = ''
_isOpen = false
}
function openMenu () {
if (_isOpen) {
return
}
searchBox.state = 'opened'
_isOpen = true
}
function _filter (text) {
var model = searchBox.view.model
Utils.assert(model.setFilter != null, '`model.setFilter` must be defined.')
model.setFilter(text)
}
// ---------------------------------------------------------------------------
implicitHeight: searchField.height
Item {
implicitHeight: searchField.height + menu.height
width: parent.width
TextField {
id: searchField
icon: 'search'
readOnly: !searchBox.enabled
width: parent.width
Keys.onEscapePressed: searchBox.closeMenu()
Keys.onReturnPressed: {
searchBox.enterPressed()
searchBox.closeMenu()
}
onActiveFocusChanged: {
if (activeFocus && !_isOpen) {
searchBox.menuRequested()
searchBox.openMenu()
}
}
onTextChanged: _filter(text)
}
// -------------------------------------------------------------------------
DropDownDynamicMenu {
id: menu
relativeTo: searchField
relativeY: searchField.height
// If the menu is focused, the main window loses the active status.
// So It's necessary to map the keys events.
Keys.forwardTo: searchField
onClosed: searchBox.closeMenu()
}
Binding {
target: searchBox.view
property: 'width'
value: searchField.width
}
Binding {
target: searchBox.view
property: 'headerPositioning'
value: searchBox.view.header ? ListView.OverlayHeader : ListView.InlineFooter
}
}
MouseArea
{// Just take hover events and set popup to do its automatic close if mouse is not inside field/popup area
anchors.fill: parent
onContainsMouseChanged: menu.popup.closePolicy=(containsMouse?Controls.Popup.NoAutoClose:Controls.Popup.CloseOnEscape | Controls.Popup.CloseOnPressOutside)
hoverEnabled:true
preventStealing: true
propagateComposedEvents:true
onPressed: mouse.accepted=false
onReleased: mouse.accepted=false
onClicked: mouse.accepted=false
onDoubleClicked: mouse.accepted=false
onPressAndHold: mouse.accepted=false
TooltipArea {
id:tooltip
visible: !isOpen && text !== ''
}
}
// ---------------------------------------------------------------------------
states: State {
name: 'opened'
}
transitions: [
Transition {
from: ''
to: 'opened'
ScriptAction {
script: {
menu.open()
searchBox.menuOpened()
}
}
},
Transition {
from: 'opened'
to: ''
ScriptAction {
script: {
menu.close()
searchField.focus = false
searchField.text = ''
searchBox.menuClosed()
}
}
}
]
id: searchBox
// ---------------------------------------------------------------------------
readonly property alias filter: searchField.text
readonly property alias isOpen: searchBox._isOpen
readonly property var view: _content[0]
property alias entryHeight: menu.entryHeight
property alias maxMenuHeight: menu.maxMenuHeight
property alias placeholderText: searchField.placeholderText
property alias tooltipText : tooltip.text
property alias text : searchField.text
default property alias _content: menu._content
property bool _isOpen: false
// ---------------------------------------------------------------------------
signal menuClosed
signal menuOpened
signal menuRequested
signal enterPressed
// ---------------------------------------------------------------------------
function closeMenu () {
if (!_isOpen) {
return
}
searchBox.state = ''
_isOpen = false
}
function openMenu () {
if (_isOpen) {
return
}
searchBox.state = 'opened'
_isOpen = true
}
function _filter (text) {
var model = searchBox.view.model
Utils.assert(model.setFilter != null, '`model.setFilter` must be defined.')
model.setFilter(text)
if(!searchField.activeFocus)
searchField.focus = true
if(!_isOpen){
searchBox.menuRequested()
searchBox.openMenu()
}
}
// ---------------------------------------------------------------------------
implicitHeight: searchField.height
Item {
implicitHeight: searchField.height + menu.height
width: parent.width
TextField {
id: searchField
icon: 'search'
readOnly: !searchBox.enabled
width: parent.width
Keys.onEscapePressed: searchBox.closeMenu()
Keys.onReturnPressed: {
searchBox.enterPressed()
searchBox.closeMenu()
}
onActiveFocusChanged: {
if (activeFocus && !_isOpen) {
searchBox.menuRequested()
searchBox.openMenu()
}
}
onTextChanged: _filter(text)
}
// -------------------------------------------------------------------------
DropDownDynamicMenu {
id: menu
relativeTo: searchField
relativeY: searchField.height
// If the menu is focused, the main window loses the active status.
// So It's necessary to map the keys events.
Keys.forwardTo: searchField
onClosed: searchBox.closeMenu()
}
Binding {
target: searchBox.view
property: 'width'
value: searchField.width
}
Binding {
target: searchBox.view
property: 'headerPositioning'
value: searchBox.view.header ? ListView.OverlayHeader : ListView.InlineFooter
}
}
MouseArea
{// Just take hover events and set popup to do its automatic close if mouse is not inside field/popup area
anchors.fill: parent
onContainsMouseChanged: menu.popup.closePolicy=(containsMouse?Controls.Popup.NoAutoClose:Controls.Popup.CloseOnEscape | Controls.Popup.CloseOnPressOutside)
hoverEnabled:true
preventStealing: true
propagateComposedEvents:true
onPressed: mouse.accepted=false
onReleased: mouse.accepted=false
onClicked: mouse.accepted=false
onDoubleClicked: mouse.accepted=false
onPressAndHold: mouse.accepted=false
TooltipArea {
id:tooltip
visible: !isOpen && text !== ''
isClickable:false
}
}
// ---------------------------------------------------------------------------
states: State {
name: 'opened'
}
transitions: [
Transition {
from: ''
to: 'opened'
ScriptAction {
script: {
menu.open()
searchBox.menuOpened()
}
}
},
Transition {
from: 'opened'
to: ''
ScriptAction {
script: {
menu.close()
searchField.focus = false
searchField.text = ''
searchBox.menuClosed()
}
}
}
]
}

View file

@ -16,7 +16,7 @@ MouseArea {
property bool _visible: false
property int hoveringCursor : Qt.PointingHandCursor
property bool isClickable : true
property bool isClickable : false
anchors.fill:parent
@ -26,13 +26,14 @@ MouseArea {
onContainsMouseChanged: _visible = containsMouse
cursorShape: containsMouse ? hoveringCursor : Qt.ArrowCursor
onPressed: mouse.accepted = false
onPressed: {
mouse.accepted = isClickable
}
onWheel: {
_visible = false
wheel.accepted = false
}
onClicked:{
console.log("Clicked")
if(isClickable){
if(tooltip.delay>0) {
tooltip.oldDelay = tooltip.delay

View file

@ -44,6 +44,10 @@ RowLayout {
delay:0
text:avatar.username+'\n'+$chatEntry.fromSipAddress
tooltipParent:mainRow
isClickable: true
onDoubleClicked: {
window.mainSearchBar.text = $chatEntry.fromSipAddress
}
}
}
}

View file

@ -131,6 +131,7 @@ ColumnLayout {
onClicked: sipAddressesMenu.open()
TooltipArea {
isClickable: false
text: qsTr('tooltipShowConversation')
}
}

View file

@ -18,6 +18,7 @@ ApplicationWindow {
property string _currentView
property var _lockedInfo
property SmartSearchBar mainSearchBar : (mainLoader.item ? mainLoader.item.mainSearchBar : null)
// ---------------------------------------------------------------------------
@ -74,6 +75,7 @@ ApplicationWindow {
readonly property alias menu: menu
readonly property alias timeline: timeline
readonly property alias mainSearchBar: toolBar.mainSearchBar
spacing: 0
@ -88,6 +90,8 @@ ApplicationWindow {
// -----------------------------------------------------------------------
ToolBar {
id: toolBar
property alias mainSearchBar : smartSearchBar
Layout.fillWidth: true
Layout.preferredHeight: MainWindowStyle.toolBar.height
hoverEnabled : true