Добавлена возможность перехода к любому месту сценария
This commit is contained in:
parent
8d927c06e8
commit
6a726c08fc
31
res/layout/navigate.xml
Normal file
31
res/layout/navigate.xml
Normal 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>
|
@ -2,8 +2,10 @@
|
|||||||
|
|
||||||
<string name="app_name">RpyPlayer. Everlasting Summer</string>
|
<string name="app_name">RpyPlayer. Everlasting Summer</string>
|
||||||
<string name="actions">Действия</string>
|
<string name="actions">Действия</string>
|
||||||
|
<string name="navigate">Навигация</string>
|
||||||
|
|
||||||
<string-array name="menu_items">
|
<string-array name="menu_items">
|
||||||
|
<item>@string/navigate</item>
|
||||||
</string-array>
|
</string-array>
|
||||||
|
|
||||||
</resources>
|
</resources>
|
||||||
|
@ -35,6 +35,44 @@ public final class Dialogs {
|
|||||||
builder.show();
|
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() {
|
private final DialogInterface.OnClickListener dismissDialog = new DialogInterface.OnClickListener() {
|
||||||
@Override
|
@Override
|
||||||
public void onClick(DialogInterface dialog, int which) {
|
public void onClick(DialogInterface dialog, int which) {
|
||||||
|
@ -24,13 +24,32 @@ public final class Parser {
|
|||||||
|
|
||||||
|
|
||||||
private final List<Token> tokens;
|
private final List<Token> tokens;
|
||||||
|
private final int tokensCount;
|
||||||
private int position;
|
private int position;
|
||||||
|
|
||||||
public Parser(List<Token> tokens) {
|
public Parser(List<Token> tokens) {
|
||||||
this.tokens = tokens;
|
this.tokens = tokens;
|
||||||
|
tokensCount = tokens.size();
|
||||||
position = 0;
|
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() {
|
public void next() {
|
||||||
// Команды разделяются на терминальные и нетерминальные.
|
// Команды разделяются на терминальные и нетерминальные.
|
||||||
// Нетерминальные подготавливают сцену к выводу.
|
// Нетерминальные подготавливают сцену к выводу.
|
||||||
@ -264,7 +283,7 @@ public final class Parser {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private Token get(int offset) {
|
private Token get(int offset) {
|
||||||
if (position + offset >= tokens.size()) return EOF;
|
if (position + offset >= tokensCount) return EOF;
|
||||||
return tokens.get(position + offset);
|
return tokens.get(position + offset);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user