Come si dovrebbe "annullare la digitazione"?

11

Sto implementando un'app Java che include uno stack Annulla / Ripristina. Ho notato che alcune app (come TextEdit su Mac OS X) ti permettono di scegliere "Annulla digitazione" dal menu Modifica dopo aver digitato del testo. Mi piacerebbe implementare questo genere di cose anche nella mia app, ma sto facendo davvero fatica a trovare le linee guida su come dovrebbe comportarsi.

Con alcune prove ed errori, la mia ipotesi migliore su come si comportano le operazioni di annullamento della scrittura di TextEdit è:

  • Quando l'utente digita un nuovo carattere (o digita il tasto cancella), uniscilo nel precedente elemento Annullamento digitazione se uno è nella parte superiore dello stack Annulla, a meno che non si verifichi una delle seguenti situazioni
  • Crea sempre un nuovo elemento Annulla digitazione dopo che l'utente continua a digitare dopo almeno 15 secondi di inattività
  • Crea sempre un nuovo elemento di annullamento della digitazione dopo che l'utente sta digitando per un lungo periodo di tempo e alcune condizioni sono soddisfatte (non è stato possibile capire se questo era basato sul tempo o basato sui caratteri).
  • Crea sempre una nuova voce Annulla digitazione quando un testo è selezionato e poi cancellato o sovrascritto (selezionando il testo, non apportando una modifica, quindi tornando al punto di inserimento originale e continuando a digitare non lo attiva)

In pratica, la strategia di Apple sembra funzionare (almeno funziona per me quando scrivo), ma come notato nell'ultimo punto, non sono stato in grado di capire le regole. Inoltre, sembra che altri programmi seguano regole diverse, come Microsoft Word. Google non ha presentato un elenco definito di regole per qualsiasi implementazione di Annulla digitazione e non ho trovato alcuna procedura ottimale su come dovrebbe comportarsi. Quindi come dovrebbe comportarsi? O è solo per i capricci del programmatore?

EDIT: giusto per chiarire, non sono interessato ai dettagli di implementazione in questo momento. Sono particolarmente curioso di sapere se esista o meno un riferimento autorevole (ad esempio, best practice o documento dell'interfaccia utente) che descrive questa o una descrizione di come è implementato su più prodotti.

    
posta Thunderforge 27.02.2013 - 04:50
fonte

2 risposte

5

Se stai cercando una fonte autorevole, penso che il miglior materiale relativo al Mac si trovi in Annulla Architettura di Apple.

Non penso che troverai una lista di regole su quando dovresti o non dovresti coalizzare gli eventi di annullamento, però. Ciò che sembra giusto per un'applicazione non ha necessariamente senso per un altro. Ad esempio, la combinazione di combinazioni di tasti ha senso in un editor di testo perché l'utente probabilmente vedrà la digitazione di un paragrafo come una singola azione e non come 539 azioni separate, e anche perché non si vuole che l'utente debba annullare 539 volte solo per ottenere al punto in cui erano prima che digitassero quel paragrafo. Ma che dire delle operazioni di spostamento su una forma in un programma di disegno? O aggiustamenti sequenziali a un colore di riempimento? Potresti fare un buon esempio di coalizione o meno, a seconda della natura del tuo programma.

Always create a new Undo Typing item after the user is typing for an extended period of time and some condition is met (couldn't figure out if this was time based or character count based).

È basato sul salvataggio automatico. Fortunatamente per te, il codice sorgente di TextEdit è disponibile e ben commentato. Penso che se dai un'occhiata, avrai una migliore idea di cosa sta succedendo e perché. Ad esempio:

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

So che hai detto che non sei ancora interessato ai dettagli di implementazione, ma guardando il modo in cui Apple ha implementato TextEdit puoi informare le decisioni che prendi per la tua applicazione.

    
risposta data 27.02.2013 - 12:44
fonte
1

su keydown - > timer che rappresenta il tuo idle inizia

su keydown / timer-running - > azzera timer

su keydown / no timer in esecuzione - > riaggiustare blocchi di celle per preparare un nuovo stato conservato come modifiche di posizione

il timer inattivo scade - > Stabilire un nuovo stato di annullamento

Non rintracciare le identità di keypress. Mi sono diviso in blocchi di testo cellulari (per numero di caratteri) che consentono di tracciare la posizione in base agli offset dalle posizioni iniziali della cella più vicina in modo da non dover salvare l'intero stato di un romanzo tolstoy ogni volta che viene eseguito un timer di inattività . Riaggiustare quegli offset quando le celle prima che altre celle vengano modificate è la parte difficile.

    
risposta data 27.02.2013 - 05:48
fonte

Leggi altre domande sui tag