4.0.21 pretty much ready to go barring any bug discoveries, (need to add README.txt LICENSE.txt and new features list in messages, and setup new casey customization file)
parent
3fb6e627a5
commit
6cc2182f42
|
@ -790,8 +790,6 @@ STRUCT User_Input{
|
||||||
/* DOC(Hook_IDs name the various hooks into 4coder, these hooks use the Hook_Function signature.)
|
/* DOC(Hook_IDs name the various hooks into 4coder, these hooks use the Hook_Function signature.)
|
||||||
DOC_SEE(Hook_Function) */
|
DOC_SEE(Hook_Function) */
|
||||||
ENUM(int32_t, Hook_ID){
|
ENUM(int32_t, Hook_ID){
|
||||||
/* DOC(TODO) */
|
|
||||||
hook_start,
|
|
||||||
/* DOC(TODO) */
|
/* DOC(TODO) */
|
||||||
hook_file_out_of_sync,
|
hook_file_out_of_sync,
|
||||||
/* DOC(TODO) */
|
/* DOC(TODO) */
|
||||||
|
@ -818,6 +816,8 @@ ENUM(int32_t, Special_Hook_ID){
|
||||||
special_hook_command_caller,
|
special_hook_command_caller,
|
||||||
/* DOC(TODO) */
|
/* DOC(TODO) */
|
||||||
special_hook_input_filter,
|
special_hook_input_filter,
|
||||||
|
/* DOC(TODO) */
|
||||||
|
special_hook_start,
|
||||||
};
|
};
|
||||||
|
|
||||||
TYPEDEF_FUNC int32_t Command_Caller_Hook_Function(struct Application_Links *app, Generic_Command cmd);
|
TYPEDEF_FUNC int32_t Command_Caller_Hook_Function(struct Application_Links *app, Generic_Command cmd);
|
||||||
|
@ -836,6 +836,10 @@ TYPEDEF_FUNC int32_t Scroll_Rule_Function(float target_x, float target_y, float
|
||||||
#define SCROLL_RULE_SIG(name) \
|
#define SCROLL_RULE_SIG(name) \
|
||||||
int32_t name(float target_x, float target_y, float *scroll_x, float *scroll_y, int32_t view_id, int32_t is_new_target, float dt)
|
int32_t name(float target_x, float target_y, float *scroll_x, float *scroll_y, int32_t view_id, int32_t is_new_target, float dt)
|
||||||
|
|
||||||
|
TYPEDEF_FUNC int32_t Start_Hook_Function(struct Application_Links *app, char **files, int32_t file_count, char **flags, int32_t flag_count);
|
||||||
|
#define START_HOOK_SIG(name) \
|
||||||
|
int32_t name(struct Application_Links *app, char **files, int32_t file_count, char **flags, int32_t flag_count)
|
||||||
|
|
||||||
TYPEDEF_FUNC int32_t Get_Binding_Data_Function(void *data, int32_t size);
|
TYPEDEF_FUNC int32_t Get_Binding_Data_Function(void *data, int32_t size);
|
||||||
#define GET_BINDING_DATA(name) int32_t name(void *data, int32_t size)
|
#define GET_BINDING_DATA(name) int32_t name(void *data, int32_t size)
|
||||||
|
|
||||||
|
|
|
@ -1023,23 +1023,74 @@ default_4coder_initialize(Application_Links *app){
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
default_4coder_side_by_side_panels(Application_Links *app){
|
default_4coder_side_by_side_panels(Application_Links *app, Buffer_Identifier left_buffer, Buffer_Identifier right_buffer){
|
||||||
|
Buffer_ID left_id = buffer_identifier_to_id(app, left_buffer);
|
||||||
|
Buffer_ID right_id = buffer_identifier_to_id(app, right_buffer);
|
||||||
|
|
||||||
|
// Left Panel
|
||||||
View_Summary view = get_active_view(app, AccessAll);
|
View_Summary view = get_active_view(app, AccessAll);
|
||||||
new_view_settings(app, &view);
|
new_view_settings(app, &view);
|
||||||
|
view_set_buffer(app, &view, left_id, 0);
|
||||||
|
|
||||||
|
// Right Panel
|
||||||
open_panel_vsplit(app);
|
open_panel_vsplit(app);
|
||||||
|
View_Summary right_view = get_active_view(app, AccessAll);
|
||||||
|
view_set_buffer(app, &right_view, right_id, 0);
|
||||||
|
|
||||||
|
// Restore Active to Left
|
||||||
set_active_view(app, &view);
|
set_active_view(app, &view);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
default_4coder_one_panel(Application_Links *app){
|
default_4coder_side_by_side_panels(Application_Links *app, char **command_line_files, int32_t file_count){
|
||||||
View_Summary view = get_active_view(app, AccessAll);
|
Buffer_Identifier left = buffer_identifier(literal("*scratch*"));
|
||||||
new_view_settings(app, &view);
|
Buffer_Identifier right = buffer_identifier(literal("*messages*"));
|
||||||
|
|
||||||
|
if (file_count > 0){
|
||||||
|
char *name = command_line_files[0];
|
||||||
|
int32_t len = str_size(name);
|
||||||
|
left = buffer_identifier(name, len);
|
||||||
|
|
||||||
|
if (file_count > 1){
|
||||||
|
char *name = command_line_files[1];
|
||||||
|
int32_t len = str_size(name);
|
||||||
|
right = buffer_identifier(name, len);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
default_4coder_side_by_side_panels(app, left, right);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
default_4coder_full_width_bottom_side_by_side_panels(Application_Links *app){
|
default_4coder_side_by_side_panels(Application_Links *app){
|
||||||
open_special_note_view(app);
|
default_4coder_side_by_side_panels(app, 0, 0);
|
||||||
default_4coder_side_by_side_panels(app);
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
default_4coder_one_panel(Application_Links *app, Buffer_Identifier buffer){
|
||||||
|
Buffer_ID id = buffer_identifier_to_id(app, buffer);
|
||||||
|
|
||||||
|
View_Summary view = get_active_view(app, AccessAll);
|
||||||
|
new_view_settings(app, &view);
|
||||||
|
view_set_buffer(app, &view, id, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
default_4coder_one_panel(Application_Links *app, char **command_line_files, int32_t file_count){
|
||||||
|
Buffer_Identifier buffer = buffer_identifier(literal("*messages*"));
|
||||||
|
|
||||||
|
if (file_count > 0){
|
||||||
|
char *name = command_line_files[0];
|
||||||
|
int32_t len = str_size(name);
|
||||||
|
buffer = buffer_identifier(name, len);
|
||||||
|
}
|
||||||
|
|
||||||
|
default_4coder_one_panel(app, buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
default_4coder_one_panel(Application_Links *app){
|
||||||
|
default_4coder_one_panel(app, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -18,9 +18,9 @@ TYPE: 'internal-for-default-system'
|
||||||
#include "languages/4coder_language_cs.h"
|
#include "languages/4coder_language_cs.h"
|
||||||
#include "languages/4coder_language_java.h"
|
#include "languages/4coder_language_java.h"
|
||||||
|
|
||||||
HOOK_SIG(default_start){
|
START_HOOK_SIG(default_start){
|
||||||
default_4coder_initialize(app);
|
default_4coder_initialize(app);
|
||||||
default_4coder_side_by_side_panels(app);
|
default_4coder_side_by_side_panels(app, files, file_count);
|
||||||
|
|
||||||
if (automatically_load_project){
|
if (automatically_load_project){
|
||||||
load_project(app);
|
load_project(app);
|
||||||
|
@ -321,10 +321,10 @@ SCROLL_RULE_SIG(smooth_scroll_rule){
|
||||||
|
|
||||||
static void
|
static void
|
||||||
set_all_default_hooks(Bind_Helper *context){
|
set_all_default_hooks(Bind_Helper *context){
|
||||||
set_hook(context, hook_start, default_start);
|
|
||||||
set_hook(context, hook_exit, default_exit);
|
set_hook(context, hook_exit, default_exit);
|
||||||
set_hook(context, hook_view_size_change, default_view_adjust);
|
set_hook(context, hook_view_size_change, default_view_adjust);
|
||||||
|
|
||||||
|
set_start_hook(context, default_start);
|
||||||
set_open_file_hook(context, default_file_settings);
|
set_open_file_hook(context, default_file_settings);
|
||||||
set_new_file_hook(context, default_new_file);
|
set_new_file_hook(context, default_new_file);
|
||||||
set_save_file_hook(context, default_file_save);
|
set_save_file_hook(context, default_file_save);
|
||||||
|
|
|
@ -175,6 +175,16 @@ set_new_file_hook(Bind_Helper *helper, Open_File_Hook_Function *func){
|
||||||
write_unit(helper, unit);
|
write_unit(helper, unit);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline void
|
||||||
|
set_start_hook(Bind_Helper *helper, Start_Hook_Function *func){
|
||||||
|
Binding_Unit unit;
|
||||||
|
unit.type = unit_hook;
|
||||||
|
unit.hook.hook_id = special_hook_start;
|
||||||
|
unit.hook.func = (void*) func;
|
||||||
|
|
||||||
|
write_unit(helper, unit);
|
||||||
|
}
|
||||||
|
|
||||||
inline void
|
inline void
|
||||||
set_open_file_hook(Bind_Helper *helper, Open_File_Hook_Function *func){
|
set_open_file_hook(Bind_Helper *helper, Open_File_Hook_Function *func){
|
||||||
Binding_Unit unit;
|
Binding_Unit unit;
|
||||||
|
|
|
@ -170,7 +170,7 @@ buffer_identifier(char *str, int32_t len){
|
||||||
}
|
}
|
||||||
|
|
||||||
static Buffer_Identifier
|
static Buffer_Identifier
|
||||||
buffer_identifier(int32_t id){
|
buffer_identifier(Buffer_ID id){
|
||||||
Buffer_Identifier identifier;
|
Buffer_Identifier identifier;
|
||||||
identifier.name = 0;
|
identifier.name = 0;
|
||||||
identifier.name_len = 0;
|
identifier.name_len = 0;
|
||||||
|
@ -178,6 +178,19 @@ buffer_identifier(int32_t id){
|
||||||
return(identifier);
|
return(identifier);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static Buffer_ID
|
||||||
|
buffer_identifier_to_id(Application_Links *app, Buffer_Identifier identifier){
|
||||||
|
Buffer_ID id = 0;
|
||||||
|
if (identifier.id != 0){
|
||||||
|
id = identifier.id;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
Buffer_Summary buffer = get_buffer_by_name(app, identifier.name, identifier.name_len, AccessAll);
|
||||||
|
id = buffer.buffer_id;
|
||||||
|
}
|
||||||
|
return(id);
|
||||||
|
}
|
||||||
|
|
||||||
static Buffer_Summary
|
static Buffer_Summary
|
||||||
create_buffer(Application_Links *app, char *filename, int32_t filename_len, Buffer_Create_Flag flags){
|
create_buffer(Application_Links *app, char *filename, int32_t filename_len, Buffer_Create_Flag flags){
|
||||||
Buffer_Summary buffer = {0};
|
Buffer_Summary buffer = {0};
|
||||||
|
|
92
4ed.cpp
92
4ed.cpp
|
@ -657,7 +657,7 @@ enum Command_Line_Mode{
|
||||||
CLMode_Custom
|
CLMode_Custom
|
||||||
};
|
};
|
||||||
|
|
||||||
void
|
internal void
|
||||||
init_command_line_settings(App_Settings *settings, Plat_Settings *plat_settings, Command_Line_Parameters clparams){
|
init_command_line_settings(App_Settings *settings, Plat_Settings *plat_settings, Command_Line_Parameters clparams){
|
||||||
char *arg = 0;
|
char *arg = 0;
|
||||||
Command_Line_Mode mode = CLMode_App;
|
Command_Line_Mode mode = CLMode_App;
|
||||||
|
@ -677,8 +677,6 @@ init_command_line_settings(App_Settings *settings, Plat_Settings *plat_settings,
|
||||||
char *long_arg_name = arg+2;
|
char *long_arg_name = arg+2;
|
||||||
if (match_cc(long_arg_name, "custom")){
|
if (match_cc(long_arg_name, "custom")){
|
||||||
mode = CLMode_Custom;
|
mode = CLMode_Custom;
|
||||||
settings->custom_arg_start = i+1;
|
|
||||||
settings->custom_arg_end = i+1;
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -819,7 +817,10 @@ init_command_line_settings(App_Settings *settings, Plat_Settings *plat_settings,
|
||||||
|
|
||||||
case CLMode_Custom:
|
case CLMode_Custom:
|
||||||
{
|
{
|
||||||
settings->custom_arg_end = i+1;
|
settings->custom_flags = clparams.argv + i;
|
||||||
|
settings->custom_flags_count = clparams.argc - i;
|
||||||
|
i = clparams.argc;
|
||||||
|
mode = CLMode_App;
|
||||||
}break;
|
}break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1118,6 +1119,11 @@ App_Init_Sig(app_init){
|
||||||
{
|
{
|
||||||
models->input_filter = (Input_Filter_Function*)unit->hook.func;
|
models->input_filter = (Input_Filter_Function*)unit->hook.func;
|
||||||
}break;
|
}break;
|
||||||
|
|
||||||
|
case special_hook_start:
|
||||||
|
{
|
||||||
|
models->hook_start = (Start_Hook_Function*)unit->hook.func;
|
||||||
|
}break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1491,51 +1497,15 @@ App_Step_Sig(app_step){
|
||||||
cmd->key = null_key_event_data;
|
cmd->key = null_key_event_data;
|
||||||
|
|
||||||
if (input->first_step){
|
if (input->first_step){
|
||||||
|
// Open command line files.
|
||||||
#if 0
|
|
||||||
{
|
|
||||||
View *view = 0;
|
|
||||||
View_Persistent *persistent = 0;
|
|
||||||
i32 i = 0;
|
|
||||||
i32 max = 0;
|
|
||||||
|
|
||||||
max = vars->live_set.max;
|
|
||||||
view = vars->live_set.views;
|
|
||||||
for (i = 1; i <= max; ++i, ++view){
|
|
||||||
persistent = &view->persistent;
|
|
||||||
|
|
||||||
persistent->coroutine =
|
|
||||||
system->create_coroutine(view_caller);
|
|
||||||
|
|
||||||
persistent->coroutine =
|
|
||||||
app_launch_coroutine(system, &models->app_links, Co_View,
|
|
||||||
persistent->coroutine, view, 0);
|
|
||||||
|
|
||||||
if (!persistent->coroutine){
|
|
||||||
// TODO(allen): Error message and recover
|
|
||||||
NotImplemented;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (models->hooks[hook_start]){
|
|
||||||
models->hooks[hook_start](&models->app_links);
|
|
||||||
}
|
|
||||||
|
|
||||||
char space[512];
|
char space[512];
|
||||||
String cl_filename = make_fixed_width_string(space);
|
String cl_filename = make_fixed_width_string(space);
|
||||||
copy_ss(&cl_filename, models->hot_directory.string);
|
copy_ss(&cl_filename, models->hot_directory.string);
|
||||||
|
|
||||||
i32 cl_filename_len = cl_filename.size;
|
i32 cl_filename_len = cl_filename.size;
|
||||||
|
for (i32 i = 0; i < models->settings.init_files_count; ++i){
|
||||||
i32 i = 0;
|
|
||||||
Panel *panel = models->layout.used_sentinel.next;
|
|
||||||
for (; i < models->settings.init_files_count; ++i, panel = panel->next){
|
|
||||||
cl_filename.size = cl_filename_len;
|
cl_filename.size = cl_filename_len;
|
||||||
|
|
||||||
String filename = {0};
|
String filename = {0};
|
||||||
|
|
||||||
Editing_File_Canon_Name canon_name;
|
Editing_File_Canon_Name canon_name;
|
||||||
if (get_canon_name(system, &canon_name, make_string_slowly(models->settings.init_files[i]))){
|
if (get_canon_name(system, &canon_name, make_string_slowly(models->settings.init_files[i]))){
|
||||||
filename = canon_name.name;
|
filename = canon_name.name;
|
||||||
|
@ -1545,35 +1515,21 @@ App_Step_Sig(app_step){
|
||||||
filename = cl_filename;
|
filename = cl_filename;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (i < models->layout.panel_count){
|
open_file(system, models, filename);
|
||||||
view_open_file(system, models, panel->view, filename);
|
}
|
||||||
view_show_file(panel->view);
|
|
||||||
Assert("Earlier" && panel->view->file_data.file != 0);
|
if (models->hook_start != 0){
|
||||||
#if 0
|
char **files = models->settings.init_files;
|
||||||
if (i == 0){
|
i32 files_count = models->settings.init_files_count;
|
||||||
if (panel->view->file_data.file){
|
|
||||||
// TODO(allen): How to set the cursor of a file on the first frame?
|
|
||||||
view_compute_cursor_from_line_pos(panel->view, models->settings.initial_line, 1);
|
|
||||||
view_move_view_to_cursor(panel->view, &panel->view->recent.scroll);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
view_open_file(system, models, 0, filename);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
char **flags = models->settings.custom_flags;
|
||||||
|
i32 flags_count = models->settings.custom_flags_count;
|
||||||
|
|
||||||
|
models->hook_start(&models->app_links, files, files_count, flags, flags_count);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (i < models->layout.panel_count){
|
Panel *panel = models->layout.used_sentinel.next;
|
||||||
view_set_file(system, panel->view, models->message_buffer, models);
|
for (i32 i = 0; i < models->settings.init_files_count; ++i, panel = panel->next){
|
||||||
view_show_file(panel->view);
|
|
||||||
++i;
|
|
||||||
panel = panel->next;
|
|
||||||
}
|
|
||||||
|
|
||||||
panel = models->layout.used_sentinel.next;
|
|
||||||
for (i = 0; i < models->settings.init_files_count; ++i, panel = panel->next){
|
|
||||||
Assert(panel->view->file_data.file != 0);
|
Assert(panel->view->file_data.file != 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,15 +14,15 @@ struct App_Settings{
|
||||||
i32 init_files_count;
|
i32 init_files_count;
|
||||||
i32 init_files_max;
|
i32 init_files_max;
|
||||||
|
|
||||||
|
char **custom_flags;
|
||||||
|
i32 custom_flags_count;
|
||||||
|
|
||||||
i32 initial_line;
|
i32 initial_line;
|
||||||
b32 lctrl_lalt_is_altgr;
|
b32 lctrl_lalt_is_altgr;
|
||||||
|
|
||||||
char *custom_font_file;
|
char *custom_font_file;
|
||||||
char *custom_font_name;
|
char *custom_font_name;
|
||||||
i32 custom_font_size;
|
i32 custom_font_size;
|
||||||
|
|
||||||
i32 custom_arg_start;
|
|
||||||
i32 custom_arg_end;
|
|
||||||
};
|
};
|
||||||
global_const App_Settings null_app_settings = {0};
|
global_const App_Settings null_app_settings = {0};
|
||||||
|
|
||||||
|
@ -65,6 +65,7 @@ struct Models{
|
||||||
|
|
||||||
Custom_API config_api;
|
Custom_API config_api;
|
||||||
|
|
||||||
|
Start_Hook_Function *hook_start;
|
||||||
Open_File_Hook_Function *hook_open_file;
|
Open_File_Hook_Function *hook_open_file;
|
||||||
Open_File_Hook_Function *hook_new_file;
|
Open_File_Hook_Function *hook_new_file;
|
||||||
Open_File_Hook_Function *hook_save_file;
|
Open_File_Hook_Function *hook_save_file;
|
||||||
|
|
|
@ -24,7 +24,7 @@
|
||||||
|
|
||||||
// TODO(allen): set in compilation line
|
// TODO(allen): set in compilation line
|
||||||
#define PREFERRED_ALIGNMENT 8
|
#define PREFERRED_ALIGNMENT 8
|
||||||
#define USE_DEBUG_MEMORY
|
//#define USE_DEBUG_MEMORY
|
||||||
|
|
||||||
#define FSTRING_IMPLEMENTATION
|
#define FSTRING_IMPLEMENTATION
|
||||||
#define FSTRING_C
|
#define FSTRING_C
|
||||||
|
|
|
@ -260,7 +260,7 @@ get_view_size(){
|
||||||
return(sizeof(View) - sizeof(View_Persistent));
|
return(sizeof(View) - sizeof(View_Persistent));
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO(past-allen): Switch over to using an i32 for these.
|
// TODO(allen): Switch over to using an i32 for these.
|
||||||
inline f32
|
inline f32
|
||||||
view_width(View *view){
|
view_width(View *view){
|
||||||
i32_Rect file_rect = view->file_region;
|
i32_Rect file_rect = view->file_region;
|
||||||
|
@ -1788,7 +1788,7 @@ file_measure_wraps(System_Functions *system, Models *models, Editing_File *file,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!emit_comment_position){
|
if (!emit_comment_position){
|
||||||
step = wrap_state_consume_token(system, font, &wrap_state, next_line_start-1);
|
step = wrap_state_consume_token(system, font, &wrap_state, next_line_start);
|
||||||
}
|
}
|
||||||
|
|
||||||
b32 need_to_choose_a_wrap = 0;
|
b32 need_to_choose_a_wrap = 0;
|
||||||
|
@ -3885,8 +3885,8 @@ init_read_only_file(System_Functions *system, Models *models, Editing_File *file
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
internal void
|
internal Editing_File*
|
||||||
view_open_file(System_Functions *system, Models *models, View *view, String filename){
|
open_file(System_Functions *system, Models *models, String filename){
|
||||||
Working_Set *working_set = &models->working_set;
|
Working_Set *working_set = &models->working_set;
|
||||||
Editing_File *file = 0;
|
Editing_File *file = 0;
|
||||||
|
|
||||||
|
@ -3896,7 +3896,6 @@ view_open_file(System_Functions *system, Models *models, View *view, String file
|
||||||
file = working_set_canon_contains(working_set, canon_name.name);
|
file = working_set_canon_contains(working_set, canon_name.name);
|
||||||
|
|
||||||
if (!file){
|
if (!file){
|
||||||
|
|
||||||
Plat_Handle handle;
|
Plat_Handle handle;
|
||||||
if (system->load_handle(canon_name.name.str, &handle)){
|
if (system->load_handle(canon_name.name.str, &handle)){
|
||||||
Mem_Options *mem = &models->mem;
|
Mem_Options *mem = &models->mem;
|
||||||
|
@ -3939,6 +3938,12 @@ view_open_file(System_Functions *system, Models *models, View *view, String file
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return(file);
|
||||||
|
}
|
||||||
|
|
||||||
|
internal void
|
||||||
|
view_open_file(System_Functions *system, Models *models, View *view, String filename){
|
||||||
|
Editing_File *file = open_file(system, models, filename);
|
||||||
if (file){
|
if (file){
|
||||||
view_set_file(system, view, file, models);
|
view_set_file(system, view, file, models);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue