Browse Source

Most minimum of the viable products

Billy Barrow 2 năm trước cách đây
mục cha
commit
5aba90635f
3 tập tin đã thay đổi với 58 bổ sung1 xóa
  1. 22 0
      src/Editor.vala
  2. 32 1
      src/Editors/MetadataEditor.vala
  3. 4 0
      src/FileChooser.vala

+ 22 - 0
src/Editor.vala

@@ -54,6 +54,7 @@ namespace Publicate {
 
             var add_file_button = new Button.from_icon_name("list-add-symbolic");
             file_buttons.append(add_file_button);
+            add_file_button.clicked.connect(import_file);
 
             var remove_file_button = new Button.from_icon_name("user-trash-symbolic");
             file_buttons.append(remove_file_button);
@@ -159,5 +160,26 @@ namespace Publicate {
             yield save(to_save);
             
         }
+
+        public async void import_file() {
+
+            var dialog = new FileDialog();
+            var file = yield dialog.open(window, null);
+
+            if(file == null) {
+                return;
+            }
+            
+            var stream = yield file.read_async(Priority.DEFAULT, null);
+            var compression = new Ppub.CompressionInfo(stream, false);
+            stream.seek(0, SeekType.SET, null);
+            var sample = new uint8[2048];
+            size_t sample_size;
+            yield stream.read_all_async(sample, Priority.DEFAULT, null, out sample_size);
+            stream.seek(0, SeekType.SET, null);
+
+            var mimetype = Ppub.guess_mimetype(file.get_basename(), sample);
+            yield add_asset(file.get_basename(), mimetype, stream, compression);
+        }
     }
 }

+ 32 - 1
src/Editors/MetadataEditor.vala

@@ -130,8 +130,39 @@ namespace Publicate.Editors {
             return page;
         }}
 
+        private string? process_string(string str) {
+            var stripped = str.chomp().chug();
+            if(stripped == "") {
+                return null;
+            }
+            return stripped;
+        }
+
         public async void save_asset (Ppub.Builder builder) {
-                assert_not_reached ();
+            metadata.title = process_string(title.text);
+
+            var email = author_email.text.chomp().chug();
+            if(email != "") {
+                metadata.author = @"$(author.text) <$email>";
+            }
+            else {
+                metadata.author = process_string(author.text);
+            }
+
+            metadata.poster = process_string (poster.selected_asset);
+            metadata.description = process_string(description.text);
+            metadata.tags = tags.text.split (" ");
+            metadata.copyright = process_string(copyright.text);
+            metadata.licence = process_string (licence.selected_asset);
+
+            // TODO, this should probably done on every save?
+            metadata.date = new DateTime.now_local();
+
+            var stream = new MemoryInputStream.from_data((uint8[])metadata.to_string().to_utf8());
+            var compression_info = new Ppub.CompressionInfo(stream);
+            stream.seek(0, SeekType.SET);
+
+            builder.add_asset(asset.name, asset.mimetype, stream, Invercargill.empty<string>(), compression_info);
         }
     }
 

+ 4 - 0
src/FileChooser.vala

@@ -44,6 +44,8 @@ namespace Publicate {
         private ViewerWindow toplevel;
         private FileChooserPopover popover;
 
+        public string selected_asset {get; set;}
+
         public FileChooserRow(ViewerWindow window) {
             toplevel = window;
             subtitle = "Not selected";
@@ -67,6 +69,7 @@ namespace Publicate {
         }
 
         private void selected(Ppub.Asset asset) {
+            selected_asset = name;
             subtitle = asset.name;
             asset_selected(asset);
         }
@@ -74,6 +77,7 @@ namespace Publicate {
         public void set_selected_item(string name) {
             subtitle = name;
             popover.set_selected_item(name);
+            selected_asset = name;
         }