Skip to content

Commit

Permalink
refactor: Extract PagerRenderer from renderer.
Browse files Browse the repository at this point in the history
  • Loading branch information
mrseanryan committed Dec 29, 2018
1 parent dad5021 commit 5d6f3d9
Show file tree
Hide file tree
Showing 4 changed files with 98 additions and 70 deletions.
7 changes: 7 additions & 0 deletions src/electronApp/State.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
export type State = {
currentPage: number;
imageInputDir: string;
// Each 'browse to directory' or 'select page' is a new epoch,
// so can igore stale async responses. Alt could be to cancel promises but seems complicated.
epoch: number;
};
70 changes: 4 additions & 66 deletions src/electronApp/renderer.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,7 @@
import * as jquery from "jquery";

import { ChocolateBars } from "../bars/ChocolateBars";
import { ImageFinder } from "../bars/files/ImageFinder";
import { ImageDetail } from "../bars/model/ImageDetail";
import { PagingModel } from "../bars/model/PagingModel";
import { JQueryUtils } from "../utils/JQueryUtils";
import { ConsoleOutputter } from "../utils/outputter/ConsoleOutputter";
import { Verbosity } from "../utils/outputter/Verbosity";
Expand All @@ -12,7 +10,9 @@ import { DetailPaneRenderer } from "./rendering/DetailPaneRenderer";
import { ExpandedImageRenderer } from "./rendering/ExpandedImageRenderer";
import { HtmlGrid } from "./rendering/HtmlGrid";
import { LoaderRenderer } from "./rendering/LoaderRenderer";
import { PagerRenderer } from "./rendering/PagerRenderer";
import { SelectDirectoryRenderer } from "./rendering/SelectDirectoryRenderer";
import { State } from "./State";

const remote = require("electron").remote;

Expand All @@ -26,11 +26,9 @@ const grid = new HtmlGrid();

const HIDE_LOADING_AFTER_N_IMAGES = 9;

