Skip to content
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

(4a -> 4) Add menu to assign an Instance to an InstanceGroup #1747

Merged
Merged
Show file tree
Hide file tree
Changes from 17 commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
1efb2ca
added dropdown.py file for setting instance to instance group
ramizhajj1 Apr 12, 2024
49b613d
Implement session menu and instance group functionality
ramizhajj1 Apr 18, 2024
8a0312f
Merge branch with liezl/add-gui-elements-for-sessions to add Instance…
ramizhajj1 Apr 19, 2024
2c0ed1e
Update sleap/gui/app.py
ramizhajj1 Apr 24, 2024
3396e43
Update sleap/gui/app.py
ramizhajj1 Apr 24, 2024
3ce4a58
Update sleap/gui/app.py
ramizhajj1 Apr 24, 2024
29bfa1b
Update sleap/gui/app.py
ramizhajj1 Apr 24, 2024
5200479
Update sleap/gui/app.py
ramizhajj1 Apr 24, 2024
012dc9a
Update sleap/gui/app.py
ramizhajj1 Apr 24, 2024
1a52cd0
Update sleap/gui/app.py
ramizhajj1 Apr 24, 2024
5a728ce
Update sleap/gui/app.py
ramizhajj1 Apr 24, 2024
f3fd4d8
Update sleap/gui/app.py
ramizhajj1 Apr 24, 2024
d88b821
Modified errors in code based on suggestions
ramizhajj1 Apr 24, 2024
24396a7
Merge branch 'liezl/add-gui-elements-for-sessions' into ramiz/add-gui…
ramizhajj1 Apr 24, 2024
f481cf1
Merge branch 'ramiz/add-gui-set-instance-group' of https://github.com…
ramizhajj1 Apr 24, 2024
2cba392
Merge branch 'ramiz/add-gui-set-instance-group' of https://github.com…
ramizhajj1 Apr 24, 2024
f862e70
Add instance group management to sessions menu and update related com…
ramizhajj1 Apr 24, 2024
ee0fc3c
Add Delete Instance Group
ramizhajj1 Apr 26, 2024
060ef5b
Merge branch 'liezl/add-gui-elements-for-sessions' into ramiz/add-gui…
roomrys Apr 26, 2024
2e1288a
Modify code
ramizhajj1 Apr 30, 2024
b203e65
Modify files
ramizhajj1 Apr 30, 2024
fbf2a63
Merge branch 'liezl/add-gui-elements-for-sessions' into ramiz/add-gui…
roomrys May 1, 2024
c2f2aae
FIx obvious errors (but no debug tests yet)
roomrys May 1, 2024
62769c0
Test `SetSelectedInstanceGroup` class
roomrys May 1, 2024
78b8c5e
Add fixes for `SetSelectedInstances` test
roomrys May 1, 2024
fdd7c65
Test AddInstanceGroup class
roomrys May 1, 2024
d39b9f2
Change AddInstanceGroup to pass tests
roomrys May 1, 2024
3859b79
Add test for DeleteInstanceGroup class
roomrys May 1, 2024
22e3bdb
Better the DeleteInstanceGroup error message
roomrys May 1, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
60 changes: 57 additions & 3 deletions sleap/gui/app.py
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,6 @@
from sleap.skeleton import Skeleton
from sleap.util import parse_uri_path


logger = getLogger(__name__)


Expand Down Expand Up @@ -810,9 +809,33 @@ def new_instance_menu_action():
self.commands.deleteFrameLimitPredictions,
)

### Tracks Menu ###
### Sessions Menu ###

sessionsMenu = self.menuBar().addMenu("Sessions")
self.session_menu = sessionsMenu.addMenu("Set Session Instance")
add_menu_check_item(
sessionsMenu, "sync session", "Synchronize Session Settings"
).setToolTip(
"If enabled, changes to the session settings will be synchronized across all instances."
)
add_menu_item(
sessionsMenu,
"clear session",
"Clear Current Session",
self.commands.clearCurrentSession,
)
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not sure what this is for?

