diff --git a/Examples/Plugins/org.mitk.example.gui.imaging/documentation/UserManual/QmitkSimpleExampleUserManual.dox b/Examples/Plugins/org.mitk.example.gui.imaging/documentation/UserManual/QmitkSimpleExampleUserManual.dox index 2094fb04cc..ad170db4e3 100644 --- a/Examples/Plugins/org.mitk.example.gui.imaging/documentation/UserManual/QmitkSimpleExampleUserManual.dox +++ b/Examples/Plugins/org.mitk.example.gui.imaging/documentation/UserManual/QmitkSimpleExampleUserManual.dox @@ -1,21 +1,20 @@ /** \page org_mitk_views_simpleexample The Simple Example module \imageMacro{SimpleExample.png,"Icon of the Simple Example Module",2.00} \section QmitkSimpleExampleViewUserManualSummary Summary This module is namely a simple example for simple image interaction. It offers: */ diff --git a/Examples/Plugins/org.mitk.example.gui.imaging/src/internal/simpleexample/QmitkSimpleExampleView.cpp b/Examples/Plugins/org.mitk.example.gui.imaging/src/internal/simpleexample/QmitkSimpleExampleView.cpp index cfabf1cae5..aee35d78c8 100644 --- a/Examples/Plugins/org.mitk.example.gui.imaging/src/internal/simpleexample/QmitkSimpleExampleView.cpp +++ b/Examples/Plugins/org.mitk.example.gui.imaging/src/internal/simpleexample/QmitkSimpleExampleView.cpp @@ -1,288 +1,402 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #include "QmitkSimpleExampleView.h" #include "QmitkStepperAdapter.h" #include "QmitkRenderWindow.h" -#include "mitkMovieGenerator.h" +#include "QmitkFFmpegWriter.h" #include "mitkNodePredicateProperty.h" #include "mitkNodePredicateNot.h" #include "mitkProperties.h" #include #include #include #include +#include #include #include #include #include #include const std::string QmitkSimpleExampleView::VIEW_ID = "org.mitk.views.simpleexample"; QmitkSimpleExampleView::QmitkSimpleExampleView() : m_Controls(nullptr), m_NavigatorsInitialized(false), m_Parent(nullptr) { } QmitkSimpleExampleView::~QmitkSimpleExampleView() { } void QmitkSimpleExampleView::CreateQtPartControl(QWidget *parent) { if (!m_Controls) { m_Parent = parent; // create GUI widgets m_Controls = new Ui::QmitkSimpleExampleViewControls; m_Controls->setupUi(parent); this->CreateConnections(); this->RenderWindowPartActivated(this->GetRenderWindowPart()); } } void QmitkSimpleExampleView::SetFocus() { m_Controls->renderWindowComboBox->setFocus(); } void QmitkSimpleExampleView::RenderWindowPartActivated(mitk::IRenderWindowPart* renderWindowPart) { if (renderWindowPart == nullptr) { m_Parent->setEnabled(false); return; } QHashIterator renderIter(renderWindowPart->GetQmitkRenderWindows()); while(renderIter.hasNext()) { renderIter.next(); m_Controls->renderWindowComboBox->addItem(renderIter.key()); } RenderWindowSelected(m_Controls->renderWindowComboBox->currentText()); m_TimeStepper.reset(new QmitkStepperAdapter(m_Controls->sliceNavigatorTime, renderWindowPart->GetTimeNavigationController()->GetTime(), "sliceNavigatorTimeFromSimpleExample")); m_MovieStepper.reset(new QmitkStepperAdapter(m_Controls->movieNavigatorTime, renderWindowPart->GetTimeNavigationController()->GetTime(), "movieNavigatorTimeFromSimpleExample")); m_Parent->setEnabled(true); } void QmitkSimpleExampleView::RenderWindowPartDeactivated(mitk::IRenderWindowPart* /*renderWindowPart*/) { m_Parent->setEnabled(false); m_SliceStepper.reset(); m_TimeStepper.reset(); m_MovieStepper.reset(); m_Controls->renderWindowComboBox->clear(); } void QmitkSimpleExampleView::CreateConnections() { if ( m_Controls ) { connect(m_Controls->renderWindowComboBox, SIGNAL(currentIndexChanged(QString)), this, SLOT(RenderWindowSelected(QString)) ); connect(m_Controls->stereoSelect, SIGNAL(activated(int)), this, SLOT(StereoSelectionChanged(int)) ); connect(m_Controls->reInitializeNavigatorsButton, SIGNAL(clicked()), this, SLOT(InitNavigators()) ); connect(m_Controls->genMovieButton, SIGNAL(clicked()), this, SLOT(GenerateMovie()) ); connect(m_Controls->m_TakeScreenshotBtn, SIGNAL(clicked()), this, SLOT(OnTakeScreenshot()) ); connect(m_Controls->m_TakeHighResScreenShotBtn, SIGNAL(clicked()), this, SLOT(OnTakeHighResolutionScreenshot()) ); } } void QmitkSimpleExampleView::InitNavigators() { /* get all nodes that have not set "includeInBoundingBox" to false */ mitk::NodePredicateNot::Pointer pred = mitk::NodePredicateNot::New(mitk::NodePredicateProperty::New("includeInBoundingBox", mitk::BoolProperty::New(false))); mitk::DataStorage::SetOfObjects::ConstPointer rs = this->GetDataStorage()->GetSubset(pred); /* calculate bounding geometry of these nodes */ mitk::TimeGeometry::Pointer bounds = this->GetDataStorage()->ComputeBoundingGeometry3D(rs); /* initialize the views to the bounding geometry */ m_NavigatorsInitialized = mitk::RenderingManager::GetInstance()->InitializeViews(bounds); } +/** + * Returns path to the ffmpeg lib if configured in preferences. + * + * This implementation has been reused from MovieMaker view. + * + * @return The path to ffmpeg lib or empty string if not configured. + */ +QString QmitkSimpleExampleView::GetFFmpegPath() const +{ + berry::IPreferences::Pointer preferences = berry::Platform::GetPreferencesService()->GetSystemPreferences()->Node("/org.mitk.gui.qt.ext.externalprograms"); + + return preferences.IsNotNull() + ? preferences->Get("ffmpeg", "") + : ""; +} + +/** + * Reads pixels from specified render window. + * + * This implementation has been reused from MovieMaker view. + * + * @param renderWindow + * @param x + * @param y + * @param width + * @param height + * @return + */ +static unsigned char* ReadPixels(vtkRenderWindow* renderWindow, int x, int y, int width, int height) +{ + if (renderWindow == nullptr) + return nullptr; + + unsigned char* frame = new unsigned char[width * height * 3]; + + renderWindow->MakeCurrent(); + glReadPixels(x, y, width, height, GL_RGB, GL_UNSIGNED_BYTE, frame); + + return frame; +} + +/** + * Records a movie from the selected render window with a default frame rate of 30 Hz. + * + * Parts of this implementation have been reused from MovieMaker view. + */ void QmitkSimpleExampleView::GenerateMovie() { QmitkRenderWindow* movieRenderWindow = GetSelectedRenderWindow(); - //mitk::Stepper::Pointer stepper = multiWidget->mitkWidget1->GetSliceNavigationController()->GetSlice(); + mitk::Stepper::Pointer stepper = movieRenderWindow->GetSliceNavigationController()->GetSlice(); - mitk::MovieGenerator::Pointer movieGenerator = mitk::MovieGenerator::New(); - if (movieGenerator.IsNotNull()) { - movieGenerator->SetStepper( stepper ); - movieGenerator->SetRenderer( mitk::BaseRenderer::GetInstance(movieRenderWindow->GetRenderWindow()) ); - - QString movieFileName = QFileDialog::getSaveFileName(0, "Choose a file name", QString(), "Movie (*.avi)"); - if (!movieFileName.isEmpty()) { - movieGenerator->SetFileName( movieFileName.toStdString().c_str() ); - movieGenerator->WriteMovie(); + + QmitkFFmpegWriter* movieWriter = new QmitkFFmpegWriter(m_Parent); + + const QString ffmpegPath = GetFFmpegPath(); + + if (ffmpegPath.isEmpty()) + { + QMessageBox::information(nullptr, "Movie Maker", + "

