Mercurial > hg > digilib
changeset 1490:e469a6e04b64
first half-version of sequence plugin for digicat. does pt only so far.
author | robcast |
---|---|
date | Fri, 11 Mar 2016 18:26:02 +0100 |
parents | 02e055d9b84e |
children | 8128cbff0dac |
files | webapp/src/main/webapp/jquery/digicat.html webapp/src/main/webapp/jquery/jquery.digicat.js webapp/src/main/webapp/jquery/jquery.digicat.sequence.js |
diffstat | 3 files changed, 271 insertions(+), 29 deletions(-) [+] |
line wrap: on
line diff
--- a/webapp/src/main/webapp/jquery/digicat.html Sat Feb 27 21:07:25 2016 +0100 +++ b/webapp/src/main/webapp/jquery/digicat.html Fri Mar 11 18:26:02 2016 +0100 @@ -3,7 +3,7 @@ <head> <meta http-equiv="content-type" content="text/html; charset=utf-8" /> <meta name="viewport" content="initial-scale=1.0"/> - <title>digicat TEST</title> + <title>digicat</title> <style type="text/css"> body {
--- a/webapp/src/main/webapp/jquery/jquery.digicat.js Sat Feb 27 21:07:25 2016 +0100 +++ b/webapp/src/main/webapp/jquery/jquery.digicat.js Fri Mar 11 18:26:02 2016 +0100 @@ -168,6 +168,8 @@ elemSettings.scalerBaseUrl = elemSettings.digilibBaseUrl + '/servlet/Scaler'; } } + // set up event handlers + $(data).on('update', handleUpdate); // initialise plugins for (n in plugins) { var p = plugins[n]; @@ -478,6 +480,14 @@ $(data).trigger('imgerror'); }; + /** handle "update" display event. + */ + var handleUpdate = function (evt) { + var data = this; + console.debug("handleupdate."); + setupDigicatDiv(data); + }; + /** * creates HTML structure for digilib in elem */ @@ -488,6 +498,7 @@ $elem.addClass(cssPrefix + 'digicat'); var scalerUrl; var dlUrl; + var pt = settings.pt; var pg = settings.pg; var rows = settings.rows; var cols = settings.cols; @@ -506,35 +517,37 @@ $tr = $('<tr/>'); for (var cidx = 0; cidx < cols; ++cidx) { $td = $('<td>'); - settings.pn = pn; - /* - * link - */ - dlUrl = getDigilibUrl(data, '/digilib.html'); - $link = $('<a href="'+dlUrl+'" target="_blank"/>'); - /* - * scaler image - */ - $img = $('<img/>'); - $img.addClass(cssPrefix + 'pic'); - $img.on('error', function(evt, a, b) { - handleScalerImgError(data, evt, a, b); - }); - scalerUrl = getScalerUrl(data); - $img.attr('src', scalerUrl); - /* - * image caption - */ - $cap = $('<div/>'); - $cap.text(pn); - /* - * assemble element - */ + if (pt == null || pn <= pt) { + settings.pn = pn; + /* + * link + */ + dlUrl = getDigilibUrl(data, '/digilib.html'); + $link = $('<a href="'+dlUrl+'" target="_blank"/>'); + /* + * scaler image + */ + $img = $('<img/>'); + $img.addClass(cssPrefix + 'pic'); + $img.on('error', function(evt, a, b) { + handleScalerImgError(data, evt, a, b); + }); + scalerUrl = getScalerUrl(data); + $img.attr('src', scalerUrl); + /* + * image caption + */ + $cap = $('<div/>'); + $cap.text(pn); + /* + * assemble element + */ + $link.append($img); + $link.append($cap); + $td.append($link); + } $td.css('width', tdw + 'px'); $td.css('height', tdh + 'px'); - $link.append($img); - $link.append($cap); - $td.append($link); $tr.append($td); pn += 1; } @@ -607,7 +620,15 @@ * functions to export to plugins. */ fn = { - geometry : geom + geometry : geom, + parseQueryString : parseQueryString, + getScalerUrl : getScalerUrl, + getParamString : getParamString, + getDigilibUrl : getDigilibUrl, + unpackParams : unpackParams, + packParams : packParams, + setNumValue : setNumValue, + redisplay : redisplay }; // hook digicat plugin into jquery
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/webapp/src/main/webapp/jquery/jquery.digicat.sequence.js Fri Mar 11 18:26:02 2016 +0100 @@ -0,0 +1,221 @@ +/* + * #%L + * digilib plugin stub + * %% + * Copyright (C) 2011 - 2013 Bibliotheca Hertziana, MPIWG Berlin + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Lesser Public License for more details. + * + * You should have received a copy of the GNU General Lesser Public + * License along with this program. If not, see + * <http://www.gnu.org/licenses/lgpl-3.0.html>. + * #L% + * Authors: Robert Casties, Martin Raspe + */ +/** +digilib plugin stub + */ + +(function($) { + + // affine geometry + var geom; + // plugin object with digilib data + var digilib; + var fn; + + var FULL_AREA; + + var buttons = { + seq : { + onclick : ["doSequence", 1], + tooltip : "what does this button do?", + icon : "seq.png" + } + }; + + var defaults = { + // array of images to show sequentially + 'imageSequence' : null, + // optional prefix for image file names + 'imageSequenceBase' : null, + // contains the HTML to be shown as caption + 'imageSequenceCaption' : null, + // show captions for sequential images? + 'imageSequenceShowCaptions' : false + }; + + var actions = { + // replaces digilib.fn.gotoPage (monkey patch) + gotoPage2 : function (data, pageNr) { + var settings = data.settings; + var currentPn = settings.pn; + if (hasSequence(settings)) { + settings.pt = settings.imageSequence.length; + } + else if (hasDirInfo(data)) { + settings.pt = data.dirInfo.files.length; + } + if (pageNr == null) { + pageNr = window.prompt("Goto image at index", currentPn); + } + if (pageNr == '-0') { + pageNr = settings.pt; + } + var pn = fn.setNumValue(settings, "pn", pageNr); + if (pn == null) return false; // nothing happened + if (pn < 1) { + alert("no such image (index number too low)"); + settings.pn = currentPn; + return false; + } + // set pn and fn parameters + if (settings.pt != null) { + if (pn > settings.pt) { + alert("no such image (index number too high)"); + settings.pn = currentPn; + return false; + } + settings.pn = pn; + if (hasSequence(settings)) { + setSequenceFn(settings); + } + } + // reset mk and others(?) + data.marks = []; + data.zoomArea = FULL_AREA.copy(); + // then reload + fn.redisplay(data); + } + }; + + // is a special image sequence defined? + var hasSequence = function(settings) { + return settings.imageSequence != null; + }; + + // are dirinfo json data available? + var hasDirInfo = function(data) { + return data.dirInfo != null; + }; + + // set the fn parameter for the current page index number + var setSequenceFn = function(settings) { + var pn = settings.pn; + settings.fn = settings.imageSequenceBase == null + ? settings.imageSequence[pn-1].fn + : settings.imageSequenceBase + '/' + settings.imageSequence[pn-1].fn; + return settings.fn + }; + + // get json data for current fn directory + var loadDirInfo = function (data) { + var settings = data.settings; + // bind default function (only once) + $(data).off('dirInfo', handleDirInfo); + $(data).on('dirInfo', handleDirInfo); + var url = settings.digilibBaseUrl + '/api/dirInfo-json.jsp'; + url += '?' + fn.getParamString(settings, ['fn'], defaults); + // TODO: better error handling + $.getJSON(url, function (json) { + console.debug("sequence: got json data=", json); + data.dirInfo = json; + // send event + $(data).trigger('dirInfo', [json]); + }); + }; + + // plugin installation routine, called by digilib on each plugin object. + var install = function(plugin) { + digilib = plugin; + fn = plugin.fn; + console.debug('installing sequence plugin. digilib:', digilib); + // import geometry classes + geom = digilib.fn.geometry; + FULL_AREA = geom.rectangle(0,0,1,1); + // add defaults, actions, buttons to the main digilib object + $.extend(digilib.defaults, defaults); + $.extend(digilib.actions, actions); + $.extend(digilib.buttons, buttons); + }; + + // plugin initialization + var init = function (data) { + console.debug('initialising sequence plugin. data:', data); + var $data = $(data); + // monkey patch for the original action in jquery.digilib.js + digilib.fn.gotoPage = actions.gotoPage; + // install event handlers + $data.bind('unpack', handleUnpack); + $data.bind('setup', handleSetup); + $data.bind('update', handleUpdate); + $data.bind('redisplay', handleRedisplay); + }; + + // set parameters for the first image to show + var handleUnpack = function (evt) { + var data = this; + var settings = data.settings; + // an image sequence was defined in HTML + if (hasSequence(settings)) { + setSequenceFn(settings); + settings.suppressParamNames = ['pt', 'fn']; + } + // get json info for the current directory + else { + loadDirInfo(data); + } + // console.warn("fn", settings.fn, "pn", settings.pn); + }; + + var handleDirInfo = function (evt) { + console.debug("sequence: handleDirInfo"); + var data = this; + data.settings.pt = data.dirInfo.count; + console.debug("setting pt="+data.settings.pt); + $(data).trigger('update'); + }; + + var handleSetup = function (evt) { + console.debug("sequence: handleSetup"); + var data = this; + }; + + var handleUpdate = function (evt) { + console.debug("sequence: handleUpdate"); + var data = this; + }; + + var handleRedisplay = function (evt) { + console.debug("sequence: handleRedisplay"); + var data = this; + // var settings = data.settings; + // console.warn("fn", settings.fn, "pn", settings.pn); + }; + + // plugin object, containing name, install and init routines + // all shared objects are filled by digilib on registration + var plugin = { + name : 'sequence', + install : install, + init : init, + buttons : {}, + actions : {}, + fn : {}, + plugins : {} + }; + + if ($.fn.digicat == null) { + $.error("jquery.digicat.sequence.js must be loaded after jquery.digicat!"); + } else { + $.fn.digicat('plugin', plugin); + } +})(jQuery);