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

435 lines
13 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 <QMouseEvent>
#include "qg_cadtoolbar.h"
#include "rs_dialogfactory.h"
#include "rs_actioninterface.h"
#include "qg_cadtoolbararcs.h"
#include "qg_cadtoolbarcircles.h"
#include "qg_cadtoolbardim.h"
#include "qg_cadtoolbarellipses.h"
#include "qg_cadtoolbarinfo.h"
#include "qg_cadtoolbarlines.h"
#include "qg_cadtoolbarmain.h"
#include "qg_cadtoolbarmodify.h"
#include "qg_cadtoolbarpolylines.h"
#include "qg_cadtoolbarselect.h"
#include "qg_cadtoolbarsplines.h"
#include "rs_debug.h"
#include "qc_applicationwindow.h"
/*
* Constructs a QG_CadToolBar as a child of 'parent', with the
* name 'name' and widget flags set to 'f'.
*/
QG_CadToolBar::QG_CadToolBar(QWidget* parent, const char* name)
: QToolBar(parent)
,actionHandler(nullptr)
{
setObjectName(name);
setCursor(Qt::ArrowCursor);
#if QT_VERSION >= 0x050500
auto const dPxlRatio=QC_ApplicationWindow::getAppWindow()->devicePixelRatio();
setMinimumSize(73*dPxlRatio,400*dPxlRatio);
#else
setMinimumSize(73,400);
#endif
setAllowedAreas(Qt::LeftToolBarArea | Qt::RightToolBarArea);
setFloatable(false);
init();
}
/*
* Sets the strings of the subwidgets using the current
* language.
*/
//void QG_CadToolBar::languageChange()
//{
// retranslateUi(this);
//}
void QG_CadToolBar::init() {
//create sub cad toolbars
const std::initializer_list<LC_CadToolBarInterface*> tbs={
new QG_CadToolBarMain(this)
,new QG_CadToolBarLines(this)
,new QG_CadToolBarArcs(this)
,new QG_CadToolBarCircles(this)
,new QG_CadToolBarEllipses(this)
,new QG_CadToolBarSplines(this)
,new QG_CadToolBarPolylines(this)
,new QG_CadToolBarDim(this)
,new QG_CadToolBarInfo(this)
,new QG_CadToolBarModify(this)
,new QG_CadToolBarSelect(this)
};
for(auto p: tbs){
p->hide();
m_toolbars[p->rtti()]= p;
}
}
QSize QG_CadToolBar::sizeHint() const
{
return QSize(-1, -1);
}
void QG_CadToolBar::populateSubToolBar(const std::vector<QAction*>& actions, RS2::ToolBarId toolbarID)
{
RS_DEBUG->print("QG_CadToolBar::populateSubToolBar(): begin\n");
if(!m_toolbars.count(toolbarID)) return;
LC_CadToolBarInterface*const p = m_toolbars[toolbarID];
p->addSubActions(actions, true);
RS_DEBUG->print("QG_CadToolBar::populateSubToolBar(): end\n");
}
/**
* Called from the sub toolbar
*/
void QG_CadToolBar::back() {
finishCurrentAction(false);
showPreviousToolBar(true);
// emit(signalBack());
}
void QG_CadToolBar::finishCurrentAction(bool resetToolBar)
{
if(!actionHandler) return;
RS_ActionInterface* currentAction =actionHandler->getCurrentAction();
if(currentAction) {
currentAction->finish(resetToolBar); //finish the action, but do not update toolBar
}
}
/**
* Called from the application.
*/
void QG_CadToolBar::forceNext() {
if(activeToolbars.size()==0) return;
auto p=activeToolbars.back();
if (p && p->rtti() == RS2::ToolBarSelect)
p->runNextAction();
}
void QG_CadToolBar::mouseReleaseEvent(QMouseEvent* e) {
if (e->button()==Qt::RightButton) {
back();
e->accept();
}
}
void QG_CadToolBar::contextMenuEvent(QContextMenuEvent *e) {
e->accept();
}
/**
* Creates all tool bars and shows the main toolbar.
*
* @param ah Pointer to action handler which will deal with the actions in this tool bar.
*/
void QG_CadToolBar::setActionHandler(QG_ActionHandler* ah) {
actionHandler = ah;
for(const auto& p: m_toolbars){
p.second->setActionHandler(ah);
}
}
void QG_CadToolBar::hideSubToolBars(){
for(auto p: activeToolbars){
p->hide();
}
}
void QG_CadToolBar::showSubToolBar(){
LC_CadToolBarInterface* const p = activeToolbars.back();
if (!p->isVisible()) { // On OSX, without this line LibreCAD wuld crash. Not sure if it's a Qt problem or 'somewhere' logic within LibreCAD
//shift down to show the handle to move the toolbar
//has to be 20, 10 is not enough
p->move(0,20);
p->show();
}
p->resize(size());
adjustSize();
}
void QG_CadToolBar::showPreviousToolBar(bool cleanup) {
// cleanup mouse hint when showing previous tool bar, bug#3480121
RS_DIALOGFACTORY->updateMouseWidget();
// for(auto p: activeToolbars){
// qDebug()<<"QG_CadToolBar::showPreviousToolBar():begin "<<p->rtti();
// }
if(cleanup){
if(actionHandler) {
RS_ActionInterface* currentAction =actionHandler->getCurrentAction();
if(currentAction && currentAction->rtti() != RS2::ActionDefault) {
currentAction->finish(false); //finish the action, but do not update toolBar
}
}
if(activeToolbars.size()>1){
if(activeToolbars.back()) activeToolbars.back() ->setVisible(false);
activeToolbars.pop_back();
}
// std::cout<<"QG_CadToolBar::showPreviousToolBar(true): toolbars.size()="<<toolbars.size()<<std::endl;
showToolBar(activeToolbars.back()->rtti());
}else{
hideSubToolBars();
// std::cout<<"QG_CadToolBar::showPreviousToolBar(false): toolbars.size()="<<toolbars.size()<<std::endl;
if(activeToolbars.size()>1){
// std::cout<<"QG_CadToolBar::showPreviousToolBar(false): hide:"<<toolbarIDs[toolbars.size()-1]<<std::endl;
if (!activeToolbars.back()) activeToolbars.back()->setVisible(false);
activeToolbars.pop_back();
}
// std::cout<<"QG_CadToolBar::showPreviousToolBar(false): toolbars.size()="<<toolbars.size()<<std::endl;
showSubToolBar();
}
// for(auto p: activeToolbars){
// qDebug()<<"QG_CadToolBar::showPreviousToolBar():end "<<p->rtti();
// }
}
void QG_CadToolBar::showToolBar(RS2::ToolBarId id, bool restoreAction ) {
LC_CadToolBarInterface* newTb;
if(m_toolbars.count(id)){
newTb=m_toolbars[id];
}else{
newTb=m_toolbars[RS2::ToolBarMain];
}
if(restoreAction) newTb->restoreAction();
hideSubToolBars();
auto it=std::find(activeToolbars.begin(), activeToolbars.end(), newTb);
if(it != activeToolbars.end()){
activeToolbars.erase(it+1,activeToolbars.end());
}
if(!( activeToolbars.size()>0 && newTb == activeToolbars.back())) {
activeToolbars.push_back(newTb);
}
showSubToolBar();
adjustSize();
}
void QG_CadToolBar::resetToolBar() {
LC_CadToolBarInterface* currentTb=activeToolbars.back();
currentTb->resetToolBar();
}
void QG_CadToolBar::showToolBarMain() {
showToolBar(RS2::ToolBarMain);
}
void QG_CadToolBar::showToolBarLines() {
showToolBar(RS2::ToolBarLines);
}
void QG_CadToolBar::showToolBarArcs() {
showToolBar(RS2::ToolBarArcs);
}
void QG_CadToolBar::showToolBarEllipses() {
showToolBar(RS2::ToolBarEllipses);
}
void QG_CadToolBar::showToolBarSplines() {
showToolBar(RS2::ToolBarSplines);
}
void QG_CadToolBar::showToolBarPolylines() {
showToolBar(RS2::ToolBarPolylines);
}
void QG_CadToolBar::showToolBarCircles() {
showToolBar(RS2::ToolBarCircles);
}
void QG_CadToolBar::showToolBarInfo() {
showToolBar(RS2::ToolBarInfo);
}
void QG_CadToolBar::showToolBarModify() {
showToolBar(RS2::ToolBarModify);
}
void QG_CadToolBar::showToolBarDim() {
showToolBar(RS2::ToolBarDim);
}
void QG_CadToolBar::showToolBarSelect() {
showToolBarSelect(nullptr, -1);
}
void QG_CadToolBar::showToolBarSelect(RS_ActionInterface* selectAction,
int nextAction) {
auto p=m_toolbars[RS2::ToolBarSelect];
p->setNextAction(nextAction);
p->setSelectAction(selectAction);
showToolBar(RS2::ToolBarSelect);
showSubToolBar();
}
void QG_CadToolBar::showCadToolBar(RS2::ActionType actionType, bool cleanup){
RS2::ToolBarId id=RS2::ToolBarNone;
switch(actionType){
//no op
default:
return;
//default action resets toolbar, issue#295
case RS2::ActionDefault:
break;
case RS2::ActionDrawImage:
case RS2::ActionDrawPoint:
case RS2::ActionDrawMText:
id=RS2::ToolBarMain;
break;
case RS2::ActionDrawArc:
case RS2::ActionDrawArc3P:
case RS2::ActionDrawArcParallel:
case RS2::ActionDrawArcTangential:
id=RS2::ToolBarArcs;
break;
case RS2::ActionDrawCircle:
case RS2::ActionDrawCircle2P:
case RS2::ActionDrawCircle3P:
case RS2::ActionDrawCircleCR:
case RS2::ActionDrawCircleParallel:
case RS2::ActionDrawCircleInscribe:
case RS2::ActionDrawCircleTan2:
case RS2::ActionDrawCircleTan2_1P:
case RS2::ActionDrawCircleTan1_2P:
id=RS2::ToolBarCircles;
break;
case RS2::ActionDrawEllipseArcAxis:
case RS2::ActionDrawEllipseAxis:
case RS2::ActionDrawEllipseFociPoint:
case RS2::ActionDrawEllipse4Points:
case RS2::ActionDrawEllipseCenter3Points:
case RS2::ActionDrawEllipseInscribe:
id=RS2::ToolBarEllipses;
break;
case RS2::ActionDrawSpline:
case RS2::ActionDrawSplinePoints:
id=RS2::ToolBarSplines;
break;
case RS2::ActionDrawLine:
case RS2::ActionDrawLineAngle:
case RS2::ActionDrawLineBisector:
case RS2::ActionDrawLineFree:
case RS2::ActionDrawLineHorVert:
case RS2::ActionDrawLineHorizontal:
case RS2::ActionDrawLineOrthogonal:
case RS2::ActionDrawLineOrthTan:
case RS2::ActionDrawLineParallel:
case RS2::ActionDrawLineParallelThrough:
case RS2::ActionDrawLinePolygonCenCor:
case RS2::ActionDrawLinePolygonCorCor:
case RS2::ActionDrawLineRectangle:
case RS2::ActionDrawLineRelAngle:
case RS2::ActionDrawLineTangent1:
case RS2::ActionDrawLineTangent2:
case RS2::ActionDrawLineVertical:
id=RS2::ToolBarLines;
break;
case RS2::ActionDrawPolyline:
case RS2::ActionPolylineAdd:
case RS2::ActionPolylineAppend:
case RS2::ActionPolylineDel:
case RS2::ActionPolylineDelBetween:
case RS2::ActionPolylineTrim:
case RS2::ActionPolylineEquidistant:
case RS2::ActionPolylineSegment:
id=RS2::ToolBarPolylines;
break;
case RS2::ActionDimAligned:
case RS2::ActionDimLinear:
case RS2::ActionDimLinearVer:
case RS2::ActionDimLinearHor:
case RS2::ActionDimRadial:
case RS2::ActionDimDiametric:
case RS2::ActionDimAngular:
case RS2::ActionDimLeader:
id=RS2::ToolBarDim;
break;
case RS2::ActionModifyAttributes:
case RS2::ActionModifyAttributesNoSelect:
case RS2::ActionModifyDelete:
case RS2::ActionModifyDeleteNoSelect:
case RS2::ActionModifyDeleteQuick:
case RS2::ActionModifyDeleteFree:
case RS2::ActionModifyMove:
case RS2::ActionModifyMoveNoSelect:
case RS2::ActionModifyRotate:
case RS2::ActionModifyRotateNoSelect:
case RS2::ActionModifyScale:
case RS2::ActionModifyScaleNoSelect:
case RS2::ActionModifyMirror:
case RS2::ActionModifyMirrorNoSelect:
case RS2::ActionModifyMoveRotate:
case RS2::ActionModifyMoveRotateNoSelect:
case RS2::ActionModifyRotate2:
case RS2::ActionModifyRotate2NoSelect:
case RS2::ActionModifyEntity:
case RS2::ActionModifyTrim:
case RS2::ActionModifyTrim2:
case RS2::ActionModifyTrimAmount:
case RS2::ActionModifyCut:
case RS2::ActionModifyStretch:
case RS2::ActionModifyBevel:
case RS2::ActionModifyRound:
case RS2::ActionModifyOffset:
case RS2::ActionModifyOffsetNoSelect:
case RS2::ActionModifyRevertDirection:
case RS2::ActionModifyRevertDirectionNoSelect:
id=RS2::ToolBarModify;
break;
case RS2::ActionInfoInside:
case RS2::ActionInfoDist:
case RS2::ActionInfoDist2:
case RS2::ActionInfoAngle:
case RS2::ActionInfoTotalLength:
case RS2::ActionInfoTotalLengthNoSelect:
case RS2::ActionInfoArea:
id=RS2::ToolBarInfo;
break;
}
if(id != RS2::ToolBarNone){
m_toolbars[id]->showCadToolBar(actionType);
showToolBar(id, false);
}
if(cleanup){
if(actionHandler ) {
RS_ActionInterface* currentAction =actionHandler->getCurrentAction();
if(currentAction ) {
currentAction->finish(false); //finish the action, but do not update toolBar
}
}
}
}