00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #ifndef __PI_ResourceManager_H__
00024 #define __PI_ResourceManager_H__
00025
00026 #include "PI_API.h"
00027 #include <UT/UT_PtrArray.h>
00028 #include <UT/UT_RefArray.h>
00029 #include <UT/UT_String.h>
00030 #include <UT/UT_SymbolTable.h>
00031 #include <UT/UT_HashTable.h>
00032 #include <UT/UT_Pair.h>
00033 #include <OP/OP_Error.h>
00034 #include <OP/OP_OperatorTable.h>
00035 #include "PI_ResourceTemplate.h"
00036 #include "PI_SettingList.h"
00037
00038 class CPP_Manager;
00039 class PRM_Template;
00040 class OP_Operator;
00041 class OP_OperatorTable;
00042 class OP_Node;
00043 class CMD_Args;
00044 class PI_OpHandleLink;
00045 class pi_OpHandleBinding;
00046 class pi_OpSelectorBinding;
00047
00048 #define PI_BIND_OK 1
00049 #define PI_NO_TEMPLATE_FOR_HANDLE -2
00050 #define PI_INVALID_OP_PARM -3
00051 #define PI_INVALID_PI_PARM -4
00052 #define PI_BINDING_EXISTS -5
00053 #define PI_INVALID_OP_FOR_PI -6
00054
00055 typedef void (*PI_SaveCallback)(void *data);
00056
00057 class PI_API PI_BindingParmInfo
00058 {
00059 public:
00060 PI_BindingParmInfo() { }
00061
00062
00063
00064 const UT_String &getOpParm() const
00065 { return myOpParm; }
00066 const UT_String &getPIParm() const
00067 { return myPIParm; }
00068 int operator==(const PI_BindingParmInfo &i) const
00069 { return (this == &i); }
00070
00071 private:
00072 UT_String myOpParm;
00073 UT_String myPIParm;
00074 friend class pi_OpHandleBinding;
00075 };
00076 typedef UT_RefArray<PI_BindingParmInfo> PI_BindingParmArray;
00077
00078 class PI_API PI_BindingHandleInfo
00079 {
00080 public:
00081 PI_BindingHandleInfo() { }
00082
00083 const UT_String &getPIName() const
00084 { return myPIName; }
00085 const UT_String &getPIDescription() const
00086 { return myPIDescription; }
00087 const PI_SettingList &getDefaultSettings() const
00088 { return myDefaultSettings; }
00089 int getId() const
00090 { return myId; }
00091 const PI_BindingParmArray &getBindings() const
00092 { return myBindings; }
00093 int operator==(const PI_BindingHandleInfo &i) const
00094 { return (this == &i); }
00095
00096 private:
00097 UT_String myPIName;
00098 UT_String myPIDescription;
00099 PI_SettingList myDefaultSettings;
00100 int myId;
00101 PI_BindingParmArray myBindings;
00102 friend class pi_OpHandleBinding;
00103 };
00104 typedef UT_RefArray<PI_BindingHandleInfo> PI_BindingHandleArray;
00105
00106
00107
00108 class PI_API PI_BindingSelectorInfo
00109 {
00110 public:
00111 PI_BindingSelectorInfo() { }
00112
00113 const UT_String &getName() const
00114 { return myName; }
00115 const UT_String &getDescription() const
00116 { return myDescription; }
00117 const UT_String &getPrompt() const
00118 { return myPrompt; }
00119 const UT_String &getOpParm() const
00120 { return myOpParm; }
00121 const UT_String &getMenu() const
00122 { return myMenu; }
00123 const UT_String &getPrimMask() const
00124 { return myPrimMask; }
00125 int getOpInput() const
00126 { return myOpInput; }
00127 bool getOpInputReq() const
00128 { return myOpInputReq; }
00129 bool getAllowDrag() const
00130 { return myAllowDrag; }
00131 bool getAstSelAll() const
00132 { return myAstSelAll; }
00133 const UT_String &getExtraInfo() const
00134 { return myExtraInfo; }
00135 int operator==(const PI_BindingSelectorInfo &i) const
00136 { return (this == &i); }
00137
00138 private:
00139 UT_String myName;
00140 UT_String myDescription;
00141 UT_String myPrompt;
00142 UT_String myOpParm;
00143 UT_String myMenu;
00144 UT_String myPrimMask;
00145 int myOpInput;
00146 bool myOpInputReq;
00147 bool myAllowDrag;
00148 bool myAstSelAll;
00149 UT_String myExtraInfo;
00150 friend class pi_OpSelectorBinding;
00151 };
00152 typedef UT_RefArray<PI_BindingSelectorInfo> PI_BindingSelectorArray;
00153
00154 class PI_API PI_ResourceManager : public OP_UpdateTableSink,
00155 public OP_UpdateTemplatesSink
00156 {
00157 public:
00158 PI_ResourceManager();
00159 virtual ~PI_ResourceManager();
00160
00161
00162
00163 virtual int registerState(PI_StateTemplate *type);
00164 virtual int registerHandle(PI_HandleTemplate *type);
00165 virtual int registerOpHandleLink(PI_PITemplate *type);
00166 virtual int registerSelector(PI_SelectorTemplate *type);
00167
00168 int containsState(const char *name,
00169 PI_ViewerType viewer_type,
00170 unsigned netmask) const;
00171 int containsHandle(const char *name) const;
00172 int containsOpHandleLink(const char *name) const;
00173 int containsSelector(const char *name) const;
00174
00175
00176 const PI_BindingHandleArray
00177 *getBindingHandles(OP_Operator *op) const;
00178
00179 const PI_BindingSelectorArray
00180 *getBindingSelectors(OP_Operator *op) const;
00181
00182
00183
00184 const UT_PtrArray<PI_StateTemplate *>
00185 &stateList(PI_ViewerType viewer_type,
00186 const char *network_type) const;
00187 const UT_PtrArray<PI_StateTemplate *>
00188 &stateList(PI_ViewerType viewer_type,
00189 PI_NetworkType net_type) const;
00190 PI_StateTemplate *getStateTemplate(const char *name,
00191 PI_ViewerType viewer_type,
00192 const char *type) const;
00193 PI_StateTemplate *getStateTemplate(OP_Operator *op,
00194 PI_ViewerType viewer_type,
00195 const char *type) const;
00196
00197
00198
00199 int unbind(OP_Operator *op, const char *pidescription,
00200 const UT_String &opparm);
00201 int bind(OP_Operator *op, const char *piname,
00202 const char *pidescription,
00203 const UT_String &opparm,
00204 const UT_String &piparm,
00205 const char *default_settings);
00206 int bindScriptOp(OP_Operator *op, const char *piname,
00207 const char *pidescription,
00208 const UT_String &opparm,
00209 const UT_String &piparm,
00210 const char *default_settings);
00211
00212 int unbindSelector(OP_Operator *op,
00213 const char *seldescription);
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223
00224
00225
00226
00227
00228
00229
00230
00231
00232
00233
00234
00235 int bindSelector(OP_Operator *op, const char *sname,
00236 const char *seldescription,
00237 const char *prompt, const char *opparm,
00238 int opinput, int opinputreq,
00239 const char *primmask, int allowdrag,
00240 const char *menu, int astselall,
00241 const char *extrainfo, bool fromScriptOp);
00242
00243
00244 PRM_Template *getTemplateAndVecId(const UT_String &,
00245 OP_Operator *,
00246 int &) const;
00247
00248
00249
00250
00251
00252 void getChannelNameFromParmAndVec(UT_String &chan,
00253 OP_Operator *op, const char *parmname,
00254 int vecidx);
00255
00256 int checkForPIName( const char *pi_name,
00257 const char *pi_parm ) const;
00258
00259 OP_Operator *findOperator(PI_NetworkType net_type,
00260 const char *op_name,
00261 bool display_warning = true) const;
00262 OP_Operator *findOperator(const char *opbindname,
00263 UT_String *optype = 0) const;
00264
00265 virtual void findVolatileKey(const char *volatile_hotkey_name,
00266 int &volatile_key,
00267 int &key_modifiers) const;
00268 virtual void updateViewports(int id, const char *opname,
00269 bool open_only = false) const;
00270
00271
00272 UT_SymbolTable &getOpHandleLinks() { return myOpHandleLinks; }
00273 PI_PITemplate *getOpHandleLinkTemplate(const char *pi_name) const;
00274 UT_SymbolTable &getSelectors() { return mySelectors; }
00275 PI_SelectorTemplate *getSelectorTemplate(const char *selector_name) const;
00276
00277
00278 UT_SymbolTable &getHandles() { return myHandles; }
00279
00280
00281
00282 bool isPIEthereal(const char *piname,
00283 bool *isfloat = 0) const;
00284
00285
00286
00287
00288
00289
00290 void ensureStatesExistForAllOperators(const char *net_type_name);
00291 void ensureStatesExistForAllOperators(PI_NetworkType net_type);
00292
00293
00294 static bool getViewerType(const char *viewer_type_token,
00295 PI_ViewerType &type);
00296 static void getViewerTypeToken(PI_ViewerType type,
00297 UT_String &viewer_type_token);
00298
00299
00300
00301 static int getNetworkType(const char *network_type_name,
00302 PI_NetworkType &type);
00303 static void getNetworkTypeName(PI_NetworkType type,
00304 UT_String &nettypename);
00305 static OP_OperatorTable *getOpTableFromOperator(const OP_Operator *op);
00306
00307
00308 static PI_NetworkType getFirstNetworkType(unsigned int network_mask);
00309
00310 static PRM_Template *findParmTemplate(OP_Operator &op,
00311 const char *op_Parm_name,
00312 int vec_idx, int *parm_idx);
00313
00314
00315 int writeBindingsFile(const char *fname) const;
00316
00317
00318
00319 void loadPISettingsFromTables(PI_OpHandleLink &pi,
00320 bool okay_to_use_last_settings) const;
00321 void savePISettingsToTables(PI_OpHandleLink &pi);
00322 virtual void removePISettingsFromTables(OP_Operator &op_type);
00323 void removePISettingsFromTables(const PI_OpHandleLink &pi);
00324
00325
00326
00327 void recordPISettings(const char *pi_description,
00328 const char *pi_type,
00329 const OP_Node &op_node,
00330 const char *settings);
00331
00332
00333
00334
00335 void addSaveCallback(PI_SaveCallback callback, void *data);
00336 void removeSaveCallback(PI_SaveCallback callback,
00337 void *data);
00338
00339 protected:
00340 static void startParmsCache();
00341 static void stopParmsCache();
00342 static void getParmsCache(UT_PtrArray<OP_Node *> *&ops,
00343 UT_PtrArray<PRM_Parm *> *&parms,
00344 UT_IntArray *&vec_indices);
00345 static void getParmsCacheBehaviour( bool &set_keys,
00346 bool &do_scope,
00347 bool &append_scope );
00348 public:
00349 static int cacheParms();
00350 static void appendToParmsCache(OP_Node *op, PRM_Parm *parm,
00351 int vi);
00352 static void setParmsCacheBehaviour( bool set_keys, bool do_scope,
00353 bool append_scope );
00354
00355 static bool getHideLockedHandleParts()
00356 { return theHideLockedHandleParts; }
00357 static void setHideLockedHandleParts( bool hide )
00358 { theHideLockedHandleParts = hide; }
00359 static bool getScopeChannelsOnKey()
00360 { return theScopeChannelsOnKey; }
00361 static void setScopeChannelsOnKey( bool scope )
00362 { theScopeChannelsOnKey = scope; }
00363 static bool getAddScopedChannels()
00364 { return theAddScopedChannels; }
00365 static void setAddScopedChannels( bool add )
00366 { theAddScopedChannels = add; }
00367 static bool getOpenChannelEditorOnScope()
00368 { return theOpenChannelEditorOnScope; }
00369 static void setOpenChannelEditorOnScope( bool do_open )
00370 { theOpenChannelEditorOnScope = do_open; }
00371 static void getChannelScopeCommandPrefix( UT_String &str );
00372
00373
00374 protected:
00375
00376
00377 class PI_API PI_StringSetHash : public UT_Hash
00378 {
00379 public:
00380 PI_StringSetHash(const char *string1,
00381 const char *string2,
00382 const char *string3);
00383
00384 virtual int compare(const UT_Hash &hash_object) const;
00385 virtual void copy(const UT_Hash &hash_object);
00386 virtual unsigned hash() const;
00387 virtual UT_Hash *copy() const;
00388
00389 private:
00390 PI_StringSetHash(const PI_StringSetHash &object);
00391
00392 UT_String myString1;
00393 UT_String myString2;
00394 UT_String myString3;
00395 };
00396
00397
00398 class PI_API PI_OpPIHash : public UT_Hash
00399 {
00400 public:
00401 PI_OpPIHash(const char *pi_name_in_setting_table, const char *pi_type,
00402 int integer);
00403
00404 virtual int compare(const UT_Hash &hash_object) const;
00405 virtual void copy(const UT_Hash &hash_object);
00406 virtual unsigned hash() const;
00407 virtual UT_Hash *copy() const;
00408
00409 const UT_String &piNameInSettingTable() const
00410 { return myPINameInSettingTable; }
00411 const UT_String &piType() const { return myPIType; }
00412 int integer() const { return myInteger; }
00413
00414 private:
00415 PI_OpPIHash(const PI_OpPIHash &object);
00416
00417 UT_String myPINameInSettingTable;
00418 UT_String myPIType;
00419 int myInteger;
00420 };
00421
00422
00423
00424 void installCommands();
00425 void registerOpHandleLinks();
00426 void registerCopHandleLinks();
00427 void registerOpHandleBindings();
00428 void registerOpHandleConstructors();
00429 void registerSelectors();
00430 void registerSelectorConstructors();
00431
00432
00433 bool isValidPiParmName( const UT_String &pi_name,
00434 const UT_String &pi_parm);
00435 void loadHandle(CPP_Manager &cppman, OP_Operator *op,
00436 pi_OpHandleBinding *binding);
00437 void loadSelector(CPP_Manager &cppman,
00438 const UT_String &selname,
00439 const UT_String &seldescription,
00440 pi_OpSelectorBinding *binding);
00441 void loadOperator(CPP_Manager &cppman,
00442 const UT_String &oppath);
00443 void loadOperator(CPP_Manager &cppman,
00444 const UT_String &optype,
00445 OP_Operator *op,
00446 pi_OpHandleBinding *hbinding,
00447 pi_OpSelectorBinding *sbinding);
00448
00449 virtual void addAutomaticStates(PI_NetworkType net_type);
00450 virtual void tableUpdated(OP_OperatorTable *table);
00451 virtual void tableDeleted(OP_OperatorTable *table);
00452 virtual void templatesUpdated(OP_Operator *op);
00453 virtual void operatorDeleted(OP_Operator *op);
00454 void ensureTableInterestExists(PI_NetworkType net_type,
00455 OP_OperatorTable *table);
00456
00457 PI_HandleTemplate *getHandleTemplate(const char *handle_name) const;
00458
00459
00460 static OP_ERROR savePIResourceManagerCallback(ostream &os, void *data);
00461 OP_ERROR saveSettings(ostream &os) const;
00462
00463
00464
00465 const PI_SettingList *getDefaultPISettings(OP_Operator &op_type,
00466 const char *type_name,
00467 const char *description) const;
00468 PI_SettingList *getDefaultPISettings(OP_Operator &op_type,
00469 const char *type_name,
00470 const char *description);
00471 static int savePISettingTraverser(UT_Thing &thing,
00472 const UT_Hash &hash_object,
00473 void *data);
00474
00475
00476
00477 typedef UT_Pair<PI_SaveCallback, void *> PI_SaveCallbackInfo;
00478
00479 UT_SymbolTable myStates;
00480 UT_SymbolTable myHandles;
00481 UT_SymbolTable myOpHandleLinks;
00482 UT_SymbolTable mySelectors;
00483
00484 UT_SymbolTable myOpHandleBindings;
00485 UT_SymbolTable myOpSelectorBindings;
00486
00487 UT_HashTable myPISettingsForOps;
00488 UT_HashTable myLastPISettings;
00489
00490 UT_PtrArray<PI_StateTemplate *> myStateLists[PI_NUM_VIEWER_TYPES]
00491 [PI_NUM_NETWORK_TYPES];
00492 UT_SymbolTable myNetworkTypeTable;
00493
00494 UT_RefArray<PI_SaveCallbackInfo> mySaveCallbacks;
00495
00496 static bool ourSetKeyOnParms;
00497 static bool ourScopeParmChannels;
00498 static bool ourAppendToScope;
00499 static int ourCacheParms;
00500 static UT_PtrArray<OP_Node *> ourParmNodes;
00501 static UT_PtrArray<PRM_Parm *> ourParms;
00502 static UT_IntArray ourParmVecIndices;
00503
00504 static bool theHideLockedHandleParts;
00505 static bool theScopeChannelsOnKey;
00506 static bool theAddScopedChannels;
00507 static bool theOpenChannelEditorOnScope;
00508
00509 friend PI_API void PIcreateResourceManager();
00510 };
00511
00512 PI_API extern PI_ResourceManager *PIgetResourceManager();
00513 PI_API extern void PIcreateResourceManager();
00514 PI_API extern bool PIresourceManagerExists();
00515
00516 #endif