Browse code

More printout functionality: Add PageUp/PageDown movement, fill entire printout window regardless of selection size, show line numbers in printouts

Dario Rodriguez authored on 05/03/2022 18:26:22
Showing 1 changed files
... ...
@@ -332,6 +332,24 @@ fprintf(stderr,"RENDER\n");
332 332
                                         case SDL_KEYDOWN:
333 333
                                                 if(event.key.keysym.sym==SDLK_ESCAPE) {
334 334
                                                         re_delprint(re,i);
335
+                                                } if(event.key.keysym.sym==SDLK_DOWN || event.key.keysym.sym==SDLK_UP || event.key.keysym.sym==SDLK_PAGEDOWN || event.key.keysym.sym==SDLK_PAGEUP) {
336
+                                                        int neworiginline;
337
+                                                        int maxrow;
338
+                                                        int linetotal;
339
+                                                        maxrow=printout->ui->h/printout->ui->fontheight-1;
340
+                                                        neworiginline=printout->originline;
341
+                                                        neworiginline+=(event.key.keysym.sym==SDLK_UP)?-1:
342
+                                                                       (event.key.keysym.sym==SDLK_DOWN)?1:
343
+                                                                       (event.key.keysym.sym==SDLK_PAGEUP)?-maxrow:
344
+                                                                       (event.key.keysym.sym==SDLK_PAGEDOWN)?maxrow:
345
+                                                                       0;
346
+                                                        linetotal=redata_line_total((printout->data!=NULL)?printout->data:re->data);
347
+                                                        neworiginline=(neworiginline<0)?0:neworiginline;
348
+                                                        neworiginline=(neworiginline>linetotal)?linetotal:neworiginline;
349
+                                                        if(neworiginline==printout->originline)
350
+                                                                break; /* nothing to do, at top */
351
+                                                        printout->originline=neworiginline;
352
+                                                        printout->dirty=1;
335 353
                                                 } else if(event.key.keysym.sym==SDLK_DOWN || event.key.keysym.sym==SDLK_UP) {
336 354
                                                         if(event.key.keysym.sym==SDLK_UP && printout->originline==0)
337 355
                                                                 break; /* nothing to do, at top */
... ...
@@ -372,11 +390,22 @@ fprintf(stderr,"RENDER\n");
372 390
                                         if(re->viewonly && event.type==SDL_KEYDOWN) {
373 391
                                                 if(event.key.keysym.sym==SDLK_ESCAPE) {
374 392
                                                         do_exit=1;
375
-                                                } if(event.key.keysym.sym==SDLK_DOWN || event.key.keysym.sym==SDLK_UP) {
376
-                                                        if(event.key.keysym.sym==SDLK_UP && re->originline==0)
393
+                                                } if(event.key.keysym.sym==SDLK_DOWN || event.key.keysym.sym==SDLK_UP || event.key.keysym.sym==SDLK_PAGEDOWN || event.key.keysym.sym==SDLK_PAGEUP) {
394
+                                                        int neworiginline;
395
+                                                        int linetotal;
396
+                                                        neworiginline=re->originline;
397
+                                                        neworiginline+=(event.key.keysym.sym==SDLK_UP)?-1:
398
+                                                                       (event.key.keysym.sym==SDLK_DOWN)?1:
399
+                                                                       (event.key.keysym.sym==SDLK_PAGEUP)?-re->maxrow:
400
+                                                                       (event.key.keysym.sym==SDLK_PAGEDOWN)?re->maxrow:
401
+                                                                       0;
402
+                                                        linetotal=redata_line_total(re->data);
403
+                                                        neworiginline=(neworiginline<0)?0:neworiginline;
404
+                                                        neworiginline=(neworiginline>linetotal)?linetotal:neworiginline;
405
+                                                        if(neworiginline==re->originline)
377 406
                                                                 break; /* nothing to do, at top */
378
-                                                        re->originline+=((event.key.keysym.sym==SDLK_UP)?-1:1);
379
-                                                        re->curline+=((event.key.keysym.sym==SDLK_UP)?-1:1);
407
+                                                        re->curline+=(neworiginline-re->originline);
408
+                                                        re->originline=neworiginline;
380 409
                                                         re->headerdirty=1;
381 410
                                                         re->contentsdirty=1;
382 411
                                                 } else if(event.key.keysym.sym==SDLK_LEFT || event.key.keysym.sym==SDLK_RIGHT) {
... ...
@@ -1164,7 +1193,7 @@ fprintf(stderr,"SDL_KEYDOWN: BACKSPACE%s\n",(event==&fakeevent)?" (fake)":"");
1164 1193
                 if(re->usedselectbuf>0)
1165 1194
                         re_textinsert(re, re->selectbuf,re->usedselectbuf);
1166 1195
                 re->ignorenkeys++;
1167
-        } else if(re->selactive && event->key.keysym.sym==SDLK_p && (SDL_GetModState()&KMOD_CTRL)!=0) {
1196
+        } else if(/*re->selactive &&*/ event->key.keysym.sym==SDLK_p && (SDL_GetModState()&KMOD_CTRL)!=0) {
1168 1197
                 re_addprint(re);
1169 1198
         }
1170 1199
         return(0);
... ...
@@ -1900,7 +1929,7 @@ re_addprint(re_t *re)
1900 1929
         int i;
1901 1930
         long frompos,topos;
1902 1931
         int coldone;
1903
-        if(re==NULL || re->selactive==0)
1932
+        if(re==NULL)
1904 1933
                 return(-1);
1905 1934
         /* ensure space for the new printout */
1906 1935
         if(re->usedprints==re->sizeprints) {
... ...
@@ -1928,20 +1957,27 @@ re_addprint(re_t *re)
1928 1957
         }
1929 1958
         re->usedprints++;
1930 1959
         /* copy contents (and set clipboard contents and unselect)*/
1931
-        if(redata_linecol2pos(re->data,re->sellinefrom,re->selcolfrom,&frompos,NULL)==0
1932
-          && redata_linecol2pos(re->data,re->sellineto,re->selcolto,&topos,&coldone)==0) {
1933
-                re_selectbuf_fill(re,frompos,topos-frompos,re->selcolto-coldone);
1960
+        if(re->selactive) {
1961
+                if(redata_linecol2pos(re->data,re->sellinefrom,re->selcolfrom,&frompos,NULL)==0
1962
+                  && redata_linecol2pos(re->data,re->sellineto,re->selcolto,&topos,&coldone)==0) {
1963
+                        re_selectbuf_fill(re,frompos,topos-frompos,re->selcolto-coldone);
1964
+                        redata_op_add(re->prints[i].data,0,re->selectbuf,strlen(re->selectbuf),NULL);
1965
+                        SDL_SetClipboardText(re->selectbuf);
1966
+                        re_sel_toggle(re);
1967
+                        re->contentsdirty=1;
1968
+                }
1969
+        } else {
1970
+                re_selectbuf_fill(re,0,redata_getused(re->data),0);
1934 1971
                 redata_op_add(re->prints[i].data,0,re->selectbuf,strlen(re->selectbuf),NULL);
1935 1972
                 SDL_SetClipboardText(re->selectbuf);
1936
-                re_sel_toggle(re);
1937 1973
                 re->contentsdirty=1;
1938 1974
         }
1939 1975
 #else
1940 1976
 /* option B: printouts are a window into a fixed place of the file */
1941 1977
         re->prints[i].data=NULL;
1942
-        re->prints[i].originline=re->sellinefrom;
1978
+        re->prints[i].originline=(re->selactive)?re->sellinefrom:0;
1943 1979
         re->prints[i].origincol=0;
1944
-        re->prints[i].showonlyn=re->sellineto-re->sellinefrom+1;
1980
+        re->prints[i].showonlyn=0 /* (re->selactive)?re->sellineto-re->sellinefrom+1:0 */ ;
1945 1981
         re->usedprints++;
1946 1982
 #endif
1947 1983
         re->prints[i].dirty=1;
... ...
@@ -2169,6 +2205,9 @@ re_drawcontents(re_t *re, printout_t *printout)
2169 2205
         char matchingchar;
2170 2206
         int mline,mcol;
2171 2207
         int showonlyn;
2208
+        int flaglineno;
2209
+        int linenowidth;
2210
+        int linenosize;
2172 2211
         if(re==NULL || (printout!=NULL && printout->ui==NULL))
2173 2212
                 return(-1);
2174 2213
         /* init vars and clear screen */
... ...
@@ -2185,6 +2224,8 @@ re_drawcontents(re_t *re, printout_t *printout)
2185 2224
         maxcol=re->maxcol;
2186 2225
         maxrow=re->maxrow;
2187 2226
         showonlyn=0;
2227
+        flaglineno=0;
2228
+        linenosize=linenowidth=0;
2188 2229
         if(printout==NULL && re->viewonly==1) {
2189 2230
                 memset(&fakeprintout,0,sizeof(printout_t));
2190 2231
                 fakeprintout.ui=re->ui;
... ...
@@ -2204,10 +2245,14 @@ re_drawcontents(re_t *re, printout_t *printout)
2204 2245
                 maxcol=w/ui->fontwidth-1;
2205 2246
                 maxrow=h/ui->fontheight-1;
2206 2247
                 showonlyn=printout->showonlyn;
2248
+                flaglineno=1;
2249
+                linenosize=6;
2250
+                linenowidth=linenosize*ui->fontwidth+ui->fontwidth*3/2;
2251
+                x0+=linenowidth;
2207 2252
         }
2208 2253
         if(redata_linecol2pos(data,curline,curcol,&cursorpos,NULL)!=0)
2209 2254
                 return(0); /* error obtaining position */
2210
-        reui_fill(ui,x0,y0,w,h,"\xdf\xdf\xdf\xff");
2255
+        reui_fill(ui,x0-linenowidth,y0,w,h,"\xdf\xdf\xdf\xff");
2211 2256
         row=curline-originline;
2212 2257
         pos=cursorpos;
2213 2258
         /* get position/row/col of character at top left of screen */
... ...
@@ -2220,10 +2265,10 @@ re_drawcontents(re_t *re, printout_t *printout)
2220 2265
         }
2221 2266
         /* highlight current line (in printouts, highlight alternating lines) */
2222 2267
         if(printout==NULL) {
2223
-                reui_fill(ui,x0,y0+(curline-originline)*ui->fontheight,w,ui->fontheight+1,"\xef\xef\xef\xff");
2268
+                reui_fill(ui,x0-linenowidth,y0+(curline-originline)*ui->fontheight,w,ui->fontheight+1,"\xef\xef\xef\xff");
2224 2269
         } else {
2225 2270
                 for(y=y0+((printout->data==NULL)?1:(printout->originline%2))*ui->fontheight;y<(y0+h);y+=ui->fontheight*2)
2226
-                        reui_fill(ui,x0,y,w,ui->fontheight+1,"\xef\xef\xef\xff");
2271
+                        reui_fill(ui,x0-linenowidth,y,w,ui->fontheight+1,"\xef\xef\xef\xff");
2227 2272
         }
2228 2273
         /* highlight the selection */
2229 2274
         if(printout==NULL && re->selactive) {
... ...
@@ -2280,6 +2325,14 @@ re_drawcontents(re_t *re, printout_t *printout)
2280 2325
                 usedlenlinecolor=0;
2281 2326
                 lastcolor="\x00\x00\x00\xff";                      
2282 2327
                 in_error=0;
2328
+                if(flaglineno) {
2329
+                        int i,n;
2330
+                        char buf[2]={0};
2331
+                        for(i=linenosize,n=originline+row+1;i>=0;i--,n/=10) {
2332
+                                buf[0]=(n>0 || i==linenosize)?(n%10)+'0':' ';
2333
+                                reui_write(ui,x0-linenowidth+(i-1)*ui->fontwidth,y,"\x00\x00\x00\x2f",buf,1);
2334
+                        }
2335
+                }
2283 2336
                 /* draw each part of this line */
2284 2337
                 for(tmpcol=0,pos=realstart,availcol=0;tmpcol<(origincol+maxcol) && pos<=realend;pos=newpos+len,tmpcol+=availcol) {
2285 2338
                         int has_nl;