"입력 취소"는 어떻게 작동합니까?


12

실행 취소 / 다시 실행 스택이 포함 된 Java 앱을 구현하고 있습니다. 일부 응용 프로그램 (예 : Mac OS X의 TextEdit)에서는 일부 텍스트를 입력 한 후 편집 메뉴에서 "입력 취소"를 선택할 수 있습니다. 그런 종류의 일을 내 응용 프로그램에도 구현하고 싶지만 작동 방법에 대한 지침을 찾는 데 어려움을 겪고 있습니다.

시행 착오를 겪으면서 TextEdit의 Undo Typing이 어떻게 작동하는지에 대한 최선의 추측은 다음과 같습니다.

  • 사용자가 새 문자를 입력 할 때 (또는 삭제 키를 입력 할 때) 다음 중 하나가 발생하지 않는 한 실행 취소 스택의 맨 위에 있으면 이전 실행 취소 입력 항목으로 병합합니다.
  • 15 초 이상 활동이 없으면 사용자가 입력을 계속 한 후 항상 새로운 입력 취소 항목을 작성하십시오
  • 사용자가 장시간 입력 한 후 일부 조건이 충족 된 후 항상 새로운 입력 취소 입력 항목을 작성하십시오 (시간 기반인지 문자 수 기반인지 파악할 수 없음).
  • 텍스트를 선택한 다음 삭제하거나 덮어 쓸 때 항상 새로운 입력 취소 입력 항목을 만듭니다 (텍스트를 선택하고 변경하지 않은 다음 원래 삽입 점으로 돌아가서 계속 입력해도이 트리거되지 않음)

실제로 Apple의 전략은 효과가있는 것 같지만 (적어도 입력하면 효과가 있습니다) 마지막 시점에서 언급했듯이 실제로 규칙을 파악할 수 없었습니다. 또한 다른 프로그램이 Microsoft Word와 같은 다른 규칙을 따르는 것처럼 보입니다. Google은 Undo Typing 구현에 대해 정의 된 규칙 목록을 작성하지 않았으며 동작 방식에 대한 모범 사례를 보지 못했습니다. 어떻게 동작해야합니까? 아니면 프로그래머의 변덕에 달려 있습니까?

편집 : 명확히하기 위해 지금 구현 세부 사항에 관심이 없습니다. 권위있는 참조 (예 : 모범 사례 또는 사용자 인터페이스 문서)가이 설명 또는 여러 제품에서 구현되는 방법에 대한 설명이 있는지 여부에 대해 특히 궁금합니다.


내 제안 : 실행 취소 정보에서 누른 일련의 정확한 키를 재구성 할 수있는 지점까지 수정 사항을 압축하십시오. 예를 들어, 사용자가 무언가를 입력하고 즉시 백 스페이스를 사용하여 삭제하면 실행 취소 지점이 있어야합니다.
Ambroz Bizjak

사용자가 새 줄을 만들 때마다 그리고 문자 입력 직후 스페이스 바가 사용될 때마다 새로운 "입력 항목 실행 취소"를 추가 할 수도 있습니다. 새로운 "입력 취소 항목"이 표시되기까지 15 초 동안 대기하는 IMO는 조금 길지만 그저 나뿐입니다. (나는 약 5 초 동안 갈 것이다)
user82529

또는 "누른 키의 정확한 순서"를 "각 수정 후 텍스트 상태"로 완화해야합니다. 압축으로 인해 텍스트가 손실되는 것을 방지하는 것이 좋습니다.
Ambroz Bizjak

다른 조건이 충족되지 않으면 TextEdit이 공백을 병합하고 마지막 실행 취소 입력 항목과 삭제하는 것처럼 보입니다. 따라서 실행 124<delete>3취소 및 다시 실행하면 결과가 나타납니다 123. 이것의 장점은 위의 제안과 같이 사용자의 최종 텍스트 상태가된다는 것입니다.
Thunderforge

