| 
									
										
										
										
											2019-10-13 14:43:38 -07:00
										 |  |  | // SPDX-License-Identifier: GPL-2.0
 | 
					
						
							|  |  |  | import QtQuick 2.2 | 
					
						
							|  |  |  | import QtQuick.Controls 2.2 as Controls | 
					
						
							|  |  |  | import org.kde.kirigami 2.4 as Kirigami | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Controls.TextField { | 
					
						
							|  |  |  | 	/** | 
					
						
							|  |  |  | 	 * set the flickable property to the Flickable this TextField is part of and | 
					
						
							|  |  |  | 	 * when the user starts editing the text this should stay visible | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	property var flickable | 
					
						
							|  |  |  | 	property bool firstTime: true | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-15 12:27:58 -08:00
										 |  |  | 	/** | 
					
						
							|  |  |  | 	 * set inComboBox if the TextField is used in an editable ComboBox | 
					
						
							|  |  |  | 	 * this ensures that the baseline that is used to visually indicate that the user can | 
					
						
							|  |  |  | 	 * edit the text as well as use the drop down is placed much closer to the actual text | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	property bool inComboBox: false | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-13 14:43:38 -07:00
										 |  |  | 	id: stf | 
					
						
							| 
									
										
										
										
											2021-01-15 12:27:58 -08:00
										 |  |  | 	background: Item { | 
					
						
							|  |  |  | 		Rectangle { | 
					
						
							|  |  |  | 			width: parent.width - Kirigami.Units.smallSpacing | 
					
						
							|  |  |  | 			x: inComboBox ? Kirigami.Units.smallSpacing : -1 | 
					
						
							|  |  |  | 			height: 1 | 
					
						
							|  |  |  | 			color: stf.focus ? subsurfaceTheme.primaryColor : Qt.darker(subsurfaceTheme.backgroundColor, 1.2) | 
					
						
							|  |  |  | 			anchors.bottom: parent.bottom | 
					
						
							|  |  |  | 			anchors.bottomMargin: inComboBox ? Kirigami.Units.largeSpacing : 1 | 
					
						
							|  |  |  | 			visible: !stf.readOnly | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2019-10-13 14:43:38 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// while we are at it, let's put some common settings here into the shared element
 | 
					
						
							| 
									
										
										
										
											2021-01-15 12:27:58 -08:00
										 |  |  | 	font.pointSize: subsurfaceTheme.regularPointSize | 
					
						
							|  |  |  | 	topPadding: 0 | 
					
						
							|  |  |  | 	bottomPadding: 0 | 
					
						
							| 
									
										
										
										
											2019-10-13 14:43:38 -07:00
										 |  |  | 	color: subsurfaceTheme.textColor | 
					
						
							|  |  |  | 	onEditingFinished: { | 
					
						
							|  |  |  | 		focus = false | 
					
						
							|  |  |  | 		firstTime = true | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-30 16:39:16 -08:00
										 |  |  | 	// once a text input has focus, make sure it is visible
 | 
					
						
							|  |  |  | 	// we do this via a timer to give the OS time to show a virtual keyboard
 | 
					
						
							|  |  |  | 	onFocusChanged:	{ | 
					
						
							|  |  |  | 		if (focus && flickable !== undefined) { | 
					
						
							| 
									
										
										
										
											2019-10-13 14:43:38 -07:00
										 |  |  | 			waitForKeyboard.start() | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// give the OS enough time to actually resize the flickable
 | 
					
						
							|  |  |  | 	Timer { | 
					
						
							|  |  |  | 		id: waitForKeyboard | 
					
						
							|  |  |  | 		interval: 300 // 300ms seems like FOREVER, but even that sometimes isn't long enough on Android
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		onTriggered: { | 
					
						
							|  |  |  | 			if (!Qt.inputMethod.visible) { | 
					
						
							|  |  |  | 				if (firstTime) { | 
					
						
							|  |  |  | 					firstTime = false | 
					
						
							|  |  |  | 					restart() | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 				return | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			// make sure there's enough space for the input field above the keyboard and action button (and that it's not too far up, either)
 | 
					
						
							| 
									
										
										
										
											2020-12-30 16:41:45 -08:00
										 |  |  | 			var positionInFlickable = stf.mapToItem(flickable.contentItem, 0, 0) | 
					
						
							|  |  |  | 			var stfY = positionInFlickable.y | 
					
						
							| 
									
										
										
										
											2021-01-16 08:59:22 -08:00
										 |  |  | 			if (manager.verboseEnabebled) | 
					
						
							|  |  |  | 				manager.appendTextToLog("position check: lower edge of view is " + (0 + flickable.contentY + flickable.height) + " and text field is at " + stfY) | 
					
						
							| 
									
										
										
										
											2020-12-30 16:41:45 -08:00
										 |  |  | 			if (stfY + stf.height > flickable.contentY + flickable.height - 3 * Kirigami.Units.gridUnit || stfY < flickable.contentY) | 
					
						
							|  |  |  | 				flickable.contentY = Math.max(0, 3 * Kirigami.Units.gridUnit + stfY + stf.height - flickable.height) | 
					
						
							| 
									
										
										
										
											2019-10-13 14:43:38 -07:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } |