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