Wdrażam aplikację Java, która zawiera stos Cofnij / Ponów. Zauważyłem, że niektóre aplikacje (takie jak TextEdit w systemie Mac OS X) pozwalają wybrać opcję „Cofnij wpisywanie” z menu Edycja po wpisaniu tekstu. Chciałbym również zaimplementować tego rodzaju rzeczy w mojej aplikacji, ale bardzo trudno mi znaleźć wytyczne dotyczące tego, jak powinno się to zachowywać.
Z pewnymi próbami i błędami, moje najlepsze przypuszczenie o tym, jak zachowuje się funkcja Cofnij, to:
- Gdy użytkownik wpisze nowy znak (lub wpisze klawisz Delete), scal go z poprzednim elementem wpisywania Cofnij, jeśli znajduje się on na szczycie stosu Cofnij, chyba że wystąpi jedna z następujących sytuacji
- Zawsze twórz nowy element Cofnij, gdy użytkownik kontynuuje pisanie po co najmniej 15 sekundach bezczynności
- Zawsze twórz nowy element Cofnij wpisywanie po tym, jak użytkownik pisze przez dłuższy okres czasu i spełniony jest pewien warunek (nie mogę ustalić, czy był to czas, czy liczba znaków).
- Zawsze twórz nowy element Cofnij wpisywanie, gdy dowolny tekst jest zaznaczony, a następnie usunięty lub nadpisany (zaznaczenie tekstu, nie wprowadzanie zmian, a następnie powrót do pierwotnego punktu wstawiania i kontynuowanie pisania nie powoduje tego)
W praktyce strategia Apple wydaje się działać (przynajmniej działa na mnie, gdy piszę), ale jak zauważyłem w ostatnim punkcie, tak naprawdę nie byłem w stanie zrozumieć zasad. Wygląda na to, że inne programy stosują inne reguły, takie jak Microsoft Word. Google nie odkrył zdefiniowanej listy reguł dla jakiejkolwiek implementacji Cofnij Pisanie i nie natknąłem się na żadne najlepsze praktyki dotyczące tego, jak powinna się zachowywać. Jak więc powinien się zachowywać? A może zależy to tylko od kaprysu programisty?
EDYCJA: Żeby wyjaśnić, nie jestem teraz zainteresowany szczegółami implementacji. Jestem szczególnie ciekawy, czy istnieje wiarygodne odniesienie (np. Najlepsze praktyki lub dokument interfejsu użytkownika) opisujące to lub opis sposobu, w jaki jest on wdrażany w wielu produktach.
źródło
124<delete>3
cofnięcie i ponowienie powoduje123
. Myślę, że zaletą tego jest to, że skutkuje to końcowym stanem tekstu użytkownika, podobnie jak powyższa sugestia.Odpowiedzi:
Jeśli szukasz wiarygodnego źródła, myślę, że najlepszy materiał na Maca znajdziesz w dokumencie Undo Architecture od Apple.
Nie sądzę jednak, abyś znalazł listę reguł określających, kiedy powinieneś lub nie powinieneś łączyć cofania wydarzeń. To, co wydaje się odpowiednie dla jednej aplikacji, niekoniecznie ma sens dla innej. Na przykład koalescencja klawiszy ma sens w edytorze tekstu, ponieważ użytkownik prawdopodobnie zobaczy, że wpisanie akapitu jest pojedynczą akcją, a nie 539 oddzielnymi akcjami, a także dlatego, że nie chcesz, aby użytkownik musiał cofać 539 razy, aby uzyskać do tego stopnia, w jakim byli, zanim napisali ten akapit. Ale co z operacjami przenoszenia kształtu na programie do rysowania? A może sekwencyjne korekty koloru wypełnienia? Możesz uzasadnić ich połączenie lub nie, w zależności od charakteru twojego programu.
Opiera się na autozapisie. Na szczęście dla Ciebie kod źródłowy TextEdit jest dostępny i dobrze skomentowany. Myślę, że jeśli na to spojrzysz, zrozumiesz, co się dzieje i dlaczego. Na przykład:
Wiem, że powiedziałeś, że nie jesteś jeszcze zainteresowany szczegółami implementacji, ale patrząc na sposób, w jaki Apple wdrożył TextEdit, może wpływać na decyzje podejmowane w związku z własną aplikacją.
źródło
po keydown -> licznik czasu reprezentujący czas bezczynności
po keydown / timer-running -> reset timer
po keydown / no timer-running -> dostosuj bloki komórek, aby przygotować się do nowego zachowanego stanu wraz ze zmianą pozycji
Czas bezczynności wyczerpuje się -> Ustal nowy stan cofania
Nie śledziłbym tożsamości naciśnięć klawiszy. Podzielę się na komórkowe bloki tekstu (według liczby znaków), które pozwalają śledzić pozycję za pomocą przesunięć względem początkowych pozycji najbliższej komórki, abyś nie musiał zapisywać całego stanu powieści tolstoy za każdym razem, gdy upłynie czas bezczynności . Ponowne dostosowanie tych przesunięć, gdy komórki przed edycją innych komórek jest trudną częścią.
źródło