Browse Source

Initial commit

Billy Barrow 2 years ago
commit
e64fe53aa0
4 changed files with 123 additions and 0 deletions
  1. 6 0
      .gitignore
  2. 33 0
      src/App.vala
  3. 64 0
      src/Window.vala
  4. 20 0
      src/meson.build

+ 6 - 0
.gitignore

@@ -0,0 +1,6 @@
+meson-*
+ppub-viewer
+ppub-viewer.p/
+.ninja*
+*.ninja
+compile_commands.json

+ 33 - 0
src/App.vala

@@ -0,0 +1,33 @@
+using Gtk;
+
+
+namespace PpubViewer {
+
+    public class PpubViewerApplication : Adw.Application {
+
+        public PpubViewerApplication() {
+            Object(application_id: "com.pcthingz.ppub.viewer", flags: GLib.ApplicationFlags.HANDLES_OPEN);
+        }
+
+        protected override void activate () {
+            var window = new ViewerWindow(this);
+            window.present ();
+        }
+
+        protected override void open (File[] files, string hint) {
+            foreach (var file in files) {
+                var window = new ViewerWindow(this);
+                window.present ();
+                window.load_ppub (file);
+            }
+        }
+
+    }
+
+    int main (string[] argv) {
+        // Create a new application
+        var app = new PpubViewerApplication();
+        return app.run (argv);
+    }
+    
+}

+ 64 - 0
src/Window.vala

@@ -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);
+        }
+
+
+
+    }
+
+}

+ 20 - 0
src/meson.build

@@ -0,0 +1,20 @@
+project('ppub-viewer', 'vala', 'c')
+
+add_project_arguments(['--disable-warnings', '--enable-checking'], language: 'vala')
+
+sources = files('App.vala')
+sources += files('Window.vala')
+
+dependencies = [
+    dependency('glib-2.0'),
+    dependency('gobject-2.0'),
+    dependency('gio-2.0'),
+    dependency('gee-0.8'),
+    dependency('libadwaita-1'),
+    dependency('invercargill'),
+    dependency('gtk4'),
+    dependency('gtkcommonmark'),
+    dependency('libppub')
+]
+
+executable('ppub-viewer', sources, dependencies: dependencies)