lumina-qml/src/qml/main.qml
2024-09-15 06:06:13 -05:00

363 lines
11 KiB
QML

import QtQuick
/* import QtQuick.Dialogs */
import QtQuick.Controls as Controls
import Qt.labs.platform as Labs
import QtQuick.Window
import QtQuick.Layouts
import QtMultimedia
/* import QtAudioEngine 1.15 */
import org.kde.kirigami 2.13 as Kirigami
import "./presenter" as Presenter
import org.presenter 1.0
Kirigami.ApplicationWindow {
id: rootApp
property bool libraryOpen: true
property bool presenting: false
property var presentationScreen
property var screens
property string activeServiceItem
property bool editMode: false
property string soundEffect
property string footerSecondText
property string footerFirstText
signal edit()
onActiveFocusItemChanged: console.log("FOCUS CHANGED TO: " + activeFocusControl)
onClosing: mainPage.closeAll()
/* pageStack.initialPage: mainPage */
header: Presenter.Header {}
menuBar: Controls.MenuBar {
visible: !Kirigami.Settings.hasPlatformMenuBar
Controls.Menu {
title: qsTr("File")
Controls.MenuItem { text: qsTr("New...") }
Controls.MenuItem {
text: qsTr("Open...")
onTriggered: load()
}
Controls.MenuItem {
text: qsTr("Save")
onTriggered: save()
}
Controls.MenuItem {
text: qsTr("Save As...")
onTriggered: saveAs()
}
Controls.MenuSeparator { }
Controls.MenuItem { text: qsTr("Quit") }
}
Controls.Menu {
title: qsTr("Settings")
Controls.MenuItem {
text: qsTr("Configure")
onTriggered: openSettings()
}
}
Controls.Menu {
title: qsTr("Help")
Controls.MenuItem { text: qsTr("About") }
}
}
footer: RowLayout {
height: Kirigami.Units.gridUnit * 1.3
Controls.Label {
id: presentingLabel
Layout.alignment: Qt.AlignLeft
Layout.leftMargin: Kirigami.Units.smallSpacing * 2
text: activeServiceItem
}
Rectangle {
Layout.fillWidth: true
Layout.fillHeight: true
/* height: Kirigami.Units.gridUnit */
Layout.leftMargin: Kirigami.Units.smallSpacing * 2
Layout.rightMargin: Kirigami.Units.smallSpacing * 2
Layout.topMargin: 0
Kirigami.Theme.colorSet: Kirigami.Theme.Complementary
color: Kirigami.Theme.alternateBackgroundColor
Controls.Label {
id: footerPrefixLabel
anchors.left: parent.left
anchors.top: parent.top
anchors.leftMargin: Kirigami.Units.smallSpacing * 2
text: footerFirstText
}
Controls.TextField {
id: footerFilePathLabel
anchors.verticalCenter: footerPrefixLabel.verticalCenter
anchors.left: footerPrefixLabel.right
anchors.right: parent.right
anchors.rightMargin: Kirigami.Units.smallSpacing * 2
leftInset: 0
text: footerSecondText
background: Item{}
readOnly: true
HoverHandler {
id: hoverHandler
enabled: false
cursorShape: parent.hoveredLink ? Qt.PointingHandCursor : Qt.IBeamCursor
}
}
Controls.ProgressBar {
id: footerSaveProgress
anchors.fill: parent
from: 0.0
to: 100.0
value: mainPage.progress
visible: mainPage.progress > 0
}
}
/* Item { */
/* Layout.fillWidth: true */
/* } */
RowLayout {
id: rightFooterItems
spacing: 10
Layout.alignment: Qt.AlignRight
Layout.rightMargin: Kirigami.Units.smallSpacing * 2
Controls.Label {
Layout.alignment: Qt.AlignRight
Layout.rightMargin: Kirigami.Units.smallSpacing * 2
text: "Total Service Items: " + ServiceItemModel.count
}
Controls.Label {
Layout.alignment: Qt.AlignRight
Layout.rightMargin: Kirigami.Units.smallSpacing * 2
text: "Total Slides: " + SlideModel.count
}
}
}
Loader {
id: menuLoader
active: true
sourceComponent: globalMenuComponent
onLoaded: console.log("Loaded global menu")
}
Component {
id: globalMenuComponent
Labs.MenuBar {
id: globalMenu
Labs.Menu {
title: qsTr("File")
Labs.MenuItem { text: qsTr("New...") }
Labs.MenuItem {
text: qsTr("Open...")
shortcut: "Ctrl+O"
onTriggered: load()
}
Labs.MenuItem {
text: qsTr("Save")
shortcut: "Ctrl+S"
onTriggered: save()
}
Labs.MenuItem {
text: qsTr("Save As...")
shortcut: "Ctrl+Shift+S"
onTriggered: saveAs()
}
Labs.MenuSeparator { }
Labs.MenuItem {
text: qsTr("Quit")
onTriggered: rootApp.quit()
}
}
Labs.Menu {
title: qsTr("Settings")
Labs.MenuItem {
text: qsTr("Configure")
shortcut: "Ctrl+Shift+I"
onTriggered: openSettings()
}
}
Labs.Menu {
title: qsTr("Help")
Labs.MenuItem { text: qsTr("About") }
}
}
}
width: 1800
height: 900
Presenter.MainWindow {
id: mainPage
anchors.fill: parent
}
Labs.FileDialog {
id: saveFileDialog
title: "Save"
folder: shortcuts.home
/* fileMode: Labs.FileDialog.SaveFile */
defaultSuffix: ".pres"
selectExisting: false
onAccepted: {
ServiceItemModel.save(saveFileDialog.fileUrl);
console.log(saveFileDialog.fileUrl);
}
onRejected: {
console.log("Canceled")
}
}
FileHelper {
id: fileHelper
}
Labs.FileDialog {
id: loadFileDialog
title: "Load"
folder: shortcuts.home
/* fileMode: Labs.FileDialog.SaveFile */
defaultSuffix: ".pres"
selectExisting: true
onAccepted: {
load(loadFileDialog.fileUrl);
}
onRejected: {
console.log("Canceled")
}
}
Labs.FileDialog {
id: soundFileDialog
title: "Pick a Sound Effect"
folder: shortcuts.home
/* fileMode: Labs.FileDialog.SaveFile */
selectExisting: true
onAccepted: {
soundEffect = loadFileDialog.fileUrl;
showPassiveNotification(soundEffect);
}
onRejected: {
console.log("Canceled")
}
}
function toggleEditMode() {
editMode = !editMode;
mainPage.editSwitch();
}
function toggleLibrary() {
libraryOpen = !libraryOpen
}
function togglePresenting() {
presenting = !presenting
mainPage.present(presenting);
}
function openSettings() {
settingsSheet.open()
}
function save() {
const saveFile = RSettings.lastSaveFile;
console.log(saveFile.toString());
let file = "";
if (saveFile.length === 0) {
file = fileHelper.saveFile();
ServiceItemModel.save(file);
} else {
ServiceItemModel.save(saveFile);
}
}
function saveAs() {
let file = fileHelper.saveFile();
ServiceItemModel.save(file);
}
Connections {
target: ServiceItemModel
function onSavedToFile(saved, file) {
if (saved) {
let path = file.toString();
path = path.replace(/^(file:\/{2})/,"");
let cleanPath = decodeURIComponent(path);
showPassiveNotification("Saved to " + cleanPath, 2000);
resetSavedTimer.restart();
}
}
}
Timer {
id: resetSavedTimer
interval: 2000
onTriggered: ServiceItemModel.saveProgress = 0;
}
/* function finalSave(file) { */
/* const saved = mainPage.serviceItems.save(file); */
/* } */
function load() {
const file = fileHelper.loadFile("Load Presentation", "pres");
if (file != "") {
const loaded = mainPage.serviceItems.load(file);
loaded ? showPassiveNotification("Loaded: " + file)
: showPassiveNotification("File wasn't loaded");
loaded ? RSettings.loadFile = file
: showPassiveNotification("Didn't set loadfile!");
showPassiveNotification(RSettings.loadFile);
} else {
showPassiveNotification("Loading Canceled");
}
}
Component.onCompleted: {
/* showPassiveNotification(Kirigami.Settings.style); */
/* Kirigami.Settings.style = "Plasma"; */
/* showPassiveNotification(Kirigami.Settings.style); */
console.log("OS is: " + Qt.platform.os);
console.log("MENU " + Kirigami.Settings.hasPlatformMenuBar)
/* console.log("checking screens"); */
console.log("Present Mode is " + presenting);
/* console.log(Qt.application.state); */
screens = Qt.application.screens;
presentationScreen = screens[1]
console.log(Kirigami.Settings.Style);
for (let i = 0; i < screens.length; i++) {
/* console.log(screens[i]); */
/* console.log(screens[i].name); */
screenModel.append({
"name": screens[i].name,
"width": (screens[i].width * screens[i].devicePixelRatio),
"height": (screens[i].height * screens[i].devicePixelRatio),
"pixeldensity": screens[i].pixelDensity,
"pixelratio": screens[i].devicePixelRatio
})
/* console.log("width of screen: " + (screens[i].width * screens[i].devicePixelRatio)); */
/* console.log("height of screen: " + (screens[i].height * screens[i].devicePixelRatio)); */
/* console.log("pixeldensity of screen: " + screens[i].pixelDensity); */
/* console.log("pixelratio of screen: " + screens[i].devicePixelRatio); */
if (i == 0)
console.log("Current Screens available: ");
console.log(screenModel.get(i).name);
}
}
ListModel {
id: screenModel
}
Presenter.Settings {
id: settingsSheet
theModel: screenModel
}
}