X-Git-Url: http://git.nikiroo.be/?a=blobdiff_plain;f=src%2Fbe%2Fnikiroo%2Ffanfix%2Freader%2Ftui%2FTuiReaderMainWindow.java;h=e4323f08fe21ce836fa20d30b1275a2d3aea187b;hb=b22742622bd40df205649d00a2e3671774b51985;hp=bb2c80d5cbb7290f393df79c44c949aadbb37f60;hpb=e9d43c7c0b9e159909ed9cdce4e907056fab8d9c;p=fanfix.git diff --git a/src/be/nikiroo/fanfix/reader/tui/TuiReaderMainWindow.java b/src/be/nikiroo/fanfix/reader/tui/TuiReaderMainWindow.java index bb2c80d..e4323f0 100644 --- a/src/be/nikiroo/fanfix/reader/tui/TuiReaderMainWindow.java +++ b/src/be/nikiroo/fanfix/reader/tui/TuiReaderMainWindow.java @@ -2,15 +2,22 @@ package be.nikiroo.fanfix.reader.tui; import java.io.IOException; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; import jexer.TAction; +import jexer.TComboBox; +import jexer.TCommand; +import jexer.TField; import jexer.TFileOpenBox.Type; +import jexer.TKeypress; +import jexer.TLabel; import jexer.TList; +import jexer.TStatusBar; import jexer.TWindow; import jexer.event.TCommandEvent; +import jexer.event.TKeypressEvent; import jexer.event.TMenuEvent; +import jexer.event.TResizeEvent; import be.nikiroo.fanfix.Instance; import be.nikiroo.fanfix.data.MetaData; import be.nikiroo.fanfix.library.BasicLibrary; @@ -24,11 +31,28 @@ import be.nikiroo.fanfix.reader.Reader; * @author niki */ class TuiReaderMainWindow extends TWindow { + public static final int MENU_SEARCH = 1100; + public static final TCommand CMD_SEARCH = new TCommand(MENU_SEARCH) { + }; + + public enum Mode { + SOURCE, AUTHOR, + } + private TList list; private List listKeys; private List listItems; private Reader reader; - private String source; + + private Mode mode = Mode.SOURCE; + private String target = null; + private String filter = ""; + + private List sizeConstraints = new ArrayList(); + + // TODO: because no way to find out the current index!! + private TComboBox select; + private TComboBox option; /** * Create a new {@link TuiReaderMainWindow} without any stories in the list. @@ -43,37 +67,17 @@ class TuiReaderMainWindow extends TWindow { this.reader = reader; - maximize(); - listKeys = new ArrayList(); listItems = new ArrayList(); - // TODO size + onResize + addSearch(); + addList(); + addSelect(); // TODO: last so it can draw over the rest - addLabel("Sort by: ", 5, 1); - // -1 = no default index (0 means first,...) 1=height when visible, null - // = action - addComboBox(15, 1, 12, - Arrays.asList("(show all)", "Source", "Name", "Author"), 0, 1, - null); + TStatusBar statusBar = reader.setStatusBar(this, "Library"); + statusBar.addShortcutKeypress(TKeypress.kbCtrlF, CMD_SEARCH, "Search"); - addLabel("Search: ", 5, 3); - addEditor("...", 15, 3, 12, 1); // TODO: cannot see where to type, ^H - // not working, TAB insert a TAB (cannot - // switch to next) - - list = addList(listItems, 0, 5, getWidth(), getHeight(), new TAction() { - @Override - public void DO() { - MetaData meta = getSelectedMeta(); - if (meta != null) { - readStory(meta); - } - } - }); - - // TODO: add the current "source/type" or filter - reader.setStatusBar(this, "Library"); + TSizeConstraint.resize(sizeConstraints); // TODO: remove when not used anymore @@ -100,6 +104,132 @@ class TuiReaderMainWindow extends TWindow { // root.addChild("child 2").addChild("sub child"); } + private void addSearch() { + TLabel lblSearch = addLabel("Search: ", 0, 0); + + TField search = new TField(this, 0, 0, 1, true) { + @Override + public void onKeypress(TKeypressEvent keypress) { + super.onKeypress(keypress); + TKeypress key = keypress.getKey(); + if (key.isFnKey() && key.getKeyCode() == TKeypress.ENTER) { + TuiReaderMainWindow.this.filter = getText(); + TuiReaderMainWindow.this.refreshStories(); + } + } + }; + + TSizeConstraint.setSize(sizeConstraints, lblSearch, 5, 1, null, null); + TSizeConstraint.setSize(sizeConstraints, search, 15, 1, -5, null); + } + + private void addList() { + list = addList(listItems, 0, 0, 10, 10, new TAction() { + @Override + public void DO() { + MetaData meta = getSelectedMeta(); + if (meta != null) { + readStory(meta); + } + } + }); + + TSizeConstraint.setSize(sizeConstraints, list, 0, 7, 0, 0); + } + + private void addSelect() { + // TODO: make a full list + final List options = new ArrayList(); + options.add("(show all)"); + options.add("Sources"); + options.add("Author"); + + // TODO + final List selects = new ArrayList(); + selects.add("(show all)"); + for (String source : reader.getLibrary().getSources()) { + selects.add(source); + } + + TLabel lblSelect = addLabel("Select: ", 0, 0); + + // TODO: why must be last so to be able to draw over the rest + // TODO: make it so we cannot add manual entries + // TODO: how to select the item via keyboard? why double-click via + // mouse? + // TODO: how to change the values size on resize? + // TODO: setWidth() does not impact the display width, only the control + // and the down arrow on the right + // TODO: width 1 +resize + click on down arrow = bad format exception + select = addComboBox(0, 0, 10, selects, 0, + Math.min(selects.size() + 1, getHeight() - 1 - 1), + new TAction() { + @Override + public void DO() { + // TODO: detect (show all) + if (select.getText().equals("(show all)")) { + setMode(mode, null); + } else { + setMode(mode, select.getText()); + } + } + }); + + option = addComboBox(0, 0, 10, options, 0, + Math.min(selects.size() + 1, getHeight() - 1 - 1), + new TAction() { + @Override + public void DO() { + // TODO clear not working!! + + String smode = option.getText(); + Mode mode; + if (smode == null || smode.equals("(show all)")) { + mode = null; + select.setVisible(false); + select.setEnabled(false); + } else if (smode.equals("Sources")) { + mode = Mode.SOURCE; + select.setVisible(true); + select.setEnabled(true); + selects.clear(); + selects.add("(show all)"); + for (String source : reader.getLibrary() + .getSources()) { + selects.add(source); + } + } else { + mode = Mode.AUTHOR; + select.setVisible(true); + select.setEnabled(true); + selects.clear(); + selects.add("(show all)"); + for (String author : reader.getLibrary() + .getAuthors()) { + selects.add(author); + } + } + + // TODO: detect (show all) + if (select.getText().equals("(show all)")) { + setMode(mode, null); + } else { + setMode(mode, select.getText()); + } + } + }); + + TSizeConstraint.setSize(sizeConstraints, lblSelect, 5, 3, null, null); + TSizeConstraint.setSize(sizeConstraints, option, 15, 3, -5, null); + TSizeConstraint.setSize(sizeConstraints, select, 15, 4, -5, null); + } + + @Override + public void onResize(TResizeEvent resize) { + super.onResize(resize); + TSizeConstraint.resize(sizeConstraints); + } + @Override public void onClose() { setVisible(false); @@ -107,38 +237,43 @@ class TuiReaderMainWindow extends TWindow { } /** - * Change the source filter and display all stories matching this source. - * - * @param source - * the new source or NULL for all sources + * Refresh the list of stories displayed in this library. + *

