diff --git a/bricks/build.sh b/bricks/build.sh
index c430398..28656d4 100755
--- a/bricks/build.sh
+++ b/bricks/build.sh
@@ -11,7 +11,8 @@ SOURCES=" page_data_loader.js factory.js uitypesdef.js utils.js uitype.js \
llm.js websocket.js datarow.js tabular.js continueaudio.js \
line.js pie.js bar.js gobang.js period.js iconbarpage.js \
keypress.js asr.js webspeech.js countdown.js progressbar.js \
- qaframe.js svg.js videoplayer.js sctter.js radar.js kline.js heatmap.js map.js"
+ qaframe.js svg.js videoplayer.js sctter.js radar.js kline.js \
+ heatmap.js map.js qr.js "
echo ${SOURCES}
cat ${SOURCES} > ../dist/bricks.js
# uglifyjs --compress --mangle -- ../dist/bricks.js > ../dist/bricks.min.js
diff --git a/bricks/header.tmpl b/bricks/header.tmpl
index a22d85e..225ca67 100644
--- a/bricks/header.tmpl
+++ b/bricks/header.tmpl
@@ -32,6 +32,7 @@
+
diff --git a/bricks/menu.js b/bricks/menu.js
index 453fa14..3cc74d5 100644
--- a/bricks/menu.js
+++ b/bricks/menu.js
@@ -58,7 +58,7 @@ bricks.Menu = class extends bricks.VScrollPanel {
}
}
var w = await bricks.widgetBuild(desc, this);
- if (w && ! w.parent){
+ if (w && ! bricks.Factory.isWidgetType(w, 'Popup')){
t.clear_widgets();
t.add_widget(w);
} else {
diff --git a/bricks/qr.js b/bricks/qr.js
new file mode 100644
index 0000000..fb3d00e
--- /dev/null
+++ b/bricks/qr.js
@@ -0,0 +1,41 @@
+var bricks = window.bricks || {};
+bricks.QRCodeScan = class extends bricks.VBox {
+ constructor(opts){
+ opts.width = '300px';
+ opts.height = '300px';
+ super(opts);
+ this.scan_config = {
+ fps: 10, // 每秒尝试识别次数
+ qrbox: { width: 250, height: 250 }, // 扫描框大小
+ aspectRatio: 1.0, // 保持正方形
+ disableFlip: false // 是否禁用镜像(移动端前置摄像头会镜像)
+ };
+ this.bind('click', this.stop.bind(this))
+ schedule_once(this.start.bind(this), 0.5)
+ }
+ get_qr_result(decodedText, decodedResult){
+ this.dispatch('recognized', decodedText)
+ console.log('decodeText=', decodedText)
+ this.stop()
+ }
+ errorhandle(msg){
+ console.log("识别失败:", msg);
+ }
+ start(){
+ this.scanner = new Html5Qrcode(this.widget_id);
+ this.scanner.start({ facingMode: "environment" },
+ this.scan_config,
+ this.get_qr_result.bind(this),
+ this.errorhandle.bind(this)
+ ).catch(err => {
+ console.error('启动摄像头失败')
+ });
+
+ }
+ stop(){
+ if this.scanner && this.scanner.getState() !== Html5QrcodeScannerState.NOT_STARTED) {
+ this.scanner.stop()
+ }
+ }
+}
+bricks.Factory.register('QRCodeScan', bricks.QRCodeScan);