
    *i                       d Z ddlmZ ddlmZ ddlmZmZ ddlm	Z	m
Z
 ddlmZ ddlmZ ddlmZmZmZmZmZmZmZmZmZmZ dd	lmZmZ dd
lmZ dZdZ d-dZ!d.dZ" G d de	          Z# G d dee$                   Z% G d de          Z& G d de          Z'd/dZ( G d  d!e          Z) G d" d#e
          Z* G d$ d%e          Z+ G d& d'e
          Z, G d( d)e
          Z- G d* d+e
          Z.d,S )0z1Textual TUI console for managing Raiden metadata.    )annotations)on)AppComposeResult)
HorizontalVertical)Message)ModalScreen)
Button	DataTableFooterInputLabelRuleSelectStaticTabbedContentTabPane)get_dbreset_db)validate_task_name   ug  
Screen { background: #080d1a; }
Footer { background: #060b16; color: #7a9abf; }

/* ── Custom header ──────────────────────────────────────── */
_AppHeader {
    dock: top;
    background: #060b16;
    border-bottom: solid #00d4ff 40%;
    height: 3;
    padding: 0 2;
    align: left middle;
}
#header-title {
    width: 1fr;
    color: #00d4ff;
    text-style: bold;
    text-align: center;
    content-align: center middle;
}
/* ── Confirm modal ──────────────────────────────────────── */
_ConfirmScreen {
    align: center middle;
}
#confirm-dialog {
    background: #0d1526;
    border: solid #ff8c00;
    padding: 2 4;
    width: 50;
    height: auto;
}
#confirm-dialog Label {
    color: #ff8c00;
    text-style: bold;
    margin-bottom: 1;
}
#confirm-dialog .confirm-msg {
    color: #c8d8f0;
    margin-bottom: 2;
}
#confirm-buttons { align: center middle; height: 3; }
#confirm-yes { margin-right: 2; }

/* ── Selection bar ──────────────────────────────────────── */
.sel-bar { height: 3; align: left middle; margin-top: 0; }
.sel-bar Button { margin-right: 1; }
#demos-sel-label { color: #00d4ff; width: auto; margin-right: 2; text-style: bold; }

/* ── Settings modal ─────────────────────────────────────── */
_SettingsScreen {
    align: center middle;
}
#settings-dialog {
    background: #0d1526;
    border: solid #00d4ff;
    padding: 2 4;
    width: 60;
    height: auto;
}
#settings-dialog Label {
    color: #00d4ff;
    text-style: bold;
    margin-bottom: 1;
}
#settings-dialog .settings-row {
    height: 1;
    margin-bottom: 1;
}
#settings-dialog .settings-key { color: #7a9abf; width: 22; }
#settings-dialog .settings-val { color: #c8d8f0; width: 1fr; }
#settings-close {
    margin-top: 2;
    background: #0a2a4a;
    border: solid #00d4ff;
    color: #00d4ff;
}

/* ── Help modal ──────────────────────────────────────────── */
_HelpScreen {
    align: center middle;
}
#help-dialog {
    background: #0d1526;
    border: solid #00d4ff;
    padding: 2 4;
    width: 74;
    height: auto;
}
#help-dialog .help-heading {
    color: #00d4ff;
    text-style: bold;
    margin-top: 1;
    margin-bottom: 0;
}
#help-dialog .help-body {
    color: #c8d8f0;
    margin-bottom: 1;
}
#help-dialog .help-key { color: #7a9abf; width: 26; }
#help-dialog .help-desc { color: #c8d8f0; width: 1fr; }
#help-dialog .help-row { height: 1; margin-bottom: 0; }
#help-close {
    margin-top: 2;
    background: #0a2a4a;
    border: solid #00d4ff;
    color: #00d4ff;
}

