summaryrefslogtreecommitdiff
path: root/app/bin/cstruct.c
diff options
context:
space:
mode:
Diffstat (limited to 'app/bin/cstruct.c')
-rw-r--r--app/bin/cstruct.c421
1 files changed, 317 insertions, 104 deletions
diff --git a/app/bin/cstruct.c b/app/bin/cstruct.c
index 6ad240c..6907e2c 100644
--- a/app/bin/cstruct.c
+++ b/app/bin/cstruct.c
@@ -33,13 +33,13 @@
#include "layout.h"
#include "messages.h"
#include "param.h"
+#include "include/paramfile.h"
#include "track.h"
#include "utility.h"
+#include "ccurve.h"
EXPORT TRKTYP_T T_STRUCTURE = -1;
-#define STRUCTCMD
-
EXPORT dynArr_t structureInfo_da;
typedef struct compoundData extraData;
@@ -51,7 +51,6 @@ static int log_structure = 0;
static wMenu_p structPopupM;
-#ifdef STRUCTCMD
static drawCmd_t structureD = {
NULL,
&screenDrawFuncs,
@@ -86,7 +85,7 @@ static paramData_t structurePLs[] = {
#define I_MSGHEIGHT (5)
{ PD_MESSAGE, NULL, NULL, 0, (void*)80 } };
static paramGroup_t structurePG = { "structure", 0, structurePLs, sizeof structurePLs/sizeof structurePLs[0] };
-#endif
+
/****************************************
@@ -133,24 +132,103 @@ EXPORT turnoutInfo_t * CreateNewStructure(
#endif
to->paramFileIndex = curParamFileIndex;
if (curParamFileIndex == PARAM_CUSTOM)
- to->contentsLabel = "Custom Structures";
+ to->contentsLabel = MyStrdup("Custom Structures");
else
to->contentsLabel = curSubContents;
to->endCnt = 0;
to->pathLen = 0;
to->paths = (PATHPTR_T)"";
-#ifdef STRUCTCMD
if (updateList && structureListL != NULL) {
FormatCompoundTitle( LABEL_TABBED|LABEL_MANUF|LABEL_PARTNO|LABEL_DESCR, to->title );
if (message[0] != '\0')
wListAddValue( structureListL, message, NULL, to );
}
-#endif
to->barScale = curBarScale>0?curBarScale:-1;
return to;
}
+/**
+ * Delete a structure definition from memory.
+ * \TODO Find a better way to handle Custom Structures (see CreateNewStructure)
+ *
+ * \param [IN] structure the structure to be deleted
+ */
+
+BOOL_T
+StructureDelete(void *structure)
+{
+ turnoutInfo_t * to = (turnoutInfo_t *)structure;
+ MyFree(to->title);
+ MyFree(to->segs);
+
+ MyFree(to);
+ return(TRUE);
+}
+
+/**
+ * Delete all structure definitions that came from a specific parameter
+ * file. Due to the way the definitions are loaded from file it is safe to
+ * assume that they form a contiguous block in the array.
+ *
+ * \param fileIndex parameter file.
+ */
+
+void
+DeleteStructures(int fileIndex)
+{
+ int inx = 0;
+ int startInx = -1;
+ int cnt = 0;
+
+ // go to the start of the block
+ while (inx < structureInfo_da.cnt &&
+ structureInfo(inx)->paramFileIndex != fileIndex) {
+ startInx = inx++;
+ }
+
+ // delete them
+ for (; inx < structureInfo_da.cnt &&
+ structureInfo(inx)->paramFileIndex == fileIndex; inx++) {
+ turnoutInfo_t * to = structureInfo(inx);
+ if (to->paramFileIndex == fileIndex) {
+ StructureDelete(to);
+ cnt++;
+ }
+ }
+
+ // copy down the rest of the list to fill the gap
+ startInx++;
+ while (inx < structureInfo_da.cnt) {
+ structureInfo(startInx++) = structureInfo(inx++);
+ }
+
+ // and reduce the actual number
+ structureInfo_da.cnt -= cnt;
+}
+
+enum paramFileState
+GetStructureCompatibility(int paramFileIndex, SCALEINX_T scaleIndex)
+{
+ int i;
+ enum paramFileState ret = PARAMFILE_NOTUSABLE;
+ DIST_T ratio = GetScaleRatio(scaleIndex);
+
+ if (!IsParamValid(paramFileIndex)) {
+ return(PARAMFILE_UNLOADED);
+ }
+
+ for (i = 0; i < structureInfo_da.cnt; i++) {
+ turnoutInfo_t *to = structureInfo(i);
+ if (to->paramFileIndex == paramFileIndex) {
+ if (GetScaleRatio(to->scaleInx) == ratio || to->scaleInx == SCALE_ANY) {
+ ret = PARAMFILE_FIT;
+ break;
+ }
+ }
+ }
+ return(ret);
+}
static BOOL_T ReadStructureParam(
char * firstLine )
@@ -164,7 +242,8 @@ static dynArr_t pierInfo_da;
if ( !GetArgs( firstLine+10, "sq", scale, &title ) )
return FALSE;
- ReadSegs();
+ if ( !ReadSegs() )
+ return FALSE;
to = CreateNewStructure( scale, title, tempSegs_da.cnt, &tempSegs(0), FALSE );
if (to == NULL)
return FALSE;
@@ -175,7 +254,8 @@ static dynArr_t pierInfo_da;
cp = tempSpecial+strlen(PIER);
while (cp) {
DYNARR_APPEND( pierInfo_t, pierInfo_da, 10 );
- GetArgs( cp, "fqc", &pierInfo(pierInfo_da.cnt-1).height, &pierInfo(pierInfo_da.cnt-1).name, &cp );
+ if ( !GetArgs( cp, "fqc", &pierInfo(pierInfo_da.cnt-1).height, &pierInfo(pierInfo_da.cnt-1).name, &cp ) )
+ return FALSE;
}
to->u.pierInfo.cnt = pierInfo_da.cnt;
to->u.pierInfo.info = (pierInfo_t*)MyMalloc( pierInfo_da.cnt * sizeof *(pierInfo_t*)NULL );
@@ -196,6 +276,7 @@ EXPORT turnoutInfo_t * StructAdd( long mode, SCALEINX_T scale, wList_p list, coO
{
wIndex_t inx;
turnoutInfo_t * to, *to1=NULL;
+ structureInx = 0;
for ( inx = 0; inx < structureInfo_da.cnt; inx++ ) {
to = structureInfo(inx);
if ( IsParamValid(to->paramFileIndex) &&
@@ -204,6 +285,10 @@ EXPORT turnoutInfo_t * StructAdd( long mode, SCALEINX_T scale, wList_p list, coO
to->segCnt != 0 ) {
if (to1 == NULL)
to1 = to;
+ if ( to == curStructure ) {
+ to1 = to;
+ structureInx = wListGetCount( list );
+ }
FormatCompoundTitle( mode, to->title );
if (message[0] != '\0') {
wListAddValue( list, message, NULL, to );
@@ -232,38 +317,45 @@ static void DrawStructure(
wDrawColor color )
{
struct extraData *xx = GetTrkExtraData(t);
- coOrd p00, px0, pxy, p0y, orig, size;
-
- if (d->options&DC_QUICK) {
- GetSegBounds( zero, 0.0, xx->segCnt, xx->segs, &orig, &size );
- p00.x = p0y.x = orig.x;
- p00.y = px0.y = orig.y;
- px0.x = pxy.x = orig.x + size.x;
- p0y.y = pxy.y = orig.y + size.y;
- REORIGIN1( p00, xx->angle, xx->orig )
- REORIGIN1( px0, xx->angle, xx->orig )
- REORIGIN1( p0y, xx->angle, xx->orig )
- REORIGIN1( pxy, xx->angle, xx->orig )
- DrawLine( d, p00, px0, 0, color );
- DrawLine( d, px0, pxy, 0, color );
- DrawLine( d, pxy, p0y, 0, color );
- DrawLine( d, p0y, p00, 0, color );
- } else {
- DrawSegs( d, xx->orig, xx->angle, xx->segs, xx->segCnt, 0.0, color );
- if ( ((d->funcs->options&wDrawOptTemp)==0) &&
- (labelWhen == 2 || (labelWhen == 1 && (d->options&DC_PRINT))) &&
- labelScale >= d->scale &&
- ( GetTrkBits( t ) & TB_HIDEDESC ) == 0 ) {
- DrawCompoundDescription( t, d, color );
- }
+
+ d->options &= ~DC_NOTSOLIDLINE;
+ switch(xx->lineType) {
+ case DRAWLINESOLID:
+ break;
+ case DRAWLINEDASH:
+ d->options |= DC_DASH;
+ break;
+ case DRAWLINEDOT:
+ d->options |= DC_DOT;
+ break;
+ case DRAWLINEDASHDOT:
+ d->options |= DC_DASHDOT;
+ break;
+ case DRAWLINEDASHDOTDOT:
+ d->options |= DC_DASHDOTDOT;
+ break;
+ case DRAWLINECENTER:
+ d->options |= DC_CENTER;
+ break;
+ case DRAWLINEPHANTOM:
+ d->options |= DC_CENTER;
+ break;
+ }
+ DrawSegs( d, xx->orig, xx->angle, xx->segs, xx->segCnt, 0.0, color );
+ d->options &= ~DC_NOTSOLIDLINE;
+ if ( ((d->options & DC_SIMPLE)==0) &&
+ (labelWhen == 2 || (labelWhen == 1 && (d->options&DC_PRINT))) &&
+ labelScale >= d->scale &&
+ ( GetTrkBits( t ) & TB_HIDEDESC ) == 0 ) {
+ DrawCompoundDescription( t, d, color );
}
}
-static void ReadStructure(
+static BOOL_T ReadStructure(
char * line )
{
- ReadCompound( line+10, T_STRUCTURE );
+ return ReadCompound( line+10, T_STRUCTURE );
}
@@ -291,12 +383,31 @@ static BOOL_T QueryStructure( track_p trk, int query )
switch ( query ) {
case Q_HAS_DESC:
return TRUE;
+ case Q_IS_STRUCTURE:
+ return TRUE;
default:
return FALSE;
}
}
+static wBool_t CompareStruct( track_cp trk1, track_cp trk2 )
+{
+ struct extraData *xx1 = GetTrkExtraData( trk1 );
+ struct extraData *xx2 = GetTrkExtraData( trk2 );
+ char * cp = message + strlen(message);
+ REGRESS_CHECK_POS( "Orig", xx1, xx2, orig )
+ REGRESS_CHECK_ANGLE( "Angle", xx1, xx2, angle )
+ REGRESS_CHECK_INT( "Flipped", xx1, xx2, flipped )
+ REGRESS_CHECK_INT( "Ungrouped", xx1, xx2, ungrouped )
+ REGRESS_CHECK_INT( "Split", xx1, xx2, split )
+ /* desc orig is not stable
+ REGRESS_CHECK_POS( "DescOrig", xx1, xx2, descriptionOrig ) */
+ REGRESS_CHECK_POS( "DescOff", xx1, xx2, descriptionOff )
+ REGRESS_CHECK_POS( "DescSize", xx1, xx2, descriptionSize )
+ return CompareSegs( xx1->segs, xx1->segCnt, xx1->segs, xx1->segCnt );
+}
+
static trackCmd_t structureCmds = {
"STRUCTURE",
DrawStructure,
@@ -322,7 +433,17 @@ static trackCmd_t structureCmds = {
NULL, /* moveEndPt */
QueryStructure,
UngroupCompound,
- FlipCompound };
+ FlipCompound,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ CompareStruct };
static paramData_t pierPLs[] = {
{ PD_DROPLIST, &pierListInx, "inx", 0, (void*)50, N_("Pier Number") } };
@@ -360,7 +481,6 @@ static void ShowPierL( void )
}
-#ifdef STRUCTCMD
/*****************************************
*
* Structure Dialog
@@ -404,13 +524,14 @@ static void structureChange( long changes )
(changes&CHANGE_PARAMS) == 0 ) )
return;
lastScaleName = curScaleName;
- curStructure = NULL;
+ //curStructure = NULL;
wControlShow( (wControl_p)structureListL, FALSE );
wListClear( structureListL );
maxStructureDim.x = maxStructureDim.y = 0.0;
if (structureInfo_da.cnt <= 0)
return;
curStructure = StructAdd( LABEL_TABBED|LABEL_MANUF|LABEL_PARTNO|LABEL_DESCR, GetLayoutCurScale(), structureListL, &maxStructureDim );
+ wListSetIndex( structureListL, structureInx );
wControlShow( (wControl_p)structureListL, TRUE );
if (curStructure == NULL) {
wDrawClear( structureD.d );
@@ -468,7 +589,7 @@ static void DoStructOk( void )
Reset();
}
-#endif
+
/****************************************
*
@@ -488,6 +609,51 @@ static struct {
static track_p pierTrk;
static EPINX_T pierEp;
+static dynArr_t anchors_da;
+#define anchors(N) DYNARR_N(trkSeg_t,anchors_da,N)
+
+void static CreateArrowAnchor(coOrd pos,ANGLE_T a,DIST_T len) {
+ DYNARR_APPEND(trkSeg_t,anchors_da,1);
+ int i = anchors_da.cnt-1;
+ anchors(i).type = SEG_STRLIN;
+ anchors(i).width = 0;
+ anchors(i).u.l.pos[0] = pos;
+ Translate(&anchors(i).u.l.pos[1],pos,NormalizeAngle(a+135),len);
+ anchors(i).color = wDrawColorBlue;
+ DYNARR_APPEND(trkSeg_t,anchors_da,1);
+ i = anchors_da.cnt-1;
+ anchors(i).type = SEG_STRLIN;
+ anchors(i).width = 0;
+ anchors(i).u.l.pos[0] = pos;
+ Translate(&anchors(i).u.l.pos[1],pos,NormalizeAngle(a-135),len);
+ anchors(i).color = wDrawColorBlue;
+}
+
+void static CreateRotateAnchor(coOrd pos) {
+ DIST_T d = tempD.scale*0.15;
+ DYNARR_APPEND(trkSeg_t,anchors_da,1);
+ int i = anchors_da.cnt-1;
+ anchors(i).type = SEG_CRVLIN;
+ anchors(i).width = 0.5;
+ 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*2;
+ anchors(i).color = wDrawColorAqua;
+ coOrd head; //Arrows
+ for (int j=0;j<3;j++) {
+ Translate(&head,pos,j*120,d*2);
+ CreateArrowAnchor(head,NormalizeAngle((j*120)+90),d);
+ }
+}
+
+void static CreateMoveAnchor(coOrd pos) {
+ DYNARR_SET(trkSeg_t,anchors_da,anchors_da.cnt+5);
+ 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);
+}
+
static ANGLE_T PlaceStructure(
coOrd p0,
coOrd p1,
@@ -537,11 +703,9 @@ static void NewStructure( void )
wListGetIndex(pierL) == -1) {
return;
}
- DrawSegs( &tempD, Dst.pos, Dst.angle,
- curStructure->segs, curStructure->segCnt, 0.0, wDrawColorBlack );
UndoStart( _("Place Structure"), "newStruct" );
titleLen = strlen( curStructure->title );
- trk = NewCompound( T_STRUCTURE, 0, Dst.pos, Dst.angle, curStructure->title, 0, NULL, 0, "", curStructure->segCnt, curStructure->segs );
+ trk = NewCompound( T_STRUCTURE, 0, Dst.pos, Dst.angle, curStructure->title, 0, NULL, NULL, 0, "", curStructure->segCnt, curStructure->segs );
xx = GetTrkExtraData(trk);
#ifdef LATER
trk = NewTrack( 0, T_STRUCTURE, 0, sizeof (*xx) + 1 );
@@ -581,6 +745,8 @@ static void NewStructure( void )
}
SetTrkVisible( trk, TRUE );
+ SetTrkNoTies( trk, FALSE);
+ SetTrkBridge( trk, FALSE);
#ifdef LATER
ComputeCompoundBoundingBox( trk );
@@ -600,17 +766,14 @@ static void NewStructure( void )
static void StructRotate( void * pangle )
{
+ if (Dst.state == 0)
+ return;
ANGLE_T angle = (ANGLE_T)(long)pangle;
- if (Dst.state == 1)
- DrawSegs( &tempD, Dst.pos, Dst.angle,
- curStructure->segs, curStructure->segCnt, 0.0, wDrawColorBlack );
- else
- Dst.pos = cmdMenuPos;
+ angle /= 1000.0;
+ Dst.pos = cmdMenuPos;
Rotate( &Dst.pos, cmdMenuPos, angle );
Dst.angle += angle;
- DrawSegs( &tempD, Dst.pos, Dst.angle,
- curStructure->segs, curStructure->segCnt, 0.0, wDrawColorBlack );
- Dst.state = 1;
+ TempRedraw(); // StructRotate
}
@@ -629,64 +792,62 @@ EXPORT STATUS_T CmdStructureAction(
switch (action & 0xFF) {
case C_START:
+ DYNARR_RESET(trkSeg_t,anchors_da);
Dst.state = 0;
Dst.angle = 00.0;
ShowPierL();
+ InfoMessage(_("Left-Drag to place, Ctrl+Left-Drag or Right-Drag to Rotate, Space or Enter to accept, Esc to Cancel"));
return C_CONTINUE;
+ case wActionMove:
+ DYNARR_RESET(trkSeg_t,anchors_da);
+ if (Dst.state && (MyGetKeyState()&WKEY_CTRL)) {
+ CreateRotateAnchor(pos);
+ } else {
+ CreateMoveAnchor(pos);
+ }
+ return C_CONTINUE;
+ break;
+
case C_DOWN:
+ DYNARR_RESET(trkSeg_t,anchors_da);
if ( curStructure == NULL ) return C_CONTINUE;
ShowPierL();
- if (Dst.state == 1) {
- DrawSegs( &tempD, Dst.pos, Dst.angle,
- curStructure->segs, curStructure->segCnt, 0.0, wDrawColorBlack );
- } else {
- Dst.pos = pos;
- }
+ Dst.pos = pos;
rot0 = pos;
origPos = Dst.pos;
PlaceStructure( rot0, pos, origPos, &Dst.pos, &Dst.angle );
Dst.state = 1;
- DrawSegs( &tempD, Dst.pos, Dst.angle,
- curStructure->segs, curStructure->segCnt, 0.0, wDrawColorBlack );
InfoMessage( _("Drag to place") );
+ CreateMoveAnchor(pos);
return C_CONTINUE;
case C_MOVE:
+ DYNARR_RESET(trkSeg_t,anchors_da);
if ( curStructure == NULL ) return C_CONTINUE;
- DrawSegs( &tempD, Dst.pos, Dst.angle,
- curStructure->segs, curStructure->segCnt, 0.0, wDrawColorBlack );
PlaceStructure( rot0, pos, origPos, &Dst.pos, &Dst.angle );
- DrawSegs( &tempD, Dst.pos, Dst.angle,
- curStructure->segs, curStructure->segCnt, 0.0, wDrawColorBlack );
- MainRedraw();
- MapRedraw();
+ CreateMoveAnchor(pos);
InfoMessage( "[ %0.3f %0.3f ]", pos.x - origPos.x, pos.y - origPos.y );
return C_CONTINUE;
case C_RDOWN:
+ DYNARR_RESET(trkSeg_t,anchors_da);
if ( curStructure == NULL ) return C_CONTINUE;
- if (Dst.state == 1)
- DrawSegs( &tempD, Dst.pos, Dst.angle,
- curStructure->segs, curStructure->segCnt, 0.0, wDrawColorBlack );
- else
- Dst.pos = pos;
+ if (Dst.state == 0) {
+ Dst.pos = pos; // If first, use pos, otherwise use current
+ }
rot0 = rot1 = pos;
- DrawLine( &tempD, rot0, rot1, 0, wDrawColorBlack );
- Dst.state = 1;
- DrawSegs( &tempD, Dst.pos, Dst.angle,
- curStructure->segs, curStructure->segCnt, 0.0, wDrawColorBlack );
+ CreateRotateAnchor(pos);
origPos = Dst.pos;
origAngle = Dst.angle;
InfoMessage( _("Drag to rotate") );
+ Dst.state = 2;
validAngle = FALSE;
return C_CONTINUE;
case C_RMOVE:
+ DYNARR_RESET(trkSeg_t,anchors_da);
if ( curStructure == NULL ) return C_CONTINUE;
- DrawSegs( &tempD, Dst.pos, Dst.angle,
- curStructure->segs, curStructure->segCnt, 0.0, wDrawColorBlack );
- DrawLine( &tempD, rot0, rot1, 0, wDrawColorBlack );
rot1 = pos;
if ( FindDistance( rot0, rot1 ) > (6.0/75.0)*mainD.scale ) {
angle = FindAngle( rot0, rot1 );
@@ -700,36 +861,37 @@ EXPORT STATUS_T CmdStructureAction(
Rotate( &Dst.pos, rot0, angle );
}
InfoMessage( _("Angle = %0.3f"), Dst.angle );
- DrawLine( &tempD, rot0, rot1, 0, wDrawColorBlack );
- DrawSegs( &tempD, Dst.pos, Dst.angle,
- curStructure->segs, curStructure->segCnt, 0.0, wDrawColorBlack );
+ Dst.state = 2;
+ CreateRotateAnchor(rot0);
return C_CONTINUE;
case C_RUP:
- DrawLine( &tempD, rot0, rot1, 0, wDrawColorBlack );
case C_UP:
- MainRedraw();
- MapRedraw();
+ DYNARR_RESET(trkSeg_t,anchors_da);
+ CreateMoveAnchor(pos);
+ Dst.state = 1;
+ InfoMessage(_("Left-Drag to place, Ctrl+Left-Drag or Right-Drag to Rotate, Space or Enter to accept, Esc to Cancel"));
return C_CONTINUE;
case C_CMDMENU:
- if ( structPopupM == NULL ) {
- structPopupM = MenuRegister( "Structure Rotate" );
- AddRotateMenu( structPopupM, StructRotate );
- }
+ DYNARR_RESET(trkSeg_t,anchors_da);
+ menuPos = pos;
wMenuPopupShow( structPopupM );
return C_CONTINUE;
case C_REDRAW:
- if (Dst.state == 1)
+ if (Dst.state)
DrawSegs( &tempD, Dst.pos, Dst.angle,
- curStructure->segs, curStructure->segCnt, 0.0, wDrawColorBlack );
+ curStructure->segs, curStructure->segCnt, 0.0, wDrawColorBlue );
+ if (anchors_da.cnt>0) {
+ DrawSegs( &tempD, zero, 0.0, &anchors(0), anchors_da.cnt, trackGauge, wDrawColorBlack );
+ }
+ if (Dst.state == 2)
+ DrawLine( &tempD, rot0, rot1, 0, wDrawColorBlack );
return C_CONTINUE;
case C_CANCEL:
- if (Dst.state == 1)
- DrawSegs( &tempD, Dst.pos, Dst.angle,
- curStructure->segs, curStructure->segCnt, 0.0, wDrawColorBlack );
+ DYNARR_RESET(trkSeg_t,anchors_da);
Dst.state = 0;
InfoSubstituteControls( NULL, NULL );
HotBarCancel();
@@ -739,12 +901,15 @@ EXPORT STATUS_T CmdStructureAction(
case C_TEXT:
if ((action>>8) != ' ')
return C_CONTINUE;
+ /*no break*/
case C_OK:
+ DYNARR_RESET(trkSeg_t,anchors_da);
NewStructure();
InfoSubstituteControls( NULL, NULL );
return C_TERMINATE;
case C_FINISH:
+ DYNARR_RESET(trkSeg_t,anchors_da);
if (Dst.state != 0)
CmdStructureAction( C_OK, pos );
else
@@ -791,17 +956,37 @@ static STATUS_T CmdStructure(
ParamGroupRecord( &structurePG );
return CmdStructureAction( action, pos );
+ case wActionMove:
+ DYNARR_RESET(trkSeg_t,anchors_da);
+ if (Dst.state && (MyGetKeyState()&WKEY_CTRL)) {
+ CreateRotateAnchor(pos);
+ } else {
+ CreateMoveAnchor(pos);
+ }
+ return C_CONTINUE;
+ break;
case C_DOWN:
+ if (MyGetKeyState()&WKEY_CTRL) {
+ return CmdStructureAction( C_RDOWN, pos );
+ }
+ /* no break*/
case C_RDOWN:
ParamDialogOkActive( &structurePG, TRUE );
if (hideStructureWindow)
wHide( structureW );
+ return CmdStructureAction( action, pos );
case C_MOVE:
+ if (MyGetKeyState()&WKEY_CTRL) {
+ return CmdStructureAction( C_RMOVE, pos );
+ }
+ /*no break*/
case C_RMOVE:
return CmdStructureAction( action, pos );
-
case C_RUP:
case C_UP:
+ if (MyGetKeyState()&WKEY_CTRL) {
+ return CmdStructureAction( C_RUP, pos );
+ }
if (hideStructureWindow)
wShow( structureW );
InfoMessage( _("Left drag to move, right drag to rotate, or press Return or click Ok to finalize") );
@@ -810,11 +995,12 @@ static STATUS_T CmdStructure(
case C_CANCEL:
wHide( structureW );
+ /*no break*/
+ case C_REDRAW:
case C_TEXT:
case C_OK:
case C_FINISH:
case C_CMDMENU:
- case C_REDRAW:
return CmdStructureAction( action, pos );
default:
@@ -848,6 +1034,8 @@ static char * CmdStructureHotBarProc(
case HB_FULLTITLE:
return to->title;
case HB_DRAW:
+ origP->x -= to->orig.x;
+ origP->y -= to->orig.y;
DrawSegs( d, *origP, 0.0, to->segs, to->segCnt, trackGauge, wDrawColorBlack );
return NULL;
}
@@ -867,7 +1055,7 @@ EXPORT void AddHotBarStructures( void )
/*( (strcmp( to->scale, "*" ) == 0 && strcasecmp( curScaleName, "DEMO" ) != 0 ) ||
strncasecmp( to->scale, curScaleName, strlen(to->scale) ) == 0 ) ) )*/
continue;
- AddHotBarElement( to->contentsLabel, to->size, to->orig, FALSE, to->barScale, to, CmdStructureHotBarProc );
+ AddHotBarElement( to->contentsLabel, to->size, to->orig, FALSE, FALSE, to->barScale, to, CmdStructureHotBarProc );
}
}
@@ -885,47 +1073,72 @@ static STATUS_T CmdStructureHotBar(
}
FormatCompoundTitle( listLabels|LABEL_DESCR, curStructure->title );
InfoMessage( _("Place %s and draw into position"), message );
- ParamLoadControls( &structurePG );
- ParamGroupRecord( &structurePG );
+ wIndex_t listIndex = FindListItemByContext( structureListL, curStructure );
+ if ( listIndex > 0 )
+ structureInx = listIndex;
+ //ParamLoadControls( &structurePG );
+ //ParamGroupRecord( &structurePG );
+ return CmdStructureAction( action, pos );
+
+ case wActionMove:
+ return CmdStructureAction( action, pos );
+
+ case C_RDOWN:
+ case C_DOWN:
+ if (MyGetKeyState()&WKEY_CTRL) {
+ return CmdStructureAction( C_RDOWN, pos );
+ }
+ return CmdStructureAction( action, pos );
+
+ case C_RMOVE:
+ case C_MOVE:
+ if (MyGetKeyState()&WKEY_CTRL) {
+ return CmdStructureAction( C_RMOVE, pos );
+ }
return CmdStructureAction( action, pos );
case C_RUP:
case C_UP:
- InfoMessage( _("Left drag to move, right drag to rotate, or press Return or click Ok to finalize") );
+ if (MyGetKeyState()&WKEY_CTRL) {
+ return CmdStructureAction( C_RUP, pos );
+ }
+ InfoMessage( _("Left-Drag to place, Ctrl+Left-Drag or Right-Drag to Rotate, Space or Enter to accept, Esc to Cancel") );
return CmdStructureAction( action, pos );
case C_TEXT:
if ((action>>8) != ' ')
return C_CONTINUE;
+ /*no break*/
case C_OK:
CmdStructureAction( action, pos );
return C_CONTINUE;
case C_CANCEL:
HotBarCancel();
+ /* no break*/
default:
return CmdStructureAction( action, pos );
}
}
-
-#ifdef STRUCTCMD
#include "bitmaps/struct.xpm"
EXPORT void InitCmdStruct( wMenu_p menu )
{
- AddMenuButton( menu, CmdStructure, "cmdStructure", _("Structure"), wIconCreatePixMap(struct_xpm), LEVEL0_50, IC_STICKY|IC_CMDMENU|IC_POPUP2, ACCL_STRUCTURE, NULL );
- structureHotBarCmdInx = AddMenuButton( menu, CmdStructureHotBar, "cmdStructureHotBar", "", NULL, LEVEL0_50, IC_STICKY|IC_CMDMENU|IC_POPUP2, 0, NULL );
+ AddMenuButton( menu, CmdStructure, "cmdStructure", _("Structure"), wIconCreatePixMap(struct_xpm), LEVEL0_50, IC_WANT_MOVE|IC_STICKY|IC_CMDMENU|IC_POPUP2, ACCL_STRUCTURE, NULL );
+ structureHotBarCmdInx = AddMenuButton( menu, CmdStructureHotBar, "cmdStructureHotBar", "", NULL, LEVEL0_50, IC_WANT_MOVE|IC_STICKY|IC_CMDMENU|IC_POPUP2, 0, NULL );
ParamRegister( &structurePG );
+ if ( structPopupM == NULL ) {
+ structPopupM = MenuRegister( "Structure Rotate" );
+ AddRotateMenu( structPopupM, StructRotate );
+ }
}
-#endif
-
EXPORT void InitTrkStruct( void )
{
T_STRUCTURE = InitObject( &structureCmds );
log_structure = LogFindIndex( "Structure" );
- AddParam( "STRUCTURE ", ReadStructureParam );
+ AddParam( "STRUCTURE ", ReadStructureParam);
ParamRegister( &pierPG );
}