From e2d017a31297742d3ea6ac215c3487fa6c67ddb1 Mon Sep 17 00:00:00 2001 From: Niki Roo Date: Sat, 15 Jul 2017 09:53:45 +0200 Subject: [PATCH] TUI: update (most menu functions working) --- src/be/nikiroo/fanfix/reader/TuiReader.java | 5 +- .../fanfix/reader/TuiReaderApplication.java | 114 ++++++++++++++++-- .../fanfix/reader/TuiReaderMainWindow.java | 93 ++++++++++---- 3 files changed, 175 insertions(+), 37 deletions(-) diff --git a/src/be/nikiroo/fanfix/reader/TuiReader.java b/src/be/nikiroo/fanfix/reader/TuiReader.java index 11640cf..c71cf95 100644 --- a/src/be/nikiroo/fanfix/reader/TuiReader.java +++ b/src/be/nikiroo/fanfix/reader/TuiReader.java @@ -1,12 +1,10 @@ package be.nikiroo.fanfix.reader; import java.io.IOException; -import java.util.List; import jexer.TApplication; import jexer.TApplication.BackendType; import be.nikiroo.fanfix.Instance; -import be.nikiroo.fanfix.data.MetaData; /** * This {@link Reader}is based upon the TUI widget library 'jexer' @@ -62,9 +60,8 @@ class TuiReader extends BasicReader { @Override public void browse(String source) { - List metas = getLibrary().getListBySource(source); try { - TuiReaderApplication app = new TuiReaderApplication(metas, this, + TuiReaderApplication app = new TuiReaderApplication(this, source, guessBackendType()); new Thread(app).start(); } catch (Exception e) { diff --git a/src/be/nikiroo/fanfix/reader/TuiReaderApplication.java b/src/be/nikiroo/fanfix/reader/TuiReaderApplication.java index 3d6a949..384919a 100644 --- a/src/be/nikiroo/fanfix/reader/TuiReaderApplication.java +++ b/src/be/nikiroo/fanfix/reader/TuiReaderApplication.java @@ -1,12 +1,18 @@ package be.nikiroo.fanfix.reader; +import java.awt.Toolkit; +import java.awt.datatransfer.DataFlavor; import java.io.IOException; import java.net.URL; -import java.util.List; import jexer.TApplication; +import jexer.TCommand; +import jexer.TKeypress; import jexer.TMessageBox; +import jexer.TStatusBar; import jexer.TWindow; +import jexer.event.TMenuEvent; +import jexer.menu.TMenu; import be.nikiroo.fanfix.Instance; import be.nikiroo.fanfix.Instance.SyserrHandler; import be.nikiroo.fanfix.Instance.TraceHandler; @@ -24,7 +30,14 @@ import be.nikiroo.utils.Progress; * @author niki */ class TuiReaderApplication extends TApplication implements Reader { + public static final int MENU_OPEN = 1025; + public static final int MENU_IMPORT_URL = 1026; + public static final int MENU_IMPORT_FILE = 1027; + public static final int MENU_EXPORT = 1028; + public static final int MENU_EXIT = 1029; + private Reader reader; + private TuiReaderMainWindow main; // start reading if meta present public TuiReaderApplication(Reader reader, BackendType backend) @@ -34,22 +47,23 @@ class TuiReaderApplication extends TApplication implements Reader { MetaData meta = getMeta(); - new TuiReaderMainWindow(this).setMeta(meta); - + main = new TuiReaderMainWindow(this); + main.setMeta(meta); if (meta != null) { read(); } } - public TuiReaderApplication(List stories, Reader reader, + public TuiReaderApplication(Reader reader, String source, TApplication.BackendType backend) throws Exception { super(backend); + init(reader); - new TuiReaderMainWindow(this).setMetas(stories); + main = new TuiReaderMainWindow(this); + main.setSource(source); } - @SuppressWarnings("unused") @Override public void read() throws IOException { MetaData meta = getMeta(); @@ -60,7 +74,9 @@ class TuiReaderApplication extends TApplication implements Reader { // TODO: open in editor + external option if (!meta.isImageDocument()) { - new TuiReaderStoryWindow(this, getLibrary(), meta, getChapter()); + @SuppressWarnings("unused") + Object discard = new TuiReaderStoryWindow(this, getLibrary(), meta, + getChapter()); } else { try { BasicReader.openExternal(getLibrary(), meta.getLuid()); @@ -140,12 +156,88 @@ class TuiReaderApplication extends TApplication implements Reader { }); // - // Add the menus - addFileMenu(); - addEditMenu(); + // Add the menus TODO: i18n + TMenu fileMenu = addMenu("&File"); + fileMenu.addItem(MENU_OPEN, "&Open"); + fileMenu.addItem(MENU_EXPORT, "&Save as..."); + // TODO: Move to... + fileMenu.addSeparator(); + fileMenu.addItem(MENU_IMPORT_URL, "Import &URL..."); + fileMenu.addItem(MENU_IMPORT_FILE, "Import &file..."); + fileMenu.addSeparator(); + fileMenu.addItem(MENU_EXIT, "E&xit"); + + TStatusBar statusBar = fileMenu.newStatusBar("File-management " + + "commands (Open, Save, Print, etc.)"); + // TODO: doesn't actually work: + statusBar.addShortcutKeypress(TKeypress.kbF10, TCommand.cmExit, "Exit"); + + // TODO: Edit: re-download, delete + + // + addWindowMenu(); - addHelpMenu(); getBackend().setTitle("Fanfix"); } + + @Override + protected boolean onMenu(TMenuEvent menu) { + // TODO: i18n + switch (menu.getId()) { + case MENU_EXIT: + if (messageBox("Confirmation", "(TODO: i18n) Exit application?", + TMessageBox.Type.YESNO).getResult() == TMessageBox.Result.YES) { + exit(false); + } + + return true; + case MENU_IMPORT_URL: + String clipboard = ""; + try { + clipboard = ("" + Toolkit.getDefaultToolkit() + .getSystemClipboard().getData(DataFlavor.stringFlavor)) + .trim(); + } catch (Exception e) { + // No data will be handled + } + + if (clipboard == null || !clipboard.startsWith("http")) { + clipboard = ""; + } + + String url = inputBox("Import story", "URL to import", clipboard) + .getText(); + + if (!imprt(url)) { + // TODO: bad import + } + + return true; + case MENU_IMPORT_FILE: + try { + String filename = fileOpenBox("."); + if (!imprt(filename)) { + // TODO: bad import + } + } catch (IOException e) { + // TODO: bad file + e.printStackTrace(); + } + + return true; + } + + return super.onMenu(menu); + } + + private boolean imprt(String url) { + try { + reader.getLibrary().imprt(BasicReader.getUrl(url), null); + main.refreshStories(); + return true; + } catch (IOException e) { + return false; + } + } } diff --git a/src/be/nikiroo/fanfix/reader/TuiReaderMainWindow.java b/src/be/nikiroo/fanfix/reader/TuiReaderMainWindow.java index f076580..f32070c 100644 --- a/src/be/nikiroo/fanfix/reader/TuiReaderMainWindow.java +++ b/src/be/nikiroo/fanfix/reader/TuiReaderMainWindow.java @@ -6,12 +6,15 @@ import java.util.List; import jexer.TAction; import jexer.TCommand; +import jexer.TFileOpenBox.Type; import jexer.TKeypress; import jexer.TList; import jexer.TWindow; +import jexer.event.TMenuEvent; import be.nikiroo.fanfix.Instance; import be.nikiroo.fanfix.data.MetaData; import be.nikiroo.fanfix.library.BasicLibrary; +import be.nikiroo.fanfix.output.BasicOutput.OutputType; /** * The library window, that will list all the (filtered) stories available in @@ -24,23 +27,7 @@ class TuiReaderMainWindow extends TWindow { private List listKeys; private List listItems; private Reader reader; - - /** - * Create a new {@link TuiReaderMainWindow} with the given story in the - * list. - * - * @param reader - * the reader and main application - * @param meta - * the story to display - */ - public TuiReaderMainWindow(TuiReaderApplication reader, MetaData meta) { - this(reader); - - List metas = new ArrayList(); - metas.add(meta); - setMetas(metas); - } + private String source; /** * Create a new {@link TuiReaderMainWindow} without any stories in the list. @@ -63,8 +50,9 @@ class TuiReaderMainWindow extends TWindow { list = addList(listItems, 0, 0, getWidth(), getHeight(), new TAction() { @Override public void DO() { - if (list.getSelectedIndex() >= 0) { - enterOnStory(listKeys.get(list.getSelectedIndex())); + MetaData meta = getSelectedMeta(); + if (meta != null) { + readStory(meta); } } }); @@ -98,6 +86,22 @@ class TuiReaderMainWindow extends TWindow { // root.addChild("child 2").addChild("sub child"); } + /** + * Change the source filter and display all stories matching this source. + * + * @param source + * the new source or NULL for all sources + */ + public void setSource(String source) { + this.source = source; + refreshStories(); + } + + public void refreshStories() { + List metas = reader.getLibrary().getListBySource(source); + setMetas(metas); + } + /** * Update the list of stories displayed in this {@link TWindow}. * @@ -119,7 +123,7 @@ class TuiReaderMainWindow extends TWindow { * @param metas * the new list of stories to display */ - public void setMetas(List metas) { + private void setMetas(List metas) { listKeys.clear(); listItems.clear(); @@ -133,7 +137,15 @@ class TuiReaderMainWindow extends TWindow { list.setList(listItems); } - private void enterOnStory(MetaData meta) { + public MetaData getSelectedMeta() { + if (list.getSelectedIndex() >= 0) { + return listKeys.get(list.getSelectedIndex()); + } + + return null; + } + + public void readStory(MetaData meta) { try { reader.setChapter(-1); reader.setMeta(meta); @@ -146,4 +158,41 @@ class TuiReaderMainWindow extends TWindow { private String desc(MetaData meta) { return String.format("%5s: %s", meta.getLuid(), meta.getTitle()); } -} + + @Override + public void onMenu(TMenuEvent menu) { + MetaData meta = getSelectedMeta(); + if (meta != null) { + switch (menu.getId()) { + case TuiReaderApplication.MENU_OPEN: + readStory(meta); + + return; + case TuiReaderApplication.MENU_EXPORT: + + try { + // TODO: choose type, pg, error + OutputType outputType = OutputType.EPUB; + String path = fileOpenBox(".", Type.SAVE); + reader.getLibrary().export(meta.getLuid(), outputType, + path, null); + } catch (IOException e) { + // TODO + e.printStackTrace(); + } + + return; + case -1: + try { + reader.getLibrary().delete(meta.getLuid()); + } catch (IOException e) { + // TODO + } + + return; + } + } + + super.onMenu(menu); + } +} \ No newline at end of file -- 2.27.0