TabbedContent { background: #080d1a; height: 1fr; }
TabbedContent ContentSwitcher { height: 1fr; }
TabPane { background: #080d1a; padding: 1 2; height: 1fr; }

/* ── Dashboard ──────────────────────────────────────────── */
.stat-row { height: 5; margin-bottom: 1; }
.stat-box {
    width: 1fr;
    height: 5;
    background: #111c35;
    border: solid #00d4ff;
    text-align: center;
    content-align: center middle;
    color: #00d4ff;
    text-style: bold;
    margin: 0 1;
}
.breakdown-row { height: 1fr; }
.breakdown-pane { width: 1fr; margin: 0 1; }
.section-title { color: #00d4ff; text-style: bold; height: 1; }

/* ── Tables ─────────────────────────────────────────────── */
DataTable {
    background: #0d1526;
    border: solid #00d4ff 20%;
    height: 1fr;
}
DataTable > .datatable--header {
    background: #0d1e3a;
    color: #00d4ff;
    text-style: bold;
}
DataTable > .datatable--cursor {
    background: #1a3a6e;
    color: #c8d8f0;
}

/* ── Forms ──────────────────────────────────────────────── */
.action-bar { height: 3; margin-top: 1; align: left middle; }
.action-bar Button { margin-right: 1; }

.form-row { height: 5; margin-top: 1; align: left middle; }
.form-row Input {
    width: 28;
    margin-right: 1;
    background: #0d1526;
    border: solid #00d4ff 30%;
    color: #c8d8f0;
}
.form-row Input.-focus { border: solid #00d4ff; }
.form-row Select { width: 32; margin-right: 1; }
.form-row Button { margin-right: 1; }

/* ── Pagination ─────────────────────────────────────────── */
.pagination-bar { height: 3; align: left middle; margin-top: 0; }
.page-label { color: #7a9abf; margin: 0 2; width: auto; }

/* ── Button variants ────────────────────────────────────── */
Button.success   { background: #1a4a1a; border: solid #00ff44; color: #00ff44; }
Button.failure   { background: #4a1a1a; border: solid #ff4444; color: #ff4444; }
Button.danger    { background: #3a1a0a; border: solid #ff8c00; color: #ff8c00; }
Button.primary   { background: #0a2a4a; border: solid #00d4ff; color: #00d4ff; }
Button.secondary { background: #1a1a3a; border: solid #7a9abf; color: #7a9abf; }
isostrreturnc                F    | r| d d                              dd          ndS )N   T  )replace)r   s    ,/home/robot-lab/raiden_cmu/raiden/tui/app.py_fmt_dtr#      s*    ),43ss8C%%%"4    selr   c                h    | j         }|t          j        u rdS t          |          j        dk    rdS |S )zReturn the selected value, or None if blank.

    Uses both identity and type-name checks so it works regardless of whether
    the installed Textual version uses a singleton or not for NoSelection.
    NNoSelection)valuer   BLANKtype__name__)r%   vs     r"   _select_valr-      s;     		AFLtAww=((tHr$   c                      e Zd ZddZdS )
_AppHeaderr   r   c              #  0   K   t          dd          V  d S )NRaiden Consolezheader-titleid)r   selfs    r"   composez_AppHeader.compose   s&      %.99999999r$   Nr   r   )r+   
__module____qualname__r6    r$   r"   r/   r/      s(        : : : : : :r$   r/   c                       e Zd ZdZdd fdZdd
Z eej        d          dd            Z	 eej        d          dd            Z
 xZS )_ConfirmScreenz"Generic yes/no confirmation modal.Confirmmessager   verbr   Nonec                d    t                                                       || _        || _        d S N)super__init___message_verb)r5   r>   r?   	__class__s      r"   rD   z_ConfirmScreen.__init__   s+    


r$   r   c              #  X  K   t          d          5  t          d          V  t          | j        d          V  t	          d          5  t          | j        dd	          V  t          d
dd	          V  d d d            n# 1 swxY w Y   d d d            d S # 1 swxY w Y   d S )Nzconfirm-dialogr2   Warningzconfirm-msgclasseszconfirm-buttonszconfirm-yesdangerr3   rK   Cancelz
confirm-no	secondary)r   r   r   rE   r   r   rF   r4   s    r"   r6   z_ConfirmScreen.compose   so     )*** 	M 	M	""""">>>>>>0111 M MTZM8LLLLLLX,LLLLLLM M M M M M M M M M M M M M M	M 	M 	M 	M 	M 	M 	M 	M 	M 	M 	M 	M 	M 	M 	M 	M 	M 	Ms5   :B.B;BB	BB	BB#&B#z#confirm-yeseventButton.Pressedc                0    |                      d           d S )NTdismissr5   rP   s     r"   _confirmz_ConfirmScreen._confirm   s    Tr$   z#confirm-noc                0    |                      d           d S )NFrS   rU   s     r"   _cancelz_ConfirmScreen._cancel   s    Ur$   )r=   )r>   r   r?   r   r   r@   r7   rP   rQ   r   r@   )r+   r8   r9   __doc__rD   r6   r   r   PressedrV   rX   __classcell__rG   s   @r"   r<   r<      s        ,,      
M M M M R''   (' R&&   '&    r$   r<   c                  L    e Zd Zd
dZ eej        d          dd            Zd	S )_SettingsScreenr   r   c              #    K   ddl m} t                      }|                                }t	          |                                          }t	          |                                          }t	          |                                          }t	          |                                          }t	          |	                                          }t          d          5  t          d          V  t          d          5  t          dd	          V  t          t          |          d
          V  d d d            n# 1 swxY w Y   t          d          5  t          dd	          V  t          t          |          d
          V  d d d            n# 1 swxY w Y   t          d          5  t          dd	          V  t          t          |          d
          V  d d d            n# 1 swxY w Y   t          d          5  t          dd	          V  t          t          |          d
          V  d d d            n# 1 swxY w Y   t          d          5  t          dd	          V  t          t          |          d
          V  d d d            n# 1 swxY w Y   t          d          5  t          dd	          V  t          t          |          d
          V  d d d            n# 1 swxY w Y   t          d          5  t          dd	          V  t          dd
          V  d d d            n# 1 swxY w Y   t          dd          V  d d d            d S # 1 swxY w Y   d S )Nr   )DB_DIRzsettings-dialogr2   Settingszsettings-rowrJ   zDB directoryzsettings-keyzsettings-valDemonstrationsTeachersTaskszCalibration resultszCamera configsKeybindingszr  Refresh    q  QuitClosezsettings-close)raiden._configra   r   resolvelenget_demonstrationsget_teachers	get_tasksget_calibration_resultsget_camera_configsr   r   r   r   r   r   )	r5   ra   dbdb_dirn_demos
n_teachersn_tasksn_calibn_cfgs	            r"   r6   z_SettingsScreen.compose  s      ))))))XX!!b++--..**++
bllnn%%b002233B))++,,*+++ 	7 	7
#####N333 B B^^DDDDDDS[[.AAAAAAB B B B B B B B B B B B B B B N333 C C-~FFFFFFS\\>BBBBBBC C C C C C C C C C C C C C C N333 F FZ@@@@@@S__nEEEEEEF F F F F F F F F F F F F F F N333 C CWn======S\\>BBBBBBC C C C C C C C C C C C C C C N333 C C2NKKKKKKS\\>BBBBBBC C C C C C C C C C C C C C C N333 A A-~FFFFFFSZZ@@@@@@A A A A A A A A A A A A A A A N333 N N]NCCCCCC4nMMMMMMN N N N N N N N N N N N N N N %5666666/	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7s   "N4E6NE	N	E	
N4FNF!	!N$F!	%N84G8,N8G<	<N?G<	 N4INI	NI	N.4J."N.J2	2N5J2	6N	4L	=N	L	NL	N$'MNM	NM	NN	Nz#settings-closerP   rQ   r@   c                .    |                                   d S rB   rS   rU   s     r"   _closez_SettingsScreen._close+      r$   Nr7   rY   r+   r8   r9   r6   r   r   r[   rx   r:   r$   r"   r_   r_     sY        #7 #7 #7 #7J R)**   +*  r$   r_   c                  L    e Zd Zd
dZ eej        d          dd            Zd	S )_HelpScreenr   r   c              #     K   t          d          5  t          d          V  t          dd          V  t          dd          V  t          d	d          V  t          d
d          V  t          dd          V  t          dd          V  t          dd          V  t          dd          V  t          dd          V  t          dd          V  t          dd          V  d d d            d S # 1 swxY w Y   d S )Nzhelp-dialogr2   u   Raiden Console — HelpWorkflowzhelp-headingrJ   zMark each episode as Success or Failure at the keyboard verdict
prompt that appears after every recording. Open the console only
to correct mistakes.

Only successful demonstrations are converted when you run  rd convert.z	help-bodyzMarking demonstrationsu  During recording:
  Leader-arm button (or Enter, in SpaceMouse mode)  Start or stop recording
  Foot pedal (any button)                           Log a subtask boundary
                                                    into event_markers
  Ctrl-C                                            Emergency stop

After each recording (verdict prompt):
  Enter                Mark as Success
  f                    Mark as Failure
  any other key        Leave as Pending (relabel later in this tab)

In the Demonstrations tab:
  ↑ / ↓                Navigate rows
  Space                Toggle selection on the current row
  Select All           Select all rows on the current page
  Clear                Deselect all rows
  Mark Success/Failure Apply to all selected rows (or cursor row)
  Update               Reassign teacher/task for all selected rows
  Delete               Delete all selected rows (or cursor row)
ConvertingzRun  rd convert  after recording to extract PNG frames and depth maps.
Only demonstrations with status = success are converted.
Pending and failure demonstrations are skipped.TabszDashboard       Live counts and per-task / per-teacher breakdown
Demonstrations  Full list of recorded episodes with status and paths
Teachers        Manage teacher names linked to demonstrations
Tasks           Manage task names and language instructionszKey bindingsz\r   Refresh all panes
s   Settings (DB path and record counts)
?   This help screen
q   Quitrg   z
help-close)r   r   r   r   r4   s    r"   r6   z_HelpScreen.compose1  s     ''' <	3 <	3122222^<<<<<<Y $      1>JJJJJJR" $%     * ~>>>>>>B $	      888888N $      @@@@@@ $      \222222y<	3 <	3 <	3 <	3 <	3 <	3 <	3 <	3 <	3 <	3 <	3 <	3 <	3 <	3 <	3 <	3 <	3 <	3s   C#DD
Dz#help-closerP   rQ   r@   c                .    |                                   d S rB   rS   rU   s     r"   rx   z_HelpScreen._closep  ry   r$   Nr7   rY   rz   r:   r$   r"   r|   r|   0  sX        =3 =3 =3 =3~ R&&   '&  r$   r|   tabler   
int | Nonec                    | j         dk    rd S 	 |                     | j                  }t          t	          |d                             S # t
          $ r Y d S w xY wNr   )	row_count
get_row_at
cursor_rowintr   	Exception)r   rows     r"   _selected_idr   u  si    !tu/003s1v;;   tts   ;A 
AAc                  ~    e Zd ZdZeZdZg dZddZddZ	dd	Z
dd
ZddZ eej                  dd            ZdS )RaidenConsolezDInteractive console for managing Raiden demonstrations and metadata.r1   ))qquitQuit)rrefreshRefresh)sopen_settingsrb   )question_markhelpHelpr   r   c              #  ^  K   t                      V  t                      5  t          dd          5  t                      V  d d d            n# 1 swxY w Y   t          dd          5  t	                      V  d d d            n# 1 swxY w Y   t          dd          5  t                      V  d d d            n# 1 swxY w Y   t          dd	          5  t                      V  d d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y   t                      V  d S )
N	Dashboardztab-dashboardr2   rc   ztab-demonstrationsrd   ztab-teachersre   z	tab-tasks)r/   r   r   _DashboardPane_DemonstrationsPane_TeachersPane
_TasksPaner   r4   s    r"   r6   zRaidenConsole.compose  sn     ll__ 	# 	#999 ' '$&&&&&' ' ' ' ' ' ' ' ' ' ' ' ' ' ').BCCC , ,)+++++, , , , , , , , , , , , , , ,777 & &#oo%%%& & & & & & & & & & & & & & &[111 # # ll"""# # # # # # # # # # # # # # #	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# hhs   DADA	DA	D,B	=D	B	DB	D%C6DC	D	C	
DC;/D;C?	?DC?	DDDr@   c                <    |                      d| j                   d S )N   )set_intervalaction_refreshr4   s    r"   on_mountzRaidenConsole.on_mount  s!    !T011111r$   c                H    |                      t                                 d S rB   )push_screenr_   r4   s    r"   action_open_settingsz"RaidenConsole.action_open_settings  s"    **+++++r$   c                H    |                      t                                 d S rB   )r   r|   r4   s    r"   action_helpzRaidenConsole.action_help  s     '''''r$   c                   dd l }t          t          t          t          fD ]}	 |                     |                                           +# |j        $ rj 	 t                      	                                 t                       |                     |                                           n# t          $ r Y nw xY wY t          $ r Y w xY wd S r   )jsonr   r   r   r   	query_onesafe_refreshJSONDecodeErrorr   repairr   r   )r5   _jsonclss      r"   r   zRaidenConsole.action_refresh  s    "$7
S 	 	Cs##002222(   HHOO%%%JJJNN3''446666    D   	 	s<   'A


