Enable clone view

This commit is contained in:
Tungstend 2023-07-11 19:00:28 +08:00
parent ac390a4bf5
commit 57d281cca1
12 changed files with 98 additions and 20 deletions

View File

@ -1 +1 @@
1689070711804
1689073118617

View File

@ -1 +1 @@
1689070711809
1689073118622

View File

@ -40,6 +40,7 @@ import java.util.stream.Collectors;
public class EditViewDialog extends FCLDialog implements View.OnClickListener {
private final CustomControl customControl;
private final Callback callback;
private FCLTextView title;
@ -47,16 +48,19 @@ public class EditViewDialog extends FCLDialog implements View.OnClickListener {
private FCLImageButton event;
private FCLButton positive;
private FCLButton negative;
private FCLButton clone;
private FCLLinearLayout container;
private Details details;
public interface Callback {
void onPositive(CustomControl view);
void onClone(CustomControl view);
}
public EditViewDialog(@NonNull Context context, CustomControl cloneView, GameMenu menu, Callback callback) {
public EditViewDialog(@NonNull Context context, CustomControl cloneView, GameMenu menu, Callback callback, boolean cloneable) {
super(context);
this.customControl = cloneView;
this.callback = callback;
setCancelable(false);
setContentView(R.layout.dialog_edit_view);
@ -70,8 +74,12 @@ public class EditViewDialog extends FCLDialog implements View.OnClickListener {
event.setOnClickListener(this);
positive = findViewById(R.id.positive);
negative = findViewById(R.id.negative);
clone = findViewById(R.id.clone);
positive.setOnClickListener(this);
negative.setOnClickListener(this);
clone.setOnClickListener(this);
clone.setVisibility(cloneable ? View.VISIBLE : View.GONE);
container = findViewById(R.id.container);
assert container != null;
@ -90,6 +98,10 @@ public class EditViewDialog extends FCLDialog implements View.OnClickListener {
if (v == event) {
details.onLayoutChange(1);
}
if (v == clone) {
callback.onClone(customControl.cloneView());
dismiss();
}
if (v == positive) {
callback.onPositive(details.getView());
dismiss();

View File

@ -22,6 +22,7 @@ import com.tungsten.fcl.control.data.ButtonStyles;
import com.tungsten.fcl.control.data.ControlButtonData;
import com.tungsten.fcl.control.data.ControlDirectionData;
import com.tungsten.fcl.control.data.ControlViewGroup;
import com.tungsten.fcl.control.data.CustomControl;
import com.tungsten.fcl.control.data.DirectionStyles;
import com.tungsten.fcl.control.data.QuickInputTexts;
import com.tungsten.fcl.control.keyboard.LwjglCharSender;
@ -583,7 +584,17 @@ public class GameMenu implements MenuCallback, View.OnClickListener {
if (getViewGroup() == null) {
Toast.makeText(getActivity(), getActivity().getString(R.string.edit_view_no_group), Toast.LENGTH_SHORT).show();
} else {
EditViewDialog dialog = new EditViewDialog(getActivity(), new ControlButtonData(UUID.randomUUID().toString()), this, view -> viewManager.addView(view));
EditViewDialog dialog = new EditViewDialog(getActivity(), new ControlButtonData(UUID.randomUUID().toString()), this, new EditViewDialog.Callback() {
@Override
public void onPositive(CustomControl view) {
viewManager.addView(view);
}
@Override
public void onClone(CustomControl view) {
// Ignore
}
}, false);
dialog.show();
}
}
@ -591,7 +602,17 @@ public class GameMenu implements MenuCallback, View.OnClickListener {
if (getViewGroup() == null) {
Toast.makeText(getActivity(), getActivity().getString(R.string.edit_view_no_group), Toast.LENGTH_SHORT).show();
} else {
EditViewDialog dialog = new EditViewDialog(getActivity(), new ControlDirectionData(UUID.randomUUID().toString()), this, view -> viewManager.addView(view));
EditViewDialog dialog = new EditViewDialog(getActivity(), new ControlDirectionData(UUID.randomUUID().toString()), this, new EditViewDialog.Callback() {
@Override
public void onPositive(CustomControl view) {
viewManager.addView(view);
}
@Override
public void onClone(CustomControl view) {
// Ignore
}
}, false);
dialog.show();
}
}

View File

@ -160,6 +160,14 @@ public class ControlButtonData implements Cloneable, Observable, CustomControl {
return getId();
}
@Override
public CustomControl cloneView() {
ControlButtonData clone = clone();
clone.getBaseInfo().setXPosition(0);
clone.getBaseInfo().setYPosition(0);
return clone;
}
public static class Serializer implements JsonSerializer<ControlButtonData>, JsonDeserializer<ControlButtonData> {
@Override
public JsonElement serialize(ControlButtonData src, Type typeOfSrc, JsonSerializationContext context) {

View File

@ -139,6 +139,14 @@ public class ControlDirectionData implements Cloneable, Observable, CustomContro
return getId();
}
@Override
public CustomControl cloneView() {
ControlDirectionData clone = clone();
clone.getBaseInfo().setXPosition(0);
clone.getBaseInfo().setYPosition(0);
return clone;
}
public static class Serializer implements JsonSerializer<ControlDirectionData>, JsonDeserializer<ControlDirectionData> {
@Override
public JsonElement serialize(ControlDirectionData src, Type typeOfSrc, JsonSerializationContext context) {

View File

@ -9,4 +9,5 @@ public interface CustomControl {
ViewType getType();
String getViewId();
CustomControl cloneView();
}

View File

@ -319,14 +319,22 @@ public class ControlButton extends AppCompatButton implements CustomView {
&& Math.abs(event.getY() - downY) <= 10) {
setX(positionX);
setY(positionY);
EditViewDialog dialog = new EditViewDialog(getContext(), getData().clone(), menu, view -> {
ControlButtonData newData = ((ControlButtonData) view).clone();
getData().setText(newData.getText());
getData().setBaseInfo(newData.getBaseInfo());
getData().setStyle(newData.getStyle());
getData().setEvent(newData.getEvent());
menu.getViewManager().saveController();
});
EditViewDialog dialog = new EditViewDialog(getContext(), getData().clone(), menu, new EditViewDialog.Callback() {
@Override
public void onPositive(CustomControl view) {
ControlButtonData newData = ((ControlButtonData) view).clone();
getData().setText(newData.getText());
getData().setBaseInfo(newData.getBaseInfo());
getData().setStyle(newData.getStyle());
getData().setEvent(newData.getEvent());
menu.getViewManager().saveController();
}
@Override
public void onClone(CustomControl view) {
menu.getViewManager().addView(view);
}
}, true);
dialog.show();
} else {
getData().getBaseInfo().setXPosition((int) ((1000 * getX()) / (screenWidth - getMeasuredWidth())));

View File

@ -459,13 +459,21 @@ public class ControlDirection extends RelativeLayout implements CustomView {
&& Math.abs(event.getY() - downY) <= 10) {
setX(positionX);
setY(positionY);
EditViewDialog dialog = new EditViewDialog(getContext(), getData().clone(), menu, view -> {
ControlDirectionData newData = ((ControlDirectionData) view).clone();
getData().setBaseInfo(newData.getBaseInfo());
getData().setStyle(newData.getStyle());
getData().setEvent(newData.getEvent());
menu.getViewManager().saveController();
});
EditViewDialog dialog = new EditViewDialog(getContext(), getData().clone(), menu, new EditViewDialog.Callback() {
@Override
public void onPositive(CustomControl view) {
ControlDirectionData newData = ((ControlDirectionData) view).clone();
getData().setBaseInfo(newData.getBaseInfo());
getData().setStyle(newData.getStyle());
getData().setEvent(newData.getEvent());
menu.getViewManager().saveController();
}
@Override
public void onClone(CustomControl view) {
menu.getViewManager().addView(view);
}
}, true);
dialog.show();
} else {
getData().getBaseInfo().setXPosition((int) ((1000 * getX()) / (screenWidth - getSize())));

View File

@ -77,6 +77,16 @@
</com.tungsten.fcllibrary.component.view.FCLLinearLayout>
<com.tungsten.fcllibrary.component.view.FCLButton
android:id="@+id/clone"
android:text="@string/edit_view_clone"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintBottom_toBottomOf="parent"/>
<com.tungsten.fcllibrary.component.view.FCLButton
android:id="@+id/positive"
android:text="@string/dialog_positive"

View File

@ -233,6 +233,7 @@
<string name="download_failed">下载失败: %1$s错误码%2$d</string>
<string name="download_failed_empty">没有可供选择的版本</string>
<string name="edit_view_clone">复制控件</string>
<string name="edit_view_event">控件事件</string>
<string name="edit_view_info">控件基本信息</string>
<string name="edit_view_no_group">请先添加或选择一个控件组!</string>

View File

@ -244,6 +244,7 @@
<string name="download_failed">Failed to download %1$s, response code: %2$d</string>
<string name="download_failed_empty">No versions are available</string>
<string name="edit_view_clone">Clone View</string>
<string name="edit_view_event">View Event</string>
<string name="edit_view_info">Base View Info</string>
<string name="edit_view_no_group">Please add or select a view group first!</string>