From: zuber <marek@stepniowski.com>
Date: Mon, 14 Dec 2009 23:40:32 +0000 (+0100)
Subject: Galeria z przeciąganiem obrazków.
X-Git-Url: https://git.mdrn.pl/redakcja.git/commitdiff_plain/a1f864eeb12aacf2d2c094c2bcb8add8b10c4e48

Galeria z przeciąganiem obrazków.
---

diff --git a/apps/explorer/views.py b/apps/explorer/views.py
index 150b03d1..71493c69 100755
--- a/apps/explorer/views.py
+++ b/apps/explorer/views.py
@@ -8,14 +8,15 @@ from django.conf import settings
 from django.contrib.auth.decorators import login_required, permission_required
 
 from django.core.urlresolvers import reverse
-from django.http import HttpResponse
+from django.http import HttpResponse, Http404
 from django.utils import simplejson as json
 from django.views.generic.simple import direct_to_template
 from django.shortcuts import render_to_response
 from django.template import RequestContext
 from django.contrib.auth.decorators import login_required
 
-from explorer import forms
+from explorer import forms, models
+import os
 # from api.models import PullRequest
 from bookthemes.models import Theme
 
@@ -131,3 +132,13 @@ def pull_requests(request):
 def renderer_test(request):
     return direct_to_template(request, 'renderer.html', mimetype="text/html",
         extra_context = {} )
+
+
+def document_gallery(request, document):
+    assocs = models.GalleryForDocument.objects.filter(document=document)
+    directory = assocs[0].subpath
+    try:
+        images = ['/media/%s/%s' % (directory, f) for f in os.listdir(os.path.join(settings.MEDIA_ROOT, directory)) if f.lower().endswith('.jpg')]
+        return HttpResponse(json.dumps(images))
+    except IndexError:
+        raise Http404
diff --git a/platforma/static/css/html.css b/platforma/static/css/html.css
index cbf18745..574e7646 100755
--- a/platforma/static/css/html.css
+++ b/platforma/static/css/html.css
@@ -524,4 +524,8 @@
     border: 1px solid #C8B849;
     background-color: #D4CB9C;
     white-space: pre;
+    overflow: auto;
+    margin: 1.5em 0 0;
+    font-family: monospace;
+    font-size: 10pt;
 }
\ No newline at end of file
diff --git a/platforma/static/css/master.css b/platforma/static/css/master.css
index d7b6dc0b..493a1969 100755
--- a/platforma/static/css/master.css
+++ b/platforma/static/css/master.css
@@ -10,9 +10,10 @@ body {
     top: 25px;
     bottom: 0;
     right: 0;;
-    width: 14px;
-    background: #EEE url(/static/img/gallery.png) no-repeat scroll center center;
+    width: 13px;
+    background: #C1C1C1 url(/static/img/gallery.png) no-repeat scroll center center;
     border-left: 1px solid #999;
+    border-right: 1px solid #999;
     cursor: col-resize;
 }
 