C	AB+*C	+
B85C	7B88C	=	C	C	rP   TabbedContent.TabActivatedc                .    |                                   d S rB   )r   rU   s     r"   _on_tab_activatedzRaidenConsole._on_tab_activated  s    r$   Nr7   r   r@   )rP   r   r   r@   )r+   r8   r9   rZ   _CSSCSSTITLEBINDINGSr6   r   r   r   r   r   r   TabActivatedr   r:   r$   r"   r   r     s        NN
CE  H   2 2 2 2, , , ,( ( ( (   " R"##   $#  r$   r   c                  .    e Zd Zd	dZd
dZd
dZd
dZdS )r   r   r   c              #    K   t          d          5  t          ddd          V  t          ddd          V  t          d	d
d          V  t          ddd          V  t          ddd          V  d d d            n# 1 swxY w Y   t          d          5  t          d          5  t          dd          V  t          d          V  d d d            n# 1 swxY w Y   t          d          5  t          dd          V  t          d          V  d d d            n# 1 swxY w Y   d d d            d S # 1 swxY w Y   d S )Nzstat-rowrJ   zTotal

0z
stat-totalzstat-boxrM   z
Pending

0zstat-pendingz
Success

0zstat-successz
Failure

0zstat-failurezConverted

0zstat-convertedzbreakdown-rowzbreakdown-panezBy Taskzsection-titlezby-task-tabler2   z
By Teacherzby-teacher-table)r   r   r   r   r4   s    r"   r6   z_DashboardPane.compose  s     
+++ 	T 	T,
KKKKKKNJOOOOOONJOOOOOONJOOOOOO).>
SSSSSS	T 	T 	T 	T 	T 	T 	T 	T 	T 	T 	T 	T 	T 	T 	T 000 	7 	7"2333 4 4Y@@@@@@?3333334 4 4 4 4 4 4 4 4 4 4 4 4 4 4 "2333 7 7\?CCCCCC#56666667 7 7 7 7 7 7 7 7 7 7 7 7 7 7		7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7sl   A%BBBE0&C"E"C&	&E)C&	*E=&D/#E/D3	3E6D3	7EEEr@   c                   |                      dt                    }|                    dddddd           |                      dt                    }|                    d	ddddd           |                                  d S )
N#by-task-tableTaskTotalSuccessFailurePending	Converted#by-teacher-tableTeacherr   r   add_columnsr   )r5   task_tblteacher_tbls      r"   r   z_DashboardPane.on_mount  s    >>"2I>>GY	9k	
 	
 	
 nn%8)DDw	9i	
 	
 	
 	r$   c                R    	 |                                   d S # t          $ r Y d S w xY wrB   refresh_datar   r4   s    r"   r   z_DashboardPane.safe_refresh  A    	 	 	 	DD	    
