Bagaimana Seharusnya "Undo Typing" Berperilaku?

12

Saya menerapkan aplikasi Java yang mencakup tumpukan Undo / Redo. Saya perhatikan bahwa beberapa aplikasi (seperti TextEdit di Mac OS X) memungkinkan Anda memilih "Undo Typing" dari Edit Menu setelah mengetik beberapa teks. Saya ingin menerapkan hal semacam itu ke dalam aplikasi saya juga, tetapi saya mengalami kesulitan menemukan pedoman tentang bagaimana seharusnya itu berlaku.

Dengan beberapa trial and error, tebakan terbaik saya tentang bagaimana perilaku Mengetik Undo TextEdit adalah:

  • Saat pengguna mengetik karakter baru (atau mengetik tombol hapus), gabungkan ke dalam item Penguraian Penguraian sebelumnya jika ada di bagian atas tumpukan Batalkan, kecuali salah satu situasi berikut terjadi
  • Selalu buat item Membatalkan Pengetikan baru setelah pengguna terus mengetik setelah setidaknya 15 detik tidak aktif
  • Selalu buat item Membatalkan Pengetikan baru setelah pengguna mengetik untuk periode waktu yang lama dan beberapa kondisi terpenuhi (tidak dapat mengetahui apakah ini berdasarkan waktu atau berdasarkan jumlah karakter).
  • Selalu buat item Membatalkan Pengetikan baru ketika teks apa pun dipilih dan kemudian dihapus atau ditimpa (memilih teks, tidak melakukan perubahan, kemudian kembali ke titik penyisipan asli dan melanjutkan mengetik tidak memicu ini)

Dalam praktiknya, strategi Apple tampaknya berhasil (setidaknya itu bekerja untuk saya ketika saya mengetik), tetapi seperti yang disebutkan pada poin terakhir, saya belum benar-benar bisa mengetahui aturannya. Selain itu, sepertinya program lain mengikuti aturan yang berbeda, seperti Microsoft Word. Google belum membuat daftar aturan yang ditetapkan untuk penerapan Undo Typing dan saya belum menemukan praktik terbaik apa pun tentang bagaimana seharusnya berperilaku. Jadi bagaimana seharusnya berperilaku? Atau hanya karena keinginan programmer?

EDIT: Hanya untuk memperjelas, saya tidak tertarik dengan detail implementasi sekarang. Saya sangat ingin tahu apakah ada referensi otoritatif (misalnya praktik terbaik atau dokumen antarmuka pengguna) yang menjelaskan hal ini atau deskripsi tentang cara penerapannya di berbagai produk.

Thunderforge
sumber
Saran saya: kompres modifikasi ke titik di mana masih mungkin untuk merekonstruksi urutan tepat dari tombol yang ditekan dari informasi undo, dan tidak lebih. Sebagai contoh, ini berarti bahwa jika pengguna mengetik sesuatu dan segera menggunakan backspace untuk menghapusnya, harus ada undo point di antaranya.
Ambroz Bizjak
Mungkin Anda juga bisa menambahkan "Undo Typing item" baru setiap kali pengguna membuat baris baru dan mungkin setiap kali bilah spasi digunakan segera setelah input karakter. IMO 15 detik dari waktu tunggu sebelum "Undo Typing item" baru mungkin agak lama tapi itu hanya aku. (Saya akan pergi sekitar 5 detik)
user82529
Atau mungkin "urutan tepat dari tombol yang ditekan" harus dilonggarkan ke "keadaan teks setelah setiap modifikasi". Idenya adalah untuk mencegah teks yang hilang karena kompresi.
Ambroz Bizjak
Sepertinya saya seperti TextEdit menggabungkan spasi dan menghapus dengan item Undo Typing terakhir, asalkan kondisi lain tidak terpenuhi. Jadi 124<delete>3, lalu membatalkan dan mengulang hasilnya 123. Saya kira keuntungannya adalah ini menghasilkan teks akhir dari pengguna, seperti saran di atas.
Thunderforge
Sudahkah Anda mencoba mencari Paten? (Aturan biasanya dikodekan dalam lapisan pustaka, tidak terkena kode pengguna.)
Donal Fellows

Jawaban:

5

Jika Anda mencari sumber yang berwibawa, saya pikir materi terkait Mac terbaik akan ditemukan dalam dokumen Undo Architecture dari Apple.

Saya tidak berpikir Anda akan menemukan daftar aturan tentang kapan Anda harus atau tidak seharusnya menyatu membatalkan acara. Apa yang terasa tepat untuk satu aplikasi belum tentu masuk akal untuk aplikasi lain. Misalnya, menggabungkan penekanan tombol masuk akal dalam editor teks karena pengguna mungkin akan melihat mengetik paragraf sebagai tindakan tunggal dan bukan sebagai 539 tindakan terpisah, dan juga karena Anda tidak ingin pengguna harus membatalkan 539 kali hanya untuk mendapatkan ke titik mereka sebelum mereka mengetik paragraf itu. Tetapi bagaimana dengan memindahkan operasi pada bentuk dalam program menggambar? Atau penyesuaian berurutan ke warna isi? Anda bisa membuat alasan yang bagus untuk ini digabungkan atau tidak, tergantung pada sifat program Anda.

Selalu buat item Membatalkan Pengetikan baru setelah pengguna mengetik untuk periode waktu yang lama dan beberapa kondisi terpenuhi (tidak dapat mengetahui apakah ini berdasarkan waktu atau berdasarkan jumlah karakter).

Ini didasarkan pada penyimpanan otomatis. Beruntung bagi Anda, kode sumber TextEdit tersedia dan berkomentar dengan baik. Saya pikir jika Anda melihatnya, Anda akan mendapatkan ide yang lebih baik tentang apa yang terjadi dan mengapa. Sebagai contoh:

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

Saya tahu Anda mengatakan Anda belum tertarik dengan detail implementasi, tetapi melihat cara Apple mengimplementasikan TextEdit dapat menginformasikan keputusan yang Anda buat untuk aplikasi Anda sendiri.

Caleb
sumber
1
Saya pikir saya akan menyatakan ini jawaban terbaik. Saya menghargai Anda memberikan tautan ke implementasi Apple dan juga beberapa kode untuk contoh spesifik yang saya berikan. Saya pikir Anda benar, umumnya didasarkan pada kebutuhan aplikasi dan tidak ada yang benar-benar berusaha untuk menstandarkan apa kebutuhan itu dan bagaimana mengatasinya.
Thunderforge
1

pada keydown -> timer yang mewakili idle Anda dimulai

saat keydown / timer-running -> reset timer

saat keydown / tidak ada timer-running -> mengatur ulang blok sel untuk mempersiapkan keadaan baru yang dipertahankan saat posisi berubah

idle-timer habis -> Tetapkan status undo baru

Saya tidak akan melacak identitas penekanan tombol. Saya akan memecah menjadi blok teks seluler (berdasarkan jumlah karakter) yang memungkinkan Anda melacak posisi dengan offset dari posisi awal sel terdekat sehingga Anda tidak harus menyimpan seluruh keadaan novel tolstoy setiap kali timer kosong berjalan ke bawah . Menyesuaikan ulang offset itu ketika sel sebelum sel lain diedit adalah bagian yang sulit.

Erik Reppen
sumber