var bricks = window.bricks || {}; bricks.app = null; /* all type of bind action's desc has the following attributes: actiontype:'bricks', wid: event: target: datawidget: datascript: datamethod: datakwargs: rtdata: conform: and each type of binds specified attributes list following urlwidget action: mode:, options:{ method: params:{}, url: } bricks action: mode:, options:{ "widgettype":"gg", ... } method action: method: params: for methods kwargs script action: script: params: registerfunction action: rfname: params: event action: dispatch_event: params: */ bricks.uuid = function(){ try{ var d = crypto.randomUUID(); var lst = d.split('-'); return lst.join(''); } catch(e) { const vv = '1234567890qwertyuiopasdfghjklzxcvbnm'; var ret = ''; for (var i=0;i<30;i++){ var j = parseInt(Math.random() * vv.length); ret = ret + vv[j]; } console.log('uuid() return', ret); return ret; } } bricks.deviceid = function(appname){ var deviceid = appname + 'deviceid'; var id = localStorage.getItem(deviceid); if (!id){ id = bricks.uuid(); localStorage.setItem(deviceid, id); } return id; } bricks.str2data = function(s, d){ /* fmt like 'my name is ${name}, ${age:type}' type can be: int, str, json */ funcs = { 'json':JSON.stringify } var regex = /\${(\w+)(?::(int|str|json))?}/; var match = s.match(regex) if (match){ var key = match[1]; var typ = match[2]; var ss = '${' + key; if (typ != ''){ ss += ':' + typ; } ss += '}'; if (s == ss){ if (!d.hasOwnProperty(key)){ return null; } if (typ == ''){ return d[key]; } var f = funcs[typ]; if (f){ return f(d[key]); } return d[key]; } return s.replace(regex, (k, key, typ) => { if (d.hasOwnProperty(key)){ var f = funcs[typ]; if (f){ return f(d[key]); } return d[key]; } return ''; }); } return s; } bricks.apply_data = function(desc, data){ if (bricks.is_empty(data)){ return desc; } var tmpl = JSON.stringify(desc); var s = bricks.obj_fmtstr(data, tmpl); return JSON.parse(s); } bricks.widgetBuild = async function(desc, widget, data){ if (! widget){ widget = bricks.Body; } var klassname = desc.widgettype; var base_url = widget.baseURI; while (klassname == 'urlwidget'){ if (data){ desc = bricks.apply_data(desc, data); } let url = bricks.absurl(desc.options.url, widget); base_url = url; let method = desc.options.method || 'GET'; let opts = desc.options.params || {}; var jc = new bricks.HttpJson(); var desc1 = await jc.httpcall(url, { "method":method, "params":opts}); if (!desc1) return; desc = desc1; klassname = desc.widgettype; } if (data){ desc = bricks.apply_data(desc, data); } if (!desc.widgettype){ console.log('widgettype is null', desc); return null; } let klass = bricks.Factory.get(desc.widgettype); if (! klass){ console.log('widgetBuild():', desc.widgettype, 'not registered', bricks.Factory.widgets_kw); return null; } var options = desc.options || {}; options.baseURI = base_url; let w = new klass(options); if (! w){ console.log('w is null'); } if (desc.id){ w.set_id(desc.id); } if (w.is_container() && desc.subwidgets){ for (let i=0; i { this.screen_orient = window.screen.orientation.type; this.bind('orient_changed', this.screen_orient); }); } get_color(){ return getComputedStyle(this.dom_element).color; return parseRGB(colorStr); } get_bgcolor(){ return getComputedStyle(this.dom_element).backgroundColor; return parseRGB(colorStr); } get_blinkcolor(){ var color, bgcolor, blinkcolor; color = parseRGB(this.get_color()); bgcolor = parseRGB(this.get_bgcolor()); console.log('color=', color, 'bgcolor=', bgcolor); function short1of3(x, y){ if (x < y) { return x + (y - x) / 3; } else { return x - (x - y) / 3; } } var r = short1of3(color.r, bgcolor.r); var g = short1of3(color.g, bgcolor.g); var b = short1of3(color.b, bgcolor.b); var bc = bricks.obj_fmtstr({r:r, g:g, b:b}, "rgb(${r}, ${g}, ${b})"); console.log('color=', color, 'bgcolor=', bgcolor, 'bc=', bc); return bc; } async getCameras() { try { const devices = await navigator.mediaDevices.enumerateDevices(); this.video_devices = devices.filter(device => device.kind === 'videoinput'); } catch (error) { console.error('获取摄像头数量出错:', error); } } async start_camera(vpos) { if (typeof(vpos) == 'undefined') vpos = 0; if (this.video_devices === null){ await this.getCameras(); } if (vpos == this.vpos) return; this.vpos = vpos; if (this.video_stream){ this.video_stream.getTracks().forEach(track => { track.stop(); }); } if (navigator.mediaDevices.getUserMedia) { var x = { deviceId: this.video_devices[vpos].deviceId }; this.video_stream = await navigator.mediaDevices.getUserMedia({ video: x }); } else { console.log("Webcam access is not supported in this browser."); } } async start_mic() { if (this.audio_stream) return; if (navigator.mediaDevices.getUserMedia) { this.audio_stream = navigator.mediaDevices.getUserMedia({ audio: true }); } else { console.log("mic access is not supported in this browser."); this.stream = null; } } new_zindex(){ const v = this.zindex; this.zindex = v + 1; return v; } screenHeight(){ return this.dom_element.clientHeight; } screenWidth(){ return this.dom_element.clientWidth; } create(){ this.dom_element = document.getElementsByTagName('body')[0]; this.set_baseURI(this.dom_element.baseURI); } save_session(session){ this.session_id = session; } get_session(){ return this.session_id; } async setup_i18n(){ let params = {'lang':this.lang}; var jc = new bricks.HttpJson(); d = await jc.httpcall(desc.url, { "method":desc.method||'GET', params:params}); this.i18n.setup_dict(d); } async build(){ var opts = bricks.extend({}, this.opts.widget); var w = await bricks.widgetBuild(opts, bricks.Body); if (!w){ bricks.debug('w=', w, 'Body=', bricks.Body, 'Factory=', bricks.Factory) } return w; } async run(){ await (this.change_language(this)); var w = await this.build(); this.root = w; if (!w){ bricks.debug('w=', w, 'Body=', bricks.Body, 'Factory=', bricks.Factory) return null; } bricks.Body.add_widget(w); bricks.Body.down_level(); } textsize_bigger(){ this.charsize = this.charsize * 1.05; this.char_size.set(this.charsize); } textsize_smaller(){ this.charsize = this.charsize * 0.95; this.char_size.set(this.charsize); } text_resize(){ for (var i=0;i