&&c                R   t                      }|                                }|                                }|                                }t	          |          }i }d}|D ]O}|                    dd          }	|                    |	d          dz   ||	<   |                    dd          r|dz  }P|                     dt                                        d|            |                     d	t                                        d
|                    dd                      |                     dt                                        d|                    dd                      |                     dt                                        d|                    dd                      |                     dt                                        d|            i }
i }|D ]}|                    d          }||                    dd          }	|
	                    |i            |
|                             |	d          dz   |
|         |	<   |                    dd          r|                    |d          dz   ||<   |                     dt                    }|                                 |D ]
}|
                    |d         i           }|                    |d         t          t          |                                                    t          |                    dd                    t          |                    dd                    t          |                    dd                    t          |                    |d         d                    t          |d                              i }i }|D ]}|                    d          }||                    dd          }	|	                    |i            ||                             |	d          dz   ||         |	<   |                    dd          r|                    |d          dz   ||<   |                     dt                    }|                                 |D ]
}|                    |d         i           }|                    |d         t          t          |                                                    t          |                    dd                    t          |                    dd                    t          |                    dd                    t          |                    |d         d                    t          |d                              d S )Nr   statuspending   	convertedFz#stat-totalzTotal

z#stat-pendingz	Pending

z#stat-successz	Success

successz#stat-failurez	Failure

failurez#stat-convertedzConverted

task_idr   r3   namekey
teacher_idr   )r   rk   rm   rl   rj   getr   r   update
setdefaultr   clearadd_rowr   sumvalues)r5   rp   demostasksteachersn_total	by_statusn_converteddr   per_task_statusper_task_convtidr   tcper_teacher_statusper_teacher_convr   s                      r"   r   z_DashboardPane.refresh_data  sZ   XX%%''??$$e**$&	 	! 	!Ah	**A$==A..2IaLuu[%(( !q }f--445J5J5JKKK//667)--	15577	
 	
 	
 	//667)--	15577	
 	
 	
 	//667)--	15577	
 	
 	
 	(&11889V9V9VWWW 68(* 	G 	GA%%	""CEE(I..**3333*9#*>*B*B1a*H*H1*L$Q'55e,, G)6):):3)B)BQ)FM#&>>"2I>> 
	 
	A##AdGR00A&	C

OO$$AEE)Q''((AEE)Q''((AEE)Q''((M%%agq1122$LL      9;+- 	M 	MA%%%%CEE(I.."--c2666-?-D-H-HA-N-NQR-R"3'*55e,, M,<,@,@a,H,H1,L$S)nn%8)DD 
	 
	A"&&qw33A&	C

OO$$AEE)Q''((AEE)Q''((AEE)Q''(($((4!4455$LL      
	 
	r$   Nr7   r   )r+   r8   r9   r6   r   r   r   r:   r$   r"   r   r     sj        7 7 7 7	 	 	 	   M M M M M Mr$   r   c                  6    e Zd ZdZ G d de          ZddZdS )	
_DemoTablez?DataTable subclass that emits RowToggled when Space is pressed.c                        e Zd Zd fdZ xZS )_DemoTable.RowToggled	row_indexr   r   r@   c                V    t                                                       || _        d S rB   )rC   rD   r   )r5   r   rG   s     r"   rD   z_DemoTable.RowToggled.__init__5  s$    GG&DNNNr$   )r   r   r   r@   )r+   r8   r9   rD   r\   r]   s   @r"   
RowToggledr   4  s=        	' 	' 	' 	' 	' 	' 	' 	' 	' 	'r$   r   r   r@   c                    |j         dk    rN| j        dk    rE|                     |                     | j                             |                                 d S d S d S )Nspacer   )r   r   post_messager   r   stoprU   s     r"   on_keyz_DemoTable.on_key9  s\    9DNQ$6$6doodo>>???JJLLLLL  $6$6r$   Nr   )r+   r8   r9   rZ   r	   r   r   r:   r$   r"   r   r   1  sX        II' ' ' ' 'W ' ' '
     r$   r   c                  D    e Zd Zd# fdZd$dZd#dZd#dZd#dZd%d
Zd&dZ	d#dZ
d#dZ eej                  d'd            Z eej        d          d(d            Z eej        d          d(d            Z eej        d          d(d            Z eej        d          d(d            Z eej        d          d(d            Z eej        d          d(d            Z eej        d          d(d             Z eej        d!          d(d"            Z xZS ))r   r   r@   c                |    t                                                       d| _        t                      | _        d S r   )rC   rD   _pageset_selected_keysr5   rG   s    r"   rD   z_DemonstrationsPane.__init__C  s2    
(+r$   r   c              #  v  K   t          dd          V  t          d          5  t          dd          V  t          d	d
d          V  t          ddd          V  d d d            n# 1 swxY w Y   t	          d          V  t          dd          5  t          ddd          V  t          ddd          V  t          ddd          V  d d d            n# 1 swxY w Y   t          d          5  t          ddd          V  t          ddd           V  t          d!d"d#          V  d d d            n# 1 swxY w Y   t          d$          5  t          g d%d&'          V  t          g d(d)'          V  t          d*d+d,          V  d d d            d S # 1 swxY w Y   d S )-Nzdemos-tabler   r3   cursor_typezsel-barrJ   r    zdemos-sel-labelr2   z
Select Allzdemos-sel-allrO   rM   Clearzdemos-sel-clearzdemos-dividerpagination-barzdemos-paginationrK   r3   < Prevz
demos-prev
Page 1 / 1zdemos-page-label
page-labelNext >z
demos-nextz
action-barzMark Successzdemo-successr   zMark Failurezdemo-failurer   Deletezdemo-deleterL   form-rowzdemo-teacher-selectzReassign teacher...)r3   promptzdemo-task-selectzReassign task...Updatezdemo-updateprimary)r   r   r   r   r   r   r4   s    r"   r6   z_DemonstrationsPane.composeH  sw     Mu======	*** 	M 	M 1222222/;OOOOOO%6LLLLLL	M 	M 	M 	M 	M 	M 	M 	M 	M 	M 	M 	M 	M 	M 	M o&&&&&& 05GHHH 	I 	IlKHHHHHH*<lSSSSSSlKHHHHHH	I 	I 	I 	I 	I 	I 	I 	I 	I 	I 	I 	I 	I 	I 	I --- 	G 	GNINNNNNNNINNNNNNmXFFFFFF	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G
 
+++ 	H 	H 5>STTTTTT 2;MNNNNNNmYGGGGGG	H 	H 	H 	H 	H 	H 	H 	H 	H 	H 	H 	H 	H 	H 	H 	H 	H 	HsG   <A..A25A2=C%%C),C) =E		EE$=F..F25F2c           	         |                      dt                    }|                    ddd           |                    dddd	d
dd           |                                  d S )N#demos-tabler    r%   r   )r   widthIDr   r   Statusr   zRaw PathCreated)r   r   
add_columnr   r   r5   r   s     r"   r   z_DemonstrationsPane.on_mount]  sq    ~z::a000&)X{J		
 	
 	
 	r$   c                R    	 |                                   d S # t          $ r Y d S w xY wrB   r   r4   s    r"   r   z _DemonstrationsPane.safe_refreshe  r   r   c                   t                      }|                     dt                    }d }|j        dk    r?	 t	          |                    |j                  d                   }n# t          $ r Y nw xY w|                                 d |	                                D             }d |
                                D             }t          |                                d d          }t          |          }t          d|t          z   dz
  t          z            }t!          | j        |dz
            | _        || j        t          z  | j        dz   t          z           }	|	D ]}
