LibreCAD / librecad /src /ui /lc_snapmanager.cpp
AbdulElahGwaith's picture
Upload folder using huggingface_hub
a5ffdcd verified
/*
* ********************************************************************************
* This file is part of the LibreCAD project, a 2D CAD program
*
* Copyright (C) 2025 LibreCAD.org
* Copyright (C) 2025 sand1024
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* ********************************************************************************
*/
#include "lc_snapmanager.h"
#include "qg_snaptoolbar.h"
#include "rs_debug.h"
#include "rs_graphicview.h"
#include "rs_snapper.h"
LC_SnapManager::LC_SnapManager(QG_SnapToolBar* snapToolbar):m_snapToolbar{snapToolbar} {
}
void LC_SnapManager::setSnaps(RS_SnapMode const& s) { // some flag set except free{
if (m_snapToolbar) {
m_snapToolbar->setSnaps(s);
}
else {
RS_DEBUG->print("QG_ActionHandler::slotSetSnaps(): snapToolBar is nullptr");
}
if (m_view != nullptr) {
m_view->setDefaultSnapMode(s);
}
if (m_inTempSnapFreeMode) {
if (RS_SnapMode::toInt(s) != 0) { // some flag set except free
m_inTempSnapFreeMode = false;
}
}
RS_DEBUG->print("QG_ActionHandler::slotSetSnaps(): ok");
}
bool LC_SnapManager::tryToProcessSnapActions(RS2::ActionType type) {
switch (type) {
case RS2::ActionSnapCenter:
toggleSnapCenter();
return true;
case RS2::ActionSnapDist:
toggleSnapDist();
return true;
case RS2::ActionSnapEndpoint:
toggleSnapEndpoint();
return true;
case RS2::ActionSnapGrid:
toggleSnapGrid();
return true;
case RS2::ActionSnapIntersection:
toggleSnapIntersection();
return true;
case RS2::ActionSnapMiddle:
toggleSnapMiddle();
return true;
case RS2::ActionSnapOnEntity:
toggleSnapOnEntity();
return true;
case RS2::ActionRestrictNothing:
restrictNothing();
return true;
case RS2::ActionRestrictOrthogonal:
restrictOrthogonal();
return true;
case RS2::ActionRestrictHorizontal:
restrictHorizontal();
return true;
case RS2::ActionRestrictVertical:
restrictVertical();
return true;
default:
return false;
}
}
void LC_SnapManager::toggleSnapFree() {
auto s = getSnaps();
s.snapFree = !s.snapFree;
setSnaps(s);
}
bool LC_SnapManager::toggleTemporarySnapFree() {
if (m_inTempSnapFreeMode) {
m_inTempSnapFreeMode = false;
setSnaps(m_savedSnapMode);
}
else {
m_savedSnapMode = getSnaps();
m_inTempSnapFreeMode = true;
setSnaps(RS_SnapMode());
}
return m_inTempSnapFreeMode;
}
void LC_SnapManager::toggleSnapGrid() {
auto s = getSnaps();
s.snapGrid = !s.snapGrid;
setSnaps(s);
}
void LC_SnapManager::toggleSnapEndpoint() {
auto s = getSnaps();
s.snapEndpoint = !s.snapEndpoint;
setSnaps(s);
}
void LC_SnapManager::toggleSnapOnEntity() {
auto s = getSnaps();
s.snapOnEntity = !s.snapOnEntity;
setSnaps(s);
}
void LC_SnapManager::toggleSnapCenter() {
auto s = getSnaps();
s.snapCenter = !s.snapCenter;
setSnaps(s);
}
void LC_SnapManager::toggleSnapMiddle() {
RS_SnapMode s = getSnaps();
s.snapMiddle = !s.snapMiddle;
setSnaps(s);
}
void LC_SnapManager::toggleSnapDist() {
RS_SnapMode s = getSnaps();
s.snapDistance = !s.snapDistance;
setSnaps(s);
}
void LC_SnapManager::toggleSnapIntersection() {
RS_SnapMode s = getSnaps();
s.snapIntersection = !s.snapIntersection;
setSnaps(s);
}
RS_SnapMode LC_SnapManager::getSnaps() const {
if (m_snapToolbar != nullptr) {
return m_snapToolbar->getSnaps();
}
//return a free snap mode
return RS_SnapMode();
}
void LC_SnapManager::disableSnaps() {
setSnaps(RS_SnapMode());
}
void LC_SnapManager::setSnapRestriction(RS2::SnapRestriction restriction) {
RS_SnapMode s = getSnaps();
s.restriction = restriction;
setSnaps(s);
}
void LC_SnapManager::restrictNothing() {
setSnapRestriction(RS2::RestrictNothing);
}
void LC_SnapManager::restrictOrthogonal() {
setSnapRestriction(RS2::RestrictOrthogonal);
}
void LC_SnapManager::restrictHorizontal() {
setSnapRestriction(RS2::RestrictHorizontal);
}
void LC_SnapManager::restrictVertical() {
setSnapRestriction(RS2::RestrictVertical);
}
// find snap restriction from menu
RS2::SnapRestriction LC_SnapManager::getSnapRestriction() const {
return getSnaps().restriction;
}
void LC_SnapManager::setGraphicView(RS_GraphicView* gview) {
m_view = gview;
}
void LC_SnapManager::setRelativeZeroLock(bool on) const {
if (m_snapToolbar) {
m_snapToolbar->setLockedRelativeZero(on);
}
}