LibreCAD
 All Classes Namespaces Files Functions Variables Enumerations Enumerator Friends Macros
cadmdichild.cpp
Go to the documentation of this file.
1 #include "math.h"
2 
3 #include "cadmdichild.h"
4 
5 #include "cad/dochelpers/storagemanagerimpl.h"
6 #include "cad/dochelpers/documentimpl.h"
7 
8 #include <QMenu>
9 #include <cad/operations/layerops.h>
10 #include <file.h>
11 #include <QtWidgets/QFileDialog>
12 #include <QtWidgets/QMessageBox>
13 
14 
15 using namespace LCViewer;
16 
17 CadMdiChild::CadMdiChild(QWidget* parent) :
18  QWidget(parent),
19  _activeLayer(nullptr) {
20 
21  if (this->objectName().isEmpty()) {
22  this->setObjectName(QStringLiteral("CadMdiChild"));
23  }
24 
25  this->resize(1078, 736);
26 
27  QGridLayout* gridLayout = new QGridLayout(this);
28  gridLayout->setHorizontalSpacing(0);
29  gridLayout->setVerticalSpacing(0);
30  gridLayout->setObjectName(QStringLiteral("gridLayout"));
31  gridLayout->setContentsMargins(0, 0, 0, 0);
32  horizontalScrollBar = new QScrollBar(this);
33  horizontalScrollBar->setObjectName(QStringLiteral("horizontalScrollBar"));
34  horizontalScrollBar->setOrientation(Qt::Horizontal);
35 
36  gridLayout->addWidget(horizontalScrollBar, 1, 0, 1, 1);
37 
38  verticalScrollBar = new QScrollBar(this);
39  verticalScrollBar->setObjectName(QStringLiteral("verticalScrollBar"));
40  verticalScrollBar->setOrientation(Qt::Vertical);
41 
42  gridLayout->addWidget(verticalScrollBar, 0, 1, 1, 1);
43 
44  _viewer = new LCADViewer(this);
45  _viewer->setObjectName(QStringLiteral("viewer"));
46  _viewer->setGeometry(QRect(50, 30, 581, 401));
47  _viewer->setAutoFillBackground(true);
48  _viewer->setContextMenuPolicy(Qt::CustomContextMenu);
49  _viewer->setFocusPolicy(Qt::StrongFocus);
50  connect(_viewer, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(ctxMenu(const QPoint&)));
51 
52  gridLayout->addWidget(_viewer, 0, 0, 1, 1);
53 
54  horizontalScrollBar->setMinimum(-1000);
55  horizontalScrollBar->setMaximum(1000);
56  verticalScrollBar->setMinimum(-1000);
57  verticalScrollBar->setMaximum(1000);
58 
59  _metaInfoManager = std::make_shared<lc::ui::MetaInfoManager>();
60 
61  connect(horizontalScrollBar, SIGNAL(valueChanged(int)),
62  _viewer, SLOT(setHorizontalOffset(int)));
63  connect(verticalScrollBar, SIGNAL(valueChanged(int)),
64  _viewer, SLOT(setVerticalOffset(int)));
65 }
66 
68  if(_destroyCallback) {
70  }
71 }
72 
73 
75  // Entity manager add's/removes entities to layers
76  _storageManager = std::make_shared<lc::StorageManagerImpl>();
77 
78  // Create a new document with required objects, all objects that are required needs to be passed into the constructor
79  _document = std::make_shared<lc::DocumentImpl>(_storageManager);
80 
81  // Add the document to a LibreCAD Viewer system so we can visualize the document
82  _viewer->setDocument(_document);
83 
84  _gradientBackground = std::make_shared<GradientBackground>(lc::Color(0x07, 0x15, 0x11), lc::Color(0x06, 0x35, 0x06));
85  _viewer->documentCanvas()->background().connect<GradientBackground, &GradientBackground::draw>(_gradientBackground.get());
86  _grid = std::make_shared<Grid>(20, lc::Color(0x40, 0x48, 0x40), lc::Color(0x80, 0x90, 0x80));
87  _viewer->documentCanvas()->background().connect<Grid, &Grid::draw>(_grid.get());
88 
89  // Snap manager
90  _snapManager = std::make_shared<SnapManagerImpl>(_viewer->documentCanvas(), _grid, 25.);
91  _viewer->setSnapManager(_snapManager);
92 
93  // Add a cursor manager, Cursor will decide the ultimate position of clicked objects
94  _cursor = std::make_shared<LCViewer::Cursor>(40, _viewer->documentCanvas(), lc::Color(0xff, 0x00, 0x00), lc::Color(0x00, 0xff, 0x00));
95  _viewer->documentCanvas()->foreground().connect<LCViewer::Cursor, &LCViewer::Cursor::onDraw>(_cursor.get());
96  _snapManager->snapPointEvents().connect<LCViewer::Cursor, &LCViewer::Cursor::onSnapPointEvent>(_cursor.get());
97 
98  _tempEntities = std::make_shared<TempEntities>(_viewer->documentCanvas());
99  _viewer->documentCanvas()->foreground().connect<LCViewer::TempEntities, &LCViewer::TempEntities::onDraw>(_tempEntities.get());
100 
101  //Drag manager
102  _dragManager = std::make_shared<DragManager>(_viewer->documentCanvas(), _cursor, _tempEntities, 10);
103  _viewer->setDragManager(_dragManager);
104 
105  _dragPoints = std::make_shared<LCViewer::DragPoints>();
106  _dragManager->dragPointsEvent().connect<LCViewer::DragPoints, &LCViewer::DragPoints::setPoints>(_dragPoints.get());
107  _viewer->documentCanvas()->foreground().connect<LCViewer::DragPoints, &LCViewer::DragPoints::onDraw>(_dragPoints.get());
108 
109  // Undo manager takes care that we can undo/redo entities within a document
110  _undoManager = std::make_shared<lc::UndoManagerImpl>(10);
111  _document->commitProcessEvent().connect<lc::UndoManagerImpl, &lc::UndoManagerImpl::on_CommitProcessEvent>(_undoManager.get());
112 
113  _activeLayer = _document->layerByName("0");
114 }
115 
116 
118  auto file = QFileDialog::getOpenFileName();
119 
120  if(file == "") {
121  return false;
122  }
123 
124  auto fileInfo = QFileInfo(file);
125 
126  auto ext = fileInfo.suffix().toStdString();
127  auto availableLibraries = lc::File::getAvailableLibrariesForFormat(ext);
128 
129  if(availableLibraries.size() > 0) {
130  //TODO: if more than once, ask which one to choose
131  newDocument();
132  lc::File::open(_document, file.toStdString(), availableLibraries.begin()->first);
133  }
134  else {
135  QMessageBox::critical(nullptr, "Open error", "Unknown file extension ." + fileInfo.suffix());
136  return false;
137  }
138 
139  return true;
140 }
141 
142 
144  QString filterList;
145  QString selectedFilter;
146  lc::File::Type type;
147  auto availableTypes = lc::File::getAvailableFileTypes();
148 
149  if(availableTypes.size() == 0) {
150  QMessageBox::critical(nullptr, "Save error", "No library available for file saving.");
151  return;
152  }
153 
154  auto it = availableTypes.begin();
155  type = it->first;
156  filterList = it->second.c_str();
157  it++;
158 
159  while(it != availableTypes.end()) {
160  filterList += ";;";
161  filterList += it->second.c_str();
162 
163  it++;
164  }
165 
166  auto file = QFileDialog::getSaveFileName(nullptr, "Save file", "", filterList, &selectedFilter);
167 
168  auto selectedType = selectedFilter.toStdString();
169 
170  for(auto availableType : availableTypes) {
171  if(selectedType == availableType.second) {
172  type = availableType.first;
173  break;
174  }
175  }
176 
177  lc::File::save(_document, file.toStdString(), type);
178 }
179 
180 void CadMdiChild::ctxMenu(const QPoint& pos) {
181  QMenu* menu = new QMenu;
182  menu->addAction(tr("Test Item"), this, SLOT(test_slot()));
183  menu->exec(_viewer->mapToGlobal(pos));
184 }
185 
186 SnapManager_SPtr CadMdiChild::snapManager() const {
187  return _snapManager;
188 }
189 
190 std::shared_ptr<lc::Document> CadMdiChild::document() const {
191  return _document;
192 }
193 
194 lc::StorageManager_SPtr CadMdiChild::storageManager() const {
195  return _storageManager;
196 }
197 lc::UndoManager_SPtr CadMdiChild::undoManager() const {
198  return _undoManager;
199 }
200 
201 std::shared_ptr<LCViewer::Cursor> CadMdiChild::cursor() const {
202  return _cursor;
203 }
204 
205 unsigned int CadMdiChild::id() {
206  return _id;
207 }
208 void CadMdiChild::setId(unsigned int id) {
209  _id = id;
210 }
211 
212 void CadMdiChild::setDestroyCallback(LuaIntf::LuaRef destroyCallback) {
213  _destroyCallback = destroyCallback;
214 }
215 
216 void CadMdiChild::keyPressEvent(QKeyEvent *event) {
217  QWidget::keyPressEvent(event);
218  emit keyPressed(event);
219 }
220 
221 LCViewer::TempEntities_SPtr CadMdiChild::tempEntities() {
222  return _tempEntities;
223 }
224 
225 std::vector<lc::entity::CADEntity_CSPtr> CadMdiChild::selection() {
226  return viewer()->documentCanvas()->selectedEntities().asVector();
227 }
228 
229 lc::Layer_CSPtr CadMdiChild::activeLayer() const {
230  return _activeLayer;
231 }
232 
233 void CadMdiChild::setActiveLayer(const lc::Layer_CSPtr& activeLayer) {
235 }
236 
237 lc::ui::MetaInfoManager_SPtr CadMdiChild::metaInfoManager() const {
238  return _metaInfoManager;
239 }
240 
241 const SnapManagerImpl_SPtr &CadMdiChild::getSnapManager() const {
242  return _snapManager;
243 }
std::shared_ptr< LCViewer::Grid > _grid
Definition: cadmdichild.h:130
void setActiveLayer(const lc::Layer_CSPtr &activeLayer)
lc::ui::MetaInfoManager_SPtr metaInfoManager() const
Get the MetaInfo manager.
std::shared_ptr< LCViewer::GradientBackground > _gradientBackground
Definition: cadmdichild.h:131
lc::StorageManager_SPtr storageManager() const
void saveFile()
LCViewer::TempEntities_SPtr _tempEntities
Definition: cadmdichild.h:138
std::shared_ptr< lc::Document > _document
Definition: cadmdichild.h:127
void setDocument(std::shared_ptr< lc::Document > document)
Definition: lcadviewer.cpp:30
std::shared_ptr< LCViewer::Cursor > cursor() const
const LCViewer::SnapManagerImpl_SPtr & getSnapManager() const
LCViewer::LCADViewer * viewer() const
Definition: cadmdichild.h:73
void keyPressEvent(QKeyEvent *event)
LCViewer::SnapManager_SPtr snapManager() const
QScrollBar * verticalScrollBar
Definition: cadmdichild.h:144
void setId(unsigned int id)
Set window ID.
QScrollBar * horizontalScrollBar
Definition: cadmdichild.h:143
bool openFile()
Load existing file.
lc::ui::MetaInfoManager_SPtr _metaInfoManager
Definition: cadmdichild.h:141
lc::UndoManager_SPtr undoManager() const
void setDragManager(DragManager_SPtr dragManager)
Definition: lcadviewer.cpp:48
LCViewer::DragPoints_SPtr _dragPoints
Definition: cadmdichild.h:136
LCViewer::TempEntities_SPtr tempEntities()
Get container of temporary entities.
LCViewer::SnapManagerImpl_SPtr _snapManager
Definition: cadmdichild.h:133
lc::Layer_CSPtr _activeLayer
Definition: cadmdichild.h:140
void keyPressed(QKeyEvent *event)
unsigned int _id
Definition: cadmdichild.h:123
std::vector< lc::entity::CADEntity_CSPtr > selection()
Get selected entities.
unsigned int id()
Get window ID.
void setSnapManager(std::shared_ptr< SnapManager > snapmanager)
Definition: lcadviewer.cpp:44
LCViewer::DragManager_SPtr _dragManager
Definition: cadmdichild.h:135
LuaIntf::LuaRef _destroyCallback
Definition: cadmdichild.h:125
std::shared_ptr< LCViewer::Cursor > _cursor
Definition: cadmdichild.h:132
LCViewer::LCADViewer * _viewer
Definition: cadmdichild.h:146
void newDocument()
Create a new document.
Definition: cadmdichild.cpp:74
std::shared_ptr< DocumentCanvas > documentCanvas() const
Definition: lcadviewer.cpp:242
void ctxMenu(const QPoint &pos)
std::shared_ptr< lc::Document > document() const
CadMdiChild(QWidget *parent=0)
Definition: cadmdichild.cpp:17
void setDestroyCallback(LuaIntf::LuaRef callback)
Give function to call when window is destroyed.
lc::StorageManager_SPtr _storageManager
Definition: cadmdichild.h:137
lc::Layer_CSPtr activeLayer() const
Get the selected layer.
lc::UndoManagerImpl_SPtr _undoManager
Definition: cadmdichild.h:128