]> OzVa Git service - gn-editor/commitdiff
Sourceview text buffer
authorNil Gradisnik <nil@layer.com>
Fri, 8 Dec 2017 02:53:57 +0000 (18:53 -0800)
committerNil Gradisnik <nil@layer.com>
Fri, 8 Dec 2017 02:53:57 +0000 (18:53 -0800)
Cargo.toml
src/gtk-ui.glade
src/main.rs
src/utils.rs

index e227b6e7a4716a2d0faa30e176686384cc2dc501..8c4f514e04025a75a6f0aef4d0eea3b312ffacd3 100644 (file)
@@ -15,8 +15,7 @@ horrorshow = "0.6"
 
 [dependencies.gtk]
 version = "0.3"
-default-features = false
-features = ["v3_22"]
+features = ["v3_20"]
 
 [dev-dependencies]
 clippy = "0.0.175"
index 7bfa1e103d0e698a99c249922b32f94bc6fe6084..83046f963e89de6fecc045b77c05275bbfa71728 100644 (file)
@@ -41,6 +41,9 @@ Author: Nil Gradisnik
       <pattern>*.md</pattern>
     </patterns>
   </object>
+  <object class="GtkSourceBuffer" id="text_buffer">
+    <property name="max_undo_levels">0</property>
+  </object>
   <object class="GtkApplicationWindow" id="window">
     <property name="can_focus">False</property>
     <property name="title" translatable="yes">Markdown Rust</property>
@@ -72,6 +75,7 @@ Author: Nil Gradisnik
                     <property name="right_margin">2</property>
                     <property name="top_margin">2</property>
                     <property name="bottom_margin">2</property>
+                    <property name="buffer">text_buffer</property>
                     <property name="input_hints">GTK_INPUT_HINT_SPELLCHECK | GTK_INPUT_HINT_WORD_COMPLETION | GTK_INPUT_HINT_NONE</property>
                     <property name="monospace">True</property>
                     <property name="show_line_marks">True</property>
index 810c9eb8aafaa01615502f24a6fdb2d9faa04eaa..d0e433f70e6314244715fb705c18c67fe695d0a9 100644 (file)
@@ -7,7 +7,6 @@ extern crate comrak;
 #[macro_use]
 extern crate horrorshow;
 
-mod state;
 mod preview;
 mod utils;
 
@@ -20,7 +19,7 @@ use gio::prelude::*;
 use gtk::prelude::*;
 use gtk::Builder;
 
-use utils::{buffer_to_string, set_title};
+use utils::{buffer_to_string, set_title, configure_sourceview};
 
 const NAME: &str = env!("CARGO_PKG_NAME");
 const VERSION: &str = env!("CARGO_PKG_VERSION");
@@ -62,6 +61,9 @@ fn build_ui(application: &gtk::Application) {
     let about_button: gtk::ToolButton = builder.get_object("about_button").unwrap();
 
     let text_view: sourceview::View = builder.get_object("text_view").unwrap();
+    let text_buffer: sourceview::Buffer = builder.get_object("text_buffer").unwrap();
+    configure_sourceview(&text_buffer);
+
     let markdown_view: gtk::TextView = builder.get_object("markdown_view").unwrap();
 
     let file_chooser: gtk::FileChooserDialog = builder.get_object("file_chooser").unwrap();
@@ -76,7 +78,7 @@ fn build_ui(application: &gtk::Application) {
     about_dialog.set_authors(&[AUTHORS]);
     about_dialog.set_comments(DESCRIPTION);
 
-    open_button.connect_clicked(clone!(header_bar, text_view, markdown_view => move |_| {
+    open_button.connect_clicked(clone!(header_bar, text_buffer, markdown_view => move |_| {
         file_chooser.show();
 
         if file_chooser.run() == gtk::ResponseType::Ok.into() {
@@ -93,23 +95,23 @@ fn build_ui(application: &gtk::Application) {
                 header_bar.set_subtitle(subtitle);
             }
 
-            text_view.get_buffer().unwrap().set_text(&contents);
+            text_buffer.set_text(&contents);
             markdown_view.get_buffer().unwrap().set_text(&preview::render(&contents));
         }
 
         file_chooser.hide();
     }));
 
-    text_view.connect_key_release_event(clone!(text_view, markdown_view, live_button => move |_, _| {
+    text_view.connect_key_release_event(clone!(text_buffer, markdown_view, live_button => move |_, _| {
         if live_button.get_active() {
-            let markdown = buffer_to_string(text_view.get_buffer()).unwrap();
+            let markdown = buffer_to_string(&text_buffer).unwrap();
             markdown_view.get_buffer().unwrap().set_text(&preview::render(&markdown));
         }
         Inhibit(true)
     }));
 
-    render_button.connect_clicked(clone!(text_view, markdown_view => move |_| {
-        let markdown = buffer_to_string(text_view.get_buffer()).unwrap();
+    render_button.connect_clicked(clone!(text_buffer, markdown_view => move |_| {
+        let markdown = buffer_to_string(&text_buffer).unwrap();
         markdown_view.get_buffer().unwrap().set_text(&preview::render(&markdown));
     }));
 
index 9928a7b0d37950e8ab685ad3ab4898ff11825daa..21a9210d6ef3535849cf959fc06a82bb46297303 100644 (file)
@@ -1,6 +1,6 @@
 use gtk::*;
+use sourceview::*;
 use std::path::Path;
-use gtk::TextBuffer;
 
 pub fn set_title(headerbar: &HeaderBar, path: &Path) {
     if let Some(filename) = path.file_name() {
@@ -9,12 +9,18 @@ pub fn set_title(headerbar: &HeaderBar, path: &Path) {
     }
 }
 
-pub fn buffer_to_string(buffer: Option<TextBuffer>) -> Option<String> {
-    match buffer {
-      Some(buffer) => {
-        let (start, end) = buffer.get_bounds();
-        buffer.get_text(&start, &end, false)
-      },
-      None => panic!("Error getting string from buffer")
-    }
+pub fn buffer_to_string(buffer: &Buffer) -> Option<String> {
+    let (start, end) = buffer.get_bounds();
+    buffer.get_text(&start, &end, false)
+}
+
+pub fn configure_sourceview(buff: &Buffer) {
+    LanguageManager::new()
+        .get_language("markdown")
+        .map(|markdown| buff.set_language(&markdown));
+
+    let manager = StyleSchemeManager::new();
+    manager
+        .get_scheme("classic")
+        .map(|theme| buff.set_style_scheme(&theme));
 }