Warning, /maui/buho/src/views/notes/NotesView.qml is written in an unsupported language. File is not indexed.
0001 import QtQuick 2.14 0002 import QtQuick.Controls 2.14 0003 import QtQuick.Layouts 1.3 0004 0005 import org.mauikit.controls 1.3 as Maui 0006 import org.mauikit.accounts 1.0 as MA 0007 0008 import org.maui.buho 1.0 0009 0010 import "../../widgets" 0011 0012 StackView 0013 { 0014 id: control 0015 property var currentNote : ({}) 0016 0017 property alias cardsView : cardsView 0018 0019 property alias list : notesList 0020 property alias model : notesModel 0021 0022 property alias currentIndex : cardsView.currentIndex 0023 0024 readonly property Flickable flickable : currentItem.flickable 0025 0026 readonly property bool editing : control.depth > 1 0027 0028 function setNote(note) 0029 { 0030 control.push(_editNoteComponent) 0031 control.currentItem.editor.body.forceActiveFocus() 0032 control.currentItem.noteIndex = control.currentIndex 0033 } 0034 0035 function newNote(contents) 0036 { 0037 control.push(_newNoteComponent, {'text': contents}) 0038 control.currentItem.editor.body.forceActiveFocus() 0039 } 0040 0041 Action 0042 { 0043 id: _pasteAction 0044 text: i18n("Paste") 0045 icon.name: "edit-paste" 0046 shortcut: "Ctrl+V" 0047 onTriggered: 0048 { 0049 console.log("PASTE NOTE FROM CLIPBOARD") 0050 newNote(Maui.Handy.getClipboardText()) 0051 } 0052 } 0053 0054 Component 0055 { 0056 id: _editNoteComponent 0057 0058 NewNoteDialog 0059 { 0060 note: control.currentNote 0061 onNoteSaved: (note, noteIndex) => 0062 { 0063 console.log("updating note <<" , note , control.currentIndex , noteIndex, notesModel.mappedToSource(noteIndex)) 0064 control.list.update(note, notesModel.mappedToSource(noteIndex)) 0065 } 0066 } 0067 } 0068 0069 Component 0070 { 0071 id: _newNoteComponent 0072 NewNoteDialog 0073 { 0074 onNoteSaved: (note, noteIndex) => control.list.insert(note) 0075 } 0076 } 0077 0078 Maui.InfoDialog 0079 { 0080 id: _removeNotesDialog 0081 0082 property var notes 0083 0084 title: i18n("Remove notes") 0085 message: i18n("Are you sure you want to delete the selected notes?") 0086 0087 template.iconSource: "view-notes" 0088 0089 onAccepted: 0090 { 0091 console.log (notes) 0092 } 0093 0094 onRejected: close() 0095 } 0096 0097 initialItem: Maui.AltBrowser 0098 { 0099 id: cardsView 0100 gridView.itemSize: Math.min(300, control.width* 0.4) 0101 gridView.cellHeight: 180 0102 0103 enableLassoSelection: true 0104 0105 viewType: control.width > Maui.Style.units.gridUnit * 30 ? Maui.AltBrowser.ViewType.Grid : Maui.AltBrowser.ViewType.List 0106 0107 floatingFooter: true 0108 altHeader: Maui.Handy.isMobile 0109 0110 holder.visible: notesList.count === 0 || cardsView.count === 0 0111 holder.emoji: "qrc:/view-notes.svg" 0112 holder.title :i18n("No notes!") 0113 holder.body: i18n("You can quickly create a new note") 0114 0115 holder.actions:[ Action 0116 { 0117 text: i18n("New note") 0118 icon.name: "list-add" 0119 onTriggered: control.newNote() 0120 }] 0121 0122 headBar.rightContent: ToolButton 0123 { 0124 icon.name: "list-add" 0125 onClicked: control.newNote() 0126 } 0127 0128 headBar.forceCenterMiddleContent: root.isWide 0129 headBar.middleContent: Loader 0130 { 0131 Layout.fillWidth: true 0132 Layout.maximumWidth: 500 0133 Layout.alignment: Qt.AlignCenter 0134 // active: notesList.count > 0 0135 // visible: active 0136 asynchronous: true 0137 0138 sourceComponent: Maui.SearchField 0139 { 0140 placeholderText: i18n("Search ") + control.list.count + " " + i18n("notes") 0141 onAccepted: control.model.filter = text 0142 onCleared: control.model.filter = "" 0143 } 0144 } 0145 0146 headBar.leftContent: Maui.ToolButtonMenu 0147 { 0148 icon.name: "application-menu" 0149 0150 MA.AccountsMenuItem{} 0151 0152 MenuItem 0153 { 0154 text: i18n("Settings") 0155 icon.name: "settings-configure" 0156 onTriggered: _settingsDialog.open() 0157 } 0158 0159 MenuItem 0160 { 0161 text: i18n("About") 0162 icon.name: "documentinfo" 0163 onTriggered: root.about() 0164 } 0165 } 0166 0167 property string typingQuery 0168 0169 Maui.Chip 0170 { 0171 z: cardsView.z + 99999 0172 Maui.Theme.colorSet:Maui.Theme.Complementary 0173 visible: _typingTimer.running 0174 label.text: cardsView.typingQuery 0175 anchors.left: parent.left 0176 anchors.bottom: parent.bottom 0177 showCloseButton: false 0178 anchors.margins: Maui.Style.space.medium 0179 } 0180 0181 Timer 0182 { 0183 id: _typingTimer 0184 interval: 250 0185 onTriggered: 0186 { 0187 const index = notesList.indexOfName(cardsView.typingQuery) 0188 if(index > -1) 0189 { 0190 control.currentIndex = notesModel.mappedFromSource(index) 0191 } 0192 0193 cardsView.typingQuery = "" 0194 } 0195 } 0196 0197 Connections 0198 { 0199 target: cardsView.currentView 0200 ignoreUnknownSignals: true 0201 0202 function onItemsSelected(indexes) 0203 { 0204 console.log(indexes) 0205 for(var index of indexes) 0206 select(notesModel.get(index)) 0207 } 0208 0209 function onKeyPress(event) 0210 { 0211 const index = cardsView.currentIndex 0212 const item = notesModel.get(index) 0213 0214 var pat = /^([a-zA-Z0-9 _-]+)$/ 0215 if(event.count === 1 && pat.test(event.text)) 0216 { 0217 cardsView.typingQuery += event.text 0218 _typingTimer.restart() 0219 } 0220 0221 if((event.key == Qt.Key_Left || event.key == Qt.Key_Right || event.key == Qt.Key_Down || event.key == Qt.Key_Up) && (event.modifiers & Qt.ControlModifier) && (event.modifiers & Qt.ShiftModifier)) 0222 { 0223 cardsView.currentView.itemsSelected([index]) 0224 } 0225 0226 if(event.key === Qt.Key_Return) 0227 { 0228 currentNote = item 0229 setNote() 0230 } 0231 } 0232 } 0233 0234 model: Maui.BaseModel 0235 { 0236 id: notesModel 0237 list: Notes 0238 { 0239 id: notesList 0240 } 0241 sortOrder: settings.sortOrder 0242 sort: settings.sortBy 0243 recursiveFilteringEnabled: true 0244 sortCaseSensitivity: Qt.CaseInsensitive 0245 filterCaseSensitivity: Qt.CaseInsensitive 0246 } 0247 0248 footer: Maui.SelectionBar 0249 { 0250 id: _selectionbar 0251 anchors.horizontalCenter: parent.horizontalCenter 0252 width: Math.min(parent.width-(Maui.Style.space.medium*2), implicitWidth) 0253 0254 maxListHeight: control.height - Maui.Style.space.medium 0255 display: ToolButton.IconOnly 0256 0257 onVisibleChanged: 0258 { 0259 if(!visible) 0260 { 0261 cardsView.selectionMode = false 0262 } 0263 } 0264 0265 onExitClicked: 0266 { 0267 clear() 0268 } 0269 0270 listDelegate: Maui.ListBrowserDelegate 0271 { 0272 height: Maui.Style.rowHeight 0273 width: ListView.view.width 0274 0275 background: Rectangle 0276 { 0277 color: model.color ? model.color : "transparent" 0278 radius:Maui.Style.radiusV 0279 } 0280 0281 label1.text: model.title 0282 template.iconVisible: false 0283 iconSource: "view-pim-notes" 0284 checkable: true 0285 checked: true 0286 onToggled: _selectionbar.removeAtIndex(index) 0287 } 0288 0289 Action 0290 { 0291 text: i18n("Favorite") 0292 icon.name: "love" 0293 onTriggered: 0294 { 0295 for(var item of _selectionbar.items) 0296 notesList.update(({"favorite": _notesMenu.isFav ? 0 : 1}), notesModel.mappedToSource(notesList.indexOfNote(item.path))) 0297 0298 _selectionbar.clear() 0299 } 0300 } 0301 0302 Action 0303 { 0304 text: i18n("Share") 0305 icon.name: "document-share" 0306 } 0307 0308 Action 0309 { 0310 text: i18n("Export") 0311 icon.name: "document-export" 0312 } 0313 0314 Action 0315 { 0316 text: i18n("Delete") 0317 Maui.Theme.textColor: Maui.Theme.negativeTextColor 0318 icon.name: "edit-delete" 0319 0320 onTriggered: 0321 { 0322 _removeNotesDialog.notes = _selectionbar.uris 0323 _removeNotesDialog.open() 0324 } 0325 } 0326 } 0327 0328 listDelegate: CardDelegate 0329 { 0330 id: _listDelegate 0331 width: ListView.view.width 0332 checkable: cardsView.selectionMode 0333 checked: _selectionbar.contains(model.path) 0334 isCurrentItem: ListView.isCurrentItem 0335 0336 onClicked: (mouse) => 0337 { 0338 currentIndex = index 0339 0340 if(cardsView.selectionMode || (mouse.button == Qt.LeftButton && (mouse.modifiers & Qt.ControlModifier))) 0341 { 0342 cardsView.currentView.itemsSelected([index]) 0343 }else if(Maui.Handy.singleClick) 0344 { 0345 currentNote = notesModel.get(index) 0346 setNote() 0347 } 0348 } 0349 0350 onDoubleClicked: 0351 { 0352 control.currentIndex = index 0353 if(!Maui.Handy.singleClick && !cardsView.selectionMode) 0354 { 0355 currentNote = notesModel.get(index) 0356 setNote() 0357 } 0358 } 0359 0360 onRightClicked: 0361 { 0362 currentIndex = index 0363 currentNote = notesModel.get(index) 0364 _notesMenu.show() 0365 } 0366 0367 onPressAndHold: 0368 { 0369 currentIndex = index 0370 currentNote = notesModel.get(index) 0371 _notesMenu.show() 0372 } 0373 0374 onToggled: 0375 { 0376 currentIndex = index 0377 select(notesModel.get(index)) 0378 } 0379 0380 Connections 0381 { 0382 target: _selectionbar 0383 ignoreUnknownSignals: true 0384 0385 function onUriRemoved(uri) 0386 { 0387 if(uri === model.url) 0388 { 0389 _listDelegate.checked = false 0390 } 0391 } 0392 0393 function onUriAdded(uri) 0394 { 0395 if(uri === model.url) 0396 { 0397 _listDelegate.checked = true 0398 } 0399 } 0400 0401 function onCleared() 0402 { 0403 _listDelegate.checked = false 0404 } 0405 } 0406 } 0407 0408 gridDelegate: Item 0409 { 0410 id: delegate 0411 width: cardsView.gridView.cellWidth 0412 height: cardsView.gridView.cellHeight 0413 0414 property bool isCurrentItem: GridView.isCurrentItem 0415 0416 CardDelegate 0417 { 0418 id: _gridDelegate 0419 anchors.fill: parent 0420 anchors.margins: Maui.Style.space.medium 0421 checkable: cardsView.selectionMode 0422 checked: _selectionbar.contains(model.path) 0423 isCurrentItem: parent.isCurrentItem 0424 0425 onClicked: (mouse) => 0426 { 0427 currentIndex = index 0428 console.log(index, notesModel.mappedToSource(index), notesList.indexOfNote(model.url)) 0429 0430 if(cardsView.selectionMode || (mouse.button == Qt.LeftButton && (mouse.modifiers & Qt.ControlModifier))) 0431 { 0432 cardsView.currentView.itemsSelected([index]) 0433 }else if(Maui.Handy.singleClick) 0434 { 0435 currentNote = notesModel.get(index) 0436 setNote() 0437 } 0438 } 0439 0440 onDoubleClicked: 0441 { 0442 control.currentIndex = index 0443 if(!Maui.Handy.singleClick && !cardsView.selectionMode) 0444 { 0445 currentNote = notesModel.get(index) 0446 setNote() 0447 } 0448 } 0449 0450 onRightClicked: 0451 { 0452 currentIndex = index 0453 currentNote = notesModel.get(index) 0454 _notesMenu.show() 0455 } 0456 0457 onPressAndHold: 0458 { 0459 currentIndex = index 0460 currentNote = notesModel.get(index) 0461 _notesMenu.show() 0462 } 0463 0464 onToggled: 0465 { 0466 currentIndex = index 0467 select(notesModel.get(index)) 0468 } 0469 } 0470 0471 Connections 0472 { 0473 target: _selectionbar 0474 ignoreUnknownSignals: true 0475 0476 function onUriRemoved(uri) 0477 { 0478 if(uri === model.url) 0479 { 0480 _gridDelegate.checked = false 0481 } 0482 } 0483 0484 function onUriAdded(uri) 0485 { 0486 if(uri === model.url) 0487 { 0488 _gridDelegate.checked = true 0489 } 0490 } 0491 0492 function onCleared() 0493 { 0494 _gridDelegate.checked = false 0495 } 0496 } 0497 } 0498 0499 Connections 0500 { 0501 target: cardsView.holder 0502 function onActionTriggered() 0503 { 0504 newNote() 0505 } 0506 } 0507 0508 Maui.ContextualMenu 0509 { 0510 id: _notesMenu 0511 0512 property bool isFav: currentNote.favorite == 1 0513 0514 Maui.MenuItemActionRow 0515 { 0516 Action 0517 { 0518 icon.name: "love" 0519 text: _notesMenu.isFav? i18n("UnFav") : i18n("Fav") 0520 onTriggered: 0521 { 0522 notesList.update(({"favorite": _notesMenu.isFav ? 0 : 1}), notesModel.mappedToSource(cardsView.currentIndex)) 0523 _notesMenu.close() 0524 } 0525 } 0526 0527 Action 0528 { 0529 icon.name: "document-export" 0530 text: i18n("Export") 0531 onTriggered: 0532 { 0533 _notesMenu.close() 0534 } 0535 } 0536 0537 Action 0538 { 0539 icon.name : "edit-copy" 0540 text: i18n("Copy") 0541 onTriggered: 0542 { 0543 Maui.Handy.copyToClipboard({'text': currentNote.content}) 0544 _notesMenu.close() 0545 } 0546 } 0547 0548 Action 0549 { 0550 text: i18n("Share") 0551 icon.name: "document-share" 0552 // onTriggered: shareClicked() 0553 } 0554 } 0555 0556 MenuSeparator {} 0557 0558 MenuItem 0559 { 0560 text: i18n("Select") 0561 icon.name: "item-select" 0562 onTriggered: 0563 { 0564 if(Maui.Handy.isTouch) 0565 { 0566 cardsView.selectionMode = true 0567 } 0568 0569 cardsView.currentView.itemsSelected([cardsView.currentIndex]) 0570 } 0571 } 0572 0573 0574 MenuSeparator { } 0575 0576 MenuItem 0577 { 0578 icon.name: "edit-delete" 0579 text: i18n("Remove") 0580 Maui.Theme.textColor: Maui.Theme.negativeTextColor 0581 onTriggered: 0582 { 0583 notesList.remove(notesModel.mappedToSource(cardsView.currentIndex)) 0584 _notesMenu.close() 0585 } 0586 } 0587 0588 MenuSeparator { } 0589 0590 0591 ColorsBar 0592 { 0593 id: colorBar 0594 padding: control.padding 0595 width: parent.width 0596 currentColor: currentNote.color 0597 onColorPicked: 0598 { 0599 notesList.update(({"color": color}), notesModel.mappedToSource(cardsView.currentIndex)) 0600 _notesMenu.close() 0601 } 0602 } 0603 0604 } 0605 } 0606 0607 function select(item) 0608 { 0609 if(_selectionbar.contains(item.path)) 0610 { 0611 _selectionbar.removeAtUri(item.path) 0612 }else 0613 { 0614 _selectionbar.append(item.path, item) 0615 0616 } 0617 } 0618 } 0619