0032429: Coding - Warnings during compilation on macosx arm64 with option BUILD_Inspe...
[occt.git] / tools / ShapeView / ShapeView_OpenFileDialog.cxx
1 // Created on: 2017-06-16
2 // Created by: Natalia ERMOLAEVA
3 // Copyright (c) 2017 OPEN CASCADE SAS
4 //
5 // This file is part of Open CASCADE Technology software library.
6 //
7 // This library is free software; you can redistribute it and/or modify it under
8 // the terms of the GNU Lesser General Public License version 2.1 as published
9 // by the Free Software Foundation, with special exception defined in the file
10 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
11 // distribution for complete text of the license and disclaimer of any warranty.
12 //
13 // Alternatively, this file may be used under the terms of Open CASCADE
14 // commercial license or contractual agreement. 
15
16 #include <inspector/ShapeView_OpenFileDialog.hxx>
17 #include <inspector/ShapeView_OpenFileViewModel.hxx>
18
19 #include <Standard_WarningsDisable.hxx>
20 #include <QGroupBox>
21 #include <QHBoxLayout>
22 #include <QHeaderView>
23 #include <QItemSelectionModel>
24 #include <QLabel>
25 #include <QLineEdit>
26 #include <QScrollBar>
27 #include <QTableView>
28 #include <QVBoxLayout>
29 #include <QWidget>
30
31 #include <QApplication>
32 #include <QCompleter>
33 #include <QDir>
34 #include <QFileDialog>
35 #include <QFileSystemModel>
36 #include <QPushButton>
37 #include <QToolButton>
38 #include <Standard_WarningsRestore.hxx>
39
40 static const int ICON_SIZE = 40;
41
42 static const int OPEN_DIALOG_WIDTH = 550;
43 static const int OPEN_DIALOG_HEIGHT = 200;
44
45 static const int MARGIN_DIALOG = 4;
46 static const int SPACING_DIALOG = 2;
47
48 // =======================================================================
49 // function : StartButton
50 // purpose :
51 // =======================================================================
52 QPushButton* ShapeView_OpenButton::StartButton()
53 {
54   if (!myStartButton)
55   {
56     myStartButton = new QPushButton();
57     myStartButton->setIcon (QIcon (":/icons/folder_open.png"));
58     connect (myStartButton, SIGNAL (clicked()), this, SLOT (onStartButtonClicked()));
59   }
60   return myStartButton;
61 }
62
63 // =======================================================================
64 // function : onStartButtonClicked
65 // purpose :
66 // =======================================================================
67 void ShapeView_OpenButton::onStartButtonClicked()
68 {
69   QString aDataDirName = QDir::currentPath();
70
71   QString aFileName = ShapeView_OpenFileDialog::OpenFile (0, aDataDirName);
72   aFileName = QDir().toNativeSeparators (aFileName);
73   if (!aFileName.isEmpty())
74   {
75     QApplication::setOverrideCursor (Qt::WaitCursor);
76     emit OpenFile (aFileName);
77     QApplication::restoreOverrideCursor();
78   }
79 }
80
81 // =======================================================================
82 // function : changeMargins
83 // purpose :
84 // =======================================================================
85 void changeMargins (QBoxLayout* theLayout)
86 {
87   theLayout->setContentsMargins (MARGIN_DIALOG, MARGIN_DIALOG, MARGIN_DIALOG, MARGIN_DIALOG);
88   theLayout->setSpacing (SPACING_DIALOG);
89 }
90
91 // =======================================================================
92 // function : Constructor
93 // purpose :
94 // =======================================================================
95 ShapeView_OpenFileDialog::ShapeView_OpenFileDialog (QWidget* theParent, const QString& theDataDirName)
96 : QDialog (theParent)
97 {
98   setWindowTitle (theDataDirName);
99   myDataDir = theDataDirName;
100
101   QVBoxLayout* aDialogLay = new QVBoxLayout (this);
102   changeMargins (aDialogLay);
103
104   // Title label
105   QLabel* aTitleLabel = new QLabel (this);
106   aTitleLabel->setText (tr ("Open File"));
107   aDialogLay->addWidget (aTitleLabel);
108
109   // Samples View
110   QGroupBox* aSamplesBox = new QGroupBox (this);
111   aSamplesBox->setTitle (tr ("Samples"));
112   aDialogLay->addWidget (aSamplesBox);
113   QVBoxLayout* aSampleLay = new QVBoxLayout (aSamplesBox);
114   changeMargins (aSampleLay);
115   mySamplesView = createTableView (readSampleNames());
116   aSampleLay->addWidget (mySamplesView);
117
118   // Select file
119   QGroupBox* aSelectFileBox = new QGroupBox (this);
120   aSelectFileBox->setTitle (tr ("Select file"));
121   aDialogLay->addWidget (aSelectFileBox);
122   QGridLayout* aSelectFileLay = new QGridLayout (aSelectFileBox);
123   aSelectFileLay->setContentsMargins (MARGIN_DIALOG, MARGIN_DIALOG, MARGIN_DIALOG, MARGIN_DIALOG);
124
125   mySelectedName = new QLineEdit (aSelectFileBox);
126   QCompleter* aCompleter = new QCompleter();
127   QFileSystemModel* aFileSystemModel = new QFileSystemModel;
128   aFileSystemModel->setRootPath (QDir::rootPath());
129   aCompleter->setModel (aFileSystemModel);
130   mySelectedName->setCompleter (aCompleter);
131   aSelectFileLay->addWidget (mySelectedName, 1, 0);
132
133   QToolButton* aSelectFileBtn = new QToolButton (aSelectFileBox);
134   aSelectFileBtn->setIcon (QIcon (":/icons/folder_open.png"));
135   aSelectFileLay->addWidget (aSelectFileBtn, 1, 1);
136
137   myFolderApplyOpen = new QToolButton (aSelectFileBox);
138   myFolderApplyOpen->setIcon (QIcon (":/icons/folder_import.png"));
139   myFolderApplyOpen->setIconSize (QSize (ICON_SIZE, ICON_SIZE));
140   myFolderApplyOpen->setEnabled (false);
141   aSelectFileLay->addWidget (myFolderApplyOpen, 0, 2, 2, 1);
142
143   connect (mySelectedName, SIGNAL (textChanged (const QString&)),
144            this, SLOT (onNameChanged (const QString&)));
145   connect (aSelectFileBtn, SIGNAL (clicked()), this, SLOT (onSelectClicked()));
146   connect (myFolderApplyOpen, SIGNAL (clicked()), this, SLOT (onApplySelectClicked()));
147
148   resize (OPEN_DIALOG_WIDTH, OPEN_DIALOG_HEIGHT);
149 }
150
151 // =======================================================================
152 // function : OpenFile
153 // purpose :
154 // =======================================================================
155 QString ShapeView_OpenFileDialog::OpenFile (QWidget* theParent, const QString& theDataDirName)
156 {
157   QString aFileName;
158   ShapeView_OpenFileDialog* aDialog = new ShapeView_OpenFileDialog(theParent, theDataDirName);
159   if (aDialog->exec() == QDialog::Accepted)
160     aFileName = aDialog->GetFileName();
161
162   return aFileName;
163 }
164
165 // =======================================================================
166 // function : onSampleSelectionChanged
167 // purpose :
168 // =======================================================================
169 void ShapeView_OpenFileDialog::onSampleSelectionChanged (const QItemSelection& theSelected,
170                                                            const QItemSelection&)
171 {
172   QItemSelectionModel* aSelectionModel = (QItemSelectionModel*)sender();
173   if (!aSelectionModel)
174     return;
175   if (theSelected.isEmpty())
176     return;
177
178   QModelIndex anIndex = theSelected.first().indexes().first();
179   if (!anIndex.isValid())
180     return;
181
182   myFileName = aSelectionModel->model()->data (anIndex, Qt::ToolTipRole).toString();
183   accept();
184 }
185
186 // =======================================================================
187 // function : onNameChanged
188 // purpose :
189 // =======================================================================
190 void ShapeView_OpenFileDialog::onNameChanged (const QString& theText)
191 {
192   QFileInfo aFileInfo (theText);
193   bool anExists = aFileInfo.exists() && aFileInfo.isFile();
194   myFolderApplyOpen->setEnabled (anExists);
195 }
196
197 // =======================================================================
198 // function : onSelectClicked
199 // purpose :
200 // =======================================================================
201 void ShapeView_OpenFileDialog::onSelectClicked()
202 {
203   QString anEnteredPath;
204   QString aDirName = mySelectedName->text();
205   if (!aDirName.isEmpty())
206   {
207     QDir aDir (aDirName);
208     if (aDir.exists())
209       anEnteredPath = aDirName;
210   }
211
212   QString aFilter (tr ("BREP file (*.brep*)"));
213   QString aFileName = QFileDialog::getOpenFileName (0, "Open document", anEnteredPath, aFilter);
214
215   if (aFileName.isEmpty())
216     return; // do nothing, left the previous value
217
218   mySelectedName->setText (aFileName);
219   onNameChanged (aFileName);
220 }
221
222 // =======================================================================
223 // function : onApplySelectClicked
224 // purpose :
225 // =======================================================================
226 void ShapeView_OpenFileDialog::onApplySelectClicked()
227 {
228   myFileName = mySelectedName->text();
229   accept();
230 }
231
232 // =======================================================================
233 // function : createTableView
234 // purpose :
235 // =======================================================================
236 QTableView* ShapeView_OpenFileDialog::createTableView (const QStringList& theFileNames)
237 {
238   QTableView* aTableView = new QTableView (this);
239   aTableView->setFrameStyle (QFrame::NoFrame);
240   QPalette aPalette = aTableView->viewport()->palette();
241   QColor aWindowColor = aPalette.color (QPalette::Window);
242   aPalette.setBrush (QPalette::Base, aWindowColor);
243   aTableView->viewport()->setPalette (aPalette);
244
245   aTableView->horizontalHeader()->setVisible (false);
246   aTableView->verticalHeader()->setVisible (false);
247   aTableView->setGridStyle (Qt::NoPen);
248   aTableView->setModel (createModel (theFileNames));
249   aTableView->setItemDelegateForRow (0, new ShapeView_OpenFileItemDelegate (aTableView,
250                                                           aPalette.color (QPalette::Highlight)));
251   aTableView->viewport()->setAttribute (Qt::WA_Hover);
252   int aCellHeight = ICON_SIZE + aTableView->verticalHeader()->defaultSectionSize();
253   aTableView->setRowHeight (0, aCellHeight);
254   int aScrollHeight = aTableView->horizontalScrollBar()->sizeHint().height();
255   aTableView->setMinimumHeight (aCellHeight + aScrollHeight);
256   QItemSelectionModel* aSelectionModel = new QItemSelectionModel (aTableView->model());
257   connect (aSelectionModel, SIGNAL (selectionChanged (const QItemSelection&, const QItemSelection&)),
258            this, SLOT (onSampleSelectionChanged (const QItemSelection&, const QItemSelection&)));
259   aTableView->setSelectionModel (aSelectionModel);
260
261   return aTableView;
262 }
263
264 // =======================================================================
265 // function : createModel
266 // purpose :
267 // =======================================================================
268 QAbstractItemModel* ShapeView_OpenFileDialog::createModel (const QStringList& theFileNames)
269 {
270   ShapeView_OpenFileViewModel* aModel = new ShapeView_OpenFileViewModel(this);
271   aModel->Init (theFileNames);
272   return aModel;
273 }
274
275 // =======================================================================
276 // function : readSampleNames
277 // purpose :
278 // =======================================================================
279 QStringList ShapeView_OpenFileDialog::readSampleNames()
280 {
281   QStringList aNames;
282
283   QDir aDir (myDataDir);
284   aDir.setSorting(QDir::Name);
285
286   QFileInfoList aDirEntries = aDir.entryInfoList();
287   for (int aDirId = 0; aDirId < aDirEntries.size(); ++aDirId)
288   {
289     QFileInfo aFileInfo = aDirEntries.at (aDirId);
290     if (aFileInfo.isFile())
291       aNames.append (aFileInfo.absoluteFilePath());
292   }
293   return aNames;
294 }