use of com.ichi2.libanki.sched.AbstractDeckTreeNode in project AnkiChinaAndroid by ankichinateam.
the class StudyOptionsFragment method handleDeckSelection.
private void handleDeckSelection(long did, boolean dontSkipStudyOptions) {
// Clear the undo history when selecting a new deck
if (getCol().getDecks().selected() != did) {
getCol().clearUndo();
}
// Select the deck
getCol().getDecks().select(did);
// Also forget the last deck used by the Browser
CardBrowser.clearLastDeckId();
// Reset the schedule so that we get the counts for the currently selected deck
mFocusedDeck = did;
// Get some info about the deck to handle special cases
int pos = mDeckListAdapter.findDeckPosition(did);
AbstractDeckTreeNode deckDueTreeNode = mDeckListAdapter.getDeckList().get(pos);
// if (!deckDueTreeNode.shouldDisplayCounts() || deckDueTreeNode.knownToHaveRep()) {
// If we don't yet have numbers, we trust the user that they knows what they opens, tries to open it.
// If there is nothing to review, it'll come back to deck picker.
openReviewerOrStudyOptions(dontSkipStudyOptions);
// return;
// }
// There are numbers
// Figure out what action to take
// if (getCol().getSched().hasCardsTodayAfterStudyAheadLimit()) {
// // If there are cards due that can't be studied yet (due to the learn ahead limit) then go to study options
// openStudyOptions(false);
// } else if (getCol().getSched().newDue() || getCol().getSched().revDue()) {
// // If there are no cards to review because of the daily study limit then give "Study more" option
// UIUtils.showSnackbar(getAnkiActivity(), R.string.studyoptions_limit_reached, false, R.string.study_more, v -> {
// CustomStudyDialog d = CustomStudyDialog.newInstance(
// CustomStudyDialog.CONTEXT_MENU_LIMITS,
// getCol().getDecks().selected(), true, this);
// showDialogFragment(d);
// }, getView().findViewById(R.id.root_layout), mSnackbarShowHideCallback);
// // Check if we need to update the fragment or update the deck list. The same checks
// // are required for all snackbars below.
// if (mFragmented) {
// // Tablets must always show the study options that corresponds to the current deck,
// // regardless of whether the deck is currently reviewable or not.
// openStudyOptions(false);
// } else {
// // On phones, we update the deck list to ensure the currently selected deck is
// // highlighted correctly.
// updateDeckList();
// }
// } else if (getCol().getDecks().isDyn(did)) {
// // Go to the study options screen if filtered deck with no cards to study
// openStudyOptions(false);
// } else if (!deckDueTreeNode.hasChildren() && getCol().cardCount(new Long[] {did}) == 0) {
// // If the deck is empty and has no children then show a message saying it's empty
// final Uri helpUrl = Uri.parse(getResources().getString(R.string.link_manual_getting_started));
// getAnkiActivity().mayOpenUrl(helpUrl);
// UIUtils.showSnackbar(getAnkiActivity(), R.string.empty_deck, false, R.string.help,
// v -> openHelpUrl(helpUrl), getView().findViewById(R.id.root_layout), mSnackbarShowHideCallback);
// if (mFragmented) {
// openStudyOptions(false);
// } else {
// updateDeckList();
// }
// } else {
// // Otherwise say there are no cards scheduled to study, and give option to do custom study
// UIUtils.showSnackbar(getAnkiActivity(), R.string.studyoptions_empty_schedule, false, R.string.custom_study, v -> {
// CustomStudyDialog d = CustomStudyDialog.newInstance(
// CustomStudyDialog.CONTEXT_MENU_EMPTY_SCHEDULE,
// getCol().getDecks().selected(), true, this);
// showDialogFragment(d);
// }, getView().findViewById(R.id.root_layout), mSnackbarShowHideCallback);
// if (mFragmented) {
// openStudyOptions(false);
// } else {
// updateDeckList();
// }
// }
}
use of com.ichi2.libanki.sched.AbstractDeckTreeNode in project AnkiChinaAndroid by ankichinateam.
the class DeckInfoListAdapter method onBindViewHolder.
@Override
public void onBindViewHolder(RecyclerView.ViewHolder tempHolder, int position) {
if (tempHolder instanceof HeaderViewHolder) {
HeaderViewHolder holder = (HeaderViewHolder) tempHolder;
holder.mTextDeckName.setText(mTextDeckName);
holder.mDeckListHeader.setVisibility(mDeckList.isEmpty() ? View.GONE : View.VISIBLE);
// holder.mTextCongratsMessage.setText(mTextCongratsMessage);
holder.mTextDeckDescription.setText(mTextDeckDescription != null && mTextDeckDescription.length() > 0 ? formatDescription(mTextDeckDescription) : "");
holder.mTextTodayNew.setText(mTextTodayNew);
holder.mTextTodayRev.setText(mTextTodayRev);
holder.mTextCountHandled.setText(mTextCountHandled);
holder.mTextCountLearning.setText(mTextCountLearning);
holder.mTextCountNew.setText(mTextCountNew);
holder.mTextCountHard.setText(mTextCountHard);
holder.mTextTotal.setText(mTextTotal);
holder.mTextHandledPercent.setText(mTextHandledPercent);
holder.mTextHandledNum.setText(mTextHandledNum);
holder.mTextETA.setText(mTextETA);
holder.mButtonStart.setText(mTextButtonStart);
holder.mButtonStart.setOnClickListener(mButtonStartClickListener);
holder.mSelfStudyAskIcon.setOnClickListener(v -> {
if (mSelfStudyQADialog == null) {
mSelfStudyQADialog = new Dialog(mContext, R.style.CommonDialogTheme);
View view = View.inflate(mContext, R.layout.pop_window_self_study_introduce, null);
mSelfStudyQADialog.setContentView(view);
Window window = mSelfStudyQADialog.getWindow();
WindowManager.LayoutParams lps = window.getAttributes();
lps.width = WindowManager.LayoutParams.MATCH_PARENT;
window.setAttributes(lps);
window.setGravity(Gravity.BOTTOM);
window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
}
mSelfStudyQADialog.show();
});
holder.mStudyProgress.setProgress(mStudyProgress);
// holder.mDeckInfoLayout.setVisibility(mDeckInfoLayoutVisible);
// holder.mTextCongratsMessage.setVisibility(mTextCongratsMessageVisible);
holder.mTextDeckDescription.setVisibility(mTextDeckDescriptionVisible);
holder.mButtonStart.setEnabled(mButtonStartEnable);
holder.mSelfStudyHandle.setTag(SelfStudyActivity.TAB_STUDY_STATE);
holder.mSelfStudyMark.setTag(SelfStudyActivity.TAB_MARK_STATE);
holder.mSelfStudyAnswer.setTag(SelfStudyActivity.TAB_ANSWER_STATE);
holder.mSelfStudyCustom.setTag(SelfStudyActivity.TAB_CUSTOM_STATE);
holder.mSelfStudyHandle.setOnClickListener(mSelfStudyClickListener);
holder.mSelfStudyMark.setOnClickListener(mSelfStudyClickListener);
holder.mSelfStudyAnswer.setOnClickListener(mSelfStudyClickListener);
holder.mSelfStudyCustom.setOnClickListener(mSelfStudyClickListener);
holder.mTextStudySetting.setVisibility(mCurrentDeck == null || mCurrentDeck.optInt("dyn", 0) == 1 ? View.GONE : View.VISIBLE);
holder.mTextStudySetting.setOnClickListener(v -> {
Intent i = new Intent(mContext, StudySettingActivity.class);
i.putExtra("did", mCurrentDeck.optLong("id"));
mContext.startActivityForResultWithAnimation(i, DECK_OPTIONS, ActivityTransitionAnimation.FADE);
});
if (AD_IMAGE_URL != null && !AD_IMAGE_URL.isEmpty() && AD_LINK_URL != null && !AD_LINK_URL.isEmpty()) {
holder.mAdLayout.setVisibility(View.VISIBLE);
CornerTransform transformation = new CornerTransform(mContext, AdaptionUtil.dip2px(mContext, 9));
transformation.setExceptCorner(false, false, false, false);
RequestOptions coverRequestOptions = new RequestOptions().transform(transformation).diskCacheStrategy(// 不做磁盘缓存
DiskCacheStrategy.NONE).skipMemoryCache(// 不做内存缓存
true);
Glide.with(mContext).asBitmap().load(AD_IMAGE_URL).apply(coverRequestOptions).into(holder.mAdImage);
holder.mAdLayout.setOnClickListener(v -> WebViewActivity.openUrlInApp(mContext, AD_LINK_URL, ""));
} else {
holder.mAdLayout.setVisibility(View.GONE);
}
} else if (tempHolder instanceof ViewHolder) {
position--;
ViewHolder holder = (ViewHolder) tempHolder;
AbstractDeckTreeNode node = mDeckList.get(position);
// Set the expander icon and padding according to whether or not there are any subdecks
RelativeLayout deckLayout = holder.deckLayout;
// int rightPadding = (int) deckLayout.getResources().getDimension(R.dimen.deck_picker_right_padding);
if (mHasSubdecks) {
int smallPadding = (int) deckLayout.getResources().getDimension(R.dimen.deck_picker_left_padding_small);
deckLayout.setPadding(smallPadding, 0, (int) deckLayout.getResources().getDimension(R.dimen.deck_picker_right_padding), 0);
holder.deckExpander.setVisibility(View.VISIBLE);
// Create the correct expander for this deck
setDeckExpander(holder.deckExpander, holder.indentView, node);
} else {
holder.deckExpander.setVisibility(View.GONE);
int normalPadding = (int) deckLayout.getResources().getDimension(R.dimen.deck_picker_left_padding);
deckLayout.setPadding(normalPadding, 0, (int) deckLayout.getResources().getDimension(R.dimen.deck_picker_right_padding), 0);
}
if (node.hasChildren()) {
holder.deckExpander.setTag(node.getDid());
holder.deckExpander.setOnClickListener(mDeckExpanderClickListener);
} else {
holder.deckExpander.setOnClickListener(null);
}
// holder.deckLayout.setBackgroundResource(mRowCurrentDrawable);
// Set background colour. The current deck has its own color
// if (isCurrentlySelectedDeck(node)) {
// Timber.d("can be shown:%s", node.getDid());
// Timber.d("mHasSubdecks:%s", node.hasChildren() + "");
// if (mCurrentIDs.contains(node.getDid())) {
// holder.deckLayout.setVisibility(View.VISIBLE);
// holder.deckLayout.setBackgroundResource(mRowCurrentDrawable);
// if (mPartiallyTransparentForBackground) {
// setBackgroundAlpha(holder.deckLayout, SELECTED_DECK_ALPHA_AGAINST_BACKGROUND);
// }
// } else {
// holder.deckLayout.setVisibility(View.GONE);
// CompatHelper.getCompat().setSelectableBackground(holder.deckLayout);
// }
// Set deck name and colour. Filtered decks have their own colour
holder.deckName.setText(node.getLastDeckNameComponent());
if (mCol.getDecks().isDyn(node.getDid())) {
holder.deckName.setTextColor(mDeckNameDynColor);
} else {
if (node.getDepth() == Decks.path(mCurrentDeck.optString("name")).length) {
holder.deckName.setTextColor(mDeckNameDefaultColor);
} else {
holder.deckName.setTextColor(mDeckNameDefaultColorChild);
}
}
if (node.shouldDisplayCounts()) {
// holder.deckNew.setText(String.valueOf(node.getNewCount()));
// holder.deckLearn.setText(String.valueOf(node.getLrnCount()));
// holder.deckRev.setText(String.valueOf(node.getRevCount()+node.getLrnCount()));
holder.deckNew.setText(String.valueOf(node.getNewCount() + node.getRevCount() + node.getLrnCount()));
String ids = Stats.deckLimit(node.getDid(), mCol);
holder.deckRev.setText(String.valueOf(mCol.cardCount(ids)));
}
// Store deck ID in layout's tag for easy retrieval in our click listeners
holder.deckLayout.setTag(node.getDid());
holder.countsLayout.setTag(node.getDid());
holder.endIcon.setTag(node.getDid());
// holder.endLayout.setTag(node.getDid());
// Set click listeners
holder.deckLayout.setOnClickListener(mDeckClickListener);
holder.deckLayout.setOnLongClickListener(mDeckLongClickListener);
holder.countsLayout.setOnClickListener(mCountsClickListener);
holder.endIcon.setOnClickListener(mCountsClickListener);
// holder.endLayout.setOnClickListener(mCountsClickListener);
} else if (mCurrentDeck != null) {
if (tempHolder instanceof CardsListAdapter.CardsViewHolder) {
CardsListAdapter.CardsViewHolder holder = (CardsListAdapter.CardsViewHolder) tempHolder;
CardBrowser.CardCache card = mCards.get(position - mDeckList.size() - 1 - 1);
Timber.i("refresh card:%s", card.getId());
String question = card.getColumnHeaderText(CardBrowser.Column.SFLD);
if (card.getColumnHeaderText(CardBrowser.Column.SUSPENDED).equals("True")) {
holder.deckQuestion.setTextColor(ContextCompat.getColor(mContext, R.color.new_primary_text_third_color));
// holder.deckAnswer.setTextColor(ContextCompat.getColor(mContext, R.color.new_primary_text_third_color));
}
String firstColumnStr = question.isEmpty() ? card.getColumnHeaderText(CardBrowser.Column.MEDIA_NAME) : card.getColumnHeaderText(CardBrowser.Column.SFLD);
Pattern pattern = Pattern.compile("(?<=≯#).*?(?=#≮)");
Matcher matcher = pattern.matcher(firstColumnStr);
String val = "";
if (matcher.find()) {
val = matcher.group(0);
try {
String key = mModelKeys.getString(String.valueOf(card.getCard().model().getLong("id")));
Timber.i("match key:%s", key);
holder.deckQuestion.setText(HtmlUtils.delHTMLTag(firstColumnStr.substring(0, firstColumnStr.indexOf("≯#")) + AESUtil.decrypt(val, key) + firstColumnStr.substring(firstColumnStr.indexOf("#≮") + 2)));
// holder.deckQuestion.setText(firstColumnStr.substring(0, firstColumnStr.indexOf("≯#")) + aesUtil.getDecryptedMessage(val) + firstColumnStr.substring(firstColumnStr.indexOf("#≮") + 2));
} catch (Exception e) {
e.printStackTrace();
holder.deckQuestion.setText(firstColumnStr);
}
} else {
holder.deckQuestion.setText(firstColumnStr);
}
// holder.deckAnswer.setText(card.getColumnHeaderText(CardBrowser.Column.ANSWER));
holder.reviewCount.setText(card.getColumnHeaderText(CardBrowser.Column.REVIEWS));
holder.forgetCount.setText(card.getColumnHeaderText(CardBrowser.Column.LAPSES));
holder.due.setText(card.getColumnHeaderText(CardBrowser.Column.DUE2));
holder.mark.setTag(card.getId());
holder.flag.setTag(card.getId());
holder.itemRoot.setTag(card.getId());
LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) holder.itemRoot.getLayoutParams();
layoutParams.rightMargin = 0;
holder.itemRoot.setLayoutParams(layoutParams);
if (card.getCard().note().hasTag("marked")) {
holder.mark.setImageResource(R.mipmap.mark_star_normal);
} else {
holder.mark.setImageResource(R.mipmap.note_star_unselected);
}
if (getFlagRes(card.getCard()) != -1) {
holder.flag.setImageResource(getFlagRes(card.getCard()));
} else {
holder.flag.setImageResource(R.mipmap.note_flag_unselected);
}
holder.mark.setOnClickListener(v -> {
CollectionTask.launchCollectionTask(DISMISS_MULTI, markCardHandler(), new TaskData(new Object[] { new long[] { (long) v.getTag() }, Collection.DismissType.MARK_NOTE_MULTI }));
notifyDataSetChanged();
});
holder.flag.setOnClickListener(v -> {
if (mListPop == null) {
mListPop = new ListPopupWindow(mContext);
for (int i = 0; i < mFlagRes.length; i++) {
Map<String, Object> map = new HashMap<>();
map.put("img", mFlagRes[i]);
map.put("content", mFlagContent[i]);
mFlagList.add(map);
}
mListPop.setAdapter(new SimpleAdapter(mContext, mFlagList, R.layout.item_flags_list, new String[] { "img", "content" }, new int[] { R.id.flag_icon, R.id.flag_text }));
mListPop.setWidth(v.getRootView().getWidth() / 2);
mListPop.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT);
// 设置是否是模式
mListPop.setModal(true);
}
mListPop.setOnItemClickListener((parent, view, position1, id) -> {
CollectionTask.launchCollectionTask(DISMISS_MULTI, flagCardHandler(), new TaskData(new Object[] { new long[] { (long) v.getTag() }, Collection.DismissType.FLAG, position1 }));
notifyDataSetChanged();
mListPop.dismiss();
});
mListPop.setAnchorView(v);
mListPop.show();
});
holder.itemRoot.setOnClickListener(v -> {
Intent previewer = new Intent(mContext, Previewer.class);
long[] ids = getAllCardIds();
long targetId = (long) v.getTag();
// }
for (int i = 0; i < ids.length; i++) {
if (ids[i] == targetId) {
previewer.putExtra("index", i);
break;
}
}
previewer.putExtra("cardList", ids);
mContext.startActivityForResultWithoutAnimation(previewer, PREVIEW_CARDS);
});
// holder.itemRoot.setOnLongClickListener(mDeckLongClickListener);
} else if (tempHolder instanceof BrowserTabViewHolder) {
BrowserTabViewHolder holder = (BrowserTabViewHolder) tempHolder;
String[] tabArray = mContext.getResources().getStringArray(R.array.deck_info_browser_tab);
holder.cardsCount.setText(String.format("筛选出%d张卡片", mCards.size()));
// CardsListAdapter mCardsAdapter = new CardsListAdapter(mContext.getLayoutInflater(), mContext, new CardsListAdapter.CardListAdapterCallback() {
// @Override
// public List<CardBrowser.CardCache> getCards() {
// if (mCards == null) {
// mCards = new ArrayList<>();
// }
// return mCards;
// }
//
//
// @Override
// public void onChangeMultiMode(boolean isMultiMode) {
// }
//
//
// @Override
// public void onItemSelect(int count) {
// }
// });
// mCardsAdapter.setStudyCountLayoutRes(R.layout.item_option_study_count);
// mCardsAdapter.setDeckClickListener(view -> {
// Intent previewer = new Intent(mContext, Previewer.class);
// long[] ids = getAllCardIds();
// long targetId = (long) view.getTag();
// if (ids.length > 100) {
// //为提高效率 直接复制卡牌
// long[] finalIds = new long[ids.length + 1];
// finalIds[0] = targetId;
// System.arraycopy(ids, 0, finalIds, 1, ids.length);
// previewer.putExtra("cardList", finalIds);
// } else {
// for (int i = 0; i < ids.length; i++) {
// if (ids[i] == targetId) {
// ids[i] = ids[0];
// ids[0] = targetId;
// }
// }
// previewer.putExtra("cardList", ids);
// }
// previewer.putExtra("index", 0);
// mContext.startActivityForResultWithoutAnimation(previewer, PREVIEW_CARDS);
// });
// holder.mList .setAdapter(mCardsAdapter);
// holder.mList.setRecycledViewPool(new RecyclerView.RecycledViewPool());
// holder.mList.setNestedScrollingEnabled(false);
// holder.mList.setHasFixedSize(true);
// holder.mList.setLayoutManager(new LinearLayoutManager(mContext));
holder.mMore.setTag(SelfStudyActivity.TAB_MAIN_STATE);
holder.mFixBottom.setVisibility(mDeckList.isEmpty() ? View.GONE : View.VISIBLE);
holder.mMore.setOnClickListener(mSelfStudyClickListener);
holder.mTabLayout.removeAllTabs();
LinearLayout linearLayout = (LinearLayout) holder.mTabLayout.getChildAt(0);
linearLayout.setShowDividers(LinearLayout.SHOW_DIVIDER_MIDDLE);
linearLayout.setDividerDrawable(ContextCompat.getDrawable(mContext, // 设置分割线的样式
R.drawable.divider_vertical));
// 设置分割线间隔
linearLayout.setDividerPadding((int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 18, mContext.getResources().getDisplayMetrics()));
for (int i = 0; i < tabArray.length; i++) {
TabLayout.Tab tab = holder.mTabLayout.newTab();
View view = mContext.getLayoutInflater().inflate(R.layout.item_option_tab, null);
((TextView) view.findViewById(R.id.name)).setText(tabArray[i]);
tab.setCustomView(view);
view.setTag(i);
int finalI = i;
view.setOnClickListener(v -> {
if (mContext.colIsOpen()) {
mCurrentSelectedTab = finalI;
holder.mTabLayout.selectTab(holder.mTabLayout.getTabAt(finalI));
// estimate maximum number of cards that could be visible (assuming worst-case minimum row height of 20dp)
int numCardsToRender = (int) Math.ceil(holder.mList.getHeight() / TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 20, mContext.getResources().getDisplayMetrics())) + 5;
Timber.i("I wanna get %d cards", numCardsToRender);
// Perform database query to get all card ids
mSearchCardsHandler = new SearchCardsHandler();
String searchText = getRestrictByTab(finalI) + "deck:\"" + mCurrentDeck.getString("name") + "\" ";
CollectionTask.launchCollectionTask(SEARCH_CARDS, mSearchCardsHandler, new TaskData(new Object[] { searchText, true, numCardsToRender, 0, 0 }));
}
});
holder.mTabLayout.addTab(tab);
}
holder.mTabLayout.selectTab(holder.mTabLayout.getTabAt(mCurrentSelectedTab));
if (!mInitBrowserCards) {
mInitBrowserCards = true;
holder.mTabLayout.getTabAt(0).getCustomView().performClick();
}
}
}
}
use of com.ichi2.libanki.sched.AbstractDeckTreeNode in project AnkiChinaAndroid by ankichinateam.
the class DeckAdapter method onBindViewHolder.
@Override
public void onBindViewHolder(RecyclerView.ViewHolder tempHolder, int position) {
// Update views for this node
if (tempHolder instanceof HeaderViewHolder) {
HeaderViewHolder holder = (HeaderViewHolder) tempHolder;
holder.cost_time.setText(mCost == null || mCost.isEmpty() ? "0" : mCost);
holder.new_card_num.setText(mNewCard == null || mNewCard.isEmpty() ? "0" : mNewCard);
holder.review_card_num.setText(mNeedReviewCard == null || mNeedReviewCard.isEmpty() ? "0" : mNeedReviewCard);
holder.tv_resource.setOnClickListener(mMarketClickListener);
if (mAdText != null && !mAdText.isEmpty()) {
holder.main_ad_layout.setVisibility(View.VISIBLE);
holder.main_ad_text.setText(mAdText);
holder.main_ad_layout.setOnClickListener(mAdClickListener);
holder.remove_ad.setOnClickListener(v -> {
holder.main_ad_layout.setVisibility(View.GONE);
// LinearLayout.LayoutParams params= (LinearLayout.LayoutParams) holder.today_title.getLayoutParams();
// params.topMargin= AdaptionUtil.dip2px(mContext, 9);
});
} else {
holder.main_ad_layout.setVisibility(View.GONE);
}
} else if (tempHolder instanceof EmptyViewHolder) {
EmptyViewHolder holder = (EmptyViewHolder) tempHolder;
holder.btn_get_card.setOnClickListener(mMarketClickListener);
} else if (tempHolder instanceof DeckAdapter.ViewHolder) {
position--;
DeckAdapter.ViewHolder holder = (ViewHolder) tempHolder;
AbstractDeckTreeNode node = mDeckList.get(position);
// Set the expander icon and padding according to whether or not there are any subdecks
// RelativeLayout deckLayout = holder.deckLayout;
// int rightPadding = (int) deckLayout.getResources().getDimension(R.dimen.deck_picker_right_padding);
// Timber.d("onBindViewHolder,mHasSubdecks:" + mHasSubdecks);
// if (mHasSubdecks) {
// int smallPadding = (int) deckLayout.getResources().getDimension(R.dimen.deck_picker_left_padding_small);
// deckLayout.setPadding(smallPadding, 0, rightPadding, 0);
// holder.deckExpander.setVisibility(View.VISIBLE);
// holder.fileBag.setVisibility(View.VISIBLE);
// // Create the correct expander for this deck
//
// setDeckExpander(holder.deckExpander,holder.fileBag,holder.indentView, node);
// } else {
// holder.deckExpander.setVisibility(View.GONE);
// holder.fileBag.setVisibility(View.GONE);
// int normalPadding = (int) deckLayout.getResources().getDimension(R.dimen.deck_picker_left_padding);
// deckLayout.setPadding(normalPadding, 0, rightPadding, 0);
// }
// holder.fileBag.setOnClickListener(v -> holder.deckExpander.performClick());
// holder.filebagLayout.setOnClickListener(v -> holder.deckExpander.performClick());
// if (node.hasChildren()) {
// holder.deckExpander.setTag(node.getDid());
// holder.deckExpander.setOnClickListener(mDeckExpanderClickListener);
// } else {
// holder.deckExpander.setOnClickListener(null);
// }
// holder.deckLayout.setBackgroundResource(mRowCurrentDrawable);
// Set background colour. The current deck has its own color
// if (isCurrentlySelectedDeck(node)) {
// holder.deckLayout.setBackgroundResource(mRowCurrentDrawable);
// if (mPartiallyTransparentForBackground) {
// setBackgroundAlpha(holder.deckLayout, SELECTED_DECK_ALPHA_AGAINST_BACKGROUND);
// }
// } else {
// CompatHelper.getCompat().setSelectableBackground(holder.deckLayout);
// }
// Set deck name and colour. Filtered decks have their own colour
holder.deckName.setText(node.getLastDeckNameComponent());
if (mCol.getDecks().isDyn(node.getDid())) {
holder.deckName.setTextColor(mDeckNameDynColor);
} else {
holder.deckName.setTextColor(mDeckNameDefaultColor);
}
double[] data;
// Set the card counts and their colors
if (node.shouldDisplayCounts()) {
holder.deckNew.setText(String.valueOf(node.getNewCount()));
// holder.deckNew.setTextColor((node.getNewCount() == 0) ? mZeroCountColor : mNewCountColor);
holder.deckLearn.setText(String.valueOf(node.getLrnCount()));
// holder.deckLearn.setTextColor((node.getLrnCount() == 0) ? mZeroCountColor : mLearnCountColor);
holder.deckRev.setText(String.valueOf(node.getRevCount() + node.getLrnCount()));
// holder.deckRev.setTextColor((node.getRevCount() == 0) ? mZeroCountColor : mReviewCountColor);
data = node.getStudyData();
} else {
data = new double[] { 0.0, 0.0, 0.0 };
}
// Store deck ID in layout's tag for easy retrieval in our click listeners
holder.deckLayout.setTag(node.getDid());
holder.countsLayout.setTag(node.getDid());
// double[] data = calculateStat(mCol, node.getDid());
double percent = 0;
if (data[2] == 0) {
// 新卡已学完,显示已掌握
percent = (data[0] + data[1] + data[2] <= 0) ? 0 : (data[0] / (data[0] + data[1] + data[2]) * 100);
holder.handled_num.setText(String.format(Locale.CHINA, "%.0f/%.0f", data[0], (data[0] + data[1] + data[2])));
holder.handled_percent.setText((String.format(Locale.CHINA, "已掌握 %.1f", percent)) + "%");
} else {
percent = (data[0] + data[1] + data[2] <= 0) ? 0 : ((data[0] + data[1]) / (data[0] + data[1] + data[2]) * 100);
holder.handled_num.setText(String.format(Locale.CHINA, "%.0f/%.0f", data[0] + data[1], (data[0] + data[1] + data[2])));
holder.handled_percent.setText((String.format(Locale.CHINA, "已学 %.1f", percent)) + "%");
}
holder.studyProgress.setMax(100 * 100);
holder.studyProgress.setProgress((int) (percent * 100));
// Set click listeners
holder.deckLayout.setOnClickListener(mDeckClickListener);
holder.deckLayout.setOnLongClickListener(mDeckLongClickListener);
holder.countsLayout.setOnClickListener(mCountsClickListener);
}
}
use of com.ichi2.libanki.sched.AbstractDeckTreeNode in project AnkiChinaAndroid by ankichinateam.
the class DeckAdapter method processNodes.
private void processNodes(List<AbstractDeckTreeNode> nodes) {
for (AbstractDeckTreeNode node : nodes) {
// We don't hide it if it's the only deck or if it has sub-decks.
if (node.getFullDeckName().contains("::")) {
// 只添加一级节点
continue;
}
if (node.getDid() == 1 && nodes.size() > 1 && !node.hasChildren()) {
if (mCol.getDb().queryScalar("select 1 from cards where did = 1") == 0) {
continue;
}
}
// If any of this node's parents are collapsed, don't add it to the deck list
for (Deck parent : mCol.getDecks().parents(node.getDid())) {
// If a deck has a parent it means it's a subdeck so set a flag
mHasSubdecks = true;
if (parent.optBoolean("collapsed")) {
return;
}
}
mDeckList.add(node);
// Add this node's counts to the totals if it's a parent deck
if (node.getDepth() == 0) {
if (node.shouldDisplayCounts()) {
mNew += node.getNewCount();
mRev += node.getLrnCount();
mRev += node.getRevCount();
}
}
// Process sub-decks
if (node.getChildren() != null)
processNodes(node.getChildren());
}
}
use of com.ichi2.libanki.sched.AbstractDeckTreeNode in project AnkiChinaAndroid by ankichinateam.
the class DeckInfoListAdapter method processNodes.
private void processNodes(List<AbstractDeckTreeNode> nodes) {
for (AbstractDeckTreeNode node : nodes) {
Timber.i("节点审核:%s", node.getFullDeckName());
// We don't hide it if it's the only deck or if it has sub-decks.
if (node.getDid() == 1 && nodes.size() > 1 && !node.hasChildren()) {
if (mCol.getDb().queryScalar("select 1 from cards where did = 1") == 0) {
continue;
}
}
// If any of this node's parents are collapsed, don't add it to the deck list
for (Deck parent : mCol.getDecks().parents(node.getDid())) {
if (parent == null) {
continue;
}
Timber.i("我的父节点关闭啦:%s:%s", parent.optString("name"), parent.optBoolean("collapsed"));
// mHasSubdecks = true; // If a deck has a parent it means it's a subdeck so set a flag
if (parent.optBoolean("collapsed")) {
return;
}
}
if (/*node.getDid()!=mCurrentDeck.optLong("id")&&*/
node.getDepth() > Decks.path(mCurrentDeck.optString("name")).length - 1) {
Timber.i("添加节点到目录:%s", node.getFullDeckName());
mDeckList.add(node);
}
// Add this node's counts to the totals if it's a parent deck
if (node.getDepth() == 0) {
if (node.shouldDisplayCounts()) {
mNew += node.getNewCount();
mRev += node.getLrnCount();
mRev += node.getRevCount();
}
}
// Process sub-decks
processNodes(node.getChildren());
}
}
Aggregations