|
@@ -0,0 +1,64 @@
|
|
|
+
|
|
|
+using Adw;
|
|
|
+using Gtk;
|
|
|
+
|
|
|
+namespace PpubViewer {
|
|
|
+
|
|
|
+ public class ViewerWindow : Adw.ApplicationWindow {
|
|
|
+
|
|
|
+ private Adw.HeaderBar header_bar;
|
|
|
+ private Box box;
|
|
|
+ private Flap flap;
|
|
|
+ private GtkCommonMark.MarkdownView markdown_view;
|
|
|
+
|
|
|
+ private Ppub.Publication publication;
|
|
|
+
|
|
|
+ public ViewerWindow(Adw.Application app) {
|
|
|
+ application = app;
|
|
|
+ header_bar = new Adw.HeaderBar ();
|
|
|
+ flap = new Flap();
|
|
|
+ box = new Box (Orientation.VERTICAL, 0);
|
|
|
+ box.append (header_bar);
|
|
|
+ box.append (flap);
|
|
|
+ content = box;
|
|
|
+ header_bar.show_end_title_buttons = true;
|
|
|
+ default_width = 600;
|
|
|
+ default_height = 400;
|
|
|
+
|
|
|
+ var scrolled_window = new ScrolledWindow();
|
|
|
+ scrolled_window.set_policy (PolicyType.NEVER, PolicyType.AUTOMATIC);
|
|
|
+ scrolled_window.vexpand = true;
|
|
|
+ var clamp = new ClampScrollable ();
|
|
|
+ markdown_view = new GtkCommonMark.MarkdownView ();
|
|
|
+ clamp.maximum_size = 800;
|
|
|
+ markdown_view.set_wrap_mode (WrapMode.WORD_CHAR);
|
|
|
+ markdown_view.widget_embedded.connect(widget_embedded);
|
|
|
+ clamp.child = markdown_view;
|
|
|
+ scrolled_window.child = clamp;
|
|
|
+ flap.content = scrolled_window;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ public void load_ppub(File file) throws Error {
|
|
|
+ publication = new Ppub.Publication(file.get_path());
|
|
|
+ var asset = publication.get_default_asset ();
|
|
|
+ markdown_view.load_from_stream (publication.read_asset (asset.name));
|
|
|
+ }
|
|
|
+
|
|
|
+ private void widget_embedded(GtkCommonMark.MarkdownViewEmbeddedWidgetHost widget, string file, string title) {
|
|
|
+ var pixbuf = new Gdk.Pixbuf.from_stream (publication.read_asset (file));
|
|
|
+ var image = new Gtk.Picture.for_pixbuf (pixbuf);
|
|
|
+ image.content_fit = Gtk.ContentFit.FILL;
|
|
|
+ widget.available_width_changed.connect(wid => {
|
|
|
+ image.width_request = wid;
|
|
|
+ var ratio = image.get_paintable().get_intrinsic_aspect_ratio ();
|
|
|
+ image.height_request = (int)(wid / ratio);
|
|
|
+ });
|
|
|
+ widget.append (image);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+}
|