aboutsummaryrefslogtreecommitdiffstats
path: root/build/4coder_byp/4coder_byp_colors.cpp
blob: c40cb5c5a8e668e97377f6bf75d865848275447d (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
global Color_Table target_color_table = {};
global Color_Table cached_color_table = {};

function b32
byp_is_theme(String_Const_u8 name){
  String_Const_u8 target_prefix = string_u8_litexpr("theme-");
  String_Const_u8 target_suffix = string_u8_litexpr(".4coder");
  String_Const_u8 actual_prefix = string_prefix(name, target_prefix.size);
  String_Const_u8 actual_suffix = string_postfix(name, target_suffix.size);
  return string_match(actual_prefix, target_prefix) && string_match(actual_suffix, target_suffix);
}

// TODO(BYP): Check for way to get highest color sub_id instead of hard-coding 14
function Color_Table
byp_init_color_table(Application_Links *app){
  Color_Table result = make_color_table(app, &global_permanent_arena);
  foreach(i, result.count){
    result.arrays[i].vals = push_array(&global_permanent_arena, u32, 14);
    result.arrays[i].count = 14;
  }
  return result;
}

function void
byp_copy_color_table(Color_Table *dst, Color_Table table){
  foreach(i, table.count){
    Color_Array *nxt_array = &dst->arrays[i];
    Color_Array *array = &table.arrays[i];
    nxt_array->count = array->count;
    foreach(j, array->count){
      nxt_array->vals[j] = array->vals[j];
    }
  }
}

function void
byp_tick_colors(Application_Links *app, Frame_Info frame_info){
  // If another function sets active, correct this to not write into a loaded theme
  if(active_color_table.arrays != cached_color_table.arrays){
    if(active_color_table.arrays && active_color_table.arrays->vals && active_color_table.arrays->count > 0){
      byp_copy_color_table(&target_color_table, active_color_table);
      active_color_table = cached_color_table;
    }
  }
  b32 needs_animate = false;
  foreach(i, active_color_table.count){
    Color_Array *nxt_array = &target_color_table.arrays[i];
    Color_Array *cur_array = &active_color_table.arrays[i];
    foreach(j, cur_array->count){
      Vec4_f32 nxt_v = unpack_color(nxt_array->vals[j]);
      Vec4_f32 cur_v = unpack_color(cur_array->vals[j]);
      Vec4_f32 diff = nxt_v - cur_v;
      cur_v += diff*frame_info.animation_dt*10.f;
      cur_array->vals[j] = pack_color(cur_v);

      needs_animate |= (!near_zero(diff, 0.001f));
    }
  }
  if(needs_animate){ animate_in_n_milliseconds(app, 0); }
}

function void
byp_theme_navigate(Application_Links *app, View_ID view, Lister *lister, i32 index_delta){
  lister__navigate__default(app, view, lister, index_delta);
  Color_Table *result = (Color_Table *)lister_get_user_data(lister, lister->raw_item_index);
  if(result){ byp_copy_color_table(&target_color_table, *result); }
}


CUSTOM_UI_COMMAND_SIG(byp_theme_lister)
CUSTOM_DOC("Opens an interactive list of all registered themes.")
{
  Color_Table_List *color_table_list = &global_theme_list;

  Scratch_Block scratch(app);
  Lister_Block lister(app, scratch);
  vim_lister_set_default_handlers(lister);
  vim_reset_bottom_text();
  string_append(&vim_bot_text, string_u8_litexpr("Theme:"));

  lister_add_item(lister, string_u8_litexpr("4coder"), string_u8_litexpr(""),
                  (void*)&default_color_table, 0);

  if(color_table_list->first){
    byp_copy_color_table(&target_color_table, color_table_list->first->table);
  }
  for(Color_Table_Node *node = color_table_list->first; node; node = node->next){
    lister_add_item(lister, node->name, string_u8_litexpr(""), (void*)&node->table, 0);
  }

  lister.lister.current->handlers.navigate = byp_theme_navigate;
  Lister_Result l_result = vim_run_lister(app, lister);

  Color_Table *result = 0;
  if(!l_result.canceled){ result = (Color_Table*)l_result.user_data; }

  if(result != 0){ byp_copy_color_table(&target_color_table, *result); }
}