]> OzVa Git service - gn-editor/commitdiff
Implement save file
authorNil Gradisnik <nil.gradisnik@gmail.com>
Tue, 10 Apr 2018 04:59:59 +0000 (21:59 -0700)
committerNil Gradisnik <nil.gradisnik@gmail.com>
Tue, 10 Apr 2018 04:59:59 +0000 (21:59 -0700)
src/gtk-ui.glade
src/main.rs
src/utils.rs

index 9bc7938e6f237cbde7d3b74010f878fc71685eb6..e46d2cf9f6954d7b8f88f52e0eee033018c8c7c1 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- Generated with glade 3.20.
+<!-- Generated with glade 3.20.4
 
 The MIT License (MIT)
 
@@ -135,6 +135,21 @@ Author: Nil Gradisnik
             <accelerator key="o" signal="clicked" modifiers="GDK_CONTROL_MASK"/>
           </object>
         </child>
+        <child>
+          <object class="GtkToolButton" id="save_button">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="tooltip_text" translatable="yes">Save</property>
+            <property name="is_important">True</property>
+            <property name="label" translatable="yes">Save</property>
+            <property name="use_underline">True</property>
+            <property name="icon_name">document-save</property>
+            <accelerator key="s" signal="clicked" modifiers="GDK_CONTROL_MASK"/>
+          </object>
+          <packing>
+            <property name="position">1</property>
+          </packing>
+        </child>
       </object>
     </child>
   </object>
@@ -182,13 +197,39 @@ Author: Nil Gradisnik
       <placeholder/>
     </child>
   </object>
-  <object class="GtkFileChooserDialog" id="file_chooser">
+  <object class="GtkFileChooserDialog" id="file_open">
     <property name="can_focus">False</property>
     <property name="window_position">center-on-parent</property>
     <property name="type_hint">dialog</property>
     <property name="transient_for">window</property>
     <property name="attached_to">window</property>
     <property name="filter">md_filter</property>
+    <child internal-child="vbox">
+      <object class="GtkBox">
+        <property name="can_focus">False</property>
+        <child internal-child="action_area">
+          <object class="GtkButtonBox">
+            <property name="can_focus">False</property>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">False</property>
+            <property name="position">0</property>
+          </packing>
+        </child>
+      </object>
+    </child>
+    <child>
+      <placeholder/>
+    </child>
+  </object>
+  <object class="GtkFileChooserDialog" id="file_save">
+    <property name="can_focus">False</property>
+    <property name="type_hint">dialog</property>
+    <property name="transient_for">window</property>
+    <property name="attached_to">window</property>
+    <property name="action">save</property>
+    <property name="filter">md_filter</property>
     <child internal-child="vbox">
       <object class="GtkBox">
         <property name="can_focus">False</property>
index 10c8834567b2524ecf9f4b750a4f291bba70e10b..489469ec7f31e49084e15db13b63527416834931 100644 (file)
@@ -24,7 +24,7 @@ use std::env::args;
 use std::time::{SystemTime, UNIX_EPOCH};
 
 use preview::Preview;
-use utils::{buffer_to_string, configure_sourceview, open_file, set_title};
+use utils::{buffer_to_string, configure_sourceview, open_file, save_file, set_title};
 
 const NAME: &str = env!("CARGO_PKG_NAME");
 const VERSION: &str = env!("CARGO_PKG_VERSION");
@@ -70,6 +70,7 @@ fn build_ui(application: &gtk::Application) {
     header_bar.set_title(NAME);
 
     let open_button: gtk::ToolButton = builder.get_object("open_button").unwrap();
+    let save_button: gtk::ToolButton = builder.get_object("save_button").unwrap();
 
     let text_buffer: sourceview::Buffer = builder.get_object("text_buffer").unwrap();
     configure_sourceview(&text_buffer);
@@ -80,11 +81,11 @@ fn build_ui(application: &gtk::Application) {
     let markdown_view: gtk::ScrolledWindow = builder.get_object("scrolled_window_right").unwrap();
     markdown_view.add(&web_view);
 
-    let file_chooser: gtk::FileChooserDialog = builder.get_object("file_chooser").unwrap();
-    file_chooser.add_buttons(&[
-        ("Open", gtk::ResponseType::Ok.into()),
-        ("Cancel", gtk::ResponseType::Cancel.into()),
-    ]);
+    let file_open: gtk::FileChooserDialog = builder.get_object("file_open").unwrap();
+    file_open.add_buttons(&[("Open", gtk::ResponseType::Ok.into()), ("Cancel", gtk::ResponseType::Cancel.into())]);
+
+    let file_save: gtk::FileChooserDialog = builder.get_object("file_save").unwrap();
+    file_save.add_buttons(&[("Save", gtk::ResponseType::Ok.into()), ("Cancel", gtk::ResponseType::Cancel.into())]);
 
     let about_dialog: gtk::AboutDialog = builder.get_object("about_dialog").unwrap();
     about_dialog.set_program_name(NAME);
@@ -109,18 +110,27 @@ fn build_ui(application: &gtk::Application) {
     }));
     web_view.connect_load_failed(move |_, _, _, _| true);
 
-    open_button.connect_clicked(clone!(header_bar, text_buffer => move |_| {
-        file_chooser.show();
-
-        if file_chooser.run() == gtk::ResponseType::Ok.into() {
-            let filename = file_chooser.get_filename().expect("Couldn't get filename");
+    open_button.connect_clicked(clone!(file_open, header_bar, text_buffer => move |_| {
+        file_open.show();
+        if file_open.run() == gtk::ResponseType::Ok.into() {
+            let filename = file_open.get_filename().expect("Couldn't get filename");
             set_title(&header_bar, &filename);
 
             let contents = open_file(&filename);
             text_buffer.set_text(&contents);
         }
+        file_open.hide();
+    }));
 
-        file_chooser.hide();
+    save_button.connect_clicked(clone!(file_save, text_buffer => move |_| {
+        file_save.show();
+        if file_save.run() == gtk::ResponseType::Ok.into() {
+            let filename = file_save.get_filename().expect("Couldn't get filename");
+            set_title(&header_bar, &filename);
+
+            save_file(&filename, &text_buffer);
+        }
+        file_save.hide();
     }));
 
     about_dialog.connect_delete_event(move |dialog, _| {
index a9ad6a85e578a7b8bff6022a77527eb3d05b039f..51484c1953f412fd73c41e45f4c3257aa0cf96e4 100644 (file)
@@ -33,6 +33,12 @@ pub fn open_file(filename: &PathBuf) -> String {
     contents
 }
 
+pub fn save_file(filename: &PathBuf, text_buffer: &Buffer) {
+    let contents = buffer_to_string(text_buffer).unwrap();
+    let mut file = File::create(filename).expect("Couldn't save file");
+    file.write_all(contents.as_bytes()).expect("File save failed");
+}
+
 pub fn configure_sourceview(buff: &Buffer) {
     LanguageManager::new()
         .get_language("markdown")