Commit 94c7fd18 authored by fallenstardust's avatar fallenstardust

DeckManagerFragment添加注释

parent 6d95cb25
...@@ -160,6 +160,14 @@ public class DeckManagerFragment extends BaseFragemnt implements RecyclerViewIte ...@@ -160,6 +160,14 @@ public class DeckManagerFragment extends BaseFragemnt implements RecyclerViewIte
private View layoutView; private View layoutView;
/**
* 创建并返回Fragment的视图层次结构
*
* @param inflater 用于将XML布局文件转换为View对象的LayoutInflater实例,不可为空
* @param container 父容器ViewGroup,可为空
* @param savedInstanceState 保存Fragment状态的Bundle对象,可为空
* @return 返回创建的View对象,如果创建失败则返回null
*/
@Nullable @Nullable
@Override @Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
...@@ -168,58 +176,93 @@ public class DeckManagerFragment extends BaseFragemnt implements RecyclerViewIte ...@@ -168,58 +176,93 @@ public class DeckManagerFragment extends BaseFragemnt implements RecyclerViewIte
activity = (HomeActivity) getActivity(); activity = (HomeActivity) getActivity();
originalData = new ArrayList<>(); originalData = new ArrayList<>();
// 初始化布局视图
layoutView = inflater.inflate(R.layout.fragment_deck_cards, container, false); layoutView = inflater.inflate(R.layout.fragment_deck_cards, container, false);
AnimationShake2(layoutView); AnimationShake2(layoutView);
initView(layoutView); initView(layoutView);
//检查外部调用方是否传入了ydk文件路径,如果传入,则打开外部ydk文件
// 检查并预加载外部ydk文件
preLoadFile(); preLoadFile();
//event
// 注册事件总线监听器
if (!EventBus.getDefault().isRegistered(this)) {//加上判断 if (!EventBus.getDefault().isRegistered(this)) {//加上判断
EventBus.getDefault().register(this); EventBus.getDefault().register(this);
} }
// 显示新手引导
showNewbieGuide("deckmain"); showNewbieGuide("deckmain");
return layoutView; return layoutView;
} }
/**
* 初始化视图组件和相关逻辑
* 此方法负责初始化布局中的各个UI控件,并设置它们的属性、适配器及事件监听器。
* 同时还初始化了数据管理器、搜索器、加载器等业务组件,并处理了一些用户交互逻辑,
* 如点赞功能与自动同步远程卡组信息。
*
* @param layoutView 布局视图对象,用于查找子控件
*/
public void initView(View layoutView) { public void initView(View layoutView) {
// 获取屏幕宽度
screenWidth = getResources().getDisplayMetrics().widthPixels; screenWidth = getResources().getDisplayMetrics().widthPixels;
// 初始化抽屉布局和列表视图
mDrawerLayout = layoutView.findViewById(R.id.drawer_layout); mDrawerLayout = layoutView.findViewById(R.id.drawer_layout);
mListView = layoutView.findViewById(R.id.list_cards); mListView = layoutView.findViewById(R.id.list_cards);
// 设置卡片列表适配器并启用滑动删除功能
mCardListAdapter = new CardListAdapter(getContext(), activity.getImageLoader()); mCardListAdapter = new CardListAdapter(getContext(), activity.getImageLoader());
mCardListAdapter.setEnableSwipe(true); mCardListAdapter.setEnableSwipe(true);
mListView.setLayoutManager(new FastScrollLinearLayoutManager(getContext())); mListView.setLayoutManager(new FastScrollLinearLayoutManager(getContext()));
mListView.setAdapter(mCardListAdapter); mListView.setAdapter(mCardListAdapter);
// 设置各类监听器
setListeners(); setListeners();
// 初始化数据管理器
mPackManager = DataManager.get().getPackManager(); mPackManager = DataManager.get().getPackManager();
mCardManager = DataManager.get().getCardManager(); mCardManager = DataManager.get().getCardManager();
// 初始化卡片加载器和回调接口
mCardLoader = new CardLoader(getContext()); mCardLoader = new CardLoader(getContext());
mCardLoader.setCallBack(this); mCardLoader.setCallBack(this);
// 初始化卡片搜索器及其回调接口
mCardSearcher = new CardSearcher(layoutView.findViewById(R.id.nav_view_list), mCardLoader); mCardSearcher = new CardSearcher(layoutView.findViewById(R.id.nav_view_list), mCardLoader);
mCardSearcher.setCallBack(this); mCardSearcher.setCallBack(this);
// 查找顶部展示区域的文本控件
tv_deck = layoutView.findViewById(R.id.tv_deck); tv_deck = layoutView.findViewById(R.id.tv_deck);
tv_result_count = layoutView.findViewById(R.id.result_count); tv_result_count = layoutView.findViewById(R.id.result_count);
// 初始化限制条件选择下拉框并设置背景颜色
mLimitSpinner = layoutView.findViewById(R.id.sp_limit_list); mLimitSpinner = layoutView.findViewById(R.id.sp_limit_list);
mLimitSpinner.setPopupBackgroundResource(R.color.colorNavy); mLimitSpinner.setPopupBackgroundResource(R.color.colorNavy);
// 初始化网格形式的卡组显示区域
mRecyclerView = layoutView.findViewById(R.id.grid_cards); mRecyclerView = layoutView.findViewById(R.id.grid_cards);
mRecyclerView.setPadding(mRecyclerView.getPaddingLeft(), 0, mRecyclerView.getPaddingRight(), mRecyclerView.getPaddingBottom()); mRecyclerView.setPadding(mRecyclerView.getPaddingLeft(), 0, mRecyclerView.getPaddingRight(), mRecyclerView.getPaddingBottom());
// 设置卡组适配器和自定义布局管理器
mRecyclerView.setAdapter((mDeckAdapater = new DeckAdapater(getContext(), mRecyclerView, activity.getImageLoader()))); mRecyclerView.setAdapter((mDeckAdapater = new DeckAdapater(getContext(), mRecyclerView, activity.getImageLoader())));
mRecyclerView.setLayoutManager(new DeckLayoutManager(getContext(), Constants.DECK_WIDTH_COUNT)); mRecyclerView.setLayoutManager(new DeckLayoutManager(getContext(), Constants.DECK_WIDTH_COUNT));
// 配置拖拽支持与触摸助手
mDeckItemTouchHelper = new DeckItemTouchHelper(mDeckAdapater); mDeckItemTouchHelper = new DeckItemTouchHelper(mDeckAdapater);
ItemTouchHelperPlus touchHelper = new ItemTouchHelperPlus(getContext(), mDeckItemTouchHelper); ItemTouchHelperPlus touchHelper = new ItemTouchHelperPlus(getContext(), mDeckItemTouchHelper);
touchHelper.setItemDragListener(this); touchHelper.setItemDragListener(this);
touchHelper.setEnableClickDrag(Constants.DECK_SINGLE_PRESS_DRAG); touchHelper.setEnableClickDrag(Constants.DECK_SINGLE_PRESS_DRAG);
touchHelper.attachToRecyclerView(mRecyclerView); touchHelper.attachToRecyclerView(mRecyclerView);
// 添加RecyclerView的点击监听器
mRecyclerView.addOnItemTouchListener(new RecyclerViewItemListener(mRecyclerView, this)); mRecyclerView.addOnItemTouchListener(new RecyclerViewItemListener(mRecyclerView, this));
// 初始化弹出菜单按钮及相关导航按钮点击事件
initBoomMenuButton(layoutView.findViewById(R.id.bmb)); initBoomMenuButton(layoutView.findViewById(R.id.bmb));
layoutView.findViewById(R.id.btn_nav_search).setOnClickListener((v) -> doMenu(R.id.action_search)); layoutView.findViewById(R.id.btn_nav_search).setOnClickListener((v) -> doMenu(R.id.action_search));
layoutView.findViewById(R.id.btn_nav_list).setOnClickListener((v) -> doMenu(R.id.action_card_list)); layoutView.findViewById(R.id.btn_nav_list).setOnClickListener((v) -> doMenu(R.id.action_card_list));
//只有当加载的是具有id的deck时才显示点赞按钮
// 点赞按钮逻辑:仅在当前加载的是有效卡组时可用
tv_add_1 = layoutView.findViewById(R.id.tv_add_1); tv_add_1 = layoutView.findViewById(R.id.tv_add_1);
ll_click_like = layoutView.findViewById(R.id.ll_click_like); ll_click_like = layoutView.findViewById(R.id.ll_click_like);
ll_click_like.setOnClickListener(v -> { ll_click_like.setOnClickListener(v -> {
...@@ -232,7 +275,7 @@ public class DeckManagerFragment extends BaseFragemnt implements RecyclerViewIte ...@@ -232,7 +275,7 @@ public class DeckManagerFragment extends BaseFragemnt implements RecyclerViewIte
YGOUtil.showTextToast("点赞失败"); YGOUtil.showTextToast("点赞失败");
}).done(data -> { }).done(data -> {
if (data != null && data.getMessage() != null && data.getMessage().equals("true")) { if (data != null && data.getMessage() != null && data.getMessage().equals("true")) {
// 显示点赞动画 // 显示点赞动画效果
tv_add_1.setText("+1"); tv_add_1.setText("+1");
ll_click_like.startAnimation(AnimationUtils.loadAnimation(getContext(), R.anim.fade_out)); ll_click_like.startAnimation(AnimationUtils.loadAnimation(getContext(), R.anim.fade_out));
ll_click_like.setVisibility(View.GONE); ll_click_like.setVisibility(View.GONE);
...@@ -245,13 +288,18 @@ public class DeckManagerFragment extends BaseFragemnt implements RecyclerViewIte ...@@ -245,13 +288,18 @@ public class DeckManagerFragment extends BaseFragemnt implements RecyclerViewIte
ll_click_like.setVisibility(View.GONE); ll_click_like.setVisibility(View.GONE);
} }
}); });
// 卡组标题点击打开管理对话框
tv_deck.setOnClickListener(v -> { tv_deck.setOnClickListener(v -> {
new DeckManageDialog(this).show( new DeckManageDialog(this).show(
getActivity().getSupportFragmentManager(), "pagerDialog"); getActivity().getSupportFragmentManager(), "pagerDialog");
}); });
// YGODeckDialogUtil.dialogDeckSelect(getActivity(), AppsSettings.get().getLastDeckPath(), this));
mContext = (BaseActivity) getActivity(); mContext = (BaseActivity) getActivity();
/** 自动同步 */
/**
* 自动同步服务器上的卡组信息(如果已登录)
*/
if (SharedPreferenceUtil.getServerToken() != null) { if (SharedPreferenceUtil.getServerToken() != null) {
VUiKit.defer().when(() -> { VUiKit.defer().when(() -> {
try { try {
...@@ -268,17 +316,19 @@ public class DeckManagerFragment extends BaseFragemnt implements RecyclerViewIte ...@@ -268,17 +316,19 @@ public class DeckManagerFragment extends BaseFragemnt implements RecyclerViewIte
} }
} }
/** /**
* 外部调用fragment时,如果通过setArguments(mBundle)方法设置了ydk文件路径,则直接打开该ydk文件 * 预加载文件方法
* 当外部调用fragment时,如果通过setArguments(mBundle)方法设置了ydk文件路径,则直接打开该ydk文件
* 将mPreLoadFile设置为对应的File * 将mPreLoadFile设置为对应的File
*/ */
public void preLoadFile() { public void preLoadFile() {
String preLoadFilePath = ""; String preLoadFilePath = "";
// 从参数中获取预加载文件路径
if (getArguments() != null) { if (getArguments() != null) {
preLoadFilePath = getArguments().getString("setDeck"); preLoadFilePath = getArguments().getString("setDeck");
getArguments().clear(); getArguments().clear();
} }
// 调用重载方法加载文件
preLoadFile(preLoadFilePath); preLoadFile(preLoadFilePath);
} }
...@@ -291,7 +341,7 @@ public class DeckManagerFragment extends BaseFragemnt implements RecyclerViewIte ...@@ -291,7 +341,7 @@ public class DeckManagerFragment extends BaseFragemnt implements RecyclerViewIte
public void preLoadFile(String preLoadFilePath) { public void preLoadFile(String preLoadFilePath) {
final File _file; final File _file;
//打开指定卡组 // 打开指定卡组文件,如果路径有效则使用指定文件,否则使用最后访问的卡组文件
if (!TextUtils.isEmpty(preLoadFilePath) && (mPreLoadFile = new File(preLoadFilePath)).exists()) { if (!TextUtils.isEmpty(preLoadFilePath) && (mPreLoadFile = new File(preLoadFilePath)).exists()) {
//外面卡组 //外面卡组
_file = mPreLoadFile; _file = mPreLoadFile;
...@@ -305,23 +355,36 @@ public class DeckManagerFragment extends BaseFragemnt implements RecyclerViewIte ...@@ -305,23 +355,36 @@ public class DeckManagerFragment extends BaseFragemnt implements RecyclerViewIte
_file = new File(path); _file = new File(path);
} }
} }
// 检查原始卡组目录是否存在且当前卡组目录文件数量较少时,启动权限获取活动
File oriDeckFiles = new File(ORI_DECK); File oriDeckFiles = new File(ORI_DECK);
File deckFiles = new File(AppsSettings.get().getDeckDir()); File deckFiles = new File(AppsSettings.get().getDeckDir());
if (oriDeckFiles.exists() && deckFiles.list().length <= 1) { if (oriDeckFiles.exists() && deckFiles.list().length <= 1) {
mContext.startPermissionsActivity(); mContext.startPermissionsActivity();
} }
// 初始化卡组数据
init(_file); init(_file);
} }
/**
* 设置列表项点击监听器和滚动监听器
*
* 该方法主要完成以下功能:
* 1. 为卡片列表适配器设置点击和长按事件监听器
* 2. 为列表视图添加滚动监听器,用于控制图片加载框架的暂停和恢复
*/
protected void setListeners() { protected void setListeners() {
// 设置列表项点击监听器,当用户点击列表项时触发onCardClick回调
mCardListAdapter.setOnItemClickListener((adapter, view, position) -> { mCardListAdapter.setOnItemClickListener((adapter, view, position) -> {
onCardClick(view, mCardListAdapter.getItem(position), position); onCardClick(view, mCardListAdapter.getItem(position), position);
}); });
// 设置列表项长按监听器,当用户长按列表项时触发onCardLongClick回调
mCardListAdapter.setOnItemLongClickListener((adapter, view, position) -> { mCardListAdapter.setOnItemLongClickListener((adapter, view, position) -> {
onCardLongClick(view, mCardListAdapter.getItem(position), position); onCardLongClick(view, mCardListAdapter.getItem(position), position);
return true; return true;
}); });
// 添加滚动监听器,根据滚动状态控制Glide图片加载的暂停和恢复
mListView.addOnScrollListener(new RecyclerView.OnScrollListener() { mListView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override @Override
public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) { public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
...@@ -329,9 +392,11 @@ public class DeckManagerFragment extends BaseFragemnt implements RecyclerViewIte ...@@ -329,9 +392,11 @@ public class DeckManagerFragment extends BaseFragemnt implements RecyclerViewIte
switch (newState) { switch (newState) {
case RecyclerView.SCROLL_STATE_IDLE: case RecyclerView.SCROLL_STATE_IDLE:
case RecyclerView.SCROLL_STATE_SETTLING: case RecyclerView.SCROLL_STATE_SETTLING:
// 列表停止滚动或正在减速时,恢复图片加载请求
GlideCompat.with(getContext()).resumeRequests(); GlideCompat.with(getContext()).resumeRequests();
break; break;
case RecyclerView.SCROLL_STATE_DRAGGING: case RecyclerView.SCROLL_STATE_DRAGGING:
// 用户正在拖拽列表时,暂停图片加载请求以提升滑动流畅度
GlideCompat.with(getContext()).pauseRequests(); GlideCompat.with(getContext()).pauseRequests();
break; break;
} }
...@@ -388,20 +453,27 @@ public class DeckManagerFragment extends BaseFragemnt implements RecyclerViewIte ...@@ -388,20 +453,27 @@ public class DeckManagerFragment extends BaseFragemnt implements RecyclerViewIte
} }
/** /**
* 在此处处理卡组中卡片的长按删除 * 处理卡组中卡片的长按删除操作
* 当用户长按卡片时,根据设置决定是否显示删除确认对话框或直接删除
* *
* @param pos * @param pos 被长按的卡片在列表中的位置索引
*/ */
@Override @Override
public void onDragLongPress(int pos) { public void onDragLongPress(int pos) {
// 检查位置索引有效性
if (pos < 0) return; if (pos < 0) return;
if (Constants.DEBUG) if (Constants.DEBUG)
Log.d(TAG, "delete " + pos); Log.d(TAG, "delete " + pos);
// 根据设置决定删除方式:弹窗确认删除 或 直接显示删除头部视图
if (mSettings.isDialogDelete()) { if (mSettings.isDialogDelete()) {
// 获取要删除的卡组项
DeckItem deckItem = mDeckAdapater.getItem(pos); DeckItem deckItem = mDeckAdapater.getItem(pos);
if (deckItem == null || deckItem.getCardInfo() == null) { if (deckItem == null || deckItem.getCardInfo() == null) {
return; return;
} }
// 创建并显示删除确认对话框
DialogPlus dialogPlus = new DialogPlus(getContext()); DialogPlus dialogPlus = new DialogPlus(getContext());
dialogPlus.setTitle(R.string.question); dialogPlus.setTitle(R.string.question);
dialogPlus.setMessage(getString(R.string.delete_card, deckItem.getCardInfo().Name)); dialogPlus.setMessage(getString(R.string.delete_card, deckItem.getCardInfo().Name));
...@@ -412,6 +484,7 @@ public class DeckManagerFragment extends BaseFragemnt implements RecyclerViewIte ...@@ -412,6 +484,7 @@ public class DeckManagerFragment extends BaseFragemnt implements RecyclerViewIte
}); });
dialogPlus.show(); dialogPlus.show();
} else { } else {
// 直接显示删除头部视图
mDeckAdapater.showHeadView(); mDeckAdapater.showHeadView();
} }
} }
...@@ -427,10 +500,18 @@ public class DeckManagerFragment extends BaseFragemnt implements RecyclerViewIte ...@@ -427,10 +500,18 @@ public class DeckManagerFragment extends BaseFragemnt implements RecyclerViewIte
view.findViewById(R.id.cube2).startAnimation(shake); //给组件播放动画效果 view.findViewById(R.id.cube2).startAnimation(shake); //给组件播放动画效果
} }
/**
* 隐藏所有打开的抽屉菜单
*
* 该方法会检查左右两侧的抽屉是否处于打开状态,如果打开则将其关闭。
* 主要用于在特定场景下统一关闭所有抽屉菜单,确保界面的一致性。
*/
public void hideDrawers() { public void hideDrawers() {
// 关闭右侧抽屉(如果已打开)
if (mDrawerLayout.isDrawerOpen(Gravity.RIGHT)) { if (mDrawerLayout.isDrawerOpen(Gravity.RIGHT)) {
mDrawerLayout.closeDrawer(Gravity.RIGHT); mDrawerLayout.closeDrawer(Gravity.RIGHT);
} }
// 关闭左侧抽屉(如果已打开)
if (mDrawerLayout.isDrawerOpen(Gravity.LEFT)) { if (mDrawerLayout.isDrawerOpen(Gravity.LEFT)) {
mDrawerLayout.closeDrawer(Gravity.LEFT); mDrawerLayout.closeDrawer(Gravity.LEFT);
} }
...@@ -459,22 +540,32 @@ public class DeckManagerFragment extends BaseFragemnt implements RecyclerViewIte ...@@ -459,22 +540,32 @@ public class DeckManagerFragment extends BaseFragemnt implements RecyclerViewIte
} }
} }
//region load deck //region load deck
//从文件file中读取deck /**
* 从指定文件中加载卡牌包数据
*
* @param file 包含卡牌数据的文件对象,如果文件不存在或为null则会设置空的卡牌包
*/
private void loadDeckFromFile(File file) { private void loadDeckFromFile(File file) {
// 检查卡牌加载器是否打开以及文件是否存在,如果条件不满足则设置空卡牌包
if (!mCardLoader.isOpen() || file == null || !file.exists()) { if (!mCardLoader.isOpen() || file == null || !file.exists()) {
setCurDeck(new DeckInfo(), false); setCurDeck(new DeckInfo(), false);
return; return;
} }
// 显示加载对话框
DialogPlus dlg = DialogPlus.show(getContext(), null, getString(R.string.loading)); DialogPlus dlg = DialogPlus.show(getContext(), null, getString(R.string.loading));
// 异步加载卡牌包数据
VUiKit.defer().when(() -> { VUiKit.defer().when(() -> {
// 双重检查卡牌加载器状态和文件存在性,确保数据加载安全
if (mCardLoader.isOpen() && file.exists()) { if (mCardLoader.isOpen() && file.exists()) {
return mDeckAdapater.read(mCardLoader, file, mCardLoader.getLimitList()); return mDeckAdapater.read(mCardLoader, file, mCardLoader.getLimitList());
} else { } else {
return new DeckInfo(); return new DeckInfo();
} }
}).done((rs) -> { }).done((rs) -> {
// 关闭加载对话框并设置当前卡牌包
dlg.dismiss(); dlg.dismiss();
//setCurDeck(rs, file.getParent().equals(mSettings.getPackDeckDir()) || file.getParent().equals(mSettings.getCacheDeckDir())); //setCurDeck(rs, file.getParent().equals(mSettings.getPackDeckDir()) || file.getParent().equals(mSettings.getCacheDeckDir()));
setCurDeck(rs, file.getParent().equals(mSettings.getPackDeckDir())); setCurDeck(rs, file.getParent().equals(mSettings.getPackDeckDir()));
...@@ -482,67 +573,98 @@ public class DeckManagerFragment extends BaseFragemnt implements RecyclerViewIte ...@@ -482,67 +573,98 @@ public class DeckManagerFragment extends BaseFragemnt implements RecyclerViewIte
} }
//region init //region init
/**
* 初始化函数,用于加载卡组数据和相关配置
*
* @param ydk 卡组文件,可以为null,如果为null则会尝试加载默认卡组文件
*/
public void init(@Nullable File ydk) { public void init(@Nullable File ydk) {
// 显示加载对话框
DialogPlus dlg = DialogPlus.show(mContext, null, getString(R.string.loading)); DialogPlus dlg = DialogPlus.show(mContext, null, getString(R.string.loading));
VUiKit.defer().when(() -> { VUiKit.defer().when(() -> {
// 加载数据管理器
DataManager.get().load(true); DataManager.get().load(true);
//默认第一个卡表
// 设置限制卡表列表,使用第一个可用的限制列表
if (activity.getmLimitManager().getCount() > 0) { if (activity.getmLimitManager().getCount() > 0) {
mCardLoader.setLimitList(activity.getmLimitManager().getTopLimit()); mCardLoader.setLimitList(activity.getmLimitManager().getTopLimit());
} }
// 处理卡组文件加载逻辑
File file = ydk; File file = ydk;
if (file == null || !file.exists()) { if (file == null || !file.exists()) {
//当默认卡组不存在的时候 // 当默认卡组不存在的时候,尝试获取其他可用的ydk文件
List<File> files = getYdkFiles(); List<File> files = getYdkFiles();
if (files != null && files.size() > 0) { if (files != null && files.size() > 0) {
file = files.get(0); file = files.get(0);
} }
} }
//EXTRA_DECK
// 如果没有找到有效的卡组文件,返回空的卡组信息
if (file == null) { if (file == null) {
return new DeckInfo(); return new DeckInfo();
} }
Log.i(TAG, "load ydk " + file); Log.i(TAG, "load ydk " + file);
// 读取卡组文件内容
if (mCardLoader.isOpen() && file.exists()) { if (mCardLoader.isOpen() && file.exists()) {
return mDeckAdapater.read(mCardLoader, file, mCardLoader.getLimitList()); return mDeckAdapater.read(mCardLoader, file, mCardLoader.getLimitList());
} else { } else {
return new DeckInfo(); return new DeckInfo();
} }
}).done((rs) -> { }).done((rs) -> {
// 初始化完成后的处理逻辑
isLoad = true; isLoad = true;
dlg.dismiss(); dlg.dismiss();
mCardSearcher.initItems(); mCardSearcher.initItems();
initLimitListSpinners(mLimitSpinner, mCardLoader.getLimitList()); initLimitListSpinners(mLimitSpinner, mCardLoader.getLimitList());
//设置当前卡组
// 设置当前卡组显示
if (rs.source != null) { if (rs.source != null) {
setCurDeck(rs, rs.source.getParent().equals(mSettings.getPackDeckDir())); setCurDeck(rs, rs.source.getParent().equals(mSettings.getPackDeckDir()));
} else { } else {
setCurDeck(rs, false); setCurDeck(rs, false);
} }
//设置收藏夹
// 设置并显示收藏夹
mCardSearcher.showFavorites(false); mCardSearcher.showFavorites(false);
}); });
} }
/** /**
* 用户选中某个卡组后,更新当前界面,显示已选中的卡组。包括更新界面显示(tv_deck)、更新AppsSettings、通知DeckAdapter * 设置当前选中的卡组并更新界面显示
* @param deckInfo 选中的卡组信息,如果为null则创建新的空卡组信息对象
* @param isPack 是否为卡包模式
*/ */
private void setCurDeck(DeckInfo deckInfo, boolean isPack) { private void setCurDeck(DeckInfo deckInfo, boolean isPack) {
// 处理空卡组信息情况
if (deckInfo == null) { if (deckInfo == null) {
deckInfo = new DeckInfo(); deckInfo = new DeckInfo();
} }
File file = deckInfo.source; File file = deckInfo.source;
// 更新最后选择的卡组路径和界面显示名称
if (file != null && file.exists()) { if (file != null && file.exists()) {
String name = IOUtils.tirmName(file.getName(), Constants.YDK_FILE_EX); String name = IOUtils.tirmName(file.getName(), Constants.YDK_FILE_EX);
mSettings.setLastDeckPath(file.getAbsolutePath()); mSettings.setLastDeckPath(file.getAbsolutePath());
tv_deck.setText(name); tv_deck.setText(name);
} }
// 通知适配器更新卡组数据和界面
mDeckAdapater.setDeck(deckInfo, isPack); mDeckAdapater.setDeck(deckInfo, isPack);
mDeckAdapater.notifyDataSetChanged(); mDeckAdapater.notifyDataSetChanged();
} }
/**
* 判断指定文件是否位于卡牌目录中
*
* @param file 要检查的文件对象
* @return 如果文件的父目录等于卡牌目录则返回true,否则返回false
*/
private boolean inDeckDir(File file) { private boolean inDeckDir(File file) {
// 获取卡牌目录的绝对路径
String deck = new File(AppsSettings.get().getDeckDir()).getAbsolutePath(); String deck = new File(AppsSettings.get().getDeckDir()).getAbsolutePath();
// 比较文件父目录与卡牌目录是否相同
return TextUtils.equals(deck, file.getParent()); return TextUtils.equals(deck, file.getParent());
} }
...@@ -633,11 +755,24 @@ public class DeckManagerFragment extends BaseFragemnt implements RecyclerViewIte ...@@ -633,11 +755,24 @@ public class DeckManagerFragment extends BaseFragemnt implements RecyclerViewIte
return mDialog != null && mDialog.isShowing(); return mDialog != null && mDialog.isShowing();
} }
/**
* 显示卡片详情对话框
*
* @param provider 卡片列表提供者,用于获取当前卡片的上下文数据
* @param cardInfo 要显示的卡片信息,如果为null则不执行任何操作
* @param pos 当前卡片在列表中的位置
*/
protected void showCardDialog(CardListProvider provider, Card cardInfo, int pos) { protected void showCardDialog(CardListProvider provider, Card cardInfo, int pos) {
// 如果卡片信息为空,则不进行任何操作
if (cardInfo != null) { if (cardInfo != null) {
// 如果卡片已经显示,则直接返回
if (isShowCard()) return; if (isShowCard()) return;
// 初始化卡片详情视图(如果尚未初始化)
if (mCardDetail == null) { if (mCardDetail == null) {
mCardDetail = new CardDetail((BaseActivity) getActivity(), activity.getImageLoader(), activity.getStringManager()); mCardDetail = new CardDetail((BaseActivity) getActivity(), activity.getImageLoader(), activity.getStringManager());
// 设置卡片点击监听器,处理各种卡片交互事件
mCardDetail.setOnCardClickListener(new CardDetail.OnDeckManagerCardClickListener() { mCardDetail.setOnCardClickListener(new CardDetail.OnDeckManagerCardClickListener() {
@Override @Override
public void onOpenUrl(Card cardInfo) { public void onOpenUrl(Card cardInfo) {
...@@ -675,18 +810,26 @@ public class DeckManagerFragment extends BaseFragemnt implements RecyclerViewIte ...@@ -675,18 +810,26 @@ public class DeckManagerFragment extends BaseFragemnt implements RecyclerViewIte
addMainCard(cardInfo); addMainCard(cardInfo);
} }
}); });
// 设置回调函数,当卡片收藏状态改变时触发
mCardDetail.setCallBack((card, favorite) -> { mCardDetail.setCallBack((card, favorite) -> {
if (mCardSearcher.isShowFavorite()) { if (mCardSearcher.isShowFavorite()) {
mCardSearcher.showFavorites(false); mCardSearcher.showFavorites(false);
} }
}); });
} }
// 显示添加按钮
mCardDetail.showAdd(); mCardDetail.showAdd();
// 初始化对话框(如果尚未初始化)
if (mDialog == null) { if (mDialog == null) {
mDialog = new DialogPlus(getContext()); mDialog = new DialogPlus(getContext());
mDialog.setView(mCardDetail.getView()); mDialog.setView(mCardDetail.getView());
mDialog.hideButton(); mDialog.hideButton();
mDialog.hideTitleBar(); mDialog.hideTitleBar();
// 设置手势监听器,支持左右滑动切换卡片
mDialog.setOnGestureListener(new AOnGestureListener() { mDialog.setOnGestureListener(new AOnGestureListener() {
@Override @Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
...@@ -701,13 +844,18 @@ public class DeckManagerFragment extends BaseFragemnt implements RecyclerViewIte ...@@ -701,13 +844,18 @@ public class DeckManagerFragment extends BaseFragemnt implements RecyclerViewIte
} }
}); });
} }
// 如果对话框未显示,则显示它
if (!mDialog.isShowing()) { if (!mDialog.isShowing()) {
mDialog.show(); mDialog.show();
} }
// 绑定卡片数据到详情视图
mCardDetail.bind(cardInfo, pos, provider); mCardDetail.bind(cardInfo, pos, provider);
} }
} }
private void showSearchKeyWord(String keyword) {//使用此方法,可以适用关键词查询逻辑,让完全符合关键词的卡名置顶显示,并同时搜索字段和效果文本 private void showSearchKeyWord(String keyword) {//使用此方法,可以适用关键词查询逻辑,让完全符合关键词的卡名置顶显示,并同时搜索字段和效果文本
CardSearchInfo searchInfo = new CardSearchInfo.Builder().keyword(keyword).types(new long[]{}).build();//构建CardSearchInfo时type不能为null CardSearchInfo searchInfo = new CardSearchInfo.Builder().keyword(keyword).types(new long[]{}).build();//构建CardSearchInfo时type不能为null
mCardLoader.search(searchInfo); mCardLoader.search(searchInfo);
...@@ -830,11 +978,19 @@ public class DeckManagerFragment extends BaseFragemnt implements RecyclerViewIte ...@@ -830,11 +978,19 @@ public class DeckManagerFragment extends BaseFragemnt implements RecyclerViewIte
} }
/**
* 处理菜单项点击事件,根据传入的菜单ID执行对应的操作。
*
* @param menuId 菜单项ID,用于区分不同的菜单操作
* @return 如果处理了该菜单项则返回true,否则返回false
*/
public boolean doMenu(int menuId) { public boolean doMenu(int menuId) {
DialogPlus builder = new DialogPlus(getContext()); DialogPlus builder = new DialogPlus(getContext());
switch (menuId) { switch (menuId) {
case R.id.action_deck_backup_n_restore: case R.id.action_deck_backup_n_restore:
// 启动权限请求页面
mContext.startPermissionsActivity(); mContext.startPermissionsActivity();
// 显示备份与恢复卡组的选择对话框
builder.setTitle(R.string.question); builder.setTitle(R.string.question);
builder.setMessage(R.string.deck_explain); builder.setMessage(R.string.deck_explain);
builder.setMessageGravity(Gravity.CENTER_HORIZONTAL); builder.setMessageGravity(Gravity.CENTER_HORIZONTAL);
...@@ -842,31 +998,34 @@ public class DeckManagerFragment extends BaseFragemnt implements RecyclerViewIte ...@@ -842,31 +998,34 @@ public class DeckManagerFragment extends BaseFragemnt implements RecyclerViewIte
builder.setRightButtonText(R.string.deck_back_up); builder.setRightButtonText(R.string.deck_back_up);
builder.setRightButtonListener((dialog, which) -> { builder.setRightButtonListener((dialog, which) -> {
dialog.dismiss(); dialog.dismiss();
doBackUpDeck(); doBackUpDeck(); // 执行卡组备份
}); });
builder.setLeftButtonListener((dialog, which) -> { builder.setLeftButtonListener((dialog, which) -> {
dialog.dismiss(); dialog.dismiss();
doRestoreDeck(); doRestoreDeck(); // 执行卡组恢复
}); });
builder.show(); builder.show();
break; break;
case R.id.action_search: case R.id.action_search:
//条件对话框 // 弹出搜索条件对话框
showSearch(true); showSearch(true);
break; break;
case R.id.action_card_list: case R.id.action_card_list:
// 显示卡牌列表结果
showResult(true); showResult(true);
break; break;
case R.id.action_share_deck: case R.id.action_share_deck:
// 分享当前卡组
if (mDeckAdapater.getYdkFile() == null) { if (mDeckAdapater.getYdkFile() == null) {
YGOUtil.showTextToast(R.string.unable_to_edit_empty_deck); YGOUtil.showTextToast(R.string.unable_to_edit_empty_deck);
return true; return true;
} }
shareDeck(); shareDeck();
break; break;
case R.id.action_save://如果是通过“预加载”打开ydk,则将ydk保存到 case R.id.action_save:
if (mPreLoadFile != null && mPreLoadFile == mDeckAdapater.getYdkFile()) {//代表通过预加载功能打开的ydk // 保存卡组逻辑:判断是否为预加载文件并进行相应处理
//需要保存到deck文件夹 if (mPreLoadFile != null && mPreLoadFile == mDeckAdapater.getYdkFile()) {
// 预加载文件需要保存到deck文件夹
inputDeckName(mPreLoadFile, null, true); inputDeckName(mPreLoadFile, null, true);
} else { } else {
if (mDeckAdapater.getYdkFile() == null) { if (mDeckAdapater.getYdkFile() == null) {
...@@ -876,12 +1035,13 @@ public class DeckManagerFragment extends BaseFragemnt implements RecyclerViewIte ...@@ -876,12 +1035,13 @@ public class DeckManagerFragment extends BaseFragemnt implements RecyclerViewIte
TextUtils.equals(mDeckAdapater.getYdkFile().getParent(), mSettings.getPackDeckDir())) { TextUtils.equals(mDeckAdapater.getYdkFile().getParent(), mSettings.getPackDeckDir())) {
YGOUtil.showTextToast(R.string.donot_edit_Deck); YGOUtil.showTextToast(R.string.donot_edit_Deck);
} else { } else {
save(mDeckAdapater.getYdkFile()); save(mDeckAdapater.getYdkFile()); // 保存卡组文件
} }
} }
} }
break; break;
case R.id.action_rename: case R.id.action_rename:
// 重命名卡组
if (mDeckAdapater.getYdkFile() == null) { if (mDeckAdapater.getYdkFile() == null) {
YGOUtil.showTextToast(R.string.unable_to_edit_empty_deck); YGOUtil.showTextToast(R.string.unable_to_edit_empty_deck);
return true; return true;
...@@ -894,10 +1054,11 @@ public class DeckManagerFragment extends BaseFragemnt implements RecyclerViewIte ...@@ -894,10 +1054,11 @@ public class DeckManagerFragment extends BaseFragemnt implements RecyclerViewIte
} }
break; break;
case R.id.action_deck_new: case R.id.action_deck_new:
// 新建卡组
createDeck(null); createDeck(null);
break; break;
case R.id.action_clear_deck: { case R.id.action_clear_deck: {
// 清空当前卡组内容
builder.setTitle(R.string.question); builder.setTitle(R.string.question);
builder.setMessage(R.string.question_clear_deck); builder.setMessage(R.string.question_clear_deck);
builder.setMessageGravity(Gravity.CENTER_HORIZONTAL); builder.setMessageGravity(Gravity.CENTER_HORIZONTAL);
...@@ -910,6 +1071,7 @@ public class DeckManagerFragment extends BaseFragemnt implements RecyclerViewIte ...@@ -910,6 +1071,7 @@ public class DeckManagerFragment extends BaseFragemnt implements RecyclerViewIte
} }
break; break;
case R.id.action_delete_deck: { case R.id.action_delete_deck: {
// 删除当前卡组
if (mDeckAdapater.getYdkFile() == null) { if (mDeckAdapater.getYdkFile() == null) {
YGOUtil.showTextToast(R.string.unable_to_edit_empty_deck); YGOUtil.showTextToast(R.string.unable_to_edit_empty_deck);
return true; return true;
...@@ -924,12 +1086,10 @@ public class DeckManagerFragment extends BaseFragemnt implements RecyclerViewIte ...@@ -924,12 +1086,10 @@ public class DeckManagerFragment extends BaseFragemnt implements RecyclerViewIte
builder.setLeftButtonListener((dlg, rs) -> { builder.setLeftButtonListener((dlg, rs) -> {
if (mDeckAdapater.getYdkFile() != null) { if (mDeckAdapater.getYdkFile() != null) {
FileUtils.deleteFile(mDeckAdapater.getYdkFile()); FileUtils.deleteFile(mDeckAdapater.getYdkFile());
//统一调用批量删除在线卡组(这里只有1个) // 统一调用批量删除在线卡组(这里只有1个)
List<DeckFile> deckFileList = new ArrayList<>(); List<DeckFile> deckFileList = new ArrayList<>();
deckFileList.add(new DeckFile(mDeckAdapater.getYdkFile())); deckFileList.add(new DeckFile(mDeckAdapater.getYdkFile()));
onDeckDel(deckFileList); onDeckDel(deckFileList);
YGOUtil.showTextToast(R.string.done); YGOUtil.showTextToast(R.string.done);
dlg.dismiss(); dlg.dismiss();
File file = getFirstYdk(); File file = getFirstYdk();
...@@ -941,10 +1101,11 @@ public class DeckManagerFragment extends BaseFragemnt implements RecyclerViewIte ...@@ -941,10 +1101,11 @@ public class DeckManagerFragment extends BaseFragemnt implements RecyclerViewIte
} }
break; break;
case R.id.action_unsort: case R.id.action_unsort:
//打乱 // 打乱卡组顺序
mDeckAdapater.unSort(); mDeckAdapater.unSort();
break; break;
case R.id.action_sort: case R.id.action_sort:
// 对卡组进行排序
mDeckAdapater.sort(); mDeckAdapater.sort();
break; break;
default: default:
...@@ -953,22 +1114,32 @@ public class DeckManagerFragment extends BaseFragemnt implements RecyclerViewIte ...@@ -953,22 +1114,32 @@ public class DeckManagerFragment extends BaseFragemnt implements RecyclerViewIte
return true; return true;
} }
/**
* 创建新的卡组文件
* @param savePath 新卡组文件的保存路径
*/
private void createDeck(String savePath) { private void createDeck(String savePath) {
final File old = mDeckAdapater.getYdkFile(); final File old = mDeckAdapater.getYdkFile();
DialogPlus builder = new DialogPlus(getContext()); DialogPlus builder = new DialogPlus(getContext());
builder.setTitle(R.string.question); builder.setTitle(R.string.question);
builder.setMessage(R.string.question_keep_cur_deck); builder.setMessage(R.string.question_keep_cur_deck);
builder.setMessageGravity(Gravity.CENTER_HORIZONTAL); builder.setMessageGravity(Gravity.CENTER_HORIZONTAL);
// 设置左按钮监听器 - 选择保留当前卡组
builder.setLeftButtonListener((dlg, rs) -> { builder.setLeftButtonListener((dlg, rs) -> {
dlg.dismiss(); dlg.dismiss();
//复制当前卡组 //复制当前卡组
inputDeckName(old, savePath, true); inputDeckName(old, savePath, true);
}); });
// 设置右按钮监听器 - 不保留当前卡组
builder.setRightButtonListener((dlg, rs) -> { builder.setRightButtonListener((dlg, rs) -> {
dlg.dismiss(); dlg.dismiss();
setCurDeck(null, false); setCurDeck(null, false);
inputDeckName(null, savePath, true); inputDeckName(null, savePath, true);
}); });
// 设置关闭监听器 - 当对话框关闭时的处理
builder.setOnCloseLinster((dlg) -> { builder.setOnCloseLinster((dlg) -> {
dlg.dismiss(); dlg.dismiss();
setCurDeck(null, false); setCurDeck(null, false);
...@@ -1110,12 +1281,17 @@ public class DeckManagerFragment extends BaseFragemnt implements RecyclerViewIte ...@@ -1110,12 +1281,17 @@ public class DeckManagerFragment extends BaseFragemnt implements RecyclerViewIte
return null; return null;
} }
//从存储卡组的文件夹中获取所有名字以.ydk结尾的文件,并将mPreLoadFile也加入到返回结果中 /**
* 从存储卡组的文件夹中获取所有名字以.ydk结尾的文件,并将mPreLoadFile也加入到返回结果中
* @return 包含所有.ydk文件的文件列表,如果目录不存在或无法访问则返回null
*/
private List<File> getYdkFiles() { private List<File> getYdkFiles() {
// 获取卡组文件夹路径并列出所有.ydk文件
File dir = new File(mSettings.getResourcePath(), Constants.CORE_DECK_PATH); File dir = new File(mSettings.getResourcePath(), Constants.CORE_DECK_PATH);
File[] files = dir.listFiles((file, s) -> s.toLowerCase(Locale.US).endsWith(Constants.YDK_FILE_EX)); File[] files = dir.listFiles((file, s) -> s.toLowerCase(Locale.US).endsWith(Constants.YDK_FILE_EX));
if (files != null) { if (files != null) {
List<File> list = new ArrayList<>(Arrays.asList(files)); List<File> list = new ArrayList<>(Arrays.asList(files));
// 检查并添加预加载文件(如果存在且不在当前列表中)
if (mPreLoadFile != null && mPreLoadFile.exists()) { if (mPreLoadFile != null && mPreLoadFile.exists()) {
boolean hasCur = false; boolean hasCur = false;
for (File f : list) { for (File f : list) {
...@@ -1133,12 +1309,21 @@ public class DeckManagerFragment extends BaseFragemnt implements RecyclerViewIte ...@@ -1133,12 +1309,21 @@ public class DeckManagerFragment extends BaseFragemnt implements RecyclerViewIte
return null; return null;
} }
/**
* 初始化限制列表下拉框
* @param spinner 要初始化的Spinner控件
* @param cur 当前选中的限制列表对象,用于设置默认选中项
*/
private void initLimitListSpinners(Spinner spinner, LimitList cur) { private void initLimitListSpinners(Spinner spinner, LimitList cur) {
List<SimpleSpinnerItem> items = new ArrayList<>(); List<SimpleSpinnerItem> items = new ArrayList<>();
List<String> limitLists = activity.getmLimitManager().getLimitNames(); List<String> limitLists = activity.getmLimitManager().getLimitNames();
int index = -1; int index = -1;
int count = activity.getmLimitManager().getCount(); int count = activity.getmLimitManager().getCount();
// 添加默认选项
items.add(new SimpleSpinnerItem(0, getString(R.string.label_limitlist))); items.add(new SimpleSpinnerItem(0, getString(R.string.label_limitlist)));
// 遍历所有限制列表,构建下拉项并查找当前选中项的索引
for (int i = 0; i < count; i++) { for (int i = 0; i < count; i++) {
int j = i + 1; int j = i + 1;
String name = limitLists.get(i); String name = limitLists.get(i);
...@@ -1147,13 +1332,19 @@ public class DeckManagerFragment extends BaseFragemnt implements RecyclerViewIte ...@@ -1147,13 +1332,19 @@ public class DeckManagerFragment extends BaseFragemnt implements RecyclerViewIte
index = j; index = j;
} }
} }
// 设置适配器
SimpleSpinnerAdapter adapter = new SimpleSpinnerAdapter(getContext()); SimpleSpinnerAdapter adapter = new SimpleSpinnerAdapter(getContext());
adapter.setColor(Color.WHITE); adapter.setColor(Color.WHITE);
adapter.set(items); adapter.set(items);
spinner.setAdapter(adapter); spinner.setAdapter(adapter);
// 设置默认选中项
if (index >= 0) { if (index >= 0) {
spinner.setSelection(index); spinner.setSelection(index);
} }
// 设置选择监听器
spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override @Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
...@@ -1167,10 +1358,18 @@ public class DeckManagerFragment extends BaseFragemnt implements RecyclerViewIte ...@@ -1167,10 +1358,18 @@ public class DeckManagerFragment extends BaseFragemnt implements RecyclerViewIte
}); });
} }
/**
* 设置限制列表并更新相关适配器
* @param limitList 限制列表对象,如果为null则直接返回
*/
private void setLimitList(LimitList limitList) { private void setLimitList(LimitList limitList) {
if (limitList == null) return; if (limitList == null) return;
// 检查新的限制列表是否与当前列表相同
LimitList last = mDeckAdapater.getLimitList(); LimitList last = mDeckAdapater.getLimitList();
boolean nochanged = last != null && TextUtils.equals(last.getName(), limitList.getName()); boolean nochanged = last != null && TextUtils.equals(last.getName(), limitList.getName());
// 如果限制列表发生变化,则更新牌组适配器并通知数据变更
if (!nochanged) { if (!nochanged) {
mDeckAdapater.setLimitList(limitList); mDeckAdapater.setLimitList(limitList);
getActivity().runOnUiThread(() -> { getActivity().runOnUiThread(() -> {
...@@ -1179,6 +1378,8 @@ public class DeckManagerFragment extends BaseFragemnt implements RecyclerViewIte ...@@ -1179,6 +1378,8 @@ public class DeckManagerFragment extends BaseFragemnt implements RecyclerViewIte
mDeckAdapater.notifyItemRangeChanged(DeckItem.SideStart, DeckItem.SideEnd); mDeckAdapater.notifyItemRangeChanged(DeckItem.SideStart, DeckItem.SideEnd);
}); });
} }
// 更新卡片列表适配器的限制列表并通知数据变更
mCardListAdapter.setLimitList(limitList); mCardListAdapter.setLimitList(limitList);
getActivity().runOnUiThread(() -> mCardListAdapter.notifyDataSetChanged()); getActivity().runOnUiThread(() -> mCardListAdapter.notifyDataSetChanged());
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment