diff --git a/scripts/qrcode.py b/scripts/qrcode.py index 4606bb4..7dab156 100644 --- a/scripts/qrcode.py +++ b/scripts/qrcode.py @@ -34,11 +34,17 @@ def generate(selected_tab, keys, *values): out = io.BytesIO() qrcode = segno.make(data, micro=False, error=args["setting_error_correction"], boost_error=False) - qrcode.save(out, kind='png', scale=args["setting_scale"], border=args["setting_border"], dark=args["setting_dark"], light=args["setting_light"]) + scale = 1 if args["size_mode"] == "size" else args["setting_scale"] + qrcode.save(out, kind='png', scale=scale, border=args["setting_border"], dark=args["setting_dark"], light=args["setting_light"]) except Exception as e: return None, getattr(e, "message", str(e)) - return Image.open(out), None + img = Image.open(out) + + if args["size_mode"] == "size": + img = img.resize((args["setting_size"], args["setting_size"])) + + return img, None def on_ui_tabs(): with gr.Blocks() as ui_component: @@ -110,13 +116,19 @@ def on_ui_tabs(): inputs["geo_latitude"] = gr.Number(0, label="Latitude", elem_id="qrcode_geo_latitude") inputs["geo_longitude"] = gr.Number(0, label="Longitude", elem_id="qrcode_geo_longitude") - with gr.Accordion("Settings", open=False): + inputs["size_mode"] = gr.State("size") + + with gr.Tab("Scale to") as tab_size: + tab_size.select(lambda: "size", None, inputs["size_mode"]) + inputs["setting_size"] = gr.Slider(label="Size", minimum=64, maximum=2048, value=512, step=8) + with gr.Tab("Scale by") as tab_scale: + tab_scale.select(lambda: "scale", None, inputs["size_mode"]) inputs["setting_scale"] = gr.Slider(label="Scale", minimum=1, maximum=50, value=10, step=1, elem_id="qrcode_scale") - inputs["setting_border"] = gr.Slider(label="Border", minimum=0, maximum=10, value=4, step=1, elem_id="qrcode_border") - with gr.Row(): - inputs["setting_dark"] = gr.ColorPicker("#000000", label="Module Color") - inputs["setting_light"] = gr.ColorPicker("#ffffff", label="Background Color") - inputs["setting_error_correction"] = gr.Radio(value="H", label="Error Correction Level", choices=["L", "M", "Q", "H"], elem_id="qrcode_error_correction") + inputs["setting_border"] = gr.Slider(label="Border", minimum=0, maximum=10, value=4, step=1, elem_id="qrcode_border") + with gr.Row(): + inputs["setting_dark"] = gr.ColorPicker("#000000", label="Module Color") + inputs["setting_light"] = gr.ColorPicker("#ffffff", label="Background Color") + inputs["setting_error_correction"] = gr.Radio(value="H", label="Error Correction Level", choices=["L", "M", "Q", "H"], elem_id="qrcode_error_correction") button_generate = gr.Button("Generate", variant="primary") status = gr.HTML()