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:
- Sliders to navigate through the different slice stacks (Axial, Sagittal, Coronal) and the time steps
- A "player" for image time series. It automatically steps through all time series with a speed defined by the slider on the right.
- A button "Re-Initialize Navigators" to reinitialize those sliders to their initial position (Slice and time position 0)
- A button "Take Screenshot" to take a screenshot of the chosen window (Axial, Sagittal, Coronal, 3D)
- A button "Take HighDef 3D Screenshot" to take an high resolution screenshot of the 3D scene
-
- A button "Generate Movie" whichs takes a movie of the chosen window by scrolling either through all slices (Axial, Sagittal, Coronal)
-or rotating the 3D scene
+
- A button "Generate Movie" whichs takes a movie of the chosen window by scrolling either through all slices (Axial, Sagittal, Coronal). Please use the MovieMaker view for recording a movie of a rotating 3D scene.
- A selection box where the 3D view can be transformed into either a red-blue stereo or a D4D stereo view
*/
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})