From bc2ea776b67cabcbdcbbc6d8a4e2df1aafa9101a Mon Sep 17 00:00:00 2001 From: Niki Roo Date: Wed, 5 Jul 2017 21:18:49 +0200 Subject: [PATCH] Code cleanup 3 and update jexer-niki : - The readers are now ~ clean - jexer-0.0.4-niki0 was missing a public modifiers, causing build problems --- ...rces.jar => jexer-0.0.4-niki1-sources.jar} | Bin 248583 -> 248583 bytes src/be/nikiroo/fanfix/Main.java | 7 +- src/be/nikiroo/fanfix/package-info.java | 3 +- src/be/nikiroo/fanfix/reader/BasicReader.java | 44 ++++++-- src/be/nikiroo/fanfix/reader/CliReader.java | 33 +++--- src/be/nikiroo/fanfix/reader/GuiReader.java | 21 ++-- .../nikiroo/fanfix/reader/GuiReaderFrame.java | 2 +- src/be/nikiroo/fanfix/reader/Reader.java | 72 +++++++++---- src/be/nikiroo/fanfix/reader/TuiReader.java | 38 ++----- .../fanfix/reader/TuiReaderApplication.java | 99 ++++++++++------- .../fanfix/reader/TuiReaderMainWindow.java | 102 +++++++++--------- .../fanfix/reader/TuiReaderStoryWindow.java | 2 +- 12 files changed, 236 insertions(+), 187 deletions(-) rename libs/{jexer-0.0.4-niki0-sources.jar => jexer-0.0.4-niki1-sources.jar} (97%) diff --git a/libs/jexer-0.0.4-niki0-sources.jar b/libs/jexer-0.0.4-niki1-sources.jar similarity index 97% rename from libs/jexer-0.0.4-niki0-sources.jar rename to libs/jexer-0.0.4-niki1-sources.jar index f84389747c65f934560fb2ec8cb21bc57777560c..c213e75dbfb1e7051af814e2c94a740f063fcfe4 100644 GIT binary patch delta 4064 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

~T>=_j&;>2gbW_UE(z2T)4~ z2o)%c>8uz40F#ga08mQ<1QY-W2$!o90TP!Gj{yp|Q!oSA5d$wl4e08mQ@2tKY=1P%ZI01N;C08mQ-0u%rg00;;O0J3r9mtn61I0LeA zYU13v>VLFBjIuLB_mm$0@21h)gX1H=yvEJ5T-6)218tQY_Qlb6)S1HA(;LFBiT V#{)D22zO`XNepub (or other) * files that you can read anywhere. *