t	          |
d	                   }|                    || j        v rd
nd||                    |
                    d          d          |                    |
                    d          d          |
                    dd          |
                    dd          rdnd|
                    dd          t+          |
                    dd                    |	  	         |dk    }||                     d          _        | |                     d          _        |r@|                     dt.                                        d| j        dz    d| d| d           d  |
                                D             }d! |	                                D             }|                     d"t2                    }|                     d#t2                    }t5          |          }t5          |          }|                    |           |                    |           |||_        |||_        |;	 |                    |                    |          $           n# t          $ r Y nw xY w|                                  d S )%Nr  r   r   c                ,    i | ]}|d          |d         S r3   r   r:   .0r   s     r"   
<dictcomp>z4_DemonstrationsPane.refresh_data.<locals>.<dictcomp>x  s"    ???1AdGQvY???r$   c                ,    i | ]}|d          |d         S r  r:   r  s     r"   r   z4_DemonstrationsPane.refresh_data.<locals>.<dictcomp>y  s"    EEEaqw&	EEEr$   c                .    |                      dd          S N
created_atr    r   )r   s    r"   <lambda>z2_DemonstrationsPane.refresh_data.<locals>.<lambda>}      !%%b11 r$   Tr   reverser3      ●r   r   ?r   r   r   r   Fyesnoraw_data_pathr    r$  r   z#demos-paginationz#demos-dividerz#demos-page-labelPage  /   ( total)c                .    g | ]}|d          |d         fS r   r3   r:   r  s     r"   
<listcomp>z4_DemonstrationsPane.refresh_data.<locals>.<listcomp>  s%    DDDQQvY$(DDDr$   c                .    g | ]}|d          |d         fS r4  r:   r  s     r"   r5  z4_DemonstrationsPane.refresh_data.<locals>.<listcomp>  s%    >>>!!F)QtW%>>>r$   #demo-teacher-select#demo-task-selectr   ) r   r   r   r   r   r   r   r   r   rm   rl   sortedrk   rj   max
_PAGE_SIZEminr   r   r  r   r#   displayr   r   r   r-   set_optionsr(   move_cursorget_row_index_update_sel_label)r5   rp   r   old_keytask_mapteacher_map	all_demostotaltotal_pages
page_demosr   row_keyshow_paginationr   r   teacher_seltask_selprev_teacher	prev_tasks                      r"   r   z _DemonstrationsPane.refresh_datak  s   XX~z::"?Qe..u/?@@CDD    	?????EE2??3D3DEEE!!##11
 
 
	
 I!ej014CDD[1_55
tzJ6$*q.J9VVW
 	 	A!D'llGMM D$777SQUU9--s33l 3 3S99h	**{E22<or**lB//00  
 
 
 
 &/6E*++37F3F'((0 	NN.77>>I
QII;II5III   ED"//2C2CDDD>>r||~~>>>nn%;VDD>>"5v>>";//))	)))U#### ,K &HN!!e&9&9'&B&B!CCCC    	     s#   -A& &
A32A3)O	 	
OOr   c                    |                      dt                    }|j        dk    rd S 	 t          t	          |                    |j                  d                             S # t          $ r Y d S w xY w)Nr  r   r   )r   r   r   r   r   r   r   r   r  s     r"   
_cursor_idz_DemonstrationsPane._cursor_id  sz    ~z::?a4	s5++E,<==a@AABBB 	 	 	44	s   9A$ $
A21A2	list[int]c                h    | j         rd | j         D             S |                                 }||gng S )zJReturn selected demo IDs, falling back to the cursor row if none selected.c                ,    g | ]}t          |          S r:   )r   )r  ks     r"   r5  z5_DemonstrationsPane._selected_ids.<locals>.<listcomp>  s    888qCFF888r$   )r  rQ  )r5   cids     r"   _selected_idsz!_DemonstrationsPane._selected_ids  sC     	988D$78888oouuR/r$   c                    t          | j                  }|r| dnd}|                     dt                                        |           d S )Nz selected  (Space to toggle)zSpace to select rowsz#demos-sel-label)rj   r  r   r   r   )r5   ntexts      r"   rB  z%_DemonstrationsPane._update_sel_label  sT    #$$56R!1111<R)62299$?????r$   c                    |                      dt                    }|j        dk    r6|                    t	          |j        dz   |j        dz
                       dS dS )z@Move the cursor to the next row (used after single-row actions).r  r   r   r9  N)r   r   r   r@  r=  r   r  s     r"   _advance_cursorz#_DemonstrationsPane._advance_cursor  s`    ~z::?Q#e&6&:EOa<O"P"PQQQQQ r$   rP   r   c                   |                      dt                    }	 t          |                    |j                  d                   }|| j        v r2| j                            |           |                    |dd           n1| j                            |           |                    |dd           | 	                                 | 
                                 d S # t          $ r Y d S w xY w)Nr  r   r%   r   r*  )r   r   r   r   r   r  discardupdate_celladdrB  r\  r   )r5   rP   r   rJ  s       r"   _on_row_toggledz#_DemonstrationsPane._on_row_toggled  s    ~z::	%**5?;;A>??G$---#++G444!!'5#6666#''000!!'5%888""$$$  """"" 	 	 	DD	s   CC   
