update view groups manager

This commit is contained in:
Tungstend 2023-07-01 21:10:45 +08:00
parent ad6366e4ec
commit 591a052fde
11 changed files with 460 additions and 9 deletions

View File

@ -1,4 +1,83 @@
package com.tungsten.fcl.control;
public class EditViewGroupDialog {
import android.content.Context;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Toast;
import androidx.annotation.NonNull;
import com.tungsten.fcl.R;
import com.tungsten.fcl.control.data.ControlViewGroup;
import com.tungsten.fclcore.util.StringUtils;
import com.tungsten.fcllibrary.component.dialog.FCLDialog;
import com.tungsten.fcllibrary.component.view.FCLButton;
import com.tungsten.fcllibrary.component.view.FCLEditText;
import com.tungsten.fcllibrary.component.view.FCLSpinner;
import java.util.ArrayList;
import java.util.Objects;
public class EditViewGroupDialog extends FCLDialog implements View.OnClickListener {
private final GameMenu menu;
private final ControlViewGroup viewGroup;
private final Callback callback;
private FCLEditText editText;
private FCLSpinner<ControlViewGroup.Visibility> visibilitySpinner;
private FCLButton positive;
private FCLButton negative;
public interface Callback {
void onPositive(String name, ControlViewGroup.Visibility visibility);
}
public EditViewGroupDialog(@NonNull Context context, GameMenu menu, ControlViewGroup viewGroup, Callback callback) {
super(context);
this.menu = menu;
this.viewGroup = viewGroup;
this.callback = callback;
setCancelable(false);
setContentView(R.layout.dialog_edit_view_group);
editText = findViewById(R.id.name);
visibilitySpinner = findViewById(R.id.visibility);
ArrayList<ControlViewGroup.Visibility> visibilities = new ArrayList<>();
visibilities.add(ControlViewGroup.Visibility.VISIBLE);
visibilities.add(ControlViewGroup.Visibility.INVISIBLE);
visibilitySpinner.setDataList(visibilities);
ArrayList<String> visibilityString = new ArrayList<>();
visibilityString.add(getContext().getString(R.string.menu_control_view_group_visible));
visibilityString.add(getContext().getString(R.string.menu_control_view_group_invisible));
ArrayAdapter<String> visibilityAdapter = new ArrayAdapter<>(getContext(), R.layout.item_spinner, visibilityString);
visibilityAdapter.setDropDownViewResource(R.layout.item_spinner_dropdown);
visibilitySpinner.setAdapter(visibilityAdapter);
editText.setText(viewGroup.getName());
visibilitySpinner.setSelection(viewGroup.getVisibility() == ControlViewGroup.Visibility.VISIBLE ? 0 : 1);
positive = findViewById(R.id.positive);
negative = findViewById(R.id.negative);
positive.setOnClickListener(this);
negative.setOnClickListener(this);
}
@Override
public void onClick(View v) {
if (v == positive) {
if (menu.getController().viewGroups().stream().anyMatch(it -> it.getName().equals(Objects.requireNonNull(editText.getText()).toString()) && !viewGroup.getName().equals(editText.getText().toString()))) {
Toast.makeText(getContext(), getContext().getString(R.string.menu_control_view_group_exist), Toast.LENGTH_SHORT).show();
} else if (StringUtils.isBlank(Objects.requireNonNull(editText.getText()).toString())) {
Toast.makeText(getContext(), getContext().getString(R.string.menu_control_view_group_empty), Toast.LENGTH_SHORT).show();
} else {
dismiss();
callback.onPositive(editText.getText().toString(), visibilitySpinner.getSelectedItemPosition() == 0 ? ControlViewGroup.Visibility.VISIBLE : ControlViewGroup.Visibility.INVISIBLE);
}
}
if (v == negative) {
dismiss();
}
}
}

View File

@ -254,7 +254,11 @@ public class GameMenu implements MenuCallback, View.OnClickListener {
FXUtils.bindSelection(currentControllerSpinner, controllerProperty);
refreshViewGroupList(currentViewGroupSpinner);
controllerProperty.addListener(invalidate -> refreshViewGroupList(currentViewGroupSpinner));
getController().addListener(i -> refreshViewGroupList(currentViewGroupSpinner));
controllerProperty.addListener(invalidate -> {
refreshViewGroupList(currentViewGroupSpinner);
getController().addListener(i -> refreshViewGroupList(currentViewGroupSpinner));
});
editLayout.visibilityProperty().bind(editModeProperty);
@ -552,7 +556,8 @@ public class GameMenu implements MenuCallback, View.OnClickListener {
@Override
public void onClick(View v) {
if (v == manageViewGroups) {
ViewGroupDialog dialog = new ViewGroupDialog(getActivity(), this);
dialog.show();
}
if (v == addButton) {

View File

@ -0,0 +1,89 @@
package com.tungsten.fcl.control;
import android.annotation.SuppressLint;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.tungsten.fcl.R;
import com.tungsten.fcl.control.data.ControlViewGroup;
import com.tungsten.fclcore.fakefx.collections.ObservableList;
import com.tungsten.fcllibrary.component.FCLAdapter;
import com.tungsten.fcllibrary.component.dialog.FCLAlertDialog;
import com.tungsten.fcllibrary.component.view.FCLImageButton;
import com.tungsten.fcllibrary.component.view.FCLTextView;
public class ViewGroupAdapter extends FCLAdapter {
private final ObservableList<ControlViewGroup> list;
private final GameMenu menu;
public ViewGroupAdapter(Context context, ObservableList<ControlViewGroup> list, GameMenu menu) {
super(context);
this.list = list;
this.menu = menu;
}
static class ViewHolder {
FCLTextView name;
FCLImageButton edit;
FCLImageButton delete;
}
@Override
public Object getItem(int i) {
return list.get(i);
}
@Override
public long getItemId(int i) {
return 0;
}
@Override
public int getCount() {
return list.size();
}
@SuppressLint("ClickableViewAccessibility")
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
final ViewHolder viewHolder;
if (view == null) {
viewHolder = new ViewHolder();
view = LayoutInflater.from(getContext()).inflate(R.layout.item_view_group, null);
viewHolder.name = view.findViewById(R.id.name);
viewHolder.edit = view.findViewById(R.id.edit);
viewHolder.delete = view.findViewById(R.id.delete);
view.setTag(viewHolder);
}
else {
viewHolder = (ViewHolder) view.getTag();
}
ControlViewGroup group = list.get(i);
viewHolder.name.setText(group.getName());
viewHolder.edit.setOnClickListener(v -> {
EditViewGroupDialog dialog = new EditViewGroupDialog(getContext(), menu, group, (n, vi) -> {
group.setName(n);
group.setVisibility(vi);
menu.getController().updateViewGroup(group);
notifyDataSetChanged();
});
dialog.show();
});
viewHolder.delete.setOnClickListener(v -> {
FCLAlertDialog.Builder builder = new FCLAlertDialog.Builder(getContext());
builder.setCancelable(false);
builder.setAlertLevel(FCLAlertDialog.AlertLevel.INFO);
builder.setMessage(getContext().getString(R.string.menu_control_view_group_delete));
builder.setPositiveButton(() -> {
menu.getController().removeViewGroup(group);
notifyDataSetChanged();
});
builder.setNegativeButton(null);
builder.create().show();
});
return view;
}
}

View File

@ -1,4 +1,61 @@
package com.tungsten.fcl.control;
public class ViewGroupDialog {
import android.content.Context;
import android.view.View;
import android.widget.ListView;
import androidx.annotation.NonNull;
import com.tungsten.fcl.R;
import com.tungsten.fcl.control.data.ControlViewGroup;
import com.tungsten.fcllibrary.component.dialog.FCLDialog;
import com.tungsten.fcllibrary.component.view.FCLButton;
import java.util.UUID;
public class ViewGroupDialog extends FCLDialog implements View.OnClickListener {
private final GameMenu gameMenu;
private FCLButton addViewGroup;
private FCLButton positive;
private ListView listView;
public ViewGroupDialog(@NonNull Context context, GameMenu gameMenu) {
super(context);
this.gameMenu = gameMenu;
setCancelable(false);
setContentView(R.layout.dialog_manage_view_groups);
addViewGroup = findViewById(R.id.add_view_group);
positive = findViewById(R.id.positive);
addViewGroup.setOnClickListener(this);
positive.setOnClickListener(this);
listView = findViewById(R.id.list);
refreshList();
}
private void refreshList() {
ViewGroupAdapter adapter = new ViewGroupAdapter(getContext(), gameMenu.getController().viewGroups(), gameMenu);
listView.setAdapter(adapter);
}
@Override
public void onClick(View v) {
if (v == addViewGroup) {
EditViewGroupDialog dialog = new EditViewGroupDialog(getContext(), gameMenu, new ControlViewGroup(UUID.randomUUID().toString()), (name, visibility) -> {
ControlViewGroup viewGroup = new ControlViewGroup(UUID.randomUUID().toString());
viewGroup.setName(name);
viewGroup.setVisibility(visibility);
gameMenu.getController().addViewGroup(viewGroup);
refreshList();
});
dialog.show();
}
if (v == positive) {
dismiss();
}
}
}

View File

@ -174,6 +174,17 @@ public class Controller implements Cloneable, Observable {
}
}
public void updateViewGroup(ControlViewGroup viewGroup) {
for (ControlViewGroup group : viewGroups()) {
if (viewGroup.getId().equals(group.getId())) {
group.setName(viewGroup.getName());
group.setVisibility(viewGroup.getVisibility());
group.setViewData(viewGroup.getViewData());
break;
}
}
}
@NonNull
@Override
public String toString() {
@ -192,6 +203,7 @@ public class Controller implements Cloneable, Observable {
author.addListener(listener);
description.addListener(listener);
viewGroups.addListener(listener);
viewGroups.forEach(it -> it.addListener(listener));
controllerVersion.addListener(listener);
}

View File

@ -0,0 +1,10 @@
<vector
android:height="24dp"
android:viewportHeight="24"
android:viewportWidth="24"
android:width="24dp"
xmlns:android="http://schemas.android.com/apk/res/android">
<path
android:fillColor="@android:color/white"
android:pathData="M20,5L4,5c-1.1,0 -1.99,0.9 -1.99,2L2,17c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2L22,7c0,-1.1 -0.9,-2 -2,-2zM11,8h2v2h-2L11,8zM11,11h2v2h-2v-2zM8,8h2v2L8,10L8,8zM8,11h2v2L8,13v-2zM7,13L5,13v-2h2v2zM7,10L5,10L5,8h2v2zM16,17L8,17v-2h8v2zM16,13h-2v-2h2v2zM16,10h-2L14,8h2v2zM19,13h-2v-2h2v2zM19,10h-2L17,8h2v2z"/>
</vector>

View File

@ -1,6 +1,99 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="400dp"
android:layout_height="match_parent"
android:padding="10dp"
xmlns:app="http://schemas.android.com/apk/res-auto">
<com.tungsten.fcllibrary.component.view.FCLTextView
android:id="@+id/title"
android:singleLine="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/menu_control_view_group_add"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintHorizontal_bias="0.5"/>
<com.tungsten.fcllibrary.component.view.FCLLinearLayout
android:layout_marginTop="10dp"
android:id="@+id/name_layout"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@+id/title"
android:layout_width="match_parent"
android:layout_height="match_parent">
android:layout_height="wrap_content"
android:orientation="horizontal">
<com.tungsten.fcllibrary.component.view.FCLTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:singleLine="true"
android:layout_gravity="center"
android:text="@string/menu_control_view_group_name"/>
<View
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_weight="1"/>
<com.tungsten.fcllibrary.component.view.FCLEditText
android:singleLine="true"
android:textSize="12sp"
android:layout_width="200dp"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:id="@+id/name"/>
</com.tungsten.fcllibrary.component.view.FCLLinearLayout>
<com.tungsten.fcllibrary.component.view.FCLLinearLayout
android:layout_marginTop="10dp"
android:id="@+id/visibility_layout"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@+id/name_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<com.tungsten.fcllibrary.component.view.FCLTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:singleLine="true"
android:layout_gravity="center"
android:text="@string/menu_control_view_group_visibility"/>
<View
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_weight="1"/>
<com.tungsten.fcllibrary.component.view.FCLSpinner
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:id="@+id/visibility"/>
</com.tungsten.fcllibrary.component.view.FCLLinearLayout>
<com.tungsten.fcllibrary.component.view.FCLButton
android:id="@+id/positive"
android:text="@string/dialog_positive"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/visibility_layout"/>
<com.tungsten.fcllibrary.component.view.FCLButton
android:id="@+id/negative"
android:text="@string/dialog_negative"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/visibility_layout"/>
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -1,6 +1,45 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="400dp"
android:layout_height="match_parent"
android:padding="10dp"
xmlns:app="http://schemas.android.com/apk/res-auto">
<com.tungsten.fcllibrary.component.view.FCLTextView
android:id="@+id/title"
android:singleLine="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/menu_controls_groups"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintHorizontal_bias="0.5"/>
<ListView
android:id="@+id/list"
android:layout_marginTop="5dp"
android:layout_marginBottom="5dp"
android:layout_width="match_parent"
android:layout_height="match_parent">
android:layout_height="140dp"
app:dividerWidth="0dp"
app:layout_constraintTop_toBottomOf="@+id/title"
app:layout_constraintBottom_toTopOf="@+id/positive"/>
<com.tungsten.fcllibrary.component.view.FCLButton
android:id="@+id/add_view_group"
android:text="@string/menu_control_view_group_add"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintBottom_toBottomOf="parent"/>
<com.tungsten.fcllibrary.component.view.FCLButton
android:id="@+id/positive"
android:text="@string/dialog_positive"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintBottom_toBottomOf="parent"/>
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -0,0 +1,51 @@
<?xml version="1.0" encoding="utf-8"?>
<com.tungsten.fcllibrary.component.view.FCLLinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<com.tungsten.fcllibrary.component.view.FCLLinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="10dp"
android:background="@drawable/bg_item"
android:orientation="horizontal"
android:layout_marginTop="5dp"
android:layout_marginBottom="5dp">
<com.tungsten.fcllibrary.component.view.FCLImageView
android:layout_width="24dp"
android:layout_height="24dp"
android:src="@drawable/ic_baseline_keyboard_24"
android:layout_gravity="center"
android:tint="@android:color/darker_gray"/>
<com.tungsten.fcllibrary.component.view.FCLTextView
android:layout_marginStart="10dp"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:layout_gravity="center"
android:singleLine="true"
android:id="@+id/name"/>
<com.tungsten.fcllibrary.component.view.FCLImageButton
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_gravity="center"
android:layout_marginStart="10dp"
android:id="@+id/edit"
android:src="@drawable/ic_baseline_edit_24"
android:tint="@android:color/darker_gray"/>
<com.tungsten.fcllibrary.component.view.FCLImageButton
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_gravity="center"
android:layout_marginStart="10dp"
android:id="@+id/delete"
android:src="@drawable/ic_baseline_delete_24"
android:tint="@android:color/darker_gray"/>
</com.tungsten.fcllibrary.component.view.FCLLinearLayout>
</com.tungsten.fcllibrary.component.view.FCLLinearLayout>

View File

@ -207,6 +207,14 @@
<string name="menu_control_set">设置</string>
<string name="menu_control_style">样式设置</string>
<string name="menu_control_style_add">添加样式</string>
<string name="menu_control_view_group_add">添加控件组</string>
<string name="menu_control_view_group_delete">你确定要删除该控件组吗?</string>
<string name="menu_control_view_group_name">名称</string>
<string name="menu_control_view_group_visibility">初始可见性</string>
<string name="menu_control_view_group_exist">该控件组已存在</string>
<string name="menu_control_view_group_empty">请填写控件组名称</string>
<string name="menu_control_view_group_visible">显示</string>
<string name="menu_control_view_group_invisible">隐藏</string>
<string name="menu_settings">设置</string>
<string name="menu_settings_debug">调试</string>

View File

@ -226,6 +226,14 @@
<string name="menu_control_set">Set</string>
<string name="menu_control_style">Style Setting</string>
<string name="menu_control_style_add">Add Style</string>
<string name="menu_control_view_group_add">Add View Group</string>
<string name="menu_control_view_group_delete">Are you sure to delete this view group?</string>
<string name="menu_control_view_group_name">Name</string>
<string name="menu_control_view_group_visibility">Initial Visibility</string>
<string name="menu_control_view_group_exist">The view group already exist</string>
<string name="menu_control_view_group_empty">Please fill the view group name first</string>
<string name="menu_control_view_group_visible">Visible</string>
<string name="menu_control_view_group_invisible">Invisible</string>
<string name="menu_settings">Settings</string>
<string name="menu_settings_debug">Debug</string>