瀏覽代碼

Add menu, basic extract function, and keyboard shortcuts

Billy Barrow 2 年之前
父節點
當前提交
8a5eed9a2f
共有 3 個文件被更改,包括 80 次插入9 次删除
  1. 2 2
      src/DocumentView/MarkdownView.vala
  2. 76 7
      src/Window.vala
  3. 2 0
      src/ZoomSpinButton.vala

+ 2 - 2
src/DocumentView/MarkdownView.vala

@@ -7,14 +7,14 @@ namespace PpubViewer.DocumentView {
     public class MarkdownView : Box, DocumentViewWidget {
 
         protected ScrolledWindow scrolled_window;
-        protected Clamp clamp;
+        protected ClampScrollable clamp;
         protected GtkCommonMark.MarkdownView markdown_view;
         private Ppub.Publication publication;
 
         public MarkdownView() {
             orientation = Orientation.VERTICAL;
             scrolled_window = new ScrolledWindow ();
-            clamp = new Clamp ();
+            clamp = new ClampScrollable ();
             clamp.maximum_size = 800;
             scrolled_window.child = clamp;
             scrolled_window.set_policy (PolicyType.NEVER, PolicyType.AUTOMATIC);

+ 76 - 7
src/Window.vala

@@ -15,14 +15,17 @@ namespace PpubViewer {
         private Button forward_button;
         private Button properties_button;
 
-        private Button menu_button;
-        private PopoverMenu menu;
+        private Menu menu;
+        private MenuButton menu_button;
+        private PopoverMenu popover_menu;
         private ZoomSpinButton zoom_spin;
 
         private Ppub.Publication publication;
         private NavigationHistoryItem current_page = null;
         private WindowTitle window_title;
 
+        private SimpleAction extract_action;
+
         public ViewerWindow(Adw.Application app) {
             application = app;
             header_bar = new Adw.HeaderBar ();
@@ -52,11 +55,17 @@ namespace PpubViewer {
             forward_button.clicked.connect(go_forward);
             header_bar.pack_start(forward_button);
 
-            //  menu = new PopoverMenu.from_model(null);
-            //  header_bar.pack_end(menu);
-            //  menu_button = new Button.from_icon_name("open-menu-symbolic");
-            //  menu_button.clicked.connect(() => menu.popup());
-            //  header_bar.pack_end(menu_button);
+            menu = new Menu();
+            menu.append("Open PPUB", "win.open");
+            menu.append("Extract Files", "win.extract");
+            menu.append("Close", "window.close");
+
+            popover_menu = new PopoverMenu.from_model(menu);
+            menu_button = new MenuButton();
+            popover_menu.default_widget = menu_button;
+            menu_button.icon_name = "open-menu-symbolic";
+            menu_button.popover = popover_menu;
+            header_bar.pack_end(menu_button);
 
             var zoom_squeezer = new Squeezer();
             zoom_squeezer.transition_type = SqueezerTransitionType.CROSSFADE;
@@ -68,6 +77,28 @@ namespace PpubViewer {
             zoom_spin.zoom_level_changed.connect(change_zoom);
             header_bar.pack_end(zoom_squeezer);
 
+            var zoom_in_action = new SimpleAction("zoom-in", null);
+            zoom_in_action.activate.connect(() => zoom_spin.zoom_in());
+            add_action(zoom_in_action);
+            var zoom_out_action = new SimpleAction("zoom-out", null);
+            zoom_out_action.activate.connect(() => zoom_spin.zoom_out());
+            add_action(zoom_out_action);
+            var zoom_reset_action = new SimpleAction("zoom-reset", null);
+            zoom_reset_action.activate.connect(() => zoom_spin.reset_zoom());
+            add_action(zoom_reset_action);
+
+            extract_action = new SimpleAction("extract", null);
+            extract_action.activate.connect(() => extract_files.begin());
+
+            var open_ppub_action = new SimpleAction("open", null);
+            open_ppub_action.activate.connect(() => select_ppub.begin());
+            add_action(open_ppub_action);
+
+            add_binding_action(Gdk.Key.equal, Gdk.ModifierType.CONTROL_MASK, "win.zoom-in", "Zoom in text");
+            add_binding_action(Gdk.Key.minus, Gdk.ModifierType.CONTROL_MASK, "win.zoom-out", "Zoom out text");
+            add_binding_action(Gdk.Key.@0, Gdk.ModifierType.CONTROL_MASK, "win.zoom-reset", "Reset text zoom level");
+            add_binding_action(Gdk.Key.o, Gdk.ModifierType.CONTROL_MASK, "win.open", "Open a PPUB");
+
             document_view = new DocumentView.DocumentViewManager();
             document_view.link_clicked.connect(link_clicked);
             flap.content = document_view;
@@ -82,6 +113,7 @@ namespace PpubViewer {
             publication = new Ppub.Publication(file.get_path());
             var asset = publication.get_default_asset ();
 
+            current_page = null;
             window_title.title = publication.metadata.title ?? "Untitled PPUB";
             window_title.subtitle = publication.metadata.author_name ?? "";
             title = window_title.title + " - PPUB Viewer";
@@ -95,6 +127,7 @@ namespace PpubViewer {
 
             flap.flap = scroller;
             navigate(asset.name);   
+            add_action(extract_action);
         }
 
         public void navigate(string file) {
@@ -203,6 +236,42 @@ namespace PpubViewer {
             document_view.reflow();
         }
 
+        private async void extract_files() throws Error {
+
+            var dialog = new FileDialog();
+            var folder = yield dialog.select_folder(this, null);
+            
+            if(folder == null) {
+                return;
+            }
+
+            var assets = publication.assets.select<string>(a => a.name);
+            foreach(var asset in assets) {
+                var file_stream = folder.get_child(asset).create(FileCreateFlags.REPLACE_DESTINATION);
+                var asset_stream = publication.read_asset(asset);
+                yield file_stream.splice_async(asset_stream, OutputStreamSpliceFlags.CLOSE_SOURCE | OutputStreamSpliceFlags.CLOSE_TARGET, Priority.DEFAULT, null);
+            }
+        }
+
+        private async void select_ppub() throws Error {
+
+            var dialog = new FileDialog();
+            var filter = new FileFilter();
+            var filters = new GLib.ListStore(Type.OBJECT);
+            filters.append(filter);
+            filter.add_pattern("*.ppub");
+            filter.name = "Portable Publications";
+            dialog.filters = filters;
+            var file = yield dialog.open(this, null);
+
+            if(file == null) {
+                return;
+            }
+
+            load_ppub(file);
+
+        }
+
     }
 
 }

+ 2 - 0
src/ZoomSpinButton.vala

@@ -46,6 +46,8 @@ namespace PpubViewer {
 
         private void update_label(int percentage) {
             reset_zoom_button.label = @"$percentage%";
+            zoom_out_button.sensitive = percentage != adjustment.lower;
+            zoom_in_button.sensitive = percentage != adjustment.upper;
         }
 
         public void zoom_in() {