Suggested change
add_menu_check_item(
sessionsMenu, "sync session", "Synchronize Session Settings"
).setToolTip(
"If enabled, changes to the session settings will be synchronized across all instances."
)
add_menu_item(
sessionsMenu,
"clear session",
"Clear Current Session",
self.commands.clearCurrentSession,
)

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please remove - unable to open GUI:

(sa0) λ sleap-label %ds-mview%
Saving config: C:\Users\TalmoLab/.sleap/1.3.3/preferences.yaml
Traceback (most recent call last):
  File "C:\Users\TalmoLab\mambaforge\envs\sa0\Scripts\sleap-label-script.py", line 33, in <module>
    sys.exit(load_entry_point('sleap', 'console_scripts', 'sleap-label')())
  File "d:\social-leap-estimates-animal-poses\source\sleap\sleap\gui\app.py", line 1800, in main
    no_usage_data=args.no_usage_data,
  File "d:\social-leap-estimates-animal-poses\source\sleap\sleap\gui\app.py", line 175, in __init__
    self._initialize_gui()
  File "d:\social-leap-estimates-animal-poses\source\sleap\sleap\gui\app.py", line 304, in _initialize_gui    
    self._create_menus()
  File "d:\social-leap-estimates-animal-poses\source\sleap\sleap\gui\app.py", line 817, in _create_menus      
    sessionsMenu, "sync session", "Synchronize Session Settings"
  File "d:\social-leap-estimates-animal-poses\source\sleap\sleap\gui\app.py", line 382, in add_menu_check_item
    connect_check(key)
  File "d:\social-leap-estimates-animal-poses\source\sleap\sleap\gui\app.py", line 376, in connect_check
    self._menu_actions[key].setChecked(self.state[key])
TypeError: 'PySide2.QtWidgets.QAction.setChecked' called with wrong argument types:
  PySide2.QtWidgets.QAction.setChecked(NoneType)
Supported signatures:
  PySide2.QtWidgets.QAction.setChecked(bool)


tracksMenu.addSeparator()
roomrys marked this conversation as resolved.
Show resolved Hide resolved

tracksMenu = self.menuBar().addMenu("Tracks")
self.inst_groups_menu = sessionsMenu.addMenu("Set Instance Group")
add_menu_item(
self.inst_groups_menu,
"set group",
"Set Instance Group",
self.commands.setInstanceGroup
)

self.track_menu = tracksMenu.addMenu("Set Instance Track")
add_menu_check_item(
tracksMenu, "propagate track labels", "Propagate Track Labels"
Expand All @@ -826,6 +849,8 @@ def new_instance_menu_action():
"Transpose Instance Tracks",
self.commands.transposeInstance,
)



tracksMenu.addSeparator()

Expand Down Expand Up @@ -1120,6 +1145,35 @@ def _update_gui_state(self):

# Update menus

def _update_sessions_menu(self, frame_idx):
"""Update the instance groups menu based on the selected frame index in the session."""
session = self.state.get("session")
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You can just use:

Suggested change
session = self.state.get("session")
session = self.state["session"]

which follows convention (and makes our code easier to search)

if session is None:
return


frame_idx = self.state["frame_idx"]
frame_group = session.frame_groups.get(frame_idx, None)
if frame_group is not None:
for inst_group_ind, instance_group in enumerate(frame_group.instance_groups):
if inst_group_ind < 9:
key_command = Qt.SHIFT + Qt.Key_0 + inst_group_ind + 1
else:
key_command = ""

self.inst_groups_menu.addAction(
instance_group.name,
lambda x=instance_group: self.commands.setInstanceGroup(x),
shortcut=key_command
)

self.inst_groups_menu.addAction(
"New Instance Group",
self.commands.addInstanceGroup,
shortcut=Qt.SHIFT + Qt.Key_0
)
ramizhajj1 marked this conversation as resolved.
Show resolved Hide resolved

self.inst_groups_menu.setEnabled(has_selected_instance)
self.track_menu.setEnabled(has_selected_instance)
self.delete_tracks_menu.setEnabled(has_tracks)
self._menu_actions["clear selection"].setEnabled(has_selected_instance)
Expand Down Expand Up @@ -1772,4 +1826,4 @@ def main(args: Optional[list] = None, labels: Optional[Labels] = None):
else:
app.exec_()

