Browse code

Have the UI use the undo facilities of re_data.c when Ctrl-Z is pressed

Dario Rodriguez authored on 26/09/2020 21:23:03
Showing 4 changed files
... ...
@@ -1152,46 +1152,58 @@ redata_op_move(redata_t *redata, long posorig, long size, long posdest, undostac
1152 1152
 }
1153 1153
 
1154 1154
 int
1155
-redata_op_undo(redata_t *redata)
1155
+redata_op_undo(redata_t *redata, long *newcursorpos)
1156 1156
 {
1157 1157
         undo_t *undo;
1158
+        long newpos=0;
1158 1159
         if(redata==NULL
1159 1160
           || redata->undostack.usedundo<1)
1160 1161
                 return(-1); /* sanity check failed */
1161 1162
         undo=redata->undostack.undo+redata->undostack.usedundo-1;
1162 1163
         if(undo->type=='A') { /* ADD */
1164
+                newpos=undo->posorig;
1163 1165
                 redata_op_del(redata,undo->posorig,undo->len,&(redata->undostack));
1164 1166
         } else if(undo->type=='D') { /* DEL */
1167
+                newpos=undo->posorig+undo->len;
1165 1168
                 redata_op_add(redata,undo->posorig,redata->undostack.buf+undo->off,undo->len,&(redata->undostack));
1166 1169
         } else if(undo->type=='M') { /* MOVE */
1170
+                newpos=undo->posorig+undo->len;
1167 1171
                 if(undo->posorig<undo->posdest)
1168 1172
                         redata_op_move(redata,undo->posdest-undo->len, undo->len, undo->posorig,&(redata->undostack));
1169 1173
                 else
1170 1174
                         redata_op_move(redata,undo->posdest, undo->len, undo->posorig+undo->len,&(redata->undostack));
1171 1175
         } else
1172 1176
                 return(-1); /* unknown operation */
1177
+        if(newcursorpos!=NULL)
1178
+                *newcursorpos=newpos;
1173 1179
 #warning TODO: Is it neccessary to do an unadd to the plugins?
1174
-        return(-1);
1180
+        return(0);
1175 1181
 }
1176 1182
 
1177 1183
 int
1178
-redata_op_redo(redata_t *redata)
1184
+redata_op_redo(redata_t *redata, long *newcursorpos)
1179 1185
 {
1180 1186
         undo_t *undo;
1187
+        long newpos;
1181 1188
         if(redata==NULL
1182 1189
           || redata->redostack.usedundo<1)
1183 1190
                 return(-1); /* sanity check failed */
1184 1191
         undo=redata->redostack.undo+redata->redostack.usedundo-1;
1185 1192
         if(undo->type=='A') { /* ADD */
1193
+                newpos=undo->posorig+undo->len;
1186 1194
                 redata_op_add(redata,undo->posorig,redata->redostack.buf+undo->off,undo->len,&(redata->redostack));
1187 1195
         } else if(undo->type=='D') { /* DEL */
1196
+                newpos=undo->posorig;
1188 1197
                 redata_op_del(redata,undo->posorig,undo->len,&(redata->redostack));
1189 1198
         } else if(undo->type=='M') { /* MOVE */
1199
+                newpos=undo->posorig+undo->len;
1190 1200
                 redata_op_move(redata,undo->posorig, undo->len, undo->posdest,&(redata->redostack));
1191 1201
         } else
1192 1202
                 return(-1); /* unknown operation */
1193 1203
 #warning TODO: Is it neccessary to do an unadd to the plugins?
1194
-        return(-1);
1204
+        if(newcursorpos!=NULL)
1205
+                *newcursorpos=newpos;
1206
+        return(0);
1195 1207
 }
1196 1208
 
1197 1209
 int
... ...
@@ -1679,7 +1691,7 @@ redata_pos2linecol(redata_t *redata, long pos, int *resline, int *rescol)
1679 1691
 int
1680 1692
 redata_linecol2pos(redata_t *redata, int line, int colrequest, long *pos, int *coldone)
1681 1693
 {
1682
-        long chunkpos,realstart,newpos,curpos,startpos;
1694
+        long chunkpos,realstart,curpos,startpos;
1683 1695
         int startline;
1684 1696
         int nchunk;
1685 1697
         rechunk_t *chunk;
... ...
@@ -126,8 +126,8 @@ int redata_op_add(redata_t *redata, long pos, char *buf, long buflen, undostack_
126 126
 int redata_op_addn(redata_t *redata, long pos, char character, long n, undostack_t *fromhere);
127 127
 int redata_op_del(redata_t *redata, long pos, long size, undostack_t *fromhere);
128 128
 int redata_op_move(redata_t *redata, long posorig, long size, long posdest, undostack_t *fromhere);
129
-int redata_op_undo(redata_t *redata);
130
-int redata_op_redo(redata_t *redata);
129
+int redata_op_undo(redata_t *redata, long *newcursorpos);
130
+int redata_op_redo(redata_t *redata, long *newcursorpos);
131 131
 
132 132
 int redata_data_compare(redata_t *redata, long pos, char *buf, long buflen);
133 133
 
... ...
@@ -329,7 +329,7 @@ if(k!=0) redata_save(redata,"test.post");
329 329
                                         errorbuf[sizeof(errorbuf)-1]='\0';
330 330
                                         return(errorbuf);
331 331
                                 }
332
-                                redata_op_undo(redata);
332
+                                redata_op_undo(redata,NULL);
333 333
 redata_save(redata,"test.undo");
334 334
                                 redata_hash(redata,hash129_redata);
335 335
                                 if(strcmp(hash129_redata,hash129_memold)!=0) {
... ...
@@ -340,7 +340,7 @@ redata_save(redata,"test.undo");
340 340
                                         errorbuf[sizeof(errorbuf)-1]='\0';
341 341
                                         return(errorbuf);
342 342
                                 }
343
-                                redata_op_redo(redata);
343
+                                redata_op_redo(redata,NULL);
344 344
 redata_save(redata,"test.redo");
345 345
                                 redata_hash(redata,hash129_redata);
346 346
                                 if(strcmp(hash129_redata,hash129_mem)!=0) {
... ...
@@ -412,6 +412,21 @@ fprintf(stderr,"SDL_KEYDOWN: sym:%i\n",event->key.keysym.sym);
412 412
 fprintf(stderr,"re_processkey(): received Control+q\n");
413 413
                 re->command="";
414 414
                 re->headerdirty=1;
415
+        } else if(event->key.keysym.sym==SDLK_z && (SDL_GetModState()&KMOD_CTRL)!=0) {
416
+                long newpos;
417
+                int oldline;
418
+fprintf(stderr,"re_processkey(): received Control+z\n");
419
+                if(redata_op_undo(re->data,&newpos))
420
+                        return(-1);
421
+                re->cursorpos=newpos;
422
+                redata_pos2linecol(re->data,re->cursorpos,&(re->curline),&(re->curcol));
423
+                if(re->curline<re->originline || re->curline>=(re->originline+re->maxrow)) {
424
+                        re->originline=re->curline-(re->maxrow/2);
425
+                        re->originline=(re->originline<0)?0:re->originline;
426
+                }
427
+                re->origincol=(re->curcol>(re->maxcol-COLFORCESCROLL))?(re->curcol-(re->maxcol-COLFORCESCROLL)):0;
428
+                re->headerdirty=1;
429
+                re->contentsdirty=1;
415 430
         }
416 431
         return(0);
417 432
 }