comparison client/digitallibrary/jquery/jquery.digilib.js @ 651:2d85d820501d jquery

split bird's view code in two more parts, analog to scaler-img code. setupBirdDiv sets onload handler on bird img, onload handler calls renderBirdArea. both handlers use common transform setup code.
author robcast
date Fri, 21 Jan 2011 14:53:37 +0100
parents e328273b7ef4
children 9ec8f039e942
comparison
equal deleted inserted replaced
650:b6fdd915c7e8 651:2d85d820501d
645 // use only the relevant parameters 645 // use only the relevant parameters
646 var keys = ['fn','pn','dw','dh']; 646 var keys = ['fn','pn','dw','dh'];
647 var birdSettings = $.extend({}, settings, settings.birdDivOptions); 647 var birdSettings = $.extend({}, settings, settings.birdDivOptions);
648 var birdUrl = settings.scalerBaseUrl + '?' + getParamString(birdSettings, keys); 648 var birdUrl = settings.scalerBaseUrl + '?' + getParamString(birdSettings, keys);
649 // the bird's eye div 649 // the bird's eye div
650 var $birdviewDiv = $('<div class="birdview" style="display:none"/>'); 650 var $birdDiv = $('<div class="birdview" style="display:none"/>');
651 // the detail indicator frame 651 // the detail indicator frame
652 var $birdzoomDiv = $('<div class="birdzoom" style="position: absolute; background-color: transparent;"/>'); 652 var $birdzoomDiv = $('<div class="birdzoom" style="position: absolute; background-color: transparent;"/>');
653 // the small image 653 // the small image
654 var $birdImg = $('<img class="birdimg"/>'); 654 var $birdImg = $('<img class="birdimg"/>');
655 $elem.append($birdviewDiv); 655 $elem.append($birdDiv);
656 $birdviewDiv.append($birdzoomDiv); 656 $birdDiv.append($birdzoomDiv);
657 $birdviewDiv.append($birdImg); 657 $birdDiv.append($birdImg);
658 data.$birdDiv = $birdDiv;
659 data.$birdImg = $birdImg;
660 $birdImg.load(birdImgLoadedHandler(data));
658 $birdImg.attr('src', birdUrl); 661 $birdImg.attr('src', birdUrl);
659 if (data.settings.isBirdDivVisible) { 662 if (data.settings.isBirdDivVisible) {
660 $birdviewDiv.fadeIn(); 663 $birdDiv.fadeIn();
661 } 664 }
662 data.$birdDiv = $birdviewDiv;
663 }; 665 };
664 666
665 // creates HTML structure for the about view in elem 667 // creates HTML structure for the about view in elem
666 var setupAboutDiv = function (data) { 668 var setupAboutDiv = function (data) {
667 var $elem = data.$elem; 669 var $elem = data.$elem;
702 $div.fadeOut(); 704 $div.fadeOut();
703 } 705 }
704 return isVisible; 706 return isVisible;
705 }; 707 };
706 708
707 // shows bird view indicator 709 // create Transform from area and $img
708 var showBirdIndicator = function (data) { 710 var getImgTrafo = function ($img, area) {
709 if (!data.settings.isBirdDivVisible || isFullArea(data)) return; 711 var picrect = geom.rectangle($img);
710 // TODO: more conditions: original size, pixel by pixel? 712 var trafo = geom.transform();
711 var $birdDiv = data.$birdDiv; 713 // subtract area offset and size
712 var $birdImg = $birdDiv.find('img.birdimg'); 714 trafo.concat(trafo.getTranslation(geom.position(-area.x, -area.y)));
713 var pos = $birdImg.offset(); 715 trafo.concat(trafo.getScale(geom.size(1/area.width, 1/area.height)));
714 var birdRect = geom.rectangle(pos.left, pos.top, $birdImg.width(), $birdImg.height()); 716 // scale to screen size
715 var area = data.zoomArea; 717 trafo.concat(trafo.getScale(picrect));
716 // TODO: couldn't we do a trafo here? :-) 718 trafo.concat(trafo.getTranslation(picrect));
717 var indRect = geom.rectangle( 719 return trafo;
718 birdRect.x + birdRect.width * area.x, 720 };
719 birdRect.y + birdRect.height * area.y, 721
720 birdRect.width * area.width,
721 birdRect.height * area.height
722 );
723 var $ind = $birdDiv.find('div.birdzoom');
724 // TODO: set the coordinates all in one call?
725 $ind.width(indRect.width);
726 $ind.height(indRect.height);
727 $ind.offset({ left : indRect.x, top : indRect.y });
728 // TODO: how to override this style with a CSS stylesheet?
729 if (!$ind.css('border')) $ind.css('border', '2px solid #ff0000');
730 return;
731 };
732
733 // returns function for load event of scaler img 722 // returns function for load event of scaler img
734 var scalerImgLoadedHandler = function (data) { 723 var scalerImgLoadedHandler = function (data) {
735 var settings = data.settings;
736 var $elem = data.$elem;
737 var $img = data.$img; 724 var $img = data.$img;
738
739 return function () { 725 return function () {
740 console.debug("img loaded! this=", this, " data=", data); 726 console.debug("img loaded! this=", this, " data=", data);
741 var area = data.zoomArea;
742 // create Transform from current area and picsize 727 // create Transform from current area and picsize
743 var picrect = geom.rectangle($img); 728 data.imgTrafo = getImgTrafo($img, data.zoomArea);
744 var trafo = geom.transform();
745 // subtract area offset and size
746 trafo.concat(trafo.getTranslation(geom.position(- area.x, - area.y)));
747 trafo.concat(trafo.getScale(geom.size(1/area.width, 1/area.height)));
748 // scale to screen size
749 trafo.concat(trafo.getScale(picrect));
750 trafo.concat(trafo.getTranslation(picrect));
751 data.imgTrafo = trafo;
752 // display marks 729 // display marks
753 renderMarks(data); 730 renderMarks(data);
754 //digilib.showArrows(); // show arrow overlays for zoom navigation 731 //digilib.showArrows(); // show arrow overlays for zoom navigation
755 // done -- hide about div --- 732 };
756 // --- why? This only leads to suprise effects when displayed programmatically 733 };
757 // settings.isAboutDivVisible = showDiv(null, data.$aboutDiv, 0); 734
758 showBirdIndicator(data); 735 // returns function for load event of bird's eye view img
736 var birdImgLoadedHandler = function (data) {
737 var $img = data.$birdImg;
738 return function () {
739 console.debug("birdimg loaded! this=", this, " data=", data);
740 // create Transform from current area and picsize
741 data.birdTrafo = getImgTrafo($img, MAX_ZOOMAREA);
742 // display marks
743 renderBirdArea(data);
759 }; 744 };
760 }; 745 };
761 746
762 // place marks on the image 747 // place marks on the image
763 var renderMarks = function (data) { 748 var renderMarks = function (data) {
775 $mark.offset({left : mpos.x, top : mpos.y}); 760 $mark.offset({left : mpos.x, top : mpos.y});
776 } 761 }
777 } 762 }
778 }; 763 };
779 764
765 var renderBirdArea = function (data) {
766 var $ind = data.$birdDiv.find('div.birdzoom');
767 var indRect = data.birdTrafo.transform(data.zoomArea);
768 // TODO: set the coordinates all in one call?
769 $ind.width(indRect.width);
770 $ind.height(indRect.height);
771 $ind.offset({ left : indRect.x, top : indRect.y });
772 // TODO: how to override this style with a CSS stylesheet?
773 if (!$ind.css('border')) $ind.css('border', '2px solid #ff0000');
774 }
775
780 // zooms by the given factor 776 // zooms by the given factor
781 var zoomBy = function(data, factor) { 777 var zoomBy = function(data, factor) {
782 var area = data.zoomArea; 778 var area = data.zoomArea;
783 var newarea = area.copy(); 779 var newarea = area.copy();
784 // scale 780 // scale