this repo has no description
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

added ctrl+d to duplicate line and dbl click to select word in the code editor #1870

nesbox e06a577b a9f22dfa

+84 -15
+52 -12
src/studio/editors/code.c
··· 756 756 } 757 757 } 758 758 759 - static void leftWord(Code* code) 759 + static char* leftWordPos(Code* code) 760 760 { 761 761 const char* start = code->src; 762 - char* pos = code->cursor.position-1; 762 + char* pos = code->cursor.position - 1; 763 763 764 764 if(pos > start) 765 765 { 766 766 if(isalnum_(*pos)) while(pos > start && isalnum_(*(pos-1))) pos--; 767 767 else while(pos > start && !isalnum_(*(pos-1))) pos--; 768 + return pos; 769 + } 768 770 769 - code->cursor.position = pos; 771 + return code->cursor.position; 772 + } 770 773 771 - updateColumn(code); 772 - } 774 + static void leftWord(Code* code) 775 + { 776 + code->cursor.position = leftWordPos(code); 777 + updateColumn(code); 773 778 } 774 779 775 - static void rightWord(Code* code) 780 + static char* rightWordPos(Code* code) 776 781 { 777 782 const char* end = code->src + strlen(code->src); 778 783 char* pos = code->cursor.position; ··· 782 787 if(isalnum_(*pos)) while(pos < end && isalnum_(*pos)) pos++; 783 788 else while(pos < end && !isalnum_(*pos)) pos++; 784 789 785 - code->cursor.position = pos; 786 - updateColumn(code); 787 790 } 791 + 792 + return pos; 793 + } 794 + 795 + static void rightWord(Code* code) 796 + { 797 + code->cursor.position = rightWordPos(code); 798 + updateColumn(code); 788 799 } 789 800 790 801 static void goHome(Code* code) ··· 842 853 memmove(getState(code, start), getState(code, end), size * sizeof(CodeState)); 843 854 } 844 855 845 - static void insertCode(Code* code, char* dst, const char* src) 856 + static void insertCodeSize(Code* code, char* dst, const char* src, s32 size) 846 857 { 847 - s32 size = (s32)strlen(src); 848 858 s32 restSize = (s32)strlen(dst) + 1; 849 859 memmove(dst + size, dst, restSize); 850 860 memcpy(dst, src, size); ··· 855 865 memmove(pos + size, pos, restSize * sizeof(CodeState)); 856 866 memset(pos, 0, size * sizeof(CodeState)); 857 867 } 868 + } 869 + 870 + static void insertCode(Code* code, char* dst, const char* src) 871 + { 872 + insertCodeSize(code, dst, src, strlen(src)); 858 873 } 859 874 860 875 static bool replaceSelection(Code* code) ··· 1489 1504 } 1490 1505 else addCommentToLine(code, getLine(code), size, comment); 1491 1506 } 1507 + 1508 + static void dupLine(Code* code) 1509 + { 1510 + char *start = getLine(code); 1511 + if(*start) 1512 + { 1513 + s32 size = getLineSize(start) + 1; 1514 + 1515 + insertCodeSize(code, start, start, size); 1516 + 1517 + code->cursor.position += size; 1518 + 1519 + history(code); 1520 + parseSyntaxColor(code); 1521 + updateEditor(code); 1522 + } 1523 + } 1524 + 1492 1525 static bool goPrevBookmark(Code* code, char* ptr) 1493 1526 { 1494 1527 const CodeState* state = getState(code, ptr); ··· 1611 1644 else if(keyWasPressed(code->studio, tic_key_n)) downLine(code); 1612 1645 else if(keyWasPressed(code->studio, tic_key_p)) upLine(code); 1613 1646 else if(keyWasPressed(code->studio, tic_key_e)) endLine(code); 1647 + else if(keyWasPressed(code->studio, tic_key_d)) dupLine(code); 1614 1648 else if(keyWasPressed(code->studio, tic_key_slash)) commentLine(code); 1615 1649 else if(keyWasPressed(code->studio, tic_key_home)) goCodeHome(code); 1616 1650 else if(keyWasPressed(code->studio, tic_key_end)) goCodeEnd(code); ··· 1660 1694 1661 1695 if(checkMousePos(code->studio, &rect)) 1662 1696 { 1663 - bool useDrag = (code->mode == TEXT_DRAG_CODE && checkMouseDown(code->studio, &rect, tic_mouse_left)) || checkMouseDown(code->studio, &rect, tic_mouse_right); 1697 + bool useDrag = (code->mode == TEXT_DRAG_CODE && checkMouseDown(code->studio, &rect, tic_mouse_left)) 1698 + || checkMouseDown(code->studio, &rect, tic_mouse_right); 1664 1699 setCursor(code->studio, code->mode == TEXT_DRAG_CODE || useDrag ? tic_cursor_hand : tic_cursor_ibeam); 1665 1700 1666 1701 if(code->scroll.active) ··· 1685 1720 } 1686 1721 else 1687 1722 { 1688 - if(checkMouseDown(code->studio, &rect, tic_mouse_left)) 1723 + if(checkMouseDblClick(code->studio, &rect, tic_mouse_left)) 1724 + { 1725 + code->cursor.selection = leftWordPos(code); 1726 + code->cursor.position = rightWordPos(code); 1727 + } 1728 + else if(checkMouseDown(code->studio, &rect, tic_mouse_left)) 1689 1729 { 1690 1730 s32 mx = tic_api_mouse(tic).x; 1691 1731 s32 my = tic_api_mouse(tic).y;
+31 -3
src/studio/studio.c
··· 94 94 bool down; 95 95 bool click; 96 96 97 + struct 98 + { 99 + s32 start; 100 + s32 ticks; 101 + bool click; 102 + } dbl; 103 + 97 104 tic_point start; 98 105 tic_point end; 106 + 99 107 100 108 } MouseState; 101 109 ··· 1290 1298 return value; 1291 1299 } 1292 1300 1301 + bool checkMouseDblClick(Studio* studio, const tic_rect* rect, tic_mouse_btn button) 1302 + { 1303 + MouseState* state = &studio->mouse.state[button]; 1304 + 1305 + bool value = state->dbl.click 1306 + && pointInRect(&state->start, rect) 1307 + && pointInRect(&state->end, rect); 1308 + 1309 + if(value) state->dbl.click = false; 1310 + 1311 + return value; 1312 + } 1313 + 1293 1314 bool checkMouseDown(Studio* studio, const tic_rect* rect, tic_mouse_btn button) 1294 1315 { 1295 1316 MouseState* state = &studio->mouse.state[button]; ··· 2030 2051 static void processMouseStates(Studio* studio) 2031 2052 { 2032 2053 for(s32 i = 0; i < COUNT_OF(studio->mouse.state); i++) 2033 - studio->mouse.state[i].click = false; 2054 + studio->mouse.state[i].dbl.click = studio->mouse.state[i].click = false; 2034 2055 2035 2056 tic_mem* tic = studio->tic; 2036 2057 ··· 2041 2062 { 2042 2063 MouseState* state = &studio->mouse.state[i]; 2043 2064 2044 - if(!state->down && (tic->ram->input.mouse.btns & (1 << i))) 2065 + s32 down = tic->ram->input.mouse.btns & (1 << i); 2066 + 2067 + if(!state->down && down) 2045 2068 { 2046 2069 state->down = true; 2047 2070 state->start = tic_api_mouse(tic); 2048 2071 } 2049 - else if(state->down && !(tic->ram->input.mouse.btns & (1 << i))) 2072 + else if(state->down && !down) 2050 2073 { 2051 2074 state->end = tic_api_mouse(tic); 2052 2075 2053 2076 state->click = true; 2054 2077 state->down = false; 2078 + 2079 + state->dbl.click = state->dbl.ticks - state->dbl.start < 1000 / TIC80_FRAMERATE; 2080 + state->dbl.start = state->dbl.ticks; 2055 2081 } 2082 + 2083 + state->dbl.ticks++; 2056 2084 } 2057 2085 } 2058 2086
+1
src/studio/studio.h
··· 179 179 180 180 bool checkMousePos(Studio* studio, const tic_rect* rect); 181 181 bool checkMouseClick(Studio* studio, const tic_rect* rect, tic_mouse_btn button); 182 + bool checkMouseDblClick(Studio* studio, const tic_rect* rect, tic_mouse_btn button); 182 183 bool checkMouseDown(Studio* studio, const tic_rect* rect, tic_mouse_btn button); 183 184 184 185 void drawToolbar(Studio* studio, tic_mem* tic, bool bg);