-
Notifications
You must be signed in to change notification settings - Fork 99
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
PR3: Display changelog/announcement page in SLEAP GUI #1556
base: shrivaths/changelog-announcement-2
Are you sure you want to change the base?
Changes from 9 commits
b7f7748
25eda37
8706ccb
fdf5547
d584de2
f809bda
cce7183
2c68518
ca25347
27f0d28
168056e
5e2fb37
944428f
793faa6
561a109
465eb3f
f7c510d
d071ac8
58ffca8
02aa249
a724ec2
9827510
cd98d7c
a9673d8
b7e475d
2cc02d7
709de70
18974db
cada26c
3c35dda
713c068
86d1a44
1737561
7859b93
ec2b2d7
59f2438
bd8d004
ea2111d
7ff49f0
5391131
6ddb158
895a074
af67d55
b5d5139
150453d
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
[ | ||
{ | ||
"title": "SLEAP v1.3.2", | ||
"date": "10/30/2023", | ||
"content": "\n\n\nSLEAP 1.3.2 adds some nice usability features thanks to both the community ideas and new contributors! See [1.3.0](https://github.com/talmolab/sleap/releases/tag/v1.3.0) and [1.3.1](https://github.com/talmolab/sleap/releases/tag/v1.3.1) for previous notable changes. As a reminder:\n\n> The 1.3.1 dependency update requires [Mamba](https://mamba.readthedocs.io/en/latest/index.html) for faster dependency resolution. If you already have anaconda installed, then you _can_ set the solver to libmamba in the base environment:\n>```\n>conda update -n base conda\n>conda install -n base conda-libmamba-solver\n>conda config --set solver libmamba\n>```\n>Any subsequent `mamba` commands in the docs will need to be replaced with `conda` if you choose to use your existing Anaconda installation. \n>\n>Otherwise, follow the [recommended installation instruction for Mamba](https://mamba.readthedocs.io/en/latest/installation.html).\n\n### Quick install\n**`mamba` (Windows/Linux/GPU)**:\n```\nmamba create -y -n sleap -c conda-forge -c nvidia -c sleap -c anaconda sleap=1.3.2\n```\n\n**`mamba` (Mac)**:\n```\nmamba create -y -n sleap -c conda-forge -c anaconda -c sleap sleap=1.3.2\n```\n\n**`pip` (any OS except Apple Silicon)**:\n```\npip install sleap[pypi]==1.3.2\n```\n\n### Highlights\n* Limit max tracks via track-local queues by @shrivaths16 and @talmo in https://github.com/talmolab/sleap/pull/1447\n* Add option to remove videos in batch by @gitttt-1234 in https://github.com/talmolab/sleap/pull/1382 and https://github.com/talmolab/sleap/pull/1406\n* Add shortcut to export analysis for current video by @KevinZ0217 in https://github.com/talmolab/sleap/pull/1414 and https://github.com/talmolab/sleap/pull/1444\n* Add video path and frame indices to metrics by @roomrys in https://github.com/talmolab/sleap/pull/1396\n* Add a button for copying model config to clipboard by @KevinZ0217 in https://github.com/talmolab/sleap/pull/1433\n* Add Option to Export CSV by @gitttt-1234 in https://github.com/talmolab/sleap/pull/1438\n\n### Full Changelog\n\n#### Enhancements\n* Add option to remove videos in batch by @gitttt-1234 in https://github.com/talmolab/sleap/pull/1382 and https://github.com/talmolab/sleap/pull/1406\n* Add `Track` when add `Instance` by @roomrys in https://github.com/talmolab/sleap/pull/1408\n* Add `Video` to cache when adding `Track` by @roomrys in https://github.com/talmolab/sleap/pull/1407\n* Add shortcut to export analysis for current video by @KevinZ0217 in https://github.com/talmolab/sleap/pull/1414 and https://github.com/talmolab/sleap/pull/1444\n* Add video path and frame indices to metrics by @roomrys in https://github.com/talmolab/sleap/pull/1396\n* Improve error message for detecting video backend by @roomrys in https://github.com/talmolab/sleap/pull/1441\n* Add a button for copying model config to clipboard by @KevinZ0217 in https://github.com/talmolab/sleap/pull/1433\n* Add Option to Export CSV by @gitttt-1234 in https://github.com/talmolab/sleap/pull/1438\n* Limit max tracks via track-local queues by @shrivaths16 and @talmo in https://github.com/talmolab/sleap/pull/1447\n\n#### Fixes\n* Minor fix in computation of OKS by @shrivaths16 in https://github.com/talmolab/sleap/pull/1383 and https://github.com/talmolab/sleap/pull/1399\n* Fix `Filedialog` to work across (mac)OS by @roomrys in https://github.com/talmolab/sleap/pull/1393\n* Fix panning bounding box by @gitttt-1234 in https://github.com/talmolab/sleap/pull/1398\n* Fix skeleton templates by @roomrys in https://github.com/talmolab/sleap/pull/1404\n* Fix labels export for json by @roomrys in https://github.com/talmolab/sleap/pull/1410\n* Correct GUI state emulation by @roomrys in https://github.com/talmolab/sleap/pull/1422\n* Update status message on status bar by @shrivaths16 in https://github.com/talmolab/sleap/pull/1411\n* Fix error thrown when last video is deleted by @shrivaths16 in https://github.com/talmolab/sleap/pull/1421\n* Add model folder to the unzip path by @roomrys in https://github.com/talmolab/sleap/pull/1445\n* Fix drag and drop by @talmo in https://github.com/talmolab/sleap/pull/1449\n\n#### Dependencies\n* Pin micromamba version by @roomrys in https://github.com/talmolab/sleap/pull/1376\n* Add pip extras by @roomrys in https://github.com/talmolab/sleap/pull/1481\n\n#### New Contributors\n* @shrivaths16 made their first contribution in https://github.com/talmolab/sleap/pull/1383\n* @gitttt-1234 made their first contribution in https://github.com/talmolab/sleap/pull/1382\n* @KevinZ0217 made their first contribution in https://github.com/talmolab/sleap/pull/1414\n\n**Full Changelog**: https://github.com/talmolab/sleap/compare/v1.3.1...v1.3.2\n" | ||
} | ||
] |
Original file line number | Diff line number | Diff line change | ||||||
---|---|---|---|---|---|---|---|---|
|
@@ -53,18 +53,23 @@ | |||||||
from logging import getLogger | ||||||||
from pathlib import Path | ||||||||
from typing import Callable, List, Optional, Tuple | ||||||||
from datetime import date | ||||||||
|
||||||||
from qtpy import QtCore, QtGui | ||||||||
from qtpy.QtCore import QEvent, Qt | ||||||||
from qtpy.QtCore import QEvent, Qt, QUrl | ||||||||
from qtpy.QtWidgets import QApplication, QMainWindow, QMessageBox | ||||||||
|
||||||||
from qtpy.QtWebChannel import QWebChannel | ||||||||
from qtpy.QtWebEngineWidgets import QWebEngineView | ||||||||
|
||||||||
import sleap | ||||||||
from sleap.gui.color import ColorManager | ||||||||
from sleap.gui.commands import CommandContext, UpdateTopic | ||||||||
from sleap.gui.dialogs.filedialog import FileDialog | ||||||||
from sleap.gui.dialogs.formbuilder import FormBuilderModalDialog | ||||||||
from sleap.gui.dialogs.metrics import MetricsTableDialog | ||||||||
from sleap.gui.dialogs.shortcuts import ShortcutDialog | ||||||||
from sleap.gui.dialogs.bulletin import BulletinDialog, BulletinWorker | ||||||||
from sleap.gui.overlays.instance import InstanceOverlay | ||||||||
from sleap.gui.overlays.tracks import TrackListOverlay, TrackTrailOverlay | ||||||||
from sleap.gui.shortcuts import Shortcuts | ||||||||
|
@@ -158,8 +163,21 @@ def __init__( | |||||||
self.state["share usage data"] = prefs["share usage data"] | ||||||||
self.state["skeleton_preview_image"] = None | ||||||||
self.state["skeleton_description"] = "No skeleton loaded yet" | ||||||||
self.state["announcement last seen date"] = prefs["announcement last seen date"] | ||||||||
self.state["announcement"] = prefs["announcement"] | ||||||||
|
||||||||
if prefs["announcement last seen date"]: | ||||||||
self.state["announcement last seen date"] = prefs[ | ||||||||
"announcement last seen date" | ||||||||
] | ||||||||
else: | ||||||||
self.state["announcement last seen date"] = date.today().strftime( | ||||||||
"%m/%d/%Y" | ||||||||
) | ||||||||
|
||||||||
if prefs["announcement"]: | ||||||||
self.state["announcement"] = prefs["announcement"] | ||||||||
else: | ||||||||
self.state["announcement"] = "No data to display" | ||||||||
|
||||||||
if no_usage_data: | ||||||||
self.state["share usage data"] = False | ||||||||
self.state["clipboard_track"] = None | ||||||||
|
@@ -170,7 +188,9 @@ def __init__( | |||||||
self.state.connect("show non-visible nodes", self.plotFrame) | ||||||||
|
||||||||
self.release_checker = ReleaseChecker() | ||||||||
|
||||||||
self.announcement_checker = AnnouncementChecker(state=self.state) | ||||||||
self.new_announcement_available = self.announcement_checker.new_announcement | ||||||||
|
||||||||
if self.state["share usage data"]: | ||||||||
ping_analytics() | ||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The - ping_analytics()
+ if self.state["share usage data"]:
+ ping_analytics() Committable suggestion
Suggested change
|
||||||||
|
@@ -191,6 +211,25 @@ def __init__( | |||||||
else: | ||||||||
self.state["project_loaded"] = False | ||||||||
|
||||||||
# Display announcement bulletin popup | ||||||||
if self.new_announcement_available: | ||||||||
self.bulletin_dialog() | ||||||||
|
||||||||
def bulletin_dialog(self): | ||||||||
"""Displays bulletin dialog is new announcement is available.""" | ||||||||
announcement = self.announcement_checker.get_latest_announcement() | ||||||||
|
||||||||
if announcement: | ||||||||
title, date, content = announcement | ||||||||
bulletin_markdown = "\n".join(content.split("\n")) | ||||||||
|
||||||||
popup_dialog = BulletinDialog(self) | ||||||||
popup_dialog.show() | ||||||||
|
||||||||
popup_worker = BulletinWorker(bulletin_markdown) | ||||||||
popup_worker.text_updated.connect(popup_dialog.updateText) | ||||||||
popup_worker.start() | ||||||||
|
||||||||
def setWindowTitle(self, value): | ||||||||
"""Sets window title (if value is not None).""" | ||||||||
if value is not None: | ||||||||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,39 @@ | ||
""" | ||
GUI for displaying the new announcement. | ||
""" | ||
|
||
from qtpy.QtWidgets import ( | ||
QApplication, | ||
QDialog, | ||
QVBoxLayout, | ||
QMainWindow, | ||
QHBoxLayout, | ||
QWidget, | ||
QLabel, | ||
) | ||
from qtpy.QtCore import QObject, Signal, Slot, QThread, Property | ||
|
||
|
||
class BulletinWorker(QThread): | ||
text_updated = Signal(str) | ||
|
||
def __init__(self, content, parent=None): | ||
super(BulletinWorker, self).__init__(parent) | ||
self.content = content | ||
|
||
def run(self): | ||
self.text_updated.emit(self.content) | ||
|
||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The |
||
|
||
class BulletinDialog(QDialog): | ||
def __init__(self, parent=None): | ||
super(BulletinDialog, self).__init__(parent) | ||
|
||
self.label = QLabel() | ||
layout = QVBoxLayout() | ||
layout.addWidget(self.label) | ||
self.setLayout(layout) | ||
|
||
@Slot(str) | ||
def updateText(self, text): | ||
self.label.setText(text) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The default value for
announcement
should beNone
or an empty string to clearly indicate the absence of an announcement.Committable suggestion