Secking Claude commited on
Commit
aae537f
·
1 Parent(s): 1d1d0c0

Add Segmentation Editing tab with 5-row layout

Browse files

- Row 1: Magic Code textbox + Submit button
- Row 2: Segment ID dropdown (hidden initially)
- Row 3: ImageEditor component for SAM-3 style interaction (hidden initially)
- Row 4: Frame number slider (hidden initially)
- Row 5: Download Segment button (hidden initially)

Rows 2-5 become visible after magic code submission.
All functions are placeholders ready for backend integration.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

Files changed (1) hide show
  1. app.py +126 -1
app.py CHANGED
@@ -90,6 +90,62 @@ def process_video(video_path, notes, email, company_name) -> str:
90
  logger.error(f"Unexpected error in process_video: {e}")
91
  return "Unexpected error during video processing."
92
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
93
  # Create a professional Gradio interface using the Golden ratio (1.618) for proportions
94
  # Define custom CSS for a professional look
95
  css = """
@@ -319,7 +375,51 @@ with gr.Blocks(css=css, theme=gr.themes.Soft(primary_hue="indigo", secondary_hue
319
 
320
  with gr.Tab("Segmentation Editing"):
321
  gr.Markdown("### Segmentation Editing Workspace")
322
- gr.Markdown("This feature is currently under development.")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
323
 
324
  # Wire Content Moderation processing
325
  cm_process_btn.click(
@@ -328,6 +428,31 @@ with gr.Blocks(css=css, theme=gr.themes.Soft(primary_hue="indigo", secondary_hue
328
  outputs=cm_video_out
329
  )
330
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
331
  if __name__ == "__main__":
332
  # To run this file locally, you'll need to install gradio and requests:
333
  # pip install gradio requests
 
90
  logger.error(f"Unexpected error in process_video: {e}")
91
  return "Unexpected error during video processing."
92
 
93
+
94
+ # Placeholder functions for Segmentation Editing tab (future backend integration)
95
+ def submit_magic_code(magic_code):
96
+ """
97
+ Placeholder function to validate magic code and retrieve segment list.
98
+ TODO: Connect to backend API endpoint for magic code validation.
99
+ """
100
+ if not magic_code:
101
+ return (
102
+ gr.update(choices=[]), # dropdown
103
+ "Please enter a magic code", # status message
104
+ gr.update(visible=False), # row2
105
+ gr.update(visible=False), # row3
106
+ gr.update(visible=False), # row4
107
+ gr.update(visible=False) # row5
108
+ )
109
+
110
+ # Placeholder: Simulate retrieving segment IDs
111
+ logger.info(f"Magic code submitted: {magic_code}")
112
+ sample_segments = ["Segment_001", "Segment_002", "Segment_003"]
113
+
114
+ return (
115
+ gr.update(choices=sample_segments, value=sample_segments[0]), # dropdown
116
+ f"Loaded {len(sample_segments)} segments", # status message
117
+ gr.update(visible=True), # row2
118
+ gr.update(visible=True), # row3
119
+ gr.update(visible=True), # row4
120
+ gr.update(visible=True) # row5
121
+ )
122
+
123
+
124
+ def load_segment_frame(segment_id, frame_number):
125
+ """
126
+ Placeholder function to load a specific frame from a segment for editing.
127
+ TODO: Connect to backend API to retrieve frame image from video segment.
128
+ """
129
+ if not segment_id:
130
+ return None
131
+
132
+ logger.info(f"Loading segment: {segment_id}, frame: {frame_number}")
133
+ # Placeholder: Return None (no image loaded yet)
134
+ return None
135
+
136
+
137
+ def download_segment(segment_id, edited_image, frame_number):
138
+ """
139
+ Placeholder function to download edited segment.
140
+ TODO: Connect to backend API to save edited segmentation and download result.
141
+ """
142
+ if not segment_id:
143
+ return "No segment selected"
144
+
145
+ logger.info(f"Download requested for segment: {segment_id}")
146
+ return f"Download functionality coming soon for {segment_id}"
147
+
148
+
149
  # Create a professional Gradio interface using the Golden ratio (1.618) for proportions
150
  # Define custom CSS for a professional look
151
  css = """
 
375
 
376
  with gr.Tab("Segmentation Editing"):
377
  gr.Markdown("### Segmentation Editing Workspace")
378
+
379
+ # Row 1: Magic Code textbox + Submit button
380
+ with gr.Row(elem_classes="input-section"):
381
+ with gr.Column(scale=3):
382
+ seg_magic_code = gr.Textbox(
383
+ label="Magic Code",
384
+ placeholder="Enter your magic code...",
385
+ interactive=True
386
+ )
387
+ with gr.Column(scale=1):
388
+ seg_submit_btn = gr.Button("Submit Code", variant="primary")
389
+
390
+ # Row 2: Segment ID dropdown
391
+ with gr.Row(elem_classes="input-section", visible=False) as seg_row2:
392
+ seg_id_dropdown = gr.Dropdown(
393
+ label="Segment ID",
394
+ choices=[],
395
+ interactive=True,
396
+ info="Select a segment to edit"
397
+ )
398
+
399
+ # Row 3: ImageEditor component (SAM-3 style interaction)
400
+ with gr.Row(elem_classes="input-section", visible=False) as seg_row3:
401
+ seg_image_editor = gr.ImageEditor(
402
+ label="Image Click Segmentation",
403
+ type="pil",
404
+ interactive=True,
405
+ brush=gr.Brush(colors=["#FF0000"], color_mode="fixed")
406
+ )
407
+
408
+ # Row 4: Frame number slider
409
+ with gr.Row(elem_classes="input-section", visible=False) as seg_row4:
410
+ seg_frame_slider = gr.Slider(
411
+ minimum=0,
412
+ maximum=100,
413
+ value=0,
414
+ step=1,
415
+ label="Frame Number",
416
+ interactive=True,
417
+ info="Select video frame to segment"
418
+ )
419
+
420
+ # Row 5: Download Segment button
421
+ with gr.Row(visible=False) as seg_row5:
422
+ seg_download_btn = gr.Button("Download Segment", variant="secondary")
423
 
424
  # Wire Content Moderation processing
425
  cm_process_btn.click(
 
428
  outputs=cm_video_out
429
  )
430
 
431
+ # Wire Segmentation Editing callbacks
432
+ seg_submit_btn.click(
433
+ fn=submit_magic_code,
434
+ inputs=[seg_magic_code],
435
+ outputs=[seg_id_dropdown, seg_magic_code, seg_row2, seg_row3, seg_row4, seg_row5]
436
+ )
437
+
438
+ seg_id_dropdown.change(
439
+ fn=load_segment_frame,
440
+ inputs=[seg_id_dropdown, seg_frame_slider],
441
+ outputs=[seg_image_editor]
442
+ )
443
+
444
+ seg_frame_slider.change(
445
+ fn=load_segment_frame,
446
+ inputs=[seg_id_dropdown, seg_frame_slider],
447
+ outputs=[seg_image_editor]
448
+ )
449
+
450
+ seg_download_btn.click(
451
+ fn=download_segment,
452
+ inputs=[seg_id_dropdown, seg_image_editor, seg_frame_slider],
453
+ outputs=[seg_magic_code] # Display status message in magic code textbox
454
+ )
455
+
456
  if __name__ == "__main__":
457
  # To run this file locally, you'll need to install gradio and requests:
458
  # pip install gradio requests