From 2d70e6794fe8286210f98fc490b5967180d7484f Mon Sep 17 00:00:00 2001 From: Aaron Boodman Date: Tue, 31 Dec 2013 15:25:19 -0800 Subject: [PATCH] Increase pigginess in new detail UI. Change-Id: I4eb1acf7e6cd114edf7c5f66fcb4fb6ff8842bdb --- make.go | 3 +- pkg/server/ui.go | 63 ++++---- server/camlistored/ui/detail.css | 26 +++- server/camlistored/ui/detail.html | 2 +- server/camlistored/ui/detail.js | 136 ++++++++++-------- server/camlistored/ui/object.js | 11 ++ server/camlistored/ui/sprited_animation.js | 28 ++++ server/camlistored/ui/sprited_image.js | 27 ++++ third_party/glitch/LICENSE | 19 +++ third_party/glitch/fileembed.go | 24 ++++ .../npc_piggy__x1_walk_png_1354829432.png | Bin 0 -> 41980 bytes third_party/react/fileembed.go | 2 +- 12 files changed, 237 insertions(+), 104 deletions(-) create mode 100644 server/camlistored/ui/object.js create mode 100644 server/camlistored/ui/sprited_animation.js create mode 100644 server/camlistored/ui/sprited_image.js create mode 100644 third_party/glitch/LICENSE create mode 100644 third_party/glitch/fileembed.go create mode 100644 third_party/glitch/npc_piggy__x1_walk_png_1354829432.png diff --git a/make.go b/make.go index 756e4f05a..7b281d20d 100644 --- a/make.go +++ b/make.go @@ -345,7 +345,8 @@ func genEmbeds() error { uiEmbeds := buildSrcPath("server/camlistored/ui") serverEmbeds := buildSrcPath("pkg/server") reactEmbeds := buildSrcPath("third_party/react") - for _, embeds := range []string{uiEmbeds, serverEmbeds, reactEmbeds} { + glitchEmbeds := buildSrcPath("third_party/glitch") + for _, embeds := range []string{uiEmbeds, serverEmbeds, reactEmbeds, glitchEmbeds} { args := []string{embeds} cmd := exec.Command(cmdName, args...) cmd.Env = append(cleanGoEnv(), diff --git a/pkg/server/ui.go b/pkg/server/ui.go index c191f1f0b..4b1579ce4 100644 --- a/pkg/server/ui.go +++ b/pkg/server/ui.go @@ -40,6 +40,7 @@ import ( "camlistore.org/pkg/sorted" uistatic "camlistore.org/server/camlistored/ui" closurestatic "camlistore.org/server/camlistored/ui/closure" + glitchstatic "camlistore.org/third_party/glitch" reactstatic "camlistore.org/third_party/react" ) @@ -57,6 +58,7 @@ var ( treePattern = regexp.MustCompile(`^tree/([^/]+)(/.*)?$`) closurePattern = regexp.MustCompile(`^closure/(([^/]+)(/.*)?)$`) reactPattern = regexp.MustCompile(`^react/(.+)$`) + glitchPattern = regexp.MustCompile(`^glitch/(.+)$`) disableThumbCache, _ = strconv.ParseBool(os.Getenv("CAMLI_DISABLE_THUMB_CACHE")) ) @@ -91,8 +93,9 @@ type UIHandler struct { uiDir string // if sourceRoot != "", this is sourceRoot+"/server/camlistored/ui" - closureHandler http.Handler - fileReactHandler http.Handler + closureHandler http.Handler + fileReactHandler http.Handler + fileGlitchHandler http.Handler } func init() { @@ -213,10 +216,14 @@ func uiFromConfig(ld blobserver.Loader, conf jsonconfig.Obj) (h http.Handler, er } if ui.sourceRoot != "" { - ui.fileReactHandler, err = ui.makeEmbeddedReactHandler(ui.sourceRoot) + ui.fileReactHandler, err = makeFileServer(ui.sourceRoot, filepath.Join("third_party", "react"), "react.js") if err != nil { return nil, fmt.Errorf("Could not make react handler: %s", err) } + ui.fileGlitchHandler, err = makeFileServer(ui.sourceRoot, filepath.Join("third_party", "glitch"), "npc_piggy__x1_walk_png_1354829432.png") + if err != nil { + return nil, fmt.Errorf("Could not make glitch handler: %s", err) + } } rootPrefix, _, err := ld.FindHandlerByType("root") @@ -237,15 +244,6 @@ func (ui *UIHandler) makeClosureHandler(root string) (http.Handler, error) { return makeClosureHandler(root, "ui") } -func (ui *UIHandler) makeEmbeddedReactHandler(root string) (http.Handler, error) { - path := filepath.Join("third_party", "react") - h, err := makeFileServer(root, path, "react.js") - if h != nil { - log.Printf("Serving React from %s", path) - } - return h, err -} - // makeClosureHandler returns a handler to serve Closure files. // root is either: // 1) empty: use the Closure files compiled in to the binary (if @@ -277,11 +275,7 @@ func makeClosureHandler(root, handlerName string) (http.Handler, error) { } path := filepath.Join("third_party", "closure", "lib", "closure") - fs, err := makeFileServer(root, path, filepath.Join("goog", "base.js")) - if fs != nil { - log.Printf("%v: serving Closure from disk: %s", handlerName, filepath.Join(root, path)) - } - return fs, err + return makeFileServer(root, path, filepath.Join("goog", "base.js")) } func makeFileServer(sourceRoot string, pathToServe string, expectedContentPath string) (http.Handler, error) { @@ -344,18 +338,10 @@ func wantsDetailPage(req *http.Request) bool { return httputil.IsGet(req) && httputil.PathSuffix(req) == "detail.html" } -func wantsClosure(req *http.Request) bool { +func getSuffixMatches(req *http.Request, pattern *regexp.Regexp) bool { if httputil.IsGet(req) { suffix := httputil.PathSuffix(req) - return closurePattern.MatchString(suffix) - } - return false -} - -func wantsReact(req *http.Request) bool { - if httputil.IsGet(req) { - suffix := httputil.PathSuffix(req) - return reactPattern.MatchString(suffix) + return pattern.MatchString(suffix) } return false } @@ -375,10 +361,12 @@ func (ui *UIHandler) ServeHTTP(rw http.ResponseWriter, req *http.Request) { ui.serveThumbnail(rw, req) case strings.HasPrefix(suffix, "tree/"): ui.serveFileTree(rw, req) - case wantsClosure(req): + case getSuffixMatches(req, closurePattern): ui.serveClosure(rw, req) - case wantsReact(req): - ui.serveReact(rw, req) + case getSuffixMatches(req, reactPattern): + ui.serveFromDiskOrStatic(rw, req, reactPattern, ui.fileReactHandler, reactstatic.Files) + case getSuffixMatches(req, glitchPattern): + ui.serveFromDiskOrStatic(rw, req, glitchPattern, ui.fileGlitchHandler, glitchstatic.Files) default: file := "" if m := staticFilePattern.FindStringSubmatch(suffix); m != nil { @@ -570,20 +558,21 @@ func (ui *UIHandler) serveClosure(rw http.ResponseWriter, req *http.Request) { ui.closureHandler.ServeHTTP(rw, req) } -func (ui *UIHandler) serveReact(rw http.ResponseWriter, req *http.Request) { +// serveFromDiskOrStatic matches rx against req's path and serves the match either from disk (if non-nil) or from static (embedded in the binary). +func (ui *UIHandler) serveFromDiskOrStatic(rw http.ResponseWriter, req *http.Request, rx *regexp.Regexp, disk http.Handler, static *fileembed.Files) { suffix := httputil.PathSuffix(req) - m := reactPattern.FindStringSubmatch(suffix) + m := rx.FindStringSubmatch(suffix) if m == nil { - httputil.ErrorRouting(rw, req) - return + panic("Caller should verify that rx matches") } file := m[1] - if ui.fileReactHandler != nil { + if disk != nil { req.URL.Path = "/" + file - ui.fileReactHandler.ServeHTTP(rw, req) + disk.ServeHTTP(rw, req) } else { - serveStaticFile(rw, req, reactstatic.Files, file) + serveStaticFile(rw, req, static, file) } + } // serveDepsJS serves an auto-generated Closure deps.js file. diff --git a/server/camlistored/ui/detail.css b/server/camlistored/ui/detail.css index 4363ba948..a4c14d28e 100644 --- a/server/camlistored/ui/detail.css +++ b/server/camlistored/ui/detail.css @@ -9,10 +9,17 @@ body { overflow: hidden; } -.detail-view-preview { +.detail-view-img { position: absolute; - width: auto; - height: auto; +} + +.detail-img-enter { + transition: opacity 200ms linear; + opacity: 0; +} + +.detail-img-enter.detail-img-enter-active { + opacity: 1; } .detail-view-sidebar { @@ -24,6 +31,19 @@ body { top: 0; } +.detail-view-piggy { + position: absolute; +} + +.detail-piggy-leave { + transition: opacity 200ms linear; + opacity: 1; +} + +.detail-piggy-leave.detail-piggy-leave-active { + opacity: 0; +} + /* http://www.paulirish.com/2012/box-sizing-border-box-ftw/ */ *, *:before, *:after { -moz-box-sizing: border-box; diff --git a/server/camlistored/ui/detail.html b/server/camlistored/ui/detail.html index 90a3f5e1c..3051fbe51 100644 --- a/server/camlistored/ui/detail.html +++ b/server/camlistored/ui/detail.html @@ -10,7 +10,7 @@ - + diff --git a/server/camlistored/ui/detail.js b/server/camlistored/ui/detail.js index c4e848af5..648ef028d 100644 --- a/server/camlistored/ui/detail.js +++ b/server/camlistored/ui/detail.js @@ -16,72 +16,92 @@ limitations under the License. goog.require('camlistore.AnimationLoop'); goog.require('camlistore.ServerConnection'); +goog.require('SpritedAnimation'); goog.require('goog.math.Size'); - -function cached(fn) { - var lastProps; - var lastState; - var lastVal; - return function() { - if (lastState == this.state && lastProps == this.props) { - return lastVal; - } - lastProps = this.props; - lastState = this.state; - lastVal = fn.apply(this, arguments); - return lastVal; - } -} +goog.require('goog.object'); var DetailView = React.createClass({ - PREVIEW_MARGIN: 20, + IMG_MARGIN: 20, + PIGGY_WIDTH: 88, + PIGGY_HEIGHT: 62, + + getInitialState: function() { + return { + description: null, + }; + }, componentDidMount: function(root) { var imageSize = 100; // We won't use this exact value; we only care about the aspect ratio. var connection = new camlistore.ServerConnection(this.props.config); connection.describeWithThumbnails(this.props.blobref, imageSize, function(description) { - this.setState({ + this.setState({ description: description }); }.bind(this)); }, - getPreviewSize_: cached(function() { - var meta = this.getPermanodeMeta_(); - if (!meta) { - return; - } - - var aspect = new goog.math.Size(meta.thumbnailWidth, meta.thumbnailHeight); - var available = new goog.math.Size( - this.props.width - this.getSidebarWidth_() - this.PREVIEW_MARGIN * 2, - this.props.height - this.PREVIEW_MARGIN * 2); - return aspect.scaleToFit(available); - }), - render: function() { - var description = this.state ? this.state.description : ''; + this.imgSize_ = this.getImgSize_(); return ( React.DOM.div({className:'detail-view', style: this.getStyle_()}, - React.DOM.img({className:'detail-view-preview', key:'preview', src: this.getSrc_(), style: this.getPreviewStyle_()}), + this.getImg_(), + this.getPiggy_(), React.DOM.div({className:'detail-view-sidebar', key:'sidebar', style: this.getSidebarStyle_()}, - React.DOM.pre({key:'sidebar-pre'}, JSON.stringify(description, null, 2))))); + React.DOM.pre({key:'sidebar-pre'}, JSON.stringify(this.state.description || '', null, 2))))); + }, + + getImg_: function() { + var transition = React.addons.TransitionGroup({transitionName: 'detail-img'}, []); + if (this.state.description) { + transition.props.children.push( + React.DOM.img({ + className: 'detail-view-img', + key: 'img', + src: this.getSrc_(), + style: this.getCenteredProps_(this.imgSize_.width, this.imgSize_.height) + }) + ); + } + return transition; + }, + + getPiggy_: function() { + var transition = React.addons.TransitionGroup({transitionName: 'detail-piggy'}, []); + if (!this.state.description) { + transition.props.children.push( + SpritedAnimation({ + src: 'glitch/npc_piggy__x1_walk_png_1354829432.png', + className: 'detail-view-piggy', + spriteWidth: this.PIGGY_WIDTH, + spriteHeight: this.PIGGY_HEIGHT, + sheetWidth: 8, + sheetHeight: 3, + interval: 30, + style: this.getCenteredProps_(this.PIGGY_WIDTH, this.PIGGY_HEIGHT) + })); + } + return transition; + }, + + getCenteredProps_: function(w, h) { + var avail = new goog.math.Size(this.props.width - this.getSidebarWidth_(), this.props.height); + return { + top: (avail.height - h) / 2, + left: (avail.width - w) / 2, + width: w, + height: h + } }, getSrc_: function() { - if (!this.state) { - // TODO(aa): Loading animation - return ''; - } - - var previewSize = this.getPreviewSize_(); // Only re-request the image if we're increasing in size. Otherwise, let the browser resample. - if (previewSize.height < (this.lastImageHeight || 0)) { + if (this.imgSize_.height < (this.lastImageHeight || 0)) { console.log('Not re-requesting image becasue new size is smaller than existing...'); } else { // If we re-request, ask for one bigger than we need right now, so that we're not constantly re-requesting as the browser resizes. - this.lastImageHeight = previewSize.height * 1.25; + this.lastImageHeight = this.imgSize_.height * 1.25; console.log('Requesting new image with size: ' + this.lastImageHeight); } @@ -90,6 +110,19 @@ var DetailView = React.createClass({ return uri.toString(); }, + getImgSize_: function() { + if (!this.state.description) { + return null; + } + + var meta = this.getPermanodeMeta_(); + var aspect = new goog.math.Size(meta.thumbnailWidth, meta.thumbnailHeight); + var available = new goog.math.Size( + this.props.width - this.getSidebarWidth_() - this.IMG_MARGIN * 2, + this.props.height - this.IMG_MARGIN * 2); + return aspect.scaleToFit(available); + }, + getStyle_: function() { return { width: this.props.width, @@ -97,22 +130,6 @@ var DetailView = React.createClass({ } }, - getPreviewStyle_: function() { - if (!this.state || !this.getPreviewSize_().height) { - return { - visibility: 'hidden' - } - } - - var avail = new goog.math.Size(this.props.width - this.getSidebarWidth_(), this.props.height); - return { - top: (avail.height - this.getPreviewSize_().height) / 2, - left: (avail.width - this.getPreviewSize_().width) / 2, - width: this.getPreviewSize_().width, - height: this.getPreviewSize_().height - } - }, - getSidebarStyle_: function() { return { width: this.getSidebarWidth_() @@ -124,9 +141,6 @@ var DetailView = React.createClass({ }, getPermanodeMeta_: function() { - if (!this.state) { - return null; - } return this.state.description.meta[this.props.blobref]; - } + }, }); diff --git a/server/camlistored/ui/object.js b/server/camlistored/ui/object.js new file mode 100644 index 000000000..bf4281ff1 --- /dev/null +++ b/server/camlistored/ui/object.js @@ -0,0 +1,11 @@ +/** + * Object related utilities beyond what exist in Closure. + */ +goog.provide('object'); + +function extend(o, n) { + var obj = {}; + goog.mixin(obj, o); + goog.mixin(obj, n); + return obj; +} diff --git a/server/camlistored/ui/sprited_animation.js b/server/camlistored/ui/sprited_animation.js new file mode 100644 index 000000000..5bb3be71c --- /dev/null +++ b/server/camlistored/ui/sprited_animation.js @@ -0,0 +1,28 @@ +goog.provide('SpritedAnimation'); + +goog.require('SpritedImage'); +goog.require('object'); + +var SpritedAnimation = React.createClass({ + getInitialState: function() { + return { + index: 0 + } + }, + + componentDidMount: function(root) { + this.timerId_ = window.setInterval(function() { + this.setState({ + index: ++this.state.index % (this.props.sheetWidth * this.props.sheetHeight) + }) + }.bind(this), this.props.interval); + }, + + componentWillUnmount: function() { + window.clearInterval(this.timerId_); + }, + + render: function() { + return SpritedImage(extend(this.props, {index: this.state.index})); + } +}); diff --git a/server/camlistored/ui/sprited_image.js b/server/camlistored/ui/sprited_image.js new file mode 100644 index 000000000..228fe8712 --- /dev/null +++ b/server/camlistored/ui/sprited_image.js @@ -0,0 +1,27 @@ +goog.provide('SpritedImage'); + +goog.require('goog.object'); +goog.require('goog.string'); + +goog.require('object'); + +var SpritedImage = React.createClass({ + render: function() { + return ( + React.DOM.div({className: this.props.className, style: extend(this.props.style, {overflow: 'hidden'})}, + React.DOM.img({src: this.props.src, style: this.getImgStyle_()}))); + }, + + getImgStyle_: function() { + var x = this.props.index % this.props.sheetWidth; + var y = Math.floor(this.props.index / this.props.sheetWidth); + if (y >= this.props.sheetHeight) { + throw new Error(goog.string.subs('Index %s out of range', this.props.index)); + } + return { + position: 'absolute', + left: -x * this.props.spriteWidth, + top: -y * this.props.spriteHeight + }; + } +}); diff --git a/third_party/glitch/LICENSE b/third_party/glitch/LICENSE new file mode 100644 index 000000000..7efba3b1c --- /dev/null +++ b/third_party/glitch/LICENSE @@ -0,0 +1,19 @@ +The files in here come from www.glitchthegame.com. + +License here: http://www.glitchthegame.com/public-domain-game-art/#licensing + +All files are provided by Tiny Speck under the Creative Commons CC0 1.0 +Universal License. This is a broadly permissive "No Rights Reserved" license — +you may do what you please with what we've provided. Our intention is to +dedicate these works to the public domain and make them freely available to all, +without restriction. All files are provided AS-IS. Tiny Speck cannot provide any +support to help you bring these assets into your own projects. + +Note: the Glitch logo and trademark are not among the things we are making +available under this license. Only items in the files explicitly included herein +are covered. + +There is no obligation to link or credit the works, but if you do, please link +to glitchthegame.com, our permanent "retirement" site for the game and these +assets. Of course, links/shoutouts to Tiny Speck (tinyspeck.com) and/or Slack +(slack.com) are appreciated. diff --git a/third_party/glitch/fileembed.go b/third_party/glitch/fileembed.go new file mode 100644 index 000000000..4eb1bfa53 --- /dev/null +++ b/third_party/glitch/fileembed.go @@ -0,0 +1,24 @@ +/* +Copyright 2013 Google Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +/* +#fileembed pattern .*\.png +*/ +package glitch + +import "camlistore.org/pkg/fileembed" + +var Files = &fileembed.Files{} diff --git a/third_party/glitch/npc_piggy__x1_walk_png_1354829432.png b/third_party/glitch/npc_piggy__x1_walk_png_1354829432.png new file mode 100644 index 0000000000000000000000000000000000000000..20af4ac88b75540b5c833ee6c5af1fc33a0899ab GIT binary patch literal 41980 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�pnR)^`dahw;Q^ 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 literal 0 HcmV?d00001 diff --git a/third_party/react/fileembed.go b/third_party/react/fileembed.go index a3c413e75..780885ede 100644 --- a/third_party/react/fileembed.go +++ b/third_party/react/fileembed.go @@ -15,7 +15,7 @@ limitations under the License. */ /* -#fileembed pattern .*react(\.min)?\.js$ +#fileembed pattern .*\.js$ */ package react