diff --git a/CMakeExternals/CTK.cmake b/CMakeExternals/CTK.cmake index 48a8a05fc4..875af68bf1 100644 --- a/CMakeExternals/CTK.cmake +++ b/CMakeExternals/CTK.cmake @@ -1,120 +1,122 @@ #----------------------------------------------------------------------------- # CTK #----------------------------------------------------------------------------- if(MITK_USE_CTK) # Sanity checks if(DEFINED CTK_DIR AND NOT EXISTS ${CTK_DIR}) message(FATAL_ERROR "CTK_DIR variable is defined but corresponds to non-existing directory") endif() set(proj CTK) set(proj_DEPENDENCIES ) set(CTK_DEPENDS ${proj}) if(NOT DEFINED CTK_DIR) set(revision_tag abca3189) #IF(${proj}_REVISION_TAG) # SET(revision_tag ${${proj}_REVISION_TAG}) #ENDIF() set(ctk_optional_cache_args ) if(MITK_USE_Python) if(NOT MITK_USE_SYSTEM_PYTHON) list(APPEND proj_DEPENDENCIES Python) endif() list(APPEND ctk_optional_cache_args -DCTK_LIB_Scripting/Python/Widgets:BOOL=ON -DCTK_ENABLE_Python_Wrapping:BOOL=ON -DCTK_APP_ctkSimplePythonShell:BOOL=ON -DPYTHON_EXECUTABLE:FILEPATH=${PYTHON_EXECUTABLE} -DPYTHON_INCLUDE_DIR:PATH=${PYTHON_INCLUDE_DIR} -DPYTHON_INCLUDE_DIR2:PATH=${PYTHON_INCLUDE_DIR2} -DPYTHON_LIBRARY:FILEPATH=${PYTHON_LIBRARY} ) else() list(APPEND ctk_optional_cache_args -DCTK_LIB_Scripting/Python/Widgets:BOOL=OFF -DCTK_ENABLE_Python_Wrapping:BOOL=OFF -DCTK_APP_ctkSimplePythonShell:BOOL=OFF ) endif() if(MITK_USE_DCMTK) list(APPEND ctk_optional_cache_args -DDCMTK_DIR:PATH=${DCMTK_DIR} -DDCMTK_CMAKE_DEBUG_POSTFIX:STRING=d ) list(APPEND proj_DEPENDENCIES DCMTK) else() list(APPEND ctk_optional_cache_args -DDCMTK_URL:STRING=${MITK_THIRDPARTY_DOWNLOAD_PREFIX_URL}/CTK_DCMTK_085525e6.tar.gz ) endif() if(CTEST_USE_LAUNCHERS) list(APPEND ctk_optional_cache_args "-DCMAKE_PROJECT_${proj}_INCLUDE:FILEPATH=${CMAKE_ROOT}/Modules/CTestUseLaunchers.cmake" ) endif() set (ctk_qt_args -DCTK_QT_VERSION:STRING=${DESIRED_QT_VERSION}) if (DESIRED_QT_VERSION MATCHES "4") list(APPEND ctk_qt_args -DQT_QMAKE_EXECUTABLE:FILEPATH=${QT_QMAKE_EXECUTABLE}) endif() FOREACH(type RUNTIME ARCHIVE LIBRARY) IF(DEFINED CTK_PLUGIN_${type}_OUTPUT_DIRECTORY) LIST(APPEND mitk_optional_cache_args -DCTK_PLUGIN_${type}_OUTPUT_DIRECTORY:PATH=${CTK_PLUGIN_${type}_OUTPUT_DIRECTORY}) ENDIF() ENDFOREACH() ExternalProject_Add(${proj} LIST_SEPARATOR ${sep} - URL ${MITK_THIRDPARTY_DOWNLOAD_PREFIX_URL}/CTK_${revision_tag}.tar.gz - URL_MD5 3a3470976debc29e9c9d5aaae12eae1c +# URL ${MITK_THIRDPARTY_DOWNLOAD_PREFIX_URL}/CTK_${revision_tag}.tar.gz +# URL /Users/fetzer/proj/ctk/CTK/CTK-XNAT-Upload.tar.gz + URL https://www.dropbox.com/s/imutmjs81ox9vsi/CTK-XNAT-Upload.tar.gz + URL_MD5 c495e7125451b27e557fb8cc4e3f31f2 UPDATE_COMMAND "" INSTALL_COMMAND "" CMAKE_GENERATOR ${gen} CMAKE_ARGS ${ep_common_args} ${ctk_optional_cache_args} ${ctk_qt_args} # The CTK PluginFramework cannot cope with # a non-empty CMAKE_DEBUG_POSTFIX for the plugin # libraries yet. -DCMAKE_DEBUG_POSTFIX:STRING= -DGit_EXECUTABLE:FILEPATH=${GIT_EXECUTABLE} -DGIT_EXECUTABLE:FILEPATH=${GIT_EXECUTABLE} -DCTK_LIB_CommandLineModules/Backend/LocalProcess:BOOL=ON -DCTK_LIB_CommandLineModules/Frontend/QtGui:BOOL=ON -DCTK_LIB_PluginFramework:BOOL=ON -DCTK_LIB_DICOM/Widgets:BOOL=ON -DCTK_LIB_XNAT/Core:BOOL=ON -DCTK_PLUGIN_org.commontk.eventadmin:BOOL=ON -DCTK_PLUGIN_org.commontk.configadmin:BOOL=ON -DCTK_USE_GIT_PROTOCOL:BOOL=OFF -DDCMTK_URL:STRING=${MITK_THIRDPARTY_DOWNLOAD_PREFIX_URL}/CTK_DCMTK_085525e6.tar.gz - -DqRestAPI_URL:STRING=${MITK_THIRDPARTY_DOWNLOAD_PREFIX_URL}/qRestAPI_5f3a03b1.tar.gz + -DqRestAPI_URL:STRING=${MITK_THIRDPARTY_DOWNLOAD_PREFIX_URL}/qRestAPI_4293694a.tar.gz CMAKE_CACHE_ARGS ${ep_common_cache_args} CMAKE_CACHE_DEFAULT_ARGS ${ep_common_cache_default_args} DEPENDS ${proj_DEPENDENCIES} ) ExternalProject_Get_Property(${proj} binary_dir) set(CTK_DIR ${binary_dir}) #set(CTK_DIR ${ep_prefix}) #mitkFunctionInstallExternalCMakeProject(${proj}) else() mitkMacroEmptyExternalProject(${proj} "${proj_DEPENDENCIES}") endif() endif() diff --git a/Plugins/org.mitk.gui.qt.xnat/src/internal/QmitkXnatTreeBrowserView.cpp b/Plugins/org.mitk.gui.qt.xnat/src/internal/QmitkXnatTreeBrowserView.cpp index 7e12c0ee07..736469ad07 100644 --- a/Plugins/org.mitk.gui.qt.xnat/src/internal/QmitkXnatTreeBrowserView.cpp +++ b/Plugins/org.mitk.gui.qt.xnat/src/internal/QmitkXnatTreeBrowserView.cpp @@ -1,279 +1,514 @@ /*=================================================================== 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 "QmitkXnatTreeBrowserView.h" // Qmitk #include "QmitkXnatObjectEditorInput.h" #include "QmitkXnatEditor.h" #include "org_mitk_gui_qt_xnatinterface_Activator.h" // Blueberry #include #include // CTK XNAT Core +#include +#include +#include +#include #include "ctkXnatFile.h" +#include +#include +#include +#include +#include +#include +#include +#include // Qt +#include #include +#include +#include #include -#include +#include // MITK #include +#include #include const std::string QmitkXnatTreeBrowserView::VIEW_ID = "org.mitk.views.xnat.treebrowser"; QmitkXnatTreeBrowserView::QmitkXnatTreeBrowserView() : m_DataStorageServiceTracker(mitk::org_mitk_gui_qt_xnatinterface_Activator::GetContext()), m_TreeModel(new QmitkXnatTreeModel()), m_Tracker(0), m_DownloadPath(berry::Platform::GetPreferencesService()->GetSystemPreferences()->Node("/XnatConnection")->Get("Download Path", "")) { m_DataStorageServiceTracker.open(); // Set DownloadPath if (m_DownloadPath.isEmpty()) { QString xnatFolder = "XNAT_DOWNLOADS"; QDir dir(mitk::org_mitk_gui_qt_xnatinterface_Activator::GetContext()->getDataFile("").absoluteFilePath()); dir.mkdir(xnatFolder); dir.setPath(dir.path() + "/" + xnatFolder); m_DownloadPath = dir.path() + "/"; } } QmitkXnatTreeBrowserView::~QmitkXnatTreeBrowserView() { delete m_TreeModel; delete m_Tracker; } void QmitkXnatTreeBrowserView::SetFocus() { } void QmitkXnatTreeBrowserView::CreateQtPartControl(QWidget *parent) { // Create GUI widgets from the Qt Designer's .ui file m_Controls.setupUi(parent); m_Controls.treeView->setModel(m_TreeModel); m_Controls.treeView->header()->hide(); + m_Controls.treeView->setSelectionMode(QAbstractItemView::ExtendedSelection); + m_Controls.treeView->setAcceptDrops(true); + m_Controls.treeView->setDropIndicatorShown(true); m_Controls.labelError->setText("Please use the 'Connect' button in the Preferences."); m_Controls.labelError->setStyleSheet("QLabel { color: red; }"); m_SelectionProvider = new berry::QtSelectionProvider(); this->SetSelectionProvider(); m_Controls.treeView->setSelectionMode(QAbstractItemView::SingleSelection); m_Controls.treeView->setContextMenuPolicy(Qt::CustomContextMenu); m_Tracker = new mitk::XnatSessionTracker(mitk::org_mitk_gui_qt_xnatinterface_Activator::GetXnatModuleContext()); m_ContextMenu = new QMenu(m_Controls.treeView); connect(m_Controls.treeView, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(OnContextMenuRequested(const QPoint&))); connect(m_Tracker, SIGNAL(AboutToBeClosed(ctkXnatSession*)), this, SLOT(CleanTreeModel(ctkXnatSession*))); connect(m_Tracker, SIGNAL(Opened(ctkXnatSession*)), this, SLOT(UpdateSession(ctkXnatSession*))); m_Tracker->Open(); ctkXnatSession* session; try { session = mitk::org_mitk_gui_qt_xnatinterface_Activator::GetXnatModuleContext()->GetService( mitk::org_mitk_gui_qt_xnatinterface_Activator::GetXnatModuleContext()->GetServiceReference()); } catch (std::invalid_argument) { session = 0; } if (session != 0) { m_Controls.labelError->setVisible(false); } else { m_Controls.labelError->setVisible(true); } connect(m_Controls.treeView, SIGNAL(activated(const QModelIndex&)), this, SLOT(OnActivatedNode(const QModelIndex&))); + connect(m_TreeModel, SIGNAL(ResourceDropped(const QList&, ctkXnatObject*)), this, SLOT(OnUploadResource(const QList&, ctkXnatObject*))); } void QmitkXnatTreeBrowserView::OnActivatedNode(const QModelIndex& index) { if (!index.isValid()) return; berry::IWorkbenchPage::Pointer page = GetSite()->GetPage(); QmitkXnatObjectEditorInput::Pointer oPtr(new QmitkXnatObjectEditorInput(index.data(Qt::UserRole).value())); berry::IEditorInput::Pointer editorInput(oPtr); berry::IEditorPart::Pointer reuseEditor = page->FindEditor(editorInput); if (reuseEditor) { // Just set it activ page->Activate(reuseEditor); } else { QList editors = page->FindEditors(berry::IEditorInput::Pointer(0), QmitkXnatEditor::EDITOR_ID, berry::IWorkbenchPage::MATCH_ID); if (editors.isEmpty()) { ctkXnatFile* file = dynamic_cast(oPtr->GetXnatObject()); if (file != NULL) { // If the selected node is a file, so show it in MITK InternalFileDownload(index, true); } else { // No XnatEditor is currently open, create a new one page->OpenEditor(editorInput, QmitkXnatEditor::EDITOR_ID); } } else { // Reuse an existing editor reuseEditor = editors.front()->GetEditor(true); page->ReuseEditor(reuseEditor.Cast(), editorInput); page->Activate(reuseEditor); } } } void QmitkXnatTreeBrowserView::SetSelectionProvider() { GetSite()->SetSelectionProvider(m_SelectionProvider); } void QmitkXnatTreeBrowserView::UpdateSession(ctkXnatSession* session) { if (session != 0 && session->isOpen()) { m_Controls.labelError->setVisible(false); // Fill model and show in the GUI m_TreeModel->addDataModel(session->dataModel()); m_Controls.treeView->reset(); m_SelectionProvider->SetItemSelectionModel(m_Controls.treeView->selectionModel()); + + connect(session, SIGNAL(progress(QUuid,double)), this, SLOT(OnProgress(QUuid,double))); + connect(session, SIGNAL(uploadFinished()), this, SLOT(OnProgress(QUuid,double))); } } void QmitkXnatTreeBrowserView::CleanTreeModel(ctkXnatSession* session) { if (session != 0) { m_TreeModel->removeDataModel(session->dataModel()); m_Controls.treeView->reset(); } } +void QmitkXnatTreeBrowserView::OnProgress(QUuid /*queryID*/, double progress) +{ + unsigned int currentProgress = progress*100; + if (currentProgress < 1) + mitk::ProgressBar::GetInstance()->AddStepsToDo(100); + else + mitk::ProgressBar::GetInstance()->Progress(); +} + void QmitkXnatTreeBrowserView::InternalFileDownload(const QModelIndex& index, bool loadData) { QVariant variant = m_TreeModel->data(index, Qt::UserRole); if (variant.isValid()) { ctkXnatFile* file = dynamic_cast(variant.value()); if (file != NULL) { QDir downDir(m_DownloadPath); QString filePath = m_DownloadPath + file->name(); // Testing if the file exists already if (downDir.exists(file->name())) { MITK_INFO << "File '" << file->name().toStdString() << "' already exists!"; } else { MITK_INFO << "Download started ..."; MITK_INFO << "..."; file->download(filePath); // Testing if the file exists now if (downDir.exists(file->name())) { MITK_INFO << "Download of " << file->name().toStdString() << " was completed!"; } else { MITK_INFO << "Download of " << file->name().toStdString() << " failed!"; } } if (downDir.exists(file->name())) { if (loadData) { mitk::IDataStorageService* dsService = m_DataStorageServiceTracker.getService(); mitk::DataStorage::Pointer dataStorage = dsService->GetDataStorage()->GetDataStorage(); QStringList list; list << (m_DownloadPath + file->name()); try { QmitkIOUtil::Load(list, *dataStorage); } catch (const mitk::Exception& e) { MITK_INFO << e; return; } mitk::RenderingManager::GetInstance()->InitializeViewsByBoundingObjects( dsService->GetDataStorage()->GetDataStorage()); } } } else { MITK_INFO << "Selection was not a file!"; } } } void QmitkXnatTreeBrowserView::OnContextMenuDownloadFile() { QModelIndex index = m_Controls.treeView->currentIndex(); InternalFileDownload(index, false); } void QmitkXnatTreeBrowserView::OnContextMenuDownloadAndOpenFile() { QModelIndex index = m_Controls.treeView->currentIndex(); InternalFileDownload(index, true); } +void QmitkXnatTreeBrowserView::OnContextMenuCreateResourceFolder() +{ + const QModelIndex index = m_Controls.treeView->selectionModel()->currentIndex(); + ctkXnatObject* parentObject = m_TreeModel->xnatObject(index); + + if (parentObject != nullptr) + { + this->InternalAddResourceFolder(parentObject); + } +} + +ctkXnatResource* QmitkXnatTreeBrowserView::InternalAddResourceFolder(ctkXnatObject *parent) +{ + bool ok; + QString folderName = QInputDialog::getText(m_Controls.treeView, tr("Create XNAT resource folder"), + tr("Folder name:"), QLineEdit::Normal, tr("data"), &ok); + if (ok) + { + if (folderName.isEmpty()) + folderName = "NO LABEL"; + + return parent->addResourceFolder(folderName); + } + else + { + return nullptr; + } +} + +void QmitkXnatTreeBrowserView::InternalFileUpload(ctkXnatFile* file) +{ + try + { + file->save(); + } + catch (ctkXnatException &e) + { + QMessageBox msgbox; + msgbox.setText(e.what()); + msgbox.setIcon(QMessageBox::Critical); + msgbox.exec(); + } +} + +void QmitkXnatTreeBrowserView::OnContextMenuUploadFile() +{ + QString filename = QFileDialog::getOpenFileName(m_Controls.treeView, tr("Open File"), QDir::homePath()); + const QModelIndex index = m_Controls.treeView->selectionModel()->currentIndex(); + ctkXnatResource* resource = dynamic_cast(m_TreeModel->xnatObject(index)); + if (resource) + { + ctkXnatFile* file = new ctkXnatFile(resource); + file->setLocalFilePath(filename); + QFileInfo fileInfo (filename); + file->setName(fileInfo.fileName()); + file->setFileFormat("some format"); + file->setFileContent("some content"); + file->setFileTags("some, tags"); + file->save(); + m_TreeModel->addChildNode(index, file); + } +} + +#include +void QmitkXnatTreeBrowserView::OnUploadResource(const QList& droppedNodes, ctkXnatObject* parentObject) +{ + if (parentObject == nullptr) + return; + + if (dynamic_cast(parentObject)) + MITK_INFO<<"SESSION"; + else if (dynamic_cast(parentObject)) + MITK_INFO<<"DATAMODEL"; + else if (dynamic_cast(parentObject)) + MITK_INFO<<"PROJECT"; + else if (dynamic_cast(parentObject)) + MITK_INFO<<"SUBJECT"; + //1. If not dropped on a resource, create a new folder + //2. Save file locally + //3. Upload file + ctkXnatResource* resource = dynamic_cast(parentObject); + if (resource == nullptr) + { + resource = this->InternalAddResourceFolder(parentObject); + } + + if (resource == nullptr) + { + MITK_WARN << "Could not upload file! No resource available!"; + } + + mitk::DataNode* node = NULL; + foreach (node, droppedNodes) + { + mitk::BaseData* data = node->GetData(); + if (!data) + return; + + + QString fileName (QString::fromStdString(node->GetName())); + + ctkXnatFile* xnatFile = new ctkXnatFile(resource); + + if (dynamic_cast(data)) + { + fileName.append(".nrrd"); + } + else if (dynamic_cast(data)) + { + fileName.append(".vtk"); + } + else if (dynamic_cast(data)) + { + fileName.append(".mps"); + } + + xnatFile->setName(fileName); + + QString xnatFolder = "XNAT_UPLOADS"; + QDir dir(mitk::org_mitk_gui_qt_xnatinterface_Activator::GetContext()->getDataFile("").absoluteFilePath()); + dir.mkdir(xnatFolder); + + fileName = dir.path().append("/" + fileName); + mitk::IOUtil::Save (data, fileName.toStdString()); + + // TODO Check if file exists + // AbstractFileReader::SetDefaultDataNodeProperties + // und in die andere SetDefaultDataNodeProperties + // PropertyName klein: mtime.initial + Kommentar + mitk::StringProperty::Pointer orignalFilePath = mitk::StringProperty::New(); + node->GetProperty(orignalFilePath, "path"); + + xnatFile->setLocalFilePath(fileName); + // + xnatFile->setFileFormat("some format"); + xnatFile->setFileContent("some content"); + xnatFile->setFileTags("some, tags"); + // + xnatFile->save(); + m_TreeModel->addChildNode(m_Controls.treeView->currentIndex(), xnatFile); + parentObject->fetch(); + + // The filename for uploading +// QFileInfo fileInfo; + // if (surface) + // { + // // Save surface + // fileName.append(".stl"); + // xnatFile->setName(fileName); + // dir.setPath(dir.path().append("/" + fileName)); + +// QString origFile = QString::fromStdString(orignalFilePath->GetValueAsString()); +// origFile.append("/" + fileName); + // origFile.append(".stl"); + + // fileInfo.setFile(origFile); + // if (!fileInfo.exists()) + // mitk::IOUtil::SaveSurface(surface, dir.path().toStdString()); + // } +// this->uploadFileToXnat(xnatFile, dir.path()); + + // TODO delete file!!! + } +} + void QmitkXnatTreeBrowserView::OnContextMenuRequested(const QPoint & pos) { m_ContextMenu->clear(); QModelIndex index = m_Controls.treeView->indexAt(pos); ctkXnatObject* xnatObject = m_TreeModel->xnatObject(index); + + bool downloadable = false; + downloadable |= dynamic_cast(xnatObject)!=NULL; + downloadable |= dynamic_cast(xnatObject)!=NULL; + downloadable |= dynamic_cast(xnatObject)!=NULL; + downloadable |= dynamic_cast(xnatObject)!=NULL; + downloadable |= dynamic_cast(xnatObject)!=NULL; + downloadable |= dynamic_cast(xnatObject)!=NULL; + downloadable |= dynamic_cast(xnatObject)!=NULL; + downloadable |= dynamic_cast(xnatObject)!=NULL; + + bool canHaveResourceFolder = false; + canHaveResourceFolder |= dynamic_cast(xnatObject) != NULL; + canHaveResourceFolder |= dynamic_cast(xnatObject) != NULL; + canHaveResourceFolder |= dynamic_cast(xnatObject) != NULL; + + bool uploadFilePossible = false; + uploadFilePossible |= dynamic_cast(xnatObject) != NULL; + uploadFilePossible |= dynamic_cast(xnatObject) != NULL; + uploadFilePossible |= dynamic_cast(xnatObject) != NULL; + + if (downloadable) { + QAction* actDownload = new QAction("Download", m_ContextMenu); + connect(actDownload, SIGNAL(triggered()), this, SLOT(OnContextMenuDownloadFile())); + m_ContextMenu->addAction(actDownload); + ctkXnatFile* file = dynamic_cast(xnatObject); + if (file) { - QAction* actShow = new QAction("Download and Open", m_NodeMenu); - QAction* actDownload = new QAction("Download", m_NodeMenu); - m_NodeMenu->addAction(actShow); - m_NodeMenu->addAction(actDownload); - connect(actShow, SIGNAL(triggered()), this, SLOT(OnContextMenuDownloadAndOpenFile())); - connect(actDownload, SIGNAL(triggered()), this, SLOT(OnContextMenuDownloadFile())); - m_NodeMenu->popup(QCursor::pos()); + QAction* actView = new QAction("Download and Open", m_ContextMenu); + connect(actView, SIGNAL(triggered()), this, SLOT(OnContextMenuDownloadAndOpenFile())); + m_ContextMenu->addAction(actView); } } + + if (canHaveResourceFolder) + { + QAction* actCreateResource = new QAction("Add resource folder", m_ContextMenu); + connect(actCreateResource, SIGNAL(triggered()), this, SLOT(OnContextMenuCreateResourceFolder())); + m_ContextMenu->addAction(actCreateResource); + } + + if (uploadFilePossible) + { + QAction* actUploadFile = new QAction("Upload File", m_ContextMenu); + connect(actUploadFile, SIGNAL(triggered()), this, SLOT(OnContextMenuUploadFile())); + m_ContextMenu->addAction(actUploadFile); + } + m_ContextMenu->popup(QCursor::pos()); } diff --git a/Plugins/org.mitk.gui.qt.xnat/src/internal/QmitkXnatTreeBrowserView.h b/Plugins/org.mitk.gui.qt.xnat/src/internal/QmitkXnatTreeBrowserView.h index 7eb75d8c8e..10941321fc 100644 --- a/Plugins/org.mitk.gui.qt.xnat/src/internal/QmitkXnatTreeBrowserView.h +++ b/Plugins/org.mitk.gui.qt.xnat/src/internal/QmitkXnatTreeBrowserView.h @@ -1,99 +1,108 @@ /*=================================================================== 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 QMITKXNATTREEBROWSERVIEW_H #define QMITKXNATTREEBROWSERVIEW_H #include #include #include "ui_QmitkXnatTreeBrowserViewControls.h" // ctkXnatCore #include "ctkXnatSession.h" // ctkXnatWidget #include "QmitkXnatTreeModel.h" // MitkXNAT Module #include "mitkXnatSessionTracker.h" #include #include class QMenu; /*! \brief QmitkXnatTreeBrowserView \warning This class is not yet documented. Use "git blame" and ask the author to provide basic documentation. \sa QmitkFunctionality \ingroup ${plugin_target}_internal */ class QmitkXnatTreeBrowserView : public QmitkAbstractView { // this is needed for all Qt objects that should have a Qt meta-object // (everything that derives from QObject and wants to have signal/slots) Q_OBJECT public: QmitkXnatTreeBrowserView(); ~QmitkXnatTreeBrowserView(); static const std::string VIEW_ID; virtual void CreateQtPartControl(QWidget *parent); protected slots: /// \brief Opens or reuses the xnat editor with the activated node as root item. void OnActivatedNode(const QModelIndex& index); /// \brief Updates the ctkXnatSession and the user interface void UpdateSession(ctkXnatSession* session); /// \brief Cleans the tree model void CleanTreeModel(ctkXnatSession* session); void OnContextMenuRequested(const QPoint & pos); void OnContextMenuDownloadAndOpenFile(); void OnContextMenuDownloadFile(); + void OnContextMenuCreateResourceFolder(); + void OnContextMenuUploadFile(); + + void OnUploadResource(const QList& , ctkXnatObject *); + + void OnProgress(QUuid, double); protected: virtual void SetFocus(); Ui::QmitkXnatTreeBrowserViewControls m_Controls; private: void InternalFileDownload(const QModelIndex& index, bool loadData); + void InternalFileUpload(ctkXnatFile *file); + ctkXnatResource* InternalAddResourceFolder(ctkXnatObject* parent); + berry::QtSelectionProvider::Pointer m_SelectionProvider; void SetSelectionProvider(); ctkServiceTracker m_DataStorageServiceTracker; QmitkXnatTreeModel* m_TreeModel; mitk::XnatSessionTracker* m_Tracker; QString m_DownloadPath; QMenu* m_ContextMenu; }; #endif // QMITKXNATTREEBROWSERVIEW_H