Hi,

I worked a bit with a custom file writer and would like to make it the default choice in Data Manager's "Save..." dialog.

I understood that the Qt file type list is constructed by QmitkIOUtil which makes use of mitk::FileWriterSelector.

When setting a high-enough "ranking" and an appropriate "base data type" for my writer, it gets correctly selected as default and current selection by the FileWriterSelector class. QmitkIOUtil will however always select the first item in its file type list, completely ignoring what the FileWriterSelector determined as default. To reproduce this easily, you could manipulate mitk::ImageVtkXmlIO, for example.

Question: is the behavior of the Qt dialog wanted? Or could we adapt it to match the "decision" of the FileWriterSelector? Attached patch (applies to 3fc812cc) is what I would have in mind.

Kind regards,
Daniel

--
Dr. Daniel Maleike, Mint Medical GmbH
Friedrich-Ebert-Straße 2, 69221 Dossenheim/Heidelberg
Geschäftsführer: Dr. Matthias Baumhauer, Registergericht Mannheim, HRB 709351

diff --git a/Modules/QtWidgets/src/QmitkIOUtil.cpp 
b/Modules/QtWidgets/src/QmitkIOUtil.cpp
index 4c9ba02..82c4e57 100644
--- a/Modules/QtWidgets/src/QmitkIOUtil.cpp
+++ b/Modules/QtWidgets/src/QmitkIOUtil.cpp
@@ -434,6 +434,8 @@ struct QmitkIOUtil::SaveFilter::Impl
       m_MimeTypes.push_back(mimeType);
       m_FilterStrings.push_back(filter);
     }
+
+    m_DefaultExtension = QString::fromStdString( 
m_SaveInfo.m_WriterSelector.GetDefault().GetMimeType().GetExtensions().front() 
);
   }
 
   const mitk::IOUtil::SaveInfo m_SaveInfo;
@@ -499,7 +501,14 @@ QString QmitkIOUtil::SaveFilter::GetDefaultFilter() const
 {
   if (d->m_FilterStrings.size() > 1)
   {
-    return d->m_FilterStrings.at(1);
+    mitk::MimeType defaultMimeType = 
d->m_SaveInfo.m_WriterSelector.GetDefault().GetMimeType();
+    std::vector<mitk::MimeType>::iterator iter = std::find( 
d->m_MimeTypes.begin(), d->m_MimeTypes.end(), defaultMimeType );
+    size_t index(1); // fallback to first element after "All (*.*)"
+    if (iter != d->m_MimeTypes.end())
+    {
+      index = std::distance(d->m_MimeTypes.begin(), iter);
+    }
+    return d->m_FilterStrings.at(index);
   }
   else if (d->m_FilterStrings.size() > 0)
   {
------------------------------------------------------------------------------
_______________________________________________
mitk-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/mitk-users

Reply via email to