diff --git a/sandbox/qt-plotly/myPlot.py b/sandbox/qt-plotly/myPlot.py index 3e7c8af..046b98f 100644 --- a/sandbox/qt-plotly/myPlot.py +++ b/sandbox/qt-plotly/myPlot.py @@ -7,6 +7,12 @@ from IPython.display import display +""" +Requires + pip install PyQtWebEngine + pip install ipywidgets +""" + def plot(): # fig = go.Figure(data=[go.Scattergl(x=[1, 2, 3], y=[4, 5, 6])]) x=[1, 2, 3] @@ -20,7 +26,7 @@ def plot(): out = Output() -class Backend(QtCore.QObject): +class myBackend(QtCore.QObject): pointChanged = QtCore.Signal(float, float) # @QtCore.Signal(float,float) @@ -34,7 +40,7 @@ def __init__(self, parent=None): # self.button = QtWidgets.QPushButton('Plot', self) # self.browser = QtWebEngineWidgets.QWebEngineView(self) - self.browser = QtWebEngineWidgets.QWebEngineView() + self.browser: QtWebEngineWidgets.QWebEngineView = QtWebEngineWidgets.QWebEngineView() # self.vlayout = QtWidgets.QVBoxLayout(self) # self.vlayout.addWidget(self.button, alignment=QtCore.Qt.AlignHCenter) @@ -55,10 +61,12 @@ def onPointChanged(self, x, y): def plot2(self): # map_view = QtWebEngineWidgets.QWebEngineView() - backend = Backend(self) + backend = myBackend(self) backend.pointChanged.connect(self.onPointChanged) + channel = QtWebChannel.QWebChannel(self) channel.registerObject('backend', backend) + self.browser.page().setWebChannel(channel) # file = QtCore.QDir.current().absoluteFilePath("index.html") @@ -66,9 +74,10 @@ def plot2(self): x=[1, 2, 3] y=[4, 5, 6] - self.fig = go.FigureWidget([go.Scatter(x=x, y=y, mode='markers')]) + self.fig : go.FigureWidget = go.FigureWidget([go.Scatter(x=x, y=y, mode='markers')]) - scatter = self.fig.data[0] + # The data property is a tuple of the figure's trace objects + scatter = self.fig.data[0] # FigureWidget scatter.on_click(self.update_point) self.browser.setHtml(self.fig.to_html(include_plotlyjs='cdn')) @@ -81,6 +90,7 @@ def plot2(self): @out.capture(clear_output=True) def update_point(self, trace, points, selector): + sys.exit(1) print('!!!!') def show_graph(self): diff --git a/sandbox/qt-plotly/utils.js b/sandbox/qt-plotly/utils.js index f2a31d9..01bc505 100644 --- a/sandbox/qt-plotly/utils.js +++ b/sandbox/qt-plotly/utils.js @@ -12,6 +12,7 @@ window.onload = function() { var mapDiv = 'map' + suffix; var map = API.map(mapDiv, { center: [51.505, -0.09], + // center: [38.575764, -121.478851], zoom: 4, dragging: true, scrollWheelZoom: true, @@ -30,12 +31,14 @@ window.onload = function() { "name": "Grand Canyon USGS", "format": "png", "bounds": [15.976953506469728, 45.813157465613884], + // "bounds": [38.575764, -121.478851], "minzoom": 10, "version": "1.0.0", "maxzoom": 16, "center": [15.976953506469728, 45.813157465613884, 16 ], + // "center": [38.575764, -121.478851], "type": "overlay", "description": "", "basename": "grandcanyon", diff --git a/src/pymapmanager/interface2/mainMenus.py b/src/pymapmanager/interface2/mainMenus.py index cdc2e26..90f978b 100644 --- a/src/pymapmanager/interface2/mainMenus.py +++ b/src/pymapmanager/interface2/mainMenus.py @@ -425,6 +425,8 @@ def _refreshFileMenu(self): frontWindow = self.getApp().getFrontWindow() + logger.warning(f'frontWindow is:{frontWindow}') + if isinstance(frontWindow, (mmWidget2, mapWidget)): if frontWindow.getPath().endswith('.mmap.zip'): enableSave = False diff --git a/src/pymapmanager/interface2/openFirstWindow.py b/src/pymapmanager/interface2/openFirstWindow.py index 2b2a076..8137d5e 100644 --- a/src/pymapmanager/interface2/openFirstWindow.py +++ b/src/pymapmanager/interface2/openFirstWindow.py @@ -13,11 +13,12 @@ from qtpy import QtCore, QtWidgets, QtGui import pymapmanager -from pymapmanager.interface2.mainWindow import MainWindow +# from pymapmanager.interface2.mainWindow import MainWindow from pymapmanager._logger import logger -class OpenFirstWindow(MainWindow): +# class OpenFirstWindow(MainWindow): +class OpenFirstWindow(QtWidgets.QMainWindow): """A file/folder loading window. Open this at app start and close once a file/folder is loaded @@ -29,6 +30,9 @@ def __init__(self, self._app : PyMapManagerApp = pyMapManagerApp + self.statusBar = QtWidgets.QStatusBar() + self.setStatusBar(self.statusBar) + # self.recentStackList = self.getApp().getConfigDict().getRecentStacks() # self.recentMapList = self.getApp().getConfigDict().getRecentMaps() @@ -53,8 +57,15 @@ def __init__(self, self.setWindowTitle('MapManager Open Files and Folders') - # def getApp(self): - # return self._app + def setStatus(self, txt : str): + self.statusBar.showMessage(txt) + + def getApp(self) -> "pymapmanager.interface2.PyMapManagerApp": + """Get running application. + """ + # from PyQt5.QtWidgets import QApplication + # return QApplication.instance() + return self._app # def _makeRecentTable(self, pathList : List[str], headerStr = ''): def _makeRecentTable(self, pathDictList : List[dict], headerStr = '') -> QtWidgets.QTableWidget: diff --git a/src/pymapmanager/interface2/runInterfaceBob.py b/src/pymapmanager/interface2/runInterfaceBob.py index 97b5397..84413e9 100644 --- a/src/pymapmanager/interface2/runInterfaceBob.py +++ b/src/pymapmanager/interface2/runInterfaceBob.py @@ -27,17 +27,27 @@ def run(): # path = '/Users/cudmore/Desktop/multi_timepoint_map_seg_spine_connected.mmap' # path = mapmanagercore.data.getMultiTimepointMap() - path = '/Users/cudmore/Desktop/olsen_example.mmap' + # path = '/Users/cudmore/Desktop/olsen_example.mmap' + path = '/Users/cudmore/Desktop/example_nd2.mmap' + path = '/Users/cudmore/Desktop/example_nd2.mmap.zip' + path = '/Users/cudmore/Sites/MapManagerCore-Data/data/Animal_145_Slice_1_Right.mmap.zip' + path = '/Users/cudmore/Desktop/Animal_145_Slice_1_Right.mmap.zip' + + from mapmanagercore.data import getNd2Channel_1, getSingleTimepointMap_nd2 + path = getNd2Channel_1() + path = getSingleTimepointMap_nd2() app = PyMapManagerApp(sys.argv) # mw will be map widget if path has multiple timepoints, otherwise mw is a stackwidget2 + + logger.info(f'loading stack widget from path:{path}') mw = app.loadStackWidget(path) # run a stack plugin # mw.runPlugin('Stack Contrast') # works - from pprint import pprint + # from pprint import pprint # logger.info('getTimeSeriesCore') # pprint(mw.getTimeSeriesCore().getMapImages().metadata(0).experimentMetadata.getValue('Species')) # pprint(mw.getTimeSeriesCore().getMapImages().metadata(0).experimentMetadata.asDict()) diff --git a/src/pymapmanager/timeseriesCore.py b/src/pymapmanager/timeseriesCore.py index 4fcdbc2..147406b 100644 --- a/src/pymapmanager/timeseriesCore.py +++ b/src/pymapmanager/timeseriesCore.py @@ -144,16 +144,16 @@ def __init__(self, path : str): self._isDirty : bool = False + # when user drags/drops a mmap zarr DirectoryStore folder + if path.endswith('/'): + path = path[:-1] + # TODO just use endswith(), splitext does not handle '.ome.zarr' _ext = os.path.splitext(path)[1] - # if path.endswith('.mmap') or path.endswith('.mmap/') or path.endswith('.mmap.zip'): if _ext in LOAD_SAVE_EXTENSIONS: self._load_zarr() elif path.endswith('.tif') or path.endswith('.nd2'): self._import_tiff() - # elif path.endswith('.ome.zarr'): - # elif path.endswith('.zarr') or path.endswith('.zarr/'): - # self._import_ome_zarr() else: # TODO properly handle this logger.error(f'did not load file extension: "{_ext}"')