Skip to main content

Flet-Extended-Interactive-Viewer is a Flet control that provides multiple customization options for displaying two-dimensional content.

Project description

flet-extended-interactive-viewer

PyPI version Python Flet License

Flet-Extended-Interactive-Viewer is a Flet control that provides multiple customization options for displaying two-dimensional content.

🌟 Highlights

  • XY Scrollbars: Synchronized scrollbars for the InteractiveViewer.
  • XY Scrollbar Options: Easy to customize the experience e.g. you can disable the interaction with the scrollbars or disable Y scrollbars.
  • Panning: Supports panning like ft.InteractiveViewer, with synchronized scrollbars. You can also disable panning to use only the scrollbars.
  • Zoom: Zoom with the mouse/touchpad or via a function call. When zooming via a function call, the zoom can be limited to the content size.
  • Transformation data: Provides access to the transformation applied to the content.

ℹ️ Overview

This extension was developed as part of a Bachelor Thesis, supervised by Erik Kubaczka at the Self-Organizing Systems Lab of the Technical University Darmstadt. FletExtendedInteractiveViewer is a powerful control for Flet which enables the user to customize an interactive content view experience.

📖 Documentation

Documentation to this package can be found here.

🚀 Example

Demo

Example

Code

import flet as ft

from flet_extended_interactive_viewer import FletExtendedInteractiveViewer


def main(page: ft.Page):
    page.vertical_alignment = ft.MainAxisAlignment.CENTER
    page.horizontal_alignment = ft.CrossAxisAlignment.CENTER
    text = ft.Text("MOVE ME",size=50)

    def on_click(ex:FletExtendedInteractiveViewer=None,text_move:ft.Text=None):
        if ex.pan_enabled:
            ex.pan_enabled = False
            text_move.value = "PAN DISABLED"
        else:
            ex.pan_enabled = True
            text_move.value = "MOVE ME"
        ex.update()
        text_move.update()

    def get_transformation_click(ex:FletExtendedInteractiveViewer=None,text_update:ft.Text=None):
        x, y, scale = ex.get_transformation_data()
        text_update.value = f"offset_x={round(x)}, offset_y={round(y)}, scale={scale}"
        text_update.update()
    def toggle_scroll_x(ex:FletExtendedInteractiveViewer=None):
        ex.x_scroll_enabled = not ex.x_scroll_enabled
        ex.update()
    def toggle_scroll_y(ex: FletExtendedInteractiveViewer = None):
        ex.y_scroll_enabled = not ex.y_scroll_enabled
        ex.update()

    def toggle_interactive(ex: FletExtendedInteractiveViewer = None):
        ex.interactive_scroll_enabled = not ex.interactive_scroll_enabled
        ex.update()
        
    extended = FletExtendedInteractiveViewer(
                    content=ft.Container(text,width=900,height=800,gradient=ft.LinearGradient(
                        begin=ft.alignment.top_left,
                        end=ft.alignment.bottom_right,
                        colors=[ft.Colors.PINK, ft.Colors.ORANGE_700],
                    )),
                    width=400, height=250,constrained=False,pan_enabled=True,over_zoom_enabled=False,
                )
    
    text_x_y_scale = ft.Text("offset_x=?, offset_y=?, scale=?")
    page.add(ft.Row([
        ft.Column([text_x_y_scale,
                extended,
                   ft.Row([ft.Button("toggle pan",on_click=lambda e,ex=extended,text_move=text:on_click(ex,text_move)),ft.Button("toggle interactive_scroll_bar",on_click=lambda e,ex=extended:toggle_interactive(ex))]),ft.Row([ft.Button("toggle scroll_bar_x",on_click=lambda e,ex=extended:toggle_scroll_x(ex)),ft.Button("toggle scroll_bar_y",on_click=lambda e,ex=extended:toggle_scroll_y(ex))]),
                   ft.Row([ft.Button("reset",on_click=lambda e,ex=extended:ex.reset(400)),ft.Button("zoom in",on_click=lambda e,ex=extended:ex.zoom(1.25)),ft.Button("zoom out",on_click=lambda e,ex=extended:ex.zoom(0.75))]),
                   ft.Row([ft.Button("get_transformation",on_click=lambda e, ex=extended, x_y_scale=text_x_y_scale: get_transformation_click(ex,text_x_y_scale)),ft.Button("set_transformation(-100.0,-100.0,1.0)",on_click=lambda e,ex=extended:ex.set_transformation_data(offset_x=-100.0,offset_y=-100.0,scale=1.0))])
                   ],alignment=ft.MainAxisAlignment.CENTER)],alignment=ft.MainAxisAlignment.CENTER),

    )


ft.app(main)

⬇️ Installation

To install the flet-extended-interactive-viewer package:

  • Using pip:

    pip install flet-extended-interactive-viewer
    

    After this, you will have to manually add this package to your requirements.txt or pyproject.toml.

Build your app:

  • Using Linux:

    flet build linux -v
    
  • Using Mac:

    flet build macos -v
    
  • Using Windows:

    flet build windows -v
    

📝 License

This project is licensed under the MIT license – see the LICENSE file for details.

💭 Feedback & Contributions

Report bugs or suggest features via GitHub Issues.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

flet_extended_interactive_viewer-0.1.2.tar.gz (19.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

File details

Details for the file flet_extended_interactive_viewer-0.1.2.tar.gz.

File metadata

File hashes

Hashes for flet_extended_interactive_viewer-0.1.2.tar.gz
Algorithm Hash digest
SHA256 01e0d347b5ff20a1b36bbbd7c76e5e5a4a97b48adce5ccc726736a2371a4d379
MD5 0a9296a84be15248decd88547ae86db1
BLAKE2b-256 bc09a8318f5549abe827123af16fceba37473f028527ce4fbe99f9831171ffce

See more details on using hashes here.

File details

Details for the file flet_extended_interactive_viewer-0.1.2-py3-none-any.whl.

File metadata

File hashes

Hashes for flet_extended_interactive_viewer-0.1.2-py3-none-any.whl
Algorithm Hash digest
SHA256 0da2f473a1ba0f7d8970b1174bb33b0cfda8a0764e8104a60c0307b36b87d548
MD5 e5c0e0d70e9240eeea70642f95b5b741
BLAKE2b-256 d81ec869778857250dfbbe90069c39701b035f5996d58250cf83e3aa75b52290

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page