C.-C.z#demos-sel-allrQ   c                f   |                      dt                    }t          |j                  D ]l}	 t	          |                    |          d                   }| j                            |           |                    |dd           ]# t          $ r Y iw xY w| 
                                 d S )Nr  r   r%   r*  )r   r   ranger   r   r   r  r`  r_  r   rB  r5   rP   r   irJ  s        r"   _select_allz_DemonstrationsPane._select_all  s    ~z::u'' 	 	Ae..q11!455#''000!!'5%8888        s   AB
BBz#demos-sel-clearc                d   |                      dt                    }t          |j                  D ]R}	 t	          |                    |          d                   }|                    |dd           C# t          $ r Y Ow xY w| j        	                                 | 
                                 d S )Nr  r   r%   r   )r   r   rc  r   r   r   r_  r   r  r   rB  rd  s        r"   _clear_selectionz$_DemonstrationsPane._clear_selection  s    ~z::u'' 	 	Ae..q11!455!!'5#6666   !!###     s   ?A33
B ?B z#demos-prevc                h    | j         dk    r&| xj         dz  c_         |                                  d S d S Nr   r   r   r   rU   s     r"   
_prev_pagez_DemonstrationsPane._prev_page  ;    :>>JJ!OJJ >r$   z#demos-nextc                   t                      }t          |                                          }t          d|t          z   dz
  t          z            }| j        |dz
  k     r&| xj        dz  c_        |                                  d S d S Nr   )r   rj   rk   r;  r<  r   r   r5   rP   rp   rG  rH  s        r"   
_next_pagez_DemonstrationsPane._next_page  s    XXB))++,,!ej014CDD:a''JJ!OJJ ('r$   z#demo-successc                    |                                  }|sd S | j         }t                      }|D ]}|                    |d           |                                  |r|                                  d S d S )Nr   r   rW  r  r   update_demonstrationr   r\  r5   rP   idssinglerp   demo_ids         r"   _mark_successz!_DemonstrationsPane._mark_success        "" 	F((XX 	? 	?G##GI#>>>> 	#  """""	# 	#r$   z#demo-failurec                    |                                  }|sd S | j         }t                      }|D ]}|                    |d           |                                  |r|                                  d S d S )Nr   rs  rt  rv  s         r"   _mark_failurez!_DemonstrationsPane._mark_failure  r{  r$   z#demo-updatec                   |                                  }|sd S | j         }i }t          |                     dt                              }t          |                     dt                              }|||d<   |||d<   |rMt                      }|D ]} |j        |fi | |                                  |r|                                  d S d S d S )Nr7  r8  r   r   )	rW  r  r-   r   r   r   ru  r   r\  )	r5   rP   rw  rx  kwargsteacher_valtask_valrp   ry  s	            r"   _update_demoz _DemonstrationsPane._update_demo"  s     "" 	F((!$..1G"P"PQQt~~.A6JJKK"#.F<  (F9 	'B ; ;''::6:::: '$$&&&&&	' 	'
' 'r$   z#demo-deletec                                                       sd S  j         t                    }|dk    rd| dndd          d}d fd} j                            t          |d          |           d S )Nr   zDelete z demonstrations?zDelete demonstration #r   r+  	confirmedboolr   r@   c                    | rnt                      }D ]}|                    |           xj        d D             z  c_                                         r                                 d S d S d S )Nc                ,    h | ]}t          |          S r:   )r   )r  re  s     r"   	<setcomp>zH_DemonstrationsPane._delete_demo.<locals>._on_confirm.<locals>.<setcomp>I  s    '<'<'<1A'<'<'<r$   )r   delete_demonstrationr  r   r\  )r  rp   ry  rw  r5   rx  s      r"   _on_confirmz5_DemonstrationsPane._delete_demo.<locals>._on_confirmD  s     +XX" 5 5G++G4444##'<'<'<'<'<<##!!### +((*****+ ++ +r$   r  )r?   r  r  r   r@   )rW  r  rj   appr   r<   )r5   rP   rY  msgr  rw  rx  s   `    @@r"   _delete_demoz _DemonstrationsPane._delete_demo7  s      "" 	F((HH 1uu *a))))3#a&333 		+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	^Ch???MMMMMr$   r   r7   )r   r   )r   rR  )rP   r   r   r@   rY   )r+   r8   r9   rD   r6   r   r   r   rQ  rW  rB  r\  r   r   r   ra  r   r[   rf  rh  rl  rq  rz  r}  r  r  r\   r]   s   @r"   r   r   B  s       . . . . . .
H H H H*      C! C! C! C!N   0 0 0 0@ @ @ @
R R R R R
    R())	! 	! 	! *)	! R*++	! 	! 	! ,+	! R&&      '& 
 R&&      '&  R((
