layer1/Setting.h (275 lines of code) (raw):
/*
A* -------------------------------------------------------------------
B* This file contains source code for the PyMOL computer program
C* copyright 1998-2000 by Warren Lyford Delano of DeLano Scientific.
D* -------------------------------------------------------------------
E* It is unlawful to modify or remove this copyright notice.
F* -------------------------------------------------------------------
G* Please see the accompanying LICENSE file for further information.
H* -------------------------------------------------------------------
I* Additional authors of this source file include:
-*
-*
-*
Z* -------------------------------------------------------------------
*/
#ifndef _H_Setting
#define _H_Setting
#include <vector>
#include <string>
#include"os_python.h"
#include"PyMOLGlobals.h"
#include"OVOneToOne.h"
typedef char SettingName[255];
/*
* Setting record for atom/astate/bond/bstate level settings
*/
typedef struct {
int setting_id;
union {
int int_;
float float_;
float float3_[3];
} value;
int next; /* for per-atom setting lists & memory management */
} SettingUniqueEntry;
struct _CSettingUnique {
OVOneToOne *id2offset;
OVOneToOne *old2new;
SettingUniqueEntry *entry;
int n_alloc, next_free;
};
/*
* Setting record for global/object/ostate level settings
*/
struct SettingRec {
union {
int int_;
float float_;
float float3_[3];
std::string * str_;
};
bool defined;
bool changed;
private:
void setChanged() {
defined = true;
changed = true;
}
public:
void set_i(int value) {
int_ = value;
setChanged();
}
void set_f(float value) {
float_ = value;
setChanged();
}
void set_3f(float v0, float v1, float v2) {
float3_[0] = v0;
float3_[1] = v1;
float3_[2] = v2;
setChanged();
}
void set_3f(const float * value) {
set_3f(value[0], value[1], value[2]);
}
void set_s(const char * value) {
if (!str_) {
str_ = new std::string(value);
} else {
str_->assign(value);
}
setChanged();
}
void delete_s() {
if (str_) {
delete str_;
str_ = NULL;
}
}
};
struct _CSetting {
PyMOLGlobals *G;
ov_size size;
SettingRec *info;
};
#define cSetting_blank 0
#define cSetting_boolean 1
#define cSetting_int 2
#define cSetting_float 3
#define cSetting_float3 4
#define cSetting_color 5
#define cSetting_string 6
/* Atomic Settings */
void SettingUniqueDetachChain(PyMOLGlobals * G, int index);
/* New API
* NOTE: get commands are not range-checked, so be careful
* in contrast, set commands expand the current list
*/
int SettingUniqueSetTypedValue(PyMOLGlobals * G, int unique_id, int setting_id,
int setting_type, const void *value);
/*
* bool overload
*/
inline
int SettingUniqueSetTypedValue(PyMOLGlobals * G, int unique_id, int setting_id,
int setting_type, const bool *value) {
int i = *value;
return SettingUniqueSetTypedValue(G, unique_id, setting_id, setting_type, &i);
}
bool SettingUniqueUnset(PyMOLGlobals * G, int unique_id, int setting_id);
#ifndef _PYMOL_NOPY
bool SettingUniqueSetPyObject(PyMOLGlobals * G, int unique_id, int setting_id, PyObject *value);
#endif
int SettingUniqueCheck(PyMOLGlobals * G, int unique_id, int setting_id);
PyObject *SettingUniqueGetPyObject(PyMOLGlobals * G, int unique_id, int index);
void SettingUniqueResetAll(PyMOLGlobals * G);
PyObject *SettingUniqueAsPyList(PyMOLGlobals * G);
int SettingUniqueFromPyList(PyMOLGlobals * G, PyObject * list, int partial_restore);
int SettingUniqueConvertOldSessionID(PyMOLGlobals * G, int old_unique_id);
int SettingUniqueCopyAll(PyMOLGlobals * G, int src_unique_id, int dst_unique_id);
void SettingInitGlobal(PyMOLGlobals * G, int alloc, int reset_gui, int use_default);
void SettingStoreDefault(PyMOLGlobals * G);
void SettingPurgeDefault(PyMOLGlobals * G);
void SettingFreeGlobal(PyMOLGlobals * G);
CSetting *SettingNew(PyMOLGlobals * G);
void SettingFreeP(CSetting * I);
void SettingInit(PyMOLGlobals * G, CSetting * I);
void SettingPurge(CSetting * I);
void SettingCheckHandle(PyMOLGlobals * G, CSetting ** handle);
#define SettingSet_b SettingSet_i
int SettingSet_i(CSetting * I, int index, int value);
int SettingSet_f(CSetting * I, int index, float value);
int SettingSet_s(CSetting * I, int index, const char *value);
int SettingSet_3fv(CSetting * I, int index, const float *value);
int SettingGetTextValue(PyMOLGlobals * G, const CSetting * set1, const CSetting * set2, int index,
char *buffer);
const char * SettingGetTextPtr(PyMOLGlobals * G, const CSetting * set1, const CSetting * set2,
int index, char *buffer);
int SettingUnset(CSetting * I, int index);
void SettingRestoreDefault(CSetting * I, int index, const CSetting * src=NULL);
bool SettingIsDefaultZero(int index);
int SettingGetType(int index);
inline int SettingGetType(PyMOLGlobals *, int index) {
return SettingGetType(index);
}
template <typename V> inline int SettingGetType();
template <> inline int SettingGetType<bool>() { return cSetting_boolean; }
template <> inline int SettingGetType<int>() { return cSetting_int; }
template <> inline int SettingGetType<float>() { return cSetting_float; }
template <> inline int SettingGetType<const float*>() { return cSetting_float3; }
template <> inline int SettingGetType<float*>() { return cSetting_float3; }
template <> inline int SettingGetType<const char*>() { return cSetting_string; }
template <> inline int SettingGetType<char*>() { return cSetting_string; }
#define SettingSetGlobal_b SettingSet<bool>
#define SettingSetGlobal_i SettingSet<int>
#define SettingSetGlobal_s SettingSet<const char *>
#define SettingSetGlobal_f SettingSet<float>
int SettingSetSmart_i(PyMOLGlobals * G, CSetting * set1, CSetting * set2, int index,
int value);
int SettingSet_color(CSetting * I, int index, const char *value);
int SettingSetFromString(PyMOLGlobals * G, CSetting * I, int index, const char *st);
int SettingStringToTypedValue(PyMOLGlobals * G, int index, const char *st, int *type,
int *value);
#ifndef _PYMOL_NOPY
int SettingSetFromTuple(PyMOLGlobals * G, CSetting * I, int index, PyObject * tuple);
PyObject *SettingGetPyObject(PyMOLGlobals * G, const CSetting * set1, const CSetting * set2, int index);
PyObject *SettingGetTuple(PyMOLGlobals * G, const CSetting * set1, const CSetting * set2, int index); /* (type,(value,)) */
PyObject *SettingGetSettingIndices();
PyObject *SettingUniqueGetIndicesAsPyList(PyMOLGlobals * G, int unique_id);
#endif
std::vector<int> SettingGetUpdateList(PyMOLGlobals * G, const char * name="", int state=0);
void SettingGenerateSideEffects(PyMOLGlobals * G, int index, const char *sele, int state, int quiet);
int SettingGetIndex(PyMOLGlobals * G, const char *name);
int SettingGetName(PyMOLGlobals * G, int index, SettingName name);
const char * SettingGetName(int index);
PyObject *SettingAsPyList(CSetting * I, bool incl_blacklisted=false);
int SettingFromPyList(CSetting * I, PyObject * list);
int SettingSetGlobalsFromPyList(PyMOLGlobals * G, PyObject * list);
PyObject *SettingGetGlobalsAsPyList(PyMOLGlobals * G);
CSetting *SettingNewFromPyList(PyMOLGlobals * G, PyObject * list);
int SettingCheckFontID(PyMOLGlobals * G, CSetting * set1, CSetting * set2, int font_id);
// The following defines the enum with all cSetting_<settingname> indices
#include "SettingInfo.h"
#define cStereo_default 0 /* stereo_mode=0 only used for startup */
#define cStereo_quadbuffer 1
#define cStereo_crosseye 2
#define cStereo_walleye 3
#define cStereo_geowall 4
#define cStereo_sidebyside 5
#define cStereo_stencil_by_row 6
#define cStereo_stencil_by_column 7
#define cStereo_stencil_checkerboard 8
#define cStereo_stencil_custom 9 /* for hardware developers to use */
#define cStereo_anaglyph 10
#define cStereo_dynamic 11 /* dynamic polarization */
#define cStereo_clone_dynamic 12
/*
* State index iterator which iterates either over a single state (state >= 0),
* the current state (state == -2), or all states (state == -1). Takes
* static singletons into account. Zero iterations if state >= nstate.
*
* StateIterator iter(G, I->Obj.Setting, state, I->NState);
* while(iter.next()) {
* printf("in state %d\n", iter.state);
* }
*/
class StateIterator {
int end;
public:
int state;
StateIterator(PyMOLGlobals * G, CSetting * set, int state_, int nstate);
bool next() {
return (++state < end);
};
};
/*
* Setting levels (global, object, ...)
*/
enum {
cSettingLevel_unused = 0,
cSettingLevel_global,
cSettingLevel_object,
cSettingLevel_ostate,
cSettingLevel_atom,
cSettingLevel_astate,
cSettingLevel_bond,
cSettingLevel_bstate
};
// Setting level info table
extern const struct SettingLevelInfoType {
// name of this level, for feedback
const char * name;
// bitmask of valid (sub-)levels
unsigned char mask;
} SettingLevelInfo[];
const char * SettingLevelGetName(PyMOLGlobals * G, int index);
bool SettingLevelCheckMask(PyMOLGlobals * G, int index, unsigned char mask);
bool SettingLevelCheck(PyMOLGlobals * G, int index, unsigned char level);
bool CPyMOLInitSetting(OVLexicon * Lex, OVOneToOne * Setting);
extern "C" OVreturn_word get_setting_id(CPyMOL * I, const char *setting);
/*
* Overloaded setters for templatted programming
*/
inline void SettingSet(CSetting * s, int i, bool v) { SettingSet_b(s, i, v); }
inline void SettingSet(CSetting * s, int i, int v) { SettingSet_i(s, i, v); }
inline void SettingSet(CSetting * s, int i, long int v) { SettingSet_i(s, i, v); }
inline void SettingSet(CSetting * s, int i, float v) { SettingSet_f(s, i, v); }
inline void SettingSet(CSetting * s, int i, const char *v) { SettingSet_s(s, i, v); }
inline void SettingSet(CSetting * s, int i, const float *v) { SettingSet_3fv(s, i, v); }
template <typename V>
void SettingUniqueSet(PyMOLGlobals * G, int uid, int index, V value) {
SettingUniqueSetTypedValue(G, uid, index, SettingGetType<V>(), &value);
}
template <typename V> void SettingSet(PyMOLGlobals * G, CSetting ** handle, int index, V value) {
SettingCheckHandle(G, handle);
SettingSet(*handle, index, value);
}
// global setting
template <typename V> bool SettingSet(PyMOLGlobals * G, int index, V value) {
SettingSet(G->Setting, index, value);
return true;
}
// light setting array
extern int light_setting_indices[];
/*
* Getters for templatted programming
*/
const CSetting * _SettingGetFirstDefined(int index,
PyMOLGlobals * G,
const CSetting * set1,
const CSetting * set2);
template <typename V> V SettingGet(int index, const CSetting *);
template <typename V> V SettingGet(PyMOLGlobals * G,
const CSetting * set1,
const CSetting * set2, int index) {
return SettingGet<V>(index, _SettingGetFirstDefined(index, G, set1, set2));
}
template <typename V> V SettingGet(PyMOLGlobals * G, int index) {
return SettingGet<V>(index, G->Setting);
}
/*
* Get setting value if it's defined in the given set, and assign value to
* `out` variable and return true. Otherwise return false and leave `out`
* untouched.
*/
template <typename V>
bool SettingGetIfDefined(const CSetting * s, int index, V * out) {
if (s && s->info[index].defined) {
*out = SettingGet<V>(index, s);
return true;
}
return false;
}
#define SettingGet_b SettingGet<bool>
#define SettingGet_i SettingGet<int>
#define SettingGet_color SettingGet<int>
#define SettingGet_f SettingGet<float>
#define SettingGet_s SettingGet<const char *>
#define SettingGet_3fv SettingGet<const float *>
#define SettingGetGlobal_b SettingGet<bool>
#define SettingGetGlobal_i SettingGet<int>
#define SettingGetGlobal_color SettingGet<int>
#define SettingGetGlobal_f SettingGet<float>
#define SettingGetGlobal_s SettingGet<const char *>
#define SettingGetGlobal_3fv SettingGet<const float *>
#define SettingGetIfDefined_b(G, s, i, o) SettingGetIfDefined(s, i, o)
#define SettingGetIfDefined_i(G, s, i, o) SettingGetIfDefined(s, i, o)
/*
* templatted unique settings
*/
bool SettingUniqueGetTypedValuePtr(PyMOLGlobals * G, int unique_id, int index,
int setting_type, void * out);
/*
* bool overload
*/
inline
bool SettingUniqueGetTypedValuePtr(PyMOLGlobals * G, int unique_id, int index,
int setting_type, bool * out) {
int i = *out;
bool r = SettingUniqueGetTypedValuePtr(G, unique_id, index, setting_type, &i);
*out = i;
return r;
}
/*
* `SettingGetIfDefined` equivalent for unique settings.
*/
template <typename V>
bool SettingUniqueGetIfDefined(PyMOLGlobals * G, int unique_id, int index, V * out) {
return SettingUniqueGetTypedValuePtr(G, unique_id, index,
SettingGetType<V>(), out);
}
#endif