// /// Sets the position of the thumb and always redraws. /// Moves the thumb to the position specified in thumbPos. If thumbPos is outside /// the present range of the slider, the thumb is moved to the closest position /// within the specified range. Overloads TScrollBar's virtual function. /// /// Redraw is optional. // void TSlider::SetPosition(int pos, bool redraw) { // Constrain pos to be in the range "Min .. Max" & snap to tics if enabled // pos = SnapPos(pos); // Slide thumb to new position, converting pos to pixels // if (GetHandle()) { SendMessage(TBM_SETPOS, redraw, pos); } Pos = pos; }
EXPORT STATUS_T CreateCurve( wAction_t action, coOrd pos, BOOL_T track, wDrawColor color, DIST_T width, long mode, curveMessageProc message ) { DIST_T d; ANGLE_T a; static coOrd pos0; int inx; switch ( action ) { case C_START: DYNARR_SET( trkSeg_t, tempSegs_da, 8 ); switch ( curveMode ) { case crvCmdFromEP1: InfoMessage( _("Drag from End-Point in direction of curve") ); break; case crvCmdFromTangent: InfoMessage( _("Drag from End-Point to Center") ); break; case crvCmdFromCenter: InfoMessage( _("Drag from Center to End-Point") ); break; case crvCmdFromChord: InfoMessage( _("Drag to other end of chord") ); break; } return C_CONTINUE; case C_DOWN: for ( inx=0; inx<8; inx++ ) { tempSegs(inx).color = wDrawColorBlack; tempSegs(inx).width = 0; } tempSegs_da.cnt = 0; SnapPos( &pos ); pos0 = pos; switch (mode) { case crvCmdFromEP1: tempSegs(0).type = (track?SEG_STRTRK:SEG_STRLIN); tempSegs(0).color = color; tempSegs(0).width = width; message( _("Drag to set angle") ); break; case crvCmdFromTangent: case crvCmdFromCenter: tempSegs(0).type = SEG_STRLIN; tempSegs(1).type = SEG_CRVLIN; tempSegs(1).u.c.radius = mainD.scale*0.05; tempSegs(1).u.c.a0 = 0; tempSegs(1).u.c.a1 = 360; tempSegs(2).type = SEG_STRLIN; message( mode==crvCmdFromTangent?_("Drag from End-Point to Center"):_("Drag from Center to End-Point") ); break; case crvCmdFromChord: tempSegs(0).type = (track?SEG_STRTRK:SEG_STRLIN); tempSegs(0).color = color; tempSegs(0).width = width; message( _("Drag to other end of chord") ); break; } tempSegs(0).u.l.pos[0] = pos; return C_CONTINUE; case C_MOVE: tempSegs(0).u.l.pos[1] = pos; d = FindDistance( pos0, pos ); a = FindAngle( pos0, pos ); switch ( mode ) { case crvCmdFromEP1: message( _("Angle=%0.3f"), PutAngle(a) ); tempSegs_da.cnt = 1; break; case crvCmdFromTangent: message( _("Radius=%s Angle=%0.3f"), FormatDistance(d), PutAngle(a) ); tempSegs(1).u.c.center = pos; DrawArrowHeads( &tempSegs(2), pos0, FindAngle(pos0,pos)+90, TRUE, wDrawColorBlack ); tempSegs_da.cnt = 7; break; case crvCmdFromCenter: message( _("Radius=%s Angle=%0.3f"), FormatDistance(d), PutAngle(a) ); tempSegs(1).u.c.center = pos0; DrawArrowHeads( &tempSegs(2), pos, FindAngle(pos,pos0)+90, TRUE, wDrawColorBlack ); tempSegs_da.cnt = 7; break; case crvCmdFromChord: message( _("Length=%s Angle=%0.3f"), FormatDistance(d), PutAngle(a) ); if ( d > mainD.scale*0.25 ) { pos.x = (pos.x+pos0.x)/2.0; pos.y = (pos.y+pos0.y)/2.0; DrawArrowHeads( &tempSegs(1), pos, FindAngle(pos,pos0)+90, TRUE, wDrawColorBlack ); tempSegs_da.cnt = 6; } else { tempSegs_da.cnt = 1; } break; } return C_CONTINUE; case C_UP: switch (mode) { case crvCmdFromEP1: DrawArrowHeads( &tempSegs(1), pos, FindAngle(pos,pos0)+90, TRUE, drawColorRed ); tempSegs_da.cnt = 6; break; case crvCmdFromChord: tempSegs(1).color = drawColorRed; case crvCmdFromTangent: case crvCmdFromCenter: tempSegs(2).color = drawColorRed; tempSegs(3).color = drawColorRed; tempSegs(4).color = drawColorRed; tempSegs(5).color = drawColorRed; tempSegs(6).color = drawColorRed; break; } message( _("Drag on Red arrows to adjust curve") ); return C_CONTINUE; default: return C_CONTINUE; } }
static STATUS_T CmdCircleCommon( wAction_t action, coOrd pos, BOOL_T helix ) { track_p t; static coOrd pos0; wControl_p controls[2]; char * labels[1]; switch (action) { case C_START: if (helix) { if (helixW == NULL) helixW = ParamCreateDialog( &helixPG, MakeWindowTitle(_("Helix")), NULL, NULL, HelixCancel, TRUE, NULL, 0, ComputeHelix ); ParamLoadControls( &helixPG ); ParamGroupRecord( &helixPG ); ComputeHelix( NULL, 6, NULL ); wShow( helixW ); memset( h_orders, 0, sizeof h_orders ); h_clock = 0; } else { ParamLoadControls( &circleRadiusPG ); ParamGroupRecord( &circleRadiusPG ); switch ( circleMode ) { case circleCmdFixedRadius: controls[0] = circleRadiusPLs[0].control; controls[1] = NULL; labels[0] = N_("Circle Radius"); InfoSubstituteControls( controls, labels ); break; case circleCmdFromTangent: InfoSubstituteControls( NULL, NULL ); InfoMessage( _("Click on Circle Edge") ); break; case circleCmdFromCenter: InfoSubstituteControls( NULL, NULL ); InfoMessage( _("Click on Circle Center") ); break; } } tempSegs_da.cnt = 0; return C_CONTINUE; case C_DOWN: DYNARR_SET( trkSeg_t, tempSegs_da, 1 ); tempSegs_da.cnt = 0; if (helix) { if (helixRadius <= 0.0) { ErrorMessage( MSG_RADIUS_GTR_0 ); return C_ERROR; } if (helixTurns <= 0) { ErrorMessage( MSG_HELIX_TURNS_GTR_0 ); return C_ERROR; } ParamLoadData( &helixPG ); } else { ParamLoadData( &circleRadiusPG ); switch( circleMode ) { case circleCmdFixedRadius: if (circleRadius <= 0.0) { ErrorMessage( MSG_RADIUS_GTR_0 ); return C_ERROR; } break; case circleCmdFromTangent: InfoSubstituteControls( NULL, NULL ); InfoMessage( _("Drag to Center") ); break; case circleCmdFromCenter: InfoSubstituteControls( NULL, NULL ); InfoMessage( _("Drag to Edge") ); break; } } SnapPos( &pos ); tempSegs(0).u.c.center = pos0 = pos; tempSegs(0).color = wDrawColorBlack; tempSegs(0).width = 0; return C_CONTINUE; case C_MOVE: DrawSegs( &tempD, zero, 0.0, &tempSegs(0), tempSegs_da.cnt, trackGauge, wDrawColorBlack ); SnapPos( &pos ); tempSegs(0).u.c.center = pos; if ( !helix ) { switch ( circleMode ) { case circleCmdFixedRadius: break; case circleCmdFromCenter: tempSegs(0).u.c.center = pos0; circleRadius = FindDistance( tempSegs(0).u.c.center, pos ); InfoMessage( _("Radius=%s"), FormatDistance(circleRadius) ); break; case circleCmdFromTangent: circleRadius = FindDistance( tempSegs(0).u.c.center, pos0 ); InfoMessage( _("Radius=%s"), FormatDistance(circleRadius) ); break; } } tempSegs(0).type = SEG_CRVTRK; tempSegs(0).u.c.radius = helix?helixRadius:circleRadius; tempSegs(0).u.c.a0 = 0.0; tempSegs(0).u.c.a1 = 360.0; tempSegs_da.cnt = 1; DrawSegs( &tempD, zero, 0.0, &tempSegs(0), tempSegs_da.cnt, trackGauge, wDrawColorBlack ); return C_CONTINUE; case C_UP: DrawSegs( &tempD, zero, 0.0, &tempSegs(0), tempSegs_da.cnt, trackGauge, wDrawColorBlack ); if ( helix ) { UndoStart( _("Create Helix Track"), "newHelix" ); t = NewCurvedTrack( tempSegs(0).u.c.center, helixRadius, 0.0, 0.0, helixTurns ); } else { if ( circleRadius <= 0 ) { ErrorMessage( MSG_RADIUS_GTR_0 ); return C_ERROR; } UndoStart( _("Create Circle Track"), "newCircle" ); t = NewCurvedTrack( tempSegs(0).u.c.center, circleRadius, 0.0, 0.0, 0 ); } UndoEnd(); DrawNewTrack(t); if (helix) wHide( helixW ); else InfoSubstituteControls( NULL, NULL ); tempSegs_da.cnt = 0; return C_TERMINATE; case C_REDRAW: DrawSegs( &tempD, zero, 0.0, &tempSegs(0), tempSegs_da.cnt, trackGauge, wDrawColorBlack ); return C_CONTINUE; case C_CANCEL: if (helix) wHide( helixW ); else InfoSubstituteControls( NULL, NULL ); return C_CONTINUE; default: return C_CONTINUE; } }
static STATUS_T CmdCurve( wAction_t action, coOrd pos ) { track_p t; DIST_T d; static int segCnt; STATUS_T rc = C_CONTINUE; switch (action) { case C_START: curveMode = (long)commandContext; Da.state = -1; tempSegs_da.cnt = 0; return CreateCurve( action, pos, TRUE, wDrawColorBlack, 0, curveMode, InfoMessage ); case C_TEXT: if ( Da.state == 0 ) return CreateCurve( action, pos, TRUE, wDrawColorBlack, 0, curveMode, InfoMessage ); else return C_CONTINUE; case C_DOWN: if ( Da.state == -1 ) { SnapPos( &pos ); Da.pos0 = pos; Da.state = 0; return CreateCurve( action, pos, TRUE, wDrawColorBlack, 0, curveMode, InfoMessage ); } else { tempSegs_da.cnt = segCnt; return C_CONTINUE; } case C_MOVE: mainD.funcs->options = wDrawOptTemp; DrawSegs( &mainD, zero, 0.0, &tempSegs(0), tempSegs_da.cnt, trackGauge, wDrawColorBlack ); if ( Da.state == 0 ) { SnapPos( &pos ); Da.pos1 = pos; rc = CreateCurve( action, pos, TRUE, wDrawColorBlack, 0, curveMode, InfoMessage ); } else { SnapPos( &pos ); PlotCurve( curveMode, Da.pos0, Da.pos1, pos, &Da.curveData, TRUE ); if (Da.curveData.type == curveTypeStraight) { tempSegs(0).type = SEG_STRTRK; tempSegs(0).u.l.pos[0] = Da.pos0; tempSegs(0).u.l.pos[1] = Da.curveData.pos1; tempSegs_da.cnt = 1; InfoMessage( _("Straight Track: Length=%s Angle=%0.3f"), FormatDistance(FindDistance( Da.pos0, Da.curveData.pos1 )), PutAngle(FindAngle( Da.pos0, Da.curveData.pos1 )) ); } else if (Da.curveData.type == curveTypeNone) { tempSegs_da.cnt = 0; InfoMessage( _("Back") ); } else if (Da.curveData.type == curveTypeCurve) { tempSegs(0).type = SEG_CRVTRK; tempSegs(0).u.c.center = Da.curveData.curvePos; tempSegs(0).u.c.radius = Da.curveData.curveRadius; tempSegs(0).u.c.a0 = Da.curveData.a0; tempSegs(0).u.c.a1 = Da.curveData.a1; tempSegs_da.cnt = 1; d = D2R(Da.curveData.a1); if (d < 0.0) d = 2*M_PI+d; if ( d*Da.curveData.curveRadius > mapD.size.x+mapD.size.y ) { ErrorMessage( MSG_CURVE_TOO_LARGE ); tempSegs_da.cnt = 0; Da.curveData.type = curveTypeNone; mainD.funcs->options = 0; return C_CONTINUE; } InfoMessage( _("Curved Track: Radius=%s Angle=%0.3f Length=%s"), FormatDistance(Da.curveData.curveRadius), Da.curveData.a1, FormatDistance(Da.curveData.curveRadius*d) ); } } DrawSegs( &mainD, zero, 0.0, &tempSegs(0), tempSegs_da.cnt, trackGauge, wDrawColorBlack ); mainD.funcs->options = 0; return rc; case C_UP: mainD.funcs->options = wDrawOptTemp; DrawSegs( &mainD, zero, 0.0, &tempSegs(0), tempSegs_da.cnt, trackGauge, wDrawColorBlack ); if (Da.state == 0) { SnapPos( &pos ); Da.pos1 = pos; Da.state = 1; CreateCurve( action, pos, TRUE, wDrawColorBlack, 0, curveMode, InfoMessage ); DrawSegs( &mainD, zero, 0.0, &tempSegs(0), tempSegs_da.cnt, trackGauge, wDrawColorBlack ); mainD.funcs->options = 0; segCnt = tempSegs_da.cnt; InfoMessage( _("Drag on Red arrows to adjust curve") ); return C_CONTINUE; } else { mainD.funcs->options = 0; tempSegs_da.cnt = 0; Da.state = -1; if (Da.curveData.type == curveTypeStraight) { if ((d=FindDistance( Da.pos0, Da.curveData.pos1 )) <= minLength) { ErrorMessage( MSG_TRK_TOO_SHORT, "Curved ", PutDim(fabs(minLength-d)) ); return C_TERMINATE; } UndoStart( _("Create Straight Track"), "newCurve - straight" ); t = NewStraightTrack( Da.pos0, Da.curveData.pos1 ); UndoEnd(); } else if (Da.curveData.type == curveTypeCurve) { if ((d= Da.curveData.curveRadius * Da.curveData.a1 *2.0*M_PI/360.0) <= minLength) { ErrorMessage( MSG_TRK_TOO_SHORT, "Curved ", PutDim(fabs(minLength-d)) ); return C_TERMINATE; } UndoStart( _("Create Curved Track"), "newCurve - curve" ); t = NewCurvedTrack( Da.curveData.curvePos, Da.curveData.curveRadius, Da.curveData.a0, Da.curveData.a1, 0 ); UndoEnd(); } else { return C_ERROR; } DrawNewTrack( t ); return C_TERMINATE; } case C_REDRAW: if ( Da.state >= 0 ) { mainD.funcs->options = wDrawOptTemp; DrawSegs( &mainD, zero, 0.0, &tempSegs(0), tempSegs_da.cnt, trackGauge, wDrawColorBlack ); mainD.funcs->options = 0; } return C_CONTINUE; case C_CANCEL: if (Da.state == 1) { mainD.funcs->options = wDrawOptTemp; DrawSegs( &mainD, zero, 0.0, &tempSegs(0), tempSegs_da.cnt, trackGauge, wDrawColorBlack ); mainD.funcs->options = 0; tempSegs_da.cnt = 0; } Da.state = -1; return C_CONTINUE; } return C_CONTINUE; }