diff --git a/CMakeLists.txt b/CMakeLists.txt index 67b4c56..f8f487d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,46 +1,47 @@ project(Kamoso) cmake_minimum_required(VERSION 2.8.12) 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_definitions(-DQT_NO_URL_CAST_FROM_STRING) 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/kamoso.cpp b/src/kamoso.cpp index 82cb4c9..22b4df6 100644 --- a/src/kamoso.cpp +++ b/src/kamoso.cpp @@ -1,143 +1,143 @@ /************************************************************************************* * Copyright (C) 2008-2011 by Aleix Pol * * Copyright (C) 2008-2011 by Alex Fiestas * * Copyright (C) 2013 by Michael G. Hansen * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * * as published by the Free Software Foundation; either version 2 * * of the License, or (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA * *************************************************************************************/ #include "kamoso.h" #include "kamosoSettings.h" #include "video/webcamcontrol.h" #include "devicemanager.h" #include #include #include #include #include #include #include #include #include #include #include Kamoso::Kamoso(WebcamControl *webcamControl) : m_webcamControl(webcamControl) { m_recordingTime.restart(); m_recordingTimer.setInterval(30); connect(m_webcamControl, &WebcamControl::photoTaken, this, &Kamoso::photoTaken); connect(&m_recordingTimer, &QTimer::timeout, this, &Kamoso::recordingTimeChanged); if (Settings::saveUrl().isLocalFile()) { const QDir dir(Settings::saveUrl().toLocalFile()); const auto dirlist = dir.entryInfoList({"*.jpg"}, QDir::Files, QDir::SortFlag::Time); if (!dirlist.isEmpty()) m_sampleImagePath = dirlist.first().absoluteFilePath(); } if (m_sampleImagePath.isEmpty()) { QTemporaryFile* temporary = new QTemporaryFile(QDir::temp().absoluteFilePath("XXXXXX-sampleimage.jpg"), this); temporary->open(); auto sampleIcon = QIcon::fromTheme(QStringLiteral("kde")); sampleIcon.pixmap(200, 200).save(temporary); m_sampleImagePath = temporary->fileName(); temporary->close(); } } Kamoso::~Kamoso() = default; QUrl Kamoso::fileNameSuggestion(const QUrl &saveUrl, const QString &name, const QString& extension) const { const QString date = QDateTime::currentDateTime().toString(QStringLiteral("yyyy-MM-dd_hh-mm-ss")); const QString initialName = QStringLiteral("%1_%2.%3").arg(name, date, extension); - QUrl path(saveUrl.toString() + '/' + initialName); + QUrl url(saveUrl.toString() + '/' + initialName); - if (path.isLocalFile() && QFile::exists(path.toLocalFile())) { - path = saveUrl.toString() + '/' + KIO::suggestName(saveUrl, initialName); + if (url.isLocalFile() && QFile::exists(url.toLocalFile())) { + url.setPath(saveUrl.path() + '/' + KIO::suggestName(saveUrl, initialName)); } - return path; + return url; } const QString Kamoso::takePhoto() { const QUrl path = fileNameSuggestion(Settings::saveUrl(), "picture", "jpg"); m_webcamControl->takePhoto(path); if (path.isLocalFile()) { m_sampleImagePath = path.toLocalFile(); Q_EMIT sampleImageChanged(m_sampleImagePath); } return path.toDisplayString(); } void Kamoso::resetDeviceSettings() { Device *device = DeviceManager::self()->playingDevice(); device->reset(); } void Kamoso::setRecording(bool recording) { if (recording == m_recordingTimer.isActive()) return; if (recording) { m_webcamControl->startRecording(); m_recordingTime.restart(); m_recordingTimer.start(); } else { const QUrl path = fileNameSuggestion(Settings::saveVideos(), "video", "mkv"); KJob *job = KIO::move(QUrl::fromLocalFile(m_webcamControl->stopRecording()), path); job->start(); m_webcamControl->playDevice(DeviceManager::self()->playingDevice()); m_recordingTimer.stop(); } Q_EMIT isRecordingChanged(m_recordingTimer.isActive()); } QString Kamoso::recordingTime() const { return KFormat().formatDuration(m_recordingTime.elapsed()); } bool Kamoso::isRecording() const { return m_recordingTimer.isActive(); } void Kamoso::trashFiles(const QJsonArray& urls) { QList list; Q_FOREACH(const QJsonValue& val, urls) { list += QUrl(val.toString()); } KIO::Job* job = KIO::trash(list); KIO::FileUndoManager::self()->recordJob(KIO::FileUndoManager::Trash, list, QUrl("trash:/"), job); // KJobWidgets::setWindow(job, window); }