+ * Will take the current settings into account (filter, source...). */ - public void setSource(String source) { - this.source = source; - refreshStories(); - } - public void refreshStories() { - List metas = reader.getLibrary().getListBySource(source); + List metas; + if (mode == Mode.SOURCE) { + metas = reader.getLibrary().getListBySource(target); + } else if (mode == Mode.AUTHOR) { + metas = reader.getLibrary().getListByAuthor(target); + } else { + metas = reader.getLibrary().getList(); + } + setMetas(metas); } /** - * Update the list of stories displayed in this {@link TWindow}. + * Change the author/source filter and display all stories matching this + * target. * - * @param meta - * the new (unique) story to display + * @param mode + * the new mode or NULL for no sorting + * @param target + * the actual target for the given mode, or NULL for all of them */ - public void setMeta(MetaData meta) { - List metas = new ArrayList(); - if (meta != null) { - metas.add(meta); - } - - setMetas(metas); + public void setMode(Mode mode, String target) { + this.mode = mode; + this.target = target; + refreshStories(); } /** * Update the list of stories displayed in this {@link TWindow}. + *

+ * If a filter is set, only the stories which pass the filter will be + * displayed. * * @param metas * the new list of stories to display @@ -149,8 +284,12 @@ class TuiReaderMainWindow extends TWindow { if (metas != null) { for (MetaData meta : metas) { - listKeys.add(meta); - listItems.add(desc(meta)); + String desc = desc(meta); + if (filter.isEmpty() + || desc.toLowerCase().contains(filter.toLowerCase())) { + listKeys.add(meta); + listItems.add(desc); + } } } @@ -212,6 +351,7 @@ class TuiReaderMainWindow extends TWindow { } return; + case -1: try { reader.getLibrary().delete(meta.getLuid());