-rw-r--r-- | content/fireflix-panel.xul | 9 | ||||
-rw-r--r-- | content/fireflix.js | 8 |
2 files changed, 13 insertions, 4 deletions
diff --git a/content/fireflix-panel.xul b/content/fireflix-panel.xul index 2356c82..b2ca7dc 100644 --- a/content/fireflix-panel.xul +++ b/content/fireflix-panel.xul @@ -59,236 +59,237 @@ </commandset> <commandset id="cmdset_sets"> <command id="cmd_refresh_sets" label="&panel.sets.cmd_refresh_sets;" oncommand="fireflix.on_refresh_sets()" /> <command id="cmd_set_props" label="&panel.sets.cmd_properties;" oncommand="fireflix.on_set_props()" disabled="true" /> </commandset> <popupset> <popup id="sets_menu"> <menuitem command="cmd_set_props"/> <menuitem command="cmd_refresh_sets"/> <menuseparator/> <menu label="&panel.sets.generate_html;" id="sets_html_menu"/> </popup> </popupset> <commandset id="cmdset_uploads"> <command id="cmd_uploads_clear" label="&panel.uploads.clear.label;" oncommand="fireflix.uploads.on_clear()" /> <command id="cmd_uploads_upload" label="&panel.uploads.upload.label;" oncommand="fireflix.uploads.on_upload()" /> <command id="cmd_uploads_remove" label="&panel.uploads.remove.label;" oncommand="fireflix.uploads.on_remove()" /> <command id="cmd_uploads_add" label="&panel.uploads.add.label;" oncommand="fireflix.uploads.on_add()" /> </commandset> <popupset> <popup id="uploads_menu"> <menuitem command="cmd_uploads_add"/> <menuitem command="cmd_uploads_clear"/> <menuitem command="cmd_uploads_remove"/> <menuseparator/> <menuitem command="cmd_uploads_upload"/> <menuseparator/> <menu label="&panel.uploads.generate_html;" id="uploads_html_menu"/> </popup> </popupset> <vbox class="wholething" flex="1"> <groupbox context="auth_menu"> <caption label="&panel.auth_info;"/> <hbox> <vbox pack="center" flex="1"> <label id="auth_info" value="&panel.no_auth_info;" disabled="true" crop="end"/> </vbox> <button class="lean" id="b_auth" command="cmd_auth_auth"/> <button class="lean" id="b_auth_done" command="cmd_auth_done" hidden="true"/> <button class="lean" command="cmd_auth_open_flickr" tooltiptext="&panel.auth.flickr.tip;"/> <button class="lean" command="cmd_help"/> </hbox> </groupbox> <tabbox flex="1" id="fireflix_tabs"> <tabs> <tab label="&panel.tabs.search;"/> <tab label="&panel.tabs.sets;"/> <tab label="&panel.tabs.tags;" hidden="true"/> <!-- TODO: --> <tab id="tab_upload" label="&panel.tabs.upload;"/> </tabs> <tabpanels flex="1"> <tabpanel id="tabpanel_search" flex="1"> <vbox flex="1"> <groupbox class="search_params" orient="vertical" onkeypress="if(event.keyCode==event.DOM_VK_RETURN) fireflix.foundphotos.search_photos()"> <hbox> <vbox pack="center"> <label control="search_for" value="&panel.search.search_for.label;" accesskey="s"/> </vbox> <textbox id="search_for" flex="1"/> </hbox> <hbox> <checkbox id="search_tags" label="&panel.search.mode.tagsonly.label;" tooltiptext="&panel.search.mode.tagsonly.tip;" checked="false" accesskey="t" /> <checkbox id="search_mine" label="&panel.search.mode.mine.label;" checked="true" accesskey="m"/> <spacer flex="1"/> <button class="lean" command="cmd_search"/> </hbox> </groupbox> <hbox> <button class="lean" command="cmd_search_prev_page"/> <spacer flex="1"/> <label id="search_page" hidden="true"/> <spacer flex="1"/> <button class="lean" command="cmd_search_next_page"/> </hbox> <tree id="searchresults" rows="2" flex="1" onselect="fireflix.foundphotos.on_select()" ondblclick="fireflix.foundphotos.on_cmd_open(event)" - onkeypress="if(event.keyCode==event.DOM_VK_RETURN) - fireflix.foundphotos.on_cmd_open(event)"> + onkeypress="if(event.keyCode==event.DOM_VK_RETURN) fireflix.foundphotos.on_cmd_open(event)"> <treecols> <treecol id="sr_title" label="&panel.search.col.title.label;" flex="2" crop="end" align="start" /> </treecols> <treechildren/> </tree> <groupbox id="searchresult_props" orient="horizontal" hidden="true"> <vbox width="100" pack="center"> <hbox pack="center"> <image id="search_photo" ondblclick="fireflix.foundphotos.on_cmd_open(event)"/> </hbox> </vbox> <vbox flex="1"> <label id="searchresult_title" crop="end"/> <hbox flex="1" pack="center"> <div flex="1" id="searchresult_description" xmlns="http://www.w3.org/1999/xhtml"/> </hbox> <hbox pack="end"> <button command="cmd_search_open"/> </hbox> </vbox> </groupbox> </vbox> </tabpanel> <tabpanel id="tabpanel_sets" flex="1" onkeypress="if(event.keyCode==event.DOM_VK_RETURN) document.getElementById('setphotos').focus()"> <vbox flex="1"> <tree id="setslist" rows="2" onselect="fireflix.photosets.on_select()" flex="1" context="sets_menu" > <treecols> <treecol id="sl_name" label="&panel.sets.name.label;" flex="4" crop="end" align="start" tooltiptext="&panel.sets.name.tip;"/> <splitter class="tree-splitter" /> <treecol id="sl_photos" label="&panel.sets.photos.label;" flex="1" align="end" tooltiptext="&panel.sets.photos.tip;" /> </treecols> <treechildren/> </tree> <hbox> <button command="cmd_refresh_sets" /> <button command="cmd_set_props" /> </hbox> <tree id="setphotos" rows="2" onselect="fireflix.photoset.on_select()" - flex="1"> + flex="1" ondblclick="fireflix.photoset.on_cmd_open(event)" + onkeypress="if(event.keyCode==event.DOM_VK_RETURN) fireflix.photoset.on_cmd_open(event)"> <treecols> <treecol id="sp_title" label="&panel.setphotos.title.label;" flex="1" crop="end" align="start" tooltiptext="&panel.setphotos.title.tip;" /> <splitter class="tree-splitter" /> <treecol id="sp_taken" label="&panel.setphotos.taken.label;" crop="end" align="start" tooltiptext="&panel.setphotos.taken.tip;" hidden="true" /> <treecol id="sp_upload" label="&panel.setphotos.upload.label;" crop="end" align="start" tooltiptext="&panel.setphotos.upload.tip;" hidden="true" /> </treecols> <treechildren/> </tree> <groupbox id="set_photo_props" orient="horizontal"> <vbox width="100" pack="center"> <hbox pack="center"> - <image id="set_photo" hidden="true"/> + <image id="set_photo" hidden="true" + ondblclick="fireflix.photoset.on_cmd_open(event)" /> </hbox> </vbox> <spacer flex="1"/> </groupbox> </vbox> </tabpanel> <tabpanel id="tabpanel_tags"> <listbox id="tagslist" rows="8" flex="1"> <listhead> <listheader label="&panel.tagslist.tag.label;"/> </listhead> <listcols> <listcol flex="1"/> </listcols> </listbox> </tabpanel> <tabpanel id="tabpanel_upload"> <vbox flex="1"> <tree id="uploadlist" rows="2" flex="1" onselect="fireflix.uploads.selectionChanged()" context="uploads_menu"> <treecols> <treecol id="up_file" label="&panel.uploadlist.file.label;" flex="4" crop="start" align="start"/> <splitter class="tree-splitter" /> <treecol id="up_title" label="&panel.uploadlist.title.label;" flex="5" crop="end" align="start" /> <splitter class="tree-splitter" /> <treecol id="up_status" label="&panel.uploadlist.status.label;" flex="1" crop="end" align="start" /> </treecols> <treechildren/> </tree> <progressmeter id="upload_progress" mode="undetermined" hidden="true" /> <groupbox id="upload_file_props" orient="horizontal" hidden="true"> <image id="upload_file_preview" width="100" height="100" /> <grid flex="1"> <columns> <column/> <column flex="1"/> </columns> <rows> <row> <label control="upload_filename" value="&panel.upload_props.filename.label;" /> <textbox id="upload_filename" oninput="fireflix.uploads.propsToSel('filename')"/> </row> <row> <label control="upload_title" value="&panel.upload_props.title.label;" /> <textbox id="upload_title" oninput="fireflix.uploads.propsToSel('title')"/> </row> <row> <label control="uplod_tags" value="&panel.upload_props.tags.label;" /> <textbox id="upload_tags" oninput="fireflix.uploads.propsToSel('tags')"/> </row> <!-- TODO: description, public, friend, family --> </rows> </grid> </groupbox> <hbox> <button class="lean" command="cmd_uploads_add" /> <spacer flex="1"/> <button class="lean" command="cmd_uploads_remove" /> <spacer flex="1"/> <button class="lean" command="cmd_uploads_clear" /> </hbox> <hbox pack="center"> <button command="cmd_uploads_upload" flex="1"/> </hbox> </vbox> </tabpanel> </tabpanels> </tabbox> </vbox> </page> diff --git a/content/fireflix.js b/content/fireflix.js index 0f51397..2ee408f 100644 --- a/content/fireflix.js +++ b/content/fireflix.js @@ -68,192 +68,200 @@ var fireflix = { _this.flickr.save_token(); _this.refresh_stuff(); _this.set_auth_state(_this.flickr.token,false); _this.auth_info.value = _this.flickr.user.fullname+' ['+_this.flickr.user.username+']'; }, function(x,s,c,m) { _this.set_auth_state(_this.flickr.token,false); /* XXX: no reset token? */ _this.flickr_failure(x,s,c,m); } ); }, on_cmd_auth_unauth: function() { this.flickr.reset_token(); this.set_auth_state(false,false); }, refresh_sets: function() { this.photosets.refresh_sets(); }, refresh_stuff: function() { this.refresh_sets(); this.refresh_user_tags(); }, /* photoset treeview */ photoset: { photos: new Array(), fireflix: null, init: function(f) { this.fireflix = f; pull_elements(this,document,[ 'set_photo' ]); document.getElementById('setphotos').view = this; }, rowCount: 0, getCellText: function(r,c) { var p = this.photos[r]; if(c.id=='sp_title') return p.title; if(c.id=='sp_taken') return p.datetaken; if(c.id=='sp_upload') { var du = new Date(p.dateupload*1000); var rv = du.getFullYear()+'-'+(du.getMonth()+1)+'-'+du.getDate() +' '+ du.getHours()+':'+du.getMinutes()+':'+du.getSeconds(); return rv.replace(/(\D)(\d)(\D)/,'$10$2$3'); } return c.id; }, setTree: function(t) { this.tree = t }, isContainer: function(r) { return false; }, isSeparator: function(r) { return false; }, isSorted: function(r) { return false; }, getLevel: function(r) { return 0; }, getImageSrc: function(r,c) { return null }, getRowProperties: function(r,p) {}, getCellProperties: function(cid,cel,p) {}, getColumnProperties: function(cid,cel,p) { }, cycleHeader: function(cid,e) { }, getParentIndex: function(r) { return -1; }, drop: function(r,o) { }, canDropBeforeAfter: function(r,b) { return false }, importXPR: function(xp) { this.tree.beginUpdateBatch(); this.photos = new Array(); var n; while(n=xp.iterateNext()) { this.photos.push(new Photo(n)); } this.rowCount = this.photos.length; this.tree.endUpdateBatch(); }, load_photos: function(psid) { var _this = this; this.fireflix.flickr.api_call( { method: 'flickr.photosets.getPhotos', auth_token: 'default', photoset_id: psid, extras: 'license,date_upload,date_taken,owner_name,icon_server,original_format,last_update' }, function(xr) { var x = xr.responseXML; var xp = x.evaluate( '/rsp/photoset/photo', x, null, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null ); _this.importXPR(xp); }, function(x,s,c,m) { _this.fireflix.flickr_failure(x,s,c,m); } ); }, on_select: function() { if(this.selection.count==1) { var p = this.photos[this.selection.currentIndex]; this.set_photo.src = this.fireflix.flickr.get_photo_url(p.server,p.id,p.secret,'t'); this.set_photo.hidden = false; }else{ this.set_photo.hidden = true; } + }, + on_cmd_open: function(ev) { + if(this.selection.currentIndex<0) + return; + var p = this.photos[this.selection.currentIndex]; + if(!p.id) + return; + this.fireflix.openTab(this.fireflix.flickr.make_photo_url(p,'p')); } }, /* photosets treeview */ photosets: { sets: new Array(), fireflix: null, init: function(f) { this.fireflix = f; document.getElementById('setslist').view = this; }, rowCount: 0, getCellText: function(r,c) { var s = this.sets[r]; if(c.id=='sl_name') return s.title; if(c.id=='sl_photos') return s.photos; return c.id; }, setTree: function(t) { this.tree = t }, isContainer: function(r) { return false; }, isSeparator: function(r) { return false; }, isSorted: function() { return false; }, getLevel: function(r) { return 0; }, getImageSrc: function(r,c) { return null }, getRowProperties: function(r,p) {}, getCellProperties: function(cid,cel,p) { }, getColumnProperties: function(cid,cel,p) { }, cycleHeader: function(cid,e) { }, getParentIndex: function(r) { return -1; }, drop: function(r,o) { }, canDropBeforeAfter: function(r,b) { return false }, importXPR: function(xp) { this.tree.beginUpdateBatch(); this.sets = new Array(); var n; while(n=xp.iterateNext()) { this.sets.push(new Photoset(n)); } this.rowCount = this.sets.length; this.tree.endUpdateBatch(); }, refresh_sets: function() { var _this = this; this.fireflix.flickr.api_call( { method: 'flickr.photosets.getList', auth_token: 'default' }, function(xr) { var x = xr.responseXML; var xp = x.evaluate( '/rsp/photosets/photoset', x, null, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null ); _this.importXPR(xp); }, function(x,s,c,m) { _this.fireflix.flickr_failure(x,s,c,m); } ); }, on_select: function() { if(this.selection.count==1) { this.fireflix.cmd_set_props.setAttribute('disabled','false'); var s = this.sets[this.selection.currentIndex]; this.fireflix.photoset.load_photos(s.id); }else{ this.fireflix.cmd_set_props.setAttribute('disabled','true'); } } }, refresh_user_tags: function() { var lb = document.getElementById('tagslist'); var _this = this; this.flickr.api_call( { method: 'flickr.tags.getListUser', auth_token: 'default', }, function(xr) { var x = xr.responseXML; var xp = x.evaluate( '/rsp/who/tags/tag', x, null, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null ); // TODO: clear list var n; while(n=xp.iterateNext()) { lb.appendItem(n.firstChild.nodeValue); } }, function(x,s,c,m) { _this.flickr_failure(x,s,c,m); } ); }, uploadObserver: { fireflix: null, init: function(f) { this.fireflix = f; }, |