MetadataEditor.vala 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. using Gtk;
  2. using Adw;
  3. using GtkCommonMark;
  4. using Invercargill;
  5. namespace Publicate.Editors {
  6. public class MetadataEditor : Box, EditorWidget, Savable {
  7. private Ppub.Metadata metadata;
  8. private Ppub.Asset asset;
  9. private TabPage page;
  10. private EntryRow title;
  11. private EntryRow author;
  12. private EntryRow author_email;
  13. private FileChooserRow poster;
  14. private EntryRow description;
  15. private EntryRow tags;
  16. private FileChooserRow licence;
  17. private EntryRow copyright;
  18. private ViewerWindow window;
  19. private bool unsaved = false;
  20. public bool has_unsaved_changes { get{
  21. return unsaved;
  22. } }
  23. public MetadataEditor(ViewerWindow win, TabView tab_view) {
  24. window = win;
  25. var scroll_window = new ScrolledWindow ();
  26. scroll_window.hexpand = true;
  27. scroll_window.vexpand = true;
  28. var box = new Box(Orientation.VERTICAL, 0);
  29. scroll_window.child = box;
  30. append(scroll_window);
  31. var group = new PreferencesGroup();
  32. group.margin_bottom = 18;
  33. group.margin_end = 18;
  34. group.margin_start = 18;
  35. group.margin_top = 18;
  36. group.title = "Publication Details";
  37. group.description = "";
  38. title = new EntryRow ();
  39. title.title = "Title";
  40. title.changed.connect (something_changed);
  41. group.add(title);
  42. author = new EntryRow ();
  43. author.title = "Author";
  44. author.changed.connect (something_changed);
  45. group.add(author);
  46. author_email = new EntryRow ();
  47. author_email.title = "Author Email";
  48. author_email.changed.connect (something_changed);
  49. group.add(author_email);
  50. poster = new FileChooserRow (window);
  51. poster.title = "Poster Image";
  52. poster.asset_selected.connect (something_changed);
  53. group.add(poster);
  54. description = new EntryRow ();
  55. description.enable_emoji_completion = true;
  56. description.title = "Description";
  57. description.changed.connect (something_changed);
  58. group.add(description);
  59. tags = new EntryRow ();
  60. tags.title = "Tags (space separated)";
  61. tags.changed.connect (something_changed);
  62. group.add(tags);
  63. box.append(group);
  64. var group2 = new PreferencesGroup();
  65. group2.margin_bottom = 18;
  66. group2.margin_end = 18;
  67. group2.margin_start = 18;
  68. group2.margin_top = 18;
  69. group2.title = "Licence and Copyright";
  70. group2.description = "";
  71. copyright = new EntryRow ();
  72. copyright.title = "Copyright Notice";
  73. copyright.changed.connect (something_changed);
  74. group2.add(copyright);
  75. licence = new FileChooserRow (window);
  76. licence.title = "Licence";
  77. licence.asset_selected.connect (something_changed);
  78. group2.add(licence);
  79. box.append(group2);
  80. this.page = tab_view.add_page (this, null);
  81. }
  82. public async void load_asset (Ppub.Publication publication, Ppub.Asset asset) {
  83. this.asset = asset;
  84. var stream = publication.read_asset (asset.name);
  85. metadata = new Ppub.Metadata.from_stream (stream);
  86. poster.set_assets(publication.assets.where(a => a.mimetype.has_prefix ("image/")));
  87. licence.set_assets(publication.assets.where(a => a.mimetype.has_prefix ("text/")));
  88. title.text = metadata.title ?? "";
  89. author.text = metadata.author_name ?? "";
  90. author_email.text = metadata.author_email ?? "";
  91. poster.set_selected_item (metadata.poster ?? "");
  92. description.text = metadata.description ?? "";
  93. tags.text = ate(metadata.tags).to_string (a => a, " ");
  94. copyright.text = metadata.copyright ?? "";
  95. licence.set_selected_item (metadata.licence ?? "");
  96. set_changed(false);
  97. }
  98. public string asset_name { get {
  99. return asset.name;
  100. } }
  101. public Adw.TabPage tab_page { get {
  102. return page;
  103. }}
  104. private string? process_string(string str) {
  105. var stripped = str.chomp().chug();
  106. if(stripped == "") {
  107. return null;
  108. }
  109. return stripped;
  110. }
  111. public void save_asset (Ppub.Builder builder) {
  112. metadata.title = process_string(title.text);
  113. var email = author_email.text.chomp().chug();
  114. if(email != "") {
  115. metadata.author = @"$(author.text) <$email>";
  116. }
  117. else {
  118. metadata.author = process_string(author.text);
  119. }
  120. print(@"$(poster.selected_asset)\n");
  121. metadata.poster = process_string (poster.selected_asset);
  122. metadata.description = process_string(description.text);
  123. metadata.tags = tags.text.chug().chomp().split (" ");
  124. metadata.copyright = process_string(copyright.text);
  125. metadata.licence = process_string (licence.selected_asset);
  126. // TODO, this should probably done on every save globally?
  127. metadata.date = new DateTime.now_local();
  128. var stream = new MemoryInputStream.from_data((uint8[])metadata.to_string().to_utf8());
  129. var compression_info = new Ppub.CompressionInfo(stream);
  130. stream.seek(0, SeekType.SET);
  131. builder.add_asset(asset.name, asset.mimetype, stream, Invercargill.empty<string>(), compression_info);
  132. set_changed(false);
  133. }
  134. private void set_changed(bool changed) {
  135. this.page.title = changed ? "⏺ Publication Metadata" : "Publication Metadata";
  136. unsaved = changed;
  137. }
  138. private void something_changed() {
  139. set_changed(true);
  140. }
  141. }
  142. }