Set path to FFmpeg1 or Libav2 (avconv) in preferences (Window -> Preferences... (Ctrl+P) -> External Programs) to be able to record your movies to video files.

" + "

If you are using Linux, chances are good that either FFmpeg or Libav is included in the official package repositories.

" + "

[1] Download FFmpeg from ffmpeg.org
" + "[2] Download Libav from libav.org

"); + return; + } + + movieWriter->SetFFmpegPath(GetFFmpegPath()); + + vtkRenderWindow* renderWindow = movieRenderWindow->GetRenderWindow(); + + if (renderWindow == nullptr) + return; + + const int border = 3; + const int x = border; + const int y = border; + int width = renderWindow->GetSize()[0] - border * 2; + int height = renderWindow->GetSize()[1] - border * 2; + + if (width & 1) + --width; + + if (height & 1) + --height; + + if (width < 16 || height < 16) + return; + + movieWriter->SetSize(width, height); + movieWriter->SetFramerate(30); + + QString saveFileName = QFileDialog::getSaveFileName(nullptr, "Specify a filename", "", "Movie (*.mp4)"); + + if (saveFileName.isEmpty()) + return; + + if(!saveFileName.endsWith(".mp4")) + saveFileName += ".mp4"; + + movieWriter->SetOutputPath(saveFileName); + + const unsigned int numberOfFrames = stepper->GetSteps() - stepper->GetPos(); + + try + { + movieWriter->Start(); + + for (unsigned int currentFrame = 0; currentFrame < numberOfFrames; ++currentFrame) + { + mitk::RenderingManager::GetInstance()->ForceImmediateUpdateAll(); + + renderWindow->MakeCurrent(); + unsigned char* frame = ReadPixels(renderWindow, x, y, width, height); + movieWriter->WriteFrame(frame); + delete[] frame; + + stepper->Next(); } + + movieWriter->Stop(); + + mitk::RenderingManager::GetInstance()->ForceImmediateUpdateAll(); + } + catch (const mitk::Exception& exception) + { + mitk::RenderingManager::GetInstance()->ForceImmediateUpdateAll(); + + QMessageBox::critical(nullptr, "Generate Movie", exception.GetDescription()); } } void QmitkSimpleExampleView::StereoSelectionChanged(int id) { /* From vtkRenderWindow.h tells us about stereo rendering: Set/Get what type of stereo rendering to use. CrystalEyes mode uses frame-sequential capabilities available in OpenGL to drive LCD shutter glasses and stereo projectors. RedBlue mode is a simple type of stereo for use with red-blue glasses. Anaglyph mode is a superset of RedBlue mode, but the color output channels can be configured using the AnaglyphColorMask and the color of the original image can be (somewhat maintained using AnaglyphColorSaturation; the default colors for Anaglyph mode is red-cyan. Interlaced stereo mode produces a composite image where horizontal lines alternate between left and right views. StereoLeft and StereoRight modes choose one or the other stereo view. Dresden mode is yet another stereoscopic interleaving. */ mitk::IRenderWindowPart* renderWindowPart = this->GetRenderWindowPart(); vtkRenderWindow * vtkrenderwindow = renderWindowPart->GetQmitkRenderWindow("3d")->GetVtkRenderWindow(); // note: foreground vtkRenderers (at least the department logo renderer) produce errors in stereoscopic visualization. // Therefore, we disable the logo visualization during stereo rendering. switch(id) { case 0: vtkrenderwindow->StereoRenderOff(); break; case 1: vtkrenderwindow->SetStereoTypeToRedBlue(); vtkrenderwindow->StereoRenderOn(); renderWindowPart->EnableDecorations(false, QStringList(mitk::IRenderWindowPart::DECORATION_LOGO)); break; case 2: vtkrenderwindow->SetStereoTypeToDresden(); vtkrenderwindow->StereoRenderOn(); renderWindowPart->EnableDecorations(false, QStringList(mitk::IRenderWindowPart::DECORATION_LOGO)); break; } mitk::BaseRenderer::GetInstance(vtkrenderwindow)->SetMapperID(mitk::BaseRenderer::Standard3D); renderWindowPart->RequestUpdate(); } QmitkRenderWindow* QmitkSimpleExampleView::GetSelectedRenderWindow() const { QString id = m_Controls->renderWindowComboBox->currentText(); if (id.isEmpty()) { return nullptr; } else { return this->GetRenderWindowPart()->GetQmitkRenderWindow(id); } } void QmitkSimpleExampleView::OnTakeHighResolutionScreenshot() { QString filter; QString fileName = QFileDialog::getSaveFileName(nullptr, "Save screenshot to...", QDir::currentPath(), m_PNGExtension + ";;" + m_JPGExtension, &filter); vtkRenderer* renderer = this->GetSelectedRenderWindow()->GetRenderer()->GetVtkRenderer(); if (renderer == nullptr) return; this->TakeScreenshot(renderer, 4, fileName, filter); } void QmitkSimpleExampleView::OnTakeScreenshot() { QString filter; QString fileName = QFileDialog::getSaveFileName(nullptr, "Save screenshot to...", QDir::currentPath(), m_PNGExtension + ";;" + m_JPGExtension, &filter); QmitkRenderWindow* renWin = this->GetSelectedRenderWindow(); if (renWin == nullptr) return; vtkRenderer* renderer = renWin->GetRenderer()->GetVtkRenderer(); if (renderer == nullptr) return; this->TakeScreenshot(renderer, 1, fileName, filter); } void QmitkSimpleExampleView::TakeScreenshot(vtkRenderer* renderer, unsigned int magnificationFactor, QString fileName, QString filter) { if ((renderer == nullptr) ||(magnificationFactor < 1) || fileName.isEmpty()) return; bool doubleBuffering( renderer->GetRenderWindow()->GetDoubleBuffer() ); renderer->GetRenderWindow()->DoubleBufferOff(); vtkImageWriter* fileWriter = nullptr; QFileInfo fi(fileName); QString suffix = fi.suffix().toLower(); if (suffix.isEmpty() || (suffix != "png" && suffix != "jpg" && suffix != "jpeg")) { if (filter == m_PNGExtension) { suffix = "png"; } else if (filter == m_JPGExtension) { suffix = "jpg"; } fileName += "." + suffix; } if (suffix.compare("jpg", Qt::CaseInsensitive) == 0 || suffix.compare("jpeg", Qt::CaseInsensitive) == 0) { vtkJPEGWriter* w = vtkJPEGWriter::New(); w->SetQuality(100); w->ProgressiveOff(); fileWriter = w; } else //default is png { fileWriter = vtkPNGWriter::New(); } vtkRenderLargeImage* magnifier = vtkRenderLargeImage::New(); magnifier->SetInput(renderer); magnifier->SetMagnification(magnificationFactor); fileWriter->SetInputConnection(magnifier->GetOutputPort()); fileWriter->SetFileName(fileName.toLatin1()); // vtkRenderLargeImage has problems with different layers, therefore we have to // temporarily deactivate all other layers. // we set the background to white, because it is nicer than black... double oldBackground[3]; renderer->GetBackground(oldBackground); double white[] = {1.0, 1.0, 1.0}; renderer->SetBackground(white); mitk::IRenderWindowPart* renderWindowPart = this->GetRenderWindowPart(); renderWindowPart->EnableDecorations(false); fileWriter->Write(); fileWriter->Delete(); renderWindowPart->EnableDecorations(true); renderer->SetBackground(oldBackground); renderer->GetRenderWindow()->SetDoubleBuffer(doubleBuffering); } void QmitkSimpleExampleView::RenderWindowSelected(const QString &id) { if (!id.isEmpty()) { m_SliceStepper.reset(new QmitkStepperAdapter(m_Controls->sliceNavigator, this->GetRenderWindowPart()->GetQmitkRenderWindow(id)->GetSliceNavigationController()->GetSlice(), "sliceNavigatorFromSimpleExample")); } } diff --git a/Examples/Plugins/org.mitk.example.gui.imaging/src/internal/simpleexample/QmitkSimpleExampleView.h b/Examples/Plugins/org.mitk.example.gui.imaging/src/internal/simpleexample/QmitkSimpleExampleView.h index a75f3466dd..87c1ee386e 100644 --- a/Examples/Plugins/org.mitk.example.gui.imaging/src/internal/simpleexample/QmitkSimpleExampleView.h +++ b/Examples/Plugins/org.mitk.example.gui.imaging/src/internal/simpleexample/QmitkSimpleExampleView.h @@ -1,110 +1,113 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #ifndef _QMITKSIMPLEEXAMPLEVIEW_H_INCLUDED #define _QMITKSIMPLEEXAMPLEVIEW_H_INCLUDED #include #include #include "ui_QmitkSimpleExampleViewControls.h" class QmitkStepperAdapter; class vtkRenderer; /** * \brief QmitkSimpleExampleView * * \sa QmitkAbstractView */ class QmitkSimpleExampleView : public QmitkAbstractView, public mitk::IRenderWindowPartListener { // this is needed for all Qt objects that should have a MOC object (everything that derives from QObject) Q_OBJECT public: static const std::string VIEW_ID; QmitkSimpleExampleView(); ~QmitkSimpleExampleView(); private: virtual void CreateQtPartControl(QWidget *parent) override; virtual void SetFocus() override; /// \brief Creation of the connections of main and control widget virtual void CreateConnections(); virtual void RenderWindowPartActivated(mitk::IRenderWindowPart* renderWindowPart) override; virtual void RenderWindowPartDeactivated(mitk::IRenderWindowPart* renderWindowPart) override; /** * return the renderwindow of which the movie shall be created, what depends on the combo box */ QmitkRenderWindow* GetSelectedRenderWindow() const; /// writes a screenshot in JPEG or PNG format to the file fileName void TakeScreenshot(vtkRenderer* renderer, unsigned int magnificationFactor, QString fileName, QString filter = ""); + /// returns path to the ffmpeg lib if configured in preferences + QString GetFFmpegPath() const; + private slots: /** * Qt slot for reacting on the selected render window from the combo box */ void RenderWindowSelected(const QString& id); /** * qt slot for event processing from a qt widget defining the stereo mode of a render window */ void StereoSelectionChanged(int id); /** * initialize the slice and temporal sliders according to the image dimensions */ void InitNavigators(); /** * generate a movie as *.avi from the active render window */ void GenerateMovie(); /// takes screenshot of the 3D window in 4x resolution of the render window void OnTakeHighResolutionScreenshot(); /// takes screenshot of the selected render window void OnTakeScreenshot(); private: Ui::QmitkSimpleExampleViewControls* m_Controls; bool m_NavigatorsInitialized; QScopedPointer m_SliceStepper; QScopedPointer m_TimeStepper; QScopedPointer m_MovieStepper; QWidget* m_Parent; QString m_PNGExtension = "PNG File (*.png)"; QString m_JPGExtension = "JPEG File (*.jpg)"; }; #endif // _QMITKSIMPLEEXAMPLEVIEW_H_INCLUDED diff --git a/Examples/Plugins/org.mitk.example.gui.imaging/src/internal/simpleexample/QmitkSimpleExampleViewControls.ui b/Examples/Plugins/org.mitk.example.gui.imaging/src/internal/simpleexample/QmitkSimpleExampleViewControls.ui index 7ad0f94fba..4e6f51c94f 100644 --- a/Examples/Plugins/org.mitk.example.gui.imaging/src/internal/simpleexample/QmitkSimpleExampleViewControls.ui +++ b/Examples/Plugins/org.mitk.example.gui.imaging/src/internal/simpleexample/QmitkSimpleExampleViewControls.ui @@ -1,199 +1,229 @@ QmitkSimpleExampleViewControls 0 0 298 610 0 0 false Form1 - - - Render Window + + + Qt::Vertical - + + QSizePolicy::Minimum + + + + 20 + 10 + + + - + + + + + Render Window + + + + + + + Slice 1 0 Time 1 0 - - - - Take Screenshot - - - - - - - Screenshot will be 4 times larger than current render window size - - - Take HighDef 3D Screenshot - - - - - - - - 32767 - 23 - - - - Generate Movie - - - - Movie + Time-Step Animation 1 0 + + + + Re-initialize Navigators + + + + + + + Qt::Vertical + + + QSizePolicy::Minimum + + + + 20 + 20 + + + + 200 0 stereo off red-blue stereo D4D stereo - + - Re-initialize Navigators + Take Screenshot - + + + Screenshot will be 4 times larger than current render window size + + + Take HighDef 3D Screenshot + + + + + + + + 32767 + 23 + + + + Generate Movie + + + + + Qt::Vertical - - QSizePolicy::Expanding - 20 - 230 + 40 QmitkSliderNavigatorWidget QWidget
QmitkSliderNavigatorWidget.h
1
QmitkPrimitiveMovieNavigatorWidget QWidget
QmitkPrimitiveMovieNavigatorWidget.h
1
- - stereoSelect -
diff --git a/Modules/QtWidgetsExt/files.cmake b/Modules/QtWidgetsExt/files.cmake index b76410dfb4..2c1d9dbcff 100644 --- a/Modules/QtWidgetsExt/files.cmake +++ b/Modules/QtWidgetsExt/files.cmake @@ -1,106 +1,108 @@ file(GLOB_RECURSE H_FILES RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}/include/*") set(CPP_FILES qclickablelabel.cpp QmitkAboutDialog.cpp QmitkBasePropertyView.cpp QmitkBoolPropertyWidget.cpp QmitkBoundingObjectWidget.cpp QmitkCallbackFromGUIThread.cpp QmitkColorPropertyEditor.cpp QmitkColorPropertyView.cpp QmitkColorTransferFunctionCanvas.cpp QmitkCrossWidget.cpp QmitkEditPointDialog.cpp QmitkEnumerationPropertyWidget.cpp + QmitkFFmpegWriter.cpp QmitkFileChooser.cpp QmitkGnuplotWidget.cpp QmitkHistogram.cpp QmitkHistogramWidget.cpp QmitkHotkeyLineEdit.cpp QmitkModulesDialog.cpp QmitkModuleTableModel.cpp QmitkNumberPropertyEditor.cpp QmitkNumberPropertySlider.cpp QmitkNumberPropertyView.cpp QmitkPiecewiseFunctionCanvas.cpp QmitkPlotDialog.cpp QmitkPlotWidget.cpp QmitkPointListModel.cpp QmitkPointListView.cpp QmitkPointListViewWidget.cpp QmitkPointListWidget.cpp QmitkPrimitiveMovieNavigatorWidget.cpp QmitkPropertyViewFactory.cpp QmitkSelectableGLWidget.cpp QmitkSliceWidget.cpp QmitkSliderNavigatorWidget.cpp QmitkStandardViews.cpp QmitkStepperAdapter.cpp QmitkStringPropertyEditor.cpp QmitkStringPropertyOnDemandEdit.cpp QmitkStringPropertyView.cpp QmitkTransferFunctionCanvas.cpp QmitkTransferFunctionGeneratorWidget.cpp QmitkTransferFunctionWidget.cpp QmitkUGCombinedRepresentationPropertyWidget.cpp QmitkVideoBackground.cpp QtWidgetsExtRegisterClasses.cpp ) set(MOC_H_FILES include/qclickablelabel.h include/QmitkAboutDialog.h include/QmitkBasePropertyView.h include/QmitkBoolPropertyWidget.h include/QmitkBoundingObjectWidget.h include/QmitkCallbackFromGUIThread.h include/QmitkColorPropertyEditor.h include/QmitkColorPropertyView.h include/QmitkColorTransferFunctionCanvas.h include/QmitkCrossWidget.h include/QmitkEditPointDialog.h include/QmitkEnumerationPropertyWidget.h + include/QmitkFFmpegWriter.h include/QmitkFileChooser.h include/QmitkGnuplotWidget.h include/QmitkHistogramWidget.h include/QmitkHotkeyLineEdit.h include/QmitkNumberPropertyEditor.h include/QmitkNumberPropertySlider.h include/QmitkNumberPropertyView.h include/QmitkPiecewiseFunctionCanvas.h include/QmitkPlotWidget.h include/QmitkPointListModel.h include/QmitkPointListView.h include/QmitkPointListViewWidget.h include/QmitkPointListWidget.h include/QmitkPrimitiveMovieNavigatorWidget.h include/QmitkSelectableGLWidget.h include/QmitkSliceWidget.h include/QmitkSliderNavigatorWidget.h include/QmitkStandardViews.h include/QmitkStepperAdapter.h include/QmitkStringPropertyEditor.h include/QmitkStringPropertyOnDemandEdit.h include/QmitkStringPropertyView.h include/QmitkTransferFunctionCanvas.h include/QmitkTransferFunctionGeneratorWidget.h include/QmitkTransferFunctionWidget.h include/QmitkUGCombinedRepresentationPropertyWidget.h include/QmitkVideoBackground.h ) set(UI_FILES src/QmitkAboutDialogGUI.ui src/QmitkGnuplotWidget.ui src/QmitkPrimitiveMovieNavigatorWidget.ui src/QmitkSelectableGLWidget.ui src/QmitkSliceWidget.ui src/QmitkSliderNavigator.ui src/QmitkTransferFunctionGeneratorWidget.ui src/QmitkTransferFunctionWidget.ui ) set(QRC_FILES resource/QtWidgetsExt.qrc ) diff --git a/Plugins/org.mitk.gui.qt.moviemaker/src/internal/QmitkFFmpegWriter.h b/Modules/QtWidgetsExt/include/QmitkFFmpegWriter.h similarity index 93% rename from Plugins/org.mitk.gui.qt.moviemaker/src/internal/QmitkFFmpegWriter.h rename to Modules/QtWidgetsExt/include/QmitkFFmpegWriter.h index f4113b30c1..5b2a6288ca 100644 --- a/Plugins/org.mitk.gui.qt.moviemaker/src/internal/QmitkFFmpegWriter.h +++ b/Modules/QtWidgetsExt/include/QmitkFFmpegWriter.h @@ -1,62 +1,64 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #ifndef QmitkFFmpegWriter_h #define QmitkFFmpegWriter_h #include #include -class QmitkFFmpegWriter : public QObject +#include "MitkQtWidgetsExtExports.h" + +class MITKQTWIDGETSEXT_EXPORT QmitkFFmpegWriter : public QObject { Q_OBJECT public: explicit QmitkFFmpegWriter(QObject* parent = nullptr); ~QmitkFFmpegWriter(); QString GetFFmpegPath() const; void SetFFmpegPath(const QString& path); QSize GetSize() const; void SetSize(const QSize& size); void SetSize(int width, int height); int GetFramerate() const; void SetFramerate(int framerate); QString GetOutputPath() const; void SetOutputPath(const QString& path); void Start(); bool IsRunning() const; void WriteFrame(const unsigned char* frame); void Stop(); private slots: void OnProcessError(QProcess::ProcessError error); void OnProcessFinished(int exitCode, QProcess::ExitStatus exitStatus); private: QProcess* m_Process; QString m_FFmpegPath; QSize m_Size; int m_Framerate; QString m_OutputPath; bool m_IsRunning; }; #endif diff --git a/Plugins/org.mitk.gui.qt.moviemaker/src/internal/QmitkFFmpegWriter.cpp b/Modules/QtWidgetsExt/src/QmitkFFmpegWriter.cpp similarity index 100% rename from Plugins/org.mitk.gui.qt.moviemaker/src/internal/QmitkFFmpegWriter.cpp rename to Modules/QtWidgetsExt/src/QmitkFFmpegWriter.cpp diff --git a/Plugins/org.mitk.gui.qt.moviemaker/files.cmake b/Plugins/org.mitk.gui.qt.moviemaker/files.cmake index 184872f9d9..cc6775f241 100644 --- a/Plugins/org.mitk.gui.qt.moviemaker/files.cmake +++ b/Plugins/org.mitk.gui.qt.moviemaker/files.cmake @@ -1,57 +1,55 @@ set(SRC_CPP_FILES ) set(INTERNAL_CPP_FILES QmitkAnimationItem.cpp QmitkAnimationItemDelegate.cpp QmitkAnimationWidget.cpp - QmitkFFmpegWriter.cpp QmitkMovieMakerView.cpp QmitkOrbitAnimationItem.cpp QmitkOrbitAnimationWidget.cpp QmitkSliceAnimationItem.cpp QmitkSliceAnimationWidget.cpp QmitkTimeSliceAnimationItem.cpp QmitkTimeSliceAnimationWidget.cpp mitkMovieMakerPluginActivator.cpp QmitkScreenshotMaker.cpp ) set(UI_FILES src/internal/QmitkMovieMakerView.ui src/internal/QmitkOrbitAnimationWidget.ui src/internal/QmitkSliceAnimationWidget.ui src/internal/QmitkTimeSliceAnimationWidget.ui src/internal/QmitkScreenshotMakerControls.ui ) set(MOC_H_FILES src/internal/mitkMovieMakerPluginActivator.h src/internal/QmitkAnimationItemDelegate.h src/internal/QmitkAnimationWidget.h - src/internal/QmitkFFmpegWriter.h src/internal/QmitkMovieMakerView.h src/internal/QmitkOrbitAnimationWidget.h src/internal/QmitkSliceAnimationWidget.h src/internal/QmitkTimeSliceAnimationWidget.h src/internal/QmitkScreenshotMaker.h ) set(CACHED_RESOURCE_FILES resources/camera-video.png resources/screenshot_maker.png plugin.xml ) set(QRC_FILES resources/QmitkMovieMaker.qrc ) foreach(file ${SRC_CPP_FILES}) set(CPP_FILES ${CPP_FILES} src/${file}) endforeach(file ${SRC_CPP_FILES}) foreach(file ${INTERNAL_CPP_FILES}) set(CPP_FILES ${CPP_FILES} src/internal/${file}) endforeach(file ${INTERNAL_CPP_FILES})