@@ -28,7 +29,7 @@ body {
 #html-view {
     overflow: auto;
     position: absolute;
-    top: 26px;
+    top: 27px;
     bottom: 0;
     left: 0;
     right: 0;
@@ -36,7 +37,7 @@ body {
 
 #sidebar {
     position: absolute;
-    overflow: auto;
+    overflow: hidden;
     top: 25px;
     right: 0;
     bottom: 0;
@@ -100,10 +101,12 @@ body {
 }
 
 .toolbar {
+    width: 100%;
     border-bottom: 1px solid #777;
     background-color: #C1C1C1;
     margin: 0;
     padding: 2px;
+    z-index: 10;
 /*    height: 22px;*/
 }
 
@@ -125,6 +128,7 @@ body {
 }
 
 .toolbar input {
+    float: left;
     font-size: 11px;
     padding: 0;
     margin: 2px 5px 0 5px;
@@ -158,4 +162,29 @@ p { margin: 0;}
     background-color: #FAFAFA;
     border: 1px solid #DDD;
 /*    -webkit-transition: all 1s linear;*/
+}
+
+/* =========== */
+/* = Gallery = */
+/* =========== */
+.gallery-image {
+    position: absolute;
+    top: 27px;
+    right: 0;
+    bottom: 0;
+    left: 0;
+    margin: 0;
+    border: none;
+    background-color: #000;
+    overflow: hidden;
+}
+
+img {
+    position: absolute;
+    -moz-drag: none;
+    user-select: none;
+    -webkit-user-select: none;
+    -khtml-user-select: none;
+    -moz-user-select: none;
+    cursor: pointer;
 }
\ No newline at end of file
diff --git a/platforma/static/js/main.js b/platforma/static/js/main.js
index 284fd197..cf89c293 100644
--- a/platforma/static/js/main.js
+++ b/platforma/static/js/main.js
@@ -111,7 +111,101 @@ function selectTheme(themeId)
 //     });
 // }
 
+function gallery(element) {
+    var element = $(element);
+    
+    function changePage(pageNumber) {        
+        $('img', element).attr('src', element.data('images')[pageNumber - 1]);
+    }
+    
+    function normalizeNumber(pageNumber) {
+        // Numer strony musi być pomiędzy 1 a najwyższym numerem
+        var pageCount = element.data('images').length;
+        pageNumber = parseInt(pageNumber, 10);
+        
+        if (!pageNumber || pageNumber == NaN || pageNumber == Infinity || pageNumber == -Infinity) {
+            return 1;
+        } else if (pageNumber < 1) {
+            return 1;
+        } else if (pageNumber > pageCount) {
+            return pageCount;
+        } else {
+            return pageNumber;
+        }
+    }
+    
+    $.ajax({
+        url: '/gallery/sample',
+        type: 'GET',
+        dataType: 'json',
+    
+        success: function(data) {
+            element.data('images', data);
+            var pn = $('.page-number', element);
+            pn.change(function(event) {
+                console.log('change!', $(this).val());
+                event.preventDefault();
+                var n = normalizeNumber(pn.val());
+                pn.val(n);
+                changePage(n);
+            });
+            $('.previous-page', element).click(function() {
+                pn.val(normalizeNumber(pn.val()) - 1);
+                pn.change();
+            });
+            $('.next-page', element).click(function() {
+                pn.val(normalizeNumber(pn.val()) + 1);
+                pn.change();
+            });
+            
+            var image = $('img', element).attr('unselectable', 'on');
+            var origin = {};
+            var imageOrigin = {};
+            var imageDimensions = {};
+            
+            function onMouseMove(event) {
+                var delta = {
+                    x: event.clientX - origin.x,
+                    y: event.clientY - origin.y
+                };
+                
+                var newTop = Math.min(0, Math.max(imageOrigin.top + delta.y, imageDimensions.galleryHeight - imageDimensions.height));
+                var newLeft = Math.min(0, Math.max(imageOrigin.left + delta.x, imageDimensions.galleryWidth - imageDimensions.width));
+                image.css({position: 'absolute', top: newTop, left: newLeft});
+                return false;
+            }
+            
+            function onMouseUp(event) {
+                $(document)
+                    .unbind('mousemove.gallery')
+                    .unbind('mouseup.gallery');
+                return false;
+            }
+            
+            image.bind('mousedown', function(event) {
+                origin = {
+                    x: event.clientX,
+                    y: event.clientY
+                };
+                imageOrigin = image.position();
+                imageDimensions = {
+                    width: image.width(),
+                    height: image.height(),
+                    galleryWidth: image.parent().width(),
+                    galleryHeight: image.parent().height()
+                };
+                $(document)
+                    .bind('mousemove.gallery', onMouseMove)
+                    .bind('mouseup.gallery', onMouseUp);
+                return false;
+            });
+        }
+    });
+}
+
 $(function() {
+    gallery('#sidebar');
+    
     CodeMirror.fromTextArea('id_text', {
         parserfile: 'parsexml.js',
         path: "/static/js/lib/codemirror/",
@@ -249,7 +343,7 @@ $(function() {
     
     $('.vsplitbar').click(function() {
         if ($('#sidebar').width() == 0) {
-            $('#sidebar').width(480).show();
+            $('#sidebar').width(480).css({right: 0}).show();
             $('#source-editor, #simple-editor').css({right: 495});
             $('.vsplitbar').css({right: 480})
             // $('#splitter').trigger('resize', [$(window).width() - 480]);
diff --git a/platforma/templates/wiki/document_details.html b/platforma/templates/wiki/document_details.html
index 139ade53..826ac648 100644
--- a/platforma/templates/wiki/document_details.html
+++ b/platforma/templates/wiki/document_details.html
@@ -11,7 +11,7 @@
 {% endblock %}
 
 {% block maincontent %}
-    <form action="{% url wiki.views.document_detail document.name|urlencode %}" method="post" accept-charset="utf-8">
+    {# <form action="{% url wiki.views.document_detail document.name|urlencode %}" method="post" accept-charset="utf-8"> #}
         <div id="header">
             <div id="tools" style="float: right;">Wersja: {{ document.revision }}<button style="margin-left: 6px" id="save-button">Zapisz</button></div>
             <h1>{{ document.name }}</h1>
@@ -43,13 +43,15 @@
             <div class="vsplitbar"> </div>
             <div id="sidebar">
                 <div class="toolbar">
-                    <button>Poprzednia strona</button> <button>Następna strona</button>
-                    <input type="text" size="3" value="01" />
+                    <button class="previous-page">⇽ Poprzednia</button>
+                    <input type="text" size="3" maxlength="3" value="1" class="page-number" />
+                    <button class="next-page">Następna ⇾</button>
                     <div class="toolbar-end"> </div>
                 </div>
-                <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
-                <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
+                <div class="gallery-image">
+                    <img src="" />
+                </div>
             </div>
         </div>
-    </form>
+    {# </form> #}
 {% endblock %}
\ No newline at end of file
diff --git a/platforma/urls.py b/platforma/urls.py
index 495c7357..a5667bb7 100755
--- a/platforma/urls.py
+++ b/platforma/urls.py
@@ -32,6 +32,8 @@ urlpatterns = patterns('',
     # Our über-restful api
     # url(r'^api/', include('api.urls')),
     
+    url(r'^gallery/(?P<document>[^/]+)$', 'explorer.views.document_gallery'),
+    
     # Static files (should be served by Apache)
     url(r'^%s(?P<path>.+)$' % settings.MEDIA_URL[1:], 'django.views.static.serve',
         {'document_root': settings.MEDIA_ROOT, 'show_indexes': True}),