Files
newspark110/ui/forms/qg_snaptoolbar.cpp
Chenwenxuan edac2715f0 init
2024-03-06 14:54:30 +08:00

237 lines
9.6 KiB
C++

/****************************************************************************
**
** This file is part of the LibreCAD project, a 2D CAD program
**
** Copyright (C) 2010 R. van Twisk (librecad@rvt.dds.nl)
** Copyright (C) 2001-2003 RibbonSoft. All rights reserved.
**
**
** This file may be distributed and/or modified under the terms of the
** GNU General Public License version 2 as published by the Free Software
** Foundation and appearing in the file gpl-2.0.txt included in the
** packaging of this file.
**
** 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
**
** This copyright notice MUST APPEAR in all copies of the script!
**
**********************************************************************/
#include <QContextMenuEvent>
#include <QToolBar>
#include "qg_snaptoolbar.h"
#include "rs_settings.h"
#include "qg_actionhandler.h"
#include "lc_actiongroupmanager.h"
/*
* Constructs a QG_CadToolBarSnap as a child of 'parent', with the
* name 'name' and widget flags set to 'f'.
*/
QG_SnapToolBar::QG_SnapToolBar(QWidget* parent, QG_ActionHandler* ah, LC_ActionGroupManager* agm)
: QToolBar(parent)
, actionHandler(ah)
{
auto action = new QAction(tr("Exclusive Snap Mode"), agm->snap_extras);
action->setIcon(QIcon(":/icons/exclusive.svg"));
action->setCheckable(true);
connect(action, SIGNAL(toggled(bool)),
agm, SLOT(toggleExclusiveSnapMode(bool)));
action->setObjectName("ExclusiveSnapMode");
addAction(action);
snapFree = new QAction(QIcon(":/icons/snap_free.svg"), tr("Free Snap"), agm->snap_extras);
snapFree->setCheckable(true);
snapFree->setObjectName("SnapFree");
connect(snapFree, SIGNAL(triggered()), this, SLOT(actionTriggered()));
this->addAction(snapFree);
snapGrid = new QAction(QIcon(":/icons/snap_grid.svg"), tr("Snap on grid"), agm->snap);
snapGrid->setObjectName("SnapGrid");
snapGrid->setCheckable(true);
connect(snapGrid, SIGNAL(triggered()), this, SLOT(actionTriggered()));
this->addAction(snapGrid);
snapEnd = new QAction(QIcon(":/icons/snap_endpoints.svg"), tr("Snap on Endpoints"), agm->snap);
snapEnd->setObjectName("SnapEnd");
snapEnd->setCheckable(true);
connect(snapEnd, SIGNAL(triggered()), this, SLOT(actionTriggered()));
this->addAction(snapEnd);
snapOnEntity = new QAction(QIcon(":/icons/snap_entity.svg"), tr("Snap on Entity"), agm->snap);
snapOnEntity->setObjectName("SnapEntity");
snapOnEntity->setCheckable(true);
connect(snapOnEntity, SIGNAL(triggered()), this, SLOT(actionTriggered()));
this->addAction(snapOnEntity);
snapCenter = new QAction(QIcon(":/icons/snap_center.svg"), tr("Snap Center"), agm->snap);
snapCenter->setObjectName("SnapCenter");
snapCenter->setCheckable(true);
connect(snapCenter, SIGNAL(triggered()), this, SLOT(actionTriggered()));
this->addAction(snapCenter);
snapMiddle = new QAction(QIcon(":/icons/snap_middle.svg"), tr("Snap Middle"), agm->snap);
snapMiddle->setObjectName("SnapMiddle");
snapMiddle->setCheckable(true);
connect(snapMiddle, SIGNAL(triggered()), this, SLOT(actionTriggered()));
this->addAction(snapMiddle);
snapDistance = new QAction(QIcon(":/icons/snap_distance.svg"), tr("Snap Distance"), agm->snap);
snapDistance->setObjectName("SnapDistance");
snapDistance ->setCheckable(true);
connect(snapDistance, SIGNAL(triggered()), this, SLOT(actionTriggered()));
this->addAction(snapDistance);
snapIntersection = new QAction(QIcon(":/icons/snap_intersection.svg"), tr("Snap Intersection"), agm->snap);
snapIntersection->setObjectName("SnapIntersection");
snapIntersection->setCheckable(true);
connect(snapIntersection, SIGNAL(triggered()), this, SLOT(actionTriggered()));
this->addAction(snapIntersection);
this->addSeparator();
restrictHorizontal = new QAction(QIcon(":/icons/restr_hor.svg"),
tr("Restrict Horizontal"), agm->restriction);
restrictHorizontal->setObjectName("RestrictHorizontal");
restrictHorizontal->setCheckable(true);
connect(restrictHorizontal, SIGNAL(triggered()), this, SLOT(actionTriggered()));
this->addAction(restrictHorizontal);
restrictVertical = new QAction(QIcon(":/icons/restr_ver.svg"),
tr("Restrict Vertical"), agm->restriction);
restrictVertical->setObjectName("RestrictVertical");
restrictVertical->setCheckable(true);
connect(restrictVertical, SIGNAL(triggered()), this, SLOT(actionTriggered()));
this->addAction(restrictVertical);
restrictOrthogonal = new QAction(QIcon(":/icons/restr_ortho.svg"),
tr("Restrict Orthogonal"), agm->restriction);
restrictOrthogonal->setObjectName("RestrictOrthogonal");
restrictOrthogonal->setCheckable(true);
connect(restrictOrthogonal, SIGNAL(triggered(bool)), this,
SLOT(slotRestrictOrthogonal(bool)));
this->addAction(restrictOrthogonal);
restrictNothing = new QAction(QIcon(":/extui/restrictnothing.png"),
tr("Restrict Nothing"), agm->restriction);
restrictNothing->setObjectName("RestrictNothing");
restrictNothing->setCheckable(true);
connect(restrictNothing, SIGNAL(triggered(bool)), this,
SLOT(slotRestrictNothing(bool)));
this->addSeparator();
bRelZero = new QAction(QIcon(":/icons/set_rel_zero.svg"), tr("Set relative zero position"), agm->other);
bRelZero->setObjectName("SetRelativeZero");
bRelZero->setCheckable(false);
connect(bRelZero, SIGNAL(triggered()), actionHandler, SLOT(slotSetRelativeZero()));
//connect(bRelZero, SIGNAL(triggered()), this, SLOT(slotSetRelativeZero()));
this->addAction(bRelZero);
bLockRelZero = new QAction(QIcon(":/icons/lock_rel_zero.svg"), tr("Lock relative zero position"), agm->other);
bLockRelZero->setObjectName("LockRelativeZero");
bLockRelZero->setCheckable(true);
connect(bLockRelZero, SIGNAL(toggled(bool)),actionHandler, SLOT(slotLockRelativeZero(bool)));
this->addAction(bLockRelZero);
//restore snapMode from saved preferences
RS_SETTINGS->beginGroup("/Snap");
setSnaps( RS_SnapMode::fromInt( RS_SETTINGS->readNumEntry( "/SnapMode", 0)));
RS_SETTINGS->endGroup();
}
void QG_SnapToolBar::saveSnapMode()
{
//@write default snap mode from prefrences.
unsigned int snapFlags {RS_SnapMode::toInt( getSnaps())};
RS_SETTINGS->beginGroup("/Snap");
RS_SETTINGS->writeEntry("/SnapMode",QString::number(snapFlags));
RS_SETTINGS->endGroup();
// no need to delete child widgets, Qt does it all for us
}
void QG_SnapToolBar::setSnaps ( RS_SnapMode const& s )
{
if(getSnaps()==s) return;
snapFree->setChecked(s.snapFree);
snapGrid->setChecked(s.snapGrid);
snapEnd->setChecked(s.snapEndpoint);
snapOnEntity->setChecked(s.snapOnEntity);
snapCenter->setChecked(s.snapCenter);
snapMiddle->setChecked(s.snapMiddle);
snapDistance->setChecked(s.snapDistance);
snapIntersection->setChecked(s.snapIntersection);
restrictHorizontal->setChecked(s.restriction==RS2::RestrictHorizontal || s.restriction==RS2::RestrictOrthogonal);
restrictVertical->setChecked(s.restriction==RS2::RestrictVertical || s.restriction==RS2::RestrictOrthogonal);
restrictOrthogonal->setChecked(s.restriction==RS2::RestrictOrthogonal);
restrictNothing->setChecked(s.restriction==RS2::RestrictNothing);
}
RS_SnapMode QG_SnapToolBar::getSnaps ( void ) const
{
RS_SnapMode s;
s.snapFree = snapFree->isChecked();
s.snapGrid = snapGrid->isChecked();
s.snapEndpoint = snapEnd->isChecked();
s.snapOnEntity = snapOnEntity->isChecked();
s.snapCenter = snapCenter->isChecked();
s.snapMiddle = snapMiddle->isChecked();
s.snapDistance = snapDistance->isChecked();
s.snapIntersection = snapIntersection->isChecked();
// removed Restrict Othogonal button
// todo simplify internal restrict rules
int const rH = (restrictHorizontal && restrictHorizontal->isChecked())? 1:0;
int const rV = (restrictVertical && restrictVertical->isChecked())? 2: 0;
switch (rH + rV) {
case 3:
s.restriction = RS2::RestrictOrthogonal;
break;
case 2:
s.restriction = RS2::RestrictVertical;
break;
case 1:
s.restriction = RS2::RestrictHorizontal;
break;
default:
s.restriction = RS2::RestrictNothing;
}
return s;
}
bool QG_SnapToolBar::lockedRelativeZero() const
{
return bLockRelZero->isChecked();
}
void QG_SnapToolBar::setLockedRelativeZero(bool on)
{
bLockRelZero->setChecked(on);
}
void QG_SnapToolBar::setActionHandler(QG_ActionHandler* ah){
actionHandler=ah;
}
/* Slots */
void QG_SnapToolBar::slotRestrictNothing(bool checked)
{
if( restrictVertical) restrictVertical->setChecked(!checked);
if( restrictHorizontal) restrictHorizontal->setChecked(!checked);
if( restrictOrthogonal) restrictOrthogonal->setChecked(!checked);
actionTriggered();
}
void QG_SnapToolBar::slotRestrictOrthogonal(bool checked)
{
if( restrictVertical) restrictVertical->setChecked(checked);
if( restrictHorizontal) restrictHorizontal->setChecked(checked);
if( restrictNothing) restrictNothing->setChecked(checked);
actionTriggered();
}
void QG_SnapToolBar::actionTriggered()
{
actionHandler->slotSetSnaps(getSnaps());
}