| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| | #include <QHeaderView> |
| | #include <QtWidgets> |
| |
|
| | #include "lc_layerdialog_ex.h" |
| | #include "lc_layertreeitem.h" |
| | #include "lc_layertreemodel_options.h" |
| | #include "lc_layertreeoptionsdialog.h" |
| | #include "lc_layertreeview.h" |
| | #include "lc_layertreewidget.h" |
| |
|
| | #include "lc_exportlayersdialogservice.h" |
| | #include "qc_applicationwindow.h" |
| | #include "qg_actionhandler.h" |
| | #include "rs_debug.h" |
| | #include "rs_dialogfactory.h" |
| | #include "rs_dialogfactoryinterface.h" |
| | #include "rs_graphic.h" |
| | #include "lc_flexlayout.h" |
| | #include "lc_layersexporter.h" |
| | #include "lc_layertreemodel.h" |
| | #include "rs_settings.h" |
| | #include "lc_widgets_common.h" |
| | #include "rs_graphicview.h" |
| | #include "rs_layer.h" |
| | |
| | |
| | |
| | LC_LayerTreeWidget::LC_LayerTreeWidget(QG_ActionHandler* ah, QWidget* parent, const char* name, Qt::WindowFlags f): |
| | LC_GraphicViewAwareWidget(parent, name, f) { |
| |
|
| | m_actionHandler = ah; |
| | m_layerList = nullptr; |
| |
|
| | |
| |
|
| | m_flatListMode = false; |
| |
|
| | QLayout *layFiltering = initFilterAndSettingsSection(); |
| |
|
| | initTreeModel(); |
| |
|
| | m_layerTreeView = initTreeView(); |
| |
|
| | QLayout *layButtons = initButtonsBar(); |
| | auto *lay = new QVBoxLayout(this); |
| | lay->setContentsMargins(2, 2, 2, 2); |
| | lay->addLayout(layFiltering); |
| | lay->addLayout(layButtons); |
| | QSizePolicy policy = m_layerTreeView->sizePolicy(); |
| | policy.setVerticalStretch(1); |
| | m_layerTreeView->setSizePolicy(policy); |
| | lay->addWidget(m_layerTreeView); |
| | this->setLayout(lay); |
| |
|
| | updateWidgetSettings(); |
| | } |
| |
|
| | void LC_LayerTreeWidget::initTreeModel(){ |
| | auto *options = new LC_LayerTreeModelOptions(); |
| | options->load(); |
| | m_layerTreeModel = new LC_LayerTreeModel(this, options); |
| | m_layerTreeModel->setFlatMode(m_flatListMode); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | LC_LayerTreeView *LC_LayerTreeWidget::initTreeView(){ |
| |
|
| | auto *treeView = new LC_LayerTreeView(this); |
| | treeView->setup(m_layerTreeModel); |
| |
|
| | QHeaderView *pTreeHeader{treeView->header()}; |
| | pTreeHeader->setMinimumSectionSize(LC_LayerTreeModel::ICONWIDTH + 4); |
| | pTreeHeader->setSectionResizeMode(QHeaderView::ResizeMode::ResizeToContents); |
| | pTreeHeader->setStretchLastSection(true); |
| | pTreeHeader->hide(); |
| |
|
| | treeView->setColumnWidth(LC_LayerTreeModel::VISIBLE, LC_LayerTreeModel::ICONWIDTH); |
| | treeView->setColumnWidth(LC_LayerTreeModel::VISIBLE, LC_LayerTreeModel::ICONWIDTH); |
| | treeView->setColumnWidth(LC_LayerTreeModel::LOCKED, LC_LayerTreeModel::ICONWIDTH); |
| | treeView->setColumnWidth(LC_LayerTreeModel::PRINT, LC_LayerTreeModel::ICONWIDTH); |
| | treeView->setColumnWidth(LC_LayerTreeModel::CONSTRUCTION, LC_LayerTreeModel::ICONWIDTH); |
| | treeView->setColumnWidth(LC_LayerTreeModel::COLOR_SAMPLE, LC_LayerTreeModel::ICONWIDTH); |
| |
|
| | treeView->setUniformRowHeights(true); |
| | treeView->setAlternatingRowColors(false); |
| | treeView->setSelectionMode(QAbstractItemView::NoSelection); |
| | treeView->setEditTriggers(QAbstractItemView::NoEditTriggers); |
| | treeView->setFocusPolicy(Qt::NoFocus); |
| | treeView->setMinimumHeight(65); |
| |
|
| | treeView->setDragDropMode(QAbstractItemView::InternalMove); |
| | treeView->setDragEnabled(true); |
| | treeView->setSelectionMode(QAbstractItemView::SingleSelection); |
| | treeView->setAcceptDrops(true); |
| | treeView->setDropIndicatorShown(true); |
| | treeView->setExpandsOnDoubleClick(false); |
| |
|
| | treeView->setContextMenuPolicy(Qt::CustomContextMenu); |
| | #ifndef DONT_FORCE_WIDGETS_CSS |
| | treeView->setStyleSheet("QWidget {background-color: white;} QScrollBar{ background-color: none }"); |
| | #endif |
| |
|
| | connect(treeView, &QTreeView::customContextMenuRequested, this, &LC_LayerTreeWidget::onCustomContextMenu); |
| | connect(treeView, &QTreeView::clicked, this, &LC_LayerTreeWidget::slotTreeClicked); |
| | connect(treeView, &QTreeView::doubleClicked, this, &LC_LayerTreeWidget::slotTreeDoubleClicked); |
| |
|
| | return treeView; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | QLayout *LC_LayerTreeWidget::initFilterAndSettingsSection(){ |
| | auto *layFiltering = new QHBoxLayout; |
| |
|
| | |
| | m_matchLayerName = new QLineEdit(this); |
| | m_matchLayerName->setReadOnly(false); |
| | m_matchLayerName->setPlaceholderText(tr("Filter")); |
| | m_matchLayerName->setClearButtonEnabled(true); |
| | m_matchLayerName->setToolTip(tr("Looking for matching layer names")); |
| | connect(m_matchLayerName, &QLineEdit::textChanged, this, &LC_LayerTreeWidget::slotFilteringMaskChanged); |
| |
|
| | |
| | m_matchModeCheckBox = new QCheckBox(this); |
| | m_matchModeCheckBox->setText(tr("Highlight Mode")); |
| | m_matchModeCheckBox->setChecked(true); |
| | connect(m_matchModeCheckBox, &QCheckBox::clicked, this, &LC_LayerTreeWidget::slotFilteringMaskChanged); |
| |
|
| | layFiltering->addWidget(m_matchLayerName); |
| | layFiltering->addWidget(m_matchModeCheckBox); |
| |
|
| | |
| | auto* but = new QToolButton(this); |
| | but->setIcon(QIcon(":/icons/settings.lci")); |
| | but->setToolTip(tr("Settings")); |
| | connect(but, &QToolButton::clicked, this, &LC_LayerTreeWidget::invokeSettingsDialog); |
| | layFiltering->addWidget(but); |
| |
|
| | return layFiltering; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | QLayout *LC_LayerTreeWidget::initButtonsBar(){ |
| | auto *layButtons = new LC_FlexLayout(0,5,5); |
| | QToolButton *but; |
| | |
| | but = new QToolButton(this); |
| | |
| | but->setIcon(QIcon(":/icons/visible_all.lci")); |
| | but->setToolTip(tr("Show all layers")); |
| | connect(but, &QToolButton::clicked, this, &LC_LayerTreeWidget::showAllLayers); |
| | layButtons->addWidget(but); |
| |
|
| | |
| | but = new QToolButton(this); |
| | but->setIcon(QIcon(":/icons/not_visible_all.lci")); |
| | but->setToolTip(tr("Hide all layers")); |
| | connect(but, &QToolButton::clicked, this, &LC_LayerTreeWidget::hideAllLayers); |
| | layButtons->addWidget(but); |
| |
|
| | |
| | but = new QToolButton(this); |
| | but->setIcon(QIcon(":/icons/dim_vertical.lci")); |
| | but->setToolTip(tr("Show Secondary Layers")); |
| | but->setCheckable(true); |
| | but->setChecked(true); |
| | connect(but, &QToolButton::clicked, this, &LC_LayerTreeWidget::toggleSecondaryLayersVisibility); |
| | layButtons->addWidget(but); |
| | m_btnShowSecondaryLayers = but; |
| |
|
| | |
| | but = new QToolButton(this); |
| | but->setIcon(QIcon(":/icons/select_all.lci")); |
| | but->setToolTip(tr("Show Active Layer Only")); |
| | connect(but, &QToolButton::clicked, this, &LC_LayerTreeWidget::showActiveLayerOnly); |
| | layButtons->addWidget(but); |
| |
|
| | |
| | but = new QToolButton(this); |
| | but->setIcon(QIcon(":/icons/order.lci")); |
| |
|
| | but->setToolTip(tr("Expand All")); |
| | connect(but, &QToolButton::clicked, this, &LC_LayerTreeWidget::expandAllLayers); |
| | layButtons->addWidget(but); |
| | m_btnExpandAll = but; |
| |
|
| | |
| | but = new QToolButton(this); |
| | but->setIcon(QIcon(":/icons/upmost.lci")); |
| | but->setToolTip(tr("Collapse All")); |
| | connect(but, &QToolButton::clicked, this, &LC_LayerTreeWidget::collapseAllLayers); |
| | layButtons->addWidget(but); |
| | m_btnCollapseAll = but; |
| |
|
| | |
| | but = new QToolButton(this); |
| | but->setIcon(QIcon(":/icons/dim_aligned.lci")); |
| | but->setToolTip(tr("Collapse Secondary")); |
| | connect(but, &QToolButton::clicked, this, &LC_LayerTreeWidget::collapseSecondaryLayers); |
| | layButtons->addWidget(but); |
| | m_btnCollapseSecondary = but; |
| |
|
| | |
| | but = new QToolButton(this); |
| | but->setIcon(QIcon(":/icons/unlocked.lci")); |
| | but->setToolTip(tr("Unlock all layers")); |
| | connect(but, &QToolButton::clicked, this, &LC_LayerTreeWidget::unlockAllLayers); |
| | layButtons->addWidget(but); |
| |
|
| | |
| | but = new QToolButton(this); |
| | but->setIcon(QIcon(":/icons/locked.lci")); |
| | but->setToolTip(tr("Lock all layers")); |
| | connect(but, &QToolButton::clicked, this, &LC_LayerTreeWidget::lockAllLayers); |
| | layButtons->addWidget(but); |
| |
|
| | |
| | but = new QToolButton(this); |
| | but->setIcon(QIcon(":/icons/add.lci")); |
| | but->setToolTip(tr("Add a layer")); |
| | connect(but, &QToolButton::clicked, this, &LC_LayerTreeWidget::addLayer); |
| | layButtons->addWidget(but); |
| |
|
| | |
| | but = new QToolButton(this); |
| | but->setIcon(QIcon(":/icons/dim_horizontal.lci")); |
| | but->setToolTip(tr("Add dimensions Layer")); |
| | connect(but, &QToolButton::clicked, this, &LC_LayerTreeWidget::addDimensionalLayerForActiveLayer); |
| |
|
| | m_btnAddDimensional = but; |
| | layButtons->addWidget(but); |
| |
|
| | |
| | but = new QToolButton(this); |
| | but->setIcon(QIcon(":/icons/remove.lci")); |
| | but->setToolTip(tr("Remove layer")); |
| | connect(but, &QToolButton::clicked, this, &LC_LayerTreeWidget::removeActiveLayers); |
| | layButtons->addWidget(but); |
| |
|
| | |
| | but = new QToolButton(this); |
| | but->setIcon(QIcon(":/icons/rename_active_block.lci")); |
| | but->setToolTip(tr("Modify layer attributes / rename")); |
| | connect(but, &QToolButton::clicked, this, &LC_LayerTreeWidget::editActiveLayer); |
| | layButtons->addWidget(but); |
| |
|
| | |
| | but = new QToolButton(this); |
| | but->setIcon(QIcon(":/icons/down.lci")); |
| | but->setToolTip(tr("Flat List Mode)")); |
| | but->setCheckable(true); |
| | connect(but, &QToolButton::clicked, this, &LC_LayerTreeWidget::toggleFlatView); |
| |
|
| | layButtons->addWidget(but); |
| | m_btnListMode = but; |
| | updateToolBarButtons(); |
| | return layButtons; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | void LC_LayerTreeWidget::setLayerList(RS_LayerList *ll){ |
| | if (m_layerList != nullptr) { |
| | m_layerList->removeListener(this); |
| | } |
| | m_layerList = ll; |
| |
|
| | if (ll != nullptr){ |
| | m_layerList->addListener(this); |
| | } |
| |
|
| | update(); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | void LC_LayerTreeWidget::update(){ |
| |
|
| | RS_DEBUG->print("QG_LayerWidget::update() begin"); |
| |
|
| | if (m_layerTreeView == nullptr){ |
| | RS_DEBUG->print(RS_Debug::D_ERROR, "QG_LayerWidget::update: nullptr layerView"); |
| | return; |
| | } |
| |
|
| | if (m_layerList == nullptr){ |
| | RS_DEBUG->print(RS_Debug::D_NOTICE, "QG_LayerWidget::update: nullptr layerList"); |
| | m_layerTreeModel->setLayerList(nullptr); |
| | return; |
| | } |
| |
|
| | if (m_withinSelfActivation){ |
| | |
| | |
| | m_layerTreeModel->proceedActiveLayerChanged(m_layerList); |
| | } else { |
| | |
| | int yPos = m_layerTreeView->verticalScrollBar()->value(); |
| | m_layerTreeView->verticalScrollBar()->setValue(yPos); |
| |
|
| | QStringList treeExpansionState = m_layerTreeView->saveTreeExpansionState(); |
| |
|
| | |
| | m_layerTreeModel->setLayerList(m_layerList); |
| |
|
| | if (!treeExpansionState.isEmpty()){ |
| | m_layerTreeView->restoreTreeExpansionState(treeExpansionState); |
| | } |
| |
|
| | m_layerTreeView->viewport()->update(); |
| | } |
| |
|
| | RS_DEBUG->print("QG_LayerWidget::update(): OK"); |
| | } |
| |
|
| | |
| | |
| | |
| | void LC_LayerTreeWidget::activateLayer(RS_Layer *layer){ |
| | RS_DEBUG->print("QG_LayerWidget::activateLayer() begin"); |
| |
|
| | if (!layer || !m_layerList){ |
| | RS_DEBUG->print(RS_Debug::D_ERROR, "QG_LayerWidget::activateLayer: nullptr layer or layerList"); |
| | return; |
| | } |
| |
|
| | m_layerList->activate(layer, false); |
| | update(); |
| | m_layerTreeView->viewport()->update(); |
| |
|
| | |
| | QC_ApplicationWindow::getAppWindow()->slotUpdateActiveLayer(); |
| |
|
| | RS_DEBUG->print("QG_LayerWidget::activateLayer() end"); |
| | } |
| |
|
| | |
| |
|
| | void LC_LayerTreeWidget::collapseAllLayers(){ |
| | m_layerTreeView->collapseAll(); |
| | } |
| |
|
| | void LC_LayerTreeWidget::expandAllLayers(){ |
| | m_layerTreeView->expandAll(); |
| | } |
| |
|
| | void LC_LayerTreeWidget::expandItems(int depth){ |
| | if (depth == -1){ |
| | m_layerTreeView->expandAll(); |
| | } else { |
| | m_layerTreeView->expandToDepth(depth); |
| | } |
| | } |
| | |
| | |
| | |
| | void LC_LayerTreeWidget::collapseSecondaryLayers(){ |
| | m_layerTreeView->setUpdatesEnabled(false); |
| | foreach (QModelIndex index, m_layerTreeModel->getPersistentIndexList()) { |
| | if (m_layerTreeView->isExpanded(index)){ |
| | LC_LayerTreeItem *childItem = m_layerTreeModel->getItemForIndex(index); |
| | int type = childItem->getLayerType(); |
| | if (type == LC_LayerTreeItem::NORMAL){ |
| | m_layerTreeView->collapse(index); |
| | } |
| | } |
| | } |
| | m_layerTreeView->setUpdatesEnabled(true); |
| | m_layerTreeView->viewport()->update(); |
| | |
| | |
| | |
| | } |
| |
|
| | |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | void LC_LayerTreeWidget::slotTreeDoubleClicked(const QModelIndex &index ){ |
| | if (index.isValid()){ |
| | LC_LayerTreeItem *layerItem = m_layerTreeModel->getItemForIndex(index); |
| | if (layerItem->isVirtual()){ |
| | |
| | |
| |
|
| | |
| | m_layerTreeView->setUpdatesEnabled(false); |
| | m_layerTreeView->expandChildren(index); |
| | m_layerTreeView->setUpdatesEnabled(true); |
| | } else { |
| | |
| | editSelectedLayer(); |
| | } |
| | } |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | void LC_LayerTreeWidget::slotTreeClicked(const QModelIndex &layerIdx ){ |
| |
|
| | if (!layerIdx.isValid() || m_layerList == nullptr){ |
| | return; |
| | } |
| |
|
| | auto *layerItem = static_cast<LC_LayerTreeItem *>(layerIdx.internalPointer()); |
| |
|
| | |
| | int column = m_layerTreeModel->translateColumn(layerIdx.column()); |
| |
|
| | QList<RS_Layer *> layers; |
| | QList<RS_Layer *> layersToDisable = layers; |
| | QList<RS_Layer *> layersToEnable = layers; |
| | LC_LayerTreeItemAcceptor ACCEPT_ALL = LC_LayerTreeItemAcceptor(); |
| |
|
| | if (layerItem->isVirtual()){ |
| | switch (column) { |
| | case LC_LayerTreeModel::VISIBLE: { |
| | |
| | |
| | |
| |
|
| | bool isVisible = layerItem->isVisible(); |
| | if (isVisible){ |
| | |
| | layerItem->collectLayers(layersToDisable, &ACCEPT_ALL); |
| | } else { |
| | |
| | QG_LayerTreeItemAcceptorSecondary ACCEPT_SECONDARY = QG_LayerTreeItemAcceptorSecondary(false); |
| | layerItem->collectLayers(layersToEnable, &ACCEPT_SECONDARY); |
| | } |
| | manageLayersVisibilityFlag(layersToEnable, layersToDisable, false); |
| | break; |
| | } |
| | case LC_LayerTreeModel::LOCKED:{ |
| | if (layerItem->isLocked()){ |
| | layerItem->collectLayers(layersToDisable, &ACCEPT_ALL); |
| | } |
| | else{ |
| | layerItem->collectLayers(layersToEnable, &ACCEPT_ALL); |
| | } |
| | manageLayersLockFlag(layersToEnable, layersToDisable, false); |
| | break; |
| | } |
| | case LC_LayerTreeModel::PRINT:{ |
| | if (layerItem->isPrint()){ |
| | layerItem->collectLayers(layersToDisable, &ACCEPT_ALL); |
| | } |
| | else{ |
| | layerItem->collectLayers(layersToEnable, &ACCEPT_ALL); |
| | } |
| | manageLayersPrintFlag(layersToEnable, layersToDisable, false); |
| | break; |
| | } |
| | case LC_LayerTreeModel::CONSTRUCTION: { |
| | if (layerItem->isConstruction()){ |
| | layerItem->collectLayers(layersToDisable, &ACCEPT_ALL); |
| | } |
| | else{ |
| | layerItem->collectLayers(layersToEnable, &ACCEPT_ALL); |
| | } |
| | manageLayersConstructionFlag(layersToEnable, layersToDisable, false); |
| | break; |
| | } |
| | case LC_LayerTreeModel::NAME: { |
| | |
| | m_layerTreeView->expand(layerIdx); |
| | break; |
| | } |
| | default: |
| | break; |
| | } |
| | } else { |
| | RS_Layer *lay = layerItem->getLayer(); |
| | if (lay == nullptr) |
| | return; |
| |
|
| | if (column == LC_LayerTreeModel::NAME){ |
| | |
| |
|
| | |
| | |
| | |
| | |
| |
|
| | m_withinSelfActivation = true; |
| | m_layerList->activate(lay, true); |
| | m_withinSelfActivation = false; |
| |
|
| | return; |
| | } |
| |
|
| | |
| | int layerType = layerItem->getLayerType(); |
| | bool normalLayerWithChildren = layerType == LC_LayerTreeItem::NORMAL && layerItem->childCount() > 0; |
| |
|
| | switch (column) { |
| | case LC_LayerTreeModel::VISIBLE: { |
| | if (normalLayerWithChildren){ |
| | bool isVisible = layerItem->isVisible(); |
| | if (isVisible){ |
| | |
| | layerItem->collectLayers(layersToDisable, &ACCEPT_ALL); |
| | layersToDisable << lay; |
| | manageLayersVisibilityFlag(layersToEnable, layersToDisable, false); |
| | } else { |
| | |
| | m_actionHandler->setCurrentAction(RS2::ActionLayersToggleView, lay); |
| | } |
| | } else { |
| | m_actionHandler->setCurrentAction(RS2::ActionLayersToggleView, lay); |
| | } |
| | break; |
| | } |
| | case LC_LayerTreeModel::LOCKED: |
| | if (normalLayerWithChildren){ |
| | if (layerItem->isLocked()){ |
| | layerItem->collectLayers(layersToDisable, &ACCEPT_ALL, true); |
| | } |
| | else{ |
| | layerItem->collectLayers(layersToEnable, &ACCEPT_ALL, true); |
| | } |
| | manageLayersLockFlag(layersToEnable, layersToDisable, false); |
| | } |
| | else{ |
| | m_actionHandler->setCurrentAction(RS2::ActionLayersToggleLock, lay); |
| | } |
| | break; |
| | case LC_LayerTreeModel::PRINT: |
| | if (normalLayerWithChildren){ |
| | if (layerItem->isPrint()){ |
| | layerItem->collectLayers(layersToDisable, &ACCEPT_ALL, true); |
| | } |
| | else{ |
| | layerItem->collectLayers(layersToEnable, &ACCEPT_ALL, true); |
| | } |
| | manageLayersPrintFlag(layersToEnable, layersToDisable, false); |
| | } |
| | else{ |
| | m_actionHandler->setCurrentAction(RS2::ActionLayersTogglePrint, lay); |
| | } |
| | break; |
| | case LC_LayerTreeModel::CONSTRUCTION: |
| | if (normalLayerWithChildren){ |
| | if (layerItem->isConstruction()){ |
| | layerItem->collectLayers(layersToDisable, &ACCEPT_ALL, true); |
| | } |
| | else{ |
| | layerItem->collectLayers(layersToEnable, &ACCEPT_ALL, true); |
| | } |
| | manageLayersConstructionFlag(layersToEnable, layersToDisable, false); |
| | } |
| | else { |
| | m_actionHandler->setCurrentAction(RS2::ActionLayersToggleConstruction, lay); |
| | } |
| | break; |
| | default: |
| | break; |
| | } |
| | } |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | void LC_LayerTreeWidget::slotFilteringMaskChanged(){ |
| | QString mask = m_matchLayerName->text(); |
| | bool highlightMode = m_matchModeCheckBox->isChecked(); |
| | m_layerTreeModel->setFilteringRegexp(mask, highlightMode); |
| | update(); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | void LC_LayerTreeWidget::onCustomContextMenu(const QPoint &point){ |
| |
|
| | if (m_actionHandler){ |
| | auto *contextMenu = new QMenu(this); |
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| | |
| |
|
| | using ActionMemberFunc = void (LC_LayerTreeWidget::*)(); |
| | const auto addActionFunc = [this, &contextMenu](const QString& iconName, const QString& name, ActionMemberFunc func) { |
| | contextMenu->addAction(QIcon(":/icons/" + iconName + ".lci"), name, this, func); |
| | }; |
| |
|
| | QModelIndex index = m_layerTreeView->indexAt(point); |
| |
|
| | if (index.isValid()){ |
| | LC_LayerTreeItem *layerItem = m_layerTreeModel->getItemForIndex(index); |
| | int layerType = layerItem->getLayerType(); |
| | bool isVirtual = layerItem->isVirtual(); |
| | QString title = "Layer: " + layerItem->getName(); |
| | contextMenu->setTitle(title); |
| |
|
| | if (isVirtual){ |
| | addActionFunc("add", tr("&Add Child Layer"), &LC_LayerTreeWidget::addChildLayerForSelectedItem); |
| | addActionFunc("rename_active_block", tr("&Rename"), &LC_LayerTreeWidget::renameVirtualLayer); |
| | addActionFunc("remove", tr("&Remove Layers (Sub-Tree)"), &LC_LayerTreeWidget::removeLayersForSelectedItem); |
| | contextMenu->addSeparator(); |
| | addActionFunc("copy", tr("&Copy Structure (Sub-Tree)"), &LC_LayerTreeWidget::createLayerCopy); |
| | addActionFunc("paste", tr("&Duplicate Content (Sub-Tree)"), &LC_LayerTreeWidget::createLayerDuplicate); |
| | |
| | addActionFunc("deselect_layer", tr("&Select Entities (Sub-Tree)"), &LC_LayerTreeWidget::selectLayersEntities); |
| | } else { |
| |
|
| | bool NON_ZERO_LAYER = !layerItem->isZero(); |
| |
|
| | addActionFunc("rename_active_block", tr("&Edit Layer &Attributes"), &LC_LayerTreeWidget::editSelectedLayer); |
| | if (NON_ZERO_LAYER){ |
| | addActionFunc("remove", tr("&Remove Layer"), &LC_LayerTreeWidget::removeLayersForSelectedItem); |
| | } |
| | contextMenu->addSeparator(); |
| |
|
| | if (layerType == LC_LayerTreeItem::NORMAL){ |
| | if (NON_ZERO_LAYER){ |
| | bool hasItems = false; |
| |
|
| | if (!layerItem->hasChildOfType(LC_LayerTreeItem::DIMENSIONAL)){ |
| | addActionFunc("dim_horizontal", tr("&Add Dimensions Sub-Layer"), &LC_LayerTreeWidget::addDimensionalLayerForSelectedItem); |
| | hasItems = true; |
| | } |
| | if (!layerItem->hasChildOfType(LC_LayerTreeItem::INFORMATIONAL)){ |
| | addActionFunc("mtext", tr("&Add Info Sub-Layer"), &LC_LayerTreeWidget::addInformationalLayerForSelectedItem); |
| | hasItems = true; |
| | } |
| | if (!layerItem->hasChildOfType(LC_LayerTreeItem::ALTERNATE_POSITION)){ |
| | addActionFunc("rotate", tr("&Add Alternative View Sub-Layer"), |
| | &LC_LayerTreeWidget::addAddAlternativePositionLayerForSelectedItem); |
| | hasItems = true; |
| | } |
| | if (!m_flatListMode){ |
| | if (layerItem->childCount() > 0){ |
| | addActionFunc("remove", tr("&Remove Sub-layers"), &LC_LayerTreeWidget::removeChildLayersForSelected); |
| | hasItems = true; |
| | } |
| | } |
| | if (hasItems){ |
| | contextMenu->addSeparator(); |
| | } |
| | if (layerItem->childCount() == 0){ |
| | contextMenu->addAction(tr("Convert to Dimensional Layer"), this, &LC_LayerTreeWidget::convertLayerTypeToDimensional); |
| | contextMenu->addAction(tr("Convert to Info Layer"), this, &LC_LayerTreeWidget::convertLayerTypeToInformational); |
| | contextMenu->addAction(tr("Convert to Alternative Position Layer"), this, &LC_LayerTreeWidget::convertLayerTypeToAlternativePosition); |
| | contextMenu->addSeparator(); |
| | } |
| |
|
| | } |
| | } else { |
| | contextMenu->addAction(tr("Convert to Normal Layer"), this, &LC_LayerTreeWidget::convertLayerTypeToNormal); |
| | if (layerType != LC_LayerTreeItem::DIMENSIONAL){ |
| | contextMenu->addAction(tr("Convert to Dimensional Layer"), this, &LC_LayerTreeWidget::convertLayerTypeToDimensional); |
| | } |
| | if (layerType != LC_LayerTreeItem::INFORMATIONAL){ |
| | contextMenu->addAction(tr("Convert to Info Layer"), this, &LC_LayerTreeWidget::convertLayerTypeToInformational); |
| | } |
| | if (layerType != LC_LayerTreeItem::ALTERNATE_POSITION){ |
| | contextMenu->addAction(tr("Convert to Alternative Position Layer"), this, &LC_LayerTreeWidget::convertLayerTypeToAlternativePosition); |
| | } |
| | contextMenu->addSeparator(); |
| | } |
| |
|
| | if (layerItem->isVisible() && !layerItem->isLocked()){ |
| | addActionFunc("deselect_layer",tr("&Select Layer's Entities"), &LC_LayerTreeWidget::selectLayersEntities); |
| | } |
| | contextMenu->addSeparator(); |
| | addActionFunc("copy", tr("&Create Layer Copy"), &LC_LayerTreeWidget::createLayerCopy); |
| | addActionFunc("paste", tr("&Duplicate Layer With Content"), &LC_LayerTreeWidget::createLayerDuplicate); |
| |
|
| | contextMenu->addSeparator(); |
| | if (!layerItem->isLocked()){ |
| | addActionFunc("move_copy", tr("Move Selection to Layer"), &LC_LayerTreeWidget::moveSelectionToLayer); |
| | addActionFunc("duplicate", tr("Duplicate Selection to Layer"), &LC_LayerTreeWidget::duplicateSelectionToLayer); |
| | contextMenu->addSeparator(); |
| | } |
| | } |
| | contextMenu->addSeparator(); |
| | } else { |
| | |
| | addActionFunc("add", tr("&Add Layer"), &LC_LayerTreeWidget::addLayer); |
| | } |
| | addActionFunc("visible", tr("&Freeze Others Layers"), &LC_LayerTreeWidget::hideOtherThanSelectedLayers); |
| | addActionFunc("visible_all", tr("&Defreeze All Layers"), &LC_LayerTreeWidget::showAllLayers); |
| | addActionFunc("not_visible_all",tr("&Freeze All Layers"), &LC_LayerTreeWidget::hideAllLayers); |
| | addActionFunc("unlocked", tr("&Unlock All Layers"), &LC_LayerTreeWidget::unlockAllLayers); |
| | addActionFunc("locked", tr("&Lock All Layers"), &LC_LayerTreeWidget::lockAllLayers); |
| | addActionFunc("print", tr("Enable &Printing All Layers"), &LC_LayerTreeWidget::printAllLayers); |
| | addActionFunc("noprint", tr("&Disable Printing All Layers"), &LC_LayerTreeWidget::noPrintAllLayers); |
| | contextMenu->addSeparator(); |
| | if (index.isValid()) { |
| | addActionFunc("layer_export_single",tr("&Export Single Layer"), &LC_LayerTreeWidget::exportSelectedLayer); |
| | if (!m_flatListMode){ |
| | LC_LayerTreeItem *layerItem = m_layerTreeModel->getItemForIndex(index); |
| | if (layerItem->childCount() > 0){ |
| | addActionFunc("layer_export_selected", tr("&Export Layer Sub-Tree"), &LC_LayerTreeWidget::exportLayerSubTree); |
| | } |
| | } |
| | } |
| | addActionFunc("layer_export_visible", tr("Export &Visible Layer(s)"), &LC_LayerTreeWidget::exportVisibleLayers); |
| | contextMenu->addSeparator(); |
| | addActionFunc("close_all", tr("&Find And Remove Empty Layers"), &LC_LayerTreeWidget::removeEmptyLayers); |
| | contextMenu->exec(QCursor::pos()); |
| | delete contextMenu; |
| | } |
| | |
| | } |
| |
|
| | |
| |
|
| | |
| | |
| | |
| | void LC_LayerTreeWidget::showAllLayers(){ |
| | m_btnShowSecondaryLayers->setChecked(true); |
| | LC_LayerTreeItemAcceptor ACCEPT_ALL; |
| | QList<RS_Layer *> layersToShow = m_layerTreeModel->collectLayers(&ACCEPT_ALL); |
| | QList<RS_Layer *> layersToHide; |
| | manageLayersVisibilityFlag(layersToShow, layersToHide, false); |
| | } |
| |
|
| | |
| | |
| | |
| | void LC_LayerTreeWidget::showActiveLayerOnly(){ |
| | if (nullptr != m_layerList){ |
| | RS_Layer *activeLayer = m_layerList->getActive(); |
| | if (activeLayer != nullptr){ |
| | QG_LayerTreeItemAcceptorSameLayerAs ACCEPT_ALL_EXCEPT(activeLayer, true); |
| | QList<RS_Layer *> layersToHide = m_layerTreeModel->collectLayers(&ACCEPT_ALL_EXCEPT); |
| | QList<RS_Layer *> layersToShow; |
| | layersToShow << activeLayer; |
| |
|
| | manageLayersVisibilityFlag(layersToShow, layersToHide, false); |
| | } |
| | } |
| | } |
| | |
| | |
| | |
| | void LC_LayerTreeWidget::hideAllLayers(){ |
| | m_btnShowSecondaryLayers->setChecked(false); |
| | LC_LayerTreeItemAcceptor ACCEPT_ALL; |
| | QList<RS_Layer *> layersToShow; |
| | QList<RS_Layer *> layersToHide = m_layerTreeModel->collectLayers(&ACCEPT_ALL); |
| | manageLayersVisibilityFlag(layersToShow, layersToHide, false); |
| | } |
| |
|
| | |
| | |
| | |
| | void LC_LayerTreeWidget::hideOtherThanSelectedLayers(){ |
| | QModelIndex selectedItemIndex = getSelectedItemIndex(); |
| | if (selectedItemIndex.isValid()){ |
| | LC_LayerTreeItem *currentItem = m_layerTreeModel->getItemForIndex(selectedItemIndex); |
| | LC_LayerTreeItemAcceptor ACCEPT_ALL; |
| | QList<RS_Layer *> layersToHide = m_layerTreeModel->collectLayers(&ACCEPT_ALL); |
| |
|
| | QList<RS_Layer *> layersToShow; |
| | currentItem->collectLayers(layersToShow, &ACCEPT_ALL, true); |
| | int count = layersToShow.count(); |
| | for (int i = 0; i< count; i++){ |
| | RS_Layer* layer = layersToShow.at(i); |
| | layersToHide.removeAll(layer); |
| | } |
| | if (count > 0){ |
| | m_layerList->activate(layersToShow.at(0), false); |
| | } |
| | manageLayersVisibilityFlag(layersToShow, layersToHide, false); |
| | } |
| | } |
| | |
| | |
| | |
| | void LC_LayerTreeWidget::toggleSecondaryLayersVisibility(){ |
| | LC_LayerTreeItem *root = m_layerTreeModel->getRoot(); |
| | QList<LC_LayerTreeItem *> secondaryItems; |
| | QG_LayerTreeItemAcceptorSecondary acceptor; |
| | root->collectDescendantChildren(secondaryItems, &acceptor, false); |
| |
|
| | bool showSecondary = m_btnShowSecondaryLayers->isChecked(); |
| | int count = secondaryItems.count(); |
| |
|
| | if (count > 0){ |
| | QList<RS_Layer *> layersToEnable; |
| | QList<RS_Layer *> layersToDisable; |
| |
|
| | for (int i = 0; i < count; i++) { |
| | LC_LayerTreeItem *layerItem = secondaryItems.at(i); |
| |
|
| | RS_Layer *layer = layerItem->getLayer(); |
| | LC_LayerTreeItem *primaryLayerItem = layerItem->getPrimaryItem(); |
| |
|
| | if (primaryLayerItem != nullptr){ |
| | |
| | |
| | |
| | if (showSecondary && primaryLayerItem->isVisible()){ |
| | layersToEnable << layer; |
| | } else { |
| | layersToDisable << layer; |
| | } |
| | } else { |
| | if (showSecondary){ |
| | layersToEnable << layer; |
| | } else { |
| | layersToDisable << layer; |
| | } |
| | } |
| | } |
| | manageLayersVisibilityFlag(layersToEnable, layersToDisable, false); |
| | } |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | void LC_LayerTreeWidget::unlockAllLayers(){ |
| | LC_LayerTreeItemAcceptor ACCEPT_ALL; |
| | QList<RS_Layer *> layersToLock; |
| | QList<RS_Layer *> layersToUnlock = m_layerTreeModel->collectLayers(&ACCEPT_ALL); |
| | manageLayersLockFlag(layersToLock, layersToUnlock, false); |
| | } |
| | |
| | |
| | |
| | void LC_LayerTreeWidget::lockAllLayers(){ |
| | LC_LayerTreeItemAcceptor ACCEPT_ALL; |
| | QList<RS_Layer *> layersToLock = m_layerTreeModel->collectLayers(&ACCEPT_ALL); |
| | QList<RS_Layer *> layersToUnlock; |
| | manageLayersLockFlag(layersToLock, layersToUnlock, false); |
| | } |
| | |
| | |
| | |
| | void LC_LayerTreeWidget::printAllLayers(){ |
| | LC_LayerTreeItemAcceptor ACCEPT_ALL; |
| | QList<RS_Layer *> layersToPrint = m_layerTreeModel->collectLayers(&ACCEPT_ALL); |
| | QList<RS_Layer *> layersToNoPrint; |
| | manageLayersPrintFlag(layersToPrint, layersToNoPrint, false); |
| | } |
| |
|
| | |
| | |
| | |
| | void LC_LayerTreeWidget::noPrintAllLayers(){ |
| | LC_LayerTreeItemAcceptor ACCEPT_ALL; |
| | QList<RS_Layer *> layersToPrint; |
| | QList<RS_Layer *> layersToNoPrint= m_layerTreeModel->collectLayers(&ACCEPT_ALL); |
| | manageLayersPrintFlag(layersToPrint, layersToNoPrint, false); |
| | } |
| |
|
| | |
| | |
| | |
| | void LC_LayerTreeWidget::removeEmptyLayers(){ |
| |
|
| | |
| | QSet<RS_Layer*> foundLayers; |
| | for (auto en: *m_document) { |
| | RS_Layer *l = en->getLayer(true); |
| | if (l != nullptr){ |
| | foundLayers.insert(l); |
| | } |
| | } |
| |
|
| | |
| | QList<RS_Layer*> layersWithNoEntities; |
| | unsigned int layersCount = m_layerList->count(); |
| | for (unsigned int i = 0; i< layersCount; i++){ |
| | RS_Layer* l = m_layerList->at(i); |
| | if (foundLayers.contains(l)){ |
| | |
| | } |
| | else{ |
| | layersWithNoEntities << l; |
| | } |
| | } |
| |
|
| | int layersWithNoEntitiesCount = layersWithNoEntities.count(); |
| | if (layersWithNoEntitiesCount > 0){ |
| | bool emptyLayerIsFiltered = false; |
| |
|
| | |
| | |
| |
|
| | QList<LC_LayerTreeItem*> itemsToRemove; |
| | for (int i = 0; i < layersWithNoEntitiesCount; i++){ |
| | RS_Layer* l = layersWithNoEntities.at(i); |
| | LC_LayerTreeItem* item = m_layerTreeModel->getItemForLayer(l); |
| | if (item == nullptr){ |
| | if (m_layerTreeModel->isRegexpApplied()){ |
| | |
| | emptyLayerIsFiltered = true; |
| | } |
| | } |
| | else{ |
| | itemsToRemove<<item; |
| | } |
| | } |
| |
|
| | if (emptyLayerIsFiltered){ |
| | QString title(QMessageBox::tr("Remove empty layers")); |
| | QString text = QMessageBox::tr("Layer(s) without entities found, yet they are filtered and not visible.\n\nClear filtering mask and repeat."); |
| | QMessageBox msgBox(QMessageBox::Information, title, text, QMessageBox::Ok); |
| | msgBox.exec(); |
| | } |
| | else{ |
| | doRemoveLayerItems(itemsToRemove); |
| | } |
| | } |
| | else{ |
| | QString title(QMessageBox::tr("Remove empty layers")); |
| | QString text = QMessageBox::tr("No layers without entities found, nothing to remove."); |
| |
|
| | QMessageBox msgBox(QMessageBox::Information, title, text, QMessageBox::Ok); |
| | msgBox.exec(); |
| | } |
| | } |
| |
|
| | |
| | |
| | |
| | void LC_LayerTreeWidget::keyPressEvent(QKeyEvent *e){ |
| | switch (e->key()) { |
| | case Qt::Key_Escape: |
| | emit escape(); |
| | break; |
| | default: |
| | QWidget::keyPressEvent(e); |
| | break; |
| | } |
| | } |
| |
|
| | |
| |
|
| | void LC_LayerTreeWidget::layerActivated(RS_Layer *layer){ |
| | RS_DEBUG->print("LC_LayerTreeWidget::layerActivated()"); |
| | activateLayer(layer); |
| | } |
| |
|
| | void LC_LayerTreeWidget::layerAdded([[maybe_unused]] RS_Layer *layer){ |
| | RS_DEBUG->print("QG_LayerWidget::layerAdded() begin"); |
| | update(); |
| | } |
| |
|
| | void LC_LayerTreeWidget::layerEdited(RS_Layer *){ |
| | RS_DEBUG->print("LC_LayerTreeWidget::layerEdited()"); |
| | update(); |
| | m_layerTreeView->viewport()->update(); |
| | } |
| |
|
| | void LC_LayerTreeWidget::layerRemoved(RS_Layer *){ |
| | RS_DEBUG->print("LC_LayerTreeWidget::layerRemoved()"); |
| | update(); |
| | activateLayer(m_layerList->at(0)); |
| | } |
| |
|
| | void LC_LayerTreeWidget::layerToggled(RS_Layer *){ |
| | RS_DEBUG->print("LC_LayerTreeWidget::layerToggled()"); |
| | update(); |
| | } |
| |
|
| | void LC_LayerTreeWidget::layerToggledLock(RS_Layer *){ |
| | update(); |
| | } |
| |
|
| | void LC_LayerTreeWidget::layerToggledPrint(RS_Layer *){ |
| | update(); |
| | } |
| |
|
| | void LC_LayerTreeWidget::layerToggledConstruction(RS_Layer *){ |
| | update(); |
| | } |
| | |
| | |
| | |
| | |
| | |
| | void LC_LayerTreeWidget::onDragEnterEvent(const QModelIndex &dropIndex){ |
| | |
| | LC_LayerTreeItem *currentlyDraggingItem = m_layerTreeModel->getItemForIndex(dropIndex); |
| | |
| |
|
| | m_layerTreeModel->setCurrentlyDraggingItem(currentlyDraggingItem); |
| | } |
| | |
| | |
| | |
| | |
| | |
| | void LC_LayerTreeWidget::onDropEvent(const QModelIndex &dropIndex, DropIndicatorPosition position){ |
| | RS_DEBUG->print(RS_Debug::D_WARNING, "onDropEvent"); |
| | LC_LayerTreeItem *currentlyDraggingItem = m_layerTreeModel->getCurrentlyDraggingItem(); |
| | if (currentlyDraggingItem){ |
| | LC_LayerTreeItem *destinationItem = nullptr; |
| | if (dropIndex.isValid()){ |
| | destinationItem = m_layerTreeModel->getItemForIndex(dropIndex); |
| |
|
| | } else if (position == LC_LayerTreeWidget::OnViewport){ |
| | |
| | destinationItem = m_layerTreeModel->getRoot(); |
| | } |
| |
|
| | if (destinationItem != nullptr){ |
| | |
| | bool layersRenamed = m_layerTreeModel->performReStructure(currentlyDraggingItem, destinationItem); |
| | if (layersRenamed){ |
| | m_layerTreeView->expand(dropIndex); |
| | m_layerList->fireEdit(nullptr); |
| | } |
| | } |
| | m_layerTreeModel->setCurrentlyDraggingItem(nullptr); |
| | } |
| | } |
| |
|
| | |
| |
|
| | |
| |
|
| | |
| | |
| | |
| | void LC_LayerTreeWidget::addInformationalLayerForSelectedItem(){ |
| | doAddSecondaryLevelForSelectedItem(LC_LayerTreeItem::INFORMATIONAL); |
| | } |
| |
|
| | |
| | |
| | |
| | void LC_LayerTreeWidget::addAddAlternativePositionLayerForSelectedItem(){ |
| | doAddSecondaryLevelForSelectedItem(LC_LayerTreeItem::ALTERNATE_POSITION); |
| | } |
| |
|
| | |
| | |
| | |
| | void LC_LayerTreeWidget::addDimensionalLayerForSelectedItem(){ |
| | doAddSecondaryLevelForSelectedItem(LC_LayerTreeItem::DIMENSIONAL); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | void LC_LayerTreeWidget::doAddSecondaryLevelForSelectedItem(int layerType){ |
| | QModelIndex selectedItemIndex = getSelectedItemIndex(); |
| | if (selectedItemIndex.isValid()){ |
| | LC_LayerTreeItem *currentItem = m_layerTreeModel->getItemForIndex(selectedItemIndex); |
| | if (!currentItem->isVirtual()){ |
| | |
| | if (!currentItem->hasChildOfType(layerType)){ |
| | invokeLayerAddDialog(currentItem, layerType); |
| | } |
| | else{ |
| | QMessageBox::information(parentWidget(), |
| | QMessageBox::tr("Add Layer"), |
| | QMessageBox::tr("Such child layer already exist for \n[%1].\n" |
| | "Please specify a different name.") |
| | .arg(currentItem->getName()), |
| | QMessageBox::Ok); |
| | } |
| | } |
| | } |
| | } |
| |
|
| |
|
| | |
| | |
| | |
| | void LC_LayerTreeWidget::addChildLayerForSelectedItem(){ |
| | QModelIndex selectedItemIndex = getSelectedItemIndex(); |
| | if (selectedItemIndex.isValid()){ |
| | LC_LayerTreeItem *currentItem = m_layerTreeModel->getItemForIndex(selectedItemIndex); |
| | invokeLayerAddDialog(currentItem, LC_LayerTreeItem::NOT_DEFINED_LAYER_TYPE); |
| | } |
| | } |
| |
|
| | |
| | |
| | |
| | void LC_LayerTreeWidget::addLayer(){ |
| | invokeLayerAddDialog(nullptr, LC_LayerTreeItem::NOT_DEFINED_LAYER_TYPE); |
| | } |
| | |
| | |
| | |
| | |
| | void LC_LayerTreeWidget::addDimensionalLayerForActiveLayer(){ |
| | if (nullptr != m_layerList){ |
| | RS_Layer *activeLayer = m_layerList->getActive(); |
| | if (activeLayer != nullptr){ |
| | LC_LayerTreeItem *currentItem = m_layerTreeModel->getItemForLayer(activeLayer); |
| | if (currentItem != nullptr){ |
| | if (currentItem->getLayerType() == LC_LayerTreeItem::NORMAL){ |
| | int newLayerType = LC_LayerTreeItem::DIMENSIONAL; |
| | if (!currentItem->hasChildOfType(newLayerType)){ |
| | invokeLayerAddDialog(currentItem, newLayerType); |
| | } |
| | else{ |
| | QMessageBox::information(parentWidget(), |
| | QMessageBox::tr("Add Layer"), |
| | QMessageBox::tr("Such child layer already exist for \n[%1].\n") |
| | .arg(currentItem->getName()), |
| | QMessageBox::Ok); |
| | } |
| | } |
| | else{ |
| | QMessageBox::information(parentWidget(), |
| | QMessageBox::tr("Add Layer"), |
| | QMessageBox::tr("Dimensional layer may be added only for normal active layer.\n") |
| | .arg(currentItem->getName()), |
| | QMessageBox::Ok); |
| | } |
| | } |
| | } |
| | } |
| | } |
| |
|
| | |
| |
|
| | |
| | |
| | |
| | void LC_LayerTreeWidget::editActiveLayer(){ |
| | if (nullptr != m_layerList){ |
| | RS_Layer *activeLayer = m_layerList->getActive(); |
| | if (activeLayer != nullptr){ |
| | LC_LayerTreeItem *currentItem = m_layerTreeModel->getItemForLayer(activeLayer); |
| | if (currentItem != nullptr){ |
| | invokeLayerEditOrRenameDialog(currentItem, true); |
| | } |
| | } |
| | } |
| | } |
| |
|
| | |
| | |
| | |
| | void LC_LayerTreeWidget::editSelectedLayer(){ |
| | QModelIndex selectedItemIndex = getSelectedItemIndex(); |
| | if (selectedItemIndex.isValid()){ |
| | LC_LayerTreeItem *currentItem = m_layerTreeModel->getItemForIndex(selectedItemIndex); |
| | invokeLayerEditOrRenameDialog(currentItem, true); |
| | } |
| | } |
| | |
| | |
| | |
| | void LC_LayerTreeWidget::renameVirtualLayer(){ |
| | QModelIndex selectedItemIndex = getSelectedItemIndex(); |
| | if (selectedItemIndex.isValid()){ |
| | LC_LayerTreeItem *currentItem = m_layerTreeModel->getItemForIndex(selectedItemIndex); |
| | if (currentItem->isVirtual()){ |
| | invokeLayerEditOrRenameDialog(currentItem, false); |
| | } |
| | } |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | void LC_LayerTreeWidget::selectLayersEntities(){ |
| | QList<RS_Layer *> layersList = collectLayersForSelectedItem(); |
| | if (!layersList.isEmpty()){ |
| | doSelectLayersEntities(layersList); |
| | } |
| | } |
| | |
| | |
| | |
| | void LC_LayerTreeWidget::moveSelectionToLayer(){ |
| | moveOrDuplicateSelectionToSelectedItemLayer(false, QMessageBox::tr("Move Selection")); |
| | } |
| |
|
| | |
| | |
| | |
| | void LC_LayerTreeWidget::duplicateSelectionToLayer(){ |
| | moveOrDuplicateSelectionToSelectedItemLayer(true, QMessageBox::tr("Duplicate Selection")); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | void LC_LayerTreeWidget::moveOrDuplicateSelectionToSelectedItemLayer(bool duplicate, const QString &title){ |
| | QModelIndex selectedItemIndex = getSelectedItemIndex(); |
| | if (selectedItemIndex.isValid()){ |
| | LC_LayerTreeItem *layerItem = m_layerTreeModel->getItemForIndex(selectedItemIndex); |
| | if (!layerItem->isLocked()){ |
| | if (!layerItem->isVirtual()){ |
| | bool resolvePens = QMessageBox::question(this, title, |
| | QMessageBox::tr("Replace \"By Layer\" value to source layers values?\n\n" |
| | "If Yes - entities with \"By Layer\" pens will look on new layer exactly as on previous layers and " |
| | "\"By Layer\" value will be replaced by resolved pens.\n\n" |
| | "If No - \"By Layer\" values remains and so pen of target layer will define pen for such entities."), |
| | QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes; |
| | doMoveSelectionToLayer(layerItem, duplicate, resolvePens); |
| | } |
| | } |
| | } |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | void LC_LayerTreeWidget::convertLayerTypeToDimensional(){ |
| | doConvertSelectedItemLayerToNewType(LC_LayerTreeItem::DIMENSIONAL); |
| | } |
| |
|
| | |
| | |
| | |
| | void LC_LayerTreeWidget::convertLayerTypeToInformational(){ |
| | doConvertSelectedItemLayerToNewType(LC_LayerTreeItem::INFORMATIONAL); |
| | } |
| |
|
| | |
| | |
| | |
| | void LC_LayerTreeWidget::convertLayerTypeToAlternativePosition(){ |
| | doConvertSelectedItemLayerToNewType(LC_LayerTreeItem::ALTERNATE_POSITION); |
| | } |
| |
|
| | |
| | |
| | |
| | void LC_LayerTreeWidget::convertLayerTypeToNormal(){ |
| | doConvertSelectedItemLayerToNewType(LC_LayerTreeItem::NORMAL); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | void LC_LayerTreeWidget::doConvertSelectedItemLayerToNewType(int newType){ |
| | QModelIndex selectedItem = getSelectedItemIndex(); |
| | bool converted = m_layerTreeModel->convertToType(selectedItem, newType); |
| | if (converted){ |
| | m_layerList->fireEdit(nullptr); |
| | } |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | void LC_LayerTreeWidget::removeLayersForSelectedItem(){ |
| | QModelIndex selectedItemIndex = getSelectedItemIndex(); |
| | if (selectedItemIndex.isValid()){ |
| | LC_LayerTreeItem *currentItem = m_layerTreeModel->getItemForIndex(selectedItemIndex); |
| | doRemoveLayersFromSource(currentItem, false); |
| | } |
| | } |
| |
|
| | |
| | |
| | |
| | void LC_LayerTreeWidget::removeChildLayersForSelected(){ |
| | QModelIndex selectedItemIndex = getSelectedItemIndex(); |
| | if (selectedItemIndex.isValid()){ |
| | LC_LayerTreeItem *currentItem = m_layerTreeModel->getItemForIndex(selectedItemIndex); |
| | doRemoveLayersFromSource(currentItem, true); |
| | } |
| | } |
| |
|
| | |
| | |
| | |
| | void LC_LayerTreeWidget::removeActiveLayers(){ |
| | if (nullptr != m_layerList){ |
| | RS_Layer *activeLayer = m_layerList->getActive(); |
| | if (activeLayer){ |
| | LC_LayerTreeItem *currentItem = m_layerTreeModel->getItemForLayer(activeLayer); |
| | if (currentItem != nullptr){ |
| | doRemoveLayersFromSource(currentItem, false); |
| | } |
| | } |
| | } |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | void LC_LayerTreeWidget::createLayerCopy(){ |
| | QModelIndex selectedItemIndex = getSelectedItemIndex(); |
| | if (selectedItemIndex.isValid()){ |
| | doCreateLayersCopy(selectedItemIndex, false); |
| | } |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | void LC_LayerTreeWidget::createLayerDuplicate(){ |
| | QModelIndex selectedItemIndex = getSelectedItemIndex(); |
| | if (selectedItemIndex.isValid()){ |
| | doCreateLayersCopy(selectedItemIndex, true); |
| | } |
| | } |
| | |
| | |
| | |
| | void LC_LayerTreeWidget::toggleFlatView(){ |
| | m_flatListMode = !m_flatListMode; |
| | m_layerTreeModel->setFlatMode(m_flatListMode); |
| | update(); |
| | updateToolBarButtons(); |
| | |
| | int expandDepth = 0; |
| | expandItems(expandDepth); |
| | } |
| | |
| | |
| | |
| | void LC_LayerTreeWidget::updateToolBarButtons(){ |
| | m_btnCollapseSecondary->setVisible(!m_flatListMode); |
| | m_btnCollapseAll->setVisible(!m_flatListMode); |
| | m_btnExpandAll->setVisible(!m_flatListMode); |
| | m_btnListMode->setChecked(m_flatListMode); |
| | m_btnAddDimensional-> setVisible(!m_flatListMode); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | QModelIndex LC_LayerTreeWidget::getSelectedItemIndex(){ |
| | QModelIndex result; |
| | QModelIndexList selectedIndexes = m_layerTreeView->selectionModel()->selectedIndexes(); |
| | if (selectedIndexes.size() == 1){ |
| | result = selectedIndexes.at(0); |
| | } |
| | return result; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | QList<RS_Layer *> LC_LayerTreeWidget::collectLayersForSelectedItem(){ |
| | QList<RS_Layer *> layersList; |
| | QModelIndex selectedIndex = getSelectedItemIndex(); |
| | if (selectedIndex.isValid()){ |
| | LC_LayerTreeItem *layerItem = m_layerTreeModel->getItemForIndex(selectedIndex); |
| | QG_LayerTreeItemAcceptorVisible ACCEPT_VISIBLE; |
| | layerItem->collectLayers(layersList, &ACCEPT_VISIBLE, true); |
| | } |
| | return layersList; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | void LC_LayerTreeWidget::deselectEntitiesOnLockedLayer(RS_Layer *layer){ |
| | if (layer == nullptr) return; |
| | if (!layer->isLocked()) return; |
| |
|
| | for (auto e: *m_document) { |
| | if (e != nullptr && e->isVisible() && e->getLayer() == layer){ |
| | e->setSelected(false); |
| | } |
| | } |
| | redrawView(); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | void LC_LayerTreeWidget::deselectEntities(RS_Layer *layer){ |
| | if (layer == nullptr) return; |
| |
|
| | for (auto entity: *m_document) { |
| | if (entity != nullptr && entity->isVisible() && entity->getLayer() == layer){ |
| | entity->setSelected(false); |
| | } |
| | } |
| | redrawView(); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | void LC_LayerTreeWidget::manageLayersVisibilityFlag(QList<RS_Layer *> &layersToEnable, QList<RS_Layer *> &layersToDisable, bool toggleMode){ |
| | if (m_graphicView != nullptr){ |
| | if (toggleMode){ |
| | m_layerList->toggleFreezeMulti(layersToEnable); |
| | } else { |
| | m_layerList->setFreezeMulti(layersToEnable, layersToDisable); |
| | } |
| | m_document->updateInserts(); |
| | m_document->calculateBorders(); |
| | } |
| | } |
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| | void LC_LayerTreeWidget::manageLayersLockFlag(QList<RS_Layer *> &layersToLockOrToggle, QList<RS_Layer *> &layersToUnlock, bool toggleMode){ |
| | int count; |
| | QList<RS_Layer *> layersForEntitiesUpdate; |
| | if (toggleMode){ |
| | m_layerList->toggleLockMulti(layersToLockOrToggle); |
| | count = layersToLockOrToggle.count(); |
| | layersForEntitiesUpdate = layersToLockOrToggle; |
| | } else { |
| | m_layerList->setLockMulti(layersToUnlock, layersToLockOrToggle); |
| | count = layersToUnlock.count(); |
| | layersForEntitiesUpdate = layersToUnlock; |
| | } |
| |
|
| | for (int i = 0; i < count; i++) { |
| | RS_Layer *layer = layersForEntitiesUpdate.at(i); |
| | if (layer != nullptr){ |
| | deselectEntitiesOnLockedLayer(layer); |
| | } |
| | } |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | void LC_LayerTreeWidget::manageLayersConstructionFlag(QList<RS_Layer *> &layersToBeConstruction, QList<RS_Layer *> &layersNonConstruction, bool toggleMode){ |
| | QList<RS_Layer *> layersForEntitiesUpdate; |
| | if (toggleMode){ |
| | m_layerList->toggleConstructionMulti(layersToBeConstruction); |
| | layersForEntitiesUpdate = layersToBeConstruction; |
| | } else { |
| | m_layerList->setConstructionMulti(layersNonConstruction, layersToBeConstruction); |
| | layersForEntitiesUpdate = layersNonConstruction; |
| | } |
| | int count = layersForEntitiesUpdate.count(); |
| | for (int i = 0; i < count; i++) { |
| | RS_Layer *layer = layersForEntitiesUpdate.at(i); |
| | if (layer!= nullptr){ |
| | deselectEntities(layer); |
| | } |
| | } |
| | } |
| | |
| | |
| | |
| | |
| | |
| | |
| | void LC_LayerTreeWidget::manageLayersPrintFlag(QList<RS_Layer *> &layersToPrint, QList<RS_Layer *> &layersNoPrint, bool toggleMode){ |
| | QList<RS_Layer *> layersForEntitiesUpdate; |
| | if (toggleMode){ |
| | m_layerList->togglePrintMulti(layersToPrint); |
| | layersForEntitiesUpdate = layersToPrint; |
| | } |
| | else{ |
| | m_layerList->setPrintMulti(layersNoPrint, layersToPrint); |
| | layersForEntitiesUpdate = layersNoPrint; |
| | } |
| | int count = layersForEntitiesUpdate.count(); |
| | for (int i = 0; i < count; i++) { |
| | RS_Layer *layer = layersForEntitiesUpdate.at(i); |
| | if (layer != nullptr){ |
| | deselectEntities(layer); |
| | } |
| | } |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | void LC_LayerTreeWidget::doSelectLayersEntities(QList<RS_Layer *> &layers){ |
| | |
| | |
| |
|
| | for (auto en: *m_document) { |
| | if (en != nullptr && en->isVisible() && !en->isSelected() && (!(en->getLayer() && en->getLayer()->isLocked()))){ |
| | RS_Layer *l = en->getLayer(true); |
| | if (l != nullptr && layers.contains(l)){ |
| | en->setSelected(true); |
| | } |
| | } |
| | } |
| |
|
| | redrawView(); |
| |
|
| | auto selectionInfo = m_document->getSelectionInfo(); |
| | LC_ActionContext* ctx = QC_ApplicationWindow::getAppWindow().get()->getActionContext(); |
| | ctx->updateSelectionWidget(selectionInfo.count, selectionInfo.length); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | void LC_LayerTreeWidget::doCreateLayersCopy(const QModelIndex &sourceIndex, bool duplicateEntities){ |
| | QHash<RS_Layer *, RS_Layer *> layersMap = m_layerTreeModel->createLayersCopy(sourceIndex); |
| | if (layersMap.count() > 0){ |
| | QHashIterator<RS_Layer *, RS_Layer *> iter{layersMap}; |
| | while (iter.hasNext()) { |
| | iter.next(); |
| | RS_Layer *sourceLayer = iter.key(); |
| | RS_Layer *copyLayer = iter.value(); |
| | copyLayerAttributes(copyLayer, sourceLayer); |
| | if (duplicateEntities){ |
| | duplicateLayerEntities(sourceLayer, copyLayer); |
| | } |
| | |
| | |
| | m_layerList->add(copyLayer); |
| | } |
| | |
| | m_layerList->fireEdit(nullptr); |
| | } |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | void LC_LayerTreeWidget::duplicateLayerEntities(RS_Layer *sourceLayer, RS_Layer *copyLayer){ |
| | |
| | for (RS_Entity* entity: std::as_const(*m_document)) { |
| | if (entity == nullptr) |
| | continue; |
| | RS_Layer *layer = entity->getLayer(true); |
| | if (layer != nullptr && layer == sourceLayer){ |
| | RS_Entity *duplicateEntity = entity->clone(); |
| | duplicateEntity->setLayer(copyLayer); |
| | m_document->addEntity(duplicateEntity); |
| | } |
| | } |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | void LC_LayerTreeWidget::copyLayerAttributes(RS_Layer *copyLayer, RS_Layer *sourceLayer){ |
| | copyLayer->setConstruction(sourceLayer->isConstruction()); |
| | copyLayer->setConverted(sourceLayer->isConverted()); |
| | copyLayer->setPrint(sourceLayer->isPrint()); |
| |
|
| | RS_Pen sourcePen = sourceLayer->getPen(); |
| | RS_Pen pen; |
| |
|
| | pen.setColor(sourcePen.getColor()); |
| | pen.setWidth(sourcePen.getWidth()); |
| | pen.setLineType(sourcePen.getLineType()); |
| | pen.setAlpha(sourcePen.getAlpha()); |
| | pen.setScreenWidth(sourcePen.getScreenWidth()); |
| | pen.setDashOffset(sourcePen.dashOffset()); |
| |
|
| | |
| | pen.setFlags(sourcePen.getFlags()); |
| |
|
| | copyLayer->setPen(pen); |
| | copyLayer->freeze(sourceLayer->isFrozen()); |
| | } |
| |
|
| | void LC_LayerTreeWidget::redrawView(){ |
| | if (m_graphicView != nullptr){ |
| | m_graphicView->redraw(); |
| | } |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | void LC_LayerTreeWidget::doMoveSelectionToLayer(LC_LayerTreeItem* layerItem, bool duplicate, bool resolvePens){ |
| | RS_Layer *targetLayer = layerItem->getLayer(); |
| |
|
| | |
| | if (duplicate){ |
| | for (auto en: *m_document) { |
| | if (en != nullptr){ |
| | if (en->isVisible() && en->isSelected() && !en->isParentSelected()){ |
| | RS_Layer *l = en->getLayer(true); |
| | if (l != nullptr && l != targetLayer){ |
| | en->setSelected(false); |
| | RS_Entity *duplicateEntity = en->clone(); |
| | if (resolvePens){ |
| | |
| | RS_Pen resolvedPen = en->getPen(true); |
| | |
| | duplicateEntity ->setPen(resolvedPen); |
| | } |
| | |
| | duplicateEntity->setSelected(true); |
| | duplicateEntity->setLayer(targetLayer); |
| | m_document->addEntity(duplicateEntity); |
| | } |
| | } |
| | } |
| | } |
| | } else { |
| | for (auto en: *m_document) { |
| | if (en != nullptr){ |
| | if (en->isVisible() && en->isSelected() && !en->isParentSelected()){ |
| | RS_Layer *l = en->getLayer(true); |
| | if (l != nullptr && l != targetLayer){ |
| | if (resolvePens){ |
| | |
| | |
| | RS_Pen resolvedPen = en->getPen(true); |
| | en ->setPen(resolvedPen); |
| | } |
| | en->setLayer(targetLayer); |
| | } |
| | } |
| | } |
| | } |
| | } |
| | redrawView(); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | void LC_LayerTreeWidget::doRemoveLayersFromSource(LC_LayerTreeItem *source, bool removeChildrenOnly){ |
| | LC_LayerTreeItemAcceptor acceptAllAcceptor; |
| | QList<LC_LayerTreeItem *> itemsToRemove; |
| |
|
| | |
| | source->collectDescendantChildren(itemsToRemove, &acceptAllAcceptor, !removeChildrenOnly); |
| |
|
| | doRemoveLayerItems(itemsToRemove); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | void LC_LayerTreeWidget::doRemoveLayerItems(QList<LC_LayerTreeItem *> &itemsToRemove){ |
| | QStringList layerNames; |
| | QList<RS_Layer *> layersToRemove; |
| | for (auto item: itemsToRemove) { |
| | if (!item->isVirtual()){ |
| | if (item->isZero()){ |
| | QMessageBox::information(this, QMessageBox::tr("Remove Layer"), QMessageBox::tr("Layer \"0\" can never be removed."), QMessageBox::Ok); |
| | } else { |
| | if (item->isLocked()){ |
| | |
| | |
| | } |
| | layerNames << item->getDisplayName(); |
| | layersToRemove << item->getLayer(); |
| | } |
| | } |
| | } |
| |
|
| | |
| | if (!layerNames.empty()){ |
| | int dialogResult = invokeLayersRemovalDialog(layerNames); |
| | if (dialogResult == QMessageBox::Ok){ |
| | doRemoveLayers(layersToRemove); |
| | } |
| | } |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | void LC_LayerTreeWidget::doRemoveLayers(QList<RS_Layer *> &layersToRemove){ |
| | for (auto layer: layersToRemove) { |
| | RS_Graphic *graphic = m_document->getGraphic(); |
| | if (graphic != nullptr){ |
| | graphic->removeLayer(layer); |
| | } |
| | } |
| | m_document->updateInserts(); |
| | m_document->calculateBorders(); |
| | m_layerList->setModified(true); |
| | } |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | int LC_LayerTreeWidget::invokeLayersRemovalDialog(QStringList &layerNames){ |
| | |
| |
|
| | QString title(QMessageBox::tr("Remove %n layer(s)", "", layerNames.size())); |
| | QStringList text_lines = {QMessageBox::tr("Listed layers and all entities on them will be removed."), "", |
| | QMessageBox::tr("Warning: this action can NOT be undone!"),}; |
| | QStringList detail_lines = {QMessageBox::tr("Layers for removal:"), "",}; |
| | detail_lines << layerNames; |
| |
|
| | QMessageBox msgBox(QMessageBox::Warning, title, text_lines.join("\n"), QMessageBox::Ok | QMessageBox::Cancel); |
| | msgBox.setDetailedText(detail_lines.join("\n")); |
| |
|
| | int result = msgBox.exec(); |
| | return result; |
| | } |
| | |
| | |
| | |
| | |
| | |
| | void LC_LayerTreeWidget::invokeLayerEditOrRenameDialog(LC_LayerTreeItem *pItem, bool edit){ |
| | LC_LayerDialogEx dlg = LC_LayerDialogEx(this, QMessageBox::tr("Layer DialogEx"), m_layerTreeModel, pItem, m_layerList); |
| |
|
| | RS_Layer* layer = nullptr; |
| | if (edit){ |
| | dlg.setMode(LC_LayerDialogEx::MODE_EDIT_LAYER); |
| | layer = pItem->getLayer(); |
| | dlg.setLayerType(pItem->getLayerType()); |
| | dlg.setConstruction(layer->isConstruction()); |
| | } |
| | else{ |
| | dlg.setMode(LC_LayerDialogEx::MODE_RENAME_VIRTUAL); |
| | } |
| | QString originalName = QString(pItem->getName()); |
| | QString path = m_layerTreeModel->generateLayersDisplayPathString(pItem); |
| |
|
| | dlg.setLayerName(originalName); |
| | dlg.setParentPath(path); |
| | dlg.setLayer(layer); |
| |
|
| | int dialogResult = dlg.exec(); |
| | if (dialogResult == QDialog::Accepted){ |
| | QString newName = dlg.getLayerName(); |
| | if (edit){ |
| | |
| | RS_Pen pen = dlg.getPen(); |
| | layer->setPen(pen); |
| | layer->setConstruction(dlg.isConstruction()); |
| |
|
| | |
| | QString layerName = dlg.getLayerName(); |
| | int editedLayerType = dlg.getEditedLayerType(); |
| | if (originalName != layerName || editedLayerType != pItem->getLayerType()){ |
| | m_layerTreeModel -> renamePrimaryLayer(pItem, layerName, editedLayerType); |
| | } |
| | m_layerList->fireEdit(nullptr); |
| | } |
| | else{ |
| | bool renamed = m_layerTreeModel -> renameVirtualLayer(pItem, newName); |
| | if (renamed){ |
| | m_layerList->fireEdit(nullptr); |
| | } |
| | } |
| | } |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | void LC_LayerTreeWidget::invokeLayerAddDialog(LC_LayerTreeItem *parentItem, int layerType){ |
| | LC_LayerDialogEx dlg = LC_LayerDialogEx(this, QMessageBox::tr("Layer DialogEx"), m_layerTreeModel, parentItem, m_layerList); |
| |
|
| | |
| | int dialogMode = LC_LayerDialogEx::MODE_ADD_CHILD_LAYER; |
| | switch (layerType){ |
| | case LC_LayerTreeItem::NOT_DEFINED_LAYER_TYPE:{ |
| | if (parentItem == nullptr){ |
| | dialogMode = LC_LayerDialogEx::MODE_ADD_LAYER; |
| | } |
| | else{ |
| | dialogMode = LC_LayerDialogEx::MODE_ADD_CHILD_LAYER; |
| | } |
| | break; |
| | } |
| | case LC_LayerTreeItem::DIMENSIONAL: |
| | case LC_LayerTreeItem::INFORMATIONAL: |
| | case LC_LayerTreeItem::ALTERNATE_POSITION:{ |
| | dialogMode = LC_LayerDialogEx::MODE_ADD_SECONDARY_LAYER; |
| | break; |
| | } |
| | default:{ |
| | break; |
| | } |
| | } |
| | dlg.setMode(dialogMode); |
| |
|
| | |
| | QString name = ""; |
| | QString path = ""; |
| | if (parentItem != nullptr){ |
| | name = QString(parentItem->getName()); |
| | path = m_layerTreeModel->generateLayersDisplayPathString(parentItem); |
| | } |
| |
|
| | dlg.setLayerName(name); |
| | dlg.setParentPath(path); |
| | dlg.setLayerType(layerType); |
| |
|
| | |
| | auto* tmpLayer = new RS_Layer(""); |
| |
|
| | |
| | RS_Pen defaultPen = m_layerTreeModel->getOptions() ->getDefaultPen(layerType == LC_LayerTreeItem::NOT_DEFINED_LAYER_TYPE ? LC_LayerTreeItem::NORMAL : layerType); |
| | RS_Pen penCopy = RS_Pen(defaultPen); |
| |
|
| | tmpLayer->setPen(penCopy); |
| | dlg.setLayer(tmpLayer); |
| |
|
| | int dialogResult = dlg.exec(); |
| | if (dialogResult == QDialog::Accepted){ |
| | QString layerName = dlg.getLayerName(); |
| | int editedLayerType = dlg.getEditedLayerType(); |
| |
|
| | |
| | QString newLayerName = m_layerTreeModel->createFullLayerName(parentItem, layerName, editedLayerType, true); |
| |
|
| | RS_Pen pen = dlg.getPen(); |
| | tmpLayer->setConstruction(dlg.isConstruction()); |
| | tmpLayer->setName(newLayerName); |
| | tmpLayer->setPen(pen); |
| | m_layerList->add(tmpLayer); |
| | } |
| | else{ |
| | |
| | delete tmpLayer; |
| | } |
| | } |
| |
|
| | |
| | |
| | |
| | void LC_LayerTreeWidget::invokeSettingsDialog(){ |
| | LC_LayerTreeModelOptions* options = m_layerTreeModel->getOptions(); |
| | LC_LayerTreeOptionsDialog dlg = LC_LayerTreeOptionsDialog(this, options); |
| | int dialogResult = dlg.exec(); |
| | if (dialogResult == QDialog::Accepted){ |
| | options->save(); |
| | update(); |
| | } |
| | } |
| |
|
| | void LC_LayerTreeWidget::updateWidgetSettings(){ |
| | LC_GROUP("Widgets"); { |
| | bool flatIcons = LC_GET_BOOL("DockWidgetsFlatIcons", true); |
| | int iconSize = LC_GET_INT("DockWidgetsIconSize", 16); |
| |
|
| | QSize size(iconSize, iconSize); |
| |
|
| | QList<QToolButton *> widgets = this->findChildren<QToolButton *>(); |
| | foreach(QToolButton *w, widgets) { |
| | w->setAutoRaise(flatIcons); |
| | w->setIconSize(size); |
| | } |
| | } |
| | LC_GROUP_END(); |
| | } |
| |
|
| |
|
| | void LC_LayerTreeWidget::setGraphicView(RS_GraphicView *gview){ |
| | m_graphicView = gview; |
| |
|
| | if (gview == nullptr) { |
| | setLayerList(nullptr); |
| | m_document = nullptr; |
| | } |
| | else { |
| | auto doc = gview->getContainer()->getDocument(); |
| | setLayerList(gview->getGraphic(true)->getLayerList()); |
| | m_document = doc; |
| | } |
| | } |
| |
|
| | void LC_LayerTreeWidget::exportSelectedLayer() { |
| | QModelIndex selectedItemIndex = getSelectedItemIndex(); |
| | if (selectedItemIndex.isValid()) { |
| | LC_LayerTreeItem *currentItem = m_layerTreeModel->getItemForIndex(selectedItemIndex); |
| | if (!currentItem->isVirtual()) { |
| | LC_LayersExportOptions exportOptions; |
| | auto layerToExport = currentItem->getLayer(); |
| | exportOptions.m_layers.push_back(layerToExport); |
| | auto sourceGraphic = m_document->getGraphic(); |
| | LC_ExportLayersService::exportLayers(exportOptions, sourceGraphic); |
| | } |
| | } |
| | } |
| |
|
| | void LC_LayerTreeWidget::exportLayersList(QList<RS_Layer*> layersToExport) { |
| | if (!layersToExport.isEmpty()) { |
| | LC_LayersExportOptions exportOptions; |
| | for (const auto layer: layersToExport) { |
| | exportOptions.m_layers.push_back(layer); |
| | } |
| | auto sourceGraphic = m_document->getGraphic(); |
| | LC_ExportLayersService::exportLayers(exportOptions, sourceGraphic); |
| | } |
| | } |
| |
|
| | void LC_LayerTreeWidget::exportLayerSubTree() { |
| | QModelIndex selectedItemIndex = getSelectedItemIndex(); |
| | if (selectedItemIndex.isValid()) { |
| | LC_LayerTreeItem *currentItem = m_layerTreeModel->getItemForIndex(selectedItemIndex); |
| | LC_LayerTreeItemAcceptor ACCEPT_ALL = LC_LayerTreeItemAcceptor(); |
| | QList<RS_Layer*> layersToExport; |
| | currentItem->collectLayers(layersToExport, &ACCEPT_ALL, true); |
| | exportLayersList(layersToExport); |
| | } |
| | } |
| |
|
| | void LC_LayerTreeWidget::exportVisibleLayers() { |
| | auto layerItem = m_layerTreeModel->getRoot(); |
| | QG_LayerTreeItemAcceptorVisible ACCEPT_VISIBLE; |
| | QList<RS_Layer*> layersToExport; |
| | layerItem->collectLayers(layersToExport, &ACCEPT_VISIBLE, false); |
| | exportLayersList(layersToExport); |
| | } |
| |
|