work on back and forth between scrolling and arrow navigation
This commit is contained in:
parent
040e81014e
commit
842c2b8f7b
|
@ -3697,7 +3697,44 @@ step_file_view(System_Functions *system, View *view, View *active_view, Input_Su
|
||||||
id.id[0] = (u64)(hdir) + 1;
|
id.id[0] = (u64)(hdir) + 1;
|
||||||
|
|
||||||
if (gui_begin_list(target, id, view->list_i, 0, &update)){
|
if (gui_begin_list(target, id, view->list_i, 0, &update)){
|
||||||
|
i32 *list_i = &view->list_i;
|
||||||
|
|
||||||
|
if (update.has_adjustment){
|
||||||
|
*list_i = update.adjustment_value;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (update.has_index_position){
|
||||||
|
// TODO(allen): update scrolling here.
|
||||||
|
// TODO(allen): THOUGHT:
|
||||||
|
// Could we better abstract this idea of having something that
|
||||||
|
// wants to stay in view so that users don't have to manage this
|
||||||
|
// nasty view back and forth directly if they don't want?
|
||||||
|
}
|
||||||
|
|
||||||
|
b32 indirectly_activate = 0;
|
||||||
|
for (i32 j = 0; j < keys.count; ++j){
|
||||||
|
i16 key = keys.keys[j].keycode;
|
||||||
|
switch (key){
|
||||||
|
case key_up:
|
||||||
|
--*list_i;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case key_down:
|
||||||
|
++*list_i;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case '\n': case '\t':
|
||||||
|
indirectly_activate = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
gui_rollback(target, &update);
|
||||||
|
gui_begin_list(target, id, *list_i, indirectly_activate, 0);
|
||||||
|
|
||||||
|
#if 0
|
||||||
gui_standard_list(target, id, &keys, &view->list_i, &update);
|
gui_standard_list(target, id, &keys, &view->list_i, &update);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
|
|
54
4ed_gui.cpp
54
4ed_gui.cpp
|
@ -150,6 +150,8 @@ struct GUI_Target{
|
||||||
// for more than one list. Perhaps just throw in a hash table?
|
// for more than one list. Perhaps just throw in a hash table?
|
||||||
// Or maybe this only needs to be tracked for the active list.
|
// Or maybe this only needs to be tracked for the active list.
|
||||||
i32 list_max;
|
i32 list_max;
|
||||||
|
b32 has_list_index_position;
|
||||||
|
i32_Rect list_index_position;
|
||||||
|
|
||||||
f32 delta;
|
f32 delta;
|
||||||
u32 scroll_id;
|
u32 scroll_id;
|
||||||
|
@ -159,9 +161,12 @@ struct GUI_Target{
|
||||||
|
|
||||||
struct GUI_Item_Update{
|
struct GUI_Item_Update{
|
||||||
i32 partition_point;
|
i32 partition_point;
|
||||||
b32 activate;
|
|
||||||
b32 has_adjustment;
|
b32 has_adjustment;
|
||||||
i32 adjustment_value;
|
i32 adjustment_value;
|
||||||
|
|
||||||
|
b32 has_index_position;
|
||||||
|
i32_Rect index_position;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct GUI_Header{
|
struct GUI_Header{
|
||||||
|
@ -207,13 +212,13 @@ enum GUI_Command_Type{
|
||||||
guicom_end_scrollable_section,
|
guicom_end_scrollable_section,
|
||||||
};
|
};
|
||||||
|
|
||||||
internal b32
|
inline b32
|
||||||
gui_id_eq(GUI_id id1, GUI_id id2){
|
gui_id_eq(GUI_id id1, GUI_id id2){
|
||||||
b32 result = (id1.id[0] == id2.id[0] && id1.id[1] == id2.id[1]);
|
b32 result = (id1.id[0] == id2.id[0] && id1.id[1] == id2.id[1]);
|
||||||
return(result);
|
return(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
internal b32
|
inline b32
|
||||||
gui_id_is_null(GUI_id id){
|
gui_id_is_null(GUI_id id){
|
||||||
b32 result = (id.id[0] == 0 && id.id[1] == 0);
|
b32 result = (id.id[0] == 0 && id.id[1] == 0);
|
||||||
return(result);
|
return(result);
|
||||||
|
@ -248,26 +253,30 @@ gui_rollback(GUI_Target *target, GUI_Item_Update *update){
|
||||||
}
|
}
|
||||||
|
|
||||||
internal void
|
internal void
|
||||||
gui_fill_item_update(GUI_Item_Update *update, GUI_Target *target, GUI_Header *h,
|
gui_fill_update(GUI_Item_Update *update, GUI_Target *target, GUI_Header *h){
|
||||||
b32 activate){
|
|
||||||
if (update){
|
if (update){
|
||||||
update->partition_point = (i32)((char*)h - (char*)target->push.base);
|
update->partition_point = (i32)((char*)h - (char*)target->push.base);
|
||||||
update->activate = activate;
|
|
||||||
update->has_adjustment = 0;
|
update->has_adjustment = 0;
|
||||||
|
update->has_index_position = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
internal void
|
internal void
|
||||||
gui_fill_item_update(GUI_Item_Update *update, GUI_Target *target, GUI_Header *h,
|
gui_update_adjustment(GUI_Item_Update *update, i32 adjustment_value){
|
||||||
b32 active, i32 adjustment_value){
|
|
||||||
if (update){
|
if (update){
|
||||||
update->partition_point = (i32)((char*)h - (char*)target->push.base);
|
|
||||||
update->activate = active;
|
|
||||||
update->has_adjustment = 1;
|
update->has_adjustment = 1;
|
||||||
update->adjustment_value = adjustment_value;
|
update->adjustment_value = adjustment_value;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
internal void
|
||||||
|
gui_update_position(GUI_Item_Update *update, i32_Rect position){
|
||||||
|
if (update){
|
||||||
|
update->has_index_position = 1;
|
||||||
|
update->index_position = position;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
internal void*
|
internal void*
|
||||||
gui_push_item(GUI_Target *target, void *item, i32 size){
|
gui_push_item(GUI_Target *target, void *item, i32 size){
|
||||||
void *dest = partition_allocate(&target->push, size);
|
void *dest = partition_allocate(&target->push, size);
|
||||||
|
@ -406,6 +415,7 @@ gui_begin_top_level(GUI_Target *target, Input_Summary input){
|
||||||
internal void
|
internal void
|
||||||
gui_end_top_level(GUI_Target *target){
|
gui_end_top_level(GUI_Target *target){
|
||||||
gui_push_simple_command(target, guicom_null);
|
gui_push_simple_command(target, guicom_null);
|
||||||
|
target->has_list_index_position = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
internal void
|
internal void
|
||||||
|
@ -434,7 +444,7 @@ gui_do_text_with_cursor(GUI_Target *target, i32 pos, String text, GUI_Item_Updat
|
||||||
|
|
||||||
result = target->has_keys;
|
result = target->has_keys;
|
||||||
if (result){
|
if (result){
|
||||||
gui_fill_item_update(update, target, h, 0);
|
gui_fill_update(update, target, h);
|
||||||
target->animating = 1;
|
target->animating = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -491,15 +501,17 @@ gui_begin_list(GUI_Target *target, GUI_id id, i32 list_i, b32 activate_item, GUI
|
||||||
}
|
}
|
||||||
|
|
||||||
if (result){
|
if (result){
|
||||||
|
gui_fill_update(update, target, h);
|
||||||
if (list_i < 0){
|
if (list_i < 0){
|
||||||
gui_fill_item_update(update, target, h, active, 0);
|
gui_update_adjustment(update, 0);
|
||||||
}
|
}
|
||||||
else if (list_i >= target->list_max){
|
else if (list_i >= target->list_max){
|
||||||
gui_fill_item_update(update, target, h, active, target->list_max - 1);
|
gui_update_adjustment(update, target->list_max - 1);
|
||||||
}
|
}
|
||||||
else{
|
if (target->has_list_index_position){
|
||||||
gui_fill_item_update(update, target, h, active);
|
gui_update_position(update, target->list_index_position);
|
||||||
}
|
}
|
||||||
|
|
||||||
target->animating = 1;
|
target->animating = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1031,9 +1043,16 @@ gui_interpret(GUI_Target *target, GUI_Session *session, GUI_Header *h){
|
||||||
case guicom_fixed_option:
|
case guicom_fixed_option:
|
||||||
case guicom_fixed_option_checkbox:
|
case guicom_fixed_option_checkbox:
|
||||||
{
|
{
|
||||||
|
give_to_user = 1;
|
||||||
|
rect = gui_layout_fixed_h(session, y, session->line_height * 2);
|
||||||
|
end_v = rect.y1;
|
||||||
|
end_section = section;
|
||||||
|
|
||||||
if (session->list.in_list){
|
if (session->list.in_list){
|
||||||
if (session->list.auto_hot == session->list.index){
|
if (session->list.auto_hot == session->list.index){
|
||||||
result.auto_hot = 1;
|
result.auto_hot = 1;
|
||||||
|
target->has_list_index_position = 1;
|
||||||
|
target->list_index_position = rect;
|
||||||
}
|
}
|
||||||
if (session->list.auto_activate == session->list.index){
|
if (session->list.auto_activate == session->list.index){
|
||||||
result.auto_activate = 1;
|
result.auto_activate = 1;
|
||||||
|
@ -1041,11 +1060,6 @@ gui_interpret(GUI_Target *target, GUI_Session *session, GUI_Header *h){
|
||||||
|
|
||||||
++session->list.index;
|
++session->list.index;
|
||||||
}
|
}
|
||||||
|
|
||||||
give_to_user = 1;
|
|
||||||
rect = gui_layout_fixed_h(session, y, session->line_height * 2);
|
|
||||||
end_v = rect.y1;
|
|
||||||
end_section = section;
|
|
||||||
}break;
|
}break;
|
||||||
|
|
||||||
case guicom_button:
|
case guicom_button:
|
||||||
|
|
Loading…
Reference in New Issue