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)
This commit is contained in:
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};
|
||||||
|
|
90
4ed.cpp
90
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 0
|
|
||||||
if (i == 0){
|
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (models->hook_start != 0){
|
||||||
|
char **files = models->settings.init_files;
|
||||||
|
i32 files_count = models->settings.init_files_count;
|
||||||
|
|
||||||
|
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