diff --git a/CMakeLists.txt b/CMakeLists.txt index de3b457..67b4c56 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,46 +1,46 @@ project(Kamoso) cmake_minimum_required(VERSION 2.8.12) -set(KF5_MIN_VERSION 5.38.0) +set(KF5_MIN_VERSION 5.48.0) find_package(ECM ${KF5_MIN_VERSION} REQUIRED NO_MODULE) set(CMAKE_MODULE_PATH ${ECM_MODULE_PATH} ${ECM_KDE_MODULE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/cmake) find_package(Qt5 NO_MODULE REQUIRED COMPONENTS Core Gui Widgets Quick Test OpenGL) find_package(KF5 ${KF5_MIN_VERSION} REQUIRED COMPONENTS Config DocTools KIO I18n Purpose) find_package(GStreamer 1.1.90 REQUIRED) find_package(GLIB2 REQUIRED) find_package(GObject REQUIRED) find_package(KF5Kirigami2) set_package_properties(KF5Kirigami2 PROPERTIES DESCRIPTION "A QtQuick based components set" PURPOSE "Required at runtime" TYPE RUNTIME ) include(ECMQMLModules) ecm_find_qmlmodule(QtGraphicalEffects 1.0) ecm_find_qmlmodule(QtQml 2.2) ecm_find_qmlmodule(QtQuick 2.5) ecm_find_qmlmodule(QtQuick.Controls 1.2) ecm_find_qmlmodule(QtQuick.Dialogs 1.0) ecm_find_qmlmodule(QtQuick.Layouts 1.1) ecm_find_qmlmodule(QtQuick.Window 2.2) include(KDEInstallDirs) include(KDECompilerSettings NO_POLICY_SCOPE) include(KDECMakeSettings) include(ECMInstallIcons) include(ECMAddTests) include(FeatureSummary) add_subdirectory(src) add_subdirectory(icons) add_subdirectory(doc) install(FILES org.kde.kamoso.appdata.xml DESTINATION ${CMAKE_INSTALL_METAINFODIR}) feature_summary(WHAT ALL FATAL_ON_MISSING_REQUIRED_PACKAGES) diff --git a/src/qml/Main.qml b/src/qml/Main.qml index 1c59bfd..cfcd71c 100644 --- a/src/qml/Main.qml +++ b/src/qml/Main.qml @@ -1,277 +1,277 @@ import QtQuick 2.5 import QtQuick.Controls 1.1 import QtQuick.Controls 2.0 as QQC2 import QtQuick.Layouts 1.1 import QtQuick.Window 2.2 import KamosoQtGStreamer 1.0 import org.kde.kirigami 2.0 as Kirigami import org.kde.kamoso 3.0 Kirigami.ApplicationWindow { id: root width: 700 height: width*3/4 visible: true title: i18n("Kamoso") - header: Item {} + pageStack.globalToolBar.style: Kirigami.ApplicationHeaderStyle.None function awesomeAnimation(path) { // tada.x = visor.x // tada.y = 0 // tada.width = visor.width // tada.height = visor.height tada.source = "file://"+path tada.state = "go" tada.state = "done" // tada.visible = true } Image { id: tada z: 10 width: 10 height: 10 fillMode: Image.PreserveAspectFit states: [ State { name: "go" PropertyChanges { target: tada; x: visor.x } PropertyChanges { target: tada; y: visor.y } PropertyChanges { target: tada; width: visor.width } PropertyChanges { target: tada; height: visor.height } PropertyChanges { target: tada; opacity: 1 } }, State { name: "done" PropertyChanges { target: tada; x: 0 } PropertyChanges { target: tada; y: root.height } PropertyChanges { target: tada; width: Kirigami.Units.gridUnit } PropertyChanges { target: tada; height: Kirigami.Units.gridUnit } PropertyChanges { target: tada; opacity: 0.5 } } ] transitions: [ Transition { from: "go"; to: "done" NumberAnimation { target: tada properties: "width,height"; duration: 700; easing.type: Easing.InCubic } NumberAnimation { target: tada properties: "x,y"; duration: 700; easing.type: Easing.InCubic } NumberAnimation { target: tada properties: "opacity"; duration: 300 } } ] } Mode { id: photoMode mimes: "image/jpeg" checkable: false iconName: "shoot" text: i18n("Shoot") nameFilter: "picture_*" onTriggered: { whites.showAll() webcam.takePhoto() } Connections { target: webcam onPhotoTaken: awesomeAnimation(path) } } Mode { id: burstMode mimes: "image/jpeg" checkable: true iconName: "burst" text: i18n("Burst") property int photosTaken: 0 modeInfo: (photosTaken>0 ? i18np("1 photo", "%1 photos", photosTaken) : "") + (checked? "..." : "") nameFilter: "picture_*" onCheckedChanged: if (checked) { photosTaken = 0 } readonly property var smth: Timer { id: burstTimer running: burstMode.checked interval: 1000 repeat: true onTriggered: { whites.showAll() webcam.takePhoto() burstMode.photosTaken++; } } } Mode { id: videoMode mimes: "video/x-matroska" checkable: true iconName: "record" text: i18n("Record") modeInfo: webcam.recordingTime nameFilter: "video_*" onCheckedChanged: { webcam.isRecording = checked; } } contextDrawer: Kirigami.OverlayDrawer { edge: Qt.RightEdge drawerOpen: false handleVisible: true modal: true leftPadding: 0 topPadding: 0 rightPadding: 0 bottomPadding: 0 contentItem: ImagesView { id: view implicitWidth: Kirigami.Units.gridUnit * 20 mimeFilter: root.pageStack.currentItem.actions.main.mimes nameFilter: root.pageStack.currentItem.actions.main.nameFilter } } globalDrawer: Kirigami.OverlayDrawer { edge: Qt.LeftEdge drawerOpen: false handleVisible: true modal: true width: Kirigami.Units.gridUnit * 20 leftPadding: 0 topPadding: 0 rightPadding: 0 bottomPadding: 0 contentItem: Config { id: configView QQC2.ScrollBar.vertical: QQC2.ScrollBar {} header: Image { fillMode: Image.PreserveAspectCrop width: configView.width height: Kirigami.Units.gridUnit * 10 source: "https://images.unsplash.com/photo-1484781663516-4c4ca4b04a13?dpr=1&auto=format&fit=crop&w=1500&h=1021&q=80&cs=tinysrgb" smooth: true Kirigami.Heading { anchors { left: parent.left right: parent.right bottom: parent.bottom margins: Kirigami.Units.smallSpacing * 2 } level: 1 color: "white" elide: Text.ElideRight text: i18n("Kamoso Gallery") } } } } Shortcut { sequence: "Return" onActivated: visor.actions.main.triggered(null) } pageStack.initialPage: Kirigami.Page { id: visor bottomPadding: 0 topPadding: 0 rightPadding: 0 leftPadding: 0 state: "shoot" states: [ State { name: "shoot" PropertyChanges { target: visor actions { left: videoMode.adoptAction main: photoMode right: burstMode.adoptAction } } }, State { name: "record" PropertyChanges { target: visor actions { left: photoMode.adoptAction main: videoMode right: burstMode.adoptAction } } }, State { name: "burst" PropertyChanges { target: visor actions { left: videoMode.adoptAction main: burstMode right: photoMode.adoptAction } } } ] Rectangle { anchors.fill: parent color: "black" z: -1 } VideoItem { surface: videoSurface1 anchors.fill: parent ColumnLayout { spacing: Kirigami.Units.smallSpacing anchors.margins: Kirigami.Units.smallSpacing anchors.top: parent.top anchors.left: parent.left visible: devicesModel.count>1 Repeater { model: devicesModel delegate: Button { width: 30 iconName: "camera-web" tooltip: display onClicked: devicesModel.playingDeviceUdi = udi } } } } Text { anchors { horizontalCenter: parent.horizontalCenter top: parent.top margins: 20 } text: root.pageStack.currentItem.actions.main.modeInfo color: "white" styleColor: "black" font.pointSize: 20 style: Text.Outline } } }