Добавлена возможность перехода к любому месту сценария

This commit is contained in:
Victor 2015-04-10 22:33:28 +03:00
parent 8d927c06e8
commit 6a726c08fc
4 changed files with 91 additions and 1 deletions

31
res/layout/navigate.xml Normal file
View File

@ -0,0 +1,31 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:minWidth="180dp"
android:padding="5dp"
android:orientation="vertical" >
<TextView
android:id="@+id/position"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:textAppearance="?android:attr/textAppearanceSmall" />
<SeekBar
android:id="@+id/slider"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="4dp"
android:paddingBottom="4dp" />
<TextView
android:id="@+id/text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:singleLine="true"
android:ellipsize="end" />
</LinearLayout>

View File

@ -2,8 +2,10 @@
<string name="app_name">RpyPlayer. Everlasting Summer</string>
<string name="actions">Действия</string>
<string name="navigate">Навигация</string>
<string-array name="menu_items">
<item>@string/navigate</item>
</string-array>
</resources>

View File

@ -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) {

View File

@ -24,13 +24,32 @@ public final class Parser {
private final List<Token> tokens;
private final int tokensCount;
private int position;
public Parser(List<Token> tokens) {
this.tokens = tokens;
tokensCount = tokens.size();
position = 0;
}
public List<Token> 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);
}
}