Browse code

Implement more coherent behaviour when selecting with shift

Dario Rodriguez authored on 11/01/2022 15:20:32
Showing 1 changed files
... ...
@@ -85,6 +85,9 @@ typedef struct re_t {
85 85
         int headerdirty;
86 86
         int contentsdirty;
87 87
         int command_first_key;
88
+        int selstartactive;
89
+        int selstartline;
90
+        int selstartcol;
88 91
         int selactive;
89 92
         int sellinefrom,sellineto;
90 93
         int selcolfrom,selcolto;
... ...
@@ -350,6 +353,11 @@ fprintf(stderr,"RENDER\n");
350 353
                                                 do_exit=1;
351 354
                                         }
352 355
                                         break;
356
+                                case SDL_KEYUP:
357
+                                        if(event.key.keysym.sym==SDLK_RSHIFT || event.key.keysym.sym==SDLK_LSHIFT) {
358
+                                                re->selstartactive=0;
359
+                                        }
360
+                                        break;
353 361
                                 case SDL_KEYDOWN:
354 362
                                 case SDL_TEXTINPUT:
355 363
                                 case SDL_TEXTEDITING:
... ...
@@ -375,6 +383,11 @@ fprintf(stderr,"RENDER\n");
375 383
                                                 }
376 384
                                                 break;
377 385
                                         }
386
+                                        if(!re->viewonly && event.type==SDL_KEYDOWN && (event.key.keysym.sym==SDLK_RSHIFT || event.key.keysym.sym==SDLK_LSHIFT)) {
387
+                                                re->selstartactive=1;
388
+                                                re->selstartline=re->curline;
389
+                                                re->selstartcol=re->curcol;
390
+                                        }
378 391
                                         if(re->command==NULL || strcmp(re->command,COMMAND_WARNING)==0 || strcmp(re->command,COMMAND_INFO)==0)
379 392
                                                 re_processkey_editing(re,&event);
380 393
                                         else if(re->command[0]=='\0')
... ...
@@ -843,19 +856,24 @@ fprintf(stderr,"SDL_KEYDOWN: sym:%i\n",event->key.keysym.sym);
843 856
                 }
