Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit 7943697

Browse filesBrowse files
committed
make it work with imagewidget
1 parent 80a3fb2 commit 7943697
Copy full SHA for 7943697

File tree

Expand file treeCollapse file tree

4 files changed

+60
-75
lines changed
Filter options
Expand file treeCollapse file tree

4 files changed

+60
-75
lines changed

‎fastplotlib/layouts/_frame/_frame.py

Copy file name to clipboardExpand all lines: fastplotlib/layouts/_frame/_frame.py
+19-4Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
from ._toolbar import ToolBar
44

5+
from ...graphics import ImageGraphic
6+
57
from .._utils import CANVAS_OPTIONS_AVAILABLE
68

79

@@ -52,7 +54,7 @@ def __init__(self):
5254
def toolbar(self) -> ToolBar:
5355
return self._output.toolbar
5456

55-
def render(self):
57+
def _render_step(self):
5658
raise NotImplemented
5759

5860
def _autoscale_init(self, maintain_aspect: bool):
@@ -69,13 +71,18 @@ def _autoscale_init(self, maintain_aspect: bool):
6971
maintain_aspect = self.camera.maintain_aspect
7072
self.auto_scale(maintain_aspect=maintain_aspect, zoom=0.95)
7173

74+
def start_render(self):
75+
self.canvas.request_draw(self.render)
76+
self.canvas.set_logical_size(*self._starting_size)
77+
7278
def show(
7379
self,
7480
autoscale: bool = True,
7581
maintain_aspect: bool = None,
7682
toolbar: bool = True,
7783
sidecar: bool = False,
7884
sidecar_kwargs: dict = None,
85+
add_widgets: list = None,
7986
):
8087
"""
8188
Begins the rendering event loop and returns the canvas
@@ -104,14 +111,21 @@ def show(
104111
the canvas
105112
106113
"""
114+
115+
# show was already called, return existing output context
107116
if self._output is not None:
108117
return self._output
109118

119+
self.start_render()
120+
110121
if sidecar_kwargs is None:
111122
sidecar_kwargs = dict()
112123

113-
self.canvas.request_draw(self.render)
114-
self.canvas.set_logical_size(*self._starting_size)
124+
# flip y axis if ImageGraphics are present
125+
for g in self.graphics:
126+
if isinstance(g, ImageGraphic):
127+
self.camera.local.scale_y = -1
128+
break
115129

116130
if autoscale:
117131
self._autoscale_init(maintain_aspect)
@@ -126,7 +140,8 @@ def show(
126140
frame=self,
127141
make_toolbar=toolbar,
128142
use_sidecar=sidecar,
129-
sidecar_kwargs=sidecar_kwargs
143+
sidecar_kwargs=sidecar_kwargs,
144+
add_widgets=add_widgets,
130145
)
131146

132147
elif self.canvas.__class__.__name__ == "QWgpuCanvas":

‎fastplotlib/layouts/_frame/_ipywidget_toolbar.py

Copy file name to clipboardExpand all lines: fastplotlib/layouts/_frame/_ipywidget_toolbar.py
+7-5Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ def __init__(self, plot):
4848
tooltip="maintain aspect",
4949
)
5050
self._maintain_aspect_button.style.font_weight = "bold"
51+
5152
self._y_direction_button = Button(
5253
value=False,
5354
disabled=False,
@@ -102,8 +103,6 @@ def __init__(self, plot):
102103

103104
widgets.append(self._dropdown)
104105

105-
# self.widget = HBox(widgets)
106-
107106
self._panzoom_controller_button.observe(self.panzoom_handler, "value")
108107
self._auto_scale_button.on_click(self.auto_scale_handler)
109108
self._center_scene_button.on_click(self.center_scene_handler)
@@ -112,8 +111,14 @@ def __init__(self, plot):
112111
self._add_polygon_button.on_click(self.add_polygon)
113112
self._record_button.observe(self.record_plot, "value")
114113

114+
# set initial values for some buttons
115115
self._maintain_aspect_button.value = self.current_subplot.camera.maintain_aspect
116116

117+
if self.current_subplot.camera.local.scale_y == -1:
118+
self._y_direction_button.icon = "arrow-down"
119+
else:
120+
self._y_direction_button.icon = "arrow-up"
121+
117122
HBox.__init__(self, widgets)
118123

119124
def _get_subplot_dropdown_value(self) -> str:
@@ -167,6 +172,3 @@ def record_plot(self, obj):
167172
def add_polygon(self, obj):
168173
ps = PolygonSelector(edge_width=3, edge_color="magenta")
169174
self.current_subplot.add_graphic(ps, center=False)
170-
171-
def _repr_mimebundle(self, *args, **kwargs):
172-
super()._repr_mimebundle(*args, **kwargs)

‎fastplotlib/layouts/_frame/_jupyter_output.py

Copy file name to clipboardExpand all lines: fastplotlib/layouts/_frame/_jupyter_output.py
+19-7Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,40 +1,52 @@
1-
from ipywidgets import VBox
1+
from ipywidgets import VBox, Widget
22
from sidecar import Sidecar
33
from IPython.display import display
44

55
from ._ipywidget_toolbar import IpywidgetToolBar
66

77

8-
class JupyterOutput:
8+
class JupyterOutput(VBox):
99
def __init__(
1010
self,
1111
frame,
1212
make_toolbar,
1313
use_sidecar,
14-
sidecar_kwargs
14+
sidecar_kwargs,
15+
add_widgets,
1516
):
1617
self.frame = frame
1718
self.toolbar = None
1819
self.sidecar = None
1920

21+
if add_widgets is None:
22+
add_widgets = list()
23+
else:
24+
if False in [isinstance(w, Widget) for w in add_widgets]:
25+
raise TypeError(
26+
f"add_widgets must be list of ipywidgets, you have passed:\n{add_widgets}"
27+
)
28+
2029
self.use_sidecar = use_sidecar
2130

2231
if not make_toolbar:
23-
self.output = frame.canvas
32+
self.output = (frame.canvas,)
2433

2534
if make_toolbar:
2635
self.toolbar = IpywidgetToolBar(frame)
27-
self.output = VBox([frame.canvas, self.toolbar])
36+
self.output = (frame.canvas, self.toolbar, *add_widgets)
2837

2938
if use_sidecar:
3039
self.sidecar = Sidecar(**sidecar_kwargs)
3140

41+
super().__init__(self.output)
42+
3243
def _repr_mimebundle_(self, *args, **kwargs):
3344
if self.use_sidecar:
3445
with self.sidecar:
35-
return display(self.output)
46+
# TODO: prints all the children called, will figure out later
47+
return display(VBox(self.output))
3648
else:
37-
return self.output._repr_mimebundle_(*args, **kwargs)
49+
return super()._repr_mimebundle_(*args, **kwargs)
3850

3951
def close(self):
4052
self.frame.canvas.close()

‎fastplotlib/widgets/image.py

Copy file name to clipboardExpand all lines: fastplotlib/widgets/image.py
+15-59Lines changed: 15 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,10 @@
1414
Play,
1515
jslink,
1616
)
17-
from sidecar import Sidecar
18-
from IPython.display import display
1917