# 
# 
# )(
# R((
# 
# 
# )(
# R''' ' ' (''( R''N N N ('N N N N Nr$   r   c                      e Zd ZddZddZddZddZ eej	        d          dd            Z
 eej	        d          dd            Z eej	        d          dd            ZdS )r   r   r   c              #     K   t          dd          V  t          d          5  t          dd          V  t          d	d
d          V  t          ddd          V  t          ddd          V  d d d            d S # 1 swxY w Y   d S )Nzteachers-tabler   r  r  rJ   Namezteacher-name-inputplaceholderr3   Addzteacher-addr  rM   r  zteacher-updaterO   r  zteacher-deleterL   )r   r   r   r   r4   s    r"   r6   z_TeachersPane.composeU  s     +??????
+++ 	J 	JF/CDDDDDD=)DDDDDD&6LLLLLL&6IIIIII		J 	J 	J 	J 	J 	J 	J 	J 	J 	J 	J 	J 	J 	J 	J 	J 	J 	Js   ABB
Br@   c                    |                      dt                    }|                    dddd           |                                  d S )N#teachers-tabler  r  Demosr  r   r  s     r"   r   z_TeachersPane.on_mount]  sH    0)<<$;;;r$   c                R    	 |                                   d S # t          $ r Y d S w xY wrB   r   r4   s    r"   r   z_TeachersPane.safe_refreshb  r   r   c                |   t                      }|                     dt                    }d }|j        dk    r?	 t	          |                    |j                  d                   }n# t          $ r Y nw xY w|                                 |	                                }i }|D ]5}|
                    d          }||
                    |d          dz   ||<   6|                                D ]}|                    t	          |d                   |d         t	          |
                    |d         d                    t          |
                    dd                    t	          |d                   	           |=	 |                    |                    |          
           d S # t          $ r Y d S w xY wd S )Nr  r   r   r   r3   r   r$  r    r   r9  )r   r   r   r   r   r   r   r   r   rk   r   rl   r   r#   r@  rA  )	r5   rp   r   rC  r   demo_countsr   r   r   s	            r"   r   z_TeachersPane.refresh_datah  s   XX0)<<"?Qe..u/?@@CDD    	%%''&( 	? 	?A%%%%C#.??3#:#:Q#>C "" 	 	AMMAdG&	KOOAdGQ//00lB//00$LL      !!e&9&9'&B&B!CCCCC    s#   -A& &
A32A3 )F+ +
F98F9z#teacher-addrP   rQ   c                J   |                      dt                    j                                        }|sd S t	                      }|                    |          |                    |           d|                      dt                    _        |                                  d S )N#teacher-name-inputr    )r   r   r(   stripr   get_teacher_by_nameadd_teacherr   )r5   rP   r   rp   s       r"   _add_teacherz_TeachersPane._add_teacher  s    ~~3U;;AGGII 	FXX!!$''/NN4   =?,e44:r$   z#teacher-updatec                v   t          |                     dt                              }|                     dt                    j                                        }|Z|rZt                                          ||           d|                     dt                    _        |                                  d S d S d S )Nr  r  r    )	r   r   r   r   r(   r  r   update_teacherr   )r5   rP   r   r   s       r"   _update_teacherz_TeachersPane._update_teacher  s    !$..1BI"N"NOO
~~3U;;AGGII!d!HH##J555ACDNN0%88> "!!!r$   z#teacher-deletec                T                          dt                    }t          |          d S 	 t          |                    |j                  d                   }n# t          $ r d }Y nw xY wd fd} j                            t          d	| d
          |           d S )Nr  r   #r  r  r   r@   c                    | rWt                                                     d                    dt                    _                                         d S d S )Nr    r  )r   delete_teacherr   r   r(   r   )r  r5   r   s    r"   r  z2_TeachersPane._delete_teacher.<locals>._on_confirm  s\     $''
