Save modified file on editor(1) open and quit.

This commit is contained in:
Jonas 'Sortie' Termansen 2016-02-24 23:29:23 +01:00
parent d472818380
commit 4ee8f9ec38
5 changed files with 86 additions and 4 deletions

View File

@ -662,7 +662,7 @@ void editor_type_save_as(struct editor* editor)
void editor_type_open(struct editor* editor) void editor_type_open(struct editor* editor)
{ {
editor->mode = MODE_LOAD; editor->mode = editor->dirty ? MODE_ASK_LOAD : MODE_LOAD;
editor->modal_used = 0; editor->modal_used = 0;
editor->modal_cursor = 0; editor->modal_cursor = 0;
editor->modal_error = false; editor->modal_error = false;
@ -670,6 +670,9 @@ void editor_type_open(struct editor* editor)
void editor_type_open_as(struct editor* editor) void editor_type_open_as(struct editor* editor)
{ {
if ( editor->dirty )
return editor_type_open(editor);
editor->mode = MODE_LOAD; editor->mode = MODE_LOAD;
free(editor->modal); free(editor->modal);

View File

@ -258,12 +258,16 @@ void render_editor(struct editor* editor, struct terminal_state* state)
return; return;
const char* msg = ""; const char* msg = "";
if ( editor->mode == MODE_SAVE ) if ( editor->mode == MODE_SAVE ||
editor->mode == MODE_SAVE_LOAD ||
editor->mode == MODE_SAVE_QUIT )
msg = "File Name to Write: "; msg = "File Name to Write: ";
if ( editor->mode == MODE_LOAD ) if ( editor->mode == MODE_LOAD )
msg = "File Name to Read: "; msg = "File Name to Read: ";
if ( editor->mode == MODE_ASK_LOAD )
msg = "Save modified file? (Y/N): ";
if ( editor->mode == MODE_ASK_QUIT ) if ( editor->mode == MODE_ASK_QUIT )
msg = "Exit without saving changes? (Y/N): "; msg = "Save modified file? (Y/N): ";
if ( editor->mode == MODE_GOTO_LINE ) if ( editor->mode == MODE_GOTO_LINE )
msg = "Go to line: "; msg = "Go to line: ";
if ( editor->mode == MODE_COMMAND ) if ( editor->mode == MODE_COMMAND )

View File

@ -48,6 +48,9 @@ enum editor_mode
MODE_EDIT, MODE_EDIT,
MODE_LOAD, MODE_LOAD,
MODE_SAVE, MODE_SAVE,
MODE_SAVE_LOAD,
MODE_SAVE_QUIT,
MODE_ASK_LOAD,
MODE_ASK_QUIT, MODE_ASK_QUIT,
MODE_GOTO_LINE, MODE_GOTO_LINE,
MODE_COMMAND, MODE_COMMAND,

View File

@ -38,6 +38,12 @@
#include "modal.h++" #include "modal.h++"
#include "multibyte.h++" #include "multibyte.h++"
static void editor_reset_modal(struct editor* editor)
{
editor->modal_used = 0;
editor->modal_cursor = 0;
}
bool is_truth_string(const char* truth) bool is_truth_string(const char* truth)
{ {
return !strcmp(truth, "on") || !strcmp(truth, "off"); return !strcmp(truth, "on") || !strcmp(truth, "off");
@ -110,11 +116,71 @@ void editor_modal_save(struct editor* editor, const char* path)
editor->modal_error = true; editor->modal_error = true;
} }
void editor_modal_save_load(struct editor* editor, const char* path)
{
if ( editor_save_file(editor, path) )
{
editor_reset_modal(editor);
editor->mode = MODE_LOAD;
}
else
editor->modal_error = true;
}
void editor_modal_save_quit(struct editor* editor, const char* path)
{
if ( editor_save_file(editor, path) )
editor->mode = MODE_QUIT;
else
editor->modal_error = true;
}
void editor_modal_ask_load(struct editor* editor, const char* answer)
{
if ( tolower((unsigned char) answer[0]) == 'y' )
{
editor_reset_modal(editor);
if ( editor->current_file_name )
{
if ( editor_save_file(editor, editor->current_file_name) )
{
editor->mode = MODE_LOAD;
return;
}
editor->modal_error = true;
}
editor->mode = MODE_SAVE_LOAD;
}
else if ( tolower((unsigned char) answer[0]) == 'n' )
{
editor_reset_modal(editor);
editor->mode = MODE_LOAD;
}
else if ( !answer[0] )
editor_type_edit(editor);
else
editor->modal_error = true;
}
void editor_modal_ask_quit(struct editor* editor, const char* answer) void editor_modal_ask_quit(struct editor* editor, const char* answer)
{ {
if ( tolower((unsigned char) answer[0]) == 'y' ) if ( tolower((unsigned char) answer[0]) == 'y' )
{
editor_reset_modal(editor);
if ( editor->current_file_name )
{
if ( editor_save_file(editor, editor->current_file_name) )
{
editor->mode = MODE_QUIT;
return;
}
editor->modal_error = true;
}
editor->mode = MODE_SAVE_QUIT;
}
else if ( tolower((unsigned char) answer[0]) == 'n' )
editor->mode = MODE_QUIT; editor->mode = MODE_QUIT;
else if ( tolower((unsigned char) answer[0]) == 'n' || !answer[0] ) else if ( !answer[0] )
editor_type_edit(editor); editor_type_edit(editor);
else else
editor->modal_error = true; editor->modal_error = true;
@ -321,6 +387,9 @@ void editor_modal_character(struct editor* editor, wchar_t c)
{ {
case MODE_LOAD: editor_modal_load(editor, param); break; case MODE_LOAD: editor_modal_load(editor, param); break;
case MODE_SAVE: editor_modal_save(editor, param); break; case MODE_SAVE: editor_modal_save(editor, param); break;
case MODE_SAVE_LOAD: editor_modal_save_load(editor, param); break;
case MODE_SAVE_QUIT: editor_modal_save_quit(editor, param); break;
case MODE_ASK_LOAD: editor_modal_ask_load(editor, param); break;
case MODE_ASK_QUIT: editor_modal_ask_quit(editor, param); break; case MODE_ASK_QUIT: editor_modal_ask_quit(editor, param); break;
case MODE_GOTO_LINE: editor_modal_goto_line(editor, param); break; case MODE_GOTO_LINE: editor_modal_goto_line(editor, param); break;
case MODE_COMMAND: editor_modal_command(editor, param); break; case MODE_COMMAND: editor_modal_command(editor, param); break;

View File

@ -37,6 +37,9 @@ void editor_modal_delete(struct editor* editor);
void editor_modal_load(struct editor* editor, const char* path); void editor_modal_load(struct editor* editor, const char* path);
void editor_modal_save(struct editor* editor, const char* path); void editor_modal_save(struct editor* editor, const char* path);
void editor_modal_save_load(struct editor* editor, const char* path);
void editor_modal_save_quit(struct editor* editor, const char* path);
void editor_modal_ask_load(struct editor* editor, const char* answer);
void editor_modal_ask_quit(struct editor* editor, const char* answer); void editor_modal_ask_quit(struct editor* editor, const char* answer);
void editor_modal_goto_line(struct editor* editor, const char* linestr); void editor_modal_goto_line(struct editor* editor, const char* linestr);
void editor_modal_margin(struct editor* editor, const char* marginstr); void editor_modal_margin(struct editor* editor, const char* marginstr);