From: zuber Date: Thu, 27 Aug 2009 13:37:30 +0000 (+0200) Subject: Zapamiętywanie proporcji paneli. X-Git-Url: https://git.mdrn.pl/redakcja.git/commitdiff_plain/e4722e5fe52bb4682bee8878bc24dcaaf557b591 Zapamiętywanie proporcji paneli. --- diff --git a/apps/explorer/models.py b/apps/explorer/models.py index 1f8e93dc..7e416a38 100644 --- a/apps/explorer/models.py +++ b/apps/explorer/models.py @@ -1,6 +1,22 @@ import os +from django.db import models +from django.contrib.auth.models import User 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(): diff --git a/project/static/js/editor.js b/project/static/js/editor.js index 4e867b7b..b732810e 100644 --- a/project/static/js/editor.js +++ b/project/static/js/editor.js @@ -106,9 +106,29 @@ Editor.prototype.setupUI = function() { 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'); - + $('#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(); } ); - - + + 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() { - // 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() { diff --git a/project/static/js/jquery.hpanel.js b/project/static/js/jquery.hpanel.js index a3e80ece..abb7a5bc 100644 --- a/project/static/js/jquery.hpanel.js +++ b/project/static/js/jquery.hpanel.js @@ -35,8 +35,8 @@ $(this).data('panel').css({ 'left': $(this).css('left'), 'width': $(this).css('width')}); }); - $('.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 index 00000000..87f5d015 --- /dev/null +++ b/project/static/js/jquery.json.js @@ -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); diff --git a/project/templates/explorer/editor.html b/project/templates/explorer/editor.html index 94f9e011..1e0cf30b 100644 --- a/project/templates/explorer/editor.html +++ b/project/templates/explorer/editor.html @@ -6,6 +6,8 @@ + + {% endblock extrahead %}