Zapamiętywanie proporcji paneli.
authorzuber <marek@stepniowski.com>
Thu, 27 Aug 2009 13:37:30 +0000 (15:37 +0200)
committerzuber <marek@stepniowski.com>
Thu, 27 Aug 2009 13:37:30 +0000 (15:37 +0200)
apps/explorer/models.py
project/static/js/editor.js
project/static/js/jquery.hpanel.js
project/static/js/jquery.json.js [new file with mode: 0644]
project/templates/explorer/editor.html

index 1f8e93d..7e416a3 100644 (file)
@@ -1,6 +1,22 @@
 import os
 
 import os
 
+from django.db import models
+from django.contrib.auth.models import User
 from django.conf import settings
 from django.conf import settings
+from django.utils.translation import gettext_lazy as _
+
+
+class PanelSettings(models.Model):
+    user = models.ForeignKey(User)
+    left_panel = models.CharField(blank=True,  max_length=80)
+    right_panel = models.CharField(blank=True,  max_length=80)
+
+    class Meta:
+        ordering = ['user__name']
+        verbose_name, verbose_name_plural = _("panel settings"), _("panel settings")
+
+    def __unicode__(self):
+        return u"Panel settings for %s" % self.user.name
 
 
 def get_image_folders():
 
 
 def get_image_folders():
index 4e867b7..b732810 100644 (file)
@@ -106,9 +106,29 @@ Editor.prototype.setupUI = function() {
        var panelRoot = $('#panels');
        self.rootDiv = panelRoot;
 
        var panelRoot = $('#panels');
        self.rootDiv = panelRoot;
 
+    // Set panel widths from options.panelRatios
+    if (self.options && self.options.panelRatios) {
+        var totalWidth = 0;
+        $('.panel-wrap', panelRoot).each(function(index) {
+            var panelWidth = self.options.panelRatios[index] * panelRoot.width();
+            if ($(this).hasClass('last-panel')) {
+                $(this).css({
+                    left: totalWidth,
+                    right: 0,
+                });
+            } else {
+                $(this).css({
+                    left: totalWidth,
+                    width: panelWidth,
+                });
+                totalWidth += panelWidth;               
+            }
+        });
+    }
+    
        panelRoot.makeHorizPanel({}); // TODO: this probably doesn't belong into jQuery
     panelRoot.css('top', ($('#header').outerHeight() ) + 'px');
        panelRoot.makeHorizPanel({}); // TODO: this probably doesn't belong into jQuery
     panelRoot.css('top', ($('#header').outerHeight() ) + 'px');
-
+    
        $('#panels > *.panel-wrap').each(function() {
                var panelWrap = $(this);
                $.log('wrap: ', panelWrap);
        $('#panels > *.panel-wrap').each(function() {
                var panelWrap = $(this);
                $.log('wrap: ', panelWrap);
@@ -120,12 +140,27 @@ Editor.prototype.setupUI = function() {
        });     
 
        $('#toolbar-button-save').click( function (event, data) { self.saveToBranch(); } );
        });     
 
        $('#toolbar-button-save').click( function (event, data) { self.saveToBranch(); } );
-
-
+    
+    panelRoot.bind('stopResize', function() {
+        var panelRatios = [];
+        $('.panel-wrap', panelRoot).each(function() {
+            panelRatios.push($(this).width() / panelRoot.width());
+        });
+        self.options.panelRatios = panelRatios;
+        $.log($.toJSON(self.options));
+        $.cookie('options', $.toJSON(self.options), { expires: 7, path: '/'});
+    });
 }
 
 Editor.prototype.loadConfig = function() {
 }
 
 Editor.prototype.loadConfig = function() {
-       // load options from cookie 
+    // Load options from cookie
+       var cookie = $.cookie('options')
+       if (cookie) {
+        this.options = $.secureEvalJSON(cookie);
+    } else {
+        // Default options
+        this.options = {panelRatios: [0.5, 0.5]}
+    }
 }
 
 Editor.prototype.saveToBranch = function() {
 }
 
 Editor.prototype.saveToBranch = function() {
index a3e80ec..abb7a5b 100644 (file)
@@ -35,8 +35,8 @@
                                        $(this).data('panel').css({
                                                'left': $(this).css('left'), 'width': $(this).css('width')}); 
                        });
                                        $(this).data('panel').css({
                                                'left': $(this).css('left'), 'width': $(this).css('width')}); 
                        });
-
                        $('.panel-overlay', event.data.root).css('display', 'none');
                        $('.panel-overlay', event.data.root).css('display', 'none');
+            $(event.data.root).trigger('stopResize');
         }
     };
     
         }
     };
     
