void CTECHashTable<Type>:: add(HashNode<Type> currentNode){ if(!contains(currentNode)){ //resize if needed if(size/capacity >= this->efficiencyPercentage){ updateCapacity(); } int insertionIndex = findPosition(currentNode); if(internalStorage[insertionIndex] != nullptr){ insertionIndex = handleCollision(currentNode); while (internalStorage[insertionIndex] != nullptr){ insertionIndex = (insertionIndex + 1)% capacity; } } internalStorage[insertionIndex] = currentNode; size ++; } }
void HashTable<Type> :: add(HashNode<Type> currentNode) { if (!contains(currentNode)) { if(size/capacity >= this->efficiencyPercentage) { updateCapacity(); } int positionToInsert = findPosition(currentNode); if(internalStorage[positionToInsert] != nullptr) { while(internalStorage[positionToInsert] != nullptr) { positionToInsert = handleCollision(currentNode); } } internalStorage[positionToInsert] = ¤tNode; size++; } }
QgsAdvancedDigitizingDockWidget::QgsAdvancedDigitizingDockWidget( QgsMapCanvas *canvas, QWidget *parent ) : QgsDockWidget( parent ) , mMapCanvas( canvas ) , mCurrentMapToolSupportsCad( false ) , mCadEnabled( false ) , mConstructionMode( false ) , mCommonAngleConstraint( QgsSettings().value( QStringLiteral( "/Cad/CommonAngle" ), 90 ).toInt() ) , mSnappedToVertex( false ) , mSessionActive( false ) , mErrorMessage( nullptr ) { setupUi( this ); mCadPaintItem = new QgsAdvancedDigitizingCanvasItem( canvas, this ); mAngleConstraint.reset( new CadConstraint( mAngleLineEdit, mLockAngleButton, mRelativeAngleButton, mRepeatingLockAngleButton ) ); mDistanceConstraint.reset( new CadConstraint( mDistanceLineEdit, mLockDistanceButton, nullptr, mRepeatingLockDistanceButton ) ); mXConstraint.reset( new CadConstraint( mXLineEdit, mLockXButton, mRelativeXButton, mRepeatingLockXButton ) ); mYConstraint.reset( new CadConstraint( mYLineEdit, mLockYButton, mRelativeYButton, mRepeatingLockYButton ) ); mAdditionalConstraint = NoConstraint; mMapCanvas->installEventFilter( this ); mAngleLineEdit->installEventFilter( this ); mDistanceLineEdit->installEventFilter( this ); mXLineEdit->installEventFilter( this ); mYLineEdit->installEventFilter( this ); // this action is also used in the advanced digitizing tool bar mEnableAction = new QAction( this ); mEnableAction->setText( tr( "Enable advanced digitizing tools" ) ); mEnableAction->setIcon( QgsApplication::getThemeIcon( QStringLiteral( "/cadtools/cad.svg" ) ) ); mEnableAction->setCheckable( true ); mEnabledButton->addAction( mEnableAction ); mEnabledButton->setDefaultAction( mEnableAction ); // Connect the UI to the event filter to update constraints connect( mEnableAction, &QAction::triggered, this, &QgsAdvancedDigitizingDockWidget::activateCad ); connect( mConstructionModeButton, &QAbstractButton::clicked, this, &QgsAdvancedDigitizingDockWidget::setConstructionMode ); connect( mParallelButton, &QAbstractButton::clicked, this, &QgsAdvancedDigitizingDockWidget::additionalConstraintClicked ); connect( mPerpendicularButton, &QAbstractButton::clicked, this, &QgsAdvancedDigitizingDockWidget::additionalConstraintClicked ); connect( mLockAngleButton, &QAbstractButton::clicked, this, &QgsAdvancedDigitizingDockWidget::lockConstraint ); connect( mLockDistanceButton, &QAbstractButton::clicked, this, &QgsAdvancedDigitizingDockWidget::lockConstraint ); connect( mLockXButton, &QAbstractButton::clicked, this, &QgsAdvancedDigitizingDockWidget::lockConstraint ); connect( mLockYButton, &QAbstractButton::clicked, this, &QgsAdvancedDigitizingDockWidget::lockConstraint ); connect( mRelativeAngleButton, &QAbstractButton::clicked, this, &QgsAdvancedDigitizingDockWidget::setConstraintRelative ); connect( mRelativeXButton, &QAbstractButton::clicked, this, &QgsAdvancedDigitizingDockWidget::setConstraintRelative ); connect( mRelativeYButton, &QAbstractButton::clicked, this, &QgsAdvancedDigitizingDockWidget::setConstraintRelative ); connect( mRepeatingLockDistanceButton, &QAbstractButton::clicked, this, &QgsAdvancedDigitizingDockWidget::setConstraintRepeatingLock ); connect( mRepeatingLockAngleButton, &QAbstractButton::clicked, this, &QgsAdvancedDigitizingDockWidget::setConstraintRepeatingLock ); connect( mRepeatingLockXButton, &QAbstractButton::clicked, this, &QgsAdvancedDigitizingDockWidget::setConstraintRepeatingLock ); connect( mRepeatingLockYButton, &QAbstractButton::clicked, this, &QgsAdvancedDigitizingDockWidget::setConstraintRepeatingLock ); connect( mAngleLineEdit, &QLineEdit::returnPressed, this, [ = ]() { lockConstraint(); } ); connect( mDistanceLineEdit, &QLineEdit::returnPressed, this, [ = ]() { lockConstraint(); } ); connect( mXLineEdit, &QLineEdit::returnPressed, this, [ = ]() { lockConstraint(); } ); connect( mYLineEdit, &QLineEdit::returnPressed, this, [ = ]() { lockConstraint(); } ); connect( mAngleLineEdit, &QLineEdit::textEdited, this, &QgsAdvancedDigitizingDockWidget::constraintTextEdited ); connect( mDistanceLineEdit, &QLineEdit::textEdited, this, &QgsAdvancedDigitizingDockWidget::constraintTextEdited ); connect( mXLineEdit, &QLineEdit::textEdited, this, &QgsAdvancedDigitizingDockWidget::constraintTextEdited ); connect( mYLineEdit, &QLineEdit::textEdited, this, &QgsAdvancedDigitizingDockWidget::constraintTextEdited ); //also watch for focus out events on these widgets QgsFocusWatcher *angleWatcher = new QgsFocusWatcher( mAngleLineEdit ); connect( angleWatcher, &QgsFocusWatcher::focusOut, this, &QgsAdvancedDigitizingDockWidget::constraintFocusOut ); QgsFocusWatcher *distanceWatcher = new QgsFocusWatcher( mDistanceLineEdit ); connect( distanceWatcher, &QgsFocusWatcher::focusOut, this, &QgsAdvancedDigitizingDockWidget::constraintFocusOut ); QgsFocusWatcher *xWatcher = new QgsFocusWatcher( mXLineEdit ); connect( xWatcher, &QgsFocusWatcher::focusOut, this, &QgsAdvancedDigitizingDockWidget::constraintFocusOut ); QgsFocusWatcher *yWatcher = new QgsFocusWatcher( mYLineEdit ); connect( yWatcher, &QgsFocusWatcher::focusOut, this, &QgsAdvancedDigitizingDockWidget::constraintFocusOut ); // config menu QMenu *menu = new QMenu( this ); // common angles QActionGroup *angleButtonGroup = new QActionGroup( menu ); // actions are exclusive for common angles mCommonAngleActions = QMap<QAction *, int>(); QList< QPair< int, QString > > commonAngles; commonAngles << QPair<int, QString>( 0, trUtf8( "Do not snap to common angles" ) ); commonAngles << QPair<int, QString>( 30, trUtf8( "Snap to 30° angles" ) ); commonAngles << QPair<int, QString>( 45, trUtf8( "Snap to 45° angles" ) ); commonAngles << QPair<int, QString>( 90, trUtf8( "Snap to 90° angles" ) ); for ( QList< QPair< int, QString > >::const_iterator it = commonAngles.constBegin(); it != commonAngles.constEnd(); ++it ) { QAction *action = new QAction( it->second, menu ); action->setCheckable( true ); action->setChecked( it->first == mCommonAngleConstraint ); menu->addAction( action ); angleButtonGroup->addAction( action ); mCommonAngleActions.insert( action, it->first ); } mSettingsButton->setMenu( menu ); connect( mSettingsButton, SIGNAL( triggered( QAction * ) ), this, SLOT( settingsButtonTriggered( QAction * ) ) ); // set tooltips mConstructionModeButton->setToolTip( "<b>" + tr( "Construction mode" ) + "</b><br>(" + tr( "press c to toggle on/off" ) + ")" ); mDistanceLineEdit->setToolTip( "<b>" + tr( "Distance" ) + "</b><br>(" + tr( "press d for quick access" ) + ")" ); mLockDistanceButton->setToolTip( "<b>" + tr( "Lock distance" ) + "</b><br>(" + tr( "press Ctrl + d for quick access" ) + ")" ); mRepeatingLockDistanceButton->setToolTip( "<b>" + tr( "Continuously lock distance" ) + "</b>" ); mRelativeAngleButton->setToolTip( "<b>" + tr( "Toggles relative angle to previous segment" ) + "</b><br>(" + tr( "press Shift + a for quick access" ) + ")" ); mAngleLineEdit->setToolTip( "<b>" + tr( "Angle" ) + "</b><br>(" + tr( "press a for quick access" ) + ")" ); mLockAngleButton->setToolTip( "<b>" + tr( "Lock angle" ) + "</b><br>(" + tr( "press Ctrl + a for quick access" ) + ")" ); mRepeatingLockAngleButton->setToolTip( "<b>" + tr( "Continuously lock angle" ) + "</b>" ); mRelativeXButton->setToolTip( "<b>" + tr( "Toggles relative x to previous node" ) + "</b><br>(" + tr( "press Shift + x for quick access" ) + ")" ); mXLineEdit->setToolTip( "<b>" + tr( "X coordinate" ) + "</b><br>(" + tr( "press x for quick access" ) + ")" ); mLockXButton->setToolTip( "<b>" + tr( "Lock x coordinate" ) + "</b><br>(" + tr( "press Ctrl + x for quick access" ) + ")" ); mRepeatingLockXButton->setToolTip( "<b>" + tr( "Continuously lock x coordinate" ) + "</b>" ); mRelativeYButton->setToolTip( "<b>" + tr( "Toggles relative y to previous node" ) + "</b><br>(" + tr( "press Shift + y for quick access" ) + ")" ); mYLineEdit->setToolTip( "<b>" + tr( "Y coordinate" ) + "</b><br>(" + tr( "press y for quick access" ) + ")" ); mLockYButton->setToolTip( "<b>" + tr( "Lock y coordinate" ) + "</b><br>(" + tr( "press Ctrl + y for quick access" ) + ")" ); mRepeatingLockYButton->setToolTip( "<b>" + tr( "Continuously lock y coordinate" ) + "</b>" ); updateCapacity( true ); connect( QgsProject::instance(), &QgsProject::snappingConfigChanged, this, [ = ] { updateCapacity( true ); } ); disable(); }