Add an alternative way to display the chapter title (#54)

This commit is contained in:
inorichi 2016-01-25 19:57:13 +01:00
parent 0a31c223e3
commit 6f409c0e3b
8 changed files with 115 additions and 16 deletions

View file

@ -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

View file

@ -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));

View file

@ -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,

View file

@ -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) {

View file

@ -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();
} }

View file

@ -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();

View 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>

View file

@ -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>