<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>
<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>
#[macro_use]
extern crate horrorshow;
-mod state;
mod preview;
mod utils;
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");
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();
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() {
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));
}));
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() {
}
}
-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));
}