Add an alternative way to display the chapter title (#54)
This commit is contained in:
parent
0a31c223e3
commit
6f409c0e3b
8 changed files with 115 additions and 16 deletions
|
@ -68,9 +68,13 @@ public class Manga implements Serializable {
|
||||||
public static final int COMPLETED = 2;
|
public static final int COMPLETED = 2;
|
||||||
public static final int LICENSED = 3;
|
public static final int LICENSED = 3;
|
||||||
|
|
||||||
public static final int SORT_AZ = 0;
|
public static final int SORT_AZ = 0x00000000;
|
||||||
public static final int SORT_ZA = 1;
|
public static final int SORT_ZA = 0x00000001;
|
||||||
public static final int SORT_MASK = 1;
|
public static final int SORT_MASK = 0x00000001;
|
||||||
|
|
||||||
|
public static final int DISPLAY_NAME = 0x00000000;
|
||||||
|
public static final int DISPLAY_NUMBER = 0x00100000;
|
||||||
|
public static final int DISPLAY_MASK = 0x00100000;
|
||||||
|
|
||||||
public Manga() {}
|
public Manga() {}
|
||||||
|
|
||||||
|
@ -124,16 +128,25 @@ public class Manga implements Serializable {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setFlags(int flag, int mask) {
|
public void setChapterOrder(int order) {
|
||||||
|
setFlags(order, SORT_MASK);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setDisplayMode(int mode) {
|
||||||
|
setFlags(mode, DISPLAY_MASK);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setFlags(int flag, int mask) {
|
||||||
chapter_flags = (chapter_flags & ~mask) | (flag & mask);
|
chapter_flags = (chapter_flags & ~mask) | (flag & mask);
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean sortChaptersAZ() {
|
public boolean sortChaptersAZ() {
|
||||||
return (this.chapter_flags & SORT_MASK) == SORT_AZ;
|
return (chapter_flags & SORT_MASK) == SORT_AZ;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setChapterOrder(int order) {
|
// Used to display the chapter's title one way or another
|
||||||
setFlags(order, SORT_MASK);
|
public int getDisplayMode() {
|
||||||
|
return chapter_flags & DISPLAY_MASK;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -10,6 +10,7 @@ import java.util.List;
|
||||||
import eu.davidea.flexibleadapter.FlexibleAdapter;
|
import eu.davidea.flexibleadapter.FlexibleAdapter;
|
||||||
import eu.kanade.tachiyomi.R;
|
import eu.kanade.tachiyomi.R;
|
||||||
import eu.kanade.tachiyomi.data.database.models.Chapter;
|
import eu.kanade.tachiyomi.data.database.models.Chapter;
|
||||||
|
import eu.kanade.tachiyomi.data.database.models.Manga;
|
||||||
|
|
||||||
public class ChaptersAdapter extends FlexibleAdapter<ChaptersHolder, Chapter> {
|
public class ChaptersAdapter extends FlexibleAdapter<ChaptersHolder, Chapter> {
|
||||||
|
|
||||||
|
@ -33,7 +34,8 @@ public class ChaptersAdapter extends FlexibleAdapter<ChaptersHolder, Chapter> {
|
||||||
@Override
|
@Override
|
||||||
public void onBindViewHolder(ChaptersHolder holder, int position) {
|
public void onBindViewHolder(ChaptersHolder holder, int position) {
|
||||||
final Chapter chapter = getItem(position);
|
final Chapter chapter = getItem(position);
|
||||||
holder.onSetValues(fragment.getActivity(), chapter);
|
final Manga manga = fragment.getPresenter().getManga();
|
||||||
|
holder.onSetValues(chapter, manga);
|
||||||
|
|
||||||
//When user scrolls this bind the correct selection status
|
//When user scrolls this bind the correct selection status
|
||||||
holder.itemView.setActivated(isSelected(position));
|
holder.itemView.setActivated(isSelected(position));
|
||||||
|
|
|
@ -10,6 +10,7 @@ import android.support.v7.widget.LinearLayoutManager;
|
||||||
import android.support.v7.widget.RecyclerView;
|
import android.support.v7.widget.RecyclerView;
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.Menu;
|
import android.view.Menu;
|
||||||
|
import android.view.MenuInflater;
|
||||||
import android.view.MenuItem;
|
import android.view.MenuItem;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
|
@ -62,6 +63,12 @@ public class ChaptersFragment extends BaseRxFragment<ChaptersPresenter> implemen
|
||||||
return new ChaptersFragment();
|
return new ChaptersFragment();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onCreate(Bundle bundle) {
|
||||||
|
super.onCreate(bundle);
|
||||||
|
setHasOptionsMenu(true);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public View onCreateView(LayoutInflater inflater, ViewGroup container,
|
public View onCreateView(LayoutInflater inflater, ViewGroup container,
|
||||||
Bundle savedInstanceState) {
|
Bundle savedInstanceState) {
|
||||||
|
@ -92,6 +99,21 @@ public class ChaptersFragment extends BaseRxFragment<ChaptersPresenter> implemen
|
||||||
return view;
|
return view;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
|
||||||
|
inflater.inflate(R.menu.chapters, menu);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onOptionsItemSelected(MenuItem item) {
|
||||||
|
switch (item.getItemId()) {
|
||||||
|
case R.id.action_display_mode:
|
||||||
|
showDisplayModeDialog();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
public void onNextManga(Manga manga) {
|
public void onNextManga(Manga manga) {
|
||||||
// Remove listeners before setting the values
|
// Remove listeners before setting the values
|
||||||
readCb.setOnCheckedChangeListener(null);
|
readCb.setOnCheckedChangeListener(null);
|
||||||
|
@ -157,6 +179,29 @@ public class ChaptersFragment extends BaseRxFragment<ChaptersPresenter> implemen
|
||||||
startActivity(intent);
|
startActivity(intent);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void showDisplayModeDialog() {
|
||||||
|
final Manga manga = getPresenter().getManga();
|
||||||
|
if (manga == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
// Get available modes, ids and the selected mode
|
||||||
|
String[] modes = {getString(R.string.show_title), getString(R.string.show_chapter_number)};
|
||||||
|
int[] ids = {Manga.DISPLAY_NAME, Manga.DISPLAY_NUMBER};
|
||||||
|
int selectedIndex = manga.getDisplayMode() == Manga.DISPLAY_NAME ? 0 : 1;
|
||||||
|
|
||||||
|
new MaterialDialog.Builder(getActivity())
|
||||||
|
.items(modes)
|
||||||
|
.itemsIds(ids)
|
||||||
|
.itemsCallbackSingleChoice(selectedIndex, (dialog, itemView, which, text) -> {
|
||||||
|
// Save the new display mode
|
||||||
|
getPresenter().setDisplayMode(itemView.getId());
|
||||||
|
// Refresh ui
|
||||||
|
adapter.notifyDataSetChanged();
|
||||||
|
return true;
|
||||||
|
})
|
||||||
|
.show();
|
||||||
|
}
|
||||||
|
|
||||||
private void observeChapterDownloadProgress() {
|
private void observeChapterDownloadProgress() {
|
||||||
downloadProgressSubscription = getPresenter().getDownloadProgressObs()
|
downloadProgressSubscription = getPresenter().getDownloadProgressObs()
|
||||||
.subscribe(this::onDownloadProgressChange,
|
.subscribe(this::onDownloadProgressChange,
|
||||||
|
|
|
@ -7,6 +7,8 @@ import android.widget.PopupMenu;
|
||||||
import android.widget.RelativeLayout;
|
import android.widget.RelativeLayout;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
|
|
||||||
|
import java.text.DecimalFormat;
|
||||||
|
import java.text.DecimalFormatSymbols;
|
||||||
import java.text.SimpleDateFormat;
|
import java.text.SimpleDateFormat;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
|
|
||||||
|
@ -14,40 +16,60 @@ import butterknife.Bind;
|
||||||
import butterknife.ButterKnife;
|
import butterknife.ButterKnife;
|
||||||
import eu.kanade.tachiyomi.R;
|
import eu.kanade.tachiyomi.R;
|
||||||
import eu.kanade.tachiyomi.data.database.models.Chapter;
|
import eu.kanade.tachiyomi.data.database.models.Chapter;
|
||||||
|
import eu.kanade.tachiyomi.data.database.models.Manga;
|
||||||
import eu.kanade.tachiyomi.data.download.model.Download;
|
import eu.kanade.tachiyomi.data.download.model.Download;
|
||||||
import eu.kanade.tachiyomi.ui.base.adapter.FlexibleViewHolder;
|
import eu.kanade.tachiyomi.ui.base.adapter.FlexibleViewHolder;
|
||||||
import rx.Observable;
|
import rx.Observable;
|
||||||
|
|
||||||
public class ChaptersHolder extends FlexibleViewHolder {
|
public class ChaptersHolder extends FlexibleViewHolder {
|
||||||
|
|
||||||
private final ChaptersAdapter adapter;
|
|
||||||
private Chapter item;
|
|
||||||
|
|
||||||
@Bind(R.id.chapter_title) TextView title;
|
@Bind(R.id.chapter_title) TextView title;
|
||||||
@Bind(R.id.download_text) TextView downloadText;
|
@Bind(R.id.download_text) TextView downloadText;
|
||||||
@Bind(R.id.chapter_menu) RelativeLayout chapterMenu;
|
@Bind(R.id.chapter_menu) RelativeLayout chapterMenu;
|
||||||
@Bind(R.id.chapter_pages) TextView pages;
|
@Bind(R.id.chapter_pages) TextView pages;
|
||||||
@Bind(R.id.chapter_date) TextView date;
|
@Bind(R.id.chapter_date) TextView date;
|
||||||
|
|
||||||
SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
|
private Context context;
|
||||||
|
|
||||||
|
private final ChaptersAdapter adapter;
|
||||||
|
private Chapter item;
|
||||||
|
|
||||||
private final int readColor;
|
private final int readColor;
|
||||||
private final int unreadColor;
|
private final int unreadColor;
|
||||||
|
|
||||||
|
private final DecimalFormat decimalFormat;
|
||||||
|
private SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
|
||||||
|
|
||||||
public ChaptersHolder(View view, ChaptersAdapter adapter, OnListItemClickListener listener) {
|
public ChaptersHolder(View view, ChaptersAdapter adapter, OnListItemClickListener listener) {
|
||||||
super(view, adapter, listener);
|
super(view, adapter, listener);
|
||||||
this.adapter = adapter;
|
this.adapter = adapter;
|
||||||
|
context = view.getContext();
|
||||||
ButterKnife.bind(this, view);
|
ButterKnife.bind(this, view);
|
||||||
|
|
||||||
readColor = ContextCompat.getColor(view.getContext(), R.color.hint_text);
|
readColor = ContextCompat.getColor(view.getContext(), R.color.hint_text);
|
||||||
unreadColor = ContextCompat.getColor(view.getContext(), R.color.primary_text);
|
unreadColor = ContextCompat.getColor(view.getContext(), R.color.primary_text);
|
||||||
|
|
||||||
|
DecimalFormatSymbols symbols = new DecimalFormatSymbols();
|
||||||
|
symbols.setDecimalSeparator('.');
|
||||||
|
decimalFormat = new DecimalFormat("#.###", symbols);
|
||||||
|
|
||||||
chapterMenu.setOnClickListener(v -> v.post(() -> showPopupMenu(v)));
|
chapterMenu.setOnClickListener(v -> v.post(() -> showPopupMenu(v)));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void onSetValues(Context context, Chapter chapter) {
|
public void onSetValues(Chapter chapter, Manga manga) {
|
||||||
this.item = chapter;
|
this.item = chapter;
|
||||||
title.setText(chapter.name);
|
String name;
|
||||||
|
switch (manga.getDisplayMode()) {
|
||||||
|
case Manga.DISPLAY_NAME:
|
||||||
|
default:
|
||||||
|
name = chapter.name;
|
||||||
|
break;
|
||||||
|
case Manga.DISPLAY_NUMBER:
|
||||||
|
String formattedNumber = decimalFormat.format(chapter.chapter_number);
|
||||||
|
name = context.getString(R.string.display_mode_chapter, formattedNumber);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
title.setText(name);
|
||||||
title.setTextColor(chapter.read ? readColor : unreadColor);
|
title.setTextColor(chapter.read ? readColor : unreadColor);
|
||||||
|
|
||||||
if (!chapter.read && chapter.last_page_read > 0) {
|
if (!chapter.read && chapter.last_page_read > 0) {
|
||||||
|
|
|
@ -264,6 +264,11 @@ public class ChaptersPresenter extends BasePresenter<ChaptersFragment> {
|
||||||
refreshChapters();
|
refreshChapters();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setDisplayMode(int mode) {
|
||||||
|
manga.setDisplayMode(mode);
|
||||||
|
db.insertManga(manga).executeAsBlocking();
|
||||||
|
}
|
||||||
|
|
||||||
public boolean getSortOrder() {
|
public boolean getSortOrder() {
|
||||||
return manga.sortChaptersAZ();
|
return manga.sortChaptersAZ();
|
||||||
}
|
}
|
||||||
|
|
|
@ -70,7 +70,7 @@ public class ReaderMenu {
|
||||||
bottomMenu.setOnTouchListener((v, event) -> true);
|
bottomMenu.setOnTouchListener((v, event) -> true);
|
||||||
|
|
||||||
seekBar.setOnSeekBarChangeListener(new PageSeekBarChangeListener());
|
seekBar.setOnSeekBarChangeListener(new PageSeekBarChangeListener());
|
||||||
decimalFormat = new DecimalFormat("#.##");
|
decimalFormat = new DecimalFormat("#.###");
|
||||||
inverted = false;
|
inverted = false;
|
||||||
|
|
||||||
initializeOptions();
|
initializeOptions();
|
||||||
|
|
9
app/src/main/res/menu/chapters.xml
Normal file
9
app/src/main/res/menu/chapters.xml
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<menu xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto">
|
||||||
|
|
||||||
|
<item
|
||||||
|
android:title="@string/action_display_mode"
|
||||||
|
android:id="@+id/action_display_mode"
|
||||||
|
app:showAsAction="never" />
|
||||||
|
</menu>
|
|
@ -157,12 +157,15 @@
|
||||||
<!-- Manga chapters fragment -->
|
<!-- Manga chapters fragment -->
|
||||||
<string name="manga_chapters_tab">Chapters</string>
|
<string name="manga_chapters_tab">Chapters</string>
|
||||||
<string name="manga_chapter_no_title">No title</string>
|
<string name="manga_chapter_no_title">No title</string>
|
||||||
|
<string name="display_mode_chapter">Chapter %1$s</string>
|
||||||
<string name="chapter_downloaded">Downloaded</string>
|
<string name="chapter_downloaded">Downloaded</string>
|
||||||
<string name="chapter_queued">Queued</string>
|
<string name="chapter_queued">Queued</string>
|
||||||
<string name="chapter_downloading">Downloading</string>
|
<string name="chapter_downloading">Downloading</string>
|
||||||
<string name="chapter_downloading_progress">Downloading (%1$d/%2$d)</string>
|
<string name="chapter_downloading_progress">Downloading (%1$d/%2$d)</string>
|
||||||
<string name="chapter_error">Error</string>
|
<string name="chapter_error">Error</string>
|
||||||
<string name="fetch_chapters_error">Error while fetching chapters</string>
|
<string name="fetch_chapters_error">Error while fetching chapters</string>
|
||||||
|
<string name="show_title">Show title</string>
|
||||||
|
<string name="show_chapter_number">Show chapter number</string>
|
||||||
|
|
||||||
<!-- MyAnimeList fragment -->
|
<!-- MyAnimeList fragment -->
|
||||||
<string name="reading">Reading</string>
|
<string name="reading">Reading</string>
|
||||||
|
|
Reference in a new issue