ACF $AcfVersion:0$
TQtDocumentManagerWrap.h
Go to the documentation of this file.
1// SPDX-License-Identifier: LGPL-2.1-or-later OR GPL-2.0-or-later OR GPL-3.0-or-later OR LicenseRef-ACF-Commercial
2#pragma once
3
4
5// Qt includes
6#include <QtCore/QSettings>
7#if QT_VERSION >= 0x050000
8#include <QtWidgets/QFileDialog>
9#else
10#include <QtGui/QFileDialog>
11#endif
12
13// ACF includes
16
17
18namespace iqtdoc
19{
20
21
25template <class Base, class Gui>
26class TQtDocumentManagerWrap: public Base, public Gui
27{
28public:
29 typedef Base BaseClass;
30 typedef typename BaseClass::Ids Ids;
31
32 // pseudo-reimplemented (iqtgui::TRestorableGuiWrap)
33 virtual void OnRestoreSettings(const QSettings& settings) override;
34 virtual void OnSaveSettings(QSettings& settings) const override;
35
36 // pseudo-reimplemented (idoc::CSingleDocumentManagerBase)
37 virtual QString GetSaveFilePath(const QByteArray& documentTypeId, const istd::IChangeable* dataObjectPtr, const QString& currentFilePath) const override;
38
39protected:
44 virtual QStringList CreateFileDialogFilters(const QByteArray* documentTypeIdPtr, const istd::IChangeable* dataObjectPtr, int flags) const;
45
46 void UpdateLastDirectory(const QString& filePath) const;
47 virtual QStringList GetOpenFilePathesFromDialog(const QByteArray* documentTypeIdPtr) const;
48
49private:
50 mutable QString m_lastDirectory;
51};
52
53
54// public methods
55
56// pseudo-reimplemented (TRestorableGuiWrap)
57
58template <class Base, class Gui>
60{
61 QVariant valueNotSet = QVariant(-1);
62
63 QVariant lastDirectory = settings.value("Workspace/LastOpenDocumentDirectory", valueNotSet);
64
65 if (lastDirectory != valueNotSet){
66 m_lastDirectory = lastDirectory.toString();
67 }
68}
69
70
71template <class Base, class Gui>
73{
74 settings.setValue("Workspace/LastOpenDocumentDirectory", m_lastDirectory);
75}
76
77
78// pseudo-reimplemented (idoc::CSingleDocumentManagerBase)
79
80template <class Base, class Gui>
81QString TQtDocumentManagerWrap<Base, Gui>::GetSaveFilePath(const QByteArray& documentTypeId, const istd::IChangeable* dataObjectPtr, const QString& currentFilePath) const
82{
83 QStringList filters = CreateFileDialogFilters(&documentTypeId, dataObjectPtr, ifile::IFilePersistence::QF_FILE | ifile::IFilePersistence::QF_SAVE);
84
85 QString defaultFilter = "*." + QFileInfo(currentFilePath).completeSuffix();
86 for (QStringList::ConstIterator filterIter = filters.constBegin(); filterIter != filters.constEnd(); ++filterIter){
87 if (filterIter->contains(defaultFilter)){
88 defaultFilter = *filterIter;
89 break;
90 }
91 }
92
93 QString filePath = QFileDialog::getSaveFileName(
94 Gui::GetWidget(),
95 Gui::tr("Save..."),
96 currentFilePath.isEmpty()? m_lastDirectory: currentFilePath, filters.join(";;"),
97 &defaultFilter);
98
99 if (!filePath.isEmpty()){
100 UpdateLastDirectory(filePath);
101 }
102
103 return filePath;
104}
105
106
107// protected methods
108
109template <class Base, class Gui>
110QStringList TQtDocumentManagerWrap<Base, Gui>::CreateFileDialogFilters(const QByteArray* documentTypeIdPtr, const istd::IChangeable* dataObjectPtr, int flags) const
111{
112 QStringList filters;
113
114 Ids docTypeIds = BaseClass::GetDocumentTypeIds();
115
116 QStringList allExt;
117
118 if (documentTypeIdPtr != NULL){
119 ifile::IFileTypeInfo* typeInfoPtr = BaseClass::GetDocumentFileTypeInfo(*documentTypeIdPtr);
120 if (typeInfoPtr != NULL){
121 ifilegui::CFileDialogLoaderComp::AppendLoaderFilterList(*typeInfoPtr, dataObjectPtr, flags, allExt, filters, false);
122 }
123 }
124 else{
125 for ( typename Ids::const_iterator docTypeIter = docTypeIds.begin();
126 docTypeIter != docTypeIds.end();
127 ++docTypeIter){
128 ifile::IFileTypeInfo* typeInfoPtr = BaseClass::GetDocumentFileTypeInfo(*docTypeIter);
129 if (typeInfoPtr != NULL){
130 ifilegui::CFileDialogLoaderComp::AppendLoaderFilterList(*typeInfoPtr, dataObjectPtr, flags, allExt, filters, docTypeIds.count() > 1);
131 }
132 }
133 }
134
135 if ((allExt.size() > 1) && ((flags & ifile::IFilePersistence::QF_SAVE) == 0)){
136 filters.prepend(Gui::tr("All known documents (%1)").arg("*." + allExt.join(" *.")));
137 }
138
139 return filters;
140}
141
142
143template <class Base, class Gui>
145{
146 QFileInfo fileInfo(filePath);
147
148 m_lastDirectory = fileInfo.dir().absolutePath();
149}
150
151
152template <class Base, class Gui>
153QStringList TQtDocumentManagerWrap<Base, Gui>::GetOpenFilePathesFromDialog(const QByteArray* documentTypeIdPtr) const
154{
155 QStringList filters = CreateFileDialogFilters(documentTypeIdPtr, NULL, ifile::IFilePersistence::QF_FILE | ifile::IFilePersistence::QF_LOAD);
156
157 QString lastUsedDirectory = m_lastDirectory;
158
159 QFileInfo fileInfo(lastUsedDirectory);
160 if (!fileInfo.exists()){
161 lastUsedDirectory.clear();
162 }
163
164 return QFileDialog::getOpenFileNames(Gui::GetWidget(), Gui::tr("Open Files..."), lastUsedDirectory, filters.join(";;"));
165}
166
167
168} // namespace iqtdoc
169
170
Provide loading and saving of objects.
@ QF_FILE
Operations with specified file name should be considered.
@ QF_LOAD
Check for load operation.
@ QF_SAVE
Check for save operation.
static void AppendLoaderFilterList(const ifile::IFileTypeInfo &fileTypeInfo, const istd::IChangeable *dataObjectPtr, int flags, QStringList &allExt, QStringList &result, bool allowCommonDescription=true)
Append filters extracted from file loader to Qt filter list accepted by QFileDialog.
Wrapper for general functionality of a Qt based document workspace.
virtual void OnSaveSettings(QSettings &settings) const override
void UpdateLastDirectory(const QString &filePath) const
virtual void OnRestoreSettings(const QSettings &settings) override
virtual QStringList CreateFileDialogFilters(const QByteArray *documentTypeIdPtr, const istd::IChangeable *dataObjectPtr, int flags) const
Creates the filter for the file selection dialog.
virtual QStringList GetOpenFilePathesFromDialog(const QByteArray *documentTypeIdPtr) const
virtual QString GetSaveFilePath(const QByteArray &documentTypeId, const istd::IChangeable *dataObjectPtr, const QString &currentFilePath) const override
Common interface for data model objects, which can be changed.
Definition IChangeable.h:28
#define NULL
Definition istd.h:74
This package contains Qt implementations related to Document/View concept.