LibreCAD
 All Classes Namespaces Files Functions Variables Enumerations Enumerator Friends Macros
layers.cpp
Go to the documentation of this file.
1 #include <cadmdichild.h>
2 #include <QtWidgets/QMessageBox>
3 #include "layers.h"
4 #include "ui_layers.h"
5 
6 Layers::Layers(CadMdiChild* mdiChild, QWidget *parent) :
7  QDockWidget(parent),
8  ui(new Ui::Layers),
9  _mdiChild(nullptr) {
10 
11  ui->setupUi(this);
12 
13  model = new LayerModel(this);
14  setMdiChild(mdiChild);
15 
16  ui->layerList->setModel(model);
17  ui->layerList->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);
18  ui->layerList->horizontalHeader()->setSectionResizeMode(LayerModel::NAME, QHeaderView::Stretch);
19 
21  connect(ui->layerList->selectionModel(), SIGNAL(selectionChanged(const QItemSelection &, const QItemSelection &)),
22  this, SLOT(onSelectionChanged(const QItemSelection &, const QItemSelection &)));
23 }
24 
26  delete ui;
27 }
28 
30  if(_mdiChild != nullptr) {
31  auto document = _mdiChild->document();
32  document->addLayerEvent().disconnect<Layers, &Layers::on_addLayerEvent>(this);
33  document->removeLayerEvent().disconnect<Layers, &Layers::on_removeLayerEvent>(this);
34  document->replaceLayerEvent().disconnect<Layers, &Layers::on_replaceLayerEvent>(this);
35  }
36 
37  _mdiChild = mdiChild;
38 
39  if(mdiChild != nullptr) {
40  auto document = mdiChild->document();
41  document->addLayerEvent().connect<Layers, &Layers::on_addLayerEvent>(this);
42  document->removeLayerEvent().connect<Layers, &Layers::on_removeLayerEvent>(this);
43  document->replaceLayerEvent().connect<Layers, &Layers::on_replaceLayerEvent>(this);
44  }
45 
47 }
48 
50  if(_mdiChild == nullptr) {
51  return;
52  }
53 
54  auto dialog = new AddLayerDialog(_mdiChild->document(), this);
55  dialog->show();
56 
57  connect(dialog, &AddLayerDialog::newLayer, this, &Layers::createLayer);
58 }
59 
61  QModelIndexList selection = ui->layerList->selectionModel()->selectedRows();
62 
63  deleteLayer(model->layerAt(selection.first().row()));
64 }
65 
66 void Layers::on_layerList_clicked(const QModelIndex& index) {
67  if(!index.isValid() || _mdiChild == nullptr) {
68  return;
69  }
70 
71  auto layer = model->layerAt(index.row());
72  if(index.column() != LayerModel::NAME) {
73  auto locked = layer->isFrozen();
74 
75  switch (index.column()) {
76  case LayerModel::LOCKED:
77  locked = !locked;
78  break;
79 
80  case LayerModel::EDIT:
81  auto dialog = new AddLayerDialog(layer, _mdiChild->document(), this);
82  dialog->show();
83 
84  connect(dialog, &AddLayerDialog::editLayer, this, &Layers::replaceLayer);
85  return;
86  }
87 
88  auto newLayer = std::make_shared<const lc::Layer>(
89  layer->name(),
90  layer->lineWidth(),
91  layer->color(),
92  layer->linePattern(),
93  locked
94  );
95 
96  replaceLayer(layer, newLayer);
97  }
98 }
99 
100 void Layers::changeLayerName(lc::Layer_CSPtr& layer, const std::string& name) {
101  if(name.empty()) {
102  return;
103  }
104 
105  auto newLayer = std::make_shared<const lc::Layer>(
106  name,
107  layer->lineWidth(),
108  layer->color(),
109  layer->linePattern(),
110  layer->isFrozen()
111  );
112 
113  replaceLayer(layer, newLayer);
114 }
115 
116 void Layers::createLayer(lc::Layer_CSPtr layer) {
117  if(_mdiChild != nullptr) {
118  auto operation = std::make_shared<lc::operation::AddLayer>(_mdiChild->document(), layer);
119  operation->execute();
120  }
121 }
122 
123 void Layers::deleteLayer(lc::Layer_CSPtr layer) {
124  if(_mdiChild != nullptr) {
125  try {
126  auto operation = std::make_shared<lc::operation::RemoveLayer>(_mdiChild->document(), layer);
127  operation->execute();
128  }
129  catch(const char* message) {
130  QMessageBox::critical(nullptr, "Error", message);
131  }
132  }
133 }
134 
135 void Layers::replaceLayer(lc::Layer_CSPtr oldLayer, lc::Layer_CSPtr newLayer) {
136  if(_mdiChild != nullptr) {
137  auto operation = std::make_shared<lc::operation::ReplaceLayer>(_mdiChild->document(), oldLayer, newLayer);
138  operation->execute();
139  }
140 }
141 
143  std::vector<lc::Layer_CSPtr> layersVector;
144 
145  if (_mdiChild != nullptr) {
146  auto layersMap = _mdiChild->document()->allLayers();
147 
148  for (auto layer : layersMap) {
149  layersVector.insert(layersVector.begin(), layer.second);
150  }
151  }
152 
153  model->setLayers(layersVector);
154 
155  if(_mdiChild != nullptr && _mdiChild->activeLayer() != nullptr) {
156  auto layer = _mdiChild->activeLayer();
157  ui->layerList->selectRow(model->indexOf(layer));
158 
159  emit layerChanged(layer);
160  }
161 }
162 
163 void Layers::on_addLayerEvent(const lc::AddLayerEvent& event) {
164  _mdiChild->setActiveLayer(event.layer());
165 
166  updateLayerList();
167 }
168 
169 void Layers::on_removeLayerEvent(const lc::RemoveLayerEvent& event) {
170  if(_mdiChild->activeLayer() == event.layer()) {
171  _mdiChild->setActiveLayer(_mdiChild->document()->layerByName("0"));
172  }
173 
174  updateLayerList();
175 }
176 
177 void Layers::on_replaceLayerEvent(const lc::ReplaceLayerEvent& event) {
178  if(_mdiChild->activeLayer() == event.oldLayer()) {
179  _mdiChild->setActiveLayer(event.newLayer());
180  }
181 
182  updateLayerList();
183 }
184 
185 void Layers::onSelectionChanged(const QItemSelection& selected, const QItemSelection& deselected) {
186  if(selected.isEmpty()) {
187  return;
188  }
189 
190  auto layer = model->layerAt(selected.first().top());
191  _mdiChild->setActiveLayer(layer);
192  emit layerChanged(layer);
193 }
lc::Layer_CSPtr layerAt(int row)
Get layer at specific row.
Definition: layermodel.cpp:71
void setActiveLayer(const lc::Layer_CSPtr &activeLayer)
void editLayer(lc::Layer_CSPtr oldLayer, lc::Layer_CSPtr newLayer)
CadMdiChild * _mdiChild
Definition: layers.h:59
void on_layerList_clicked(const QModelIndex &index)
Definition: layers.cpp:66
void onSelectionChanged(const QItemSelection &selected, const QItemSelection &deselected)
Definition: layers.cpp:185
void createLayer(lc::Layer_CSPtr layer)
Definition: layers.cpp:116
void nameChanged(lc::Layer_CSPtr &layer, const std::string &name)
Signal when layer name was changed by double clicking.
void on_addLayerEvent(const lc::AddLayerEvent &)
Definition: layers.cpp:163
void updateLayerList()
Definition: layers.cpp:142
unsigned int indexOf(lc::Layer_CSPtr layer)
Give the index of the given layer.
Definition: layermodel.cpp:80
Layers(CadMdiChild *mdiChild=nullptr, QWidget *parent=0)
Create widget.
Definition: layers.cpp:6
void changeLayerName(lc::Layer_CSPtr &layer, const std::string &name)
Definition: layers.cpp:100
void replaceLayer(lc::Layer_CSPtr oldLayer, lc::Layer_CSPtr newLayer)
Definition: layers.cpp:135
void on_replaceLayerEvent(const lc::ReplaceLayerEvent &)
Definition: layers.cpp:177
~Layers()
Definition: layers.cpp:25
Model to display a list of layers in a QTableView.
Definition: layermodel.h:11
void on_deleteButton_clicked()
Definition: layers.cpp:60
Widget which shows a list of layers.
Definition: layers.h:22
void setMdiChild(CadMdiChild *mdiChild=nullptr)
Set new document.
Definition: layers.cpp:29
void deleteLayer(lc::Layer_CSPtr layer)
Definition: layers.cpp:123
void on_removeLayerEvent(const lc::RemoveLayerEvent &)
Definition: layers.cpp:169
std::shared_ptr< lc::Document > document() const
void layerChanged(lc::Layer_CSPtr layer)
Create a dialog with all required fields to create a new layer.
LayerModel * model
Definition: layers.h:52
void newLayer(lc::Layer_CSPtr)
Ui::Layers * ui
Definition: layers.h:51
void on_newButton_clicked()
Definition: layers.cpp:49
void setLayers(std::vector< lc::Layer_CSPtr > layers)
Update the list of layers.
Definition: layermodel.cpp:11
lc::Layer_CSPtr activeLayer() const
Get the selected layer.