File indexing completed on 2024-04-21 15:38:41

0001 /***************************************************************************
0002  *   Copyright (C) 2005-2017 by Linuxstopmotion contributors;              *
0003  *   see the AUTHORS file for details.                                     *
0004  *                                                                         *
0005  *   This program is free software; you can redistribute it and/or modify  *
0006  *   it under the terms of the GNU General Public License as published by  *
0007  *   the Free Software Foundation; either version 2 of the License, or     *
0008  *   (at your option) any later version.                                   *
0009  *                                                                         *
0010  *   This program is distributed in the hope that it will be useful,       *
0011  *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
0012  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
0013  *   GNU General Public License for more details.                          *
0014  *                                                                         *
0015  *   You should have received a copy of the GNU General Public License     *
0016  *   along with this program; if not, write to the                         *
0017  *   Free Software Foundation, Inc.,                                       *
0018  *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
0019  ***************************************************************************/
0020 #include "camerahandler.h"
0021 
0022 #include <QTimer>
0023 #include <QPushButton>
0024 #include <QPixmap>
0025 
0026 #include "modelhandler.h"
0027 #include "workspacefile.h"
0028 #include "frontends/frontend.h"
0029 #include "graphics/icons/cameraoff.xpm"
0030 #include "graphics/icons/cameraon.xpm"
0031 #include "src/domain/domainfacade.h"
0032 #include "src/foundation/logger.h"
0033 #include "src/foundation/preferencestool.h"
0034 #include "src/foundation/uiexception.h"
0035 #include "src/presentation/frontends/qtfrontend/frameview.h"
0036 
0037 
0038 CameraHandler::CameraHandler ( QObject *parent, QStatusBar *sb, 
0039         ModelHandler* modelHandler, const char *name) 
0040     : QObject(parent), statusBar(sb), cameraButton(0), timer(0),
0041       capturedFile(WorkspaceFile::capturedImage), isCameraOn(false),
0042       modelHandler(modelHandler), frameView(0) {
0043     timer = new QTimer(this);
0044     timer->setSingleShot(true);
0045     QObject::connect( timer, SIGNAL(timeout()), this, SLOT(storeFrame()) );
0046     setObjectName(name);
0047 }
0048 
0049 
0050 CameraHandler::~CameraHandler( ) {
0051 }
0052 
0053 
0054 void CameraHandler::setFrameView( FrameView * frameView )
0055 {
0056     this->frameView = frameView;
0057 }
0058 
0059 
0060 void CameraHandler::setCameraButton( QPushButton *cameraButton )
0061 {
0062     this->cameraButton = cameraButton;
0063 }
0064 
0065 
0066 bool CameraHandler::setViewMode(int mode)
0067 {
0068     return frameView->setViewMode((FrameView::ImageMode) mode);
0069 }
0070 
0071 
0072 void CameraHandler::cameraOn()
0073 {
0074     DomainFacade::getFacade()->getFrontend()->showProgress(
0075             Frontend::connectingCamera);
0076     cameraButton->setIcon( QPixmap(cameraoff) );
0077     isCameraOn = frameView->on();
0078     if (!isCameraOn) {
0079         cameraOff();
0080     } else {
0081         emit cameraStateChanged(true);
0082     }
0083     DomainFacade::getFacade()->getFrontend()->hideProgress();
0084 }
0085 
0086 
0087 void CameraHandler::cameraOff()
0088 {
0089     cameraButton->setIcon( QPixmap(cameraon) );
0090     frameView->off();
0091     isCameraOn = false;
0092     emit cameraStateChanged(false);
0093 }
0094 
0095 
0096 void CameraHandler::toggleCamera()
0097 {
0098     if(isCameraOn == false) {
0099         Logger::get().logDebug("Playing video from webcam");
0100         cameraOn();
0101     }
0102     else {
0103         cameraOff();
0104     }
0105 }
0106 
0107 
0108 void CameraHandler::captureFrame()
0109 {
0110     Logger::get().logDebug("Capturing image from webcam");
0111     timer->start(60);
0112 }
0113 
0114 
0115 void CameraHandler::storeFrame()
0116 {
0117     QImage i;
0118     const char* path = capturedFile.path();
0119     i.load(path);
0120     if ( !i.isNull() ) {
0121         modelHandler->addFrame(path);
0122         emit capturedFrame();
0123     } else {
0124         timer->start(60);
0125     }
0126 }
0127 
0128 
0129 void CameraHandler::switchToVideoView()
0130 {
0131     cameraButton->setEnabled(true);
0132     emit cameraStateChanged(true);
0133     DomainFacade::getFacade()->getFrontend()->hideProgress();
0134 }
0135 
0136 
0137 void CameraHandler::setMixCount(int mixCount)
0138 {
0139     frameView->setMixCount(mixCount);
0140     
0141     PreferencesTool* preferences = PreferencesTool::get();
0142     switch( frameView->getViewMode() ) {
0143         case 0: 
0144         {
0145             preferences->setPreference("mixcount", mixCount);
0146             break;
0147         }
0148         case 2:
0149         {
0150             preferences->setPreference("playbackcount", mixCount);
0151             break;
0152         }
0153     }
0154     try {
0155         preferences->flush();
0156     } catch (UiException& ex) {
0157         DomainFacade::getFacade()->getFrontend()->handleException(ex);
0158     }
0159 }
0160 
0161 
0162 bool CameraHandler::isCameraRunning()
0163 {
0164     return isCameraOn;
0165 }
0166 
0167 
0168 void CameraHandler::setPlaybackSpeed(int playBackSpeed)
0169 {
0170     frameView->setPlaybackSpeed(playBackSpeed);
0171 }