more adjustments to scrolling system
parent
21b89b8ee6
commit
c245b63130
|
@ -1657,7 +1657,6 @@ char * file_name;<br>
|
|||
int32_t file_name_len;<br>
|
||||
char * buffer_name;<br>
|
||||
int32_t buffer_name_len;<br>
|
||||
int32_t buffer_cursor_pos;<br>
|
||||
bool32 is_lexed;<br>
|
||||
int32_t map_id;<br>
|
||||
</div>
|
||||
|
@ -1702,10 +1701,6 @@ int32_t map_id;<br>
|
|||
<div style='margin-bottom: 6mm;'><div style='margin-left: 5mm; margin-right: 5mm;'>This field specifies the length of the buffer_name string.</div></div>
|
||||
</div>
|
||||
<div>
|
||||
<div style='font-family: "Courier New", Courier, monospace; text-align: left;'><span style='font-weight: 600;'>buffer_cursor_pos</span></div>
|
||||
<div style='margin-bottom: 6mm;'><div style='margin-left: 5mm; margin-right: 5mm;'>This is a hold over from an old system, consider it deprecated.</div></div>
|
||||
</div>
|
||||
<div>
|
||||
<div style='font-family: "Courier New", Courier, monospace; text-align: left;'><span style='font-weight: 600;'>is_lexed</span></div>
|
||||
<div style='margin-bottom: 6mm;'><div style='margin-left: 5mm; margin-right: 5mm;'>If this is not a null summary, this field indicates whether the buffer is set to lex tokens.</div></div>
|
||||
</div>
|
||||
|
|
|
@ -632,9 +632,10 @@ SEEK_COMMAND(alphanumeric_or_camel, left, BoundaryAlphanumeric | BoundaryCamelC
|
|||
static void
|
||||
write_string(Application_Links *app, String string){
|
||||
unsigned int access = AccessOpen;
|
||||
Buffer_Summary buffer = get_active_buffer(app, access);
|
||||
View_Summary view = app->get_active_view(app, access);
|
||||
Buffer_Summary buffer = app->get_buffer(app, view.buffer_id, access);
|
||||
app->buffer_replace_range(app, &buffer,
|
||||
buffer.buffer_cursor_pos, buffer.buffer_cursor_pos,
|
||||
view.cursor.pos, view.cursor.pos,
|
||||
string.str, string.size);
|
||||
}
|
||||
|
||||
|
|
|
@ -461,8 +461,6 @@ struct Buffer_Summary{
|
|||
/* DOC(This field specifies the length of the buffer_name string.) */
|
||||
int32_t buffer_name_len;
|
||||
|
||||
/* DOC(This is a hold over from an old system, consider it deprecated.) */
|
||||
int32_t buffer_cursor_pos;
|
||||
/* DOC(If this is not a null summary, this field indicates whether the buffer is set to lex tokens.) */
|
||||
bool32 is_lexed;
|
||||
/* DOC(If this is not a null summary, this field specifies the id of the command map for this buffer.) */
|
||||
|
|
162
4ed.cpp
162
4ed.cpp
|
@ -320,16 +320,16 @@ COMMAND_DECL(center_view){
|
|||
|
||||
f32 y = 0, h = 0;
|
||||
if (view->file_data.unwrapped_lines){
|
||||
y = view->recent.cursor.unwrapped_y;
|
||||
y = view->edit_poss.cursor.unwrapped_y;
|
||||
}
|
||||
else{
|
||||
y = view->recent.cursor.wrapped_y;
|
||||
y = view->edit_poss.cursor.wrapped_y;
|
||||
}
|
||||
|
||||
h = view_file_height(view);
|
||||
y = clamp_bottom(0.f, y - h*.5f);
|
||||
|
||||
view->recent.scroll.target_y = ROUND32(y);
|
||||
view->edit_poss.scroll.target_y = ROUND32(y);
|
||||
}
|
||||
|
||||
COMMAND_DECL(left_adjust_view){
|
||||
|
@ -338,39 +338,14 @@ COMMAND_DECL(left_adjust_view){
|
|||
|
||||
f32 x = 0;
|
||||
if (view->file_data.unwrapped_lines){
|
||||
x = view->recent.cursor.unwrapped_x;
|
||||
x = view->edit_poss.cursor.unwrapped_x;
|
||||
}
|
||||
else{
|
||||
x = view->recent.cursor.wrapped_x;
|
||||
x = view->edit_poss.cursor.wrapped_x;
|
||||
}
|
||||
|
||||
x = clamp_bottom(0.f, x - 30.f);
|
||||
view->recent.scroll.target_x = ROUND32(x);
|
||||
}
|
||||
|
||||
COMMAND_DECL(set_cursor){
|
||||
REQ_READABLE_VIEW(view);
|
||||
REQ_FILE(file, view);
|
||||
USE_VARS(vars);
|
||||
|
||||
i32_Rect file_region = view->file_region;
|
||||
Mouse_State mouse = direct_get_mouse_state(&vars->available_input);
|
||||
|
||||
f32 max_y = view_file_height(view);
|
||||
f32 max_x = view_file_width(view);
|
||||
GUI_Scroll_Vars scroll_vars = view->gui_target.scroll_updated;
|
||||
|
||||
f32 rx = (f32)(mouse.x - file_region.x0);
|
||||
f32 ry = (f32)(mouse.y - file_region.y0);
|
||||
|
||||
if (ry >= 0){
|
||||
if (rx >= 0 && rx < max_x && ry >= 0 && ry < max_y){
|
||||
view_cursor_move(view,
|
||||
rx + scroll_vars.scroll_x,
|
||||
ry + scroll_vars.scroll_y,
|
||||
1);
|
||||
}
|
||||
}
|
||||
view->edit_poss.scroll.target_x = ROUND32(x);
|
||||
}
|
||||
|
||||
COMMAND_DECL(word_complete){
|
||||
|
@ -383,49 +358,40 @@ COMMAND_DECL(word_complete){
|
|||
General_Memory *general = &models->mem.general;
|
||||
Working_Set *working_set = &models->working_set;
|
||||
Complete_State *complete_state = &vars->complete_state;
|
||||
Search_Range *ranges;
|
||||
Search_Match match;
|
||||
Search_Range *ranges = 0;
|
||||
|
||||
Temp_Memory temp;
|
||||
Buffer_Type *buffer = &file->state.buffer;
|
||||
i32 size_of_buffer = buffer_size(buffer);
|
||||
|
||||
Buffer_Type *buffer;
|
||||
Buffer_Backify_Type loop;
|
||||
char *data;
|
||||
i32 end;
|
||||
i32 size_of_buffer;
|
||||
i32 cursor_pos = 0;
|
||||
i32 word_start = 0;
|
||||
i32 word_end = 0;
|
||||
char c = 0;
|
||||
|
||||
i32 cursor_pos, word_start, word_end;
|
||||
char c;
|
||||
|
||||
char *spare;
|
||||
i32 size;
|
||||
|
||||
i32 match_size;
|
||||
b32 do_init = 0;
|
||||
|
||||
buffer = &file->state.buffer;
|
||||
size_of_buffer = buffer_size(buffer);
|
||||
char *spare = 0;
|
||||
i32 size = 0;
|
||||
|
||||
b32 do_init = false;
|
||||
if (view->mode.rewrite != 2){
|
||||
do_init = 1;
|
||||
do_init = true;
|
||||
}
|
||||
view->next_mode.rewrite = 2;
|
||||
|
||||
if (complete_state->initialized == 0){
|
||||
do_init = 1;
|
||||
do_init = true;
|
||||
}
|
||||
|
||||
if (do_init){
|
||||
word_end = view->recent.cursor.pos;
|
||||
word_end = view->edit_poss.cursor.pos;
|
||||
word_start = word_end;
|
||||
cursor_pos = word_end - 1;
|
||||
|
||||
// TODO(allen): macros for these buffer loops and some method of breaking out of them.
|
||||
for (loop = buffer_backify_loop(buffer, cursor_pos, 0);
|
||||
// TODO(allen): macros for these buffer loops and some method
|
||||
// of breaking out of them.
|
||||
for (Buffer_Backify_Type loop = buffer_backify_loop(buffer, cursor_pos, 0);
|
||||
buffer_backify_good(&loop);
|
||||
buffer_backify_next(&loop)){
|
||||
end = loop.absolute_pos;
|
||||
data = loop.data - loop.absolute_pos;
|
||||
i32 end = loop.absolute_pos;
|
||||
char *data = loop.data - loop.absolute_pos;
|
||||
for (; cursor_pos >= end; --cursor_pos){
|
||||
c = data[cursor_pos];
|
||||
if (char_is_alpha(c)){
|
||||
|
@ -495,10 +461,12 @@ COMMAND_DECL(word_complete){
|
|||
|
||||
if (size > 0){
|
||||
for (;;){
|
||||
match = search_next_match(part, &complete_state->set, &complete_state->iter);
|
||||
i32 match_size = 0;
|
||||
Search_Match match =
|
||||
search_next_match(part, &complete_state->set, &complete_state->iter);
|
||||
|
||||
if (match.found_match){
|
||||
temp = begin_temp_memory(part);
|
||||
Temp_Memory temp = begin_temp_memory(part);
|
||||
match_size = match.end - match.start;
|
||||
spare = (char*)push_array(part, char, match_size);
|
||||
buffer_stringify(match.buffer, match.start, match.end, spare);
|
||||
|
@ -674,21 +642,18 @@ COMMAND_DECL(toggle_line_wrap){
|
|||
REQ_READABLE_VIEW(view);
|
||||
REQ_FILE(file, view);
|
||||
|
||||
// TODO(allen): WHAT TO DO HERE???
|
||||
Relative_Scrolling scrolling = view_get_relative_scrolling(view);
|
||||
if (view->file_data.unwrapped_lines){
|
||||
view->file_data.unwrapped_lines = 0;
|
||||
file->settings.unwrapped_lines = 0;
|
||||
view->recent.scroll.target_x = 0;
|
||||
view->recent.cursor = view_compute_cursor_from_pos(
|
||||
view, view->recent.cursor.pos);
|
||||
view->recent.preferred_x = view->recent.cursor.wrapped_x;
|
||||
view->edit_poss.scroll.target_x = 0;
|
||||
view_cursor_move(view, view->edit_poss.cursor.pos);
|
||||
}
|
||||
else{
|
||||
view->file_data.unwrapped_lines = 1;
|
||||
file->settings.unwrapped_lines = 1;
|
||||
view->recent.cursor =
|
||||
view_compute_cursor_from_pos(view, view->recent.cursor.pos);
|
||||
view->recent.preferred_x = view->recent.cursor.unwrapped_x;
|
||||
view_cursor_move(view, view->edit_poss.cursor.pos);
|
||||
}
|
||||
view_set_relative_scrolling(view, scrolling);
|
||||
}
|
||||
|
@ -718,7 +683,7 @@ case_change_range(System_Functions *system,
|
|||
Mem_Options *mem, View *view, Editing_File *file,
|
||||
u8 a, u8 z, u8 char_delta){
|
||||
#if BUFFER_EXPERIMENT_SCALPEL <= 0
|
||||
Range range = make_range(view->recent.cursor.pos, view->recent.mark);
|
||||
Range range = make_range(view->edit_poss.cursor.pos, view->edit_poss.mark);
|
||||
if (range.start < range.end){
|
||||
Edit_Step step = {};
|
||||
step.type = ED_NORMAL;
|
||||
|
@ -929,25 +894,24 @@ COMMAND_DECL(page_down){
|
|||
REQ_READABLE_VIEW(view);
|
||||
|
||||
i32 height = CEIL32(view_file_height(view));
|
||||
i32 max_target_y = view->recent.scroll.max_y;
|
||||
f32 y = view_get_cursor_y(view);
|
||||
f32 x = view->edit_poss.preferred_x;
|
||||
|
||||
view->recent.scroll.target_y =
|
||||
clamp_top(view->recent.scroll.target_y + height, max_target_y);
|
||||
|
||||
view->recent.cursor =
|
||||
view_compute_cursor_from_xy(view, 0, view->recent.scroll.target_y + (height - view->line_height)*.5f);
|
||||
Full_Cursor cursor =
|
||||
view_compute_cursor_from_xy(view, x, y+height);
|
||||
edit_pos_set_cursor(&view->edit_poss, cursor, false, view->file_data.unwrapped_lines);
|
||||
}
|
||||
|
||||
COMMAND_DECL(page_up){
|
||||
REQ_READABLE_VIEW(view);
|
||||
|
||||
i32 height = CEIL32(view_file_height(view));
|
||||
f32 y = view_get_cursor_y(view);
|
||||
f32 x = view->edit_poss.preferred_x;
|
||||
|
||||
view->recent.scroll.target_y =
|
||||
clamp_bottom(0, view->recent.scroll.target_y - height);
|
||||
|
||||
view->recent.cursor =
|
||||
view_compute_cursor_from_xy(view, 0, view->recent.scroll.target_y + (height - view->line_height)*.5f);
|
||||
Full_Cursor cursor =
|
||||
view_compute_cursor_from_xy(view, x, y-height);
|
||||
edit_pos_set_cursor(&view->edit_poss, cursor, false, view->file_data.unwrapped_lines);
|
||||
}
|
||||
|
||||
COMMAND_DECL(open_color_tweaker){
|
||||
|
@ -2569,7 +2533,11 @@ App_Step_Sig(app_step){
|
|||
summary.mouse = mouse_state;
|
||||
}
|
||||
|
||||
GUI_Scroll_Vars *scroll_vars = view->current_scroll;
|
||||
GUI_Scroll_Vars *scroll_vars = &view->edit_poss.scroll;
|
||||
if (view->showing_ui != VUI_None){
|
||||
scroll_vars = &view->gui_scroll;
|
||||
}
|
||||
|
||||
Input_Process_Result ip_result =
|
||||
do_step_file_view(system, view, panel->inner, active,
|
||||
&summary, *scroll_vars, view->scroll_region);
|
||||
|
@ -2584,8 +2552,16 @@ App_Step_Sig(app_step){
|
|||
consume_input(&vars->available_input, Input_MouseRightButton,
|
||||
"file view step");
|
||||
}
|
||||
Assert(view->current_scroll == scroll_vars);
|
||||
*scroll_vars = ip_result.vars;
|
||||
|
||||
if (!gui_scroll_eq(scroll_vars, &ip_result.vars)){
|
||||
if (scroll_vars == &view->edit_poss.scroll){
|
||||
edit_pos_set_scroll(&view->edit_poss, ip_result.vars);
|
||||
}
|
||||
else{
|
||||
*scroll_vars = ip_result.vars;
|
||||
}
|
||||
}
|
||||
|
||||
view->scroll_region = ip_result.region;
|
||||
}
|
||||
}
|
||||
|
@ -2731,14 +2707,15 @@ App_Step_Sig(app_step){
|
|||
String welcome =
|
||||
make_lit_string("Welcome to " VERSION "\n"
|
||||
"If you're new to 4coder there's no tutorial yet :(\n"
|
||||
"you can use the key combo control + o to look for a file\n"
|
||||
"you can use the key combo <ctrl o> to look for a file\n"
|
||||
"and if you load README.txt you'll find all the key combos there are.\n"
|
||||
"\n"
|
||||
"Newest features:\n"
|
||||
"-A scratch buffer is now opened with 4coder automatically\n"
|
||||
"-<F2> toggels mouse suppression mode\n"
|
||||
"-Experimental new work-flow for building a jumping to errors\n"
|
||||
" (only available in power for this version)\n"
|
||||
"-A new mouse suppression mode toggled by <F2>\n"
|
||||
"-New 4coder_API.html documentation file included for the custom layer API\n"
|
||||
"-Experimental new work-flow for building and jumping to errors\n"
|
||||
" (only available in power for this build)\n"
|
||||
"\n"
|
||||
"New in alpha 4.0.8:\n"
|
||||
"-Eliminated the parameter stack\n"
|
||||
|
@ -2750,12 +2727,12 @@ App_Step_Sig(app_step){
|
|||
"\n"
|
||||
"New in alpha 4.0.6:\n"
|
||||
"-Tied the view scrolling and the list arrow navigation together\n"
|
||||
"-Scroll bars are now toggleable with ALT-s for show and ALT-w for hide\n"
|
||||
"-Scroll bars are now toggleable with <alt s> for show and <alt w> for hide\n"
|
||||
"\n"
|
||||
"New in alpha 4.0.5:\n"
|
||||
"-New indent rule\n"
|
||||
"-app->buffer_compute_cursor in the customization API\n"
|
||||
"-f keys are available\n"
|
||||
"-f keys are available in the customization system now\n"
|
||||
"\n"
|
||||
"New in alpha 4.0.3 and 4.0.4:\n"
|
||||
"-Scroll bar on files and file lists\n"
|
||||
|
@ -2949,8 +2926,15 @@ App_Step_Sig(app_step){
|
|||
draw_rectangle(target, full, back_color);
|
||||
|
||||
draw_push_clip(target, panel->inner);
|
||||
do_render_file_view(system, view, cmd->view,
|
||||
|
||||
GUI_Scroll_Vars *scroll_vars = &view->edit_poss.scroll;
|
||||
if (view->showing_ui != VUI_None){
|
||||
scroll_vars = &view->gui_scroll;
|
||||
}
|
||||
|
||||
do_render_file_view(system, view, scroll_vars, cmd->view,
|
||||
panel->inner, active, target, &dead_input);
|
||||
|
||||
draw_pop_clip(target);
|
||||
|
||||
u32 margin_color;
|
||||
|
|
|
@ -25,7 +25,6 @@ fill_buffer_summary(Buffer_Summary *buffer, Editing_File *file, Working_Set *wor
|
|||
buffer->is_lexed = file->settings.tokens_exist;
|
||||
buffer->buffer_id = file->id.id;
|
||||
buffer->size = file->state.buffer.size;
|
||||
buffer->buffer_cursor_pos = file->state.cursor_pos;
|
||||
|
||||
buffer->file_name_len = file->name.source_path.size;
|
||||
buffer->buffer_name_len = file->name.live_name.size;
|
||||
|
@ -67,12 +66,12 @@ fill_view_summary(View_Summary *view, View *vptr, Live_Views *live_set, Working_
|
|||
|
||||
view->buffer_id = buffer_id;
|
||||
|
||||
view->mark = view_compute_cursor_from_pos(vptr, vptr->recent.mark);
|
||||
view->cursor = vptr->recent.cursor;
|
||||
view->preferred_x = vptr->recent.preferred_x;
|
||||
view->mark = view_compute_cursor_from_pos(vptr, vptr->edit_poss.mark);
|
||||
view->cursor = vptr->edit_poss.cursor;
|
||||
view->preferred_x = vptr->edit_poss.preferred_x;
|
||||
|
||||
view->file_region = vptr->file_region;
|
||||
view->scroll_vars = *vptr->current_scroll;
|
||||
view->scroll_vars = vptr->edit_poss.scroll;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -683,20 +682,14 @@ DOC_SEE(4coder_Buffer_Positioning_System)
|
|||
|
||||
bool32 result = false;
|
||||
int32_t size = 0;
|
||||
int32_t next_cursor = 0, pos = 0;
|
||||
|
||||
if (file){
|
||||
size = buffer_size(&file->state.buffer);
|
||||
if (0 <= start && start <= end && end <= size){
|
||||
result = true;
|
||||
|
||||
pos = file->state.cursor_pos;
|
||||
if (pos < start) next_cursor = pos;
|
||||
else if (pos < end) next_cursor = start;
|
||||
else next_cursor = pos + end - start - len;
|
||||
|
||||
file_replace_range(cmd->system, cmd->models,
|
||||
file, start, end, str, len, next_cursor);
|
||||
file, start, end, str, len, 0);
|
||||
}
|
||||
fill_buffer_summary(buffer, file, cmd);
|
||||
}
|
||||
|
@ -1242,12 +1235,10 @@ DOC_SEE(Buffer_Seek)
|
|||
if (seek.type == buffer_seek_line_char && seek.character <= 0){
|
||||
seek.character = 1;
|
||||
}
|
||||
vptr->recent.cursor = view_compute_cursor(vptr, seek);
|
||||
if (set_preferred_x){
|
||||
vptr->recent.preferred_x = view_get_cursor_x(vptr);
|
||||
}
|
||||
Full_Cursor cursor = view_compute_cursor(vptr, seek);
|
||||
edit_pos_set_cursor(&vptr->edit_poss, cursor,
|
||||
set_preferred_x, vptr->file_data.unwrapped_lines);
|
||||
fill_view_summary(view, vptr, cmd);
|
||||
file->state.cursor_pos = vptr->recent.cursor.pos;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1271,10 +1262,10 @@ DOC_SEE(Buffer_Seek)
|
|||
result = true;
|
||||
if (seek.type != buffer_seek_pos){
|
||||
cursor = view_compute_cursor(vptr, seek);
|
||||
vptr->recent.mark = cursor.pos;
|
||||
vptr->edit_poss.mark = cursor.pos;
|
||||
}
|
||||
else{
|
||||
vptr->recent.mark = seek.pos;
|
||||
vptr->edit_poss.mark = seek.pos;
|
||||
}
|
||||
fill_view_summary(view, vptr, cmd);
|
||||
}
|
||||
|
|
|
@ -112,8 +112,6 @@ struct Editing_File_State{
|
|||
i16 font_id;
|
||||
Buffer_Type buffer;
|
||||
|
||||
i32 cursor_pos;
|
||||
|
||||
Undo_Data undo;
|
||||
|
||||
Cpp_Token_Stack token_stack;
|
||||
|
|
|
@ -162,16 +162,23 @@ file_viewing_data_zero(){
|
|||
return(data);
|
||||
}
|
||||
|
||||
struct Recent_File_Data{
|
||||
enum Edit_Pos_Set_Type{
|
||||
EditPos_None,
|
||||
EditPos_CursorSet,
|
||||
EditPos_ScrollSet
|
||||
};
|
||||
struct File_Edit_Positions{
|
||||
GUI_Scroll_Vars scroll;
|
||||
Full_Cursor cursor;
|
||||
i32 mark;
|
||||
f32 preferred_x;
|
||||
i32 scroll_i;
|
||||
|
||||
i32 last_set_type;
|
||||
};
|
||||
inline Recent_File_Data
|
||||
recent_file_data_zero(){
|
||||
Recent_File_Data data = {0};
|
||||
inline File_Edit_Positions
|
||||
file_edit_positions_zero(){
|
||||
File_Edit_Positions data = {0};
|
||||
return(data);
|
||||
}
|
||||
|
||||
|
@ -223,16 +230,17 @@ struct View{
|
|||
Command_Map *map;
|
||||
|
||||
File_Viewing_Data file_data;
|
||||
|
||||
#if 0
|
||||
i32 prev_cursor_pos;
|
||||
Scroll_Context prev_context;
|
||||
|
||||
#endif
|
||||
|
||||
i32_Rect file_region_prev;
|
||||
i32_Rect file_region;
|
||||
|
||||
i32_Rect scroll_region;
|
||||
Recent_File_Data recent;
|
||||
|
||||
GUI_Scroll_Vars *current_scroll;
|
||||
File_Edit_Positions edit_poss;
|
||||
|
||||
View_UI showing_ui;
|
||||
GUI_Target gui_target;
|
||||
|
@ -679,7 +687,7 @@ inline i32
|
|||
view_compute_max_target_y(View *view){
|
||||
i32 lowest_line = view_compute_lowest_line(view);
|
||||
i32 line_height = view->line_height;
|
||||
f32 view_height = view_file_height(view);
|
||||
f32 view_height = clamp_bottom((f32)line_height, view_file_height(view));
|
||||
i32 max_target_y = view_compute_max_target_y(lowest_line, line_height, view_height);
|
||||
return(max_target_y);
|
||||
}
|
||||
|
@ -1490,6 +1498,28 @@ view_set_temp_highlight(View *view, i32 pos, i32 end_pos){
|
|||
view->file_data.show_temp_highlight = 1;
|
||||
}
|
||||
|
||||
internal void
|
||||
edit_pos_set_cursor(File_Edit_Positions *edit_poss,
|
||||
Full_Cursor cursor,
|
||||
b32 set_preferred_x,
|
||||
b32 unwrapped_lines){
|
||||
edit_poss->cursor = cursor;
|
||||
if (set_preferred_x){
|
||||
edit_poss->preferred_x = cursor.wrapped_x;
|
||||
if (unwrapped_lines){
|
||||
edit_poss->preferred_x = cursor.unwrapped_x;
|
||||
}
|
||||
}
|
||||
edit_poss->last_set_type = EditPos_CursorSet;
|
||||
}
|
||||
|
||||
internal void
|
||||
edit_pos_set_scroll(File_Edit_Positions *edit_poss,
|
||||
GUI_Scroll_Vars scroll){
|
||||
edit_poss->scroll = scroll;
|
||||
edit_poss->last_set_type = EditPos_ScrollSet;
|
||||
}
|
||||
|
||||
inline i32
|
||||
view_get_cursor_pos(View *view){
|
||||
i32 result;
|
||||
|
@ -1497,40 +1527,41 @@ view_get_cursor_pos(View *view){
|
|||
result = view->file_data.temp_highlight.pos;
|
||||
}
|
||||
else{
|
||||
result = view->recent.cursor.pos;
|
||||
result = view->edit_poss.cursor.pos;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
inline f32
|
||||
view_get_cursor_x(View *view){
|
||||
f32 result;
|
||||
Full_Cursor *cursor;
|
||||
f32 result = 0;
|
||||
|
||||
Full_Cursor *cursor = &view->edit_poss.cursor;
|
||||
if (view->file_data.show_temp_highlight){
|
||||
cursor = &view->file_data.temp_highlight;
|
||||
}
|
||||
else{
|
||||
cursor = &view->recent.cursor;
|
||||
}
|
||||
|
||||
result = cursor->wrapped_y;
|
||||
if (view->file_data.unwrapped_lines){
|
||||
result = cursor->unwrapped_x;
|
||||
}
|
||||
else{
|
||||
result = cursor->wrapped_x;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
inline f32
|
||||
view_get_cursor_y(View *view){
|
||||
Full_Cursor *cursor;
|
||||
f32 result;
|
||||
f32 result = 0;
|
||||
|
||||
if (view->file_data.show_temp_highlight) cursor = &view->file_data.temp_highlight;
|
||||
else cursor = &view->recent.cursor;
|
||||
Full_Cursor *cursor = &view->edit_poss.cursor;
|
||||
if (view->file_data.show_temp_highlight){
|
||||
cursor = &view->file_data.temp_highlight;
|
||||
}
|
||||
|
||||
if (view->file_data.unwrapped_lines) result = cursor->unwrapped_y;
|
||||
else result = cursor->wrapped_y;
|
||||
result = cursor->wrapped_y;
|
||||
if (view->file_data.unwrapped_lines){
|
||||
result = cursor->unwrapped_y;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
@ -1592,8 +1623,11 @@ view_move_cursor_to_view(View *view, GUI_Scroll_Vars scroll){
|
|||
else{
|
||||
cursor_y -= line_height;
|
||||
}
|
||||
view->recent.cursor =
|
||||
view_compute_cursor_from_xy(view, view->recent.preferred_x, cursor_y);
|
||||
|
||||
Full_Cursor new_cursor =
|
||||
view_compute_cursor_from_xy(view, view->edit_poss.preferred_x, cursor_y);
|
||||
edit_pos_set_cursor(&view->edit_poss, new_cursor,
|
||||
false, view->file_data.unwrapped_lines);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1663,16 +1697,19 @@ view_set_file(View *view, Editing_File *file, Models *models){
|
|||
if (file){
|
||||
view->file_data.unwrapped_lines = file->settings.unwrapped_lines;
|
||||
|
||||
Recent_File_Data *recent = &view->recent;
|
||||
*recent = recent_file_data_zero();
|
||||
// TODO(allen): Here is where the fancy logic goes for
|
||||
// File_Edit_Positions stuff.
|
||||
|
||||
File_Edit_Positions *edit_poss = &view->edit_poss;
|
||||
*edit_poss = file_edit_positions_zero();
|
||||
|
||||
if (file_is_ready(file)){
|
||||
view_measure_wraps(&models->mem.general, view);
|
||||
recent->cursor = view_compute_cursor_from_pos(view, file->state.cursor_pos);
|
||||
recent->scroll.max_y = view_compute_max_target_y(view);
|
||||
recent->preferred_x = view_get_cursor_x(view);
|
||||
edit_poss->cursor = view_compute_cursor_from_pos(view, 0);
|
||||
edit_poss->scroll.max_y = view_compute_max_target_y(view);
|
||||
edit_poss->preferred_x = view_get_cursor_x(view);
|
||||
|
||||
view_move_view_to_cursor(view, &recent->scroll, true);
|
||||
view_move_view_to_cursor(view, &edit_poss->scroll, true);
|
||||
view->reinit_scrolling = 1;
|
||||
}
|
||||
}
|
||||
|
@ -1687,24 +1724,24 @@ internal Relative_Scrolling
|
|||
view_get_relative_scrolling(View *view){
|
||||
Relative_Scrolling result;
|
||||
f32 cursor_y = view_get_cursor_y(view);
|
||||
result.scroll_y = cursor_y - view->recent.scroll.scroll_y;
|
||||
result.target_y = cursor_y - view->recent.scroll.target_y;
|
||||
result.scroll_y = cursor_y - view->edit_poss.scroll.scroll_y;
|
||||
result.target_y = cursor_y - view->edit_poss.scroll.target_y;
|
||||
return(result);
|
||||
}
|
||||
|
||||
internal void
|
||||
view_set_relative_scrolling(View *view, Relative_Scrolling scrolling){
|
||||
f32 cursor_y = view_get_cursor_y(view);
|
||||
view->recent.scroll.scroll_y = cursor_y - scrolling.scroll_y;
|
||||
view->recent.scroll.target_y =
|
||||
|
||||
view->edit_poss.scroll.scroll_y = cursor_y - scrolling.scroll_y;
|
||||
view->edit_poss.scroll.target_y =
|
||||
ROUND32(clamp_bottom(0.f, cursor_y - scrolling.target_y));
|
||||
}
|
||||
|
||||
inline void
|
||||
view_cursor_move(View *view, Full_Cursor cursor){
|
||||
view->recent.cursor = cursor;
|
||||
view->recent.preferred_x = view_get_cursor_x(view);
|
||||
view->file_data.file->state.cursor_pos = view->recent.cursor.pos;
|
||||
edit_pos_set_cursor(&view->edit_poss, cursor,
|
||||
true, view->file_data.unwrapped_lines);
|
||||
view->file_data.show_temp_highlight = 0;
|
||||
}
|
||||
|
||||
|
@ -1945,7 +1982,6 @@ file_edit_cursor_fix(System_Functions *system,
|
|||
i32 cursor_max = layout->panel_max_count * 2;
|
||||
Cursor_With_Index *cursors = push_array(part, Cursor_With_Index, cursor_max);
|
||||
|
||||
f32 y_offset = 0, y_position = 0;
|
||||
i32 cursor_count = 0;
|
||||
|
||||
View *view;
|
||||
|
@ -1956,9 +1992,9 @@ file_edit_cursor_fix(System_Functions *system,
|
|||
view = panel->view;
|
||||
if (view->file_data.file == file){
|
||||
view_measure_wraps(general, view);
|
||||
write_cursor_with_index(cursors, &cursor_count, view->recent.cursor.pos);
|
||||
write_cursor_with_index(cursors, &cursor_count, view->recent.mark - 1);
|
||||
write_cursor_with_index(cursors, &cursor_count, view->recent.scroll_i - 1);
|
||||
write_cursor_with_index(cursors, &cursor_count, view->edit_poss.cursor.pos);
|
||||
write_cursor_with_index(cursors, &cursor_count, view->edit_poss.mark - 1);
|
||||
write_cursor_with_index(cursors, &cursor_count, view->edit_poss.scroll_i - 1);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1980,27 +2016,25 @@ file_edit_cursor_fix(System_Functions *system,
|
|||
view = panel->view;
|
||||
if (view && view->file_data.file == file){
|
||||
view_cursor_move(view, cursors[cursor_count++].pos);
|
||||
view->recent.preferred_x = view_get_cursor_x(view);
|
||||
|
||||
view->recent.mark = cursors[cursor_count++].pos + 1;
|
||||
view->edit_poss.mark = cursors[cursor_count++].pos + 1;
|
||||
i32 new_scroll_i = cursors[cursor_count++].pos + 1;
|
||||
if (view->recent.scroll_i != new_scroll_i){
|
||||
view->recent.scroll_i = new_scroll_i;
|
||||
temp_cursor = view_compute_cursor_from_pos(view, view->recent.scroll_i);
|
||||
y_offset = MOD(view->recent.scroll.scroll_y, view->line_height);
|
||||
if (view->edit_poss.scroll_i != new_scroll_i){
|
||||
view->edit_poss.scroll_i = new_scroll_i;
|
||||
temp_cursor = view_compute_cursor_from_pos(view, view->edit_poss.scroll_i);
|
||||
|
||||
f32 y_offset = MOD(view->edit_poss.scroll.scroll_y, view->line_height);
|
||||
f32 y_position = temp_cursor.wrapped_y;
|
||||
if (view->file_data.unwrapped_lines){
|
||||
y_position = temp_cursor.unwrapped_y + y_offset;
|
||||
view->recent.scroll.target_y +=
|
||||
ROUND32(y_position - view->recent.scroll.scroll_y);
|
||||
view->recent.scroll.scroll_y = y_position;
|
||||
}
|
||||
else{
|
||||
y_position = temp_cursor.wrapped_y + y_offset;
|
||||
view->recent.scroll.target_y +=
|
||||
ROUND32(y_position - view->recent.scroll.scroll_y);
|
||||
view->recent.scroll.scroll_y = y_position;
|
||||
y_position = temp_cursor.unwrapped_y;
|
||||
}
|
||||
y_position += y_offset;
|
||||
|
||||
GUI_Scroll_Vars scroll = view->edit_poss.scroll;
|
||||
scroll.target_y +=
|
||||
ROUND32(y_position - scroll.scroll_y);
|
||||
scroll.scroll_y = y_position;
|
||||
edit_pos_set_scroll(&view->edit_poss, scroll);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -2238,7 +2272,7 @@ view_undo_redo(System_Functions *system,
|
|||
file_do_single_edit(system, models, file, spec, hist_normal);
|
||||
|
||||
view_cursor_move(view, step.edit.start + step.edit.len);
|
||||
view->recent.mark = view->recent.cursor.pos;
|
||||
view->edit_poss.mark = view->edit_poss.cursor.pos;
|
||||
|
||||
Style *style = main_style(models);
|
||||
view_post_paste_effect(view, 0.333f, step.edit.start, step.edit.len,
|
||||
|
@ -2370,7 +2404,7 @@ view_history_step(System_Functions *system, Models *models, View *view, History_
|
|||
view_cursor_move(view, step.edit.start + step.edit.len);
|
||||
break;
|
||||
}
|
||||
view->recent.mark = view->recent.cursor.pos;
|
||||
view->edit_poss.mark = view->edit_poss.cursor.pos;
|
||||
}
|
||||
else{
|
||||
TentativeAssert(spec.step.special_type == 1);
|
||||
|
@ -2536,7 +2570,7 @@ view_clean_whitespace(System_Functions *system, Models *models, View *view){
|
|||
char *inv_str = (char*)part->base + part->pos;
|
||||
Edit_Spec spec =
|
||||
file_compute_whitespace_edit(mem, file,
|
||||
view->recent.cursor.pos,
|
||||
view->edit_poss.cursor.pos,
|
||||
edits, str_base, str_size,
|
||||
inverse_array, inv_str,
|
||||
part->max - part->pos, edit_count);
|
||||
|
@ -3037,8 +3071,7 @@ remeasure_file_view(System_Functions *system, View *view){
|
|||
Relative_Scrolling relative = view_get_relative_scrolling(view);
|
||||
view_measure_wraps(&view->persistent.models->mem.general, view);
|
||||
if (view->file_data.show_temp_highlight == 0){
|
||||
view_cursor_move(view, view->recent.cursor.pos);
|
||||
view->recent.preferred_x = view_get_cursor_x(view);
|
||||
view_cursor_move(view, view->edit_poss.cursor.pos);
|
||||
}
|
||||
view_set_relative_scrolling(view, relative);
|
||||
}
|
||||
|
@ -3048,7 +3081,6 @@ inline void
|
|||
view_show_GUI(View *view, View_UI ui){
|
||||
view->map = &view->persistent.models->map_ui;
|
||||
view->showing_ui = ui;
|
||||
view->current_scroll = &view->gui_scroll;
|
||||
view->changed_context_in_step = 1;
|
||||
}
|
||||
|
||||
|
@ -3065,7 +3097,6 @@ view_show_interactive(System_Functions *system, View *view,
|
|||
view->interaction = interaction;
|
||||
view->dest = make_fixed_width_string(view->dest_);
|
||||
view->list_i = 0;
|
||||
view->current_scroll = &view->gui_scroll;
|
||||
|
||||
view->map = &models->map_ui;
|
||||
|
||||
|
@ -3081,7 +3112,6 @@ view_show_theme(View *view){
|
|||
view->color_mode = CV_Mode_Library;
|
||||
view->color = super_color_create(0xFF000000);
|
||||
view->current_color_editing = 0;
|
||||
view->current_scroll = &view->gui_scroll;
|
||||
view->changed_context_in_step = 1;
|
||||
}
|
||||
|
||||
|
@ -3094,10 +3124,12 @@ view_show_file(View *view){
|
|||
else{
|
||||
view->map = get_map(view->persistent.models, mapid_global);
|
||||
}
|
||||
view->showing_ui = VUI_None;
|
||||
view->current_scroll = &view->recent.scroll;
|
||||
view->recent.scroll.max_y = view_compute_max_target_y(view);
|
||||
view->changed_context_in_step = 1;
|
||||
|
||||
if (view->showing_ui != VUI_None){
|
||||
view->showing_ui = VUI_None;
|
||||
view->changed_context_in_step = true;
|
||||
view->reinit_scrolling = true;
|
||||
}
|
||||
}
|
||||
|
||||
internal void
|
||||
|
@ -3486,7 +3518,7 @@ intbar_draw_string(Render_Target *target, File_Bar *bar, String str, u32 char_co
|
|||
bar->pos_x += font_string_width(target, font_id, str);
|
||||
}
|
||||
|
||||
internal void
|
||||
internal GUI_Scroll_Vars
|
||||
view_reinit_scrolling(View *view){
|
||||
Editing_File *file = view->file_data.file;
|
||||
f32 w = 0, h = 0;
|
||||
|
@ -3509,69 +3541,55 @@ view_reinit_scrolling(View *view){
|
|||
target_y = clamp_bottom(0, FLOOR32(cursor_y - h*.5f));
|
||||
}
|
||||
|
||||
view->recent.scroll.target_y = target_y;
|
||||
view->recent.scroll.scroll_y = (f32)target_y;
|
||||
view->recent.scroll.prev_target_y = -1000;
|
||||
GUI_Scroll_Vars scroll = {0};
|
||||
|
||||
view->recent.scroll.target_x = target_x;
|
||||
view->recent.scroll.scroll_x = (f32)target_x;
|
||||
view->recent.scroll.prev_target_x = -1000;
|
||||
}
|
||||
|
||||
enum CursorScroll_State{
|
||||
CursorScroll_NoChange = 0x0,
|
||||
CursorScroll_Cursor = 0x1,
|
||||
CursorScroll_Scroll = 0x2,
|
||||
CursorScroll_ContextChange = 0x4
|
||||
};
|
||||
|
||||
internal u32
|
||||
view_get_cursor_scroll_change_state(View *view){
|
||||
u32 result = 0;
|
||||
i32 pos = 0;
|
||||
Scroll_Context context = {0};
|
||||
|
||||
if (view->gui_target.did_file){
|
||||
pos = view_get_cursor_pos(view);
|
||||
if ((view->prev_cursor_pos != pos)){
|
||||
result |= CursorScroll_Cursor;
|
||||
}
|
||||
}
|
||||
|
||||
if (view->current_scroll){
|
||||
if (!gui_scroll_eq(view->current_scroll, &view->gui_target.scroll_original)){
|
||||
result |= CursorScroll_Scroll;
|
||||
}
|
||||
}
|
||||
|
||||
if (context.mode == VUI_None){
|
||||
context.file = view->file_data.file;
|
||||
}
|
||||
else{
|
||||
context.file = view->prev_context.file;
|
||||
}
|
||||
context.scroll = view->gui_target.scroll_id;
|
||||
context.mode = view->showing_ui;
|
||||
|
||||
if (!context_eq(view->prev_context, context)){
|
||||
result |= CursorScroll_ContextChange;
|
||||
}
|
||||
|
||||
return(result);
|
||||
scroll.target_y = target_y;
|
||||
scroll.scroll_y = (f32)target_y;
|
||||
scroll.prev_target_y = -1000;
|
||||
|
||||
scroll.target_x = target_x;
|
||||
scroll.scroll_x = (f32)target_x;
|
||||
scroll.prev_target_x = -1000;
|
||||
|
||||
return(scroll);
|
||||
}
|
||||
|
||||
// TODO(allen): GTFO!
|
||||
internal void
|
||||
view_begin_cursor_scroll_updates(View *view){
|
||||
|
||||
#if 0
|
||||
if (view->file_data.file && view->file_data.file == view->prev_context.file){
|
||||
Assert(view->prev_cursor_pos == view_get_cursor_pos(view));
|
||||
}
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
internal void
|
||||
view_end_cursor_scroll_updates(View *view){
|
||||
i32 cursor_scroll_state =
|
||||
view_get_cursor_scroll_change_state(view);
|
||||
i32 set_type = view->edit_poss.last_set_type;
|
||||
|
||||
switch (set_type){
|
||||
case EditPos_None: break;
|
||||
|
||||
case EditPos_CursorSet:
|
||||
{
|
||||
if (view->gui_target.did_file){
|
||||
view->edit_poss.scroll.max_y = view_compute_max_target_y(view);
|
||||
}
|
||||
view_move_view_to_cursor(view, &view->edit_poss.scroll, false);
|
||||
gui_post_scroll_vars(&view->gui_target, &view->edit_poss.scroll, view->scroll_region);
|
||||
}break;
|
||||
|
||||
case EditPos_ScrollSet:
|
||||
{
|
||||
view_move_cursor_to_view(view, view->edit_poss.scroll);
|
||||
gui_post_scroll_vars(&view->gui_target, &view->edit_poss.scroll, view->scroll_region);
|
||||
}break;
|
||||
}
|
||||
|
||||
#if 0
|
||||
switch (cursor_scroll_state){
|
||||
case CursorScroll_NoChange:break;
|
||||
|
||||
|
@ -3601,6 +3619,7 @@ view_end_cursor_scroll_updates(View *view){
|
|||
view->prev_context.file = view->file_data.file;
|
||||
view->prev_context.scroll = view->gui_target.scroll_id;
|
||||
view->prev_context.mode = view->showing_ui;
|
||||
#endif
|
||||
}
|
||||
|
||||
internal b32
|
||||
|
@ -4020,8 +4039,6 @@ step_file_view(System_Functions *system, View *view, View *active_view, Input_Su
|
|||
|
||||
b32 show_scrollbar = !view->hide_scrollbar;
|
||||
|
||||
view->current_scroll = 0;
|
||||
|
||||
if (view->showing_ui != VUI_None){
|
||||
b32 did_esc = 0;
|
||||
Key_Event_Data key;
|
||||
|
@ -4057,11 +4074,15 @@ step_file_view(System_Functions *system, View *view, View *active_view, Input_Su
|
|||
scroll_context.id[1] = view->showing_ui;
|
||||
scroll_context.id[0] = (u64)(view->file_data.file);
|
||||
|
||||
view->current_scroll = &view->recent.scroll;
|
||||
// TODO(allen): ????
|
||||
|
||||
#if 0
|
||||
gui_get_scroll_vars(target, scroll_context,
|
||||
&view->recent.scroll, &view->scroll_region);
|
||||
|
||||
gui_begin_scrollable(target, scroll_context, view->recent.scroll,
|
||||
#endif
|
||||
|
||||
gui_begin_scrollable(target, scroll_context,
|
||||
view->edit_poss.scroll,
|
||||
delta, show_scrollbar);
|
||||
gui_do_file(target);
|
||||
gui_end_scrollable(target);
|
||||
|
@ -4072,8 +4093,6 @@ step_file_view(System_Functions *system, View *view, View *active_view, Input_Su
|
|||
switch (view->showing_ui){
|
||||
case VUI_Menu:
|
||||
{
|
||||
view->current_scroll = &view->gui_scroll;
|
||||
|
||||
String message = make_lit_string("Menu");
|
||||
String empty_string = {0};
|
||||
GUI_id id = {0};
|
||||
|
@ -4096,8 +4115,6 @@ step_file_view(System_Functions *system, View *view, View *active_view, Input_Su
|
|||
|
||||
case VUI_Config:
|
||||
{
|
||||
view->current_scroll = &view->gui_scroll;
|
||||
|
||||
String message = make_lit_string("Config");
|
||||
String empty_string = {0};
|
||||
GUI_id id = {0};
|
||||
|
@ -4114,8 +4131,6 @@ step_file_view(System_Functions *system, View *view, View *active_view, Input_Su
|
|||
|
||||
case VUI_Theme:
|
||||
{
|
||||
view->current_scroll = &view->gui_scroll;
|
||||
|
||||
if (view != active_view){
|
||||
view->hot_file_view = active_view;
|
||||
}
|
||||
|
@ -4149,8 +4164,7 @@ step_file_view(System_Functions *system, View *view, View *active_view, Input_Su
|
|||
message = make_lit_string("Theme Library - Click to Select");
|
||||
gui_do_text_field(target, message, empty_string);
|
||||
|
||||
view->current_scroll = &view->gui_scroll;
|
||||
gui_get_scroll_vars(target, scroll_context, &view->gui_scroll, &view->scroll_region);
|
||||
gui_get_scroll_vars(target, scroll_context, &view->scroll_region);
|
||||
gui_begin_scrollable(target, scroll_context, view->gui_scroll,
|
||||
9 * view->line_height, show_scrollbar);
|
||||
|
||||
|
@ -4223,8 +4237,7 @@ step_file_view(System_Functions *system, View *view, View *active_view, Input_Su
|
|||
view->color_mode = CV_Mode_Library;
|
||||
}
|
||||
|
||||
view->current_scroll = &view->gui_scroll;
|
||||
gui_get_scroll_vars(target, scroll_context, &view->gui_scroll, &view->scroll_region);
|
||||
gui_get_scroll_vars(target, scroll_context, &view->scroll_region);
|
||||
gui_begin_scrollable(target, scroll_context, view->gui_scroll,
|
||||
9 * view->line_height, show_scrollbar);
|
||||
|
||||
|
@ -4311,8 +4324,6 @@ step_file_view(System_Functions *system, View *view, View *active_view, Input_Su
|
|||
String comp_dest = make_fixed_width_string(comp_dest_space);
|
||||
i32 comp_action = 0;
|
||||
|
||||
view->current_scroll = &view->gui_scroll;
|
||||
|
||||
GUI_id id = {0};
|
||||
id.id[1] = VUI_Interactive + ((u64)view->interaction << 32);
|
||||
|
||||
|
@ -4369,7 +4380,7 @@ step_file_view(System_Functions *system, View *view, View *active_view, Input_Su
|
|||
|
||||
scroll_context.id[0] = (u64)(hdir);
|
||||
if (gui_get_scroll_vars(target, scroll_context,
|
||||
&view->gui_scroll, &view->scroll_region)){
|
||||
&view->scroll_region)){
|
||||
snap_into_view = 1;
|
||||
}
|
||||
gui_begin_scrollable(target, scroll_context, view->gui_scroll,
|
||||
|
@ -4380,7 +4391,8 @@ step_file_view(System_Functions *system, View *view, View *active_view, Input_Su
|
|||
if (gui_begin_list(target, id, view->list_i, 0,
|
||||
snap_into_view, &update)){
|
||||
// TODO(allen): Allow me to handle key consumption correctly here!
|
||||
gui_standard_list(target, id, view->current_scroll, view->scroll_region,
|
||||
gui_standard_list(target, id, &view->gui_scroll,
|
||||
view->scroll_region,
|
||||
&keys, &view->list_i, &update);
|
||||
}
|
||||
|
||||
|
@ -4435,8 +4447,6 @@ step_file_view(System_Functions *system, View *view, View *active_view, Input_Su
|
|||
case IAct_Kill: message = make_lit_string("Kill: "); break;
|
||||
}
|
||||
|
||||
Absolutes absolutes;
|
||||
Editing_File *file;
|
||||
Working_Set *working_set = &models->working_set;
|
||||
Editing_Layout *layout = &models->layout;
|
||||
GUI_Item_Update update = {0};
|
||||
|
@ -4455,13 +4465,14 @@ step_file_view(System_Functions *system, View *view, View *active_view, Input_Su
|
|||
}
|
||||
}
|
||||
|
||||
Absolutes absolutes = {0};
|
||||
get_absolutes(view->dest, &absolutes, 1, 1);
|
||||
|
||||
gui_do_text_field(target, message, view->dest);
|
||||
|
||||
scroll_context.id[0] = (u64)(working_set);
|
||||
if (gui_get_scroll_vars(target, scroll_context,
|
||||
&view->gui_scroll, &view->scroll_region)){
|
||||
&view->scroll_region)){
|
||||
snap_into_view = 1;
|
||||
}
|
||||
gui_begin_scrollable(target, scroll_context, view->gui_scroll,
|
||||
|
@ -4470,7 +4481,8 @@ step_file_view(System_Functions *system, View *view, View *active_view, Input_Su
|
|||
id.id[0] = (u64)(working_set) + 1;
|
||||
if (gui_begin_list(target, id, view->list_i,
|
||||
0, snap_into_view, &update)){
|
||||
gui_standard_list(target, id, view->current_scroll, view->scroll_region,
|
||||
gui_standard_list(target, id, &view->gui_scroll,
|
||||
view->scroll_region,
|
||||
&keys, &view->list_i, &update);
|
||||
}
|
||||
|
||||
|
@ -4487,7 +4499,7 @@ step_file_view(System_Functions *system, View *view, View *active_view, Input_Su
|
|||
|
||||
used_nodes = &working_set->used_sentinel;
|
||||
for (dll_items(node, used_nodes)){
|
||||
file = (Editing_File*)node;
|
||||
Editing_File *file = (Editing_File*)node;
|
||||
Assert(!file->is_dummy);
|
||||
|
||||
if (filename_match(view->dest, &absolutes, file->name.live_name, 1)){
|
||||
|
@ -4519,7 +4531,7 @@ step_file_view(System_Functions *system, View *view, View *active_view, Input_Su
|
|||
}
|
||||
|
||||
for (i = 0; i < reserved_top; ++i){
|
||||
file = reserved_files[i];
|
||||
Editing_File *file = reserved_files[i];
|
||||
|
||||
message = string_zero();
|
||||
if (!file->settings.unimportant){
|
||||
|
@ -4621,8 +4633,6 @@ step_file_view(System_Functions *system, View *view, View *active_view, Input_Su
|
|||
GUI_id id = {0};
|
||||
id.id[1] = VUI_Debug + ((u64)view->debug_vars.mode << 32);
|
||||
|
||||
view->current_scroll = &view->gui_scroll;
|
||||
|
||||
// TODO(allen):
|
||||
// + Incoming input
|
||||
// + Memory info
|
||||
|
@ -4925,27 +4935,28 @@ step_file_view(System_Functions *system, View *view, View *active_view, Input_Su
|
|||
view_ptr->file_data.line_count,
|
||||
view_ptr->file_data.line_max);
|
||||
|
||||
GUI_Scroll_Vars scroll = *view_ptr->current_scroll;
|
||||
|
||||
SHOW_GUI_BLANK(0);
|
||||
SHOW_GUI_REGION(1, h_align, "scroll region", view_ptr->scroll_region);
|
||||
|
||||
SHOW_GUI_BLANK(0);
|
||||
SHOW_GUI_LINE(1, "recent file data");
|
||||
SHOW_GUI_LINE(1, "file editing positions");
|
||||
{
|
||||
Recent_File_Data *recent = &view_ptr->recent;
|
||||
File_Edit_Positions *edit_poss = &view_ptr->edit_poss;
|
||||
|
||||
SHOW_GUI_SCROLL(2, h_align, "scroll:", recent->scroll);
|
||||
SHOW_GUI_SCROLL(2, h_align, "scroll:", edit_poss->scroll);
|
||||
SHOW_GUI_BLANK (2);
|
||||
SHOW_GUI_CURSOR(2, h_align, "cursor:", recent->cursor);
|
||||
SHOW_GUI_CURSOR(2, h_align, "cursor:", edit_poss->cursor);
|
||||
SHOW_GUI_BLANK (2);
|
||||
SHOW_GUI_INT (2, h_align, "mark", recent->mark);
|
||||
SHOW_GUI_FLOAT (2, h_align, "preferred_x", recent->preferred_x);
|
||||
SHOW_GUI_INT (2, h_align, "scroll_i", recent->scroll_i);
|
||||
SHOW_GUI_INT (2, h_align, "mark", edit_poss->mark);
|
||||
SHOW_GUI_FLOAT (2, h_align, "preferred_x", edit_poss->preferred_x);
|
||||
SHOW_GUI_INT (2, h_align, "scroll_i", edit_poss->scroll_i);
|
||||
}
|
||||
|
||||
SHOW_GUI_BLANK (0);
|
||||
SHOW_GUI_SCROLL(1, h_align, "curent scroll:", scroll);
|
||||
SHOW_GUI_SCROLL(1, h_align, "curent scroll:", view_ptr->edit_poss.scroll);
|
||||
|
||||
SHOW_GUI_BLANK (0);
|
||||
SHOW_GUI_SCROLL(1, h_align, "gui scroll:", view_ptr->gui_scroll);
|
||||
|
||||
SHOW_GUI_BLANK (0);
|
||||
SHOW_GUI_LINE (1, "gui target");
|
||||
|
@ -4965,7 +4976,7 @@ step_file_view(System_Functions *system, View *view, View *active_view, Input_Su
|
|||
SHOW_GUI_REGION (2, h_align, "region_original", view_ptr->gui_target.region_original);
|
||||
|
||||
SHOW_GUI_BLANK (2);
|
||||
SHOW_GUI_SCROLL (2, h_align, "scroll_updated", view_ptr->gui_target.scroll_updated);
|
||||
// SHOW_GUI_SCROLL (2, h_align, "scroll_updated", view_ptr->gui_target.scroll_updated);
|
||||
SHOW_GUI_REGION (2, h_align, "region_updated", view_ptr->gui_target.region_updated);
|
||||
|
||||
|
||||
|
@ -4991,7 +5002,7 @@ internal f32
|
|||
view_get_scroll_y(View *view){
|
||||
f32 v;
|
||||
if (view->showing_ui == VUI_None){
|
||||
v = view->recent.scroll.scroll_y;
|
||||
v = view->edit_poss.scroll.scroll_y;
|
||||
}
|
||||
else{
|
||||
v = view->gui_scroll.scroll_y;
|
||||
|
@ -5115,15 +5126,16 @@ do_step_file_view(System_Functions *system,
|
|||
|
||||
case guicom_file:
|
||||
{
|
||||
i32 new_max_y = view_compute_max_target_y(view);
|
||||
|
||||
// NOTE(allen): Set the file region first because the
|
||||
// computation of view_compute_max_target_y depends on it.
|
||||
view->file_region = gui_session.rect;
|
||||
result.vars.max_y = new_max_y;
|
||||
|
||||
if (view->reinit_scrolling){
|
||||
view_reinit_scrolling(view);
|
||||
result.vars = view_reinit_scrolling(view);
|
||||
result.is_animating = true;
|
||||
}
|
||||
result.vars.max_y = view_compute_max_target_y(view);
|
||||
|
||||
if (file_step(view, gui_session.rect, user_input, is_active, &result.consumed_l)){
|
||||
result.is_animating = true;
|
||||
}
|
||||
|
@ -5326,8 +5338,8 @@ draw_file_loaded(View *view, i32_Rect rect, b32 is_active, Render_Target *target
|
|||
Buffer_Render_Options opts = {};
|
||||
|
||||
f32 *wraps = view->file_data.line_wrap_y;
|
||||
f32 scroll_x = view->recent.scroll.scroll_x;
|
||||
f32 scroll_y = view->recent.scroll.scroll_y;
|
||||
f32 scroll_x = view->edit_poss.scroll.scroll_x;
|
||||
f32 scroll_y = view->edit_poss.scroll.scroll_y;
|
||||
|
||||
// NOTE(allen): For now we will temporarily adjust scroll_y to try
|
||||
// to prevent the view moving around until floating sections are added
|
||||
|
@ -5340,7 +5352,7 @@ draw_file_loaded(View *view, i32_Rect rect, b32 is_active, Render_Target *target
|
|||
(f32)max_x,
|
||||
advance_data, (f32)line_height);
|
||||
|
||||
view->recent.scroll_i = render_cursor.pos;
|
||||
view->edit_poss.scroll_i = render_cursor.pos;
|
||||
|
||||
buffer_get_render_data(&file->state.buffer, items, max, &count,
|
||||
(f32)rect.x0, (f32)rect.y0,
|
||||
|
@ -5362,7 +5374,7 @@ draw_file_loaded(View *view, i32_Rect rect, b32 is_active, Render_Target *target
|
|||
at_cursor_color = style->main.at_highlight_color;
|
||||
}
|
||||
else{
|
||||
cursor_begin = view->recent.cursor.pos;
|
||||
cursor_begin = view->edit_poss.cursor.pos;
|
||||
cursor_end = cursor_begin + 1;
|
||||
cursor_color = style->main.cursor_color;
|
||||
at_cursor_color = style->main.at_cursor_color;
|
||||
|
@ -5452,7 +5464,7 @@ draw_file_loaded(View *view, i32_Rect rect, b32 is_active, Render_Target *target
|
|||
|
||||
char_color = color_blend(char_color, fade_amount, fade_color);
|
||||
|
||||
if (ind == view->recent.mark && prev_ind != ind){
|
||||
if (ind == view->edit_poss.mark && prev_ind != ind){
|
||||
draw_rectangle_outline(target, char_rect, mark_color);
|
||||
}
|
||||
if (item->glyphid != 0){
|
||||
|
@ -5570,9 +5582,9 @@ draw_file_bar(Render_Target *target, View *view, Editing_File *file, i32_Rect re
|
|||
char line_number_space[30];
|
||||
String line_number = make_fixed_width_string(line_number_space);
|
||||
append(&line_number, " L#");
|
||||
append_int_to_str(&line_number, view->recent.cursor.line);
|
||||
append_int_to_str(&line_number, view->edit_poss.cursor.line);
|
||||
append(&line_number, " C#");
|
||||
append_int_to_str(&line_number, view->recent.cursor.character);
|
||||
append_int_to_str(&line_number, view->edit_poss.cursor.character);
|
||||
|
||||
intbar_draw_string(target, &bar, line_number, base_color);
|
||||
|
||||
|
@ -5775,7 +5787,7 @@ draw_style_preview(GUI_Target *gui_target, Render_Target *target, View *view, i3
|
|||
}
|
||||
|
||||
internal i32
|
||||
do_render_file_view(System_Functions *system, View *view,
|
||||
do_render_file_view(System_Functions *system, View *view, GUI_Scroll_Vars *scroll,
|
||||
View *active, i32_Rect rect, b32 is_active,
|
||||
Render_Target *target, Input_Summary *user_input){
|
||||
|
||||
|
@ -5801,8 +5813,7 @@ do_render_file_view(System_Functions *system, View *view,
|
|||
h->type;
|
||||
h = NextHeader(h)){
|
||||
interpret_result = gui_interpret(gui_target, &gui_session, h,
|
||||
*view->current_scroll,
|
||||
view->scroll_region);
|
||||
*scroll, view->scroll_region);
|
||||
|
||||
if (interpret_result.has_info){
|
||||
if (gui_session.clip_y > clip_rect.y0){
|
||||
|
@ -5818,9 +5829,6 @@ do_render_file_view(System_Functions *system, View *view,
|
|||
|
||||
case guicom_file:
|
||||
{
|
||||
if (view->reinit_scrolling){
|
||||
view_reinit_scrolling(view);
|
||||
}
|
||||
if (file && file_is_ready(file)){
|
||||
result = draw_file_loaded(view, gui_session.rect, is_active, target);
|
||||
}
|
||||
|
@ -6196,7 +6204,9 @@ inline void
|
|||
view_change_size(General_Memory *general, View *view){
|
||||
if (view->file_data.file){
|
||||
view_measure_wraps(general, view);
|
||||
view->recent.cursor = view_compute_cursor_from_pos(view, view->recent.cursor.pos);
|
||||
Full_Cursor cursor = view_compute_cursor_from_pos(view, view->edit_poss.cursor.pos);
|
||||
edit_pos_set_cursor(&view->edit_poss, cursor,
|
||||
false, view->file_data.unwrapped_lines);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -6219,7 +6229,6 @@ live_set_alloc_view(Live_Views *live_set, Panel *panel, Models *models){
|
|||
result.view->panel = panel;
|
||||
|
||||
result.view->persistent.models = models;
|
||||
result.view->current_scroll = &result.view->recent.scroll;
|
||||
|
||||
update_view_line_height(models, result.view);
|
||||
|
||||
|
|
18
4ed_gui.cpp
18
4ed_gui.cpp
|
@ -124,7 +124,7 @@ struct GUI_Target{
|
|||
GUI_Scroll_Vars scroll_original;
|
||||
i32_Rect region_original;
|
||||
|
||||
GUI_Scroll_Vars scroll_updated;
|
||||
//GUI_Scroll_Vars scroll_updated;
|
||||
i32_Rect region_updated;
|
||||
|
||||
// TODO(allen): Would rather have a way of tracking this
|
||||
|
@ -656,14 +656,11 @@ gui_scroll_eq(GUI_Scroll_Vars *a, GUI_Scroll_Vars *b){
|
|||
// TODO(allen): Rethink this a little, seems like there are two separate things we want to do here:
|
||||
// Getting the updated scroll vars, and telling the user when scrolling actions occur.
|
||||
internal b32
|
||||
gui_get_scroll_vars(GUI_Target *target, GUI_id scroll_context_id, GUI_Scroll_Vars *vars_out, i32_Rect *region_out){
|
||||
gui_get_scroll_vars(GUI_Target *target, GUI_id scroll_context_id, i32_Rect *region_out){
|
||||
b32 result = 0;
|
||||
if (gui_id_eq(scroll_context_id, target->scroll_id)){
|
||||
*vars_out = target->scroll_updated;
|
||||
*region_out = target->region_updated;
|
||||
|
||||
vars_out->target_y = clamp(0, vars_out->target_y, vars_out->max_y);
|
||||
|
||||
if (gui_id_eq(target->active, gui_id_scrollbar())){
|
||||
result = 1;
|
||||
target->animating = 1;
|
||||
|
@ -674,9 +671,7 @@ gui_get_scroll_vars(GUI_Target *target, GUI_id scroll_context_id, GUI_Scroll_Var
|
|||
|
||||
internal void
|
||||
gui_post_scroll_vars(GUI_Target *target, GUI_Scroll_Vars *vars_in, i32_Rect region_in){
|
||||
if (!gui_scroll_eq(vars_in, &target->scroll_updated) ||
|
||||
!rect_equal(region_in, target->region_updated)){
|
||||
target->scroll_updated = *vars_in;
|
||||
if (!rect_equal(region_in, target->region_updated)){
|
||||
target->region_updated = region_in;
|
||||
target->animating = 1;
|
||||
target->active = gui_id_scrollbar();
|
||||
|
@ -694,7 +689,6 @@ gui_begin_scrollable(GUI_Target *target, GUI_id scroll_context_id,
|
|||
h = gui_push_simple_command(target, guicom_scrollable);
|
||||
|
||||
target->scroll_original = scroll_vars;
|
||||
target->scroll_updated = scroll_vars;
|
||||
target->scroll_id = scroll_context_id;
|
||||
|
||||
if (show_bar){
|
||||
|
@ -1230,6 +1224,12 @@ gui_compute_view_jump(i32_Rect scroll_region, i32_Rect position){
|
|||
|
||||
internal GUI_Scroll_Vars
|
||||
gui_do_jump(GUI_Target *target, GUI_View_Jump jump, GUI_Scroll_Vars vars){
|
||||
if (jump.view_max < 0){
|
||||
jump.view_max = 0;
|
||||
}
|
||||
if (jump.view_min < 0){
|
||||
jump.view_min = 0;
|
||||
}
|
||||
if (vars.target_y < jump.view_min){
|
||||
vars.target_y = jump.view_min;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue