“Yazmayı Geri Al” Nasıl Davranmalıdır?


12

Bir Geri Al / Yinele yığını içeren bir Java uygulaması uyguluyorum. Bazı uygulamaların (Mac OS X'te TextEdit gibi), bazı metinleri yazdıktan sonra Düzen Menüsünden "Yazmayı Geri Al" ı seçmenize izin verdiğini fark ettim. Bu tür şeyleri de uygulamama uygulamak istiyorum, ancak nasıl davranması gerektiği konusunda yönergeler bulmakta gerçekten zorlanıyorum.

Bazı deneme yanılma yöntemiyle TextEdit'in Geri Almayı Yazma'nın nasıl davrandığına dair en iyi tahminim:

  • Kullanıcı yeni bir karakter yazdığında (veya silme anahtarını yazdığında), aşağıdaki durumlardan biri meydana gelmedikçe, Geri Al yığınının üstündeyse, önceki Yazmayı Geri Al öğesine birleştirin
  • Kullanıcı en az 15 saniye boyunca herhangi bir işlem yapılmadığında yazmaya devam ettikten sonra her zaman yeni bir Yazmayı Geri Al öğesi oluşturun
  • Kullanıcı uzun bir süre yazdıktan ve bazı koşullar sağlandıktan sonra her zaman yeni bir Geri Yazmayı Geri Al öğesi oluşturun (bunun zamana veya karakter sayısına dayalı olup olmadığını anlayamadık).
  • Herhangi bir metin seçilip silindiğinde veya üzerine yazıldığında her zaman yeni bir Yazmayı Geri Al öğesi oluşturun (metin seçme, değişiklik yapma, ardından orijinal ekleme noktasına dönme ve yazmaya devam etme bunu tetiklemez)

Uygulamada, Apple'ın stratejisi işe yarıyor gibi görünüyor (en azından yazdığımda benim için çalışıyor), ancak son noktaya göre, kuralları gerçekten anlayamadım. Ayrıca, diğer programlar Microsoft Word gibi farklı kurallara uyuyor gibi görünüyor. Google, Geri Al Yazma işlevinin herhangi bir uygulaması için tanımlanmış bir kurallar listesi göndermedi ve nasıl davranması gerektiği konusunda en iyi uygulamalarla karşılaşmadım. Peki nasıl davranmalı? Yoksa programcının kaprisine mi kalmış?

EDIT: Sadece açıklığa kavuşturmak için, şu anda uygulama ayrıntıları ile ilgilenmiyorum. Özellikle bunu açıklayan bir yetkili referansın (örneğin en iyi uygulamalar veya kullanıcı arayüzü belgesi) olup olmadığını veya birden fazla ürüne nasıl uygulandığının açıklamasını merak ediyorum.


Benim önerim: değişiklikleri, geri alınan bilgilerden basılan tuşların tam sırasını yeniden oluşturmanın mümkün olduğu noktaya sıkıştırın ve daha fazla değil. Örneğin, kullanıcı bir şey yazarsa ve onu silmek için hemen geri kullanırsa, aralarında bir geri alma noktası olması gerektiği anlamına gelir.
Ambroz Bizjak

Belki de kullanıcı her yeni satır oluşturduğunda yeni bir "Yazmayı Geri Al öğesi" ekleyebilir ve belki de karakterler girildikten hemen sonra boşluk çubuğu her kullanıldığında ekleyebilirsiniz. Yeni bir "Yazmayı Geri Al öğesi" nden önceki bekleme süresinin IMO'su biraz uzun olabilir ama bu sadece benim. (Yaklaşık 5 saniye boyunca
giderdim

Veya "basılan tuşların tam sırası", "her değişiklikten sonra metnin durumuna" gevşetilmelidir. Fikir, sıkıştırma nedeniyle herhangi bir metnin kaybolmasını önlemektir.
Ambroz Bizjak

Bana öyle geliyor ki TextEdit boşlukları birleştiriyor ve diğer koşulları karşılamıyorsa son Geri Almayı Geri Al öğesi ile siliniyor. Böylece 124<delete>3, geri alma ve yineleme ile sonuçlanır 123. Bunun avantajı, kullanıcının yukarıdaki öneride olduğu gibi metnin son durumuna yol açmasıdır.
Thunderforge

Henüz Patent aramayı denediniz mi? (Kurallar genellikle kullanıcı katmanına maruz kalmayan kütüphane katmanında kodlanır.)
Donal Fellows

Yanıtlar:


5

Yetkili bir kaynak arıyorsanız, Mac ile ilgili en iyi malzemenin Apple'dan Geri Al Mimarisi belgesinde bulunacağını düşünüyorum .

Gerçi geri alma olaylarını ne zaman birleştirmeniz gerektiği veya birleştirmemeniz gerektiğine dair bir kural listesi bulacağınızı sanmıyorum. Bir uygulama için doğru olan şey başka bir uygulama için mantıklı olmayacaktır. Örneğin, tuş vuruşlarını birleştirmek bir metin düzenleyicide mantıklıdır, çünkü kullanıcı muhtemelen bir paragraf yazmayı 539 ayrı eylem olarak değil, tek bir eylem olarak görecektir ve ayrıca kullanıcının sadece almak için 539 kez geri almasını istemediğiniz için bu paragrafı yazmadan önce bulundukları noktaya. Peki ya çizim programında şekil üzerinde hareket operasyonları? Veya dolgu renginde sıralı ayarlamalar? Programınızın niteliğine bağlı olarak bunların birleştirilmesi veya birleştirilmemesi için iyi bir durum ortaya koyabilirsiniz.

Kullanıcı uzun bir süre yazdıktan ve bazı koşullar sağlandıktan sonra her zaman yeni bir Geri Yazmayı Geri Al öğesi oluşturun (bunun zamana veya karakter sayısına dayalı olup olmadığını anlayamadık).

Otomatik kaydetmeyi temel alır. Şanslısınız, TextEdit kaynak kodu mevcut ve iyi yorumlanmış. Sanırım ona bir bakarsanız, neler olup bittiğine dair daha iyi bir fikir edineceksiniz. Örneğin:

- (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)];
 ...

