feat(scroll): add single section scroll option, closes #3663 (#3668)

This commit is contained in:
Huang Xin
2026-03-28 13:57:20 +08:00
committed by GitHub
parent bbfc82e50d
commit c4e3315642
35 changed files with 99 additions and 30 deletions
@@ -1190,5 +1190,6 @@
"Next Chapter": "الفصل التالي",
"Scroll Half Page Down": "تمرير نصف صفحة لأسفل",
"Scroll Half Page Up": "تمرير نصف صفحة لأعلى",
"Save Note": "حفظ الملاحظة"
"Save Note": "حفظ الملاحظة",
"Single Section Scroll": "التمرير بقسم واحد"
}
@@ -1138,5 +1138,6 @@
"Next Chapter": "পরের অধ্যায়",
"Scroll Half Page Down": "অর্ধেক পৃষ্ঠা নিচে স্ক্রল করুন",
"Scroll Half Page Up": "অর্ধেক পৃষ্ঠা উপরে স্ক্রল করুন",
"Save Note": "নোট সংরক্ষণ করুন"
"Save Note": "নোট সংরক্ষণ করুন",
"Single Section Scroll": "একক অধ্যায় স্ক্রল"
}
@@ -1125,5 +1125,6 @@
"Next Chapter": "རྗེས་མའི་ལེའུ།",
"Scroll Half Page Down": "ཤོག་ངོས་ཕྱེད་ཀ་འོག་ཏུ།",
"Scroll Half Page Up": "ཤོག་ངོས་ཕྱེད་ཀ་གོང་དུ།",
"Save Note": "ཟིན་བྲིས་ཉར་བ།"
"Save Note": "ཟིན་བྲིས་ཉར་བ།",
"Single Section Scroll": "དོན་ཚན་གཅིག་འགུལ་བ།"
}
@@ -1138,5 +1138,6 @@
"Next Chapter": "Nächstes Kapitel",
"Scroll Half Page Down": "Halbe Seite nach unten scrollen",
"Scroll Half Page Up": "Halbe Seite nach oben scrollen",
"Save Note": "Notiz speichern"
"Save Note": "Notiz speichern",
"Single Section Scroll": "Einzelabschnitt-Scrollen"
}
@@ -1138,5 +1138,6 @@
"Next Chapter": "Επόμενο κεφάλαιο",
"Scroll Half Page Down": "Κύλιση μισής σελίδας κάτω",
"Scroll Half Page Up": "Κύλιση μισής σελίδας πάνω",
"Save Note": "Αποθήκευση σημείωσης"
"Save Note": "Αποθήκευση σημείωσης",
"Single Section Scroll": "Κύλιση μεμονωμένης ενότητας"
}
@@ -1151,5 +1151,6 @@
"Next Chapter": "Capítulo siguiente",
"Scroll Half Page Down": "Desplazar media página abajo",
"Scroll Half Page Up": "Desplazar media página arriba",
"Save Note": "Guardar nota"
"Save Note": "Guardar nota",
"Single Section Scroll": "Desplazamiento por sección"
}
@@ -1138,5 +1138,6 @@
"Next Chapter": "فصل بعدی",
"Scroll Half Page Down": "پیمایش نیم صفحه پایین",
"Scroll Half Page Up": "پیمایش نیم صفحه بالا",
"Save Note": "ذخیره یادداشت"
"Save Note": "ذخیره یادداشت",
"Single Section Scroll": "پیمایش تک‌بخشی"
}
@@ -1151,5 +1151,6 @@
"Next Chapter": "Chapitre suivant",
"Scroll Half Page Down": "Défiler d'une demi-page vers le bas",
"Scroll Half Page Up": "Défiler d'une demi-page vers le haut",
"Save Note": "Enregistrer la note"
"Save Note": "Enregistrer la note",
"Single Section Scroll": "Défilement par section"
}
@@ -1151,5 +1151,6 @@
"Next Chapter": "פרק הבא",
"Scroll Half Page Down": "גלול חצי עמוד למטה",
"Scroll Half Page Up": "גלול חצי עמוד למעלה",
"Save Note": "שמור הערה"
"Save Note": "שמור הערה",
"Single Section Scroll": "גלילת קטע בודד"
}
@@ -1138,5 +1138,6 @@
"Next Chapter": "अगला अध्याय",
"Scroll Half Page Down": "आधा पृष्ठ नीचे स्क्रॉल करें",
"Scroll Half Page Up": "आधा पृष्ठ ऊपर स्क्रॉल करें",
"Save Note": "नोट सहेजें"
"Save Note": "नोट सहेजें",
"Single Section Scroll": "एकल अनुभाग स्क्रॉल"
}
@@ -1125,5 +1125,6 @@
"Next Chapter": "Bab berikutnya",
"Scroll Half Page Down": "Gulir setengah halaman ke bawah",
"Scroll Half Page Up": "Gulir setengah halaman ke atas",
"Save Note": "Simpan catatan"
"Save Note": "Simpan catatan",
"Single Section Scroll": "Gulir Satu Bagian"
}
@@ -1151,5 +1151,6 @@
"Next Chapter": "Capitolo successivo",
"Scroll Half Page Down": "Scorri mezza pagina in basso",
"Scroll Half Page Up": "Scorri mezza pagina in alto",
"Save Note": "Salva nota"
"Save Note": "Salva nota",
"Single Section Scroll": "Scorrimento a sezione singola"
}
@@ -1125,5 +1125,6 @@
"Next Chapter": "次の章",
"Scroll Half Page Down": "半ページ下にスクロール",
"Scroll Half Page Up": "半ページ上にスクロール",
"Save Note": "メモを保存"
"Save Note": "メモを保存",
"Single Section Scroll": "単一セクションスクロール"
}
@@ -1125,5 +1125,6 @@
"Next Chapter": "다음 장",
"Scroll Half Page Down": "반 페이지 아래로 스크롤",
"Scroll Half Page Up": "반 페이지 위로 스크롤",
"Save Note": "메모 저장"
"Save Note": "메모 저장",
"Single Section Scroll": "단일 섹션 스크롤"
}
@@ -1125,5 +1125,6 @@
"Next Chapter": "Bab seterusnya",
"Scroll Half Page Down": "Tatal separuh halaman ke bawah",
"Scroll Half Page Up": "Tatal separuh halaman ke atas",
"Save Note": "Simpan nota"
"Save Note": "Simpan nota",
"Single Section Scroll": "Tatal Satu Bahagian"
}
@@ -1138,5 +1138,6 @@
"Next Chapter": "Volgend hoofdstuk",
"Scroll Half Page Down": "Halve pagina naar beneden scrollen",
"Scroll Half Page Up": "Halve pagina naar boven scrollen",
"Save Note": "Notitie opslaan"
"Save Note": "Notitie opslaan",
"Single Section Scroll": "Scrollen per sectie"
}
@@ -1164,5 +1164,6 @@
"Next Chapter": "Następny rozdział",
"Scroll Half Page Down": "Przewiń o pół strony w dół",
"Scroll Half Page Up": "Przewiń o pół strony w górę",
"Save Note": "Zapisz notatkę"
"Save Note": "Zapisz notatkę",
"Single Section Scroll": "Przewijanie pojedynczej sekcji"
}
@@ -1151,5 +1151,6 @@
"Next Chapter": "Próximo capítulo",
"Scroll Half Page Down": "Rolar meia página para baixo",
"Scroll Half Page Up": "Rolar meia página para cima",
"Save Note": "Salvar nota"
"Save Note": "Salvar nota",
"Single Section Scroll": "Rolagem por seção"
}
@@ -1164,5 +1164,6 @@
"Next Chapter": "Следующая глава",
"Scroll Half Page Down": "Прокрутить на полстраницы вниз",
"Scroll Half Page Up": "Прокрутить на полстраницы вверх",
"Save Note": "Сохранить заметку"
"Save Note": "Сохранить заметку",
"Single Section Scroll": "Прокрутка одного раздела"
}
@@ -1138,5 +1138,6 @@
"Next Chapter": "ඊළඟ පරිච්ඡේදය",
"Scroll Half Page Down": "අඩ පිටුවක් පහළට අනුචලනය",
"Scroll Half Page Up": "අඩ පිටුවක් ඉහළට අනුචලනය",
"Save Note": "සටහන සුරකින්න"
"Save Note": "සටහන සුරකින්න",
"Single Section Scroll": "තනි කොටස අනුචලනය"
}
@@ -1164,5 +1164,6 @@
"Next Chapter": "Naslednje poglavje",
"Scroll Half Page Down": "Drsi pol strani navzdol",
"Scroll Half Page Up": "Drsi pol strani navzgor",
"Save Note": "Shrani opombo"
"Save Note": "Shrani opombo",
"Single Section Scroll": "Drsenje posameznega razdelka"
}
@@ -1138,5 +1138,6 @@
"Next Chapter": "Nästa kapitel",
"Scroll Half Page Down": "Rulla en halv sida nedåt",
"Scroll Half Page Up": "Rulla en halv sida uppåt",
"Save Note": "Spara anteckning"
"Save Note": "Spara anteckning",
"Single Section Scroll": "Rullning per avsnitt"
}
@@ -1138,5 +1138,6 @@
"Next Chapter": "அடுத்த அத்தியாயம்",
"Scroll Half Page Down": "அரை பக்கம் கீழே உருட்டுக",
"Scroll Half Page Up": "அரை பக்கம் மேலே உருட்டுக",
"Save Note": "குறிப்பைச் சேமிக்கவும்"
"Save Note": "குறிப்பைச் சேமிக்கவும்",
"Single Section Scroll": "ஒற்றைப் பகுதி உருட்டல்"
}
@@ -1125,5 +1125,6 @@
"Next Chapter": "บทถัดไป",
"Scroll Half Page Down": "เลื่อนลงครึ่งหน้า",
"Scroll Half Page Up": "เลื่อนขึ้นครึ่งหน้า",
"Save Note": "บันทึกโน้ต"
"Save Note": "บันทึกโน้ต",
"Single Section Scroll": "เลื่อนทีละส่วน"
}
@@ -1138,5 +1138,6 @@
"Next Chapter": "Sonraki bölüm",
"Scroll Half Page Down": "Yarım sayfa aşağı kaydır",
"Scroll Half Page Up": "Yarım sayfa yukarı kaydır",
"Save Note": "Notu kaydet"
"Save Note": "Notu kaydet",
"Single Section Scroll": "Tek Bölüm Kaydırma"
}
@@ -1164,5 +1164,6 @@
"Next Chapter": "Наступний розділ",
"Scroll Half Page Down": "Прокрутити на півсторінки вниз",
"Scroll Half Page Up": "Прокрутити на півсторінки вгору",
"Save Note": "Зберегти нотатку"
"Save Note": "Зберегти нотатку",
"Single Section Scroll": "Прокрутка одного розділу"
}
@@ -1125,5 +1125,6 @@
"Next Chapter": "Chương tiếp",
"Scroll Half Page Down": "Cuộn xuống nửa trang",
"Scroll Half Page Up": "Cuộn lên nửa trang",
"Save Note": "Lưu ghi chú"
"Save Note": "Lưu ghi chú",
"Single Section Scroll": "Cuộn từng phần"
}
@@ -1125,5 +1125,6 @@
"Next Chapter": "下一章",
"Scroll Half Page Down": "向下滚动半页",
"Scroll Half Page Up": "向上滚动半页",
"Save Note": "保存笔记"
"Save Note": "保存笔记",
"Single Section Scroll": "单章节滚动"
}
@@ -1125,5 +1125,6 @@
"Next Chapter": "下一章",
"Scroll Half Page Down": "向下捲動半頁",
"Scroll Half Page Up": "向上捲動半頁",
"Save Note": "儲存筆記"
"Save Note": "儲存筆記",
"Single Section Scroll": "單章節捲動"
}
@@ -609,6 +609,11 @@ const FoliateViewer: React.FC<{
viewRef.current?.renderer.setAttribute('gap', `${viewSettings.gapPercent}%`);
if (viewSettings.scrolled) {
viewRef.current?.renderer.setAttribute('flow', 'scrolled');
if (viewSettings.noContinuousScroll) {
viewRef.current?.renderer.setAttribute('no-continuous-scroll', '');
} else {
viewRef.current?.renderer.removeAttribute('no-continuous-scroll');
}
}
};
@@ -694,6 +699,7 @@ const FoliateViewer: React.FC<{
viewSettings?.showBarsOnScroll,
viewSettings?.showMarginsOnScroll,
viewSettings?.scrolled,
viewSettings?.noContinuousScroll,
viewState?.ttsEnabled,
]);
@@ -27,6 +27,7 @@ const ControlPanel: React.FC<SettingsPanelPanelProp> = ({ bookKey, onRegisterRes
const viewSettings = getViewSettings(bookKey) || settings.globalViewSettings;
const [isScrolledMode, setScrolledMode] = useState(viewSettings.scrolled);
const [noContinuousScroll, setNoContinuousScroll] = useState(viewSettings.noContinuousScroll);
const [scrollingOverlap, setScrollingOverlap] = useState(viewSettings.scrollingOverlap);
const [hideScrollbar, setHideScrollbar] = useState(viewSettings.hideScrollbar || false);
const [volumeKeysToFlip, setVolumeKeysToFlip] = useState(viewSettings.volumeKeysToFlip);
@@ -55,6 +56,7 @@ const ControlPanel: React.FC<SettingsPanelPanelProp> = ({ bookKey, onRegisterRes
const handleReset = () => {
resetToDefaults({
scrolled: setScrolledMode,
noContinuousScroll: setNoContinuousScroll,
scrollingOverlap: setScrollingOverlap,
hideScrollbar: setHideScrollbar,
volumeKeysToFlip: setVolumeKeysToFlip,
@@ -88,6 +90,17 @@ const ControlPanel: React.FC<SettingsPanelPanelProp> = ({ bookKey, onRegisterRes
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [isScrolledMode]);
useEffect(() => {
if (noContinuousScroll === viewSettings.noContinuousScroll) return;
saveViewSettings(envConfig, bookKey, 'noContinuousScroll', noContinuousScroll);
if (noContinuousScroll) {
getView(bookKey)?.renderer.setAttribute('no-continuous-scroll', '');
} else {
getView(bookKey)?.renderer.removeAttribute('no-continuous-scroll');
}
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [noContinuousScroll]);
useEffect(() => {
saveViewSettings(envConfig, bookKey, 'hideScrollbar', hideScrollbar, false, false);
// eslint-disable-next-line react-hooks/exhaustive-deps
@@ -235,6 +248,19 @@ const ControlPanel: React.FC<SettingsPanelPanelProp> = ({ bookKey, onRegisterRes
onChange={() => setScrolledMode(!isScrolledMode)}
/>
</div>
<div
className='config-item'
data-setting-id='settings.control.scroll.noContinuousScroll'
>
<span className=''>{_('Single Section Scroll')}</span>
<input
type='checkbox'
className='toggle'
checked={noContinuousScroll}
disabled={!viewSettings.scrolled}
onChange={() => setNoContinuousScroll(!noContinuousScroll)}
/>
</div>
<NumberInput
label={_('Overlap Pixels')}
value={scrollingOverlap}
@@ -392,6 +392,12 @@ const controlPanelItems = [
keywords: ['scroll', 'scrolled', 'mode', 'paginate', 'continuous'],
section: 'Scroll',
},
{
id: 'settings.control.scroll.noContinuousScroll',
labelKey: _('Single Section Scroll'),
keywords: ['single', 'section', 'scroll', 'continuous', 'one', 'chapter'],
section: 'Scroll',
},
{
id: 'settings.control.overlapPixels',
labelKey: _('Overlap Pixels'),
@@ -179,6 +179,7 @@ export const DEFAULT_BOOK_LAYOUT: BookLayout = {
compactMarginRightPx: 16,
gapPercent: 5,
scrolled: false,
noContinuousScroll: false,
disableClick: false,
fullscreenClickArea: false,
swapClickArea: false,
+1
View File
@@ -120,6 +120,7 @@ export interface BookLayout {
compactMarginPx?: number; // deprecated
gapPercent: number;
scrolled: boolean;
noContinuousScroll: boolean;
disableClick: boolean;
fullscreenClickArea: boolean;
swapClickArea: boolean;