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.
sumber
124<delete>3
, lalu membatalkan dan mengulang hasilnya123
. Saya kira keuntungannya adalah ini menghasilkan teks akhir dari pengguna, seperti saran di atas.Jawaban:
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.
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:
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.
sumber
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.
sumber