- * It has support for a {@link be.nikiroo.fanfix.BasicLibrary} system, too. + * It has support for a {@link be.nikiroo.fanfix.library.BasicLibrary} system, + * too. * * @author niki */ diff --git a/src/be/nikiroo/fanfix/reader/BasicReader.java b/src/be/nikiroo/fanfix/reader/BasicReader.java index 2c04006b..cf83788e 100644 --- a/src/be/nikiroo/fanfix/reader/BasicReader.java +++ b/src/be/nikiroo/fanfix/reader/BasicReader.java @@ -29,7 +29,9 @@ public abstract class BasicReader implements Reader { private static ReaderType defaultType = ReaderType.GUI; private BasicLibrary lib; + private MetaData meta; private Story story; + private int chapter; /** * Take the default reader type configuration from the config file. @@ -46,7 +48,11 @@ public abstract class BasicReader implements Reader { } } - public Story getStory() { + public synchronized Story getStory(Progress pg) { + if (story == null) { + story = getLibrary().getStory(meta.getLuid(), pg); + } + return story; } @@ -58,18 +64,29 @@ public abstract class BasicReader implements Reader { return lib; } - public void setLibrary(LocalLibrary lib) { + public void setLibrary(BasicLibrary lib) { this.lib = lib; } - public void setStory(String luid, Progress pg) throws IOException { - story = getLibrary().getStory(luid, pg); - if (story == null) { + public MetaData getMeta() { + return meta; + } + + public synchronized void setMeta(MetaData meta) throws IOException { + setMeta(meta == null ? null : meta.getLuid()); // must check the library + } + + public synchronized void setMeta(String luid) throws IOException { + story = null; + meta = getLibrary().getInfo(luid); + + if (meta == null) { throw new IOException("Cannot retrieve story from library: " + luid); } } - public void setStory(URL source, Progress pg) throws IOException { + public synchronized void setMeta(URL source, Progress pg) + throws IOException { BasicSupport support = BasicSupport.getSupport(source); if (support == null) { throw new IOException("URL not supported: " + source.toString()); @@ -80,12 +97,17 @@ public abstract class BasicReader implements Reader { throw new IOException( "Cannot retrieve story from external source: " + source.toString()); - } + + meta = story.getMeta(); + } + + public int getChapter() { + return chapter; } - public void read() throws IOException { - read(-1); + public void setChapter(int chapter) { + this.chapter = chapter; } /** @@ -110,7 +132,7 @@ public abstract class BasicReader implements Reader { } /** - * The default {@link ReaderType} used when calling + * The default {@link Reader.ReaderType} used when calling * {@link BasicReader#getReader()}. * * @return the default type @@ -120,7 +142,7 @@ public abstract class BasicReader implements Reader { } /** - * The default {@link ReaderType} used when calling + * The default {@link Reader.ReaderType} used when calling * {@link BasicReader#getReader()}. * * @param defaultType diff --git a/src/be/nikiroo/fanfix/reader/CliReader.java b/src/be/nikiroo/fanfix/reader/CliReader.java index de55bf9b..8a458856 100644 --- a/src/be/nikiroo/fanfix/reader/CliReader.java +++ b/src/be/nikiroo/fanfix/reader/CliReader.java @@ -19,24 +19,23 @@ import be.nikiroo.fanfix.data.Story; */ class CliReader extends BasicReader { public void read() throws IOException { - if (getStory() == null) { + MetaData meta = getMeta(); + + if (meta == null) { throw new IOException("No story to read"); } String title = ""; String author = ""; - MetaData meta = getStory().getMeta(); - if (meta != null) { - if (meta.getTitle() != null) { - title = meta.getTitle(); - } + if (meta.getTitle() != null) { + title = meta.getTitle(); + } - if (meta.getAuthor() != null) { - author = "©" + meta.getAuthor(); - if (meta.getDate() != null && !meta.getDate().isEmpty()) { - author = author + " (" + meta.getDate() + ")"; - } + if (meta.getAuthor() != null) { + author = "©" + meta.getAuthor(); + if (meta.getDate() != null && !meta.getDate().isEmpty()) { + author = author + " (" + meta.getDate() + ")"; } } @@ -44,7 +43,8 @@ class CliReader extends BasicReader { System.out.println(author); System.out.println(""); - for (Chapter chap : getStory()) { + // TODO: progress? + for (Chapter chap : getStory(null)) { if (chap.getName() != null && !chap.getName().isEmpty()) { System.out.println(Instance.getTrans().getString( StringId.CHAPTER_NAMED, chap.getNumber(), @@ -57,14 +57,17 @@ class CliReader extends BasicReader { } public void read(int chapter) throws IOException { - if (getStory() == null) { + MetaData meta = getMeta(); + + if (meta == null) { throw new IOException("No story to read"); } - if (chapter > getStory().getChapters().size()) { + // TODO: progress? + if (chapter > getStory(null).getChapters().size()) { System.err.println("Chapter " + chapter + ": no such chapter"); } else { - Chapter chap = getStory().getChapters().get(chapter - 1); + Chapter chap = getStory(null).getChapters().get(chapter - 1); System.out.println("Chapter " + chap.getNumber() + ": " + chap.getName()); diff --git a/src/be/nikiroo/fanfix/reader/GuiReader.java b/src/be/nikiroo/fanfix/reader/GuiReader.java index 2c30ab67..93242583 100644 --- a/src/be/nikiroo/fanfix/reader/GuiReader.java +++ b/src/be/nikiroo/fanfix/reader/GuiReader.java @@ -15,6 +15,7 @@ import javax.swing.event.HyperlinkListener; import be.nikiroo.fanfix.Instance; import be.nikiroo.fanfix.VersionCheck; import be.nikiroo.fanfix.bundles.UiConfig; +import be.nikiroo.fanfix.data.MetaData; import be.nikiroo.fanfix.data.Story; import be.nikiroo.fanfix.library.LocalLibrary; import be.nikiroo.fanfix.output.BasicOutput.OutputType; @@ -70,16 +71,13 @@ class GuiReader extends BasicReader { } public void read() throws IOException { - if (getStory() == null) { + MetaData meta = getMeta(); + + if (meta == null) { throw new IOException("No story to read"); } - open(getStory().getMeta().getLuid(), null); - } - - public void read(int chapter) throws IOException { - // TODO: show a special page? - read(); + read(meta.getLuid(), null); } /** @@ -211,20 +209,21 @@ class GuiReader extends BasicReader { } // open the given book - void open(String luid, Progress pg) throws IOException { + void read(String luid, Progress pg) throws IOException { File file = localLibrary.getFile(luid); if (file == null) { imprt(luid, pg); file = localLibrary.getFile(luid); } + // TODO: show a special page for the chapter? openExternal(getLibrary().getInfo(luid), file); } - void changeType(String luid, String newType) { + void changeType(String luid, String newSource) { try { - localLibrary.changeSource(luid, newType, null); - getLibrary().changeSource(luid, newType, null); + localLibrary.changeSource(luid, newSource, null); + getLibrary().changeSource(luid, newSource, null); } catch (IOException e) { Instance.syserr(e); } diff --git a/src/be/nikiroo/fanfix/reader/GuiReaderFrame.java b/src/be/nikiroo/fanfix/reader/GuiReaderFrame.java index 88eccf78..59663fe3 100644 --- a/src/be/nikiroo/fanfix/reader/GuiReaderFrame.java +++ b/src/be/nikiroo/fanfix/reader/GuiReaderFrame.java @@ -669,7 +669,7 @@ class GuiReaderFrame extends JFrame { outOfUi(pg, new Runnable() { public void run() { try { - reader.open(book.getMeta().getLuid(), pg); + reader.read(book.getMeta().getLuid(), pg); SwingUtilities.invokeLater(new Runnable() { public void run() { book.setCached(true); diff --git a/src/be/nikiroo/fanfix/reader/Reader.java b/src/be/nikiroo/fanfix/reader/Reader.java index 09d45c15..d2984bd5 100644 --- a/src/be/nikiroo/fanfix/reader/Reader.java +++ b/src/be/nikiroo/fanfix/reader/Reader.java @@ -3,11 +3,17 @@ package be.nikiroo.fanfix.reader; import java.io.IOException; import java.net.URL; +import be.nikiroo.fanfix.data.MetaData; import be.nikiroo.fanfix.data.Story; import be.nikiroo.fanfix.library.BasicLibrary; -import be.nikiroo.fanfix.library.LocalLibrary; import be.nikiroo.utils.Progress; +/** + * A {@link Reader} is a class that will handle {@link Story} reading and + * browsing. + * + * @author niki + */ public interface Reader { /** * A type of {@link BasicReader}. @@ -46,42 +52,63 @@ public interface Reader { }; /** - * Return the current {@link Story}. + * Return the current target {@link MetaData}. + * + * @return the meta + */ + public MetaData getMeta(); + + /** + * Return the current {@link Story} as described by the current + * {@link MetaData}. + * + * @param pg + * the optional progress * * @return the {@link Story} */ - public Story getStory(); + public Story getStory(Progress pg); /** - * The {@link LocalLibrary} to load the stories from (by default, takes the - * default {@link LocalLibrary}). + * The {@link BasicLibrary} to load the stories from (by default, takes the + * default {@link BasicLibrary}). * - * @return the {@link LocalLibrary} + * @return the {@link BasicLibrary} */ public BasicLibrary getLibrary(); /** - * Change the {@link LocalLibrary} that will be managed by this + * Change the {@link BasicLibrary} that will be managed by this * {@link BasicReader}. * * @param lib - * the new {@link LocalLibrary} + * the new {@link BasicLibrary} */ - public void setLibrary(LocalLibrary lib); + public void setLibrary(BasicLibrary lib); /** - * Set a {@link Story} from the current {@link Library} into the + * Set a {@link Story} from the current {@link BasicLibrary} into the * {@link Reader}. * * @param luid * the {@link Story} ID - * @param pg - * the optional progress reporter * * @throws IOException * in case of I/O error */ - public void setStory(String luid, Progress pg) throws IOException; + public void setMeta(String luid) throws IOException; + + /** + * Set a {@link Story} from the current {@link BasicLibrary} into the + * {@link Reader}. + * + * @param meta + * the meta + * + * @throws IOException + * in case of I/O error + */ + public void setMeta(MetaData meta) throws IOException; /** * Set an external {@link Story} into this {@link Reader}. @@ -94,7 +121,7 @@ public interface Reader { * @throws IOException * in case of I/O error */ - public void setStory(URL source, Progress pg) throws IOException; + public void setMeta(URL source, Progress pg) throws IOException; /** * Start the {@link Story} Reading. @@ -106,16 +133,21 @@ public interface Reader { public void read() throws IOException; /** - * Read the selected chapter (starting at 1, 0 = description, -1 = none). + * The selected chapter to start reading at (starting at 1, 0 = description, + * -1 = none). + * + * @return the chapter, or -1 for "no chapter" + */ + public int getChapter(); + + /** + * The selected chapter to start reading at (starting at 1, 0 = description, + * -1 = none). * * @param chapter * the chapter, or -1 for "no chapter" - * - * @throws IOException - * in case of I/O error or if the {@link Story} was not - * previously set */ - public void read(int chapter) throws IOException; + public void setChapter(int chapter); /** * Start the reader in browse mode for the given source (or pass NULL for diff --git a/src/be/nikiroo/fanfix/reader/TuiReader.java b/src/be/nikiroo/fanfix/reader/TuiReader.java index 91b62683..8456da3f 100644 --- a/src/be/nikiroo/fanfix/reader/TuiReader.java +++ b/src/be/nikiroo/fanfix/reader/TuiReader.java @@ -49,27 +49,9 @@ class TuiReader extends BasicReader { return backendType; } - public void read(int chapter) throws IOException { - if (getStory() == null) { - throw new IOException("No story to read"); - } - - start(getStory().getMeta(), chapter); - } - - public void browse(String source) { - start(getLibrary().getListBySource(source)); - } - - /** - * Start the application with the given stories. - * - * @param metas - * the stories to display - */ - private void start(List metas) { + public void read() throws IOException { try { - TuiReaderApplication app = new TuiReaderApplication(metas, this, + TuiReaderApplication app = new TuiReaderApplication(this, guessBackendType()); new Thread(app).start(); } catch (Exception e) { @@ -77,19 +59,11 @@ class TuiReader extends BasicReader { } } - /** - * Start the application with the given {@link MetaData} at the given open - * chapter. - * - * @param meta - * the story to display - * @param chapter - * the chapter to open - */ - private void start(MetaData meta, int chapter) { + public void browse(String source) { + List metas = getLibrary().getListBySource(source); try { - TuiReaderApplication app = new TuiReaderApplication(meta, chapter, - this, guessBackendType()); + TuiReaderApplication app = new TuiReaderApplication(metas, this, + guessBackendType()); new Thread(app).start(); } catch (Exception e) { Instance.syserr(e); diff --git a/src/be/nikiroo/fanfix/reader/TuiReaderApplication.java b/src/be/nikiroo/fanfix/reader/TuiReaderApplication.java index b7f83085..93a0167f 100644 --- a/src/be/nikiroo/fanfix/reader/TuiReaderApplication.java +++ b/src/be/nikiroo/fanfix/reader/TuiReaderApplication.java @@ -10,63 +10,52 @@ import jexer.TWindow; import be.nikiroo.fanfix.data.MetaData; import be.nikiroo.fanfix.data.Story; import be.nikiroo.fanfix.library.BasicLibrary; -import be.nikiroo.fanfix.library.LocalLibrary; import be.nikiroo.utils.Progress; /** - * Manages the TUI reader, links and manages the {@link TWindow}s, starts the - * correct output mode. + * Manages the TUI general mode and links and manages the {@link TWindow}s. + *

+ * It will also enclose a {@link Reader} and simply handle the reading part + * differently (it will create the required sub-windows and display them). * * @author niki */ class TuiReaderApplication extends TApplication implements Reader { private Reader reader; - public TuiReaderApplication(MetaData meta, int chapter, Reader reader, - BackendType backend) throws Exception { - this(reader, backend); + // start reading if meta present + public TuiReaderApplication(Reader reader, BackendType backend) + throws Exception { + super(backend); + init(reader); - new TuiReaderMainWindow(this, meta, chapter); - } + MetaData meta = getMeta(); - public TuiReaderApplication(List stories, Reader reader, - TApplication.BackendType backend) throws Exception { - this(reader, backend); + new TuiReaderMainWindow(this).setMeta(meta); - new TuiReaderMainWindow(this, stories); + if (meta != null) { + read(); + } } - private TuiReaderApplication(Reader reader, TApplication.BackendType backend) - throws Exception { + public TuiReaderApplication(List stories, Reader reader, + TApplication.BackendType backend) throws Exception { super(backend); + init(reader); - this.reader = reader; - - // Add the menus - addFileMenu(); - addEditMenu(); - addWindowMenu(); - addHelpMenu(); - - getBackend().setTitle("Fanfix"); + new TuiReaderMainWindow(this).setMetas(stories); } public void read() throws IOException { - reader.read(); - } - - public void read(int chapter) throws IOException { - reader.read(chapter); - } + MetaData meta = getMeta(); - public void open(MetaData meta) { - open(meta, -1); - } + if (meta == null) { + throw new IOException("No story to read"); + } - public void open(MetaData meta, int chapter) { // TODO: open in editor + external option if (!meta.isImageDocument()) { - new TuiReaderStoryWindow(this, getLibrary(), meta, chapter); + new TuiReaderStoryWindow(this, getLibrary(), meta, getChapter()); } else { try { BasicReader.openExternal(getLibrary(), meta.getLuid()); @@ -77,27 +66,55 @@ class TuiReaderApplication extends TApplication implements Reader { } } - public Story getStory() { - return reader.getStory(); + public MetaData getMeta() { + return reader.getMeta(); + } + + public Story getStory(Progress pg) { + return reader.getStory(pg); } public BasicLibrary getLibrary() { return reader.getLibrary(); } - public void setLibrary(LocalLibrary lib) { + public void setLibrary(BasicLibrary lib) { reader.setLibrary(lib); } - public void setStory(String luid, Progress pg) throws IOException { - reader.setStory(luid, pg); + public void setMeta(MetaData meta) throws IOException { + reader.setMeta(meta); + } + + public void setMeta(String luid) throws IOException { + reader.setMeta(luid); } - public void setStory(URL source, Progress pg) throws IOException { - reader.setStory(source, pg); + public void setMeta(URL source, Progress pg) throws IOException { + reader.setMeta(source, pg); } public void browse(String source) { reader.browse(source); } + + public int getChapter() { + return reader.getChapter(); + } + + public void setChapter(int chapter) { + reader.setChapter(chapter); + } + + private void init(Reader reader) { + this.reader = reader; + + // Add the menus + addFileMenu(); + addEditMenu(); + addWindowMenu(); + addHelpMenu(); + + getBackend().setTitle("Fanfix"); + } } diff --git a/src/be/nikiroo/fanfix/reader/TuiReaderMainWindow.java b/src/be/nikiroo/fanfix/reader/TuiReaderMainWindow.java index 3b5dc5dc..f0765809 100644 --- a/src/be/nikiroo/fanfix/reader/TuiReaderMainWindow.java +++ b/src/be/nikiroo/fanfix/reader/TuiReaderMainWindow.java @@ -1,5 +1,6 @@ package be.nikiroo.fanfix.reader; +import java.io.IOException; import java.util.ArrayList; import java.util.List; @@ -7,15 +8,14 @@ import jexer.TAction; import jexer.TCommand; import jexer.TKeypress; import jexer.TList; -import jexer.TRadioGroup; -import jexer.TTreeItem; -import jexer.TTreeView; import jexer.TWindow; +import be.nikiroo.fanfix.Instance; import be.nikiroo.fanfix.data.MetaData; +import be.nikiroo.fanfix.library.BasicLibrary; /** * The library window, that will list all the (filtered) stories available in - * this {@link Library}. + * this {@link BasicLibrary}. * * @author niki */ @@ -23,43 +23,23 @@ class TuiReaderMainWindow extends TWindow { private TList list; private List listKeys; private List listItems; - private TuiReaderApplication reader; + private Reader reader; /** - * Create a new {@link TuiReaderMainWindow} with the given stories in the + * Create a new {@link TuiReaderMainWindow} with the given story in the * list. * * @param reader * the reader and main application - * @param metas - * the stories to display - */ - public TuiReaderMainWindow(TuiReaderApplication reader, List metas) { - this(reader); - setMetas(metas); - } - - /** - * Create a new {@link TuiReaderMainWindow} with only the given - * {@link MetaData} in the list, and open this {@link MetaData} at the given - * chapter. - * - * @param reader - * the reader and main application * @param meta * the story to display - * @param chapter - * the chapter to open */ - public TuiReaderMainWindow(TuiReaderApplication reader, MetaData meta, - int chapter) { + public TuiReaderMainWindow(TuiReaderApplication reader, MetaData meta) { this(reader); List metas = new ArrayList(); metas.add(meta); setMetas(metas); - - reader.open(meta, chapter); } /** @@ -70,7 +50,7 @@ class TuiReaderMainWindow extends TWindow { */ public TuiReaderMainWindow(TuiReaderApplication reader) { // Construct a demo window. X and Y don't matter because it will be - // centered on screen. + // centred on screen. super(reader, "Library", 0, 0, 60, 18, CENTERED | RESIZABLE | UNCLOSABLE); @@ -93,30 +73,44 @@ class TuiReaderMainWindow extends TWindow { statusBar = newStatusBar("Library"); statusBar.addShortcutKeypress(TKeypress.kbF10, TCommand.cmExit, "Exit"); - if (false) { - addLabel("Label (1,1)", 1, 1); - addButton("&Button (35,1)", 35, 1, new TAction() { - public void DO() { - } - }); - addCheckbox(1, 2, "Checky (1,2)", false); - addProgressBar(1, 3, 30, 42); - TRadioGroup groupy = addRadioGroup(1, 4, "Radio groupy"); - groupy.addRadioButton("Fanfan"); - groupy.addRadioButton("Tulipe"); - addField(1, 10, 20, false, "text not fixed."); - addField(1, 11, 20, true, "text fixed."); - addText("20x4 Text in (12,20)", 1, 12, 20, 4); - - TTreeView tree = addTreeView(30, 5, 20, 5); - TTreeItem root = new TTreeItem(tree, "expended root", true); - tree.setSelected(root); // needed to allow arrow navigation without - // mouse-clicking before - - root.addChild("child"); - root.addChild("child 2").addChild("sub child"); + // TODO: remove when not used anymore + + // addLabel("Label (1,1)", 1, 1); + // addButton("&Button (35,1)", 35, 1, new TAction() { + // public void DO() { + // } + // }); + // addCheckbox(1, 2, "Checky (1,2)", false); + // addProgressBar(1, 3, 30, 42); + // TRadioGroup groupy = addRadioGroup(1, 4, "Radio groupy"); + // groupy.addRadioButton("Fanfan"); + // groupy.addRadioButton("Tulipe"); + // addField(1, 10, 20, false, "text not fixed."); + // addField(1, 11, 20, true, "text fixed."); + // addText("20x4 Text in (12,20)", 1, 12, 20, 4); + // + // TTreeView tree = addTreeView(30, 5, 20, 5); + // TTreeItem root = new TTreeItem(tree, "expended root", true); + // tree.setSelected(root); // needed to allow arrow navigation without + // // mouse-clicking before + // + // root.addChild("child"); + // root.addChild("child 2").addChild("sub child"); + } + /** + * Update the list of stories displayed in this {@link TWindow}. + * + * @param meta + * the new (unique) story to display + */ + public void setMeta(MetaData meta) { + List metas = new ArrayList(); + if (meta != null) { + metas.add(meta); } + + setMetas(metas); } /** @@ -140,7 +134,13 @@ class TuiReaderMainWindow extends TWindow { } private void enterOnStory(MetaData meta) { - reader.open(meta); + try { + reader.setChapter(-1); + reader.setMeta(meta); + reader.read(); + } catch (IOException e) { + Instance.syserr(e); + } } private String desc(MetaData meta) { diff --git a/src/be/nikiroo/fanfix/reader/TuiReaderStoryWindow.java b/src/be/nikiroo/fanfix/reader/TuiReaderStoryWindow.java index 0f6af07b..9bc18fe9 100644 --- a/src/be/nikiroo/fanfix/reader/TuiReaderStoryWindow.java +++ b/src/be/nikiroo/fanfix/reader/TuiReaderStoryWindow.java @@ -23,7 +23,7 @@ class TuiReaderStoryWindow extends TWindow { private MetaData meta; private Story story; private TText textField; - private int chapter = -2; + private int chapter = -1; private List navigationButtons; private TLabel chapterName; -- 2.27.0