const state = {
const state: State = {
currentPage: 0,
imageInputDir: "",
// Each 'browse to directory' or 'select page' is a new epoch,
// so can igore stale async responses. Alt could be to cancel promises but seems complicated.
epoch: 0
};

Expand Down Expand Up @@ -70,7 +68,7 @@ async function renderContainerAndDetailWithImages(imageInputDir: string) {
}

async function renderImagesAndPager() {
renderPagerButtons();
PagerRenderer.renderPagerButtons(state, outputter, renderImagesAndPager);
await renderImages();
}

Expand All @@ -82,29 +80,6 @@ async function renderImagesAndPagerForDirectory(imageInputDir: string) {
renderImagesAndPager();
}

// xxx PagerRenderer
async function renderPagerButtons() {
let pageCount = 0;
let imageCountThisPage = 0;
grid.clearPagerContainer();

// Always have a 1st page:
renderPager(pageCount);
pageCount++;

const allImages = await ImageFinder.findImagesInDirectory(state.imageInputDir, outputter);
allImages.forEach(() => {
imageCountThisPage++;

if (imageCountThisPage > PagingModel.IMAGES_PER_PAGE) {
renderPager(pageCount);

pageCount++;
imageCountThisPage = 1;
}
});
}

// xxx ImagesRenderer
async function renderImages() {
grid.clearImagesContainer();
Expand Down Expand Up @@ -155,43 +130,6 @@ async function renderImages() {
LoaderRenderer.hideImagesLoading();
}

// xxx PagerRenderer
function renderPager(pageId: number) {
const isCurrent = pageId === state.currentPage;
const disabled = isCurrent ? " disabled" : "";
const currentClass = isCurrent ? " image-pager-button-current" : "";

const pagerHtml = `<button id='button-pager-${pageId}}'${disabled} class="image-pager-button${currentClass}">${pageId +
1}</button>`;
jquery(".image-pager").append(pagerHtml);

addPagerClickListener(pageId);
}

function addPagerClickListener(pageId: number) {
const pageDiv = document.getElementById(`button-pager-${pageId}}`);
if (!pageDiv) {
outputter.error(`could not find page button div for '${pageId}'`);
return;
}

pageDiv.addEventListener("click", () => onClickPager(pageId));
}

function onClickPager(pageId: number) {
state.epoch++;

state.currentPage = pageId;

LoaderRenderer.showImagesLoading();

// use setTimeout to ensure loader appears
setTimeout(() => {
// a new pager button may become disabled - so also need to render the pager buttons.
renderImagesAndPager();
}, 250);
}

function addImageClickListener(image: ImageDetail) {
const imageDivId = HtmlGrid.getImageDivId(image);

Expand Down
4 changes: 0 additions & 4 deletions src/electronApp/rendering/HtmlGrid.ts
Original file line number Diff line number Diff line change
Expand Up @@ -32,10 +32,6 @@ export class HtmlGrid {
JQueryUtils.clearHtmlDivById(IMAGE_CONTAINER_ID);
}

clearPagerContainer() {
JQueryUtils.clearHtmlDivByClass("image-pager");
}

setTitleForDir(imageInputDir: string) {
jquery(".grid-header").html(`Images at '${imageInputDir}'`);
}
Expand Down
87 changes: 87 additions & 0 deletions src/electronApp/rendering/PagerRenderer.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
import * as jquery from "jquery";

import { ImageFinder } from "../../bars/files/ImageFinder";
import { PagingModel } from "../../bars/model/PagingModel";
import { JQueryUtils } from "../../utils/JQueryUtils";
import { IOutputter } from "../../utils/outputter/IOutputter";
import { State } from "../State";
import { LoaderRenderer } from "./LoaderRenderer";

export namespace PagerRenderer {
export async function renderPagerButtons(
state: State,
outputter: IOutputter,
renderImagesAndPager: () => void
) {
let pageCount = 0;
let imageCountThisPage = 0;

clearPagerContainer();

// Always have a 1st page:
renderPager(pageCount, state, outputter, renderImagesAndPager);
pageCount++;

const allImages = await ImageFinder.findImagesInDirectory(state.imageInputDir, outputter);
allImages.forEach(() => {
imageCountThisPage++;

if (imageCountThisPage > PagingModel.IMAGES_PER_PAGE) {
renderPager(pageCount, state, outputter, renderImagesAndPager);

pageCount++;
imageCountThisPage = 1;
}
});
}

function renderPager(
pageId: number,
state: State,
outputter: IOutputter,
renderImagesAndPager: () => void
) {
const isCurrent = pageId === state.currentPage;
const disabled = isCurrent ? " disabled" : "";
const currentClass = isCurrent ? " image-pager-button-current" : "";

const pagerHtml = `<button id='button-pager-${pageId}}'${disabled} class="image-pager-button${currentClass}">${pageId +
1}</button>`;
jquery(".image-pager").append(pagerHtml);

addPagerClickListener(pageId, state, outputter, renderImagesAndPager);
}

function clearPagerContainer() {
JQueryUtils.clearHtmlDivByClass("image-pager");
}

export function addPagerClickListener(
pageId: number,
state: State,
outputter: IOutputter,
renderImagesAndPager: () => void
) {
const pageDiv = document.getElementById(`button-pager-${pageId}}`);
if (!pageDiv) {
outputter.error(`could not find page button div for '${pageId}'`);
return;
}

pageDiv.addEventListener("click", () => onClickPager(pageId, state, renderImagesAndPager));
}

function onClickPager(pageId: number, state: State, renderImagesAndPager: () => void) {
state.epoch++;

state.currentPage = pageId;

LoaderRenderer.showImagesLoading();

// use setTimeout to ensure loader appears
setTimeout(() => {
// a new pager button may become disabled - so also need to render the pager buttons.
renderImagesAndPager();
}, 250);
}
}

0 comments on commit 5d6f3d9

Please sign in to comment.