diff --git a/res/layout/navigate.xml b/res/layout/navigate.xml new file mode 100644 index 0000000..7a586a8 --- /dev/null +++ b/res/layout/navigate.xml @@ -0,0 +1,31 @@ + + + + + + + + + + diff --git a/res/values/strings.xml b/res/values/strings.xml index b1c616e..3d77d33 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -2,8 +2,10 @@ RpyPlayer. Everlasting Summer Действия + Навигация + @string/navigate diff --git a/src/com/annimon/everlastingsummer/Dialogs.java b/src/com/annimon/everlastingsummer/Dialogs.java index cb875e7..43ef6b7 100644 --- a/src/com/annimon/everlastingsummer/Dialogs.java +++ b/src/com/annimon/everlastingsummer/Dialogs.java @@ -35,6 +35,44 @@ public final class Dialogs { builder.show(); } + public void showNavigate() { + final View root = LayoutInflater.from(context).inflate(R.layout.navigate, null); + final TextView positionIndicator = (TextView) root.findViewById(R.id.position); + final SeekBar slider = (SeekBar) root.findViewById(R.id.slider); + final TextView text = (TextView) root.findViewById(R.id.text); + + final Parser parser = Parser.getInstance(); + positionIndicator.setText(String.valueOf(parser.getPosition())); + slider.setMax(parser.getTokensCount() - 1); + slider.setProgress(parser.getPosition()); + slider.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { + + @Override + public void onStopTrackingTouch(SeekBar seekBar) { } + + @Override + public void onStartTrackingTouch(SeekBar seekBar) { } + + @Override + public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { + positionIndicator.setText(String.valueOf(progress)); + if (progress >= parser.getTokensCount()) return; + text.setText(parser.getTokens().get(progress).getText()); + } + } ); + + builder.setTitle(R.string.navigate); + builder.setView(root); + builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + parser.setPosition(slider.getProgress()); + } + }); + builder.setCancelable(false); + builder.show(); + } + private final DialogInterface.OnClickListener dismissDialog = new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { diff --git a/src/com/annimon/everlastingsummer/Parser.java b/src/com/annimon/everlastingsummer/Parser.java index 7eeb6fd..bac15f8 100644 --- a/src/com/annimon/everlastingsummer/Parser.java +++ b/src/com/annimon/everlastingsummer/Parser.java @@ -24,13 +24,32 @@ public final class Parser { private final List tokens; + private final int tokensCount; private int position; public Parser(List tokens) { this.tokens = tokens; + tokensCount = tokens.size(); position = 0; } + public List getTokens() { + return tokens; + } + + public int getTokensCount() { + return tokensCount; + } + + public int getPosition() { + return position; + } + + public void setPosition(int position) { + this.position = position; + next(); + } + public void next() { // Команды разделяются на терминальные и нетерминальные. // Нетерминальные подготавливают сцену к выводу. @@ -264,7 +283,7 @@ public final class Parser { } private Token get(int offset) { - if (position + offset >= tokens.size()) return EOF; + if (position + offset >= tokensCount) return EOF; return tokens.get(position + offset); } }