Approval-Correlation: 0543bb321a84cb936bc0ac4988615840
Plan-SHA256: 437a85f68d151ed4db780511812834041cfec5e7cf021fb77e238d5a6196e6fb
Base-SHA: 256be64ac7
39 lines
1.5 KiB
Markdown
39 lines
1.5 KiB
Markdown
# 인터페이스 계약
|
|
|
|
## 메시지 제출 이벤트
|
|
|
|
Textual의 `Input.Submitted` 이벤트가 `#user-input`에서 발생하면 `ChatApp.on_input_submitted`가 처리한다.
|
|
|
|
### 입력 정규화
|
|
|
|
1. 이벤트의 `value`에 `strip()`을 적용한다.
|
|
2. 입력 위젯의 값을 빈 문자열로 초기화한다.
|
|
3. 정규화 결과가 빈 문자열이면 추가 처리를 중단한다.
|
|
|
|
공백만 포함한 입력은 사용자 메시지, 응답 선택, 대화 항목을 생성하지 않는다.
|
|
|
|
### 유효한 입력 처리
|
|
|
|
정규화 결과가 비어 있지 않으면 다음 순서로 처리한다.
|
|
|
|
1. 정규화된 사용자 메시지를 `submitted_inputs`에 추가한다.
|
|
2. `random.choice(RESPONSE_MESSAGES)`로 응답을 선택한다.
|
|
3. 선택 응답을 `selected_responses`에 추가한다.
|
|
4. 대화 영역에 사용자 메시지 `Label`을 추가한다.
|
|
5. 바로 이어서 응답 `Label`을 추가한다.
|
|
6. 대화 영역을 마지막 항목까지 스크롤한다.
|
|
|
|
사용자 메시지와 응답은 별도 대화 항목이며, 화면 표시 순서는 항상 사용자 메시지 다음 응답이다.
|
|
|
|
## 화면 위젯 계약
|
|
|
|
- 대화 영역은 `#conversation` 식별자의 `VerticalScroll`이다.
|
|
- 입력창은 `#user-input` 식별자의 `Input`이다.
|
|
- 사용자 메시지는 `user-message` 클래스를 사용한다.
|
|
- 응답은 `response-message` 클래스를 사용한다.
|
|
- 애플리케이션 마운트 시 입력창에 포커스를 둔다.
|
|
|
|
## 종료 계약
|
|
|
|
`Escape`와 `Ctrl+Q`는 기존 `quit` 바인딩을 통해 애플리케이션 종료를 요청한다.
|