113 lines
2.8 KiB
QML
113 lines
2.8 KiB
QML
|
import QtQuick 2.0
|
||
|
|
||
|
Item {
|
||
|
id: root
|
||
|
property int activeTab: -1
|
||
|
property var tabs: []
|
||
|
property var titles: []
|
||
|
property int __panelWidth: 250
|
||
|
|
||
|
readonly property int panelWidth: __panelWidth
|
||
|
|
||
|
Rectangle {
|
||
|
id: contentBox
|
||
|
x: parent.width - width // can't use an anchors, for dragability
|
||
|
|
||
|
height: parent.height
|
||
|
width: (activeTab >= 0) ? __panelWidth : 0
|
||
|
color: "#1f1f1f"
|
||
|
Behavior on width {
|
||
|
enabled: !splitterDrag.drag.active
|
||
|
NumberAnimation {
|
||
|
duration: 250
|
||
|
}
|
||
|
}
|
||
|
|
||
|
clip: true
|
||
|
|
||
|
Loader {
|
||
|
id: loader
|
||
|
anchors.fill: parent
|
||
|
sourceComponent: (activeTab >= 0) ? tabs[activeTab] : null
|
||
|
}
|
||
|
|
||
|
Connections {
|
||
|
target: loader.item
|
||
|
onRequestPanelClose: root.activeTab = -1;
|
||
|
ignoreUnknownSignals: true
|
||
|
}
|
||
|
}
|
||
|
|
||
|
Rectangle {
|
||
|
id: splitter
|
||
|
width: 2
|
||
|
height: parent.height
|
||
|
anchors.right: contentBox.left
|
||
|
|
||
|
color: "orange"
|
||
|
|
||
|
MouseArea {
|
||
|
id: splitterDrag
|
||
|
height: parent.height
|
||
|
width: parent.width * 25
|
||
|
|
||
|
drag.target: contentBox
|
||
|
drag.axis: Drag.XAxis
|
||
|
drag.minimumX: 0
|
||
|
drag.maximumX: root.width
|
||
|
|
||
|
onMouseXChanged: {
|
||
|
__panelWidth = root.width - contentBox.x
|
||
|
}
|
||
|
|
||
|
// enabled when open?
|
||
|
|
||
|
// click to toggle open / close
|
||
|
|
||
|
cursorShape: Qt.SizeHorCursor
|
||
|
}
|
||
|
}
|
||
|
|
||
|
Column {
|
||
|
anchors.right: splitter.left
|
||
|
anchors.top: parent.top
|
||
|
anchors.topMargin: 20
|
||
|
spacing: 1
|
||
|
|
||
|
Repeater {
|
||
|
model: tabs
|
||
|
Rectangle {
|
||
|
readonly property bool tabIsActive: (model.index == activeTab)
|
||
|
width: tabLabel.implicitHeight + 10
|
||
|
height: tabLabel.implicitWidth + 20
|
||
|
|
||
|
color: "#3f3f3f"
|
||
|
border.width: 1
|
||
|
border.color: "#5f5f5f"
|
||
|
|
||
|
Text {
|
||
|
anchors.centerIn: parent
|
||
|
id: tabLabel
|
||
|
text: titles[model.index]
|
||
|
rotation: 90
|
||
|
color: tabIsActive ? "orange" : tabMouse.containsMouse ? "#afafaf" : "#9f9f9f"
|
||
|
transformOrigin: Item.Center
|
||
|
}
|
||
|
|
||
|
MouseArea {
|
||
|
id: tabMouse
|
||
|
hoverEnabled: true
|
||
|
anchors.fill: parent
|
||
|
onClicked: {
|
||
|
if (parent.tabIsActive) {
|
||
|
activeTab = -1
|
||
|
} else {
|
||
|
activeTab = model.index
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
} // rectangle
|
||
|
} // of repeater
|
||
|
}
|
||
|
}
|