-
Notifications
You must be signed in to change notification settings - Fork 21
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #381 from astrofrog/split-out-qt
Refactor viewer classes to split out Qt from non-Qt part, and define Jupyter viewers
- Loading branch information
Showing
74 changed files
with
1,307 additions
and
414 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,10 +1,21 @@ | ||
import importlib.metadata | ||
|
||
__version__ = importlib.metadata.version('glue-vispy-viewers') | ||
__version__ = importlib.metadata.version("glue-vispy-viewers") | ||
|
||
try: | ||
import OpenGL # noqa | ||
except ImportError: | ||
raise ImportError("The PyOpenGL package is required for this plugin") | ||
else: | ||
del OpenGL | ||
|
||
# Ensure we can read old session files prior to the Qt/Jupyter split | ||
from glue.core.state import PATH_PATCHES | ||
|
||
PATH_PATCHES[ | ||
"glue_vispy_viewers.scatter.scatter_viewer.VispyScatterViewer" | ||
] = "glue_vispy_viewers.scatter.qt.scatter_viewer.VispyScatterViewer" | ||
PATH_PATCHES[ | ||
"glue_vispy_viewers.volume.volume_viewer.VispyVolumeViewer" | ||
] = "glue_vispy_viewers.volume.qt.volume_viewer.VispyVolumeViewer" | ||
del PATH_PATCHES |
File renamed without changes.
File renamed without changes.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,16 @@ | ||
import weakref | ||
from glue_jupyter.common.toolbar_vuetify import BasicJupyterToolbar | ||
from ..toolbar import VispyViewerToolbarMixin | ||
|
||
__all__ = ['VispyJupyterToolbar'] | ||
|
||
|
||
class VispyJupyterToolbar(VispyViewerToolbarMixin, BasicJupyterToolbar): | ||
|
||
def __init__(self, viewer=None, **kwargs): | ||
BasicJupyterToolbar.__init__(self, viewer, **kwargs) | ||
self._viewer = weakref.ref(viewer) | ||
|
||
@property | ||
def viewer(self): | ||
return self._viewer() |
Empty file.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,52 @@ | ||
from glue_qt.viewers.common.data_viewer import DataViewer | ||
|
||
from qtpy import QtWidgets | ||
|
||
from .viewer_options import VispyOptionsWidget | ||
|
||
from ..vispy_data_viewer import BaseVispyViewerMixin | ||
|
||
from .toolbar import VispyQtToolbar | ||
|
||
from . import tools # noqa | ||
|
||
BROKEN_PYQT5_MESSAGE = ("The version of PyQt5 you are using does not appear to " | ||
"support OpenGL. See <a href='http://docs.glueviz.org/en" | ||
"/stable/known_issues.html#d-viewers-not-working-on-linux" | ||
"-with-pyqt5'>here</a> for more information about fixing " | ||
"this issue.") | ||
|
||
|
||
class BaseVispyViewer(BaseVispyViewerMixin, DataViewer): | ||
|
||
_options_cls = VispyOptionsWidget | ||
subtools = {'save': ['vispy:save']} | ||
|
||
_toolbar_cls = VispyQtToolbar | ||
|
||
def __init__(self, session, state=None, parent=None): | ||
super().__init__(session, state=state, parent=parent) | ||
self.setup_widget_and_callbacks() | ||
self.setCentralWidget(self._vispy_widget.canvas.native) | ||
|
||
def paintEvent(self, *args, **kwargs): | ||
super().paintEvent(*args, **kwargs) | ||
if self._opengl_ok is None: | ||
self._opengl_ok = self._vispy_widget.canvas.native.context() is not None | ||
if not self._opengl_ok: | ||
QtWidgets.QMessageBox.critical(self, "Error", BROKEN_PYQT5_MESSAGE) | ||
self.close(warn=False) | ||
self._vispy_widget.canvas.native.close() | ||
|
||
def show_status(self, text): | ||
statusbar = self.statusBar() | ||
statusbar.showMessage(text) | ||
|
||
|
||
# If imageio is available, we can add the record icon | ||
try: | ||
import imageio # noqa | ||
except ImportError: | ||
pass | ||
else: | ||
BaseVispyViewer.tools.insert(1, 'vispy:record') |
Empty file.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,17 @@ | ||
import weakref | ||
|
||
from glue_qt.viewers.common.toolbar import BasicToolbar | ||
from ..toolbar import VispyViewerToolbarMixin | ||
|
||
__all__ = ['VispyQtToolbar'] | ||
|
||
|
||
class VispyQtToolbar(VispyViewerToolbarMixin, BasicToolbar): | ||
|
||
def __init__(self, viewer=None, **kwargs): | ||
BasicToolbar.__init__(self, viewer, **kwargs) | ||
self._viewer = weakref.ref(viewer) | ||
|
||
@property | ||
def viewer(self): | ||
return self._viewer() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,83 @@ | ||
import os | ||
|
||
from qtpy import QtGui, compat | ||
|
||
from glue.viewers.common.tool import Tool, CheckableTool | ||
|
||
from glue.config import viewer_tool | ||
|
||
from vispy import app, io | ||
|
||
RECORD_START_ICON = os.path.join(os.path.dirname(__file__), 'glue_record_start.png') | ||
RECORD_STOP_ICON = os.path.join(os.path.dirname(__file__), 'glue_record_stop.png') | ||
|
||
|
||
@viewer_tool | ||
class SaveTool(Tool): | ||
|
||
icon = 'glue_filesave' | ||
tool_id = 'vispy:save' | ||
action_text = 'Save the figure to a file' | ||
tool_tip = 'Save the figure to a file' | ||
|
||
def activate(self): | ||
outfile, file_filter = compat.getsavefilename(caption='Save File', | ||
filters='PNG Files (*.png);;' | ||
'JPEG Files (*.jpeg);;' | ||
'TIFF Files (*.tiff);;', | ||
selectedfilter='PNG Files (*.png);;') | ||
|
||
# This indicates that the user cancelled | ||
if not outfile: | ||
return | ||
img = self.viewer._vispy_widget.canvas.render() | ||
try: | ||
file_filter = str(file_filter).split()[0] | ||
io.imsave(outfile, img, format=file_filter) | ||
except ImportError: | ||
# TODO: give out a window to notify that only .png file format is supported | ||
if '.' not in outfile: | ||
outfile += '.png' | ||
io.write_png(outfile, img) | ||
|
||
|
||
@viewer_tool | ||
class RecordTool(CheckableTool): | ||
|
||
icon = RECORD_START_ICON | ||
tool_id = 'vispy:record' | ||
action_text = 'Record an animation' | ||
tool_tip = 'Start/Stop the recording' | ||
|
||
def __init__(self, viewer): | ||
super(RecordTool, self).__init__(viewer=viewer) | ||
self.record_timer = app.Timer(connect=self.record) | ||
self.writer = None | ||
self.next_action = 'start' | ||
|
||
def activate(self): | ||
|
||
# pop up a window for file saving | ||
outfile, file_filter = compat.getsavefilename(caption='Save Animation', | ||
filters='GIF Files (*.gif);;') | ||
|
||
# if outfile is not set, the user cancelled | ||
if outfile: | ||
import imageio | ||
self.set_icon(RECORD_STOP_ICON) | ||
self.writer = imageio.get_writer(outfile) | ||
self.record_timer.start(0.1) | ||
|
||
def deactivate(self): | ||
|
||
self.record_timer.stop() | ||
if self.writer is not None: | ||
self.writer.close() | ||
self.set_icon(RECORD_START_ICON) | ||
|
||
def set_icon(self, icon): | ||
self.viewer.toolbar.actions[self.tool_id].setIcon(QtGui.QIcon(icon)) | ||
|
||
def record(self, event): | ||
im = self.viewer._vispy_widget.canvas.render() | ||
self.writer.append_data(im) |
File renamed without changes.
File renamed without changes.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.