Henüz uygulama ayrıntılarıyla ilgilenmediğinizi söylediğinizi biliyorum, ancak Apple'ın TextEdit'i uygulama biçimine bakarak kendi uygulamanız için verdiğiniz kararları bilgilendirebilir.


1
Sanırım bunu en iyi cevap olarak ilan edeceğim. Apple'ın uygulamasına bağlantı verdiğiniz için teşekkür ederim ve sağladığım belirli örnek için bazı kodlar verdiğiniz için teşekkür ederim. Yine de haklı olduğunuzu düşünüyorum, genellikle uygulamanın ihtiyaçlarına dayanıyor ve kimse bu ihtiyaçların ne olduğunu ve nasıl ele alınacağını standartlaştırmak için gerçekten çaba göstermedi.
Thunderforge

1

keydown üzerinde -> zamanlayıcısı boşta başlar temsil

tuş kilidi / zamanlayıcı çalışırken -> zamanlayıcıyı sıfırla

açıldığında / zamanlayıcı çalışmıyor -> konum değiştikçe yeni bir korunmuş duruma hazırlanmak için hücre bloklarını yeniden ayarlayın

boşta kalma süresi azalıyor -> Yeni bir geri alma durumu oluşturma

Tuşa basma kimliklerini takip etmem. Boş bir zamanlayıcı her çalıştığında bir tolstoy romanının tüm durumunu kaydetmek zorunda kalmamanız için konumu en yakın hücrenin başlangıç ​​konumlarından ofsetlerle izlemenizi sağlayan hücresel metin bloklarına (karakter sayısına göre) bölünürdüm . Diğer hücreler düzenlenmeden önceki hücreler zor olduğunda bu ofsetleri yeniden ayarlamak zor.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.