diff --git a/project/static/js/jquery.json.js b/project/static/js/jquery.json.js
new file mode 100644 (file)
index 0000000..87f5d01
--- /dev/null
@@ -0,0 +1,178 @@
+/*
+ * jQuery JSON Plugin
+ * version: 2.1 (2009-08-14)
+ *
+ * This document is licensed as free software under the terms of the
+ * MIT License: http://www.opensource.org/licenses/mit-license.php
+ *
+ * Brantley Harris wrote this plugin. It is based somewhat on the JSON.org 
+ * website's http://www.json.org/json2.js, which proclaims:
+ * "NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.", a sentiment that
+ * I uphold.
+ *
+ * It is also influenced heavily by MochiKit's serializeJSON, which is 
+ * copyrighted 2005 by Bob Ippolito.
+ */
+(function($) {
+    /** jQuery.toJSON( json-serializble )
+        Converts the given argument into a JSON respresentation.
+
+        If an object has a "toJSON" function, that will be used to get the representation.
+        Non-integer/string keys are skipped in the object, as are keys that point to a function.
+
+        json-serializble:
+            The *thing* to be converted.
+     **/
+    $.toJSON = function(o)
+    {
+        if (typeof(JSON) == 'object' && JSON.stringify)
+            return JSON.stringify(o);
+        
+        var type = typeof(o);
+    
+        if (o === null)
+            return "null";
+    
+        if (type == "undefined")
+            return undefined;
+        
+        if (type == "number" || type == "boolean")
+            return o + "";
+    
+        if (type == "string")
+            return $.quoteString(o);
+    
+        if (type == 'object')
+        {
+            if (typeof o.toJSON == "function") 
+                return $.toJSON( o.toJSON() );
+            
+            if (o.constructor === Date)
+            {
+                var month = o.getUTCMonth() + 1;
+                if (month < 10) month = '0' + month;
+
+                var day = o.getUTCDate();
+                if (day < 10) day = '0' + day;
+
+                var year = o.getUTCFullYear();
+                
+                var hours = o.getUTCHours();
+                if (hours < 10) hours = '0' + hours;
+                
+                var minutes = o.getUTCMinutes();
+                if (minutes < 10) minutes = '0' + minutes;
+                
+                var seconds = o.getUTCSeconds();
+                if (seconds < 10) seconds = '0' + seconds;
+                
+                var milli = o.getUTCMilliseconds();
+                if (milli < 100) milli = '0' + milli;
+                if (milli < 10) milli = '0' + milli;
+
+                return '"' + year + '-' + month + '-' + day + 'T' +
+                             hours + ':' + minutes + ':' + seconds + 
+                             '.' + milli + 'Z"'; 
+            }
+
+            if (o.constructor === Array) 
+            {
+                var ret = [];
+                for (var i = 0; i < o.length; i++)
+                    ret.push( $.toJSON(o[i]) || "null" );
+
+                return "[" + ret.join(",") + "]";
+            }
+        
+            var pairs = [];
+            for (var k in o) {
+                var name;
+                var type = typeof k;
+
+                if (type == "number")
+                    name = '"' + k + '"';
+                else if (type == "string")
+                    name = $.quoteString(k);
+                else
+                    continue;  //skip non-string or number keys
+            
+                if (typeof o[k] == "function") 
+                    continue;  //skip pairs where the value is a function.
+            
+                var val = $.toJSON(o[k]);
+            
+                pairs.push(name + ":" + val);
+            }
+
+            return "{" + pairs.join(", ") + "}";
+        }
+    };
+
+    /** jQuery.evalJSON(src)
+        Evaluates a given piece of json source.
+     **/
+    $.evalJSON = function(src)
+    {
+        if (typeof(JSON) == 'object' && JSON.parse)
+            return JSON.parse(src);
+        return eval("(" + src + ")");
+    };
+    
+    /** jQuery.secureEvalJSON(src)
+        Evals JSON in a way that is *more* secure.
+    **/
+    $.secureEvalJSON = function(src)
+    {
+        if (typeof(JSON) == 'object' && JSON.parse)
+            return JSON.parse(src);
+        
+        var filtered = src;
+        filtered = filtered.replace(/\\["\\\/bfnrtu]/g, '@');
+        filtered = filtered.replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']');
+        filtered = filtered.replace(/(?:^|:|,)(?:\s*\[)+/g, '');
+        
+        if (/^[\],:{}\s]*$/.test(filtered))
+            return eval("(" + src + ")");
+        else
+            throw new SyntaxError("Error parsing JSON, source is not valid.");
+    };
+
+    /** jQuery.quoteString(string)
+        Returns a string-repr of a string, escaping quotes intelligently.  
+        Mostly a support function for toJSON.
+    
+        Examples:
+            >>> jQuery.quoteString("apple")
+            "apple"
+        
+            >>> jQuery.quoteString('"Where are we going?", she asked.')
+            "\"Where are we going?\", she asked."
+     **/
+    $.quoteString = function(string)
+    {
+        if (string.match(_escapeable))
+        {
+            return '"' + string.replace(_escapeable, function (a) 
+            {
+                var c = _meta[a];
+                if (typeof c === 'string') return c;
+                c = a.charCodeAt();
+                return '\\u00' + Math.floor(c / 16).toString(16) + (c % 16).toString(16);
+            }) + '"';
+        }
+        return '"' + string + '"';
+    };
+    
+    var _escapeable = /["\\\x00-\x1f\x7f-\x9f]/g;
+    
+    var _meta = {
+        '\b': '\\b',
+        '\t': '\\t',
+        '\n': '\\n',
+        '\f': '\\f',
+        '\r': '\\r',
+        '"' : '\\"',
+        '\\': '\\\\'
+    };
+})(jQuery);
index 94f9e01..1e0cf30 100644 (file)
@@ -6,6 +6,8 @@
     <script src="/static/js/jquery.autoscroll.js" type="text/javascript" charset="utf-8"></script>
     <script src="/static/js/jquery.wtooltip.js" type="text/javascript" charset="utf-8"></script>
     <script src="/static/js/jquery.hpanel.js" type="text/javascript" charset="utf-8"></script>
     <script src="/static/js/jquery.autoscroll.js" type="text/javascript" charset="utf-8"></script>
     <script src="/static/js/jquery.wtooltip.js" type="text/javascript" charset="utf-8"></script>
     <script src="/static/js/jquery.hpanel.js" type="text/javascript" charset="utf-8"></script>
+    <script src="/static/js/jquery.json.js" type="text/javascript" charset="utf-8"></script>
+    <script src="/static/js/jquery.cookie.js" type="text/javascript" charset="utf-8"></script>
     <script src="/static/js/editor.js" type="text/javascript" charset="utf-8"></script>
 {% endblock extrahead %}
 
     <script src="/static/js/editor.js" type="text/javascript" charset="utf-8"></script>
 {% endblock extrahead %}