diff --git a/docs/source/_static/custom.css b/docs/source/_static/custom.css
new file mode 100644
index 000000000..9ffc70804
--- /dev/null
+++ b/docs/source/_static/custom.css
@@ -0,0 +1,158 @@
+/* from pyqtgraph*/
+
+.bd-sidebar .nav li > a > code {
+ white-space: nowrap;
+}
+
+.bd-sidebar .nav li > a > code:before {
+ content:'(';
+}
+
+.bd-sidebar .nav li > a > code:after {
+ content:')';
+}
+
+.bd-sidebar .nav li > a {
+ font-family: "no-parens", sans-serif;
+}
+
+/* Retrieved from https://codepen.io/jonneal/pen/bXLEdB (MIT)
+ It replaces (, ) with a zero-width font. This version is lighter than
+ the original font from Adobe.
+*/
+@font-face {
+ font-family: no-parens;
+ src: url("data:application/x-font-woff;base64,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");
+ unicode-range: U+0028, U+0029;
+}
+
+/* Colors from:
+
+Wong, B. Points of view: Color blindness.
+Nat Methods 8, 441 (2011). https://doi.org/10.1038/nmeth.1618
+*/
+
+/* If the active version has the name "dev", style it orange */
+#version_switcher_button[data-active-version-name*="dev"] {
+ background-color: #E69F00;
+ border-color: #E69F00;
+ color: white;
+}
+
+/* green for `stable` */
+#version_switcher_button[data-active-version-name*="stable"] {
+ background-color: #009E73;
+ border-color: #009E73;
+ color: white;
+}
+
+/* red for `old` */
+#version_switcher_button:not([data-active-version-name*="stable"]):not([data-active-version-name*="dev"]):not([data-active-version-name*="pull"]) {
+ background-color: #980F0F;
+ border-color: #980F0F;
+ color: white;
+}
+
+/* Main index page overview cards */
+
+.sd-card {
+ background: #fff;
+ border-radius: 0;
+ padding: 30px 10px 20px 10px;
+ margin: 10px 0px;
+}
+
+.sd-card .sd-card-header {
+ text-align: center;
+}
+
+.sd-card .sd-card-header .sd-card-text {
+ margin: 0px;
+}
+
+.sd-card .sd-card-img-top {
+ height: 52px;
+ width: 52px;
+ margin-left: auto;
+ margin-right: auto;
+}
+
+.sd-card .sd-card-header {
+ border: none;
+ background-color:white;
+ color: #150458 !important;
+ font-size: var(--pst-font-size-h5);
+ font-weight: bold;
+ padding: 2.5rem 0rem 0.5rem 0rem;
+ border-bottom: none !important;
+}
+
+.sd-card .sd-card-footer {
+ border: none;
+ background-color:white;
+ border-top: none !important;
+}
+
+.sd-card .sd-card-footer .sd-card-text{
+ max-width: 220px;
+ margin-left: auto;
+ margin-right: auto;
+}
+
+.custom-button {
+ background-color:#DCDCDC;
+ border: none;
+ color: #484848;
+ text-align: center;
+ text-decoration: none;
+ display: inline-block;
+ font-size: 0.9rem;
+ border-radius: 0.5rem;
+ max-width: 120px;
+ padding: 0.5rem 0rem;
+}
+
+.custom-button a {
+ color: #484848;
+}
+
+.custom-button p {
+ margin-top: 0;
+ margin-bottom: 0rem;
+ color: #484848;
+}
+
+/* Dark theme tweaking
+
+Matplotlib images are in png and inverted while other output
+types are assumed to be normal images.
+
+*/
+html[data-theme=dark] img[src*='.svg']:not(.only-dark):not(.dark-light) {
+ filter: brightness(0.8) invert(0.82) contrast(1.2);
+ background: unset
+}
+
+html[data-theme=dark] .MathJax_SVG * {
+ fill: var(--pst-color-text-base);
+}
+
+/* Main index page overview cards */
+
+html[data-theme=dark] .sd-card {
+ background-color:var(--pst-color-background);
+ border: none
+}
+
+html[data-theme=dark] .sd-shadow-sm {
+ box-shadow: 0 .1rem 0.5rem rgba(250, 250, 250, .2) !important
+}
+
+html[data-theme=dark] .sd-card .sd-card-header {
+ background-color:var(--pst-color-background);
+ color: #150458 !important;
+}
+
+html[data-theme=dark] .sd-card .sd-card-footer {
+ background-color:var(--pst-color-background);
+}
diff --git a/docs/source/_static/dash.css b/docs/source/_static/dash.css
new file mode 100644
index 000000000..3bd052e9f
--- /dev/null
+++ b/docs/source/_static/dash.css
@@ -0,0 +1,25 @@
+/* from pyqtgraph*/
+
+.bd-header {
+ display: none;
+}
+
+.bd-sidebar-primary {
+ display: none;
+}
+
+.bd-main .bd-content .bd-article-container {
+ flex-grow: 1;
+ max-width: 100%;
+}
+
+.bd-container .bd-container__inner {
+ flex-grow: 1;
+ max-width: 100%;
+}
+
+/* patching issue from pydata-sphinx-theme */
+div.viewcode-block:target {
+ display: block;
+}
+
diff --git a/docs/source/_templates/.class_page_toc.html.swp b/docs/source/_templates/.class_page_toc.html.swp
deleted file mode 100644
index d4ed35c1f..000000000
Binary files a/docs/source/_templates/.class_page_toc.html.swp and /dev/null differ
diff --git a/docs/source/_templates/class_page_toc.html b/docs/source/_templates/class_page_toc.html
deleted file mode 100644
index e8e4138da..000000000
--- a/docs/source/_templates/class_page_toc.html
+++ /dev/null
@@ -1,18 +0,0 @@
-{% set class_toc = get_class_toc() %}
-
-
diff --git a/docs/source/api/graphic_features.rst b/docs/source/api/graphic_features.rst
index 2fe60ce24..5930a2b57 100644
--- a/docs/source/api/graphic_features.rst
+++ b/docs/source/api/graphic_features.rst
@@ -3,6 +3,25 @@
Graphic Features
****************
+FeatureEvent
+############
+
+ Dataclass that holds feature event information. Has ``type`` and ``pick_info`` attributes.
+
+ **Attributes**
+
+ - type: ``str``, example "colors"
+
+ - pick_info: ``dict`` in the form:
+
+ ============== =============================================================================
+ key value
+ ============== =============================================================================
+ "index" indices where feature data was changed, ``range`` object or ``List[int]``
+ "world_object" world object the feature belongs to
+ "new_data: the new data for this feature
+ ============== =============================================================================
+
Image
#####
@@ -36,13 +55,13 @@ Heatmap
Line
####
-.. autoclass:: fastplotlib.graphics.features.PositionsDataFeature
+.. autoclass:: fastplotlib.graphics.features.PointsDataFeature
:members:
:inherited-members:
:exclude-members: __init__
:no-undoc-members:
-.. autoclass:: fastplotlib.graphics.features.ColorsFeature
+.. autoclass:: fastplotlib.graphics.features.ColorFeature
:members:
:inherited-members:
:exclude-members: __init__
@@ -57,13 +76,13 @@ Line
Scatter
#######
-.. autoclass:: fastplotlib.graphics.features.PositionsDataFeature
+.. autoclass:: fastplotlib.graphics.features.PointsDataFeature
:members:
:inherited-members:
:exclude-members: __init__
:no-undoc-members:
-.. autoclass:: fastplotlib.graphics.features.ColorsFeature
+.. autoclass:: fastplotlib.graphics.features.ColorFeature
:members:
:inherited-members:
:exclude-members: __init__
diff --git a/docs/source/api/graphic_features/index.rst b/docs/source/api/graphic_features/index.rst
new file mode 100644
index 000000000..e69de29bb
diff --git a/docs/source/api/graphics.rst b/docs/source/api/graphics.rst
index d38045dae..8b1378917 100644
--- a/docs/source/api/graphics.rst
+++ b/docs/source/api/graphics.rst
@@ -1,61 +1 @@
-.. _api_graphics:
-
-Graphics
-********
-
-Image
-#####
-
-.. autoclass:: fastplotlib.graphics.image.ImageGraphic
- :members:
- :inherited-members:
-
-Line
-####
-
-.. autoclass:: fastplotlib.graphics.line.LineGraphic
- :members:
- :inherited-members:
-
-Line Collection
-###############
-
-.. autoclass:: fastplotlib.graphics.line_collection.LineCollection
- :members:
- :inherited-members:
-
-Line Stack
-##########
-
-.. autoclass:: fastplotlib.graphics.line_collection.LineStack
- :members:
- :inherited-members:
-
-Heatmap
-#######
-
-.. autoclass:: fastplotlib.graphics.image.HeatmapGraphic
- :members:
- :inherited-members:
-
-Histogram
-#########
-
-.. autoclass:: fastplotlib.graphics.histogram.HistogramGraphic
- :members:
- :inherited-members:
-
-Scatter
-#######
-
-.. autoclass:: fastplotlib.graphics.scatter.ScatterGraphic
- :members:
- :inherited-members:
-
-Text
-####
-
-.. autoclass:: fastplotlib.graphics.text.TextGraphic
- :members:
- :inherited-members:
diff --git a/docs/source/api/graphics/heatmap.rst b/docs/source/api/graphics/heatmap.rst
new file mode 100644
index 000000000..09a50e60a
--- /dev/null
+++ b/docs/source/api/graphics/heatmap.rst
@@ -0,0 +1,6 @@
+Heatmap
+*******
+
+.. autoclass:: fastplotlib.graphics.HeatmapGraphic
+ :members:
+ :inherited-members:
diff --git a/docs/source/api/graphics/image.rst b/docs/source/api/graphics/image.rst
new file mode 100644
index 000000000..bc9a0bf2c
--- /dev/null
+++ b/docs/source/api/graphics/image.rst
@@ -0,0 +1,7 @@
+Image
+*****
+
+.. autoclass:: fastplotlib.graphics.ImageGraphic
+ :members:
+ :inherited-members:
+
diff --git a/docs/source/api/graphics/index.rst b/docs/source/api/graphics/index.rst
new file mode 100644
index 000000000..7e38507b8
--- /dev/null
+++ b/docs/source/api/graphics/index.rst
@@ -0,0 +1,12 @@
+Graphics
+********
+
+.. toctree::
+ :maxdepth: 1
+
+ Image
+ Heatmap
+ Line
+ Line Collections
+ Scatter
+ Text
diff --git a/docs/source/api/graphics/line.rst b/docs/source/api/graphics/line.rst
new file mode 100644
index 000000000..78afd6077
--- /dev/null
+++ b/docs/source/api/graphics/line.rst
@@ -0,0 +1,6 @@
+Line
+####
+
+.. autoclass:: fastplotlib.graphics.LineGraphic
+ :members:
+ :inherited-members:
\ No newline at end of file
diff --git a/docs/source/api/graphics/line_collection.rst b/docs/source/api/graphics/line_collection.rst
new file mode 100644
index 000000000..f03d970bb
--- /dev/null
+++ b/docs/source/api/graphics/line_collection.rst
@@ -0,0 +1,13 @@
+Line Collection
+***************
+
+.. autoclass:: fastplotlib.graphics.LineCollection
+ :members:
+ :inherited-members:
+
+Line Stack
+**********
+
+.. autoclass:: fastplotlib.graphics.LineStack
+ :members:
+ :inherited-members:
diff --git a/docs/source/api/graphics/scatter.rst b/docs/source/api/graphics/scatter.rst
new file mode 100644
index 000000000..daabfb9d6
--- /dev/null
+++ b/docs/source/api/graphics/scatter.rst
@@ -0,0 +1,6 @@
+Scatter
+*******
+
+.. autoclass:: fastplotlib.graphics.ScatterGraphic
+ :members:
+ :inherited-members:
diff --git a/docs/source/api/graphics/text.rst b/docs/source/api/graphics/text.rst
new file mode 100644
index 000000000..063985160
--- /dev/null
+++ b/docs/source/api/graphics/text.rst
@@ -0,0 +1,6 @@
+Text
+####
+
+.. autoclass:: fastplotlib.graphics.TextGraphic
+ :members:
+ :inherited-members:
diff --git a/docs/source/api/plot_areas/index.rst b/docs/source/api/plot_areas/index.rst
new file mode 100644
index 000000000..e69de29bb
diff --git a/docs/source/api/selectors/index.rst b/docs/source/api/selectors/index.rst
new file mode 100644
index 000000000..e69de29bb
diff --git a/docs/source/api/widgets/index.rst b/docs/source/api/widgets/index.rst
new file mode 100644
index 000000000..e69de29bb
diff --git a/docs/source/conf.py b/docs/source/conf.py
index 7be450060..1c9a31710 100644
--- a/docs/source/conf.py
+++ b/docs/source/conf.py
@@ -2,8 +2,8 @@
#
# For the full list of built-in configuration values, see the documentation:
# https://www.sphinx-doc.org/en/master/usage/configuration.html
-from bs4 import BeautifulSoup
-from typing import *
+import os
+import fastplotlib
# -- Project information -----------------------------------------------------
# https://www.sphinx-doc.org/en/master/usage/configuration.html#project-information
@@ -11,7 +11,7 @@
project = 'fastplotlib'
copyright = '2022, Kushal Kolar, Caitlin Lewis'
author = 'Kushal Kolar, Caitlin Lewis'
-release = 'v0.1.0.a6'
+release = fastplotlib.__version__
# -- General configuration ---------------------------------------------------
# https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration
@@ -27,7 +27,7 @@
# https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output
html_theme = 'pydata_sphinx_theme'
-html_theme_options = {"page_sidebar_items": ["class_page_toc"]}
+# html_theme_options = {"page_sidebar_items": ["class_page_toc"]}
html_static_path = ['_static']
@@ -37,47 +37,35 @@
autodoc_typehints = "description"
autodoc_typehints_description_target = "documented_params"
-def _setup_navbar_side_toctree(app: Any):
-
- def add_class_toctree_function(app: Any, pagename: Any, templatename: Any, context: Any, doctree: Any):
- def get_class_toc() -> Any:
- soup = BeautifulSoup(context["body"], "html.parser")
-
- matches = soup.find_all('dl')
- if matches is None or len(matches) == 0:
- return ""
- items = []
- deeper_depth = matches[0].find('dt').get('id').count(".")
- for match in matches:
- match_dt = match.find('dt')
- if match_dt is not None and match_dt.get('id') is not None:
- current_title = match_dt.get('id')
- current_depth = match_dt.get('id').count(".")
- current_link = match.find(class_="headerlink")
- if current_link is not None:
- if deeper_depth > current_depth:
- deeper_depth = current_depth
- if deeper_depth == current_depth:
- items.append({
- "title": current_title.split('.')[-1],
- "link": current_link["href"],
- "attributes_and_methods": []
- })
- if deeper_depth < current_depth:
- items[-1]["attributes_and_methods"].append(
- {
- "title": current_title.split('.')[-1],
- "link": current_link["href"],
- }
- )
- return items
- context["get_class_toc"] = get_class_toc
-
- app.connect("html-page-context", add_class_toctree_function)
-
-
-def setup(app: Any):
- for setup_function in [
- _setup_navbar_side_toctree,
- ]:
- setup_function(app)
+
+intersphinx_mapping = {
+ 'python': ('https://docs.python.org/3', None),
+ 'numpy': ('https://numpy.org/doc/stable/', None),
+ 'pygfx': ('https://pygfx.readthedocs.io/en/latest', None)
+}
+
+
+html_theme_options = {
+ "show_toc_level": 3,
+ "github_url": "https://github.com/kushalkolar/fastplotlib",
+ "navbar_end": ["theme-switcher", "navbar-icon-links"],
+ "secondary_sidebar_items": ["page-toc"]
+}
+
+if os.getenv("BUILD_DASH_DOCSET"):
+ html_theme_options |= {
+ 'secondary_sidebar_items': [],
+ "show_prev_next": False,
+ "collapse_navigation": True,
+ }
+
+# Custom sidebar templates, maps document names to template names.
+if os.getenv("BUILD_DASH_DOCSET"): # used for building dash docsets
+ html_sidebars = {
+ "**": []
+ }
+else:
+ html_sidebars = {
+ "**": ["sidebar-nav-bs.html"],
+ 'index': [] # don't show sidebar on main landing page
+ }
diff --git a/docs/source/index.rst b/docs/source/index.rst
index 9a0723af7..0f509f8a5 100644
--- a/docs/source/index.rst
+++ b/docs/source/index.rst
@@ -13,7 +13,7 @@ Welcome to fastplotlib's documentation!
Plot
Subplot
Gridplot
- Graphics
+ Graphics
Graphic Features
Selectors
Widgets
diff --git a/fastplotlib/graphics/features/_colors.py b/fastplotlib/graphics/features/_colors.py
index d607d6397..a2bd7f6ea 100644
--- a/fastplotlib/graphics/features/_colors.py
+++ b/fastplotlib/graphics/features/_colors.py
@@ -20,8 +20,8 @@ class ColorFeature(GraphicFeatureIndexable):
"world_object" pygfx.WorldObject world object
==================== =============================== =========================================================================
-
"""
+
@property
def buffer(self):
return self._parent.world_object.geometry.colors
diff --git a/fastplotlib/graphics/features/_present.py b/fastplotlib/graphics/features/_present.py
index 820c1d123..b13b82d9c 100644
--- a/fastplotlib/graphics/features/_present.py
+++ b/fastplotlib/graphics/features/_present.py
@@ -17,7 +17,8 @@ class PresentFeature(GraphicFeature):
"new_data" ``bool`` new data, ``True`` or ``False``
"collection-index" int the index of the graphic within the collection that triggered the event
"world_object" pygfx.WorldObject world object
- ==================== ======================== ========================================================================
+ ==================== ======================== =========================================================================
+
"""
def __init__(self, parent, present: bool = True, collection_index: int = False):
self._scene = None
diff --git a/fastplotlib/graphics/features/_thickness.py b/fastplotlib/graphics/features/_thickness.py
index ce9c3cbc4..ae78c6ac8 100644
--- a/fastplotlib/graphics/features/_thickness.py
+++ b/fastplotlib/graphics/features/_thickness.py
@@ -7,14 +7,14 @@ class ThicknessFeature(GraphicFeature):
**event pick info:**
- ===================== ======================== =========================================================================
+ ==================== ======================== =========================================================================
key type description
==================== ======================== =========================================================================
"index" ``None`` not used
"new_data" ``float`` new thickness value
"collection-index" int the index of the graphic within the collection that triggered the event
"world_object" pygfx.WorldObject world object
- ==================== ======================== ========================================================================
+ ==================== ======================== =========================================================================
"""
def __init__(self, parent, thickness: float):
self._scene = None
diff --git a/fastplotlib/graphics/selectors/_linear.py b/fastplotlib/graphics/selectors/_linear.py
index 8899f03b1..71a5bf77f 100644
--- a/fastplotlib/graphics/selectors/_linear.py
+++ b/fastplotlib/graphics/selectors/_linear.py
@@ -137,7 +137,7 @@ def __init__(
Features
--------
- selection: :class:`LinearSelectionFeature`
+ selection: :class:`.LinearSelectionFeature`
``selection()`` returns the current slider position in world coordinates
use ``selection.add_event_handler()`` to add callback functions that are
called when the LinearSelector selection changes. See feaure class for event pick_info table