844 857
         } else if((event->key.keysym.sym==SDLK_LEFT || event->key.keysym.sym==SDLK_RIGHT)) {
845 858
                 int oldcol=re->curcol,oldline=re->curline;
846
-                if(re_moveleftright(re,(event->key.keysym.sym==SDLK_LEFT)?-1:1)==0 && (SDL_GetModState()&KMOD_SHIFT)!=0 && (re->curcol!=oldcol || re->curline!=oldline)) {
859
+                if(re_moveleftright(re,(event->key.keysym.sym==SDLK_LEFT)?-1:1)==0 && (SDL_GetModState()&KMOD_SHIFT)!=0 && (re->curcol!=oldcol || re->curline!=oldline))
847 860
                         re_sel_resize(re,oldcol,oldline,(event->key.keysym.sym==SDLK_LEFT)?-1:1);
848
-                }
849 861
         } else if((SDL_GetModState()&KMOD_CTRL)!=0 && (event->key.keysym.sym==SDLK_PAGEDOWN || event->key.keysym.sym==SDLK_PAGEUP)) {
850 862
                 long cursorpos;
863
+                int oldcol=re->curcol,oldline=re->curline;
851 864
                 cursorpos=(event->key.keysym.sym==SDLK_PAGEDOWN)?(redata_getused(re->data)-1):0;
852 865
                 cursorpos=(cursorpos<0)?0:cursorpos;
853 866
                 redata_pos2linecol(re->data,cursorpos,&(re->curline),&(re->curcol));
854 867
                 re_fixorigin_center(re);
868
+                if((SDL_GetModState()&KMOD_SHIFT)!=0 && (re->curcol!=oldcol || re->curline!=oldline))
869
+                        re_sel_resize(re,oldcol,oldline,(event->key.keysym.sym==SDLK_PAGEUP)?-1:1);
855 870
                 re->headerdirty=1;
856 871
                 re->contentsdirty=1;
857 872
         } else if(event->key.keysym.sym==SDLK_PAGEDOWN || event->key.keysym.sym==SDLK_PAGEUP) {
873
+                int oldcol=re->curcol,oldline=re->curline;
858 874
                 re_moveupdown(re,(event->key.keysym.sym==SDLK_PAGEUP)?-(re->maxrow):re->maxrow);
875
+                if((SDL_GetModState()&KMOD_SHIFT)!=0 && (re->curcol!=oldcol || re->curline!=oldline))
876
+                        re_sel_resize(re,oldcol,oldline,(event->key.keysym.sym==SDLK_PAGEUP)?-1:1);
859 877
         } else if(event->key.keysym.sym==SDLK_HOME || event->key.keysym.sym==SDLK_END) {
860 878
                 long newpos;
861 879
                 long cursorpos;
... ...
@@ -869,9 +887,8 @@ fprintf(stderr,"SDL_KEYDOWN: sym:%i\n",event->key.keysym.sym);
869 887
                 cursorpos=newpos;
870 888
                 if(redata_pos2linecol(re->data,cursorpos,NULL,&(re->curcol))==-1)
871 889
                         return(-1); /* couldn't get col of current pos */;
872
-                if((SDL_GetModState()&KMOD_SHIFT)!=0 && (re->curcol!=oldcol || re->curline!=oldline)) {
890
+                if((SDL_GetModState()&KMOD_SHIFT)!=0 && (re->curcol!=oldcol || re->curline!=oldline))
873 891
                         re_sel_resize(re,oldcol,oldline,(event->key.keysym.sym==SDLK_HOME)?-1:1);
874
-                }
875 892
                 re_fixorigin(re);
876 893
                 re->headerdirty=1;
877 894
                 re->contentsdirty=1;
... ...
@@ -1632,27 +1649,40 @@ re_sel_resize(re_t *re,int oldcol,int oldline,int direction)
1632 1649
 {
1633 1650
         if(re==NULL || oldcol<0 || oldline<0 || (direction!=-1 && direction!=1))
1634 1651
                 return(-1);
1635
-        if(direction==-1) {
1636
-                if(re->selactive==0) {
1637
-                        re_sel_setstart(re,re->curline,re->curcol);
1638
-                        re_sel_setend(re,oldline,oldcol);
1639
-                } else if(re_sel_lincolisafter(re,re->curline,re->curcol) || re_sel_lincolisinside(re,re->curline,re->curcol)) {
1640
-                        re_sel_setend(re,re->curline,re->curcol);
1652
+        if(re->selstartactive==0) {
1653
+                /* we don't know the start position, manage with the nifo we have */
1654
+                if(direction==-1) {
1655
+                        if(re->selactive==0) {
1656
+                                re_sel_setstart(re,re->curline,re->curcol);
1657
+                                re_sel_setend(re,oldline,oldcol);
1658
+                        } else if(re_sel_lincolisafter(re,re->curline,re->curcol) || re_sel_lincolisinside(re,re->curline,re->curcol)) {
1659
+                                re_sel_setend(re,re->curline,re->curcol);
1660
+                        } else {
1661
+                                re_sel_setstart(re,re->curline,re->curcol);
1662
+                        }
1641 1663
                 } else {
1642
-                        re_sel_setstart(re,re->curline,re->curcol);
1664
+                        if(re->selactive==0 || re_sel_lincolisbefore(re,oldline,oldcol)) {
1665
+                                re_sel_setstart(re,oldline,oldcol);
1666
+                                re_sel_setend(re,re->curline,re->curcol);
1667
+                        } else if(re_sel_lincolisinside(re,oldline,oldcol)) {
1668
+                                re_sel_setstart(re,re->curline,re->curcol);
1669
+                        } else {
1670
+                                re_sel_setend(re,re->curline,re->curcol);
1671
+                        }
1643 1672
                 }
1644 1673
         } else {
1645
-                if(re->selactive==0 || re_sel_lincolisbefore(re,oldline,oldcol)) {
1646
-                        re_sel_setstart(re,oldline,oldcol);
1647
-                        re_sel_setend(re,re->curline,re->curcol);
1648
-                } else if(re_sel_lincolisinside(re,oldline,oldcol)) {
1674
+                /* we know the start position, try to select accordingly */
1675
+                if(re->curline<re->selstartline || (re->curline==re->selstartline && re->curcol<=re->selstartcol)) {
1649 1676
                         re_sel_setstart(re,re->curline,re->curcol);
1677
+                        re_sel_setend(re,re->selstartline,re->selstartcol);
1650 1678
                 } else {
1679
+                        re_sel_setstart(re,re->selstartline,re->selstartcol);
1651 1680
                         re_sel_setend(re,re->curline,re->curcol);
1652 1681
                 }
1653 1682
         }
1654 1683
         if(re->sellinefrom==re->sellineto && re->selcolfrom==re->selcolto)
1655 1684
                 re->selactive=0;
1685
+
1656 1686
         return(0);
1657 1687
 }
1658 1688