00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef __PRM_ParmList__
00023 #define __PRM_ParmList__
00024
00025 #include "PRM_API.h"
00026 #include <iostream.h>
00027 #include <UT/UT_Defines.h>
00028 #include <UT/UT_IntArray.h>
00029 #include <UT/UT_PtrArray.h>
00030 #include <UT/UT_SymbolTable.h>
00031 #include <CH/CH_EventManager.h>
00032 #include <CH/CH_Types.h>
00033 #include <CH/CH_ExprLanguage.h>
00034 #include "PRM_Template.h"
00035 #include "PRM_ChanState.h"
00036 #include "PRM_ParmOwner.h"
00037
00038 #define PRM_PARM_LIST_HASH_TABLE_SIZE 17
00039
00040 class UT_HashTable;
00041 class UT_TokenString;
00042 class UT_StringArray;
00043 class CH_Collection;
00044 class PRM_Parm;
00045 class PRM_Multi;
00046 class PRM_Name;
00047 class PRM_PresetInfo;
00048 class PRM_ParmNameMap;
00049 class PRM_OpSharedInfo;
00050
00051 typedef enum {
00052 PRM_RALL = 0004,
00053 PRM_WALL = 0002,
00054 PRM_XALL = 0001,
00055 PRM_RGRP = 0040,
00056 PRM_WGRP = 0020,
00057 PRM_XGRP = 0010,
00058 PRM_RUSR = 0400,
00059 PRM_WUSR = 0200,
00060 PRM_XUSR = 0100,
00061
00062 PRM_RWXALL = 0007,
00063 PRM_RWXGRP = 0070,
00064 PRM_RWXUSR = 0700,
00065 PRM_RWX = 0777,
00066
00067 PRM_READ_OK = (PRM_RALL|PRM_RGRP|PRM_RUSR),
00068 PRM_WRITE_OK = (PRM_WALL|PRM_WGRP|PRM_WUSR),
00069 PRM_EXECUTE_OK = (PRM_XALL|PRM_XGRP|PRM_XUSR)
00070 } PRM_Permission;
00071
00072 typedef float (*PRM_ORCallback)(int data_idx, float time,
00073 int *tdepend, int *enable,
00074 const float *new_value);
00075
00076 class PRM_API PRM_ParmList
00077 {
00078 public:
00079 PRM_ParmList(PRM_Template *thetemplates,
00080 CH_Collection *thechgroupptr,
00081 PRM_ParmOwner *node,
00082 PRM_PresetInfo *presetinfo,
00083 char *optype,
00084 bool clear_channels);
00085
00086
00087
00088 PRM_ParmList(PRM_ParmList *thesrcptr,
00089 PRM_Template *thenewtemplate,
00090 PRM_ParmOwner *node,
00091 PRM_PresetInfo *presetinfo,
00092 char *optype,
00093 bool leavedefaultsunchanged);
00094 ~PRM_ParmList();
00095
00096
00097 int getEntries() const { return myParms.entries(); }
00098
00099
00100
00101 void setChannelGroupPtr(CH_Collection *thechgroupptr);
00102 CH_Collection *getChannelGroupPtr() const;
00103
00104 float findNextKey(float theoldtime);
00105 float findPrevKey(float theoldtime);
00106
00107
00108
00109 int allDefaults() const;
00110
00111
00112
00113
00114 void buildDelayedDefaults( bool clear_channels = true );
00115
00116 PRM_Parm *getParmPtr(const char *theparmname, int &theparmidx);
00117 PRM_Parm *getParmPtr(const char *theparmname);
00118 const PRM_Parm *getParmPtr(const char *theparmname) const;
00119 PRM_Parm *getParmPtr(const PRM_Name &name);
00120
00121 PRM_Parm *getParmPtr(const int theindex)
00122 {
00123 return theindex < myParms.entries()
00124 ? myParms(theindex)
00125 : 0;
00126 }
00127 const PRM_Parm *getParmPtr(const int theindex) const
00128 {
00129 return theindex < myParms.entries()
00130 ? myParms(theindex)
00131 : 0;
00132 }
00133
00134 int getParmIndex(const PRM_Parm *parm) const;
00135 int getParmIndex(const char *parmname) const;
00136 PRM_Parm *getParmPtrFromChannel(const char *channel,
00137 int *vecidx = 0);
00138 int getParmIndex(const char *channel_name, int &subidx,
00139 bool allow_alias = true) const;
00140 int getParmIndexFromChannel(const char *channel,
00141 bool allow_alias) const;
00142
00143
00144
00145 void clearAllDirtyFlags();
00146 int areAllFlagsClean() const;
00147 void clearAllUndoSavedFlags();
00148
00149 void revertToDefaults(float time);
00150
00151 void revertValuesToFactoryDefaults();
00152
00153
00154
00155
00156 void updateFromOldTemplate(PRM_ParmList *oldlist);
00157
00158
00159
00160 void updateSpareParmTemplates(PRM_Template *newtemplates,
00161 bool leavedefaultsunchanged);
00162
00163 void saveSingle(PRM_Parm *, ostream &os, int binary) const;
00164 void save(ostream &os, int binary, bool compiled) const;
00165 bool load(UT_IStream &is, const char *path,
00166 PRM_ParmList *obsoleteparms);
00167
00168
00169 void saveChannelAliases(ostream &os, int binary);
00170 bool loadChannelAliases(UT_IStream &is, const char *path);
00171
00172 bool hasChannelAliases() const;
00173
00174 void clearAndDestroyChannels();
00175 int hasAnyChannels();
00176 int addChannel(const char *name);
00177 void reloadChannelPtrs();
00178 int channelPtrModified(const char *name);
00179
00180 unsigned getUserMask() const { return myUserMask; }
00181 void setUserMask(unsigned m)
00182 { myUserMask = m & PRM_RWX; }
00183 unsigned getPermissions() const { return myPermissions; }
00184 void setPermissions(unsigned mask)
00185 { mask &= PRM_RWX;
00186 if (mask != myPermissions)
00187 {
00188 myPermissions = mask;
00189 sendChangeEvent(CH_PERMISSION_CHANGED);
00190 }
00191 }
00192 unsigned getAssetPermissionMask() const
00193 { return myAssetPermissionMask; }
00194 void setAssetPermissionMask(unsigned mask)
00195 { mask &= PRM_RWX;
00196 if (mask != myAssetPermissionMask)
00197 {
00198 myAssetPermissionMask = mask;
00199 sendChangeEvent(CH_PERMISSION_CHANGED);
00200 }
00201 }
00202
00203
00204
00205 int canAccess(unsigned mask=PRM_WRITE_OK,
00206 const PRM_Type &type=PRM_TYPE_ZERO) const;
00207 int canAccessIgnoringAssetMask(
00208 unsigned mask=PRM_WRITE_OK,
00209 const PRM_Type &type=PRM_TYPE_ZERO) const;
00210 int canAccessCheckingOnlyAssetMask(
00211 unsigned mask=PRM_WRITE_OK,
00212 const PRM_Type &type=PRM_TYPE_ZERO) const;
00213
00214 static void beginLoading();
00215 static void endLoading();
00216 static bool isLoading();
00217
00218 void hardenChanges(float time, char forceflag = 0,
00219 const char *patt=0,
00220 CH_ChannelRefList *list=0);
00221
00222 PRM_ChanState getChanState(float time);
00223 void sendChangeEvent(CH_CHANGE_TYPE what, PRM_Parm *who=0);
00224 void setEventHandler(void *data,
00225 void (*handler)(void *, CH_CHANGE_TYPE, int))
00226 {
00227 myEventObject = data;
00228 myEventHandler = handler;
00229 }
00230
00231
00232
00233
00234
00235
00236
00237
00238
00239
00240
00241 int checkTimeDependence(bool evaluate_channels = false);
00242
00243 void setTimeDependent(int onOff)
00244 { myTimeDependent=onOff;}
00245 void setCookTimeDependent(int onOff)
00246 { myCookTimeDependent=onOff;}
00247 void setDataDependent(int onOff=1)
00248 { myDataDependent=onOff;}
00249
00250 int getTimeDependent() const { return myTimeDependent; }
00251 int getCookTimeDependent() const { return myCookTimeDependent; }
00252 int getDataDependent() const { return myDataDependent; }
00253
00254
00255 static PRM_ORCallback getORCallback(void) { return theORCallback; }
00256 static void setORCallback(PRM_ORCallback func)
00257 { theORCallback = func; }
00258
00259 void pushVariables();
00260 void popVariables();
00261
00262 int findString(const char *str, bool fullword,
00263 bool usewildcards) const;
00264 int changeString(const char *from, const char *to,
00265 bool fullword);
00266
00267 int getSendExtraEvent() { return mySendExtraEvent; }
00268 void setSendExtraEvent() { mySendExtraEvent = 1; }
00269 void clearSendExtraEvent() { mySendExtraEvent = 0; }
00270
00271 void getMagicString(UT_TokenString &string,
00272 float t, int parm_group = 1);
00273
00274 void setUndoSavedFlag() { myUndoSavedFlag = 1; }
00275 void setAutoTakeUndoSavedFlag()
00276 { myAutoTakeUndoSavedFlag = 1; }
00277
00278
00279 void appendMultiParms(const PRM_Multi *multiparmowner,
00280 PRM_Template *templ, int num, bool spare,
00281 const UT_IntArray &instance,
00282 UT_PtrArray<PRM_Parm *> &newparms);
00283
00284 void removeAndDestroyParm(int index);
00285
00286 void insertMultiParmItem(int index, int i);
00287 void removeMultiParmItem(int index, int i);
00288
00289 PRM_ParmOwner *getParmOwner() const { return myParmOwner; }
00290 PRM_PresetInfo *getPresetInfo() const { return myPresetInfo; }
00291 void clearParmOwner();
00292
00293
00294
00295
00296 bool checkMultiParmInstance(const char *parmname);
00297
00298
00299
00300
00301
00302 bool setChannelAlias(PRM_Parm &parm, int subindex,
00303 const char *chan_alias);
00304
00305 int64 getMemUsage(UT_Bool onlythis) const;
00306
00307 unsigned long getAddRemoveCount() const
00308 { return myAddRemoveCount; }
00309 void setAddRemoveCount(unsigned long count)
00310 { myAddRemoveCount = count; }
00311
00312
00313 void evalStringRaw(UT_String &value,
00314 const char *pn, int vi, float t);
00315 void evalString(UT_String &value,
00316 const char *pn, int vi, float t);
00317 void setString(const UT_String &value,
00318 CH_StringMeaning meaning,
00319 const char *pn, int vi, float t,
00320 bool propagate);
00321 int evalInt(const char *pn, int vi, float t);
00322 void setInt(int value, const char *pn, int vi, float t,
00323 bool propagate);
00324 float evalFloat(const char *pn, int vi, float t);
00325 void setFloat(float value, const char *pn, int vi, float t,
00326 bool propagate);
00327
00328
00329
00330
00331
00332 static void removeOpSharedInfo(const char *optoken);
00333
00334
00335
00336 static void renameOpSharedInfo(const char *oldoptoken,
00337 const char *newoptoken);
00338
00339 private:
00340 void moveMultiParmAlias(int index, int i, bool up);
00341 void loadUnknownParmNames(UT_IStream &is,
00342 UT_StringArray &names,
00343 PRM_ParmList *obsoleteparms);
00344 PRM_Parm *findLoadParm(const char *name,
00345 PRM_ParmList *obsoleteparms,
00346 PRM_ParmNameMap *nmap,
00347 bool try_again=true);
00348
00349
00350
00351 void adopt(PRM_ParmList &thesource,
00352 bool leavedefaultsunchanged);
00353
00354
00355
00356
00357
00358 void adopt(PRM_Parm &dstparm, PRM_Parm &srcparm,
00359 bool leavedefaultsunchanged);
00360
00361 void adoptChannelAlias(PRM_Parm &dst_parm,
00362 const PRM_Parm &src_parm);
00363
00364
00365
00366 void addInstanceParmNames(PRM_Template *templates,
00367 int multistartoffset,
00368 UT_IntArray &indexlist,
00369 int numinstances, float t,
00370 UT_SymbolTable &parmnames);
00371
00372 PRM_Parm *appendParm(PRM_Parm *parm,
00373 bool spare, const PRM_Multi *multiparmowner);
00374 PRM_Parm *appendParm(PRM_Template *temp, CH_Collection *ch,
00375 bool spare, const PRM_Multi *multiparmowner);
00376 PRM_Parm *appendParm(PRM_Parm *temp, CH_Collection *ch,
00377 bool spare, const PRM_Multi *multiparmowner);
00378 void initHashTable();
00379
00380
00381
00382 static void removeOpSharedInfoReference(PRM_OpSharedInfo *info);
00383
00384
00385 private:
00386
00387 UT_PtrArray<PRM_Parm *> myParms;
00388 UT_String myOpToken;
00389 unsigned long myAddRemoveCount;
00390
00391
00392
00393
00394
00395
00396
00397
00398
00399
00400 PRM_OpSharedInfo *myOpSharedInfo;
00401
00402
00403
00404
00405 UT_HashTable mySpareAndMultiParmHashTable;
00406 UT_SymbolTable mySpareAndMultiChannelTable;
00407
00408
00409
00410
00411 UT_SymbolTable myChannelAliasesTable;
00412
00413 unsigned myPermissions;
00414 unsigned myUserMask;
00415 unsigned myAssetPermissionMask;
00416
00417 CH_Collection *myChannelGroupPtr;
00418 PRM_ParmOwner *myParmOwner;
00419 PRM_PresetInfo *myPresetInfo;
00420
00421
00422
00423
00424
00425 unsigned myDataDependent:1,
00426 myTimeDependent:1,
00427 myCookTimeDependent:1,
00428 mySendExtraEvent:1,
00429 myUndoSavedFlag:1,
00430 myAutoTakeUndoSavedFlag:1;
00431
00432 void (*myEventHandler)(void *, CH_CHANGE_TYPE, int);
00433 void *myEventObject;
00434
00435 static PRM_ORCallback theORCallback;
00436 static float theFileVersion;
00437 static UT_SymbolTable theOpHashTable;
00438 static int thePRMLoadCount;
00439 };
00440
00441 #endif