summaryrefslogtreecommitdiff
path: root/app/bin/cselect.c
diff options
context:
space:
mode:
Diffstat (limited to 'app/bin/cselect.c')
-rw-r--r--app/bin/cselect.c982
1 files changed, 662 insertions, 320 deletions
diff --git a/app/bin/cselect.c b/app/bin/cselect.c
index 4e4e8eb..1b153b9 100644
--- a/app/bin/cselect.c
+++ b/app/bin/cselect.c
@@ -20,29 +20,25 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
-#include <math.h>
-#include <string.h>
-
+#include "common.h"
#include "draw.h"
#include "ccurve.h"
#include "tcornu.h"
#include "tbezier.h"
#include "track.h"
-#define PRIVATE_EXTRADATA
#include "compound.h"
#include "cselect.h"
#include "cundo.h"
#include "custom.h"
#include "fileio.h"
-#include "i18n.h"
#include "layout.h"
-#include "messages.h"
#include "param.h"
#include "track.h"
-#include "utility.h"
+#include "cjoin.h"
#include "draw.h"
#include "misc.h"
#include "trackx.h"
+#include "common-ui.h"
#include "bitmaps/bmendpt.xbm"
@@ -56,12 +52,12 @@
EXPORT wIndex_t selectCmdInx;
EXPORT wIndex_t moveCmdInx;
EXPORT wIndex_t rotateCmdInx;
+EXPORT wIndex_t flipCmdInx;
#define MAXMOVEMODE (3)
static long moveMode = MAXMOVEMODE;
static BOOL_T enableMoveDraw = TRUE;
static BOOL_T move0B;
-struct extraData { char junk[2000]; };
static wDrawBitMap_p endpt_bm;
static wDrawBitMap_p angle_bm[4];
@@ -70,8 +66,8 @@ track_p IsInsideABox(coOrd pos);
static track_p moveDescTrk;
static coOrd moveDescPos;
-int incrementalDrawLimit = 20;
- static int microCount = 0;
+int incrementalDrawLimit = 0;
+static int microCount = 0;
static dynArr_t tlist_da;
@@ -128,6 +124,7 @@ void CreateArrowAnchor(coOrd pos,ANGLE_T a,DIST_T len) {
anchors(i).u.l.pos[0] = pos;
Translate(&anchors(i).u.l.pos[1],pos,NormalizeAngle(a-135),len);
anchors(i).color = wDrawColorBlue;
+ wSetCursor(mainD.d,wCursorNone);
}
void static CreateRotateAnchor(coOrd pos) {
@@ -146,6 +143,16 @@ void static CreateRotateAnchor(coOrd pos) {
Translate(&head,pos,j*120,d*2);
CreateArrowAnchor(head,NormalizeAngle((j*120)+90),d);
}
+ DYNARR_APPEND(trkSeg_t,anchors_da,1);
+ i = anchors_da.cnt-1;
+ anchors(i).type = SEG_CRVLIN;
+ anchors(i).width = d/8;
+ anchors(i).u.c.center = pos;
+ anchors(i).u.c.a0 = 180.0;
+ anchors(i).u.c.a1 = 360.0;
+ anchors(i).u.c.radius = d/16;
+ anchors(i).color = wDrawColorAqua;
+ wSetCursor(mainD.d,wCursorNone);
}
void static CreateModifyAnchor(coOrd pos) {
@@ -168,6 +175,7 @@ void static CreateModifyAnchor(coOrd pos) {
anchors(i).u.c.a1 = 360.0;
anchors(i).u.c.radius = d;
anchors(i).color = wDrawColorPowderedBlue;
+ wSetCursor(mainD.d,wCursorNone);
}
@@ -193,6 +201,7 @@ void CreateDescribeAnchor(coOrd pos) {
Translate(&anchors(i).u.l.pos[1],pos,180.0,d*1.5);
anchors(i).color = wDrawColorPowderedBlue;
}
+ wSetCursor(mainD.d,wCursorNone);
}
void CreateActivateAnchor(coOrd pos) {
@@ -218,6 +227,7 @@ void CreateActivateAnchor(coOrd pos) {
anchors(i).u.c.a1 = 360.0;
anchors(i).u.c.radius = d;
anchors(i).color = wDrawColorPowderedBlue;
+ wSetCursor(mainD.d,wCursorNone);
}
void static CreateMoveAnchor(coOrd pos) {
@@ -225,6 +235,7 @@ void static CreateMoveAnchor(coOrd pos) {
DrawArrowHeads(&DYNARR_N(trkSeg_t,anchors_da,anchors_da.cnt-5),pos,0,TRUE,wDrawColorBlue);
DYNARR_SET(trkSeg_t,anchors_da,anchors_da.cnt+5);
DrawArrowHeads(&DYNARR_N(trkSeg_t,anchors_da,anchors_da.cnt-5),pos,90,TRUE,wDrawColorBlue);
+ wSetCursor(mainD.d,wCursorNone);
}
void CreateEndAnchor(coOrd p, wBool_t lock) {
@@ -382,7 +393,7 @@ EXPORT void SetAllTrackSelect( BOOL_T select )
selectedTrackCount = 0;
trk = NULL;
while ( TrackIterate( &trk ) ) {
- if ((!select) || GetLayerVisible( GetTrkLayer( trk ))) {
+ if ((!select) || (GetLayerVisible( GetTrkLayer( trk )) && !GetLayerFrozen(GetTrkLayer( trk )) )) {
if (select)
selectedTrackCount++;
if ((GetTrkSelected(trk)!=0) != select) {
@@ -392,7 +403,7 @@ EXPORT void SetAllTrackSelect( BOOL_T select )
ClrTrkBits( trk, TB_SELECTED );
if (!doRedraw)
SetTrkBits( trk, TB_SELREDRAW );
- DrawTrackAndEndPts( trk, wDrawColorBlack );
+ DrawTrackAndEndPts( trk, wDrawColorBlack );
}
}
}
@@ -405,20 +416,20 @@ EXPORT void SetAllTrackSelect( BOOL_T select )
}
}
-/* Invert selected state of all visible non-module objects.
+/* Invert selected state of all visible non-module, non-frozen objects.
*
* \param none
* \return none
*/
-EXPORT void InvertTrackSelect( void *ptr )
+EXPORT void InvertTrackSelect( void * unused )
{
track_p trk;
trk = NULL;
while ( TrackIterate( &trk ) ) {
if (GetLayerVisible( GetTrkLayer( trk )) &&
- !GetLayerModule(GetTrkLayer( trk ))) {
+ !GetLayerModule(GetTrkLayer( trk )) && !GetLayerFrozen(GetTrkLayer( trk )) ) {
SelectOneTrack( trk, GetTrkSelected(trk)==0 );
}
}
@@ -428,7 +439,7 @@ EXPORT void InvertTrackSelect( void *ptr )
MainRedraw(); // InvertTrackSelect
}
-/* Select orphaned (ie single) track pieces.
+/* Select orphaned (ie single) track pieces (ignore frozen and module)
*
* \param none
* \return none
@@ -444,7 +455,7 @@ EXPORT void OrphanedTrackSelect( void *ptr )
while( TrackIterate( &trk ) ) {
cnt = 0;
- if( GetLayerVisible( GetTrkLayer( trk ) && !GetLayerModule(GetTrkLayer(trk)))) {
+ if( GetLayerVisible( GetTrkLayer( trk ) && !GetLayerModule(GetTrkLayer(trk)) && !GetLayerFrozen(GetTrkLayer(trk)))) {
for( ep = 0; ep < GetTrkEndPtCnt( trk ); ep++ ) {
if( GetTrkEndTrk( trk, ep ) )
cnt++;
@@ -480,12 +491,11 @@ static void SelectOneTrack(
selectedTrackCount--;
}
SelectedTrackCountChange();
- DrawTrackAndEndPts( trk, wDrawColorBlack );
}
-static void HighlightSelectedTracks(
- track_p trk_ignore, BOOL_T box, BOOL_T invert )
+EXPORT void HighlightSelectedTracks(
+ track_p trk_ignore, BOOL_T keep, BOOL_T invert )
{
track_p trk = NULL;
if ( selectedTrackCount == 0 )
@@ -494,7 +504,9 @@ static void HighlightSelectedTracks(
if (trk == trk_ignore) continue;
if(GetTrkSelected(trk)) {
if (!GetLayerVisible( GetTrkLayer( trk ))) continue;
- if (invert)
+ if (keep)
+ DrawTrack(trk,&tempD,selectedColor);
+ else if (invert)
DrawTrack(trk,&tempD,wDrawColorPreviewUnselected);
else
DrawTrack(trk,&tempD,wDrawColorPreviewSelected );
@@ -503,6 +515,11 @@ static void HighlightSelectedTracks(
}
+/*
+ * Select all tracks connected walking the tree until hitting ends or already selected tracks
+ *
+ * Ignore Frozen Tracks
+ */
static void SelectConnectedTracks(
track_p trk, BOOL_T display_only )
{
@@ -517,15 +534,17 @@ static void SelectConnectedTracks(
if ( inx > 0 && (selectedTrackCount == 0) && !display_only )
return;
trk = Tlist(inx);
- if (inx!=0 &&
- GetTrkSelected(trk)) {
- if (display_only)
- DrawTrack(trk,&tempD,wDrawColorPreviewSelected );
- continue;
- } else if (GetTrkSelected(trk)) {
- if (display_only)
- DrawTrack(trk,&tempD,wDrawColorPreviewUnselected);
- continue;
+ if (!GetLayerFrozen(GetTrkLayer(trk))) {
+ if (inx!=0 &&
+ GetTrkSelected(trk)) {
+ if (display_only)
+ DrawTrack(trk,&tempD,wDrawColorPreviewSelected );
+ continue;
+ } else if (GetTrkSelected(trk)) {
+ if (display_only)
+ DrawTrack(trk,&tempD,wDrawColorPreviewUnselected);
+ continue;
+ }
}
for (ep=0; ep<GetTrkEndPtCnt(trk); ep++) {
trk1 = GetTrkEndTrk( trk, ep );
@@ -535,10 +554,12 @@ static void SelectConnectedTracks(
} else TlistAppend( trk1 );
}
}
- if (display_only) DrawTrack(trk,&tempD,wDrawColorPreviewSelected );
+ if (display_only && !GetLayerFrozen(GetTrkLayer(trk))) DrawTrack(trk,&tempD,wDrawColorPreviewSelected );
else if (!GetTrkSelected(trk)) {
if (GetLayerModule(GetTrkLayer(trk))) {
continue;
+ } else if (GetLayerFrozen(GetTrkLayer(trk))) {
+ continue;
} else {
SelectOneTrack( trk, TRUE );
InfoCount( inx+1 );
@@ -572,7 +593,25 @@ static void DrawSingleTrack(track_p trk, BOOL_T bit) {
DrawTrack(trk,&tempD,bit?wDrawColorPreviewSelected:wDrawColorPreviewUnselected);
}
+typedef BOOL_T (*testSelectedTrackCallBack_t)(track_p, int);
+
+
+static BOOL_T TestAllSelectedTracks( testSelectedTrackCallBack_t testit, int value)
+{
+ track_p trk;
+ trk = NULL;
+ while ( TrackIterate( &trk ) ) {
+ if (GetTrkSelected(trk)) {
+ if ( !testit( trk, value ) ) {
+ return FALSE;
+ }
+ }
+ }
+ return TRUE;
+}
+
typedef BOOL_T (*doSelectedTrackCallBack_t)(track_p, BOOL_T);
+
static void DoSelectedTracks( doSelectedTrackCallBack_t doit )
{
track_p trk;
@@ -619,7 +658,7 @@ EXPORT void SelectTrackWidth( void* width )
if (GetTrkSelected(trk)) {
DrawTrackAndEndPts( trk, wDrawColorWhite );
UndoModify( trk );
- SetTrkWidth( trk, (int)(long)width );
+ SetTrkWidth( trk, (int)VP2L(width) );
DrawTrackAndEndPts( trk, wDrawColorBlack );
}
}
@@ -627,8 +666,9 @@ EXPORT void SelectTrackWidth( void* width )
UndoEnd();
}
-EXPORT void SelectLineType( void* width )
+static void SelectLineType( void* widthVP )
{
+ int width = (int)VP2L(widthVP);
track_p trk;
if (SelectedTracksAreFrozen())
return;
@@ -643,11 +683,11 @@ EXPORT void SelectLineType( void* width )
if (GetTrkSelected(trk)) {
UndoModify( trk );
if (QueryTrack(trk, Q_CAN_MODIFY_CONTROL_POINTS))
- SetBezierLineType(trk, (int) (long) width);
+ SetBezierLineType(trk, width);
else if (QueryTrack(trk, Q_IS_DRAW))
- SetLineType( trk, (int)(long)width );
+ SetLineType( trk, width );
else if (QueryTrack(trk, Q_IS_STRUCTURE)) {
- SetCompoundLineType(trk, (int)(long)width);
+ SetCompoundLineType(trk, width);
}
}
}
@@ -657,15 +697,26 @@ EXPORT void SelectLineType( void* width )
static BOOL_T doingDouble;
-EXPORT void SelectDelete( void )
+EXPORT int SelectDelete( void )
{
- if (GetCurrentCommand() != selectCmdInx) return;
- if (doingDouble) return;
+ if (GetCurrentCommand() != selectCmdInx ) {
+ if (GetCurrentCommand() != modifyCmdInx ) {
+ InfoMessage(_("Delete only works in Select Mode"));
+ wBeep();
+ return -1;
+ }
+ }
+
+ if (doingDouble || (GetCurrentCommand() == modifyCmdInx)) return 1;
if (SelectedTracksAreFrozen())
- return;
+ return 0;
if (selectedTrackCount>0) {
- UndoStart( _("Delete Tracks"), "delete" );
+ BOOL_T UndoStarted = FALSE;
+ if (!TestAllSelectedTracks(QueryTrack,(int)Q_ISTRAIN)) { // If all Cars, don't bother with UndoStart as there will be nothing to delete
+ UndoStarted = TRUE;
+ UndoStart( _("Delete Tracks"), "delete" );
+ }
wDrawDelayUpdate( mainD.d, TRUE );
wDrawDelayUpdate( mapD.d, TRUE );
DoSelectedTracks( DeleteTrack );
@@ -674,15 +725,26 @@ EXPORT void SelectDelete( void )
wDrawDelayUpdate( mapD.d, FALSE );
selectedTrackCount = 0;
SelectedTrackCountChange();
- UndoEnd();
+ if (UndoStarted)
+ UndoEnd();
} else {
ErrorMessage( MSG_NO_SELECTED_TRK );
}
+ return 0;
+}
+
+/*
+ * Called By Windows directly with Delete Key. We first try a simple Delete, and if that doesn't work saying "In Modify" we call Modify with a Text key for Delete
+ */
+EXPORT void TrySelectDelete( void ) {
+ if(SelectDelete() == 1) {
+ CmdModify((C_TEXT+(int)(127<<8)),zero);
+ }
}
BOOL_T flipHiddenDoSelectRecount;
-static BOOL_T FlipHidden( track_p trk, BOOL_T junk )
+static BOOL_T FlipHidden( track_p trk, BOOL_T unused )
{
EPINX_T i;
track_p trk2;
@@ -713,7 +775,7 @@ static BOOL_T FlipHidden( track_p trk, BOOL_T junk )
return TRUE;
}
-static BOOL_T FlipBridge( track_p trk, BOOL_T junk )
+static BOOL_T FlipBridge( track_p trk, BOOL_T unused )
{
UndoModify( trk );
if (GetTrkBridge(trk)) {
@@ -725,7 +787,7 @@ static BOOL_T FlipBridge( track_p trk, BOOL_T junk )
return TRUE;
}
-static BOOL_T FlipTies( track_p trk, BOOL_T junk )
+static BOOL_T FlipTies( track_p trk, BOOL_T unused )
{
UndoModify( trk );
if (GetTrkNoTies(trk)) {
@@ -737,7 +799,7 @@ static BOOL_T FlipTies( track_p trk, BOOL_T junk )
return TRUE;
}
-EXPORT void SelectTunnel( void )
+EXPORT void SelectTunnel( void * unused )
{
if (SelectedTracksAreFrozen())
return;
@@ -755,7 +817,7 @@ EXPORT void SelectTunnel( void )
SelectRecount();
}
-EXPORT void SelectBridge( void )
+EXPORT void SelectBridge( void * unused )
{
if (SelectedTracksAreFrozen())
return;
@@ -772,7 +834,7 @@ EXPORT void SelectBridge( void )
MainRedraw(); // SelectBridge
}
-EXPORT void SelectTies( void )
+EXPORT void SelectTies( void * unused )
{
if (SelectedTracksAreFrozen())
return;
@@ -803,14 +865,14 @@ void SelectRecount( void )
}
-static BOOL_T SetLayer( track_p trk, BOOL_T junk )
+static BOOL_T SetLayer( track_p trk, BOOL_T unused )
{
UndoModify( trk );
SetTrkLayer( trk, curLayer );
return TRUE;
}
-EXPORT void MoveSelectedTracksToCurrentLayer( void )
+EXPORT void MoveSelectedTracksToCurrentLayer( void * unused )
{
if (SelectedTracksAreFrozen())
return;
@@ -823,20 +885,32 @@ EXPORT void MoveSelectedTracksToCurrentLayer( void )
}
}
-EXPORT void SelectCurrentLayer( void )
+EXPORT void SelectCurrentLayer( void * unused )
{
track_p trk;
trk = NULL;
+ if (GetLayerFrozen(curLayer)) return;
while ( TrackIterate( &trk ) ) {
- if ((!GetTrkSelected(trk)) && GetTrkLayer(trk) == curLayer ) {
+ if ((!GetTrkSelected(trk)) && GetTrkLayer(trk) == curLayer) {
SelectOneTrack( trk, TRUE );
}
}
RedrawSelectedTracksBoundary();
}
+EXPORT void DeselectLayer( unsigned int layer ) {
+ track_p trk;
+ trk = NULL;
+ while ( TrackIterate( &trk ) ) {
+ if ((GetTrkSelected(trk)) && GetTrkLayer(trk) == layer) {
+ SelectOneTrack( trk, FALSE );
+ }
+ }
+ RedrawSelectedTracksBoundary();
+}
+
-static BOOL_T ClearElevation( track_p trk, BOOL_T junk )
+static BOOL_T ClearElevation( track_p trk, BOOL_T unused )
{
EPINX_T ep;
for ( ep=0; ep<GetTrkEndPtCnt(trk); ep++ ) {
@@ -850,7 +924,7 @@ static BOOL_T ClearElevation( track_p trk, BOOL_T junk )
return TRUE;
}
-EXPORT void ClearElevations( void )
+EXPORT void ClearElevations( void * unused )
{
if (SelectedTracksAreFrozen())
return;
@@ -866,7 +940,7 @@ EXPORT void ClearElevations( void )
static DIST_T elevDelta;
-static BOOL_T AddElevation( track_p trk, BOOL_T junk )
+static BOOL_T AddElevation( track_p trk, BOOL_T unused )
{
track_p trk1;
EPINX_T ep, ep1;
@@ -909,7 +983,7 @@ EXPORT void AddElevations( DIST_T delta )
}
-EXPORT void DoRefreshCompound( void )
+EXPORT void DoRefreshCompound( void * unused )
{
if (SelectedTracksAreFrozen())
return;
@@ -961,11 +1035,11 @@ static paramData_t rescalePLs[] = {
#define I_RESCALE_MODE (0)
{ PD_RADIO, &rescaleMode, "toggle", PDO_NOPREF, &rescaleToggleLabels, N_("Rescale by:"), BC_HORZ|BC_NOBORDER },
#define I_RESCALE_FROM_SCALE (1)
- { PD_STRING, rescaleFromScale, "fromS", PDO_NOPREF|PDO_STRINGLIMITLENGTH, (void*)100, N_("From:"),0, 0, sizeof(rescaleFromScale)},
+ { PD_STRING, rescaleFromScale, "fromS", PDO_NOPREF|PDO_STRINGLIMITLENGTH, I2VP(100), N_("From:"),0, 0, sizeof(rescaleFromScale)},
#define I_RESCALE_FROM_GAUGE (2)
- { PD_STRING, rescaleFromGauge, "fromG", PDO_NOPREF|PDO_DLGHORZ | PDO_STRINGLIMITLENGTH, (void*)100, " / ", 0, 0, sizeof(rescaleFromGauge)},
+ { PD_STRING, rescaleFromGauge, "fromG", PDO_NOPREF|PDO_DLGHORZ | PDO_STRINGLIMITLENGTH, I2VP(100), " / ", 0, 0, sizeof(rescaleFromGauge)},
#define I_RESCALE_TO_SCALE (3)
- { PD_DROPLIST, &rescaleToScaleInx, "toS", PDO_NOPREF|PDO_LISTINDEX, (void *)100, N_("To: ") },
+ { PD_DROPLIST, &rescaleToScaleInx, "toS", PDO_NOPREF|PDO_LISTINDEX, I2VP(100), N_("To: ") },
#define I_RESCALE_TO_GAUGE (4)
{ PD_DROPLIST, &rescaleToGaugeInx, "toG", PDO_NOPREF|PDO_LISTINDEX|PDO_DLGHORZ, NULL, " / " },
#define I_RESCALE_CHANGE (5)
@@ -973,13 +1047,13 @@ static paramData_t rescalePLs[] = {
#define I_RESCALE_PERCENT (6)
{ PD_FLOAT, &rescalePercent, "ratio", 0, &r0o001_10000, N_("Ratio") },
{ PD_MESSAGE, "%", NULL, PDO_DLGHORZ } };
-static paramGroup_t rescalePG = { "rescale", 0, rescalePLs, sizeof rescalePLs/sizeof rescalePLs[0] };
+static paramGroup_t rescalePG = { "rescale", 0, rescalePLs, COUNT( rescalePLs ) };
static long getboundsCount;
static coOrd getboundsLo, getboundsHi;
-static BOOL_T GetboundsDoIt( track_p trk, BOOL_T junk )
+static BOOL_T GetboundsDoIt( track_p trk, BOOL_T unused )
{
coOrd hi, lo;
@@ -998,7 +1072,7 @@ static BOOL_T GetboundsDoIt( track_p trk, BOOL_T junk )
}
static coOrd rescaleShift;
-static BOOL_T RescaleDoIt( track_p trk, BOOL_T junk )
+static BOOL_T RescaleDoIt( track_p trk, BOOL_T unused )
{
EPINX_T ep, ep1;
track_p trk1;
@@ -1026,7 +1100,7 @@ static BOOL_T RescaleDoIt( track_p trk, BOOL_T junk )
static void RescaleDlgOk(
- void * junk )
+ void * unused )
{
coOrd center, size;
DIST_T d;
@@ -1073,6 +1147,19 @@ static void RescaleDlgOk(
rescaleToInx = GetScaleInx( rescaleToScaleInx, rescaleToGaugeInx );
DoSelectedTracks( RescaleDoIt );
+
+ // rescale the background if it exists and the layout is resized
+ if (HasBackGround() && ratio != 1.0) {
+ coOrd pos = GetLayoutBackGroundPos();
+ double size = GetLayoutBackGroundSize();
+ pos.x = ratio * pos.x + rescaleShift.x;
+ pos.y = ratio * pos.y + rescaleShift.y;
+ SetLayoutBackGroundPos(pos);
+
+ size *= ratio;
+ SetLayoutBackGroundSize(size);
+ }
+ DoRedraw();
wHide( rescalePG.win );
}
@@ -1126,11 +1213,11 @@ static void RescaleDlgUpdate(
* FIXME: special cases like tracks pieces with different gauges or scale need to be handled
*
* \param IN trk track element
- * \param IN junk
+ * \param IN unused
* \return TRUE;
*/
-static BOOL_T SelectedScaleGauge( track_p trk, BOOL_T junk )
+static BOOL_T SelectedScaleGauge( track_p trk, BOOL_T unused )
{
char *scaleName;
SCALEINX_T scale;
@@ -1159,7 +1246,7 @@ static BOOL_T SelectedScaleGauge( track_p trk, BOOL_T junk )
* RescaleDlgUpdate()
*/
-EXPORT void DoRescale( void )
+EXPORT void DoRescale( void * unused )
{
if ( rescalePG.win == NULL ) {
ParamCreateDialog( &rescalePG, MakeWindowTitle(_("Rescale")), _("Ok"), RescaleDlgOk, wHide, TRUE, NULL, F_BLOCK, RescaleDlgUpdate );
@@ -1200,21 +1287,35 @@ static void DrawSelectedTracksD( drawCmd_p d, wDrawColor color )
}
if (color != wDrawColorWhite)
ClrTrkBits(trk, TB_UNDRAWN);
- DrawTrack( trk, d, color );
if (color == wDrawColorWhite)
SetTrkBits( trk, TB_UNDRAWN );
}
+ MainRedraw(); //Omitting all the tracks with TB_UNDRAWN set
/*wDrawDelayUpdate( d->d, FALSE );*/
}
static BOOL_T AddSelectedTrack(
- track_p trk, BOOL_T junk )
+ track_p trk, BOOL_T unused )
{
DYNARR_APPEND( track_p, tlist_da, 10 );
DYNARR_LAST( track_p, tlist_da ) = trk;
return TRUE;
}
+static BOOL_T RemoveSelectedTrack(track_p trk) {
+
+ for(int i=0;i<tlist_da.cnt; i++) {
+ if (DYNARR_N(track_p,tlist_da,i) == trk) {
+ for (int j=i;j<tlist_da.cnt-1;j++) {
+ DYNARR_N(track_p,tlist_da,j) = DYNARR_N(track_p,tlist_da,j+1);
+ }
+ tlist_da.cnt--;
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
static coOrd moveOrig;
static ANGLE_T moveAngle;
@@ -1257,6 +1358,8 @@ static void AccumulateTracks( void )
/*wDrawDelayUpdate( moveD.d, FALSE );*/
}
+static dynArr_t auto_select_da;
+
static void AddEndCornus() {
for (int i=0;i<tlist_da.cnt;i++) {
track_p trk = DYNARR_N(track_p,tlist_da,i);
@@ -1267,11 +1370,23 @@ static void AddEndCornus() {
SelectOneTrack( tc, TRUE );
DYNARR_APPEND(track_p,tlist_da,1); //Add to selected list
DYNARR_LAST(track_p,tlist_da) = tc;
+ DYNARR_APPEND(track_p,auto_select_da,1);
+ DYNARR_LAST(track_p,auto_select_da) = tc;
}
}
}
}
+static void RemoveEndCornus() {
+ track_p tc;
+ for (int i=0;i<auto_select_da.cnt;i++) {
+ tc = DYNARR_N(track_p,auto_select_da,i);
+ SelectOneTrack( tc, FALSE );
+ RemoveSelectedTrack(tc);
+ }
+ DYNARR_RESET(track_p,auto_select_da);
+}
+
static void GetMovedTracks( BOOL_T undraw )
{
@@ -1343,7 +1458,7 @@ static void DrawMovedTracks( void )
dynArr_t cornu_segs;
DrawSegs( &tempD, moveOrig, moveAngle, &tempSegs(0), tempSegs_da.cnt,
- 0.0, wDrawColorBlack );
+ 0.0, selectedColor );
for ( inx=0; inx<tlist_da.cnt; inx++ ) {
trk = Tlist(inx);
@@ -1377,7 +1492,7 @@ static void DrawMovedTracks( void )
trkSeg_p cornu_p = &DYNARR_N(trkSeg_t,cornu_segs,0);
DrawSegsO(&tempD, trk, zero, 0.0, cornu_p,cornu_segs.cnt,
- GetTrkGauge(trk), wDrawColorBlack, DTS_LEFT|DTS_RIGHT );
+ GetTrkGauge(trk), selectedColor, DTS_LEFT|DTS_RIGHT );
}
}
@@ -1413,20 +1528,37 @@ static void MoveTracks(
DrawSelectedTracksD( &mapD, wDrawColorWhite );
}
}
+ //Do non-Cornu first to establish new end-points
+ for ( inx=0; inx<tlist_da.cnt; inx++ ) {
+ trk = Tlist(inx);
+ UndoModify( trk );
+ if (QueryTrack(trk, Q_IS_CORNU)) continue;
+ if (move)
+ MoveTrack( trk, base );
+ if (rotate)
+ RotateTrack( trk, orig, angle );
+ for (ep=0; ep<GetTrkEndPtCnt(trk); ep++) {
+ if ((trk1 = GetTrkEndTrk(trk,ep)) != NULL &&
+ !GetTrkSelected(trk1)) {
+ ep1 = GetEndPtConnectedToMe( trk1, trk );
+ DisconnectTracks( trk, ep, trk1, ep1 );
+ DrawEndPt( &mainD, trk1, ep1, wDrawColorBlack );
+ }
+ }
+ }
+ //Now do the just Cornus - to reset to where the fixed parts ended up
for ( inx=0; inx<tlist_da.cnt; inx++ ) {
trk = Tlist(inx);
UndoModify( trk );
BOOL_T fixed_end;
fixed_end = FALSE;
- if (QueryTrack(trk, Q_IS_CORNU)) {
- for (int i=0;i<2;i++) {
- track_p te;
- if ((te = GetTrkEndTrk(trk,i)) && !GetTrkSelected(te)) {
- fixed_end = TRUE;
- }
+ if (!QueryTrack(trk, Q_IS_CORNU)) continue;
+ for (int i=0;i<2;i++) {
+ track_p te;
+ if ((te = GetTrkEndTrk(trk,i)) && !GetTrkSelected(te)) {
+ fixed_end = TRUE;
}
}
-
if (!fixed_end) {
if (move)
MoveTrack( trk, base );
@@ -1441,65 +1573,64 @@ static void MoveTracks(
}
}
} else {
- if (QueryTrack(trk, Q_IS_CORNU)) { //Cornu will be at the end of selected set
- for (int i=0;i<2;i++) {
- if ((trk1 = GetTrkEndTrk(trk,i)) && GetTrkSelected(trk1)) {
- ep1 = GetEndPtConnectedToMe( trk1, trk );
- DisconnectTracks(trk,i,trk1,ep1);
- GetTrackParams(PARAMS_CORNU,trk1,GetTrkEndPos(trk1,ep1),&trackParms);
- if (trackParms.type == curveTypeStraight) {
- endRadius = 0;
- endCenter = zero;
- } else {
- endRadius = trackParms.arcR;
- endCenter = trackParms.arcP;
- }
- DrawTrack(trk,&mainD,wDrawColorWhite);
- DrawTrack(trk,&mapD,wDrawColorWhite);
- endAngle = NormalizeAngle(GetTrkEndAngle(trk1,ep1)+180);
- if (SetCornuEndPt(trk,i,GetTrkEndPos(trk1,ep1),endCenter,endAngle,endRadius)) {
- ConnectTracks(trk,i,trk1,ep1);
- DrawTrack(trk,&mainD,wDrawColorBlack);
- DrawTrack(trk,&mapD,wDrawColorBlack);
- } else {
- DeleteTrack(trk,TRUE);
- ErrorMessage(_("Cornu too tight - it was deleted"));
- DoRedraw(); // MoveTracks: Cornu/delete
- return;
- }
- } else if (!trk1) { //No end track
- DrawTrack(trk,&mainD,wDrawColorWhite);
- DrawTrack(trk,&mapD,wDrawColorWhite);
- GetTrackParams(PARAMS_CORNU,trk,GetTrkEndPos(trk,i),&trackParms);
- if (move) {
- coOrd end_pos, end_center;
- end_pos = trackParms.cornuEnd[i];
- end_pos.x += base.x;
- end_pos.y += base.y;
- end_center = trackParms.cornuCenter[i];
- end_center.x += base.x;
- end_center.y += base.y;
- SetCornuEndPt(trk,i,end_pos,end_center,trackParms.cornuAngle[i],trackParms.cornuRadius[i]);
- }
- if (rotate) {
- coOrd end_pos, end_center;
- ANGLE_T end_angle;
- end_pos = trackParms.cornuEnd[i];
- end_center = trackParms.cornuCenter[i];
- Rotate(&end_pos, orig, angle);
- Rotate(&end_center, orig, angle);
- end_angle = NormalizeAngle( trackParms.cornuAngle[i] + angle );
- SetCornuEndPt(trk,i,end_pos,end_center,end_angle,trackParms.cornuRadius[i]);
- }
+ for (int i=0;i<2;i++) {
+ if ((trk1 = GetTrkEndTrk(trk,i)) && GetTrkSelected(trk1)) {
+ ep1 = GetEndPtConnectedToMe( trk1, trk );
+ DisconnectTracks(trk,i,trk1,ep1);
+ GetTrackParams(PARAMS_CORNU,trk1,GetTrkEndPos(trk1,ep1),&trackParms);
+ if (trackParms.type == curveTypeStraight) {
+ endRadius = 0;
+ endCenter = zero;
+ } else {
+ endRadius = trackParms.arcR;
+ endCenter = trackParms.arcP;
+ }
+ DrawTrack(trk,&mainD,wDrawColorWhite);
+ DrawTrack(trk,&mapD,wDrawColorWhite);
+ endAngle = NormalizeAngle(GetTrkEndAngle(trk1,ep1)+180);
+ if (SetCornuEndPt(trk,i,GetTrkEndPos(trk1,ep1),endCenter,endAngle,endRadius)) {
+ ConnectTracks(trk,i,trk1,ep1);
DrawTrack(trk,&mainD,wDrawColorBlack);
DrawTrack(trk,&mapD,wDrawColorBlack);
+ } else {
+ DeleteTrack(trk,TRUE);
+ ErrorMessage(_("Cornu too tight - it was deleted"));
+ DoRedraw(); // MoveTracks: Cornu/delete
+ continue;
+ }
+ } else if (!trk1) { //No end track
+ DrawTrack(trk,&mainD,wDrawColorWhite);
+ DrawTrack(trk,&mapD,wDrawColorWhite);
+ GetTrackParams(PARAMS_CORNU,trk,GetTrkEndPos(trk,i),&trackParms);
+ if (move) {
+ coOrd end_pos, end_center;
+ end_pos = trackParms.cornuEnd[i];
+ end_pos.x += base.x;
+ end_pos.y += base.y;
+ end_center = trackParms.cornuCenter[i];
+ end_center.x += base.x;
+ end_center.y += base.y;
+ SetCornuEndPt(trk,i,end_pos,end_center,trackParms.cornuAngle[i],trackParms.cornuRadius[i]);
}
+ if (rotate) {
+ coOrd end_pos, end_center;
+ ANGLE_T end_angle;
+ end_pos = trackParms.cornuEnd[i];
+ end_center = trackParms.cornuCenter[i];
+ Rotate(&end_pos, orig, angle);
+ Rotate(&end_center, orig, angle);
+ end_angle = NormalizeAngle( trackParms.cornuAngle[i] + angle );
+ SetCornuEndPt(trk,i,end_pos,end_center,end_angle,trackParms.cornuRadius[i]);
+ }
+ DrawTrack(trk,&mainD,wDrawColorBlack);
+ DrawTrack(trk,&mapD,wDrawColorBlack);
}
}
}
InfoCount( inx );
}
+ RemoveEndCornus();
ClrAllTrkBits(TB_UNDRAWN);
DoRedraw();
wSetCursor( mainD.d, defaultCursor );
@@ -1534,6 +1665,7 @@ void MoveToJoin(
ConnectTracks( trk0, ep0, trk1, ep1 );
DrawNewTrack( trk0 );
DrawNewTrack( trk1 );
+ RemoveEndCornus();
}
void FreeTempStrings() {
@@ -1627,23 +1759,22 @@ void DrawHighlightLayer(int layer) {
if (layer_lo.y > lo.y ) layer_lo.y = lo.y;
}
}
- wPos_t margin = (wPos_t)(10.5*mainD.scale/mainD.dpi);
+ wDrawPix_t margin = (10.5*mainD.scale/mainD.dpi);
layer_hi.x +=margin;
layer_hi.y +=margin;
layer_lo.x -=margin;
layer_lo.y -=margin;
- wPos_t rect[4][2];
int type[4];
- coOrd top_left, bot_right;
- top_left.x = layer_lo.x; top_left.y = layer_hi.y;
- bot_right.x = layer_hi.x; bot_right.y = layer_lo.y;
type[0] = type[1] = type[2] = type[3] = 0;
- mainD.CoOrd2Pix(&mainD,layer_lo,&rect[0][0],&rect[0][1]);
- mainD.CoOrd2Pix(&mainD,top_left,&rect[1][0],&rect[1][1]);
- mainD.CoOrd2Pix(&mainD,layer_hi,&rect[2][0],&rect[2][1]);
- mainD.CoOrd2Pix(&mainD,bot_right,&rect[3][0],&rect[3][1]);
- wDrawPolygon(tempD.d,rect,(wPolyLine_e *)type,4,wDrawColorPowderedBlue,0,wDrawLineDash,wDrawOptTemp,0,0);
+ coOrd rect[4];
+ // r3 r2
+ // r0 r1
+ rect[0].x = rect[3].x = layer_lo.x;
+ rect[1].x = rect[2].x = layer_hi.x;
+ rect[0].y = rect[1].y = layer_lo.y;
+ rect[2].y = rect[3].y = layer_hi.y;
+ DrawPoly(&tempD,4,rect,type,wDrawColorPowderedBlue,wDrawLineDash,DRAW_CLOSED);
}
void SetUpMenu2(coOrd pos, track_p trk) {
@@ -1734,7 +1865,7 @@ static STATUS_T CmdMove(
UndoStart( _("Move Tracks"), "move" );
base = zero;
orig = pos;
-
+ DYNARR_RESET(track_p,auto_select_da);
GetMovedTracks(TRUE);
SetMoveD( TRUE, base, 0.0 );
drawCount = 0;
@@ -1747,7 +1878,7 @@ static STATUS_T CmdMove(
drawEnable = enableMoveDraw;
base.x = pos.x - orig.x;
base.y = pos.y - orig.y;
- SnapPos( &base );
+ if ((MyGetKeyState() & WKEY_ALT) == 0) SnapPos( &base );
SetMoveD( TRUE, base, 0.0 );
if (((MyGetKeyState()&(WKEY_ALT)) == 0) == magneticSnap) { // ALT
if (FindEndIntersection(base,zero,0.0,&t1,&ep1,&t2,&ep2)) {
@@ -1776,6 +1907,7 @@ static STATUS_T CmdMove(
}
ep1 = -1;
ep2 = -1;
+ RemoveEndCornus();
tlist_da.cnt = 0;
return C_TERMINATE;
@@ -1805,17 +1937,25 @@ static STATUS_T CmdMove(
if ((action>>8) == 'c') {
panCenter = pos;
LOG( log_pan, 2, ( "PanCenter:Sel-%d %0.3f %0.3f\n", __LINE__, panCenter.x, panCenter.y ) );
- PanHere((void*)0);
+ PanHere(I2VP(0));
}
if ((action>>8) == 'e') {
- DoZoomExtents(0);
+ DoZoomExtents(I2VP(0));
+ }
+ if ((action>>8 == 's')) {
+ DoZoomExtents(I2VP(1));
}
if ((action>>8) == '0' || (action>>8 == 'o')) {
- PanMenuEnter('o');
+ PanMenuEnter(I2VP('o'));
}
+ if ((action>>8) == 127 || (action>>8) == 8)
+ SelectDelete();
break;
case C_REDRAW:
/* DO_REDRAW */
+ //Draw all existing highlight boxes only
+ DrawHighlightBoxes(FALSE, FALSE, NULL);
+ HighlightSelectedTracks(NULL, TRUE, TRUE);
if (anchors_da.cnt)
DrawSegs( &tempD, zero, 0.0, &anchors(0), anchors_da.cnt, trackGauge, wDrawColorBlack );
if ( state == 0 )
@@ -1860,6 +2000,7 @@ static STATUS_T CmdMove(
microCount = 0;
MainRedraw(); // Micro step move
}
+ RemoveEndCornus();
return C_CONTINUE;
}
break;
@@ -1869,14 +2010,16 @@ static STATUS_T CmdMove(
doingMove = FALSE;
UndoEnd();
}
+ RemoveEndCornus();
tlist_da.cnt = 0;
break;
case C_CONFIRM:
case C_CANCEL:
if (doingMove) {
doingMove = FALSE;
- UndoUndo();
+ UndoUndo(NULL);
}
+ RemoveEndCornus();
tlist_da.cnt = 0;
break;
default:
@@ -1889,8 +2032,9 @@ static STATUS_T CmdMove(
static int rotateAlignState = 0;
-static void RotateAlign( BOOL_T align )
+static void RotateAlign( void * alignVP )
{
+ BOOL_T align = (BOOL_T)VP2L(alignVP);
rotateAlignState = 0;
if (align) {
rotateAlignState = 1;
@@ -1951,6 +2095,7 @@ static STATUS_T CmdRotate(
return C_TERMINATE;
}
UndoStart( _("Rotate Tracks"), "rotate" );
+ DYNARR_RESET(track_p,auto_select_da);
if ( rotateAlignState == 0 ) {
drawnAngle = FALSE;
angle = 0.0;
@@ -2044,7 +2189,7 @@ static STATUS_T CmdRotate(
ANGLE_T diff_angle = 0.0;
base = pos;
drawEnable = enableMoveDraw;
- if ( FindDistance( orig, pos ) > (20.0/75.0)*mainD.scale ) {
+ if ( FindDistance( orig, pos ) > (20.0/BASE_DPI)*mainD.scale ) {
ANGLE_T old_angle = angle;
angle = FindAngle( orig, pos );
if (!drawnAngle) {
@@ -2079,7 +2224,7 @@ static STATUS_T CmdRotate(
angle = baseAngle+diff_angle;
}
Translate( &base, orig, angle, FindDistance(orig,pos) ); //Line one
- Translate( &orig_base,orig, baseAngle, FindDistance(orig,pos)<=(60.0/75.00*mainD.scale)?FindDistance(orig,pos):60.0/75.00*mainD.scale ); //Line two
+ Translate( &orig_base,orig, baseAngle, FindDistance(orig,pos)<=(60.0/BASE_DPI*mainD.scale)?FindDistance(orig,pos):60.0/BASE_DPI*mainD.scale ); //Line two
SetMoveD( FALSE, orig, NormalizeAngle( angle-baseAngle ) );
if (((MyGetKeyState()&(WKEY_ALT)) == WKEY_ALT) != magneticSnap) { //Just Shift
if (FindEndIntersection(zero,orig,NormalizeAngle( angle-baseAngle ),&t1,&ep1,&t2,&ep2)) {
@@ -2127,6 +2272,7 @@ static STATUS_T CmdRotate(
}
}
UndoEnd();
+ RemoveEndCornus();
tlist_da.cnt = 0;
return C_TERMINATE;
@@ -2154,30 +2300,35 @@ static STATUS_T CmdRotate(
if ((action>>8) == 'd') {
panCenter = pos;
LOG( log_pan, 2, ( "PanCenter:Sel-%d %0.3f %0.3f\n", __LINE__, panCenter.x, panCenter.y ) );
- PanHere((void*)0);
+ PanHere(I2VP(0));
}
if ((action>>8) == 'e') {
- DoZoomExtents(0);
+ DoZoomExtents(I2VP(0));
+ }
+ if ((action>>8) == 's') {
+ DoZoomExtents(I2VP(1));
}
if ((action>>8) == '0' || (action>>8 == 'o')) {
- PanMenuEnter('o');
+ PanMenuEnter(I2VP('o'));
}
break;
case C_REDRAW:
+ DrawHighlightBoxes(FALSE,FALSE,NULL);
+ HighlightSelectedTracks(NULL, TRUE, TRUE);
if (anchors_da.cnt)
DrawSegs( &tempD, zero, 0.0, &anchors(0), anchors_da.cnt, trackGauge, wDrawColorBlack );
/* DO_REDRAW */
if ( state == 0 )
break;
if ( rotateAlignState != 2 ) {
- DIST_T width = mainD.scale*0.5;
+ DIST_T width = tempD.scale*0.15;
DrawLine( &tempD, base, orig, 0, wDrawColorBlue );
if (drawnAngle) {
- DrawLine( &tempD, orig_base, orig, (wDrawWidth)width, wDrawColorBlue );
+ DrawLine( &tempD, orig_base, orig, (wDrawWidth)width/2, wDrawColorBlue );
ANGLE_T a = DifferenceBetweenAngles(FindAngle(orig, orig_base),FindAngle(orig, base));
DIST_T dist = FindDistance(orig,base);
- if (dist>(60.0/75.0)*mainD.scale) dist = (60.0/75.0)*mainD.scale;
+ if (dist>(60.0/BASE_DPI)*mainD.scale) dist = (60.0/BASE_DPI)*mainD.scale;
if (direction_set) {
if (clockwise) {
@@ -2211,6 +2362,7 @@ static STATUS_T CmdRotate(
static void QuickMove( void* pos) {
coOrd move_pos = *(coOrd*)pos;
+ DYNARR_RESET(track_p,auto_select_da);
if ( SelectedTracksAreFrozen() )
return;
wDrawDelayUpdate( mainD.d, TRUE );
@@ -2220,9 +2372,67 @@ static void QuickMove( void* pos) {
wDrawDelayUpdate( mainD.d, FALSE );
}
+static track_p SelectTrackByIndex(TRKINX_T ti, char * message ) {
+ track_p trk = FindTrack(ti);
+ if (trk) {
+ if (!GetLayerFrozen( GetTrkLayer( trk ) ) ) {
+ if (GetLayerModule(GetTrkLayer(trk))) {
+ DoModuleTracks(GetTrkLayer(trk),DrawSingleTrack,TRUE);
+ snprintf(message, STR_LONG_SIZE, "%s %d",_("In module layer:"),GetTrkLayer(trk)+1);
+ } else {
+ if (!GetLayerVisible(GetTrkLayer(trk))) FlipLayer(I2VP(GetTrkLayer(trk)));
+ if (!GetTrkVisible(trk) && drawTunnel==0 ) drawTunnel = 1; //Force DRAW_TUNNEL_DASH
+ SelectOneTrack(trk,TRUE);
+ }
+ } else {
+ snprintf(message, STR_LONG_SIZE, "%s %d",_("Frozen Layer:"),GetTrkLayer(trk)+1);
+ trk = NULL;
+ }
+ } else {
+ snprintf(message, STR_LONG_SIZE, "%s",_("Not found"));
+ }
+ return trk;
+}
+
+EXPORT void SelectByIndex( void* string) {
+ char result[STR_LONG_SIZE] = "";
+ char * message;
+ SetAllTrackSelect(FALSE);
+ char * cp = (char *)string;
+ cp = strtok(cp,",");
+ BOOL_T single = TRUE;
+ track_p trk = NULL;
+ while (cp) {
+ long ti = strtol(cp,&cp,0);
+ if (ti>0) {
+ message = MyMalloc(STR_LONG_SIZE);
+ trk = SelectTrackByIndex(ti, message);
+ if (!trk || message[0]) {
+ size_t len = strlen(result);
+ snprintf(result+len,(sizeof(result) - len),"I:%ld %s", ti, message);
+ MyFree(message);
+ }
+ }
+ cp = strtok(NULL,",");
+ if (cp) single = FALSE;
+ }
+
+ DoZoomExtents(I2VP(1));
+ if (strlen(result))
+ InfoMessage(result);
+ else if (single && trk) {
+ char msg[STR_SIZE];
+ DescribeTrack( trk, msg, sizeof msg );
+ InfoMessage( msg );
+ } else if (!single) {
+ InfoMessage(_("Multiple Selected"));
+ }
+}
+
static void QuickRotate( void* pangle )
{
- ANGLE_T angle = (ANGLE_T)(long)pangle;
+ ANGLE_T angle = (ANGLE_T)VP2L(pangle);
+ DYNARR_RESET(track_p,auto_select_da);
if ( SelectedTracksAreFrozen() )
return;
wDrawDelayUpdate( mainD.d, TRUE );
@@ -2236,8 +2446,24 @@ static void QuickRotate( void* pangle )
static wMenu_p moveDescM;
static wMenuToggle_p moveDescMI;
+static wMenuToggle_p moveDetailDescMI;
+
+static void ChangeDetailedFlag( void * mode )
+{
+ wDrawDelayUpdate( mainD.d, TRUE );
+ UndoStart( _("Toggle Detail"), "Modedetail( T%d )", GetTrkIndex(moveDescTrk) );
+ UndoModify( moveDescTrk );
+ UndrawNewTrack( moveDescTrk );
+ if ( ( GetTrkBits( moveDescTrk ) & TB_DETAILDESC ) == 0 ) {
+ ClrTrkBits( moveDescTrk, TB_HIDEDESC );
+ SetTrkBits( moveDescTrk, TB_DETAILDESC );
+ } else
+ ClrTrkBits( moveDescTrk, TB_DETAILDESC );
+ DrawNewTrack( moveDescTrk );
+ wDrawDelayUpdate( mainD.d, FALSE );
+}
-static void ChangeDescFlag( wBool_t set, void * mode )
+static void ChangeDescFlag( void * mode )
{
wDrawDelayUpdate( mainD.d, TRUE );
UndoStart( _("Toggle Label"), "Modedesc( T%d )", GetTrkIndex(moveDescTrk) );
@@ -2251,9 +2477,13 @@ static void ChangeDescFlag( wBool_t set, void * mode )
wDrawDelayUpdate( mainD.d, FALSE );
}
+/*
+ * Mode_o -1 = everything, 0 = elevations only, 1 = descriptions only
+ */
+
track_p FindTrackDescription(coOrd pos, EPINX_T * ep_o, int * mode_o, BOOL_T show_hidden, BOOL_T * hidden_o) {
track_p trk = NULL;
- DIST_T d, dd = 10000;
+ DIST_T d, dd = DIST_INF;
track_p trk1 = NULL;
EPINX_T ep1=-1, ep=-1;
BOOL_T hidden_t, hidden;
@@ -2265,6 +2495,8 @@ track_p FindTrackDescription(coOrd pos, EPINX_T * ep_o, int * mode_o, BOOL_T sho
continue;
if ( (!GetTrkVisible(trk1)) && drawTunnel==0 )
continue;
+ if ( GetLayerFrozen( GetTrkLayer( trk1 ) ))
+ continue;
if ( (labelEnable&LABELENABLE_ENDPT_ELEV)!=0 && *mode_o <= 0) {
for ( ep1=0; ep1<GetTrkEndPtCnt(trk1); ep1++ ) {
d = EndPtDescriptionDistance( pos, trk1, ep1, &dpos, FALSE, NULL ); //No hidden
@@ -2278,7 +2510,8 @@ track_p FindTrackDescription(coOrd pos, EPINX_T * ep_o, int * mode_o, BOOL_T sho
}
}
}
- if ( !QueryTrack( trk1, Q_HAS_DESC ) && (mode <0 || mode > 0) )
+ if (IsClose(dd)) break;
+ if ( *mode_o == 0 || !QueryTrack( trk1, Q_HAS_DESC ) )
continue;
if ((labelEnable&LABELENABLE_TRKDESC)==0)
continue;
@@ -2321,15 +2554,47 @@ track_p FindTrackDescription(coOrd pos, EPINX_T * ep_o, int * mode_o, BOOL_T sho
hidden = hidden_t;
cpos = dpos;
}
+ d = StraightDescriptionDistance( pos, trk1, &dpos, show_hidden, &hidden_t );
+ if (d < dd ) {
+ dd = d;
+ trk = trk1;
+ ep = -1;
+ mode = 5;
+ hidden = hidden_t;
+ cpos = dpos;
+ }
+ d = JointDescriptionDistance( pos, trk1, &dpos, show_hidden, &hidden_t );
+ if (d < dd ) {
+ dd = d;
+ trk = trk1;
+ ep = -1;
+ mode = 6;
+ hidden = hidden_t;
+ cpos = dpos;
+ }
+
}
- if ((trk != NULL && (trk == OnTrack(&pos, FALSE, FALSE))) ||
- IsClose(d) || IsClose(FindDistance( pos, cpos) )) { //Only when close to a label or the track - not anywhere on layout!
+
+ coOrd pos1 = pos;
+
+ if ((trk != NULL) && IsClose(dd) ) {
if (ep_o) *ep_o = ep;
if (mode_o) *mode_o = mode;
if (hidden_o) *hidden_o = hidden;
return trk;
+ } else { // Return other track for description (not near to description but nearest to track)
+ if ((trk1 = OnTrack(&pos1, FALSE, FALSE))==NULL) return NULL;
+ if (!QueryTrack( trk1, Q_HAS_DESC )) return NULL;
+ if (GetLayerFrozen(GetTrkLayer(trk1))) return NULL;
+ if (IsClose(FindDistance(pos,pos1))) {
+ if (mode_o) *mode_o = -1;
+ if (ep_o) *ep_o = -1;
+ if (hidden_o) *hidden_o = GetTrkBits( trk1 ) & TB_HIDEDESC;
+ return trk1;
+ }
}
- else return NULL;
+
+ return NULL;
}
static long moveDescMode;
@@ -2338,31 +2603,55 @@ STATUS_T CmdMoveDescription(
wAction_t action,
coOrd pos )
{
- static track_p trk;
static EPINX_T ep;
static BOOL_T hidden;
static int mode;
BOOL_T bChanged;
- moveDescMode = (long)commandContext; //Context 0 = everything, 1 means elevations, 2 means descriptions
+ moveDescMode = VP2L(commandContext); //Context 0 = everything, 1 means elevations, 2 means descriptions
bChanged = FALSE;
switch (action&0xFF) {
case C_START:
moveDescTrk = NULL;
moveDescPos = zero;
- trk = NULL;
hidden = FALSE;
mode = -1;
if ( labelWhen < 2 || mainD.scale > labelScale ||
(labelEnable&(LABELENABLE_TRKDESC|LABELENABLE_ENDPT_ELEV))==0 ) {
ErrorMessage( MSG_DESC_NOT_VISIBLE );
- return C_TERMINATE;
+ return C_ERROR;
}
- InfoMessage( _("Select and drag a description") );
- break;
+ SetAllTrackSelect( FALSE );
+ /* no break */
+ case wActionMove:
+ if ( labelWhen < 2 || mainD.scale > labelScale ) return C_CONTINUE;
+ mode = moveDescMode-1; // -1 means everything, 0 means elevations only, 1 means descriptions only
+ if ((moveDescTrk=FindTrackDescription(pos,&ep,&mode,TRUE,&hidden))!=NULL) {
+ if (mode==0) {
+ InfoMessage(_("Elevation description"));
+ } else {
+ if (moveDescMode == 1) {
+ moveDescTrk = NULL;
+ return C_CONTINUE; //Ignore other tracks if only looking for elevations
+ }
+ if (hidden) {
+ InfoMessage(_("Hidden description - 's' to Show, 'd' Details"));
+ moveDescPos = pos;
+ } else {
+ InfoMessage(_("Shown description - 'h' to Hide"));
+ moveDescPos = pos;
+ }
+ }
+ return C_CONTINUE;
+ } else {
+ moveDescTrk = NULL;
+ }
+ InfoMessage( _("Select and drag a description") );
+ break;
case C_TEXT:
if (!moveDescTrk) return C_CONTINUE;
+ if (mode == 0) return C_CONTINUE;
bChanged = FALSE;
if (action>>8 == 's') {
if ( ( GetTrkBits( moveDescTrk ) & TB_HIDEDESC) != 0 )
@@ -2372,97 +2661,105 @@ STATUS_T CmdMoveDescription(
if ( ( GetTrkBits( moveDescTrk ) & TB_HIDEDESC) == 0 )
bChanged = TRUE;
SetTrkBits( moveDescTrk, TB_HIDEDESC );
+ ClrTrkBits( moveDescTrk, TB_DETAILDESC );
+ } else if (action>>8 == 'd') { //Toggle Detailed
+ bChanged = TRUE;
+ if ((GetTrkBits( moveDescTrk ) & TB_DETAILDESC) != 0)
+ ClrTrkBits( moveDescTrk, TB_DETAILDESC);
+ else {
+ ClrTrkBits( moveDescTrk, TB_HIDEDESC );
+ SetTrkBits( moveDescTrk, TB_DETAILDESC );
+ }
}
if ( bChanged ) {
- // We should push the draw/undraw of the description down
- // but there is no clear way to do that
- MainRedraw(); // CmdMoveDescription
- }
- /*no break*/
- case wActionMove:
- if ( labelWhen < 2 || mainD.scale > labelScale ) return C_CONTINUE;
- mode = moveDescMode-1; // -1 means everything, 0 means elevations only, 1 means descriptions only
- if ((trk=FindTrackDescription(pos,&ep,&mode,TRUE,&hidden))!=NULL) {
- if (mode==0) {
- InfoMessage(_("Elevation description"));
- } else {
- if (hidden) {
- InfoMessage(_("Hidden description - 's' to Show"));
- moveDescTrk = trk;
- moveDescPos = pos;
- } else {
- InfoMessage(_("Shown description - 'h' to Hide"));
- moveDescTrk = trk;
- moveDescPos = pos;
- }
- }
- return C_CONTINUE;
+ return C_TERMINATE;
}
- InfoMessage( _("Select and drag a description") );
break;
case C_DOWN:
if (( labelWhen < 2 || mainD.scale > labelScale ) ||
(labelEnable&(LABELENABLE_TRKDESC|LABELENABLE_ENDPT_ELEV))==0 ) {
ErrorMessage( MSG_DESC_NOT_VISIBLE );
- return C_TERMINATE;
+ return C_ERROR;
}
mode = moveDescMode-1;
- trk = FindTrackDescription(pos,&ep,&mode,TRUE,&hidden);
- if (trk == NULL )
+ moveDescTrk = FindTrackDescription(pos,&ep,&mode,TRUE,&hidden);
+ if (moveDescTrk == NULL )
return C_CONTINUE;
if (hidden) {
- ClrTrkBits( trk, TB_HIDEDESC );
InfoMessage(_("Hidden Label - Drag to reveal"));
} else {
InfoMessage(_("Drag label"));
}
- UndoStart( _("Move Label"), "Modedesc( T%d )", GetTrkIndex(trk) );
- UndoModify( trk );
+ if (ep == -1 )
+ DrawTrack( moveDescTrk, &mainD, wDrawColorWhite );
/* no break */
case C_MOVE:
+ if (moveDescTrk == NULL )
+ return C_CONTINUE;
+ UndoStart( _("Move Label"), "Modedesc( T%d )", GetTrkIndex(moveDescTrk) );
+ UndoModify( moveDescTrk );
+ ClrTrkBits( moveDescTrk, TB_HIDEDESC );
+ hidden = FALSE;
+ /* no break */
case C_UP:
- case C_REDRAW:
if ( labelWhen < 2 || mainD.scale > labelScale )
- return C_TERMINATE;
- if ( trk == NULL )
return C_CONTINUE;
- STATUS_T status = C_ERROR;
- if ( action == C_REDRAW ) {
- if (mode==0) {
- DrawEndPt2( &tempD, trk, ep, wDrawColorBlue );
- } else {
- if (hidden) {
- DrawTrack( trk,&tempD,wDrawColorAqua);
- } else {
- DrawTrack( trk,&tempD,wDrawColorBlue);
- }
- }
- }
+ if ( moveDescTrk == NULL )
+ return C_CONTINUE;
+ int rc = C_CONTINUE;
switch (mode) {
case 0:
- return EndPtDescriptionMove( trk, ep, action, pos );
+ rc = EndPtDescriptionMove( moveDescTrk, ep, action, pos );
+ break;
case 1:
- return CompoundDescriptionMove( trk, action, pos );
+ rc = CompoundDescriptionMove( moveDescTrk, action, pos );
+ break;
case 2:
- return CurveDescriptionMove( trk, action, pos );
+ rc = CurveDescriptionMove( moveDescTrk, action, pos );
+ break;
case 3:
- return CornuDescriptionMove( trk, action, pos );
+ rc = CornuDescriptionMove( moveDescTrk, action, pos );
+ break;
case 4:
- return BezierDescriptionMove( trk, action, pos );
+ rc = BezierDescriptionMove( moveDescTrk, action, pos );
+ break;
+ case 5:
+ rc = StraightDescriptionMove( moveDescTrk, action, pos);
+ break;
+ case 6:
+ rc = JointDescriptionMove( moveDescTrk, action, pos);
+ break;
}
hidden = FALSE;
if ( action == C_UP ) {
- trk = NULL;
+ moveDescTrk = NULL;
InfoMessage(_("To Hide, use Context Menu"));
+ return C_TERMINATE;
+ }
+ break;
+ case C_REDRAW:
+ if ( labelWhen < 2 || mainD.scale > labelScale )
+ return C_CONTINUE;
+ if ( moveDescTrk ) {
+ if (mode==0) {
+ DrawEndPt2( &tempD, moveDescTrk, ep, drawColorPreviewSelected );
+ } else {
+ if (hidden) {
+ DrawTrack( moveDescTrk,&tempD,wDrawColorAqua);
+ } else {
+ DrawTrack( moveDescTrk,&tempD,drawColorPreviewSelected);
+ }
+ }
}
break;
-
case C_CMDMENU:
- if (trk == NULL) {
- moveDescTrk = OnTrack( &pos, TRUE, FALSE );
+ if (moveDescTrk != NULL && mode !=0) {
+ if ( GetLayerFrozen( GetTrkLayer( moveDescTrk ) ) ) {
+ moveDescTrk = NULL;
+ break;
+ }
moveDescPos = pos;
} else {
- moveDescTrk = trk;
moveDescPos = pos;
}
if ( moveDescTrk == NULL ) break;
@@ -2470,8 +2767,10 @@ STATUS_T CmdMoveDescription(
if ( moveDescM == NULL ) {
moveDescM = MenuRegister( "Move Desc Toggle" );
moveDescMI = wMenuToggleCreate( moveDescM, "", _("Show/Hide Description"), 0, TRUE, ChangeDescFlag, NULL );
+ moveDetailDescMI = wMenuToggleCreate( moveDescM, "", _("Toggle Detailed Description"), 0, TRUE, ChangeDetailedFlag, NULL );
}
- wMenuToggleSet( moveDescMI, ( GetTrkBits( moveDescTrk ) & TB_HIDEDESC ) == 0 );
+ wMenuToggleSet( moveDescMI, !( GetTrkBits( moveDescTrk ) & TB_HIDEDESC ) );
+ wMenuToggleSet( moveDetailDescMI, ( GetTrkBits( moveDescTrk ) & TB_DETAILDESC ) );
menuPos = pos;
wMenuPopupShow( moveDescM );
break;
@@ -2572,6 +2871,8 @@ static STATUS_T CmdFlip(
case C_CANCEL:
#endif
case C_REDRAW:
+ DrawHighlightBoxes(FALSE,FALSE,NULL);
+ HighlightSelectedTracks(NULL, TRUE, TRUE);
if ( state == 0 )
return C_CONTINUE;
DrawLine( &tempD, pos0, pos1, 0, wDrawColorBlack );
@@ -2654,7 +2955,9 @@ static BOOL_T SelectArea(
lo.x >= base.x && hi.x <= base.x+size.x &&
lo.y >= base.y && hi.y <= base.y+size.y) {
if ( (GetTrkSelected( trk )==0) == (action==C_UP) ) {
- if (GetLayerModule(GetTrkLayer(trk))) {
+ if (GetLayerFrozen(GetTrkLayer(trk))) {
+ continue;
+ } else if (GetLayerModule(GetTrkLayer(trk))) {
if (add)
DoModuleTracks(GetTrkLayer(trk),SelectOneTrack,TRUE);
else
@@ -2693,12 +2996,14 @@ static BOOL_T SelectArea(
break;
//Draw to-be selected tracks versus not.
trk = NULL;
- if (selectMode == 0 && add) HighlightSelectedTracks(NULL, TRUE, TRUE);
+ if (selectMode == 1 && add) HighlightSelectedTracks(NULL, TRUE, TRUE);
while ( TrackIterate( &trk ) ) {
GetBoundingBox( trk, &hi, &lo );
if (GetLayerVisible( GetTrkLayer( trk ) ) &&
lo.x >= base.x && hi.x <= base.x+size.x &&
lo.y >= base.y && hi.y <= base.y+size.y) {
+ if (GetLayerFrozen(GetTrkLayer(trk)))
+ continue;
if (GetLayerModule(GetTrkLayer(trk))) {
if (add)
DoModuleTracks(GetTrkLayer(trk),DrawSingleTrack,TRUE);
@@ -2745,6 +3050,13 @@ static STATUS_T SelectTrack(
return C_CONTINUE;
}
if (trk == NULL) return C_CONTINUE;
+ if (!CheckTrackLayerSilent( trk ) ) {
+ if (GetLayerFrozen(GetTrkLayer(trk)) ) {
+ trk = NULL;
+ InfoMessage(_("Track is in Frozen Layer"));
+ return C_CONTINUE;
+ }
+ }
inDescribeCmd = FALSE;
DescribeTrack( trk, msg, sizeof msg );
InfoMessage( msg );
@@ -2830,12 +3142,11 @@ void DrawHighlightBoxes(BOOL_T highlight_selected, BOOL_T select, track_p not_th
coOrd size;
size.x = max.x-origin.x;
size.y = max.y-origin.y;
- wPos_t w,h;
- w = (wPos_t)((size.x/mainD.scale)*mainD.dpi+0.5+10);
- h = (wPos_t)((size.y/mainD.scale)*mainD.dpi+0.5+10);
- wPos_t x, y;
- tempD.CoOrd2Pix(&tempD,origin,&x,&y);
- wDrawFilledRectangle(tempD.d, x-5, y-5, w, h, wDrawColorPowderedBlue, wDrawOptTemp|wDrawOptTransparent);
+ origin.x -= 5*tempD.scale/tempD.dpi;
+ origin.y -= 5*tempD.scale/tempD.dpi;
+ size.x += 10*tempD.scale/tempD.dpi;
+ size.y += 10*tempD.scale/tempD.dpi;
+ DrawRectangle( &tempD, origin, size, wDrawColorPowderedBlue, DRAW_TRANSPARENT );
}
}
@@ -2853,7 +3164,7 @@ static STATUS_T CallDescribe(wAction_t action, coOrd pos) {
return rc;
}
-static void CallPushDescribe(void * func) {
+static void CallPushDescribe(void * unused) {
if (moveDescTrk) {
CallDescribe(C_START, moveDescPos);
CallDescribe(C_DOWN, moveDescPos);
@@ -2864,7 +3175,7 @@ static void CallPushDescribe(void * func) {
static STATUS_T CmdSelect(wAction_t,coOrd);
-static void CallPushModify(void * func) {
+static void CallPushModify(void * unused) {
if (moveDescTrk) {
CmdSelect(C_LDOUBLE, moveDescPos);
}
@@ -2900,7 +3211,6 @@ static STATUS_T CmdSelect(
}
}
-
switch (action&0xFF) {
case C_START:
InfoMessage( _("Select track") );
@@ -2949,13 +3259,14 @@ static STATUS_T CmdSelect(
CreateModifyAnchor(pos);
showMode = SHOWMODIFY;
} else {
- if (QueryTrack(ht,Q_IS_ACTIVATEABLE))
+ if (QueryTrack(ht,Q_IS_ACTIVATEABLE)) {
CreateActivateAnchor(pos);
showMode = SHOWACTIVATE;
+ } else wSetCursor(mainD.d,defaultCursor);
}
- }
- }
- }
+ } else wSetCursor(mainD.d,defaultCursor);
+ } else wSetCursor(mainD.d,defaultCursor);
+ } else wSetCursor(mainD.d,defaultCursor);
break;
case C_DOWN:
@@ -2965,7 +3276,6 @@ static STATUS_T CmdSelect(
}
DYNARR_RESET(trkSeg_t,anchors_da);
switch (mode) {
- rc = C_CONTINUE;
case MOVE:
if (SelectedTracksAreFrozen() || (selectedTrackCount==0)) {
rc = C_TERMINATE;
@@ -2973,7 +3283,7 @@ static STATUS_T CmdSelect(
} else if ((MyGetKeyState()&(WKEY_CTRL|WKEY_SHIFT))==WKEY_CTRL) {
doingRotate = TRUE;
doingMove = FALSE;
- RotateAlign( FALSE );
+ RotateAlign( I2VP(FALSE) );
rc = CmdRotate( action, pos );
} else if ((MyGetKeyState()&(WKEY_SHIFT|WKEY_CTRL))==WKEY_SHIFT) {
doingMove = TRUE;
@@ -2992,6 +3302,11 @@ static STATUS_T CmdSelect(
return rc;
break;
case wActionExtKey:
+ if ((action>>8)==wAccelKey_Del) {
+ SelectDelete();
+ break;
+ }
+ /* No Break */
case C_RMOVE:
case C_MOVE:
if (doingDouble) {
@@ -3010,7 +3325,7 @@ static STATUS_T CmdSelect(
doingMove = FALSE;
doingRotate = FALSE;
} else if (doingRotate == TRUE) {
- RotateAlign( FALSE );
+ RotateAlign( I2VP(FALSE) );
rc = CmdRotate( action, pos );
} else if (doingMove == TRUE) {
rc = CmdMove( action, pos );
@@ -3040,7 +3355,7 @@ static STATUS_T CmdSelect(
doingMove = FALSE;
doingRotate = FALSE;
} else if (doingRotate == TRUE) {
- RotateAlign( FALSE );
+ RotateAlign( I2VP(FALSE) );
rc = CmdRotate( action, pos );
} else if (doingMove == TRUE) {
rc = CmdMove( action, pos );
@@ -3061,6 +3376,11 @@ static STATUS_T CmdSelect(
break;
case C_REDRAW:
+ if ( trk != NULL && IsTrackDeleted(trk) ) {
+ // If the track is deleted, then trk should be cleared
+ // TODO: This should be done at the point trk is deleted
+ trk = NULL;
+ }
if (doingDouble) {
return CallModify(action,pos);
}
@@ -3097,20 +3417,26 @@ static STATUS_T CmdSelect(
DrawHighlightBoxes(FALSE, FALSE, trk);
// If not on a track, show all tracks as going to be de-selected if selectZero on
- if (!trk && selectZero ) {
- HighlightSelectedTracks(NULL, TRUE, TRUE);
- //Handle the SHIFT+ which means SelectAllConnected case
- } else if ( trk && !IsTrackDeleted(trk)) {
+ if (!trk) {
+ if ( selectZero ) {
+ HighlightSelectedTracks(NULL, FALSE, TRUE);
+ } else {
+ HighlightSelectedTracks(trk, TRUE, FALSE);
+ }
+ } else {
+ //Handle the SHIFT+ which means SelectAllConnected case
if ((MyGetKeyState() & WKEY_SHIFT) )
SelectConnectedTracks(trk, TRUE); //Highlight all connected
//Normal case - handle track we are hovering over
- else {
+ else {
//Select=Add
if (selectMode == 1) {
if ((MyGetKeyState() & (WKEY_CTRL|WKEY_SHIFT)) == WKEY_CTRL) {
- //Only Highlight if adding
+ //Only Highlight if adding otherwise show already selected
if (!GetTrkSelected(trk))
DrawTrack(trk,&tempD,wDrawColorPreviewSelected);
+ else
+ DrawTrack(trk,&tempD,selectedColor);
} else {
if (GetTrkSelected(trk))
DrawTrack(trk,&tempD,wDrawColorPreviewUnselected); //Toggle
@@ -3128,6 +3454,8 @@ static STATUS_T CmdSelect(
//Only Highlight if adding
if (!GetTrkSelected(trk))
DrawTrack(trk,&tempD,wDrawColorPreviewSelected );
+ else
+ DrawTrack(trk,&tempD,selectedColor);
}
}
}
@@ -3138,20 +3466,19 @@ static STATUS_T CmdSelect(
else
DoModuleTracks(GetTrkLayer(trk),DrawSingleTrack,TRUE);
DrawHighlightLayer(GetTrkLayer(trk));
+ }
+ //Select=Add
+ if (selectMode == 1) {
+ if (((MyGetKeyState() & (WKEY_CTRL|WKEY_SHIFT)) == WKEY_CTRL))
+ HighlightSelectedTracks(trk, FALSE, TRUE);
+ else
+ HighlightSelectedTracks(trk, TRUE, FALSE); // Highlight all others selected
+ //Select=Only
} else {
- //Select=Add
- if (selectMode == 1) {
- if (((MyGetKeyState() & (WKEY_CTRL|WKEY_SHIFT)) == WKEY_CTRL))
- HighlightSelectedTracks(trk, TRUE, TRUE);
- //else
- // HighlightSelectedTracks(trk, TRUE, FALSE); Highlight all selected
- //Select=Only
- } else {
- if (((MyGetKeyState() & (WKEY_CTRL|WKEY_SHIFT)) != WKEY_CTRL))
- HighlightSelectedTracks(trk, TRUE, TRUE);
- //else
- // HighlightSelectedTracks(trk, TRUE, TRUE); Highlight all selected
- }
+ if (((MyGetKeyState() & (WKEY_CTRL|WKEY_SHIFT)) != WKEY_CTRL))
+ HighlightSelectedTracks(trk, FALSE, TRUE);
+ else
+ HighlightSelectedTracks(trk, TRUE, FALSE); // Highlight all others selected
}
}
//Finally add the anchors for any actions or snaps
@@ -3222,28 +3549,41 @@ static STATUS_T CmdSelect(
if (doingDouble) {
return CallModify(action,pos);
}
+ if ((action>>8) == 127 || (action>>8) == 8) { //Backspace or Delete key
+ SelectDelete();
+ break;
+ }
if ((action>>8) == 'c') {
panCenter = pos;
LOG( log_pan, 2, ( "PanCenter:Sel-%d %0.3f %0.3f\n", __LINE__, panCenter.x, panCenter.y ) );
- PanHere((void*)0);
+ PanHere(I2VP(0));
}
if ((action>>8) == 'e') {
DoZoomExtents(0);
}
if ((action>>8) == '0' || (action>>8 == 'o')) {
- PanMenuEnter('o');
+ PanMenuEnter(I2VP('o'));
}
if ((action>>8) == '?') {
if((moveDescTrk = OnTrack(&pos,FALSE,FALSE)) != NULL)
moveDescPos = pos;
- CallPushDescribe((void*)0);
+ CallPushDescribe(I2VP(0));
wSetCursor(mainD.d,defaultCursor);
moveDescTrk = NULL;
}
break;
+ case C_CONFIRM:
+ if (doingDouble)
+ return CallModify(action,pos);
+ return C_CONTINUE;
case C_FINISH:
+ if (doingDouble) {
+ CallModify(C_OK,pos);
+ CallModify(C_FINISH,pos);
+ }
if (doingMove) UndoEnd();
doingDouble = FALSE;
+ wSetCursor(mainD.d,defaultCursor);
break;
default:
if (doingDouble) return CallModify(action, pos);
@@ -3259,8 +3599,8 @@ static STATUS_T CmdSelect(
#include "bitmaps/bridge.xpm"
#include "bitmaps/move.xpm"
#include "bitmaps/rotate.xpm"
-#include "bitmaps/flip.xpm"
-#include "bitmaps/movedesc.xpm"
+#include "bitmaps/reflect.xpm"
+#include "bitmaps/description.xpm"
static void SetMoveMode( char * line )
@@ -3272,19 +3612,20 @@ static void SetMoveMode( char * line )
enableMoveDraw = ((tmp&0x10) == 0);
}
-static void moveDescription( void ) {
+static void moveDescription( void * unused ) {
if (!moveDescTrk) return;
int hidden = GetTrkBits( moveDescTrk) &TB_HIDEDESC ;
if (hidden)
ClrTrkBits( moveDescTrk, TB_HIDEDESC );
else
SetTrkBits( moveDescTrk, TB_HIDEDESC );
+ MainRedraw();
}
EXPORT void InitCmdSelect( wMenu_p menu )
{
- selectCmdInx = AddMenuButton( menu, CmdSelect, "cmdSelect", _("Select"), wIconCreatePixMap(select_xpm),
+ selectCmdInx = AddMenuButton( menu, CmdSelect, "cmdSelect", _("Select"), wIconCreatePixMap(select_xpm[iconSize]),
LEVEL0, IC_CANCEL|IC_POPUP|IC_LCLICK|IC_CMDMENU|IC_WANT_MOVE|IC_WANT_MODKEYS, ACCL_SELECT, NULL );
}
@@ -3303,68 +3644,72 @@ EXPORT void InitCmdSelect2( wMenu_p menu ) {
if (moveMode > MAXMOVEMODE || moveMode < 0)
moveMode = MAXMOVEMODE;
selectPopup1M = MenuRegister( "Select Mode Menu" );
- wMenuPushCreate(selectPopup1M, "", _("Undo"), 0,(wMenuCallBack_p) UndoUndo, (void *) 0);
- wMenuPushCreate(selectPopup1M, "", _("Redo"), 0,(wMenuCallBack_p) UndoRedo, (void *) 0);
+ wMenuPushCreate(selectPopup1M, "", _("Undo"), 0, UndoUndo, NULL);
+ wMenuPushCreate(selectPopup1M, "", _("Redo"), 0, UndoRedo, NULL);
wMenuSeparatorCreate( selectPopup1M );
- wMenuPushCreate(selectPopup1M, "cmdDescribeMode", GetBalloonHelpStr("cmdModifyMode"), 0, DoCommandB, (void*) (intptr_t) modifyCmdInx);
- wMenuPushCreate(selectPopup1M, "cmdPanMode", GetBalloonHelpStr("cmdPanMode"), 0, DoCommandB, (void*) (intptr_t) panCmdInx);
- wMenuPushCreate(selectPopup1M, "cmdTrainMode", GetBalloonHelpStr("cmdTrainMode"), 0, DoCommandB, (void*) (intptr_t) trainCmdInx);
+ wMenuPushCreate(selectPopup1M, "cmdDescribeMode", GetBalloonHelpStr("cmdModifyMode"), 0, DoCommandB, I2VP(modifyCmdInx));
+ wMenuPushCreate(selectPopup1M, "cmdPanMode", GetBalloonHelpStr("cmdPanMode"), 0, DoCommandB, I2VP(panCmdInx));
+ wMenuPushCreate(selectPopup1M, "cmdTrainMode", GetBalloonHelpStr("cmdTrainMode"), 0, DoCommandB, I2VP(trainCmdInx));
wMenuSeparatorCreate( selectPopup1M );
- wMenuPushCreate(selectPopup1M, "", _("Zoom In"), 0,(wMenuCallBack_p) DoZoomUp, (void*) 1);
- wMenuPushCreate( selectPopup1M, "", _("Zoom to extents - 'e'"), 0, (wMenuCallBack_p)DoZoomExtents, (void*) 0);
+ wMenuPushCreate(selectPopup1M, "", _("Zoom In"), 0, DoZoomUp, I2VP(1));
+ wMenuPushCreate( selectPopup1M, "", _("Zoom to extents - 'e'"), 0, DoZoomExtents, I2VP(0) );
wMenu_p zoomPop1 = wMenuMenuCreate(selectPopup1M, "", _("&Zoom"));
InitCmdZoom(NULL, NULL, zoomPop1, NULL);
- wMenuPushCreate(selectPopup1M, "", _("Zoom Out"), 0, (wMenuCallBack_p) DoZoomDown, (void*) 1);
- wMenuPushCreate(selectPopup1M, "", _("Pan to Origin - 'o'/'0'"), 0, (wMenuCallBack_p) PanMenuEnter, (void*) 'o');
- wMenuPushCreate(selectPopup1M, "", _("Pan Center Here - 'c'"), 0, (wMenuCallBack_p) PanHere, (void*) 3);
+ wMenuPushCreate(selectPopup1M, "", _("Zoom Out"), 0, DoZoomDown, I2VP(1));
+ wMenuPushCreate(selectPopup1M, "", _("Pan to Origin - 'o'/'0'"), 0, PanMenuEnter, I2VP( 'o'));
+ wMenuPushCreate(selectPopup1M, "", _("Pan Center Here - 'c'"), 0, PanHere, I2VP( 3));
wMenuSeparatorCreate( selectPopup1M );
- wMenuPushCreate(selectPopup1M, "", _("Select All"), 0,(wMenuCallBack_p) SetAllTrackSelect, (void *) 1);
- wMenuPushCreate(selectPopup1M, "",_("Select Current Layer"), 0,(wMenuCallBack_p) SelectCurrentLayer, (void *) 0);
+ wMenuPushCreate(selectPopup1M, "", _("Select All"), 0,(wMenuCallBack_p) SetAllTrackSelect, I2VP( 1));
+ wMenuPushCreate(selectPopup1M, "",_("Select Current Layer"), 0, SelectCurrentLayer, I2VP( 0));
+ AddIndexMenu( selectPopup1M, SelectByIndex);
wMenuSeparatorCreate( selectPopup1M );
selectPopup2M = MenuRegister( "Track Selected Menu " );
- wMenuPushCreate(selectPopup2M, "", _("Undo"), 0,(wMenuCallBack_p) UndoUndo, (void *) 0);
- wMenuPushCreate(selectPopup2M, "", _("Redo"), 0,(wMenuCallBack_p) UndoRedo, (void *) 0);
+ wMenuPushCreate(selectPopup2M, "", _("Undo"), 0, UndoUndo , NULL);
+ wMenuPushCreate(selectPopup2M, "", _("Redo"), 0, UndoRedo , NULL);
wMenuSeparatorCreate( selectPopup2M );
- wMenuPushCreate(selectPopup2M, "", _("Zoom In"), 0,(wMenuCallBack_p) DoZoomUp, (void*) 1);
- wMenuPushCreate(selectPopup2M, "", _("Zoom Out"), 0, (wMenuCallBack_p) DoZoomDown, (void*) 1);
- wMenuPushCreate(selectPopup2M, "", _("Pan Center Here - 'c'"), 0, (wMenuCallBack_p) PanHere, (void*) 3);
+ wMenuPushCreate(selectPopup2M, "", _("Zoom In"), 0, DoZoomUp, I2VP( 1));
+ wMenuPushCreate(selectPopup2M, "", _("Zoom Out"), 0, DoZoomDown, I2VP( 1));
+ wMenuPushCreate( selectPopup2M, "", _("Zoom to extents - 'e'"), 0, DoZoomExtents, I2VP( 0));
+ wMenuPushCreate( selectPopup2M, "", _("Zoom to selected - 's'"), 0, DoZoomExtents, I2VP( 1));
+ wMenuPushCreate(selectPopup2M, "", _("Pan Center Here - 'c'"), 0, PanHere, I2VP( 3));
wMenuSeparatorCreate( selectPopup2M );
- wMenuPushCreate(selectPopup2M, "", _("Deselect All"), 0, (wMenuCallBack_p) SetAllTrackSelect, (void *) 0);
+ AddIndexMenu( selectPopup2M, SelectByIndex);
+ wMenuPushCreate(selectPopup2M, "", _("Deselect All"), 0, (wMenuCallBack_p) SetAllTrackSelect, I2VP( 0));
wMenuSeparatorCreate( selectPopup2M );
- wMenuPushCreate(selectPopup2M, "", _("Properties -'?'"), 0,(wMenuCallBack_p) CallPushDescribe, (void*)0);
- menuPushModify = wMenuPushCreate(selectPopup2M, "", _("Modify/Activate Track"), 0,(wMenuCallBack_p) CallPushModify, (void*)0);
+ wMenuPushCreate(selectPopup2M, "", _("Properties -'?'"), 0, CallPushDescribe, I2VP(0));
+ menuPushModify = wMenuPushCreate(selectPopup2M, "", _("Modify/Activate Track"), 0, CallPushModify, I2VP(0));
wMenuSeparatorCreate( selectPopup2M );
- wMenuPushCreate(selectPopup2M, "", _("Cut"), 0,(wMenuCallBack_p) EditCut, (void *) 0);
- wMenuPushCreate(selectPopup2M, "", _("Copy"), 0,(wMenuCallBack_p) EditCopy, (void *) 0);
- wMenuPushCreate(selectPopup2M, "", _("Paste"), 0, (wMenuCallBack_p) EditPaste, (void *) 0);
- wMenuPushCreate(selectPopup2M, "", _("Clone"), 0, (wMenuCallBack_p) EditClone, (void *) 0);
+ wMenuPushCreate(selectPopup2M, "", _("Cut"), 0, EditCut, I2VP( 0));
+ wMenuPushCreate(selectPopup2M, "", _("Copy"), 0, EditCopy, I2VP( 0));
+ wMenuPushCreate(selectPopup2M, "", _("Paste"), 0, EditPaste, I2VP( 0));
+ wMenuPushCreate(selectPopup2M, "", _("Clone"), 0, EditClone, I2VP( 0));
AddMoveMenu( selectPopup2M, QuickMove);
selectPopup2RM = wMenuMenuCreate(selectPopup2M, "", _("Rotate..."));
AddRotateMenu( selectPopup2RM, QuickRotate );
- rotateAlignMI = wMenuPushCreate( selectPopup2RM, "", _("Align"), 0, (wMenuCallBack_p)RotateAlign, (void* ) 1 );
+ rotateAlignMI = wMenuPushCreate( selectPopup2RM, "", _("Align"), 0, RotateAlign, I2VP(1) );
wMenuSeparatorCreate( selectPopup2M );
- descriptionMI = wMenuPushCreate(selectPopup2M, "cmdMoveLabel", _("Show/Hide Description"), 0, (wMenuCallBack_p)moveDescription, (void*) 0);
+ descriptionMI = wMenuPushCreate(selectPopup2M, "cmdMoveLabel", _("Show/Hide Description"), 0, moveDescription, I2VP(0));
wMenuSeparatorCreate( selectPopup2M );
- hideMI = wMenuPushCreate(selectPopup2M, "", _("Hide/NoHide"), 0,(wMenuCallBack_p) SelectTunnel, (void *) 0);
- bridgeMI = wMenuPushCreate(selectPopup2M, "", _("Bridge/NoBridge"), 0,(wMenuCallBack_p) SelectBridge, (void *) 0);
- tiesMI = wMenuPushCreate(selectPopup2M, "", _("NoTies/Ties"), 0,(wMenuCallBack_p) SelectTies, (void *) 0);
+ hideMI = wMenuPushCreate(selectPopup2M, "", _("Hide/NoHide"), 0, SelectTunnel, I2VP( 0));
+ bridgeMI = wMenuPushCreate(selectPopup2M, "", _("Bridge/NoBridge"), 0, SelectBridge, I2VP( 0));
+ tiesMI = wMenuPushCreate(selectPopup2M, "", _("NoTies/Ties"), 0, SelectTies, I2VP( 0));
selectPopup2TM = wMenuMenuCreate(selectPopup2M, "", _("Thickness..."));
- wMenuPushCreate( selectPopup2TM, "", _("Thin Tracks"), 0, (void*)(wMenuCallBack_p)SelectTrackWidth, (void *)0 );
- wMenuPushCreate( selectPopup2TM, "", _("Medium Tracks"), 0, (void*)(wMenuCallBack_p)SelectTrackWidth, (void *)2 );
- wMenuPushCreate( selectPopup2TM, "", _("Thick Tracks"), 0, (void*)(wMenuCallBack_p)SelectTrackWidth, (void *)3 );
+ wMenuPushCreate( selectPopup2TM, "", _("Thin Tracks"), 0, SelectTrackWidth, I2VP(0 ));
+ wMenuPushCreate( selectPopup2TM, "", _("Medium Tracks"), 0, SelectTrackWidth, I2VP(2 ));
+ wMenuPushCreate( selectPopup2TM, "", _("Thick Tracks"), 0, SelectTrackWidth, I2VP(3 ));
selectPopup2TYM = wMenuMenuCreate( selectPopup2M, "", _("LineType...") );
- wMenuPushCreate( selectPopup2TYM, "", _("Solid Line"), 0, (wMenuCallBack_p)SelectLineType, (void*)0 );
- wMenuPushCreate( selectPopup2TYM, "", _("Dashed Line"), 0, (wMenuCallBack_p)SelectLineType, (void*)1 );
- wMenuPushCreate( selectPopup2TYM, "", _("Dotted Line"), 0, (wMenuCallBack_p)SelectLineType, (void*)2 );
- wMenuPushCreate( selectPopup2TYM, "", _("Dash-Dotted Line"), 0, (wMenuCallBack_p)SelectLineType, (void*)3 );
- wMenuPushCreate( selectPopup2TYM, "", _("Dash-Dot-Dotted Line"), 0, (wMenuCallBack_p)SelectLineType, (void*)4 );
+ wMenuPushCreate( selectPopup2TYM, "", _("Solid Line"), 0, SelectLineType, I2VP(0 ));
+ wMenuPushCreate( selectPopup2TYM, "", _("Dashed Line"), 0, SelectLineType, I2VP(1 ));
+ wMenuPushCreate( selectPopup2TYM, "", _("Dotted Line"), 0, SelectLineType, I2VP(2 ));
+ wMenuPushCreate( selectPopup2TYM, "", _("Dash-Dotted Line"), 0, SelectLineType, I2VP(3 ));
+ wMenuPushCreate( selectPopup2TYM, "", _("Dash-Dot-Dotted Line"), 0, SelectLineType, I2VP(4 ));
wMenuSeparatorCreate( selectPopup2M );
- wMenuPushCreate(selectPopup2M, "", _("Move To Front"), 0,(wMenuCallBack_p) SelectAbove,(void *) 0);
- wMenuPushCreate(selectPopup2M, "", _("Move To Back"), 0,(wMenuCallBack_p) SelectBelow, (void *) 0);
+ wMenuPushCreate(selectPopup2M, "", _("Move To Front"), 0, SelectAbove,I2VP( 0));
+ wMenuPushCreate(selectPopup2M, "", _("Move To Back"), 0, SelectBelow, I2VP( 0));
wMenuSeparatorCreate( selectPopup2M );
- wMenuPushCreate(selectPopup2M, "", _("Group"), 0,(wMenuCallBack_p) DoGroup, (void *) 0);
- wMenuPushCreate(selectPopup2M, "", _("UnGroup"), 0,(wMenuCallBack_p) DoUngroup, (void *) 0);
+ wMenuPushCreate(selectPopup2M, "", _("Group"), 0, DoGroup, I2VP( 0));
+ wMenuPushCreate(selectPopup2M, "", _("UnGroup"), 0, DoUngroup, I2VP( 0));
wMenuSeparatorCreate( selectPopup2M );
ParamRegister( &rescalePG );
@@ -3375,41 +3720,38 @@ EXPORT void InitCmdSelect2( wMenu_p menu ) {
EXPORT void InitCmdDelete( void )
{
wIcon_p icon;
- icon = wIconCreatePixMap( delete_xpm );
+ icon = wIconCreatePixMap( delete_xpm[iconSize] );
AddToolbarButton( "cmdDelete", icon, IC_SELECTED, (wButtonCallBack_p)SelectDelete, 0 );
-#ifdef WINDOWS
- wAttachAccelKey( wAccelKey_Del, 0, (wAccelKeyCallBack_p)SelectDelete, NULL );
-#endif
}
EXPORT void InitCmdTunnel( void )
{
wIcon_p icon;
- icon = wIconCreatePixMap( tunnel_xpm );
- AddToolbarButton( "cmdTunnel", icon, IC_SELECTED|IC_POPUP, (addButtonCallBack_t)SelectTunnel, NULL );
+ icon = wIconCreatePixMap( tunnel_xpm[iconSize] );
+ AddToolbarButton( "cmdTunnel", icon, IC_SELECTED|IC_POPUP, SelectTunnel, NULL );
}
EXPORT void InitCmdBridge( void)
{
wIcon_p icon;
- icon = wIconCreatePixMap( bridge_xpm );
- AddToolbarButton( "cmdBridge", icon, IC_SELECTED|IC_POPUP, (addButtonCallBack_t)SelectBridge, NULL );
+ icon = wIconCreatePixMap( bridge_xpm[iconSize] );
+ AddToolbarButton( "cmdBridge", icon, IC_SELECTED|IC_POPUP, SelectBridge, NULL );
}
EXPORT void InitCmdMoveDescription( wMenu_p menu )
{
- AddMenuButton( menu, CmdMoveDescription, "cmdMoveLabel", _("Move Description"), wIconCreatePixMap(movedesc_xpm),
- LEVEL0, IC_STICKY|IC_POPUP3|IC_CMDMENU|IC_WANT_MOVE, ACCL_MOVEDESC, (void*) 0 );
+ AddMenuButton( menu, CmdMoveDescription, "cmdMoveLabel", _("Move Description"), wIconCreatePixMap(description_xpm[iconSize]),
+ LEVEL0, IC_STICKY|IC_POPUP3|IC_CMDMENU|IC_WANT_MOVE, ACCL_MOVEDESC, I2VP( 0 ));
}
EXPORT void InitCmdMove( wMenu_p menu )
{
- moveCmdInx = AddMenuButton( menu, CmdMove, "cmdMove", _("Move"), wIconCreatePixMap(move_xpm),
+ moveCmdInx = AddMenuButton( menu, CmdMove, "cmdMove", _("Move"), wIconCreatePixMap(move_xpm[iconSize]),
LEVEL0, IC_STICKY|IC_SELECTED|IC_CMDMENU|IC_WANT_MOVE, ACCL_MOVE, NULL );
- rotateCmdInx = AddMenuButton( menu, CmdRotate, "cmdRotate", _("Rotate"), wIconCreatePixMap(rotate_xpm),
+ rotateCmdInx = AddMenuButton( menu, CmdRotate, "cmdRotate", _("Rotate"), wIconCreatePixMap(rotate_xpm[iconSize]),
LEVEL0, IC_STICKY|IC_SELECTED|IC_CMDMENU|IC_WANT_MOVE, ACCL_ROTATE, NULL );
- /*flipCmdInx =*/ AddMenuButton( menu, CmdFlip, "cmdFlip", _("Flip"), wIconCreatePixMap(flip_xpm),
+ flipCmdInx = AddMenuButton( menu, CmdFlip, "cmdFlip", _("Flip"), wIconCreatePixMap(reflect_xpm[iconSize]),
LEVEL0, IC_STICKY|IC_SELECTED|IC_CMDMENU, ACCL_FLIP, NULL );
}