|
@@ -72,11 +72,14 @@ namespace Publicate {
|
|
tab_box.append(tab_view);
|
|
tab_box.append(tab_view);
|
|
leaflet.append(tab_box);
|
|
leaflet.append(tab_box);
|
|
|
|
|
|
|
|
+ tab_view.close_page.connect(editor_closing);
|
|
|
|
+
|
|
save_tab_button = new Button.from_icon_name("document-save-symbolic");
|
|
save_tab_button = new Button.from_icon_name("document-save-symbolic");
|
|
save_tab_button.clicked.connect(save_tab);
|
|
save_tab_button.clicked.connect(save_tab);
|
|
header.pack_end(save_tab_button);
|
|
header.pack_end(save_tab_button);
|
|
|
|
|
|
tab_view.notify["selected-page"].connect(() => select_file_from_tab());
|
|
tab_view.notify["selected-page"].connect(() => select_file_from_tab());
|
|
|
|
+ window.close_request.connect(app_close_request);
|
|
|
|
|
|
append(leaflet);
|
|
append(leaflet);
|
|
}
|
|
}
|
|
@@ -116,6 +119,36 @@ namespace Publicate {
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ private bool editor_closing(TabPage page) {
|
|
|
|
+ var editor = (Editors.EditorWidget)page.child;
|
|
|
|
+ if(editor.has_unsaved_changes && open_editors.has_key(editor.asset_name)) {
|
|
|
|
+ var prompt = new Adw.MessageDialog(window, "Save Changes?", "This editor has unsaved changes, would you like to save them before closing?");
|
|
|
|
+ prompt.add_response("cancel", "Cancel");
|
|
|
|
+ prompt.add_response("discard", "Discard");
|
|
|
|
+ prompt.add_response("save", "Save");
|
|
|
|
+ prompt.response.connect(r => {
|
|
|
|
+ if(r == "save") {
|
|
|
|
+ save_and_close_tab_page.begin(page);
|
|
|
|
+ }
|
|
|
|
+ else if(r == "discard") {
|
|
|
|
+ open_editors.unset(editor.asset_name);
|
|
|
|
+ tab_view.close_page(page);
|
|
|
|
+ tab_view.close_page_finish(page, true);
|
|
|
|
+ }
|
|
|
|
+ else {
|
|
|
|
+ tab_view.close_page_finish(page, false);
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+
|
|
|
|
+ prompt.present();
|
|
|
|
+ return Gdk.EVENT_STOP;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ open_editors.unset(editor.asset_name);
|
|
|
|
+ tab_view.close_page_finish(page, true);
|
|
|
|
+ return Gdk.EVENT_STOP;
|
|
|
|
+ }
|
|
|
|
+
|
|
private void add_editor(Editors.EditorWidget editor, Ppub.Asset asset) {
|
|
private void add_editor(Editors.EditorWidget editor, Ppub.Asset asset) {
|
|
editor.load_asset(publication, asset);
|
|
editor.load_asset(publication, asset);
|
|
open_editors.set(asset.name, editor);
|
|
open_editors.set(asset.name, editor);
|
|
@@ -147,6 +180,29 @@ namespace Publicate {
|
|
yield save(to_save);
|
|
yield save(to_save);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ private async void save_all() {
|
|
|
|
+ var to_save = publication.assets.select<Savable>(get_savable_editor_or_asset);
|
|
|
|
+ yield save(to_save);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private Savable get_savable_editor_or_asset(Ppub.Asset asset) {
|
|
|
|
+ if(open_editors.has_key(asset.name)) {
|
|
|
|
+ var editor = open_editors[asset.name];
|
|
|
|
+ if(editor.has_unsaved_changes) {
|
|
|
|
+ return (Savable)editor;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ return new SavableAsset(publication, asset);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private async void save_and_close_tab_page(TabPage page) {
|
|
|
|
+ var editor = (Editors.EditorWidget)page.child;
|
|
|
|
+ var to_save = publication.assets.select<Savable>(a => a.name == editor.asset_name ? (Savable)editor : new SavableAsset(publication, a));
|
|
|
|
+ yield save(to_save);
|
|
|
|
+ open_editors.unset(editor.asset_name);
|
|
|
|
+ tab_view.close_page_finish(page, true);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
|
|
private void select_file_from_tab() {
|
|
private void select_file_from_tab() {
|
|
var editor = (Editors.EditorWidget)tab_view.selected_page.child;
|
|
var editor = (Editors.EditorWidget)tab_view.selected_page.child;
|
|
@@ -181,5 +237,34 @@ namespace Publicate {
|
|
var mimetype = Ppub.guess_mimetype(file.get_basename(), sample);
|
|
var mimetype = Ppub.guess_mimetype(file.get_basename(), sample);
|
|
yield add_asset(file.get_basename(), mimetype, stream, compression);
|
|
yield add_asset(file.get_basename(), mimetype, stream, compression);
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ private bool app_close_request() {
|
|
|
|
+ if(Invercargill.gte(open_editors.values).any(e => e.has_unsaved_changes)) {
|
|
|
|
+ var prompt = new Adw.MessageDialog(window, "Save Changes?", "There are editors with unsaved changes, would you like to save them before closing?");
|
|
|
|
+ prompt.add_response("cancel", "Cancel");
|
|
|
|
+ prompt.add_response("discard", "Discard");
|
|
|
|
+ prompt.add_response("save", "Save All");
|
|
|
|
+ prompt.response.connect(r => {
|
|
|
|
+ if(r == "save") {
|
|
|
|
+ save_all_and_close.begin();
|
|
|
|
+ }
|
|
|
|
+ else if(r == "discard") {
|
|
|
|
+ open_editors.clear();
|
|
|
|
+ window.close();
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+ prompt.present();
|
|
|
|
+ return Gdk.EVENT_STOP;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return Gdk.EVENT_PROPAGATE;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private async void save_all_and_close() {
|
|
|
|
+ yield save_all();
|
|
|
|
+ window.close();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
}
|
|
}
|
|
}
|
|
}
|