#include "precompiled.h" #include "JSInterface_GUITypes.h" #include "ps/CStr.h" /**** GUISize ****/ JSClass JSI_GUISize::JSI_class = { "GUISize", 0, JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, JS_FinalizeStub, NULL, NULL, NULL, JSI_GUISize::construct }; JSPropertySpec JSI_GUISize::JSI_props[] = { { "left", 0, JSPROP_ENUMERATE}, { "top", 1, JSPROP_ENUMERATE}, { "right", 2, JSPROP_ENUMERATE}, { "bottom", 3, JSPROP_ENUMERATE}, { "rleft", 4, JSPROP_ENUMERATE}, { "rtop", 5, JSPROP_ENUMERATE}, { "rright", 6, JSPROP_ENUMERATE}, { "rbottom", 7, JSPROP_ENUMERATE}, { 0 } }; JSFunctionSpec JSI_GUISize::JSI_methods[] = { { "toString", JSI_GUISize::toString, 0, 0, 0 }, { 0 } }; JSBool JSI_GUISize::construct(JSContext* cx, JSObject* obj, uint argc, jsval* argv, jsval* UNUSED(rval)) { if (argc == 8) { JS_SetProperty(cx, obj, "left", &argv[0]); JS_SetProperty(cx, obj, "top", &argv[1]); JS_SetProperty(cx, obj, "right", &argv[2]); JS_SetProperty(cx, obj, "bottom", &argv[3]); JS_SetProperty(cx, obj, "rleft", &argv[4]); JS_SetProperty(cx, obj, "rtop", &argv[5]); JS_SetProperty(cx, obj, "rright", &argv[6]); JS_SetProperty(cx, obj, "rbottom", &argv[7]); } else if (argc == 4) { jsval zero = JSVAL_ZERO; JS_SetProperty(cx, obj, "left", &argv[0]); JS_SetProperty(cx, obj, "top", &argv[1]); JS_SetProperty(cx, obj, "right", &argv[2]); JS_SetProperty(cx, obj, "bottom", &argv[3]); JS_SetProperty(cx, obj, "rleft", &zero); JS_SetProperty(cx, obj, "rtop", &zero); JS_SetProperty(cx, obj, "rright", &zero); JS_SetProperty(cx, obj, "rbottom", &zero); } else { jsval zero = JSVAL_ZERO; JS_SetProperty(cx, obj, "left", &zero); JS_SetProperty(cx, obj, "top", &zero); JS_SetProperty(cx, obj, "right", &zero); JS_SetProperty(cx, obj, "bottom", &zero); JS_SetProperty(cx, obj, "rleft", &zero); JS_SetProperty(cx, obj, "rtop", &zero); JS_SetProperty(cx, obj, "rright", &zero); JS_SetProperty(cx, obj, "rbottom", &zero); } return JS_TRUE; } // Produces "10", "-10", "50%", "50%-10", "50%+10", etc CStr ToPercentString(double pix, double per) { if (per == 0) return CStr(pix); else return CStr(per)+CStr("%")+( pix == 0.0 ? CStr() : pix > 0.0 ? CStr("+")+CStr(pix) : CStr(pix) ); } JSBool JSI_GUISize::toString(JSContext* cx, JSObject* obj, uintN UNUSED(argc), jsval* UNUSED(argv), jsval* rval) { CStr buffer; try { #define SIDE(side) buffer += ToPercentString(g_ScriptingHost.GetObjectProperty_Double(obj, #side), g_ScriptingHost.GetObjectProperty_Double(obj, "r"#side)); SIDE(left); buffer += " "; SIDE(top); buffer += " "; SIDE(right); buffer += " "; SIDE(bottom); #undef SIDE } catch (PSERROR_Scripting_ConversionFailed) { *rval = STRING_TO_JSVAL(JS_NewStringCopyZ(cx, "<Error converting value to numbers>")); return JS_TRUE; } *rval = STRING_TO_JSVAL(JS_NewStringCopyZ(cx, buffer.c_str())); return JS_TRUE; } /**** GUIColor ****/ JSClass JSI_GUIColor::JSI_class = { "GUIColor", 0, JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, JS_FinalizeStub, NULL, NULL, NULL, JSI_GUIColor::construct }; JSPropertySpec JSI_GUIColor::JSI_props[] = { { "r", 0, JSPROP_ENUMERATE}, { "g", 1, JSPROP_ENUMERATE}, { "b", 2, JSPROP_ENUMERATE}, { "a", 3, JSPROP_ENUMERATE}, { 0 } }; JSFunctionSpec JSI_GUIColor::JSI_methods[] = { { "toString", JSI_GUIColor::toString, 0, 0, 0 }, { 0 } }; JSBool JSI_GUIColor::construct(JSContext* cx, JSObject* obj, uint argc, jsval* argv, jsval* UNUSED(rval)) { if (argc == 4) { JS_SetProperty(cx, obj, "r", &argv[0]); JS_SetProperty(cx, obj, "g", &argv[1]); JS_SetProperty(cx, obj, "b", &argv[2]); JS_SetProperty(cx, obj, "a", &argv[3]); } else { // Nice magenta: jsval r = DOUBLE_TO_JSVAL(JS_NewDouble(cx, 1.0)); JS_SetProperty(cx, obj, "r", &r); jsval g = DOUBLE_TO_JSVAL(JS_NewDouble(cx, 0.0)); JS_SetProperty(cx, obj, "g", &g); jsval b = DOUBLE_TO_JSVAL(JS_NewDouble(cx, 1.0)); JS_SetProperty(cx, obj, "b", &b); jsval a = DOUBLE_TO_JSVAL(JS_NewDouble(cx, 1.0)); JS_SetProperty(cx, obj, "a", &a); } return JS_TRUE; } JSBool JSI_GUIColor::toString(JSContext* cx, JSObject* obj, uintN UNUSED(argc), jsval* UNUSED(argv), jsval* rval) { char buffer[256]; // Convert to integers, to be compatible with the GUI's string SetSetting snprintf(buffer, 256, "%d %d %d %d", (int)( 255.0 * *JSVAL_TO_DOUBLE(g_ScriptingHost.GetObjectProperty(obj, "r")) ), (int)( 255.0 * *JSVAL_TO_DOUBLE(g_ScriptingHost.GetObjectProperty(obj, "g")) ), (int)( 255.0 * *JSVAL_TO_DOUBLE(g_ScriptingHost.GetObjectProperty(obj, "b")) ), (int)( 255.0 * *JSVAL_TO_DOUBLE(g_ScriptingHost.GetObjectProperty(obj, "a")) )); *rval = STRING_TO_JSVAL(JS_NewStringCopyZ(cx, buffer)); return JS_TRUE; } /**** GUIMouse ****/ JSClass JSI_GUIMouse::JSI_class = { "GUIMouse", 0, JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, JS_FinalizeStub, NULL, NULL, NULL, JSI_GUIMouse::construct }; JSPropertySpec JSI_GUIMouse::JSI_props[] = { { "x", 0, JSPROP_ENUMERATE}, { "y", 1, JSPROP_ENUMERATE}, { "buttons", 2, JSPROP_ENUMERATE}, { 0 } }; JSFunctionSpec JSI_GUIMouse::JSI_methods[] = { { "toString", JSI_GUIMouse::toString, 0, 0, 0 }, { 0 } }; JSBool JSI_GUIMouse::construct(JSContext* cx, JSObject* obj, uint argc, jsval* argv, jsval* UNUSED(rval)) { if (argc == 3) { JS_SetProperty(cx, obj, "x", &argv[0]); JS_SetProperty(cx, obj, "y", &argv[1]); JS_SetProperty(cx, obj, "buttons", &argv[2]); } else { jsval zero = JSVAL_ZERO; JS_SetProperty(cx, obj, "x", &zero); JS_SetProperty(cx, obj, "y", &zero); JS_SetProperty(cx, obj, "buttons", &zero); } return JS_TRUE; } JSBool JSI_GUIMouse::toString(JSContext* cx, JSObject* obj, uintN UNUSED(argc), jsval* UNUSED(argv), jsval* rval) { char buffer[256]; snprintf(buffer, 256, "%d %d %d", JSVAL_TO_INT(g_ScriptingHost.GetObjectProperty(obj, "x")), JSVAL_TO_INT(g_ScriptingHost.GetObjectProperty(obj, "y")), JSVAL_TO_INT(g_ScriptingHost.GetObjectProperty(obj, "buttons")) ); *rval = STRING_TO_JSVAL(JS_NewStringCopyZ(cx, buffer)); return JS_TRUE; } // Initialise all the types at once: void JSI_GUITypes::init() { g_ScriptingHost.DefineCustomObjectType(&JSI_GUISize::JSI_class, JSI_GUISize::construct, 1, JSI_GUISize::JSI_props, JSI_GUISize::JSI_methods, NULL, NULL); g_ScriptingHost.DefineCustomObjectType(&JSI_GUIColor::JSI_class, JSI_GUIColor::construct, 1, JSI_GUIColor::JSI_props, JSI_GUIColor::JSI_methods, NULL, NULL); g_ScriptingHost.DefineCustomObjectType(&JSI_GUIMouse::JSI_class, JSI_GUIMouse::construct, 1, JSI_GUIMouse::JSI_props, JSI_GUIMouse::JSI_methods, NULL, NULL); }