diff --git a/.gitattributes b/.gitattributes index c921772ae..8b8fb3e05 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,3 +1,5 @@ *.png filter=lfs diff=lfs merge=lfs -text *.gif filter=lfs diff=lfs merge=lfs -text *.npy filter=lfs diff=lfs merge=lfs -text +*.ico filter=lfs diff=lfs merge=lfs -text +*.svg filter=lfs diff=lfs merge=lfs -text diff --git a/docs/source/_static/custom.js b/docs/source/_static/custom.js new file mode 100644 index 000000000..e3221559b --- /dev/null +++ b/docs/source/_static/custom.js @@ -0,0 +1 @@ +document.title = "fastplotlib"; diff --git a/docs/source/_static/favicon.ico b/docs/source/_static/favicon.ico new file mode 100644 index 000000000..5c3553682 --- /dev/null +++ b/docs/source/_static/favicon.ico @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9e0faa4ded5575f72c9c8012bffadf719d874acb7d9f2c14e7095c849278fe5e +size 15086 diff --git a/docs/source/_static/logo-dark.png b/docs/source/_static/logo-dark.png new file mode 100644 index 000000000..e7feb594d --- /dev/null +++ b/docs/source/_static/logo-dark.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fe0a8b7728808aad9ea8c94bcb33688b74c8c5dc98ac703a4cae7b0ae05bb2dc +size 382172 diff --git a/docs/source/_static/logo-dark.svg b/docs/source/_static/logo-dark.svg new file mode 100644 index 000000000..3705cc545 --- /dev/null +++ b/docs/source/_static/logo-dark.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7a977346536077cbb743eaea921c8461d84ab829be8845aa241e66f13a5a79b6 +size 101969 diff --git a/docs/source/_static/logo-light.png b/docs/source/_static/logo-light.png new file mode 100644 index 000000000..1ec5ff88d --- /dev/null +++ b/docs/source/_static/logo-light.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:56c64203c133ce1cc3f4098ea76ad5ba6b5cff1a5437ce528311dd6caec7cced +size 137447 diff --git a/docs/source/_static/logo-light.svg b/docs/source/_static/logo-light.svg new file mode 100644 index 000000000..77a662996 --- /dev/null +++ b/docs/source/_static/logo-light.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:48c3dd368a46e11afcf3dafc8ce3ba24e3798233478ef203699676b3668e443c +size 604967 diff --git a/docs/source/_static/parrot-icon.png b/docs/source/_static/parrot-icon.png new file mode 100644 index 000000000..a9ea6b494 --- /dev/null +++ b/docs/source/_static/parrot-icon.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:77bf253a81eae4849d73931d56a6a0fa30685d3b47e4831fb69f7ad99cbecb19 +size 74082 diff --git a/docs/source/_static/parrot-icon.svg b/docs/source/_static/parrot-icon.svg new file mode 100644 index 000000000..5eb3cf918 --- /dev/null +++ b/docs/source/_static/parrot-icon.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bef636faa272b30d8c16b6336ad961c8cd722cefed249b7b7e6f87b62db78628 +size 99487 diff --git a/docs/source/conf.py b/docs/source/conf.py index 8547e9ae7..59dfa53cb 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -9,13 +9,14 @@ # otherwise fpl tries to select glfw canvas os.environ["WGPU_FORCE_OFFSCREEN"] = "1" -import fastplotlib -from pygfx.utils.gallery_scraper import find_examples_for_gallery -from pathlib import Path import sys -from sphinx_gallery.sorting import ExplicitOrder +from pathlib import Path + import imageio.v3 as iio +from pygfx.utils.gallery_scraper import find_examples_for_gallery +from sphinx_gallery.sorting import ExplicitOrder +import fastplotlib ROOT_DIR = Path(__file__).parents[1].parents[0] # repo root EXAMPLES_DIR = Path.joinpath(ROOT_DIR, "examples") @@ -112,13 +113,19 @@ "name": "Github", "url": "https://github.com/fastplotlib/fastplotlib", "icon": "fa-brands fa-github", - } + }, ], + "logo": { + "image_light": "_static/logo-light.png", + "image_dark": "_static/logo-dark.png", + }, } html_static_path = ["_static"] +html_js_files = ["custom.js"] html_logo = "_static/logo.png" -html_title = f"v{release}" +html_favicon = "_static/favicon.ico" +html_title = "" autodoc_member_order = "groupwise" autoclass_content = "both" diff --git a/docs/source/fastplotlib_logo.svg b/docs/source/fastplotlib_logo.svg index eb2a738a8..77a662996 100644 --- a/docs/source/fastplotlib_logo.svg +++ b/docs/source/fastplotlib_logo.svg @@ -1,2973 +1,3 @@ - - - - - - - - - Adobe PDF library 6.66 - - - 2023-10-26T23:30:36+02:00 - 2023-10-26T23:30:36+02:00 - Adobe Illustrator CS6 (Windows) - 2023-10-26T23:30:36+02:00 - - - - 256 - 128 - JPEG - /9j/4AAQSkZJRgABAgEAlgCWAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAAlgAAAAEA -AQCWAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK -DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f -Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgAgAEAAwER -AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA -AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB -UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE -1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ -qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy -obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp -0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo -+DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXEgAkmgHU -4qxPzP8AmJpGkwlLOSO+vjsscbBkT3dl/UN8x8uoERtuXC1GuhAbGy8w1bzh5h1V2NzeOI26QREx -xj24r1+mua/IZy3kdvsdRk105dUqWORz7nuc1M+09PA1vL3D9dMBGckdY6r5g0lvVsbmWEDchGJQ -/wCshqp+kZsNF2jhyHhjKpdx2/YxlPPi3F09W8ieeE8wQvbXKrFqcC8nVdlkStOajtQ9Rm+4SBu7 -Xs7tEZ/SfrH2ssxdo7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY -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 - - - - - - xmp.did:AAD079D7E373EE11BDBBD9667552FBE7 - xmp.iid:AAD079D7E373EE11BDBBD9667552FBE7 - uuid:d522c974-cd9d-428a-a57e-1ccffb646c7e - - xmp.iid:A8D079D7E373EE11BDBBD9667552FBE7 - xmp.did:A8D079D7E373EE11BDBBD9667552FBE7 - uuid:d522c974-cd9d-428a-a57e-1ccffb646c7e - proof:pdf - - - - - saved - xmp.iid:A8D079D7E373EE11BDBBD9667552FBE7 - 2023-10-26T23:30:25+02:00 - Adobe Illustrator CS6 (Windows) - / - - - saved - xmp.iid:AAD079D7E373EE11BDBBD9667552FBE7 - 2023-10-26T23:30:36+02:00 - Adobe Illustrator CS6 (Windows) - / - - - - proof:pdf - - - image/svg+xml - - - - 782.998047 - 447.154785 - Pixels - - 1 - True - False - - - Cyan - Magenta - Yellow - Black - - - - - - Default Swatch Group - 0 - - - - White - RGB - PROCESS - 255 - 255 - 255 - - - Black - RGB - PROCESS - 0 - 0 - 0 - - - Magenta - RGB - PROCESS - 240 - 3 - 127 - - - Red - RGB - PROCESS - 255 - 0 - 0 - - - Crimson - RGB - PROCESS - 137 - 12 - 8 - - - Peach - RGB - PROCESS - 237 - 179 - 41 - - - Custard - RGB - PROCESS - 254 - 222 - 88 - - - Yellow - RGB - PROCESS - 255 - 255 - 0 - - - Lime - RGB - PROCESS - 171 - 218 - 77 - - - Dried Sage - RGB - PROCESS - 160 - 192 - 124 - - - Green - RGB - PROCESS - 51 - 160 - 44 - - - Forest - RGB - PROCESS - 22 - 88 - 41 - - - Mediterranean - RGB - PROCESS - 0 - 145 - 147 - - - Bright Blue - RGB - PROCESS - 139 - 211 - 229 - - - Pure Cyan - RGB - PROCESS - 0 - 160 - 198 - - - Night Blue - RGB - PROCESS - 10 - 80 - 161 - - - Orange - RGB - PROCESS - 255 - 127 - 0 - - - Slate - RGB - PROCESS - 102 - 129 - 135 - - - Periwinkle - RGB - PROCESS - 145 - 155 - 201 - - - Plum - RGB - PROCESS - 129 - 23 - 136 - - - Lavender - RGB - PROCESS - 205 - 130 - 190 - - - Baby Pink - RGB - PROCESS - 251 - 192 - 223 - - - Bisque - RGB - PROCESS - 231 - 185 - 138 - - - Cafe Con Leche - RGB - PROCESS - 169 - 119 - 93 - - - Malt - RGB - PROCESS - 138 - 100 - 74 - - - Mocha - RGB - PROCESS - 90 - 61 - 27 - - - Pigeon - RGB - PROCESS - 179 - 179 - 179 - - - Battleship - RGB - PROCESS - 77 - 77 - 77 - - - Global Black - PROCESS - 100.000000 - RGB - 0 - 0 - 0 - - - Global Red - PROCESS - 100.000000 - RGB - 255 - 0 - 0 - - - Global Orange - PROCESS - 100.000000 - RGB - 255 - 126 - 0 - - - Global Yellow - PROCESS - 100.000000 - RGB - 255 - 255 - 0 - - - Global Lime - PROCESS - 100.000000 - RGB - 171 - 217 - 77 - - - Global Green - PROCESS - 100.000000 - RGB - 51 - 159 - 43 - - - Global Blue - PROCESS - 100.000000 - RGB - 139 - 210 - 228 - - - Global Night - PROCESS - 100.000000 - RGB - 9 - 79 - 161 - - - Global Periwinkle - PROCESS - 100.000000 - RGB - 144 - 154 - 200 - - - Global Plum - PROCESS - 100.000000 - RGB - 129 - 23 - 135 - - - Global Pink - PROCESS - 100.000000 - RGB - 250 - 191 - 222 - - - Global Malt - PROCESS - 100.000000 - RGB - 138 - 98 - 74 - - - New Color Swatch 2 - RGB - PROCESS - 0 - 80 - 151 - - - New Color Swatch 3 - RGB - PROCESS - 0 - 154 - 48 - - - New Color Swatch 5 - RGB - PROCESS - 255 - 222 - 0 - - - New Color Swatch 4 - RGB - PROCESS - 207 - 0 - 23 - - - PANTONE 361 U - SPOT - 100.000000 - RGB - 78 - 172 - 37 - - - New Color Swatch 6 - RGB - PROCESS - 55 - 69 - 84 - - - New Color Swatch 10 - RGB - PROCESS - 216 - 162 - 116 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +version https://git-lfs.github.com/spec/v1 +oid sha256:48c3dd368a46e11afcf3dafc8ce3ba24e3798233478ef203699676b3668e443c +size 604967 diff --git a/docs/source/index.rst b/docs/source/index.rst index c44f4e3a8..194248679 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -1,5 +1,5 @@ -Welcome to fastplotlib's documentation! -======================================= +fastplotlib +=========== .. toctree:: :caption: Getting started diff --git a/fastplotlib/assets/fastplotlib_face_logo.png b/fastplotlib/assets/fastplotlib_face_logo.png index a5a8bd90e..a9ea6b494 100644 --- a/fastplotlib/assets/fastplotlib_face_logo.png +++ b/fastplotlib/assets/fastplotlib_face_logo.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:84976200545d143f559b6840a332f3121d58f8d7de8dad7cb8a6d027d854c153 -size 10239 +oid sha256:77bf253a81eae4849d73931d56a6a0fa30685d3b47e4831fb69f7ad99cbecb19 +size 74082 diff --git a/fastplotlib/assets/icon.png b/fastplotlib/assets/icon.png new file mode 100644 index 000000000..a9ea6b494 --- /dev/null +++ b/fastplotlib/assets/icon.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:77bf253a81eae4849d73931d56a6a0fa30685d3b47e4831fb69f7ad99cbecb19 +size 74082 diff --git a/fastplotlib/layouts/_utils.py b/fastplotlib/layouts/_utils.py index 49120c71a..6b40b8803 100644 --- a/fastplotlib/layouts/_utils.py +++ b/fastplotlib/layouts/_utils.py @@ -1,5 +1,6 @@ import importlib from itertools import product +from pathlib import Path import numpy as np @@ -8,6 +9,8 @@ from ..utils.gui import BaseRenderCanvas, RenderCanvas +ICON_PATH = Path(__file__).parent.parent / "assets" / "icon.png" + try: import imgui_bundle except ImportError: @@ -50,6 +53,8 @@ def make_canvas_and_renderer( f"renderer option must be a pygfx.Renderer instance such as pygfx.WgpuRenderer" ) + _set_window_icon(canvas) + return canvas, renderer @@ -123,3 +128,50 @@ def get_extents_from_grid( extents.append(extent) return extents + + +def _set_window_icon(canvas) -> None: + """Set the window icon based on canvas type.""" + if not ICON_PATH.exists(): + return + + canvas_name = canvas.__class__.__name__ + + if canvas_name == "QRenderCanvas": + _set_icon_qt(canvas) + elif canvas_name == "GlfwRenderCanvas": + _set_icon_glfw(canvas) + + +def _set_icon_glfw(canvas) -> None: + """Set window icon for GLFW backend.""" + try: + import glfw + from PIL import Image + except ImportError: + return + + if not hasattr(canvas, "_window"): + return + + img = Image.open(ICON_PATH).convert("RGBA") + pixels = np.array(img) + glfw.set_window_icon(canvas._window, 1, [(img.width, img.height, pixels)]) + + +def _set_icon_qt(canvas) -> None: + """Set window icon for Qt backend.""" + try: + from qtpy.QtGui import QIcon + from qtpy.QtWidgets import QApplication + except ImportError: + return + + icon = QIcon(str(ICON_PATH)) + + app = QApplication.instance() + if app is not None: + app.setWindowIcon(icon) + + for window in app.topLevelWidgets(): + window.setWindowIcon(icon)