From b623f5953691b2a0614e6f1f4def86bdbb9a4113 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rg=20Frings-F=C3=BCrst?= Date: Sat, 8 Aug 2020 11:53:00 +0200 Subject: New upstream version 5.2.0Beta2.1 --- app/bin/dprmfile.c | 757 +++++++++++++++++++++++------------------------------ 1 file changed, 324 insertions(+), 433 deletions(-) (limited to 'app/bin/dprmfile.c') diff --git a/app/bin/dprmfile.c b/app/bin/dprmfile.c index 24250e7..3bb249e 100644 --- a/app/bin/dprmfile.c +++ b/app/bin/dprmfile.c @@ -1,5 +1,5 @@ /** \file dprmfile.c - * Param File Management + * Param File Dialog */ /* XTrkCad - Model Railroad CAD @@ -21,535 +21,426 @@ */ #include +#include #include #include -#include #include "custom.h" +#include "dynstring.h" #include "fileio.h" #include "i18n.h" #include "messages.h" #include "param.h" +#include "include/paramfile.h" +#include "include/paramfilelist.h" #include "paths.h" #include "track.h" -typedef struct { - char * name; - char * contents; - int deleted; - int deletedShadow; - int valid; - } paramFileInfo_t; -typedef paramFileInfo_t * paramFileInfo_p; -static dynArr_t paramFileInfo_da; -#define paramFileInfo(N) DYNARR_N( paramFileInfo_t, paramFileInfo_da, N ) - -EXPORT int curParamFileIndex = PARAM_DEMO; -static char curParamDir[STR_LONG_SIZE]; static struct wFilSel_t * paramFile_fs; -EXPORT wBool_t IsParamValid( - int fileInx ) -{ - if (fileInx == PARAM_DEMO) - return (curDemo>=0); - else if (fileInx == PARAM_CUSTOM) - return TRUE; - else if (fileInx == PARAM_LAYOUT) - return TRUE; - else if (fileInx >= 0 && fileInx < paramFileInfo_da.cnt) - return (!paramFileInfo(fileInx).deleted) && paramFileInfo(fileInx).valid; - else - return FALSE; -} - - -EXPORT char * GetParamFileName( - int fileInx ) -{ - return paramFileInfo(fileInx).contents; -} - - -static BOOL_T UpdateParamFiles( void ) -{ - char fileName[STR_LONG_SIZE], *fileNameP; - char * contents; - const char * cp; - FILE * updateF; - FILE * paramF; - long updateTime; - long lastTime; - - MakeFullpath(&fileNameP, libDir, "xtrkcad.upd", NULL); - updateF = fopen( fileNameP, "r" ); - free(fileNameP); - if ( updateF == NULL ) - return FALSE; - if ( fgets( message, sizeof message, updateF ) == NULL ) { - NoticeMessage( "short file: xtrkcad.upd", _("Ok"), NULL ); - return FALSE; - } - wPrefGetInteger( "file", "updatetime", &lastTime, 0 ); - updateTime = atol( message ); - if ( lastTime >= updateTime ) - return FALSE; - - while ( ( fgets( fileName, STR_LONG_SIZE, updateF ) ) != NULL ) { - Stripcr( fileName ); - InfoMessage( _("Updating %s"), fileName ); - MakeFullpath(&fileNameP, libDir, "params", fileName, NULL); - paramF = fopen( fileNameP, "r" ); - if ( paramF == NULL ) { - NoticeMessage( MSG_PRMFIL_OPEN_NEW, _("Ok"), NULL, fileNameP ); - free(fileNameP); - continue; - } - contents = NULL; - while ( ( fgets(message, sizeof message, paramF) ) != NULL ) { - if (strncmp( message, "CONTENTS", 8 ) == 0) { - Stripcr( message ); - contents = message+9; - break; - } - } - fclose( paramF ); - if (contents == NULL) { - NoticeMessage( MSG_PRMFIL_NO_CONTENTS, _("Ok"), NULL, fileNameP ); - free(fileNameP); - continue; - } - cp = wPrefGetString( "Parameter File Map", contents ); - wPrefSetString( "Parameter File Map", contents, fileNameP ); - if (cp!=NULL && *cp!='\0') { - /* been there, done that */ - free(fileNameP); - continue; - } - - DYNARR_APPEND( paramFileInfo_t, paramFileInfo_da, 10 ); - curParamFileIndex = paramFileInfo_da.cnt-1; - paramFileInfo(curParamFileIndex).name = MyStrdup( fileNameP ); - curContents = curSubContents = NULL; - paramFileInfo(curParamFileIndex).deleted = FALSE; - paramFileInfo(curParamFileIndex).valid = TRUE; - paramFileInfo(curParamFileIndex).deletedShadow = - paramFileInfo(curParamFileIndex).deleted = !ReadParams( 0, NULL, fileNameP ); - paramFileInfo(curParamFileIndex).contents = curContents; - - free(fileNameP); - } - wPrefSetInteger( "file", "updatetime", updateTime ); - return TRUE; -} - - -EXPORT void ReadParamFiles( void ) -{ - int fileNo; - const char *fileName; - const char * contents; - BOOL_T updated = FALSE; - - updated = UpdateParamFiles(); - - for ( fileNo=1; ; fileNo++ ) { - sprintf( message, "File%d", fileNo ); - contents = wPrefGetString( "Parameter File Names", message ); - if (contents==NULL || *contents=='\0') - break; - InfoMessage( "Parameters for %s", contents ); - fileName = wPrefGetString( "Parameter File Map", contents ); - if (fileName==NULL || *fileName=='\0') { - NoticeMessage( MSG_PRMFIL_NO_MAP, _("Ok"), NULL, contents ); - continue; - } - DYNARR_APPEND( paramFileInfo_t, paramFileInfo_da, 10 ); - curParamFileIndex = paramFileInfo_da.cnt-1; - paramFileInfo(curParamFileIndex).name = MyStrdup( fileName ); - curContents = NULL; - paramFileInfo(curParamFileIndex).deleted = FALSE; - paramFileInfo(curParamFileIndex).valid = TRUE; - paramFileInfo(curParamFileIndex).deletedShadow = - paramFileInfo(curParamFileIndex).deleted = !ReadParams( 0, NULL, fileName ); - if (curContents == NULL) - curContents = curSubContents = MyStrdup(contents); - paramFileInfo(curParamFileIndex).contents = curContents; - } - curParamFileIndex = PARAM_CUSTOM; - if (updated) { - RememberParamFiles(); - } -} +#include "bitmaps/greendot.xpm" +#include "bitmaps/greydot.xpm" +#include "bitmaps/yellowdot.xpm" +#include "bitmaps/reddot.xpm" +#include "bitmaps/greenstar.xpm" +#include "bitmaps/greystar.xpm" +#include "bitmaps/yellowstar.xpm" +#include "bitmaps/redstar.xpm" +#define FAVORITE_PARAM 1 +#define STANDARD_PARAM 0 -EXPORT void RememberParamFiles( void ) -{ - int fileInx; - int fileNo; - char * contents, *cp; - - for (fileInx=0, fileNo=1; fileInx 0); - - for( i=0; i < files; i++ ) - { - curContents = curSubContents = NULL; - curParamFileIndex = paramFileInfo_da.cnt; - if ( !ReadParams( 0, NULL, fileName[ i ] ) ) - return FALSE; - - assert( curContents != NULL ); - // in case the contents is already presented, make invalid - for ( inx=0; inx leave - if( selcnt <= 0 ) - return; - - // get the number of items in list - cnt = wListGetCount( paramFileL ); - - // walk through the whole list box - for ( inx=0; inx= paramFileInfo_da.cnt) - return; - if( paramFileInfo(fileInx).deleted ) { - // if selected file was unloaded, set button to reload and finish loop - wButtonSetLabel( paramFileActionB, _("Reload")); - paramFilePLs[ I_PRMFILACTION ].context = (void *)TRUE; - break; - } - } - } + wIndex_t selcnt = wListGetSelectedCount(paramFileL); + wIndex_t inx, cnt; + wIndex_t fileInx; + + //nothing selected -> leave + if (selcnt <= 0) { + return; + } + + // set the default + paramFilePLs[I_PRMFILEFAVORITE].context = FALSE; + + // get the number of items in list + cnt = wListGetCount(paramFileL); + + // walk through the whole list box + for (inx=0; inx= GetParamFileCount()) { + return; + } + if (!IsParamFileFavorite(fileInx)) { + paramFilePLs[I_PRMFILEFAVORITE].context = (void *)TRUE; + } + } + } } +/** + * Set the property for a parameter file in memory + * + * \param newState IN new value for property + */ + +void +UpdateParamFileProperties( bool newState) +{ + wIndex_t inx, cnt; + wIndex_t fileInx; + + // get the number of items in list + cnt = wListGetCount(paramFileL); + + // walk through the whole list box + for (inx = 0; inx < cnt; inx++) { + if (wListGetItemSelected((wList_p)paramFileL, inx)) { + fileInx = (intptr_t)wListGetItemContext(paramFileL, inx); + SetParamFileFavorite(fileInx, newState); + } + } + DoChangeNotification(CHANGE_PARAMS); +} /** - * Unload selected files. + * Mark selected files as favorite * - * \param action IN FALSE = unload, TRUE = reload parameter files + * \param favorite IN FALSE = remove, TRUE = set favorite * \return */ -static void ParamFileAction( void * action ) +static void ParamFileFavorite(void * setFavorite) +{ + wIndex_t selcnt = wListGetSelectedCount(paramFileL); + wMessageSetValue(MESSAGETEXT, ""); + if (selcnt) { + UpdateParamFileProperties(setFavorite?TRUE:FALSE); + } +} + +/** + * Parameter change selected files + * + * \param paramFileChange The parameter file change. + */ + +static void +ParamChangeSelectedFiles(unsigned paramFileChange) { - wIndex_t selcnt = wListGetSelectedCount( paramFileL ); wIndex_t inx, cnt; wIndex_t fileInx; - unsigned newDeletedState; - - if( action ) - newDeletedState = FALSE; - else - newDeletedState = TRUE; - - //nothing selected -> leave - if( selcnt <= 0 ) - return; // get the number of items in list - cnt = wListGetCount( paramFileL ); - - // walk through the whole list box - for ( inx=0; inx leave + if (selcnt) { + DynString reloadMessage; + ParamChangeSelectedFiles(PARAMFILE_REFRESH); + + DynStringMalloc(&reloadMessage, 16); + if (selcnt > 1) { + DynStringPrintf(&reloadMessage, _("%d parameter files reloaded."), selcnt); + } else { + DynStringCatCStr(&reloadMessage, _("One parameter file reloaded.")); + } + wMessageSetValue(MESSAGETEXT, DynStringToCStr(&reloadMessage)); + DynStringFree(&reloadMessage); + } else { + wBeep(); + } } -static void ParamFileOk( void * junk ) +static void ParamUnloadSelectedFiles(void * action) { - wIndex_t fileInx; - for ( fileInx = 0; fileInx < paramFileInfo_da.cnt; fileInx++ ) - paramFileInfo(fileInx).deletedShadow = paramFileInfo(fileInx).deleted; - wHide( paramFileW ); + wIndex_t selcnt = wListGetSelectedCount(paramFileL); + wMessageSetValue(MESSAGETEXT, ""); + //nothing selected -> leave + if (selcnt) { + ParamChangeSelectedFiles(PARAMFILE_UNLOAD); + } else { + wBeep(); + } } -static void ParamFileCancel( wWin_p junk ) +/** + * Select all files in the list and set action button + * + * \param junk IN ignored + * \return + */ + +static void ParamFileSelectAll(void *junk) { - wIndex_t fileInx; - for ( fileInx = 0; fileInx < paramFileInfo_da.cnt; fileInx++ ) - paramFileInfo(fileInx).deleted = paramFileInfo(fileInx).deletedShadow; - wHide( paramFileW ); - DoChangeNotification( CHANGE_PARAMS ); + wMessageSetValue(MESSAGETEXT, ""); + wListSelectAll(paramFileL); + UpdateParamFileButton(); } - -static void ParamFilesChange( long changes ) +static void ParamFileOk(void * junk) { -#ifdef LATER - int fileInx; - wIndex_t listInx; - if ((changes&CHANGE_PARAMS) == 0 || - paramFileW == NULL || !wWinIsVisible(paramFileW) ) - return; - wControlShow( (wControl_p)paramFileL, FALSE ); - listInx = wListGetIndex(paramFileL); - wListClear( paramFileL ); - for ( fileInx = 0; fileInx < paramFileInfo_da.cnt; fileInx++ ) { - if (paramFileInfo(fileInx).valid) { - strcpy( message, ((!paramFileSel) && paramFileInfo(fileInx).contents)? - paramFileInfo(fileInx).contents: - paramFileInfo(fileInx).name ); - wListAddValue( paramFileL, message, (paramFileInfo(fileInx).deleted)?mtbox_bm:chkbox_bm, (void*)fileInx ); - } - } - wListSetIndex( paramFileL, listInx ); - wControlShow( (wControl_p)paramFileL, TRUE ); -#endif + SearchUiOk(junk); + + DoChangeNotification(CHANGE_PARAMS); + wHide(paramFileW); } static void ParamFileDlgUpdate( - paramGroup_p pg, - int inx, - void * valueP ) + paramGroup_p pg, + int inx, + void * valueP) { - switch (inx) { - case I_PRMFILLIST: - UpdateParamFileButton( (wIndex_t)(long)wListGetItemContext(paramFileL,wListGetIndex(paramFileL)) ); - break; - case I_PRMFILTOGGLE: - ParamFileLoadList(); - break; - } + switch (inx) { + case I_PRMFILLIST: + UpdateParamFileButton(); + break; + case I_PRMFILTOGGLE: + DoChangeNotification(CHANGE_PARAMS); + break; + } } -#include "bitmaps/mtbox.xbm" -#include "bitmaps/chkbox.xbm" -static void DoParamFiles( void * junk ) +void ParamFilesChange(long changes) { - wIndex_t listInx; - void * data; - - if (paramFileW == NULL) { - const char * dir; - dir = wPrefGetString( "file", "paramdir" ); - if (dir != NULL) - strcpy( curParamDir, dir ); - else { - // in case there is no preference setting, use the installation's param directory as default - char *str; - MakeFullpath(&str, libDir, PARAM_SUBDIR, NULL); - strcpy( curParamDir, str ); - free(str); - } - mtbox_bm = wIconCreateBitMap( mtbox_width, mtbox_height, mtbox_bits, drawColorBlack ); - chkbox_bm = wIconCreateBitMap( chkbox_width, chkbox_height, chkbox_bits, drawColorBlack ); - paramFileW = ParamCreateDialog( ¶mFilePG, MakeWindowTitle(_("Parameter Files")), _("Ok"), ParamFileOk, ParamFileCancel, TRUE, NULL, 0, ParamFileDlgUpdate ); - paramFile_fs = wFilSelCreate( mainW, FS_LOAD, FS_MULTIPLEFILES, _("Load Parameters"), _("Parameter files|*.xtp"), LoadParamFile, NULL ); - ParamFileLoadList(); - } - ParamLoadControls( ¶mFilePG ); - ParamGroupRecord( ¶mFilePG ); - if ((listInx = wListGetValues( paramFileL, NULL, 0, NULL, &data ))>=0) - UpdateParamFileButton( (wIndex_t)(long)data ); - ParamFileLoadList(); - wShow( paramFileW ); + if (changes & CHANGE_PARAMS || changes & CHANGE_SCALE) { + UpdateParamFileList(); + if (paramFileW) { + ParamFileListLoad(paramFileInfo_da.cnt, ¶mFileInfo_da); + } + } } +/** + * Create and open the parameter file dialog. + * + * \param junk + */ -EXPORT addButtonCallBack_t ParamFilesInit( void ) +void DoParamFiles(void * junk) { - BOOL_T initted = FALSE; - if (!initted) { - ParamRegister( ¶mFilePG ); - RegisterChangeNotification( ParamFilesChange ); - initted = TRUE; - } - return &DoParamFiles; + void * data; + + if (paramFileW == NULL) { + indicatorIcons[ STANDARD_PARAM ][ PARAMFILE_UNLOADED ] = wIconCreatePixMap( + greydot); + indicatorIcons[ STANDARD_PARAM ][ PARAMFILE_NOTUSABLE ] = wIconCreatePixMap( + reddot); + indicatorIcons[ STANDARD_PARAM ][ PARAMFILE_COMPATIBLE ] = wIconCreatePixMap( + yellowdot); + indicatorIcons[ STANDARD_PARAM ][ PARAMFILE_FIT] = wIconCreatePixMap(greendot); + indicatorIcons[ FAVORITE_PARAM ][ PARAMFILE_UNLOADED ] = wIconCreatePixMap( + greystar); + indicatorIcons[ FAVORITE_PARAM ][ PARAMFILE_NOTUSABLE ] = wIconCreatePixMap( + redstar); + indicatorIcons[ FAVORITE_PARAM ][ PARAMFILE_COMPATIBLE ] = wIconCreatePixMap( + yellowstar); + indicatorIcons[ FAVORITE_PARAM ][ PARAMFILE_FIT ] = wIconCreatePixMap( + greenstar); + + ParamRegister(¶mFilePG); + + paramFileW = ParamCreateDialog(¶mFilePG, + MakeWindowTitle(_("Parameter Files")), _("Ok"), ParamFileOk, NULL, + TRUE, NULL, F_RESIZE | F_RECALLSIZE, ParamFileDlgUpdate); + paramFile_fs = wFilSelCreate(mainW, FS_LOAD, FS_MULTIPLEFILES, + _("Load Parameters"), _("Parameter files (*.xtp)|*.xtp"), LoadParamFile, NULL); + } + ParamLoadControls(¶mFilePG); + ParamGroupRecord(¶mFilePG); + if ((wListGetValues(paramFileL, NULL, 0, NULL, &data))>=0) { + UpdateParamFileButton(); + } + + wShow(paramFileW); } -- cgit v1.2.3