아직 특허 검색을 시도 했습니까? (규칙은 일반적으로 사용자 코드에 노출되지 않은 라이브러리의 층으로 인코딩된다.)
DONAL 동지

답변:


5

권위있는 소스를 찾고 있다면, Mac의 Undo Architecture 문서에서 최고의 Mac 관련 자료를 찾을 수있을 것 입니다.

그러나 언두 이벤트를 통합해야 할 때와하지 말아야 할 때에 대한 규칙 목록을 찾지 못할 것이라고 생각합니다. 한 응용 프로그램에 적합한 느낌이 다른 응용 프로그램에 반드시 적합한 것은 아닙니다. 예를 들어, 통합 키 스트로크는 텍스트 편집기에서 의미가 있습니다. 사용자는 단락을 539 개의 개별 작업이 아닌 단일 작업으로 입력하는 것을 보게 될 것입니다. 그들이 그 문단을 입력하기 전의 시점까지 그러나 드로잉 프로그램에서 도형에 대한 이동 작업은 어떻습니까? 또는 채우기 색상을 순차적으로 조정합니까? 당신은 프로그램의 특성에 따라 이것들이 합쳐 지거나 그렇지 않은 것에 대해 좋은 사례를 만들 수 있습니다.

사용자가 장시간 입력 한 후 일부 조건이 충족 된 후 항상 새로운 입력 취소 입력 항목을 작성하십시오 (시간 기반인지 문자 수 기반인지 파악할 수 없음).

자동 저장을 기반으로합니다. 운 좋게도 TextEdit 소스 코드를 사용할 수 있으며 주석이 잘 달렸습니다. 나는 당신이 그것을 보면, 무슨 일이 일어나고 있는지에 대한 더 나은 아이디어를 얻을 것이라고 생각합니다. 예를 들면 다음과 같습니다.

- (void)saveToURL:(NSURL *)absoluteURL ofType:(NSString *)typeName forSaveOperation:(NSSaveOperationType)saveOperation completionHandler:(void (^)(NSError *error))handler {
    // Note that we do the breakUndoCoalescing call even during autosave, which 
    // means the user's undo of long typing will take them back to the last spot an 
    // autosave occured. This might seem confusing, and a more elaborate solution may 
    // be possible (cause an autosave without having to breakUndoCoalescing), but since 
    // this change is coming late in Leopard, we decided to go with the lower risk fix.
    [[self windowControllers] makeObjectsPerformSelector:@selector(breakUndoCoalescing)];
 ...

아직 구현 세부 사항에 관심이 없다고 말했지만 Apple이 TextEdit을 구현 한 방식을 살펴보면 자신의 응용 프로그램에 대한 결정을 내릴 수 있습니다.


1
나는 이것이 최선의 대답이라고 선언 할 것이라고 생각합니다. Apple의 구현에 대한 링크와 내가 제공 한 특정 예제에 대한 코드를 제공해 주셔서 감사합니다. 나는 당신이 옳다고 생각합니다. 그것은 일반적으로 응용 프로그램의 요구를 기반으로하며 아무도 그 요구가 무엇인지, 어떻게 해결 해야하는지 표준화하려고 아무도 노력하지 않았습니다.
Thunderforge

1

키 다운시 -> 유휴 시작을 나타내는 타이머

키 다운 / 타이머 실행시 -> 타이머 재설정

키 다운 / 타이머 실행 없음 -> 위치가 변경되면 새로운 보존 상태를 준비하기 위해 셀 블록을 다시 조정하십시오.

유휴 타이머가 종료 됨 -> 새로운 실행 취소 상태 설정

키 누르기 ID를 추적하지 않습니다. 가장 가까운 셀의 시작 위치에서 오프셋으로 위치를 추적 할 수있는 셀룰러 텍스트 블록 (문자 수 기준)으로 분할 했으므로 유휴 타이머가 종료 될 때마다 톨스토이 소설의 전체 상태를 저장할 필요가 없습니다 . 다른 셀보다 먼저 셀을 편집 할 때 해당 오프셋을 다시 조정하는 것은 까다로운 부분입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.