Warning, /maui/mauikit/src/controls.6/TabView.qml is written in an unsupported language. File is not indexed.
0001 import QtQuick
0002 import QtQml
0003
0004 import QtQuick.Controls
0005 import QtQuick.Layouts
0006 import Qt5Compat.GraphicalEffects
0007
0008 import org.mauikit.controls 1.3 as Maui
0009
0010 /**
0011 * @brief Container to organize items as a tab view.
0012 *
0013 * <a href="https://doc.qt.io/qt-6/qml-qtquick-controls-pane.html">This controls inherits from QQC2 Pane, to checkout its inherited properties refer to the Qt Docs.</a>
0014 *
0015 * The TabView organizes its children into different tabs - a tab for each child.
0016 * There are two ways for adding tabs to this view. The first one and easier is to declare the items as children. This will create a tab for each declared child item.
0017 * @see content
0018 *
0019 * @code
0020 * TabView
0021 * {
0022 * Rectangle
0023 * {
0024 * TabViewInfo.tabTitle: "Tab1"
0025 * TabViewInfo.tabIcon: "folder"
0026 * color: "blue"
0027 * }
0028 *
0029 * Rectangle
0030 * {
0031 * TabViewInfo.tabTitle: "Tab2"
0032 * TabViewInfo.tabIcon: "folder"
0033 * color: "yellow"
0034 * }
0035 * }
0036 * @endcode
0037 *
0038 * The second way to create tabs dynamically by adding new items using the control functions.
0039 * @see addTab
0040 *
0041 * @code
0042 * TabView
0043 * {
0044 * id: _tabView
0045 * tabBar.leftContent: Button
0046 * {
0047 * text: "Add Tab"
0048 * onClicked:
0049 * {
0050 * _tabView.addTab(_component)
0051 * }
0052 * }
0053 *
0054 * Component
0055 * {
0056 * id: _component
0057 * Rectangle
0058 * {
0059 * TabViewInfo.tabTitle: "Tab1"
0060 * TabViewInfo.tabIcon: "folder"
0061 * color: "blue"
0062 * }
0063 * }
0064 * }
0065 * @endcode
0066 *
0067 * @section structure Structure
0068 *
0069 * @note If you use this as the application window main control, remember you can use the attached Controls.showCSD property to display the window control buttons.
0070 * @code
0071 * TabView
0072 * {
0073 * Controls.showCSD : true
0074 * }
0075 * @endcode
0076 *
0077 * The TabView has two main sections, [1] the main contents area and [2] the tab bar, where the tab buttons - representing all the tab views - are listed.
0078 *
0079 * The tab bar listing has two "modes": one designed to fit desktop computers as a horizontal set of tab buttons; and the other one - more mobile friendly - as a grid overview of miniatures of the tab-views. Both modes can be toggle by using the mobile property.
0080 * @see mobile
0081 *
0082 * The main tab bar - usually in the top section - can be moved to the bottom area, for better reachability.
0083 * @see altTabBar
0084 *
0085 * The tab bar component is exposed via an alias, and items can be added to it - to the left or right side, using the leftContent or rightContent properties. This tab bar is handled by a MauiKit TabBar.
0086 * @see tabBar
0087 * @see TabBar
0088 *
0089 * @image html TabView/tabviews.png "TabView different states/sections. Further down the regular tab view with a tab bar on top, in the middle the tab view overview mode, and in the front the mobile mode with a single tab - other tab buttons can be flicked."
0090 *
0091 * @subsection finder Finder
0092 * The TabView has an integrated dialog to quickly perform searchers for an tab.
0093 *
0094 * @section notes Notes
0095 *
0096 * @subsection tabinfo Tabs Info
0097 * To add information, such as title, icon, etc, to the views, there is the `TabViewInfo` attached property.
0098 * Some of the available properties are:
0099 * - TabViewInfo.tabTitle
0100 * - TabViewInfo.tabToolTipText
0101 * - TabViewInfo.tabColor
0102 * - TabViewInfo.tabIcon
0103 * @see TabViewInfo
0104 *
0105 * @subsection menus Menus
0106 * It is possible to add actions to the the tab contextual menus.
0107 * @see menuActions
0108 *
0109 * @subsection customize Custom Tab Button
0110 * It is possible to set a different tab button for the tab bar. This will allow you to have more control about how the tab button is presented. To make it easier to integrate there is a control template that can be use as a base TabViewButton - different from TabButton.
0111 * @see tabViewButton
0112 * @see TabViewButton
0113 *
0114 * @note If you plan to change the tab button, consider using TabViewButton as a base, since it already has many of the needed things by the TabView to be integrated smoothly.
0115 *
0116 * @subsection functionality Functionality
0117 *
0118 * By default when clicking/tapping on the current tab button, the overview of tabs miniatures will be opened. The overview can also be oped using the corresponding function.
0119 * @see openOverview
0120 * @see closeOverview
0121 *
0122 * <a href="https://invent.kde.org/maui/mauikit/-/blob/qt6-2/examples/TabView.qml">You can find a more complete example at this link.</a>
0123 *
0124 */
0125 Pane
0126 {
0127 id: control
0128
0129 /**
0130 * @brief Each one of the items declared as the children of this component will become a tab view.
0131 * @property list<QtObject> TabView::content
0132 */
0133 default property alias content: _listView.contentData
0134
0135 /**
0136 * @brief An alias to the model of the container.
0137 * @property model TabView::contentModel
0138 */
0139 readonly property alias contentModel: _listView.contentModel
0140
0141 /**
0142 * @brief Current index number of the current tab in the view port.
0143 * @property int TabView::currentIndex
0144 */
0145 property alias currentIndex: _listView.currentIndex
0146
0147 /**
0148 * @brief The current item/tab view in focus.
0149 * @property Item TabView::currentItem
0150 */
0151 readonly property alias currentItem: _listView.currentItem
0152
0153 /**
0154 * @brief The total amount of tab views in this container.
0155 * @property int TabView::count
0156 */
0157 property alias count: _listView.count
0158
0159 /**
0160 * @brief An alias to a place holder text handled by a MauiKit Holder control. This is useful to display messages when there is not tab views in this container. To see how to set the message, icon and actions to it checkout the Holder documentation.
0161 * @see holder
0162 * @property Holder TabView::holder
0163 */
0164 property alias holder : _holder
0165
0166 /**
0167 * @brief Whether the layout of the tab bar should be in mobile or desktop mode. In mobile mode there is only one tab button in the tab bar view port, other tab button can be navigated by using the touch swipe gesture. In mobile mode the main method to switch between tab views is using the overview.
0168 * @see structure
0169 */
0170 property bool mobile : control.width <= Maui.Style.units.gridUnit * 30
0171
0172 /**
0173 * @brief Whether the tab bar hosting the tab buttons, should go in the bottom section or not. Moving it to the bottom section is a good idea for reachability in hand-held devices, such a phones. You can check if the current platform is a mobile one using the Handy attached property `Handy.isMobile`
0174 * @see Handy
0175 *
0176 */
0177 property bool altTabBar : false
0178
0179 /**
0180 * @brief Whether the view will support swipe gestures for switching between tab views.
0181 */
0182 property bool interactive: Maui.Handy.isTouch
0183
0184 /**
0185 * @brief Checks if the overview mode is open.
0186 */
0187 readonly property bool overviewMode : _stackView.depth === 2
0188
0189 /**
0190 * @brief An alias to the tab bar element. This is exposed so any other items can be placed on the right or left sections of it, or to fine tweak its public properties.
0191 * @see TabBar
0192 * @property TabBar TabView::tabBar
0193 */
0194 property alias tabBar: _tabBar
0195
0196 /**
0197 * @brief An alias to the contextual menu for the tab buttons. This has a child property named index, which refers to the index number of the tab for which the contextual menu was opened.
0198 * @see ContextualMenu
0199 * @property ContextualMenu TabView::menu
0200 */
0201 property alias menu :_menu
0202
0203 /**
0204 * @brief A set of actions can be added to the tab button contextual menu.
0205 * @code
0206 * TabView
0207 * {
0208 * id: _tabView
0209 * menuActions: Action
0210 * {
0211 * text: "Detach Tab"
0212 * onTriggered:
0213 * {
0214 * console.log("Detach tab at index, ", _tabView.menu.index)
0215 * }
0216 * }
0217 * }
0218 * @endcode
0219 */
0220 property list<Action> menuActions
0221
0222 /**
0223 * @brief The component to be used as the tab button in the tab bar. This can be changed to any other item, but it is recommend it to use TabViewButton as the base of the new custom control for the better integration.
0224 * @see TabViewButton
0225 */
0226 property Component tabViewButton : _tabButtonComponent
0227
0228 onWidthChanged: _tabBar.positionViewAtIndex(control.currentIndex)
0229 onCurrentIndexChanged: _tabBar.positionViewAtIndex(control.currentIndex)
0230
0231 spacing: 0
0232 padding: 0
0233
0234 Component
0235 {
0236 id: _tabButtonComponent
0237
0238 Maui.TabViewButton
0239 {
0240 id: _tabButton
0241 tabView: control
0242 closeButtonVisible: !control.mobile
0243
0244 onClicked:
0245 {
0246 if(_tabButton.mindex === control.currentIndex && control.count > 1)
0247 {
0248 control.openOverview()
0249 return
0250 }
0251
0252 _listView.setCurrentIndex(_tabButton.mindex)
0253 }
0254
0255 onRightClicked:
0256 {
0257 openTabMenu(_tabButton.mindex)
0258 }
0259
0260 onCloseClicked:
0261 {
0262 control.closeTabClicked(_tabButton.mindex)
0263 }
0264 }
0265 }
0266
0267 /**
0268 * @brief Emitted when the new-tab button has been clicked. This is the same as catching the signal from the TabBar element itself, using the exposed alias property.
0269 * @see tabBar
0270 */
0271 signal newTabClicked()
0272
0273 /**
0274 * @brief Emitted when the close button has been clicked on a tab button, or tab miniature in the overview. This signal sends the index of the tab. To correctly close the tab and release the resources, use the function `closeTab()`.
0275 * @param The index of the tab requested to be closed.
0276 * @see closeTab
0277 */
0278 signal closeTabClicked(int index)
0279
0280 Keys.enabled: true
0281 Keys.onPressed: (event) =>
0282 {
0283 if((event.key === Qt.Key_H) && (event.modifiers & Qt.ControlModifier))
0284 {
0285 control.findTab()
0286 }
0287 }
0288
0289 Maui.ContextualMenu
0290 {
0291 id: _menu
0292 parent: control
0293 property int index //tabindex
0294
0295 Repeater
0296 {
0297 model: control.menuActions
0298 delegate: MenuItem
0299 {
0300 action: modelData
0301 }
0302 }
0303
0304 MenuItem
0305 {
0306 text: i18nd("mauikit", "Open")
0307 icon.name: "tab-new"
0308 onTriggered:
0309 {
0310 _listView.setCurrentIndex(_menu.index)
0311 control.closeOverview()
0312 }
0313 }
0314
0315 MenuItem
0316 {
0317 text: i18nd("mauikit", "Close")
0318 icon.name: "tab-close"
0319 onTriggered:
0320 {
0321 control.closeTabClicked(_menu.index)
0322 }
0323 }
0324 }
0325
0326 data: Loader
0327 {
0328 id: _loader
0329 }
0330
0331 Component
0332 {
0333 id: _quickSearchComponent
0334
0335 Maui.PopupPage
0336 {
0337 id: _quickSearch
0338 persistent: false
0339 headBar.visible: true
0340
0341 onOpened: _quickSearchField.forceActiveFocus()
0342
0343 function find(query)
0344 {
0345 for(var i = 0; i < control.count; i ++)
0346 {
0347 var obj = _listView.contentModel.get(i)
0348 if(obj.Maui.TabViewInfo.tabTitle)
0349 {
0350 console.log("Trying to find tab", i, query, obj.Maui.TabViewInfo.tabTitle, String(obj.Maui.TabViewInfo.tabTitle).indexOf(query))
0351
0352 if(String(obj.Maui.TabViewInfo.tabTitle).toLowerCase().indexOf(query.toLowerCase()) !== -1)
0353 {
0354 return i
0355 }
0356 }
0357 }
0358
0359 return -1
0360 }
0361
0362 Timer
0363 {
0364 id: _typingTimer
0365 interval: 250
0366 onTriggered:
0367 {
0368 var index = _quickSearch.find(_quickSearchField.text)
0369 if(index > -1)
0370 {
0371 _filterTabsList.currentIndex = index
0372 }
0373 }
0374 }
0375
0376 headBar.middleContent: TextField
0377 {
0378 id: _quickSearchField
0379 Layout.fillWidth: true
0380 Layout.maximumWidth: 500
0381
0382 onTextChanged: _typingTimer.restart()
0383
0384 onAccepted:
0385 {
0386 control.setCurrentIndex(_filterTabsList.currentIndex)
0387 _quickSearch.close()
0388 }
0389
0390 Keys.enabled: true
0391
0392 Keys.onPressed: (event) =>
0393 {
0394 if((event.key === Qt.Key_Up))
0395 {
0396 _filterTabsList.flickable.decrementCurrentIndex()
0397 }
0398
0399 if((event.key === Qt.Key_Down))
0400 {
0401 _filterTabsList.flickable.incrementCurrentIndex()
0402 }
0403 }
0404 }
0405
0406 stack: Maui.ListBrowser
0407 {
0408 id: _filterTabsList
0409 Layout.fillWidth: true
0410 Layout.fillHeight: true
0411 currentIndex: _listView.currentIndex
0412
0413 model: _listView.count
0414
0415 delegate: Maui.ListDelegate
0416 {
0417 width: ListView.view.width
0418
0419 label: _listView.contentModel.get(index).Maui.TabViewInfo.tabTitle
0420
0421 onClicked:
0422 {
0423 currentIndex =index
0424 _listView.setCurrentIndex(index)
0425 _quickSearch.close()
0426 }
0427 }
0428 }
0429 }
0430 }
0431
0432 contentItem: Item
0433 {
0434 StackView
0435 {
0436 anchors.fill: parent
0437 id: _stackView
0438
0439 initialItem: Item
0440 {
0441 Maui.TabBar
0442 {
0443 id: _tabBar
0444
0445 z : _listView.z+1
0446
0447 anchors.left: parent.left
0448 anchors.right: parent.right
0449 Maui.Controls.showCSD : control.Maui.Controls.showCSD === true
0450 visible: _listView.count > 1
0451
0452 interactive: control.interactive
0453 showNewTabButton: !control.mobile
0454
0455 onNewTabClicked: control.newTabClicked()
0456 onNewTabFocused:
0457 {
0458 if(control.mobile)
0459 {
0460 _listView.setCurrentIndex(index)
0461 }
0462 }
0463
0464 position: control.altTabBar ? TabBar.Footer : TabBar.Header
0465
0466 Repeater
0467 {
0468 model: control.count
0469 delegate: control.tabViewButton
0470 }
0471
0472 // rightContent: Button
0473 // {
0474 // visible: control.mobile && control.count > 1
0475 // text: control.count
0476 // onClicked: openOverview()
0477 // }
0478
0479 Keys.onPressed: (event) =>
0480 {
0481 if(event.key == Qt.Key_Return)
0482 {
0483 _listView.setCurrentIndex(currentIndex)
0484 }
0485
0486 if(event.key == Qt.Key_Down)
0487 {
0488 _listView.currentItem.forceActiveFocus()
0489 }
0490 }
0491
0492 states: [ State
0493 {
0494 when: !control.altTabBar && control.tabBar.visible
0495
0496 AnchorChanges
0497 {
0498 target: _tabBar
0499 anchors.top: parent.top
0500 anchors.bottom: undefined
0501 }
0502
0503 PropertyChanges
0504 {
0505 target: _tabBar
0506 position: TabBar.Header
0507 }
0508 },
0509
0510 State
0511 {
0512 when: control.altTabBar && control.tabBar.visible
0513
0514 AnchorChanges
0515 {
0516 target: _tabBar
0517 anchors.top: undefined
0518 anchors.bottom: parent.bottom
0519 }
0520
0521 PropertyChanges
0522 {
0523 target: _tabBar
0524 position: ToolBar.Footer
0525 }
0526 } ]
0527 }
0528
0529 SwipeView
0530 {
0531 id: _listView
0532 anchors.fill: parent
0533
0534 anchors.bottomMargin: control.altTabBar && _tabBar.visible ? _tabBar.height : 0
0535 anchors.topMargin: !control.altTabBar && _tabBar.visible ? _tabBar.height : 0
0536
0537 interactive: false
0538
0539 spacing: control.spacing
0540
0541 clip: control.clip
0542
0543 orientation: ListView.Horizontal
0544 background: null
0545
0546 contentItem: ListView
0547 {
0548 id: _listView2
0549 model: _listView.contentModel
0550 interactive: false
0551 currentIndex: _listView.currentIndex
0552
0553 spacing: _listView.spacing
0554
0555 clip: false
0556
0557 orientation: ListView.Horizontal
0558 snapMode: ListView.SnapOneItem
0559
0560 boundsBehavior: Flickable.StopAtBounds
0561 boundsMovement :Flickable.StopAtBounds
0562
0563 preferredHighlightBegin: 0
0564 preferredHighlightEnd: width
0565
0566 highlightRangeMode: ListView.StrictlyEnforceRange
0567 highlightMoveDuration: 0
0568 highlightFollowsCurrentItem: true
0569 highlightResizeDuration: 0
0570 highlightMoveVelocity: -1
0571 highlightResizeVelocity: -1
0572
0573 maximumFlickVelocity: 4 * width
0574
0575 cacheBuffer: _listView.count * width
0576 keyNavigationEnabled : false
0577 keyNavigationWraps : false
0578 }
0579 }
0580
0581 Maui.Holder
0582 {
0583 id: _holder
0584 anchors.fill: parent
0585 visible: !control.count
0586 emojiSize: Maui.Style.iconSizes.huge
0587 }
0588 }
0589
0590 Component
0591 {
0592 id: _overviewComponent
0593
0594 Pane
0595 {
0596 id: _pane
0597 Maui.Theme.colorSet: Maui.Theme.View
0598 Maui.Theme.inherit: false
0599
0600 background: Rectangle
0601 {
0602 color: Maui.Theme.backgroundColor
0603 Loader
0604 {
0605 active: !Maui.Handy.isMobile
0606 asynchronous: true
0607 anchors.fill: parent
0608 sourceComponent: Item
0609 {
0610 DragHandler
0611 {
0612 acceptedDevices: PointerDevice.GenericPointer
0613 grabPermissions: PointerHandler.CanTakeOverFromItems | PointerHandler.CanTakeOverFromHandlersOfDifferentType | PointerHandler.ApprovesTakeOverByAnything
0614 onActiveChanged: if (active) { control.Window.window.startSystemMove(); }
0615 }
0616 }
0617 }
0618 }
0619
0620 contentItem: Maui.GridBrowser
0621 {
0622 id: _overviewGrid
0623 model: control.count
0624
0625 currentIndex: control.currentIndex
0626
0627 itemSize: Math.min(200, availableWidth /2)
0628
0629 Loader
0630 {
0631 asynchronous: true
0632 anchors.bottom: parent.bottom
0633 anchors.right: parent.right
0634 anchors.margins: Maui.Style.space.big
0635 sourceComponent: Maui.FloatingButton
0636 {
0637 icon.name: "list-add"
0638 onClicked: control.newTabClicked()
0639 }
0640 }
0641
0642 onAreaClicked:
0643 {
0644 control.closeOverview()
0645 }
0646
0647 delegate: Item
0648 {
0649 height: GridView.view.cellHeight
0650 width: GridView.view.cellWidth
0651
0652 Maui.GridBrowserDelegate
0653 {
0654 id: _delegate
0655
0656 anchors.fill: parent
0657 anchors.margins: Maui.Style.space.medium
0658
0659 isCurrentItem : parent.GridView.isCurrentItem
0660 label1.text: _listView.contentModel.get(index).Maui.TabViewInfo.tabTitle
0661 // template.labelSizeHint: 32
0662 iconSource: "tab-new"
0663 flat: false
0664
0665 tooltipText: _listView.contentModel.get(index).Maui.TabViewInfo.tabToolTipText
0666
0667 Rectangle
0668 {
0669 parent: _delegate.background
0670 color: _listView.contentModel.get(index).Maui.TabViewInfo.tabColor
0671 height: 2
0672 width: parent.width*0.9
0673 anchors.bottom: parent.bottom
0674 anchors.horizontalCenter: parent.horizontalCenter
0675 }
0676
0677 onRightClicked:
0678 {
0679 _listView.setCurrentIndex(index)
0680 openTabMenu(_listView.currentIndex)
0681 }
0682
0683 onClicked:
0684 {
0685 control.closeOverview()
0686 _listView.setCurrentIndex(index)
0687 }
0688
0689 onPressAndHold:
0690 {
0691 _listView.setCurrentIndex(index)
0692 openTabMenu(control.currentIndex)
0693 }
0694
0695 template.iconComponent: Item
0696 {
0697 clip: true
0698
0699 ShaderEffectSource
0700 {
0701 id: _effect
0702
0703 anchors.centerIn: parent
0704
0705 readonly property double m_scale: Math.min(parent.height/sourceItem.height, parent.width/sourceItem.width)
0706
0707 height: sourceItem.height * m_scale
0708 width: sourceItem.width * m_scale
0709
0710 hideSource: false
0711 live: false
0712 smooth: true
0713
0714 textureSize: Qt.size(width,height)
0715 sourceItem: _listView.contentModel.get(index)
0716 layer.enabled: Maui.Style.enableEffects
0717 layer.smooth: true
0718 layer.effect: OpacityMask
0719 {
0720 maskSource: Rectangle
0721 {
0722 width: _effect.width
0723 height: _effect.height
0724 radius: Maui.Style.radiusV
0725 }
0726 }
0727 }
0728
0729 Maui.CloseButton
0730 {
0731 id: _closeButton
0732 visible: _delegate.isCurrentItem || _delegate.hovered || Maui.Handy.isMobile
0733 anchors.top: parent.top
0734 anchors.right: parent.right
0735 // anchors.margins: Maui.Style.space.small
0736
0737 onClicked: control.closeTabClicked(index)
0738
0739 background: Rectangle
0740 {
0741 radius: height/2
0742 color: _closeButton.hovered || _closeButton.containsPress ? Maui.Theme.negativeBackgroundColor : Maui.Theme.backgroundColor
0743
0744 Behavior on color
0745 {
0746 Maui.ColorTransition{}
0747 }
0748 }
0749 }
0750 }
0751 }
0752 }
0753 }
0754 }
0755 }
0756 }
0757 }
0758
0759 /**
0760 * @brief Close a tab view at a given index. This will release the resources, and move the focus to the previous tab view
0761 * @param index index of the tab to be closed
0762 */
0763 function closeTab(index)
0764 {
0765 _listView.removeItem(_listView.itemAt(index))
0766 // _tabBar.removeItem(_tabBar.itemAt(index))
0767
0768 _listView.currentItemChanged()
0769 _listView.currentItem.forceActiveFocus()
0770 }
0771
0772 /**
0773 * @brief Adds a new tab view element, the passed element must be a component which will be created by the function and then added to the container
0774 * @param component a Component element hosting the actual element to be created.
0775 * @param properties set of values that can be passed as a map of properties to be assigned to the component when created
0776 * @param quiet optionally you can choose to create the tab quietly or not: by quietly it means that the tab-component will be instantiated and created but will not be focused right away. If quiet is set to `false` - to which it defaults - then after the creation of the component the new tab will get focused.
0777 */
0778 function addTab(component, properties, quiet = false) : Item
0779 {
0780 if(control.overviewMode)
0781 {
0782 control.closeOverview()
0783 }
0784
0785 const object = component.createObject(control, properties);
0786
0787 _listView.addItem(object)
0788
0789 if(!quiet)
0790 {
0791 _listView.setCurrentIndex(Math.max(_listView.count -1, 0))
0792 object.forceActiveFocus()
0793 }
0794
0795 return object
0796 }
0797
0798 /**
0799 * @brief Method to open the tab finder.
0800 */
0801 function findTab()
0802 {
0803 if(control.count > 1)
0804 {
0805 _loader.sourceComponent = _quickSearchComponent
0806 _loader.item.open()
0807 }
0808 }
0809
0810 /**
0811 * @brief Method to open the tabs overview.
0812 */
0813 function openOverview()
0814 {
0815 if(_stackView.depth === 2)
0816 {
0817 return
0818 }
0819 _stackView.push(_overviewComponent)
0820 }
0821
0822 /**
0823 * @brief Close the overview of miniature tabs.
0824 */
0825 function closeOverview()
0826 {
0827 if(_stackView.depth === 1)
0828 {
0829 return
0830 }
0831
0832 _stackView.pop()
0833 }
0834
0835 /**
0836 * @brief Method to correctly move a tab from one place to another by using the index numbers
0837 * @param from the current index number of the tab to be moved
0838 * @param to the new index value to where to move the tab
0839 */
0840 function moveTab(from, to)
0841 {
0842 _listView.moveItem(from, to)
0843 _tabBar.moveItem(from, to)
0844
0845 _listView.setCurrentIndex(to)
0846 _tabBar.setCurrentIndex(_listView.currentIndex)
0847
0848 _listView2.positionViewAtIndex(_listView.currentIndex, ListView.Contain)
0849
0850 _listView.currentItemChanged()
0851 _listView.currentItem.forceActiveFocus()
0852 }
0853
0854 /**
0855 * @brief This allows to change the current tab without breaking the bindings from the `currentIndex` property
0856 * @param index the index to change to
0857 */
0858 function setCurrentIndex(index)
0859 {
0860 _tabBar.setCurrentIndex(index)
0861 _listView.setCurrentIndex(index)
0862 _listView.currentItem.forceActiveFocus()
0863 }
0864
0865 /**
0866 * @brief Return the Item of the tab view at a given index number
0867 * @return the Item element representing the tab view
0868 */
0869 function tabAt(index)
0870 {
0871 return _listView.itemAt(index)
0872 }
0873
0874 /**
0875 * @brief Opens the tab contextual menu at a given index number
0876 */
0877 function openTabMenu(index)
0878 {
0879 _menu.index = index
0880 _menu.show()
0881 }
0882 }