PlainTextEditor.vala 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. using Gtk;
  2. using Adw;
  3. using GtkCommonMark;
  4. namespace Publicate.Editors {
  5. public class PlainTextEditor : Box, EditorWidget, Savable {
  6. private TextView text_view;
  7. private ScrolledWindow scroller;
  8. private ViewerWindow window;
  9. private TabPage page;
  10. public Adw.TabPage tab_page { get {
  11. return page;
  12. } }
  13. public string asset_name { get{
  14. return asset.name;
  15. } }
  16. private bool unsaved = false;
  17. public bool has_unsaved_changes { get{
  18. return unsaved;
  19. } }
  20. private Ppub.Asset asset;
  21. public PlainTextEditor(ViewerWindow win, TabView tab_view) {
  22. window = win;
  23. orientation = Orientation.VERTICAL;
  24. scroller = new ScrolledWindow ();
  25. text_view = new TextView();
  26. text_view.monospace = true;
  27. text_view.hexpand = true;
  28. text_view.set_wrap_mode (WrapMode.WORD_CHAR);
  29. text_view.top_margin = 18;
  30. text_view.bottom_margin = 18;
  31. text_view.left_margin = 18;
  32. text_view.right_margin = 18;
  33. text_view.buffer.changed.connect (text_changed);
  34. scroller.set_policy (PolicyType.NEVER, PolicyType.AUTOMATIC);
  35. scroller.vexpand = true;
  36. scroller.child = text_view;
  37. append(scroller);
  38. page = tab_view.add_page (this, null);
  39. }
  40. public async void load_asset (Ppub.Publication publication, Ppub.Asset asset) {
  41. this.asset = asset;
  42. text_view.buffer.set_text("", 0);
  43. MemoryOutputStream os = new MemoryOutputStream (null, GLib.realloc, GLib.free);
  44. yield os.splice_async (publication.read_asset (asset.name), OutputStreamSpliceFlags.CLOSE_SOURCE | OutputStreamSpliceFlags.CLOSE_TARGET);
  45. var text = os.steal_data ();
  46. text.length = (int) os.get_data_size ();
  47. text_view.buffer.set_text ((string)text, text.length);
  48. set_tab_name(false);
  49. }
  50. public override void save_asset(Ppub.Builder builder) {
  51. var article_data = get_text().to_utf8();
  52. var article_stream = new MemoryInputStream.from_data((uint8[])article_data);
  53. var compression_info = new Ppub.CompressionInfo(article_stream);
  54. article_stream.seek(0, SeekType.SET);
  55. builder.add_asset(asset.name, asset.mimetype, article_stream, Invercargill.empty<string>(), compression_info);
  56. set_tab_name(false);
  57. }
  58. private void text_changed() {
  59. set_tab_name(true);
  60. }
  61. public string get_text() {
  62. TextIter start_iter;
  63. TextIter end_iter;
  64. text_view.buffer.get_start_iter (out start_iter);
  65. text_view.buffer.get_end_iter (out end_iter);
  66. var text = text_view.buffer.get_text (start_iter, end_iter, true);
  67. return text;
  68. }
  69. private void set_tab_name(bool unsaved) {
  70. if(unsaved) {
  71. tab_page.title = @"⏺ $(asset.name)";
  72. }
  73. else {
  74. tab_page.title = asset.name;
  75. }
  76. this.unsaved = unsaved;
  77. }
  78. }
  79. }