pass
pass
61 changes: 61 additions & 0 deletions sleap/gui/commands.py
Original file line number Diff line number Diff line change
Expand Up @@ -593,6 +593,11 @@ def setInstanceTrack(self, new_track: "Track"):
"""Sets track for selected instance."""
self.execute(SetSelectedInstanceTrack, new_track=new_track)

def setInstanceGroup(self, instance_group: Optional["InstanceGroup"]):
"""Sets the instance group for selected instance."""
self.execute(SetSelectedInstanceGroup, instance_group=instance_group)


def deleteTrack(self, track: "Track"):
"""Delete a track and remove from all instances."""
self.execute(DeleteTrack, track=track)
Expand Down Expand Up @@ -2693,6 +2698,23 @@ def ask_and_do(context: CommandContext, params: dict):
if DeleteDialog(context).exec_():
context.signal_update([UpdateTopic.project_instances])

class AddInstanceGroup(EditCommand):
@staticmethod
def do_action(context, params):
frame_idx = context.state["frame_idx"]
session = context.state["session"]

if frame_idx in session.frame_groups:
frame_group = session.frame_groups[frame_idx]
else:
print(f"No frame group found for frame index {frame_idx}. Unable to add instance group.")
return
ramizhajj1 marked this conversation as resolved.
Show resolved Hide resolved

new_instance_group = frame_group.add_instance_group(instance_group=None)
if new_instance_group:
print(f"New empty instance group added to frame group at frame {frame_idx}.")
else:
print("Failed to add a new instance group.")
ramizhajj1 marked this conversation as resolved.
Show resolved Hide resolved

class AddTrack(EditCommand):
topics = [UpdateTopic.tracks]
Expand All @@ -2709,6 +2731,27 @@ def do_action(context: CommandContext, params: dict):

context.execute(SetSelectedInstanceTrack, new_track=new_track)

class SetSelectedInstanceGroup(EditCommand):
@staticmethod
def do_action(context, params):
selected_instance = context.state["selected_instance"]
ramizhajj1 marked this conversation as resolved.
Show resolved Hide resolved
frame_idx = context.state["frame_idx"]
video = context.state["video"]
session = context.state["session"]

frame_group = session.frame_groups.get(frame_idx, None)
if frame_group is None:
frame_group = session.new_frame_group(frame_idx=frame_idx)

camera = session.get_camera(video=video)

instance_group = params.get("instance_group")

if selected_instance and frame_group and instance_group:
frame_group.add_instance(instance=selected_instance, camera=camera, instance_group=instance_group)
print(f"Instance {selected_instance} added to group {instance_group} at frame {frame_idx}.")
else:
print("Error: Missing required components to add instance to group.")
ramizhajj1 marked this conversation as resolved.
Show resolved Hide resolved

class SetSelectedInstanceTrack(EditCommand):
topics = [UpdateTopic.tracks]
Expand Down Expand Up @@ -3360,6 +3403,7 @@ def add_nodes_from_template(
def add_force_directed_nodes(
cls, context, instance, visible, center_point: QtCore.QPoint = None
):

import networkx as nx

center_point = center_point or context.app.player.getVisibleRect().center()
Expand Down Expand Up @@ -3602,6 +3646,23 @@ def open_website(url: str):
QtGui.QDesktopServices.openUrl(QtCore.QUrl(url))


class AddInstanceGroup(AppCommand):
@staticmethod
def do_action(context: "CommandContext", params: dict):
group_name = params.get("group_name", "New Group")
new_group = InstanceGroup(name=group_name)
context.app.instance_groups.append(new_group)
context.app.refresh_ui()
print(f"Added new instance group: {new_group.name}")

@staticmethod
def ask(context: "CommandContext", params: dict):
group_name = context.ui.prompt_user_input("Enter the name for the new instance group:")
if group_name:
params["group_name"] = group_name
return True
return False

ramizhajj1 marked this conversation as resolved.
Show resolved Hide resolved
class OpenWebsite(AppCommand):
@staticmethod
def do_action(context: CommandContext, params: dict):
Expand Down
Loading