From 89b2caebfa6f003cc344a1b7797d1727635f4805 Mon Sep 17 00:00:00 2001 From: baydam Date: Fri, 20 May 2016 16:47:21 +0000 Subject: [PATCH] Implement camera on user interface --- MainWindow.cpp | 73 +++++++++++++++++++++++++++++++++++++++++++------- MainWindow.h | 3 +++ mapmap.pro | 13 +++++---- 3 files changed, 74 insertions(+), 15 deletions(-) diff --git a/MainWindow.cpp b/MainWindow.cpp index 96f9175..15c3844 100644 --- a/MainWindow.cpp +++ b/MainWindow.cpp @@ -469,7 +469,7 @@ bool MainWindow::saveAs() if (fileName.isEmpty()) return false; - + if (! fileName.endsWith(MM::FILE_EXTENSION)) { std::cout << "filename doesn't end with expected extension: " << @@ -508,6 +508,47 @@ void MainWindow::importMedia() } } +void MainWindow::openCameraDevice() +{ + QString device; + QList cameras = QCameraInfo::availableCameras(); + + if (cameras.count() > 1) + { + QStringList devicesList; + QMap devices; + + foreach (const QCameraInfo &cameraInfo, cameras) + { + devicesList << cameraInfo.description(); + devices.insert(cameraInfo.description(), cameraInfo.deviceName()); + } + + bool ok; + QString deviceName = QInputDialog::getItem(this, tr("Available camera"), + tr("Select camera"), devicesList, 0, false, &ok); + + if (ok && !deviceName.isEmpty()) + { + if (devices.contains(deviceName)) + device = devices.value(deviceName); + } + } + + else if (QCameraInfo::defaultCamera().isNull()) + { + QMessageBox::warning(this, tr("No camera available"), tr("You can not use this feature!\nNo camera available in your system")); + } + + else + { + device = QCameraInfo::defaultCamera().deviceName(); + } + + if (!device.isEmpty()) + importMediaFile(device, false); +} + void MainWindow::addColor() { // Stop video playback to avoid lags. XXX Hack @@ -779,7 +820,7 @@ void MainWindow::renameMapping(uid mappingId, const QString &name) { Mapping::ptr mapping = mappingManager->getMappingById(mappingId); Q_CHECK_PTR(mapping); - + if (!mapping.isNull()) { QModelIndex index = mappingListModel->getIndexFromId(mappingId); mappingListModel->setData(index, name, Qt::EditRole); @@ -1521,6 +1562,16 @@ void MainWindow::createActions() addAction(importMediaAction); connect(importMediaAction, SIGNAL(triggered()), this, SLOT(importMedia())); + // Open camera. + openCameraAction = new QAction(tr("Open &Camera Device..."), this); + openCameraAction->setShortcut(Qt::CTRL + Qt::Key_C); + openCameraAction->setIcon(QIcon(":/add-image")); + openCameraAction->setIconVisibleInMenu(false); + openCameraAction->setToolTip(tr("Choose your camera device...")); + openCameraAction->setShortcutContext(Qt::ApplicationShortcut); + addAction(openCameraAction); + connect(openCameraAction, SIGNAL(triggered()), this, SLOT(openCameraDevice())); + // Add color. addColorAction = new QAction(tr("Add &Color Paint..."), this); addColorAction->setShortcut(Qt::CTRL + Qt::SHIFT + Qt::Key_A); @@ -1896,6 +1947,7 @@ void MainWindow::createMenus() fileMenu->addAction(saveAsAction); fileMenu->addSeparator(); fileMenu->addAction(importMediaAction); + fileMenu->addAction(openCameraAction); fileMenu->addAction(addColorAction); // Recent file separator @@ -2037,6 +2089,7 @@ void MainWindow::createToolBars() mainToolBar->setIconSize(QSize(MM::TOP_TOOLBAR_ICON_SIZE, MM::TOP_TOOLBAR_ICON_SIZE)); mainToolBar->setMovable(false); mainToolBar->addAction(importMediaAction); + mainToolBar->addAction(openCameraAction); mainToolBar->addAction(addColorAction); mainToolBar->addSeparator(); @@ -2120,7 +2173,7 @@ void MainWindow::readSettings() // settings present since 0.1.0: restoreGeometry(settings.value("geometry").toByteArray()); restoreState(settings.value("windowState").toByteArray()); - + mainSplitter->restoreState(settings.value("mainSplitter").toByteArray()); paintSplitter->restoreState(settings.value("paintSplitter").toByteArray()); mappingSplitter->restoreState(settings.value("mappingSplitter").toByteArray()); @@ -2170,7 +2223,7 @@ void MainWindow::writeSettings() settings.setValue("geometry", saveGeometry()); settings.setValue("windowState", saveState()); - + settings.setValue("mainSplitter", mainSplitter->saveState()); settings.setValue("paintSplitter", paintSplitter->saveState()); settings.setValue("mappingSplitter", mappingSplitter->saveState()); @@ -3045,13 +3098,13 @@ void MainWindow::connectProjectWidgets() connect(mappingListModel, SIGNAL(dataChanged(QModelIndex,QModelIndex)), this, SLOT(handleMappingItemChanged(QModelIndex))); - + connect(mappingListModel, SIGNAL(rowsMoved(QModelIndex,int,int,QModelIndex,int)), this, SLOT(handleMappingIndexesMoved())); - + connect(mappingItemDelegate, SIGNAL(itemDuplicated(uid)), this, SLOT(duplicateMapping(uid))); - + connect(mappingItemDelegate, SIGNAL(itemRemoved(uid)), this, SLOT(deleteMapping(uid))); } @@ -3072,13 +3125,13 @@ void MainWindow::disconnectProjectWidgets() disconnect(mappingListModel, SIGNAL(dataChanged(QModelIndex,QModelIndex)), this, SLOT(handleMappingItemChanged(QModelIndex))); - + disconnect(mappingListModel, SIGNAL(rowsMoved(QModelIndex,int,int,QModelIndex,int)), this, SLOT(handleMappingIndexesMoved())); - + disconnect(mappingItemDelegate, SIGNAL(itemDuplicated(uid)), this, SLOT(duplicateMapping(uid))); - + connect(mappingItemDelegate, SIGNAL(itemRemoved(uid)), this, SLOT(deleteMapping(uid))); } diff --git a/MainWindow.h b/MainWindow.h index 757a9cf..58a62c2 100644 --- a/MainWindow.h +++ b/MainWindow.h @@ -24,6 +24,7 @@ #include #if QT_VERSION >= 0x050000 #include + #include #endif #include #include @@ -91,6 +92,7 @@ private slots: bool save(); bool saveAs(); void importMedia(); + void openCameraDevice(); void addColor(); void about(); void updateStatusBar(); @@ -357,6 +359,7 @@ private: QAction *newAction; QAction *openAction; QAction *importMediaAction; + QAction *openCameraAction; QAction *addColorAction; QAction *saveAction; QAction *saveAsAction; diff --git a/mapmap.pro b/mapmap.pro index b1047a6..51b5c3d 100644 --- a/mapmap.pro +++ b/mapmap.pro @@ -4,7 +4,10 @@ TEMPLATE = app VERSION = 0.4.1 TARGET = mapmap QT += gui opengl xml core -greaterThan(QT_MAJOR_VERSION, 4): QT += widgets core +greaterThan(QT_MAJOR_VERSION, 4) { + QT -= gui # using widgets instead gui in Qt5 + QT += widgets multimedia +} DEFINES += UNICODE QT_THREAD_SUPPORT QT_CORE_LIB QT_GUI_LIB HEADERS = \ @@ -120,11 +123,11 @@ QMAKE_EXTRA_TARGETS += docs unix:!mac { DEFINES += UNIX CONFIG += link_pkgconfig - INCLUDE_PATH += + INCLUDE_PATH += PKGCONFIG += \ gstreamer-1.0 gstreamer-base-1.0 gstreamer-app-1.0 gstreamer-pbutils-1.0 \ liblo \ - gl x11 + gl x11 QMAKE_CXXFLAGS_WARN_ON += -Wno-unused-result -Wno-unused-parameter \ -Wno-unused-variable -Wno-switch -Wno-comment \ -Wno-unused-but-set-variable @@ -138,7 +141,7 @@ unix:!mac { iconfile.files = resources/images/logo/mapmap.svg iconfile.path = /usr/share/icons/hicolor/scalable/apps INSTALLS += iconfile - mimetypesfile.files = resources/texts/mapmap.xml + mimetypesfile.files = resources/texts/mapmap.xml mimetypesfile.path = /usr/share/mime/packages INSTALLS += mimetypesfile @@ -151,7 +154,7 @@ unix:!mac { # updatemimeappdefault.commands='grep mapmap.desktop /usr/share/applications/defaults.list >/dev/null|| sudo echo "application/mapmap=mapmap.desktop;" >> /usr/share/applications/defaults.list' # INSTALLS += updatemimeappdefault # ------------------------- - + # Add the docs target: docs.depends = $(HEADERS) $(SOURCES) docs.commands = (cat Doxyfile; echo "INPUT = $?") | doxygen -