333EG4e<<B!!#####$ $r$   zDelete teacher "z?"?
All linked demonstrations will lose their teacher reference.r  
r   r   r   r   r   r   r   r  r   r<   )r5   rP   r   r   r  r   s   `    @r"   _delete_teacherz_TeachersPane._delete_teacher  s    0)<<!%((
F	$u''(899!<==DD 	$ 	$ 	$#z##DDD	$	$ 	$ 	$ 	$ 	$ 	$ 	$ 	i4iii  		
 	
 	
 	
 	
   -A   A21A2Nr7   r   rY   )r+   r8   r9   r6   r   r   r   r   r   r[   r  r  r  r:   r$   r"   r   r   T  s        J J J J   
   ! ! ! !F R''   (' R)**      +*  R)**
 
 
 +*
 
 
r$   r   c                  N    e Zd Zd fdZddZddZddZddZ ee	j
        d	          dd            Z ee	j
        d          dd            Z ee	j
        d          dd            Z ee	j
        d          dd            Z ee	j
        d          dd            Z xZS )r   r   r@   c                V    t                                                       d| _        d S r   )rC   rD   r   r  s    r"   rD   z_TasksPane.__init__  s$    


r$   r   c              #  4  K   t          dd          V  t          d          V  t          dd          5  t          d	d
d          V  t	          ddd          V  t          ddd          V  d d d            n# 1 swxY w Y   t          d          5  t          dd          V  t          dd          V  t          ddd          V  t          ddd          V  t          ddd           V  d d d            d S # 1 swxY w Y   d S )!Nztasks-tabler   r  ztasks-dividerr2   r  ztasks-paginationr  r	  z
tasks-prevrO   rM   r
  ztasks-page-labelr  r  z
tasks-nextr  rJ   r  ztask-name-inputr  Instructionztask-instruction-inputr  ztask-addr  r  ztask-updater  ztask-deleterL   )r   r   r   r   r   r   r4   s    r"   r6   z_TasksPane.compose  s     =e<<<<<<o&&&&&& 05GHHH 	I 	IlKHHHHHH*<lSSSSSSlKHHHHHH	I 	I 	I 	I 	I 	I 	I 	I 	I 	I 	I 	I 	I 	I 	I 
+++ 	G 	GF/@AAAAAAM6NOOOOOO:yAAAAAAm[IIIIIImXFFFFFF	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	Gs$   =BB	BA#DDDc                    |                      dt                    }|                    ddddd           |                                  d S )N#tasks-tabler  r  r  r  r  r   r  s     r"   r   z_TasksPane.on_mount  sI    ~y99$w	JJJr$   c                R    	 |                                   d S # t          $ r Y d S w xY wrB   r   r4   s    r"   r   z_TasksPane.safe_refresh  r   r   c                   t                      }|                     dt                    }d }|j        dk    r?	 t	          |                    |j                  d                   }n# t          $ r Y nw xY w|                                 |	                                }i }|D ]5}|
                    d          }||
                    |d          dz   ||<   6t          |                                d d          }t          |          }	t          d|	t          z   dz
  t          z            }
t!          | j        |
dz
            | _        || j        t          z  | j        dz   t          z           }|D ]}|                    t	          |d                   |d	         |
                    d
d          t	          |
                    |d         d                    t'          |
                    dd                    t	          |d                              |
dk    }||                     d          _        | |                     d          _        |r@|                     dt*                                        d| j        dz    d|
 d|	 d           |=	 |                    |                    |                     d S # t          $ r Y d S w xY wd S )Nr  r   r   r   c                .    |                      dd          S r#  r%  )r   s    r"   r&  z)_TasksPane.refresh_data.<locals>.<lambda>  r'  r$   Tr(  r3   r   instructionr    r$  r   z#tasks-paginationz#tasks-dividerz#tasks-page-labelr/  r0  r1  r2  r9  )r   r   r   r   r   r   r   r   r   rk   r   r:  rm   rj   r;  r<  r=  r   r   r#   r>  r   r   r@  rA  )r5   rp   r   rC  r   r  r   r   	all_tasksrG  rH  
page_tasksr   rK  s                 r"   r   z_TasksPane.refresh_data  s   XX~y99"?Qe..u/?@@CDD    	%%''&( 	? 	?A%%	""C#.??3#:#:Q#>C LLNN11
 
 
	
 I!ej014CDD[1_55
tzJ6$*q.J9VVW
 	 	AMMAdG&	mR((KOOAdGQ//00lB//00$LL      &/6E*++37F3F'((0 	NN.77>>I
QII;II5III   !!e&9&9'&B&B!CCCCC    s#   -A& &
A32A3)K 
KKz#tasks-prevrP   rQ   c                h    | j         dk    r&| xj         dz  c_         |                                  d S d S rj  rk  rU   s     r"   rl  z_TasksPane._prev_page  rm  r$   z#tasks-nextc                   t                      }t          |                                          }t          d|t          z   dz
  t          z            }| j        |dz
  k     r&| xj        dz  c_        |                                  d S d S ro  )r   rj   rm   r;  r<  r   r   rp  s        r"   rq  z_TasksPane._next_page  s~    XXBLLNN##!ej014CDD:a''JJ!OJJ ('r$   z	#task-addc                H   |                      dt                    j                                        }|                      dt                    j                                        }|r|sd S t	          |          }|r|                     |d           d S t                      }|                    |          |                    ||           d|                      dt                    _        d|                      dt                    _        | 	                                 d S )N#task-name-input#task-instruction-inputerrorseverityr    )
r   r   r(   r  r   notifyr   get_task_by_nameadd_taskr   )r5   rP   r   r  errrp   s         r"   	_add_taskz_TasksPane._add_task  s   ~~0%88>DDFFnn%>FFLRRTT 	; 	F && 	KKgK...FXXt$$,KKk***:<)5117AC0%88>r$   z#task-updatec                x   t          |                     dt                              }|                     dt                    j                                        }|                     dt                    j                                        }||r|rt          |          }|r|                     |d           d S t                      	                    |||           d|                     dt                    _        d|                     dt                    _        | 
                                 d S d S d S d S )Nr  r  r  r  r  r    )r   r   r   r   r(   r  r   r  r   update_taskr   )r5   rP   r   r   r  r  s         r"   _update_taskz_TasksPane._update_task/  s   t~~niHHII~~0%88>DDFFnn%>FFLRRTT4K$T**C C'222HH  $<<<>@DNN-u55;EGDNN4e<<B r$   z#task-deletec                T                          dt                    }t          |          d S 	 t          |                    |j                  d                   }n# t          $ r d }Y nw xY wd fd} j                            t          d	| d
          |           d S )Nr  r   r  r  r  r   r@   c                    | rwt                                                     d                    dt                    _        d                    dt                    _                                         d S d S )Nr    r  r  )r   delete_taskr   r   r(   r   )r  r5   r   s    r"   r  z,_TasksPane._delete_task.<locals>._on_confirmI  ss     $$$W---BD1599?IK8%@@F!!#####	$ $r$   zDelete task "z<"?
All linked demonstrations will lose their task reference.r  r  )r5   rP   r   r   r  r   s   `    @r"   _delete_taskz_TasksPane._delete_task>  s    ~y99u%%?F	!u''(899!<==DD 	! 	! 	! w==DDD	!	$ 	$ 	$ 	$ 	$ 	$ 	$ 	cccc  		
 	
 	
 	
 	
r  r   r7   rY   )r+   r8   r9   rD   r6   r   r   r   r   r   r[   rl  rq  r  r  r  r\   r]   s   @r"   r   r     s}            G G G G   
   4 4 4 4l R&&      '& 
 R&&      '&  R$$   %$  R''      ('  R''
 
 
 ('
 
 
 
 
r$   r   N)r   r   r   r   )r%   r   )r   r   r   r   )/rZ   
__future__r   textualr   textual.appr   r   textual.containersr   r   textual.messager	   textual.screenr
   textual.widgetsr   r   r   r   r   r   r   r   r   r   raiden.db.databaser   r   raiden.recorderr   r<  r   r#   r-   r/   r  r<   r_   r|   r   r   r   r   r   r   r   r:   r$   r"   <module>r     s\   7 7 " " " " " "       * * * * * * * * 3 3 3 3 3 3 3 3 # # # # # # & & & & & &                        0 / / / / / / / . . . . . .
kb5 5 5 5   ": : : : : : : :    [&   2( ( ( ( (k ( ( (VB B B B B+ B B BJ   5 5 5 5 5C 5 5 5vn n n n nX n n nh       "LN LN LN LN LN( LN LN LNda
 a
 a
 a
 a
H a
 a
 a
NZ
 Z
 Z
 Z
 Z
 Z
 Z
 Z
 Z
 Z
r$   