2018
from ..layouts import GridPlot
2119
from ..graphics import ImageGraphic
22-
from ..utils import quick_min_max, calculate_gridshape
20+
from ..utils import calculate_gridshape
2321
from .histogram_lut import HistogramLUT
2422

2523

@@ -879,70 +877,28 @@ def set_data(
879877
# if reset_vmin_vmax:
880878
# self.reset_vmin_vmax()
881879

882-
def show(self, toolbar: bool = True, sidecar: bool = True, sidecar_kwargs: dict = None):
880+
def show(self, toolbar: bool = True, sidecar: bool = False, sidecar_kwargs: dict = None):
883881
"""
884882
Show the widget
885883
886884
Returns
887885
-------
888-
VBox
889-
``ipywidgets.VBox`` stacking the plotter and sliders in a vertical layout
886+
OutputContext
890887
"""
891888

892-
# don't need to check for jupyter since ImageWidget is only supported within jupyter anyways
893-
if not toolbar:
894-
return VBox([self.gridplot.show(toolbar=False), self._vbox_sliders])
895-
896-
if self.toolbar is None:
897-
self.toolbar = ImageWidgetToolbar(self)
898-
899-
if not sidecar:
900-
return VBox(
901-
[
902-
self.gridplot.show(toolbar=True, sidecar=False, sidecar_kwargs=None),
903-
self.toolbar.widget,
904-
self._vbox_sliders,
905-
]
906-
)
907-
908-
if self.plot_open:
909-
self.sidecar = None
910-
911-
if self.sidecar is None:
912-
if sidecar_kwargs is not None:
913-
self.sidecar = Sidecar(**sidecar_kwargs)
914-
self.plot_open = True
915-
else:
916-
self.sidecar = Sidecar()
917-
self.plot_open = True
918-
919-
with self.sidecar:
920-
return display(VBox(
921-
[
922-
self.gridplot.show(toolbar=True, sidecar=False, sidecar_kwargs=None),
923-
self.toolbar.widget,
924-
self._vbox_sliders
925-
]
926-
)
927-
)
889+
return self.gridplot.show(
890+
toolbar=toolbar,
891+
sidecar=sidecar,
892+
sidecar_kwargs=sidecar_kwargs,
893+
add_widgets=[ImageWidgetToolbar(self), *list(self.sliders.values())]
894+
)
928895

929896
def close(self):
930897
"""Close Widget"""
931-
self.gridplot.canvas.close()
932-
933-
self._vbox_sliders.close()
934-
935-
if self.toolbar is not None:
936-
self.toolbar.widget.close()
937-
self.gridplot.toolbar.widget.close()
938-
939-
if self.sidecar is not None:
940-
self.sidecar.close()
941-
942-
self.plot_open = False
898+
self.gridplot.close()
943899

944900

945-
class ImageWidgetToolbar:
901+
class ImageWidgetToolbar(HBox):
946902
def __init__(self, iw: ImageWidget):
947903
"""
948904
Basic toolbar for a ImageWidget instance.
@@ -964,7 +920,7 @@ def __init__(self, iw: ImageWidget):
964920

965921
# only for xy data, no time point slider needed
966922
if self.iw.ndim == 2:
967-
self.widget = HBox([self.reset_vminvmax_button])
923+
widgets = [self.reset_vminvmax_button]
968924
# for txy, tzxy, etc. data
969925
else:
970926
self.step_size_setter = BoundedIntText(
@@ -995,9 +951,7 @@ def __init__(self, iw: ImageWidget):
995951
description="play/pause",
996952
disabled=False,
997953
)
998-
self.widget = HBox(
999-
[self.reset_vminvmax_button, self.play_button, self.step_size_setter, self.speed_text]
1000-
)
954+
widgets = [self.reset_vminvmax_button, self.play_button, self.step_size_setter, self.speed_text]
1001955

1002956
self.play_button.interval = 10
1003957

@@ -1008,6 +962,8 @@ def __init__(self, iw: ImageWidget):
1008962

1009963
self.reset_vminvmax_button.on_click(self._reset_vminvmax)
1010964

965+
HBox.__init__(self, widgets)
966+
1011967
def _reset_vminvmax(self, obj):
1012968
self.iw.reset_vmin_vmax()
1013969

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.