overte/interface/resources/qml/hifi/tablet/Tablet.qml
2017-12-07 19:13:39 +01:00

404 lines
12 KiB
QML

import QtQuick 2.7
import QtQuick.Controls 2.2
import QtGraphicalEffects 1.0
import QtQuick.Layouts 1.3
import "../../styles-uit"
import "../audio" as HifiAudio
Item {
id: tablet
objectName: "tablet"
property int rowIndex: 6 // by default
property int columnIndex: 1 // point to 'go to location'
property int count: 0
property var tabletButtons: new Array()
onTabletButtonsChanged: console.warn("tablet buttons", tabletButtons)
Timer {
id: gridsRecreateTimer
interval: 100
repeat: false
onTriggered: {
console.warn("timer triggered", tabletButtons.length)
doRecreateGrids()
}
}
Item {
id: fakeParent
visible: parent
}
function doRecreateGrids() {
console.warn("buttons length", tabletButtons.length)
for (var i = 0; i < swipeView.count; i++) {
var gridOuter = swipeView.itemAt(i);
gridOuter.destroy();
swipeView.removeItem(i);
}
for (var buttonIndex = 0; buttonIndex < tabletButtons.length; buttonIndex++) {
console.warn("button index", buttonIndex)
var grid = swipeView.itemAt(swipeView.count - 1);
if (grid === null || grid.children[0].children.length === 12) {
grid = pageComponent.createObject(swipeView);
console.warn("grid index", swipeView.count)
//swipeView.addItem(grid);
}
var button = tabletButtons[buttonIndex]
button.parent = grid.children[0]
grid.children[0].children.push(button);
}
}
// used to look up a button by its uuid
function findButtonIndex(uuid) {
if (!uuid) {
return -1;//{ page: -1, index: -1};
}
for (var i in tabletButtons) {
var child = tabletButtons[i];
if (child.uuid === uuid) {
return i;
}
}
// for (var gridIndex = 0; gridIndex < swipeView.count; gridIndex++) {
// var grid = swipeView.itemAt(gridIndex).children[0]
// for (var i in grid.children) {
// var child = grid.children[i];
// if (child.uuid === uuid) {
// return { page: gridIndex, index: i};
// }
// }
// }
return -1;//{ page: -1, index: -1};
}
function sortButtons(/*gridIndex*/) {
//var children = [];
// var grid = swipeView.itemAt(gridIndex).children[0]
// for (var i = 0; i < grid.children.length; i++) {
// children[i] = grid.children[i];
// }
tabletButtons.sort(function (a, b) {
if (a.sortOrder === b.sortOrder) {
// subsort by stableOrder, because JS sort is not stable in qml.
return a.stableOrder - b.stableOrder;
} else {
return a.sortOrder - b.sortOrder;
}
});
//grid.children = children;
}
function doAddButton(/*grid, gridIndex,*/ component, properties) {
var button = component.createObject(/*swipeView.itemAt(0).children[0]*/fakeParent);
// copy all properites to button
var keys = Object.keys(properties).forEach(function (key) {
button[key] = properties[key];
});
// pass a reference to the tabletRoot object to the button.
if (tabletRoot) {
button.tabletRoot = tabletRoot;
} else {
button.tabletRoot = parent.parent;
}
button.flickable = swipeView.contentItem
tabletButtons.push(button)
//sortButtons(/*gridIndex*/);
tablet.count++
//redraw pages
doRecreateGrids()
// console.warn("timer restarted", tabletButtons.length)
// gridsRecreateTimer.restart()
return button;
}
Component {
id: pageComponent
Item {
Grid {
anchors {
fill: parent
topMargin: 20
leftMargin: 30
rightMargin: 30
bottomMargin: 0
}
rows: 4; columns: 3; rowSpacing: 16; columnSpacing: 16;
}
}
}
// called by C++ code when a button should be added to the tablet
function addButtonProxy(properties) {
var component = Qt.createComponent("TabletButton.qml");
// var grid = swipeView.itemAt(swipeView.count - 1)
// if (grid === null || grid.children[0].children.length === 12) {
// grid = pageComponent.createObject(swipeView)
// swipeView.addItem(grid)
// }
console.warn("component status", component.status);
return doAddButton(/*grid, swipeView.count - 1,*/ component, properties)
}
// called by C++ code when a button should be removed from the tablet
function removeButtonProxy(properties) {
var index = findButtonIndex(properties.uuid);
if (index < 0) {
console.log("Warning: Tablet.qml could not find button with uuid = " + properties.uuid);
} else {
// var grid = swipeView.itemAt(index.page).children[0]
// grid.children[index.index].destroy();
console.warn("remove button proxy");
tabletButtons.slice(index, 1);
tablet.count--
//redraw grids
gridsRecreateTimer.restart();
}
}
Rectangle {
id: bgTopBar
height: 90
anchors {
top: parent.top
topMargin: 0
left: parent.left
leftMargin: 0
right: parent.right
rightMargin: 0
}
gradient: Gradient {
GradientStop {
position: 0
color: "#2b2b2b"
}
GradientStop {
position: 1
color: "#1e1e1e"
}
}
HifiAudio.MicBar {
anchors {
left: parent.left
leftMargin: 30
verticalCenter: parent.verticalCenter
}
}
Item {
width: 150
height: 50
anchors.right: parent.right
anchors.rightMargin: 30
anchors.verticalCenter: parent.verticalCenter
ColumnLayout {
anchors.fill: parent
RalewaySemiBold {
text: Account.loggedIn ? qsTr("Log out") : qsTr("Log in")
horizontalAlignment: Text.AlignRight
anchors.right: parent.right
font.pixelSize: 20
color: "#afafaf"
}
RalewaySemiBold {
visible: Account.loggedIn
height: Account.loggedIn ? parent.height/2 - parent.spacing/2 : 0
text: Account.loggedIn ? "[" + tabletRoot.usernameShort + "]" : ""
horizontalAlignment: Text.AlignRight
anchors.right: parent.right
font.pixelSize: 20
color: "#afafaf"
}
}
MouseArea {
anchors.fill: parent
onClicked: {
if (!Account.loggedIn) {
DialogsManager.showLoginDialog()
} else {
Account.logOut()
}
}
}
}
}
Component.onCompleted: {
console.warn("Tablet created")
//pageComponent.createObject(swipeView)
// var tabletq = Tablet.getTablet("com.highfidelity.interface.tablet.system");
// if (tabletq) {
// // Tablet/toolbar button.
// for (var i = 0; i < 1; i++) {
// tabletq.addButton({ icon: "icons/tablet-icons/avatar-record-i.svg", activeIcon: "icons/tablet-icons/avatar-record-i.svg",
// text: "App " + i, isActive: false });
// }
// }
}
Rectangle {
id: bgMain
gradient: Gradient {
GradientStop {
position: 0
color: "#2b2b2b"
}
GradientStop {
position: 1
color: "#0f212e"
}
}
anchors.bottom: parent.bottom
anchors.right: parent.right
anchors.left: parent.left
anchors.top: bgTopBar.bottom
SwipeView {
id: swipeView
clip: false
currentIndex: pageIndicator.currentIndex
hoverEnabled: true
onHoveredChanged: console.warn("swipe hovered", hovered)
onCurrentIndexChanged: console.warn("swipe currentIndex", currentIndex)
anchors {
left: parent.left
right: parent.right
top: parent.top
bottom: pageIndicator.top
}
}
PageIndicator {
id: pageIndicator
currentIndex: swipeView.currentIndex
delegate: Item {
width: 15
height: 15
Rectangle {
anchors.centerIn: parent
opacity: index === pageIndicator.currentIndex ? 0.95 : pressed ? 0.7 : 0.45
implicitWidth: index === pageIndicator.currentIndex ? 15 : 10
implicitHeight: implicitWidth
radius: width/2
color: "white"
Behavior on opacity {
OpacityAnimator {
duration: 100
}
}
}
MouseArea {
anchors.fill: parent
enabled: false //disabled by default
onClicked: {
if (index !== swipeView.currentIndex) {
swipeView.currentIndex = index
}
}
}
}
interactive: false
anchors.bottom: parent.bottom
anchors.horizontalCenter: parent.horizontalCenter
count: swipeView.count
}
}
function getPage(row, column) {
var pageIndex = Math.floor((row + column) / 12)
var index = (row + column) % 12
var page = swipeView.itemAt(pageIndex).children[0]
return { page: page, index: index, pageIndex: pageIndex }
}
function setCurrentItemState(state) {
var index = rowIndex + columnIndex;
if (index >= 0 && index <= count ) {
var grid = getPage(rowIndex, columnIndex)
grid.page.children[grid.index].state = state;
swipeView.currentIndex = grid.pageIndex
}
}
function nextItem() {
setCurrentItemState("base state");
var nextColumnIndex = (columnIndex + 3 + 1) % 3;
var nextIndex = rowIndex + nextColumnIndex;
if(nextIndex < count) {
columnIndex = nextColumnIndex;
};
setCurrentItemState("hover state");
}
function previousItem() {
setCurrentItemState("base state");
var prevIndex = (columnIndex + 3 - 1) % 3;
if((rowIndex + prevIndex) < count){
columnIndex = prevIndex;
}
setCurrentItemState("hover state");
}
function upItem() {
setCurrentItemState("base state");
rowIndex = rowIndex - 3;
if (rowIndex < 0 ) {
rowIndex = (count - (count % 3));
var index = rowIndex + columnIndex;
if(index > count) {
rowIndex = rowIndex - 3;
}
}
setCurrentItemState("hover state");
}
function downItem() {
setCurrentItemState("base state");
rowIndex = rowIndex + 3;
var index = rowIndex + columnIndex;
if (index > count ) {
rowIndex = 0;
}
setCurrentItemState("hover state");
}
function selectItem() {
var grid = getPage(rowIndex, columnIndex)
grid.page.children[grid.index].clicked();
if (tabletRoot) {
tabletRoot.playButtonClickSound();
}
}
Keys.onRightPressed: nextItem();
Keys.onLeftPressed: previousItem();
Keys.onDownPressed: downItem();
Keys.onUpPressed: upItem();
Keys.onReturnPressed: selectItem();
}