{"action":"created","issue":{"url":"https://api.github.com/repos/metapolator/metapolator/issues/344","labels_url":"https://api.github.com/repos/metapolator/metapolator/issues/344/labels{/name}","comments_url":"https://api.github.com/repos/metapolator/metapolator/issues/344/comments","events_url":"https://api.github.com/repos/metapolator/metapolator/issues/344/events","html_url":"https://github.com/metapolator/metapolator/issues/344","id":58770714,"number":344,"title":"Implement font export","user":{"login":"davelab6","id":261579,"avatar_url":"https://avatars.githubusercontent.com/u/261579?v=3","gravatar_id":"","url":"https://api.github.com/users/davelab6","html_url":"https://github.com/davelab6","followers_url":"https://api.github.com/users/davelab6/followers","following_url":"https://api.github.com/users/davelab6/following{/other_user}","gists_url":"https://api.github.com/users/davelab6/gists{/gist_id}","starred_url":"https://api.github.com/users/davelab6/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/davelab6/subscriptions","organizations_url":"https://api.github.com/users/davelab6/orgs","repos_url":"https://api.github.com/users/davelab6/repos","events_url":"https://api.github.com/users/davelab6/events{/privacy}","received_events_url":"https://api.github.com/users/davelab6/received_events","type":"User","site_admin":false},"labels":[{"url":"https://api.github.com/repos/metapolator/metapolator/labels/io%20/%20export","name":"io / export","color":"009800"},{"url":"https://api.github.com/repos/metapolator/metapolator/labels/Priority%20High","name":"Priority High","color":"e11d21"},{"url":"https://api.github.com/repos/metapolator/metapolator/labels/UI","name":"UI","color":"207de5"}],"state":"open","locked":false,"assignee":{"login":"felipesanches","id":213676,"avatar_url":"https://avatars.githubusercontent.com/u/213676?v=3","gravatar_id":"","url":"https://api.github.com/users/felipesanches","html_url":"https://github.com/felipesanches","followers_url":"https://api.github.com/users/felipesanches/followers","following_url":"https://api.github.com/users/felipesanches/following{/other_user}","gists_url":"https://api.github.com/users/felipesanches/gists{/gist_id}","starred_url":"https://api.github.com/users/felipesanches/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/felipesanches/subscriptions","organizations_url":"https://api.github.com/users/felipesanches/orgs","repos_url":"https://api.github.com/users/felipesanches/repos","events_url":"https://api.github.com/users/felipesanches/events{/privacy}","received_events_url":"https://api.github.com/users/felipesanches/received_events","type":"User","site_admin":false},"milestone":{"url":"https://api.github.com/repos/metapolator/metapolator/milestones/23","html_url":"https://github.com/metapolator/metapolator/milestones/0.2.0","labels_url":"https://api.github.com/repos/metapolator/metapolator/milestones/23/labels","id":728542,"number":23,"title":"0.2.0","description":"","creator":{"login":"davelab6","id":261579,"avatar_url":"https://avatars.githubusercontent.com/u/261579?v=3","gravatar_id":"","url":"https://api.github.com/users/davelab6","html_url":"https://github.com/davelab6","followers_url":"https://api.github.com/users/davelab6/followers","following_url":"https://api.github.com/users/davelab6/following{/other_user}","gists_url":"https://api.github.com/users/davelab6/gists{/gist_id}","starred_url":"https://api.github.com/users/davelab6/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/davelab6/subscriptions","organizations_url":"https://api.github.com/users/davelab6/orgs","repos_url":"https://api.github.com/users/davelab6/repos","events_url":"https://api.github.com/users/davelab6/events{/privacy}","received_events_url":"https://api.github.com/users/davelab6/received_events","type":"User","site_admin":false},"open_issues":17,"closed_issues":29,"state":"open","created_at":"2014-07-22T15:33:56Z","updated_at":"2015-04-21T15:37:19Z","due_on":"2015-04-27T04:00:00Z","closed_at":null},"comments":24,"created_at":"2015-02-24T17:18:03Z","updated_at":"2015-04-21T16:10:43Z","closed_at":null,"body":"https://github.com/metapolator/metapolator/wiki/working-UI-demo#font-export-panel\r\n\r\n![export before design](https://cloud.githubusercontent.com/assets/261579/6364114/daf8de2c-bc6f-11e4-99a9-6ecdaf0eb1f7.png)\r\n\r\n\r\n- [x] design new demo font export panel\r\n- [x] design export duration estimate\r\n- [x] design export progress indication\r\n\r\nHere's the images:\r\n\r\n![export designed](https://camo.githubusercontent.com/277cdbf8aa609b0b423a7033441055586791edfe/687474703a2f2f6d6d69776f726b732e6e65742f6d657461706f6c61746f722f64656d6f6578706f72742e706e67)\r\n\r\n![when exporting](https://camo.githubusercontent.com/c197ae032a0095cb407a7bc853c71db7c407993d/687474703a2f2f6d6d69776f726b732e6e65742f6d657461706f6c61746f722f64656d6f6578706f727470726f67726573732e706e67)\r\n\r\n- - - \r\n\r\n#### Engineering Development (@felipesanches)\r\n\r\n- [ ] using the zip io class, make it possible to export the selected instances as a downloadable zip\r\n\r\n- [ ] create a new opentype io class to make it possible to export the selected instances as a downloadable OTF binary (using https://github.com/nodebox/opentype.js)\r\n\r\n#### Front End Development(@jeroenbreen)\r\n\r\n- [ ] _In https://github.com/metapolator/metapolator/issues/347#issuecomment-75925783 the instance list is related to export, \"the instance list needs to be synced (items, scroll) with the export column (or rather, the export column is an extension of the instances list)\", thus:_ sync the items and scrolling of the instance list panel and the export list panel - the export column could even be part of the instances list panel, and merely becomes visible when the user pans to the 3rd page\r\n- [ ] Comment out the opentype items in the Fonts menu, so they do not appear at all to users"},"comment":{"url":"https://api.github.com/repos/metapolator/metapolator/issues/comments/94856082","html_url":"https://github.com/metapolator/metapolator/issues/344#issuecomment-94856082","issue_url":"https://api.github.com/repos/metapolator/metapolator/issues/344","id":94856082,"user":{"login":"davelab6","id":261579,"avatar_url":"https://avatars.githubusercontent.com/u/261579?v=3","gravatar_id":"","url":"https://api.github.com/users/davelab6","html_url":"https://github.com/davelab6","followers_url":"https://api.github.com/users/davelab6/followers","following_url":"https://api.github.com/users/davelab6/following{/other_user}","gists_url":"https://api.github.com/users/davelab6/gists{/gist_id}","starred_url":"https://api.github.com/users/davelab6/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/davelab6/subscriptions","organizations_url":"https://api.github.com/users/davelab6/orgs","repos_url":"https://api.github.com/users/davelab6/repos","events_url":"https://api.github.com/users/davelab6/events{/privacy}","received_events_url":"https://api.github.com/users/davelab6/received_events","type":"User","site_admin":false},"created_at":"2015-04-21T16:10:43Z","updated_at":"2015-04-21T16:10:43Z","body":"UFO export is close :) \r\n\r\nWhen I set up 9 instances like this:\r\n\r\n![](https://cloud.githubusercontent.com/assets/261579/7255791/906ea442-e819-11e4-94c7-ebf705063dce.png)\r\n\r\nAnd export all of them, I click export, and I get only 2 windows pop up for Save As:\r\n\r\n![screen shot 2015-04-21 at 11 53 34 am](https://cloud.githubusercontent.com/assets/261579/7256443/321d59ca-e81d-11e4-95a2-540c80ff6cd1.png)\r\n\r\nAnd I click OK on them both, and that is all that happens:\r\n\r\n![screen shot 2015-04-21 at 11 54 02 am](https://cloud.githubusercontent.com/assets/261579/7256442/31f4ad5e-e81d-11e4-8cf9-367393b2de31.png)\r\n\r\nI wonder if its possible to make a single ZIP with all the instances?\r\n\r\nAlso, the structure of the ZIPs isn't quite right. \r\n\r\nThe ZIP should have a directory structure that starts with a `/$instanceName.ufo/` so that instead of unpacking to the current directory, it unpacks into that UFO directory by default, which can be opened by a file manager's default UFO editor. \r\n\r\n```sh\r\n$ unzip instance8.zip\r\nArchive:  instance8.zip\r\nwarning:  stripped absolute path spec from /metainfo.plist\r\n extracting: metainfo.plist          \r\nwarning:  stripped absolute path spec from /fontinfo.plist\r\n extracting: fontinfo.plist          \r\nwarning:  stripped absolute path spec from /glyphs/contents.plist\r\n extracting: glyphs/contents.plist   \r\nwarning:  stripped absolute path spec from /glyphs/a.glif\r\n extracting: glyphs/a.glif           \r\nwarning:  stripped absolute path spec from /glyphs/b.glif\r\n extracting: glyphs/b.glif           \r\nwarning:  stripped absolute path spec from /glyphs/c.glif\r\n extracting: glyphs/c.glif           \r\nwarning:  stripped absolute path spec from /glyphs/d.glif\r\n extracting: glyphs/d.glif           \r\nwarning:  stripped absolute path spec from /glyphs/e.glif\r\n extracting: glyphs/e.glif           \r\nwarning:  stripped absolute path spec from /glyphs/f.glif\r\n extracting: glyphs/f.glif           \r\nwarning:  stripped absolute path spec from /glyphs/g.glif\r\n extracting: glyphs/g.glif           \r\nwarning:  stripped absolute path spec from /glyphs/h.glif\r\n extracting: glyphs/h.glif           \r\nwarning:  stripped absolute path spec from /glyphs/i.glif\r\n extracting: glyphs/i.glif           \r\nwarning:  stripped absolute path spec from /glyphs/j.glif\r\n extracting: glyphs/j.glif           \r\nwarning:  stripped absolute path spec from /glyphs/k.glif\r\n extracting: glyphs/k.glif           \r\nwarning:  stripped absolute path spec from /glyphs/l.glif\r\n extracting: glyphs/l.glif           \r\nwarning:  stripped absolute path spec from /glyphs/m.glif\r\n extracting: glyphs/m.glif           \r\nwarning:  stripped absolute path spec from /glyphs/n.glif\r\n extracting: glyphs/n.glif           \r\nwarning:  stripped absolute path spec from /glyphs/o.glif\r\n extracting: glyphs/o.glif           \r\nwarning:  stripped absolute path spec from /glyphs/p.glif\r\n extracting: glyphs/p.glif           \r\nwarning:  stripped absolute path spec from /glyphs/q.glif\r\n extracting: glyphs/q.glif           \r\nwarning:  stripped absolute path spec from /glyphs/r.glif\r\n extracting: glyphs/r.glif           \r\nwarning:  stripped absolute path spec from /glyphs/s.glif\r\n extracting: glyphs/s.glif           \r\nwarning:  stripped absolute path spec from /glyphs/t.glif\r\n extracting: glyphs/t.glif           \r\nwarning:  stripped absolute path spec from /glyphs/u.glif\r\n extracting: glyphs/u.glif           \r\nwarning:  stripped absolute path spec from /glyphs/v.glif\r\n extracting: glyphs/v.glif           \r\nwarning:  stripped absolute path spec from /glyphs/w.glif\r\n extracting: glyphs/w.glif           \r\nwarning:  stripped absolute path spec from /glyphs/x.glif\r\n extracting: glyphs/x.glif           \r\nwarning:  stripped absolute path spec from /glyphs/y.glif\r\n extracting: glyphs/y.glif           \r\nwarning:  stripped absolute path spec from /glyphs/z.glif\r\n extracting: glyphs/z.glif           \r\nwarning:  stripped absolute path spec from /glyphs/A_.glif\r\n extracting: glyphs/A_.glif          \r\nwarning:  stripped absolute path spec from /glyphs/B_.glif\r\n extracting: glyphs/B_.glif          \r\nwarning:  stripped absolute path spec from /glyphs/C_.glif\r\n extracting: glyphs/C_.glif          \r\nwarning:  stripped absolute path spec from /glyphs/D_.glif\r\n extracting: glyphs/D_.glif          \r\nwarning:  stripped absolute path spec from /glyphs/E_.glif\r\n extracting: glyphs/E_.glif          \r\nwarning:  stripped absolute path spec from /glyphs/F_.glif\r\n extracting: glyphs/F_.glif          \r\nwarning:  stripped absolute path spec from /glyphs/G_.glif\r\n extracting: glyphs/G_.glif          \r\nwarning:  stripped absolute path spec from /glyphs/H_.glif\r\n extracting: glyphs/H_.glif          \r\nwarning:  stripped absolute path spec from /glyphs/I_.glif\r\n extracting: glyphs/I_.glif          \r\nwarning:  stripped absolute path spec from /glyphs/J_.glif\r\n extracting: glyphs/J_.glif          \r\nwarning:  stripped absolute path spec from /glyphs/K_.glif\r\n extracting: glyphs/K_.glif          \r\nwarning:  stripped absolute path spec from /glyphs/L_.glif\r\n extracting: glyphs/L_.glif          \r\nwarning:  stripped absolute path spec from /glyphs/M_.glif\r\n extracting: glyphs/M_.glif          \r\nwarning:  stripped absolute path spec from /glyphs/N_.glif\r\n extracting: glyphs/N_.glif          \r\nwarning:  stripped absolute path spec from /glyphs/O_.glif\r\n extracting: glyphs/O_.glif          \r\nwarning:  stripped absolute path spec from /glyphs/P_.glif\r\n extracting: glyphs/P_.glif          \r\nwarning:  stripped absolute path spec from /glyphs/Q_.glif\r\n extracting: glyphs/Q_.glif          \r\nwarning:  stripped absolute path spec from /glyphs/R_.glif\r\n extracting: glyphs/R_.glif          \r\nwarning:  stripped absolute path spec from /glyphs/S_.glif\r\n extracting: glyphs/S_.glif          \r\nwarning:  stripped absolute path spec from /glyphs/T_.glif\r\n extracting: glyphs/T_.glif          \r\nwarning:  stripped absolute path spec from /glyphs/U_.glif\r\n extracting: glyphs/U_.glif          \r\nwarning:  stripped absolute path spec from /glyphs/V_.glif\r\n extracting: glyphs/V_.glif          \r\nwarning:  stripped absolute path spec from /glyphs/W_.glif\r\n extracting: glyphs/W_.glif          \r\nwarning:  stripped absolute path spec from /glyphs/X_.glif\r\n extracting: glyphs/X_.glif          \r\nwarning:  stripped absolute path spec from /glyphs/Y_.glif\r\n extracting: glyphs/Y_.glif          \r\nwarning:  stripped absolute path spec from /glyphs/Z_.glif\r\n extracting: glyphs/Z_.glif          \r\nwarning:  stripped absolute path spec from /glyphs/one.glif\r\n extracting: glyphs/one.glif         \r\nwarning:  stripped absolute path spec from /glyphs/two.glif\r\n extracting: glyphs/two.glif         \r\nwarning:  stripped absolute path spec from /glyphs/three.glif\r\n extracting: glyphs/three.glif       \r\nwarning:  stripped absolute path spec from /glyphs/four.glif\r\n extracting: glyphs/four.glif        \r\nwarning:  stripped absolute path spec from /glyphs/five.glif\r\n extracting: glyphs/five.glif        \r\nwarning:  stripped absolute path spec from /glyphs/six.glif\r\n extracting: glyphs/six.glif         \r\nwarning:  stripped absolute path spec from /glyphs/seven.glif\r\n extracting: glyphs/seven.glif       \r\nwarning:  stripped absolute path spec from /glyphs/eight.glif\r\n extracting: glyphs/eight.glif       \r\nwarning:  stripped absolute path spec from /glyphs/nine.glif\r\n extracting: glyphs/nine.glif        \r\nwarning:  stripped absolute path spec from /glyphs/zero.glif\r\n extracting: glyphs/zero.glif        \r\nwarning:  stripped absolute path spec from /glyphs/space.glif\r\n extracting: glyphs/space.glif       \r\nwarning:  stripped absolute path spec from /glyphs/period.glif\r\n extracting: glyphs/period.glif      \r\nwarning:  stripped absolute path spec from /glyphs/comma.glif\r\n extracting: glyphs/comma.glif       \r\nwarning:  stripped absolute path spec from /glyphs/semicolon.glif\r\n extracting: glyphs/semicolon.glif   \r\nwarning:  stripped absolute path spec from /glyphs/colon.glif\r\n extracting: glyphs/colon.glif     \r\n$ # Grrr :) \r\n$ rm -rf glyphs metainfo.plist fontinfo.plist;\r\n$ unzip -d instance8.ufo instance8.zip\r\n$ tree instance8.ufo\r\ninstance8.ufo\r\n├── fontinfo.plist\r\n├── glyphs\r\n│   ├── A_.glif\r\n│   ├── B_.glif\r\n│   ├── C_.glif\r\n│   ├── D_.glif\r\n│   ├── E_.glif\r\n│   ├── F_.glif\r\n│   ├── G_.glif\r\n│   ├── H_.glif\r\n│   ├── I_.glif\r\n│   ├── J_.glif\r\n│   ├── K_.glif\r\n│   ├── L_.glif\r\n│   ├── M_.glif\r\n│   ├── N_.glif\r\n│   ├── O_.glif\r\n│   ├── P_.glif\r\n│   ├── Q_.glif\r\n│   ├── R_.glif\r\n│   ├── S_.glif\r\n│   ├── T_.glif\r\n│   ├── U_.glif\r\n│   ├── V_.glif\r\n│   ├── W_.glif\r\n│   ├── X_.glif\r\n│   ├── Y_.glif\r\n│   ├── Z_.glif\r\n│   ├── a.glif\r\n│   ├── b.glif\r\n│   ├── c.glif\r\n│   ├── colon.glif\r\n│   ├── comma.glif\r\n│   ├── contents.plist\r\n│   ├── d.glif\r\n│   ├── e.glif\r\n│   ├── eight.glif\r\n│   ├── f.glif\r\n│   ├── five.glif\r\n│   ├── four.glif\r\n│   ├── g.glif\r\n│   ├── h.glif\r\n│   ├── i.glif\r\n│   ├── j.glif\r\n│   ├── k.glif\r\n│   ├── l.glif\r\n│   ├── m.glif\r\n│   ├── n.glif\r\n│   ├── nine.glif\r\n│   ├── o.glif\r\n│   ├── one.glif\r\n│   ├── p.glif\r\n│   ├── period.glif\r\n│   ├── q.glif\r\n│   ├── r.glif\r\n│   ├── s.glif\r\n│   ├── semicolon.glif\r\n│   ├── seven.glif\r\n│   ├── six.glif\r\n│   ├── space.glif\r\n│   ├── t.glif\r\n│   ├── three.glif\r\n│   ├── two.glif\r\n│   ├── u.glif\r\n│   ├── v.glif\r\n│   ├── w.glif\r\n│   ├── x.glif\r\n│   ├── y.glif\r\n│   ├── z.glif\r\n│   └── zero.glif\r\n└── metainfo.plist\r\n\r\n1 directory, 70 files\r\n```\r\n\r\nLooking pretty:\r\n\r\n![screen shot 2015-04-21 at 12 07 53 pm](https://cloud.githubusercontent.com/assets/261579/7256754/155e4d10-e81f-11e4-9e4f-425fdbb6fd60.png)\r\n\r\n![screen shot 2015-04-21 at 12 07 52 pm](https://cloud.githubusercontent.com/assets/261579/7256755/156a7950-e81f-11e4-91de-ec7cdc7b5765.png)\r\n\r\nHere's FontForge:\r\n\r\n```sh\r\n$ fontforge instance*.ufo;\r\nCopyright (c) 2000-2014 by George Williams. See AUTHORS for Contributors.\r\n License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>\r\n with many parts BSD <http://fontforge.org/license.html>. Please read LICENSE.\r\n Based on sources from 11:56 EDT 14-Apr-2015-ML-D.\r\n Based on source from git with hash: 71eb05d151a1fcada2f962f05e30a953c04b0e38\r\n```\r\n\r\nAlso looking pretty!\r\n\r\n![screen shot 2015-04-21 at 12 04 39 pm](https://cloud.githubusercontent.com/assets/261579/7256711/c9a0bc14-e81e-11e4-833c-0935d25558df.png)\r\n\r\n![screen shot 2015-04-21 at 12 04 55 pm](https://cloud.githubusercontent.com/assets/261579/7256712/c9a7e03e-e81e-11e4-8486-eb504ef78054.png)\r\n\r\n![screen shot 2015-04-21 at 12 04 58 pm](https://cloud.githubusercontent.com/assets/261579/7256713/c9b94fc2-e81e-11e4-93d3-ba729ce63213.png)\r\n\r\nIn Glyphs v1 it looks bad, cc @schriftgestalt\r\n\r\n![screen shot 2015-04-21 at 12 06 45 pm](https://cloud.githubusercontent.com/assets/261579/7256773/300616ca-e81f-11e4-88b1-150906b0f5db.png)\r\n\r\n![screen shot 2015-04-21 at 12 03 50 pm](https://cloud.githubusercontent.com/assets/261579/7256775/300fe204-e81f-11e4-8070-5ef8d6c00eb9.png)\r\n\r\nBut in Glyphs v2 it looks great!\r\n\r\n\r\n![screen shot 2015-04-21 at 12 10 32 pm](https://cloud.githubusercontent.com/assets/261579/7256828/6c8afdfe-e81f-11e4-936f-75d39b5fb13e.png)\r\n![screen shot 2015-04-21 at 12 09 35 pm](https://cloud.githubusercontent.com/assets/261579/7256830/6c94a19c-e81f-11e4-9f4c-67bd18f218bc.png)\r\n"}}