Make scroller as a presenter

jh-changes
Shin'ya Ueoka 5 years ago
parent 1ba1660269
commit ad1f3c07fb
  1. 17
      src/content/actions/operation.ts
  2. 9
      src/content/components/common/mark.ts
  3. 5
      src/content/components/top-content/index.ts
  4. 7
      src/content/presenters/FindPresenter.ts
  5. 63
      src/content/presenters/ScrollPresenter.ts

@ -1,7 +1,6 @@
import * as operations from '../../shared/operations'; import * as operations from '../../shared/operations';
import * as actions from './index'; import * as actions from './index';
import * as messages from '../../shared/messages'; import * as messages from '../../shared/messages';
import * as scrolls from '../scrolls';
import * as navigates from '../navigates'; import * as navigates from '../navigates';
import * as focuses from '../focuses'; import * as focuses from '../focuses';
import * as urls from '../urls'; import * as urls from '../urls';
@ -10,9 +9,11 @@ import * as markActions from './mark';
import AddonEnabledUseCase from '../usecases/AddonEnabledUseCase'; import AddonEnabledUseCase from '../usecases/AddonEnabledUseCase';
import { SettingRepositoryImpl } from '../repositories/SettingRepository'; import { SettingRepositoryImpl } from '../repositories/SettingRepository';
import { ScrollPresenterImpl } from '../presenters/ScrollPresenter';
let addonEnabledUseCase = new AddonEnabledUseCase(); let addonEnabledUseCase = new AddonEnabledUseCase();
let settingRepository = new SettingRepositoryImpl(); let settingRepository = new SettingRepositoryImpl();
let scrollPresenter = new ScrollPresenterImpl();
// eslint-disable-next-line complexity, max-lines-per-function // eslint-disable-next-line complexity, max-lines-per-function
const exec = async( const exec = async(
@ -41,25 +42,25 @@ const exec = async(
}), '*'); }), '*');
break; break;
case operations.SCROLL_VERTICALLY: case operations.SCROLL_VERTICALLY:
scrolls.scrollVertically(operation.count, smoothscroll); scrollPresenter.scrollVertically(operation.count, smoothscroll);
break; break;
case operations.SCROLL_HORIZONALLY: case operations.SCROLL_HORIZONALLY:
scrolls.scrollHorizonally(operation.count, smoothscroll); scrollPresenter.scrollHorizonally(operation.count, smoothscroll);
break; break;
case operations.SCROLL_PAGES: case operations.SCROLL_PAGES:
scrolls.scrollPages(operation.count, smoothscroll); scrollPresenter.scrollPages(operation.count, smoothscroll);
break; break;
case operations.SCROLL_TOP: case operations.SCROLL_TOP:
scrolls.scrollToTop(smoothscroll); scrollPresenter.scrollToTop(smoothscroll);
break; break;
case operations.SCROLL_BOTTOM: case operations.SCROLL_BOTTOM:
scrolls.scrollToBottom(smoothscroll); scrollPresenter.scrollToBottom(smoothscroll);
break; break;
case operations.SCROLL_HOME: case operations.SCROLL_HOME:
scrolls.scrollToHome(smoothscroll); scrollPresenter.scrollToHome(smoothscroll);
break; break;
case operations.SCROLL_END: case operations.SCROLL_END:
scrolls.scrollToEnd(smoothscroll); scrollPresenter.scrollToEnd(smoothscroll);
break; break;
case operations.FOLLOW_START: case operations.FOLLOW_START:
window.top.postMessage(JSON.stringify({ window.top.postMessage(JSON.stringify({

@ -1,12 +1,13 @@
import * as markActions from '../../actions/mark'; import * as markActions from '../../actions/mark';
import * as scrolls from '../..//scrolls';
import * as consoleFrames from '../..//console-frames'; import * as consoleFrames from '../..//console-frames';
import * as keyUtils from '../../../shared/utils/keys'; import * as keyUtils from '../../../shared/utils/keys';
import Mark from '../../Mark'; import Mark from '../../Mark';
import { SettingRepositoryImpl } from '../../repositories/SettingRepository'; import { SettingRepositoryImpl } from '../../repositories/SettingRepository';
import { ScrollPresenterImpl } from '../../presenters/ScrollPresenter';
let settingRepository = new SettingRepositoryImpl(); let settingRepository = new SettingRepositoryImpl();
let scrollPresenter = new ScrollPresenterImpl();
const cancelKey = (key: keyUtils.Key): boolean => { const cancelKey = (key: keyUtils.Key): boolean => {
return key.key === 'Esc' || key.key === '[' && Boolean(key.ctrlKey); return key.key === 'Esc' || key.key === '[' && Boolean(key.ctrlKey);
@ -54,7 +55,7 @@ export default class MarkComponent {
} }
doSet(key: keyUtils.Key) { doSet(key: keyUtils.Key) {
let { x, y } = scrolls.getScroll(); let { x, y } = scrollPresenter.getScroll();
this.store.dispatch(markActions.setLocal(key.key, x, y)); this.store.dispatch(markActions.setLocal(key.key, x, y));
} }
@ -69,11 +70,11 @@ export default class MarkComponent {
} }
let { x, y } = marks[key.key]; let { x, y } = marks[key.key];
scrolls.scrollTo(x, y, smoothscroll); scrollPresenter.scrollTo(x, y, smoothscroll);
} }
doSetGlobal(key: keyUtils.Key) { doSetGlobal(key: keyUtils.Key) {
let { x, y } = scrolls.getScroll(); let { x, y } = scrollPresenter.getScroll();
this.store.dispatch(markActions.setGlobal(key.key, x, y)); this.store.dispatch(markActions.setGlobal(key.key, x, y));
} }

@ -4,10 +4,11 @@ import FindComponent from './find';
import * as consoleFrames from '../../console-frames'; import * as consoleFrames from '../../console-frames';
import * as messages from '../../../shared/messages'; import * as messages from '../../../shared/messages';
import MessageListener from '../../MessageListener'; import MessageListener from '../../MessageListener';
import * as scrolls from '../../scrolls';
import AddonEnabledUseCase from '../../usecases/AddonEnabledUseCase'; import AddonEnabledUseCase from '../../usecases/AddonEnabledUseCase';
import { ScrollPresenterImpl } from '../../presenters/ScrollPresenter';
let addonEnabledUseCase = new AddonEnabledUseCase(); let addonEnabledUseCase = new AddonEnabledUseCase();
let scrollPresenter = new ScrollPresenterImpl();
export default class TopContent { export default class TopContent {
private win: Window; private win: Window;
@ -42,7 +43,7 @@ export default class TopContent {
case messages.ADDON_ENABLED_QUERY: case messages.ADDON_ENABLED_QUERY:
return Promise.resolve(addonEnabled); return Promise.resolve(addonEnabled);
case messages.TAB_SCROLL_TO: case messages.TAB_SCROLL_TO:
return scrolls.scrollTo(message.x, message.y, false); return scrollPresenter.scrollTo(message.x, message.y, false);
} }
} }
} }

@ -1,4 +1,3 @@
import ConsoleClient, { ConsoleClientImpl } from '../client/ConsoleClient';
export default interface FindPresenter { export default interface FindPresenter {
find(keyword: string, backwards: boolean): boolean; find(keyword: string, backwards: boolean): boolean;
@ -28,12 +27,6 @@ interface MyWindow extends Window {
declare var window: MyWindow; declare var window: MyWindow;
export class FindPresenterImpl implements FindPresenter { export class FindPresenterImpl implements FindPresenter {
private consoleClient: ConsoleClient;
constructor({ consoleClient = new ConsoleClientImpl() } = {}) {
this.consoleClient = consoleClient;
}
find(keyword: string, backwards: boolean): boolean { find(keyword: string, backwards: boolean): boolean {
let caseSensitive = false; let caseSensitive = false;
let wrapScan = true; let wrapScan = true;

@ -1,4 +1,4 @@
import * as doms from '../shared/utils/dom'; import * as doms from '../../shared/utils/dom';
const SCROLL_DELTA_X = 64; const SCROLL_DELTA_X = 64;
const SCROLL_DELTA_Y = 64; const SCROLL_DELTA_Y = 64;
@ -94,30 +94,47 @@ class Scroller {
} }
} }
const getScroll = () => { type Point = { x: number, y: number };
export default interface ScrollPresenter {
getScroll(): Point;
scrollVertically(amount: number, smooth: boolean): void;
scrollHorizonally(amount: number, smooth: boolean): void;
scrollPages(amount: number, smooth: boolean): void;
scrollTo(x: number, y: number, smooth: boolean): void;
scrollToTop(smooth: boolean): void;
scrollToBottom(smooth: boolean): void;
scrollToHome(smooth: boolean): void;
scrollToEnd(smooth: boolean): void;
// eslint-disable-next-line semi
}
export class ScrollPresenterImpl {
getScroll(): Point {
let target = scrollTarget(); let target = scrollTarget();
return { x: target.scrollLeft, y: target.scrollTop }; return { x: target.scrollLeft, y: target.scrollTop };
}; }
const scrollVertically = (count: number, smooth: boolean): void => { scrollVertically(count: number, smooth: boolean): void {
let target = scrollTarget(); let target = scrollTarget();
let delta = SCROLL_DELTA_Y * count; let delta = SCROLL_DELTA_Y * count;
if (scrolling) { if (scrolling) {
delta = SCROLL_DELTA_Y * count * 4; delta = SCROLL_DELTA_Y * count * 4;
} }
new Scroller(target, smooth).scrollBy(0, delta); new Scroller(target, smooth).scrollBy(0, delta);
}; }
const scrollHorizonally = (count: number, smooth: boolean): void => { scrollHorizonally(count: number, smooth: boolean): void {
let target = scrollTarget(); let target = scrollTarget();
let delta = SCROLL_DELTA_X * count; let delta = SCROLL_DELTA_X * count;
if (scrolling) { if (scrolling) {
delta = SCROLL_DELTA_X * count * 4; delta = SCROLL_DELTA_X * count * 4;
} }
new Scroller(target, smooth).scrollBy(delta, 0); new Scroller(target, smooth).scrollBy(delta, 0);
}; }
const scrollPages = (count: number, smooth: boolean): void => { scrollPages(count: number, smooth: boolean): void {
let target = scrollTarget(); let target = scrollTarget();
let height = target.clientHeight; let height = target.clientHeight;
let delta = height * count; let delta = height * count;
@ -125,44 +142,38 @@ const scrollPages = (count: number, smooth: boolean): void => {
delta = height * count; delta = height * count;
} }
new Scroller(target, smooth).scrollBy(0, delta); new Scroller(target, smooth).scrollBy(0, delta);
}; }
const scrollTo = (x: number, y: number, smooth: boolean): void => { scrollTo(x: number, y: number, smooth: boolean): void {
let target = scrollTarget(); let target = scrollTarget();
new Scroller(target, smooth).scrollTo(x, y); new Scroller(target, smooth).scrollTo(x, y);
}; }
const scrollToTop = (smooth: boolean): void => { scrollToTop(smooth: boolean): void {
let target = scrollTarget(); let target = scrollTarget();
let x = target.scrollLeft; let x = target.scrollLeft;
let y = 0; let y = 0;
new Scroller(target, smooth).scrollTo(x, y); new Scroller(target, smooth).scrollTo(x, y);
}; }
const scrollToBottom = (smooth: boolean): void => { scrollToBottom(smooth: boolean): void {
let target = scrollTarget(); let target = scrollTarget();
let x = target.scrollLeft; let x = target.scrollLeft;
let y = target.scrollHeight; let y = target.scrollHeight;
new Scroller(target, smooth).scrollTo(x, y); new Scroller(target, smooth).scrollTo(x, y);
}; }
const scrollToHome = (smooth: boolean): void => { scrollToHome(smooth: boolean): void {
let target = scrollTarget(); let target = scrollTarget();
let x = 0; let x = 0;
let y = target.scrollTop; let y = target.scrollTop;
new Scroller(target, smooth).scrollTo(x, y); new Scroller(target, smooth).scrollTo(x, y);
}; }
const scrollToEnd = (smooth: boolean): void => { scrollToEnd(smooth: boolean): void {
let target = scrollTarget(); let target = scrollTarget();
let x = target.scrollWidth; let x = target.scrollWidth;
let y = target.scrollTop; let y = target.scrollTop;
new Scroller(target, smooth).scrollTo(x, y); new Scroller(target, smooth).scrollTo(x, y);
}; }
}
export {
getScroll,
scrollVertically, scrollHorizonally, scrollPages,
scrollTo,
scrollToTop, scrollToBottom, scrollToHome, scrollToEnd
};