]>
git.scottworley.com Git - picsort/blob - picsorter.js
2 if ("picsorter_picinfo" in localStorage
) {
3 picinfo
= JSON
.parse(localStorage
.picsorter_picinfo
);
5 $.each(files
, function(i
, f
) {
10 function save_picinfo() {
11 localStorage
.picsorter_picinfo
= JSON
.stringify(picinfo
);
19 function endsWith(str
, suffix
) {
20 return str
.indexOf(suffix
, str
.length
- suffix
.length
) !== -1;
23 function stripFromEnd(str
, suffix
) {
24 if (endsWith(str
, suffix
)) {
25 return str
.substr(0, str
.length
- suffix
.length
);
32 if (endsWith(files
[input_index
], ".NEF")) {
33 if ("exposure" in picinfo
[files
[input_index
]]) {
34 exposure
= picinfo
[files
[input_index
]].exposure
;
36 picinfo
[files
[input_index
]].exposure
= exposure
;
39 display_filename
= zoom
+ exposure
+ "/" + stripFromEnd(files
[input_index
], ".NEF") + ".jpeg";
41 display_filename
= zoom
+ files
[input_index
];
44 $pic
.on("load", function() {
45 $pic
.removeClass("rot90 rot180 rot270");
46 if ("rotate" in picinfo
[files
[input_index
]]) {
47 $pic
.addClass("rot" + picinfo
[files
[input_index
]].rotate
);
50 $pic
.attr("src", display_filename
);
53 function say(message
) {
54 $("#message").text(message
).removeClass("fade");
55 setTimeout(function() { $("#message").addClass("fade"); }, 100);
58 say(input_index
+ " " + (picinfo
[files
[input_index
]].name
|| ""));
61 function toggle_zoom() {
70 function move_by_filter(direction
, filter
) {
71 // Keep moving in direction until filter is satisfied
72 var new_index
= input_index
;
74 var next
= new_index
+ direction
;
79 if (next
>= files
.length
) {
84 if (filter(new_index
)) {
88 input_index
= new_index
;
92 function move(direction
) {
93 move_by_filter(direction
, function() { return true; });
95 function move_to_begenning() {
96 move_by_filter(-1, function(i
) { return i
== 0; });
98 function move_to_end() {
99 move_by_filter(1, function(i
) { return i
== files
.length
- 1; });
101 function move_to_nondeleted(direction
) {
102 move_by_filter(direction
, function(i
) {
103 return !("deleted" in picinfo
[files
[i
]]); });
105 function move_to_unnamed(direction
) {
106 move_by_filter(direction
, function(i
) {
107 return !("deleted" in picinfo
[files
[i
]]) &&
108 !("name" in picinfo
[files
[i
]]); });
111 function mark_deleted(method
) {
112 picinfo
[files
[input_index
]].deleted
= method
;
117 function mark_not_deleted() {
118 delete picinfo
[files
[input_index
]].deleted
;
123 function say_exposure() {
124 if (!endsWith(files
[input_index
], ".NEF")) {
125 say("Exposure adjustment not available");
128 var display_exposure
= (exposure
/ 4) - 3.5;
129 say((display_exposure
>= 0 ? "+" : "") + display_exposure
);
132 function change_exposure(amount
) {
133 if (!endsWith(files
[input_index
], ".NEF")) {
134 say("Exposure adjustment not available");
138 picinfo
[files
[input_index
]].exposure
= exposure
;
145 var rotation
= picinfo
[files
[input_index
]].rotate
|| 0;
146 rotation
= (rotation
+ 90) % 360;
147 if (rotation
> 1e-5) {
148 picinfo
[files
[input_index
]].rotate
= rotation
;
150 delete picinfo
[files
[input_index
]].rotate
;
157 function set_name(name
) {
159 picinfo
[files
[input_index
]].name
= name
;
161 say("Named " + name
);
166 function set_name_from_form() {
167 var name_input
= $("#name").hide().get(0);
168 set_name(name_input
.value
);
169 name_input
.value
= "";
172 function shell_escape(x
) {
173 return x
.replace(/'/g, "'\\''");
176 function show_commands() {
178 $.each(files, function(i, f) {
179 if ("name
" in picinfo[f] && picinfo[f].name.length > 0) {
180 var escaped_filename = "'" + shell_escape(f) + "'";
181 if (picinfo[f].deleted == "deleted
") {
182 commands.push("shred
-u
" + escaped_filename);
185 if (picinfo[f].deleted == "extra
") {
186 commands.push("mv
" + escaped_filename + " \"$EXTRADIR
\"");
189 var command = ["pic
-mv
"];
190 if ("exposure
" in picinfo[f]) {
191 command.push("-e
" + picinfo[f].exposure);
193 if ("rotate
" in picinfo[f]) {
194 command.push("-r
" + picinfo[f].rotate);
196 command.push(escaped_filename);
197 command.push("'" + shell_escape(picinfo[f].name) + "'");
198 commands.push(command.join(" "));
202 $("#shell_out
").text(commands.join("\n")).show();
206 $("#name
").hide().on("keyup
", function(e) { e.which == 13 && set_name_from_form(); });
207 move_to_nondeleted(1);
210 Mousetrap.bind('z', toggle_zoom);
211 Mousetrap.bind('Z', function() { $("#pic
").toggleClass("fit_view
"); });
212 Mousetrap.bind(['n', 'l'], function() { move_to_nondeleted(1); });
213 Mousetrap.bind(['p', 'h'], function() { move_to_nondeleted(-1); });
214 Mousetrap.bind(['N', 'L'], function() { move_to_unnamed(1); });
215 Mousetrap.bind(['P', 'H'], function() { move_to_unnamed(-1); });
216 Mousetrap.bind(['m n', 'm l'], function() { move(1); });
217 Mousetrap.bind(['m n', 'm h'], function() { move(-1); });
218 Mousetrap.bind(['b', 'k'], function() { change_exposure(1); });
219 Mousetrap.bind(['d', 'j'], function() { change_exposure(-1); });
220 Mousetrap.bind('0', move_to_begenning);
221 Mousetrap.bind('$', move_to_end);
222 Mousetrap.bind('x', function(){ mark_deleted("deleted
"); });
223 Mousetrap.bind('X', mark_not_deleted);
224 Mousetrap.bind('e', function(){ mark_deleted("extra
"); });
225 Mousetrap.bind('E', mark_not_deleted);
226 Mousetrap.bind('r', rotate);
227 Mousetrap.bind('i', announce);
228 Mousetrap.bind('f', function() { say(files[input_index]); });
229 Mousetrap.bind('B', function() { say_exposure(); });
230 Mousetrap.bind('c', function() { $("#name
").show().focus(); return false; });
231 Mousetrap.bind('C', function() { if (last_name) { set_name(last_name); } });
232 Mousetrap.bind('%', function() { say((100 * input_index / files.length).toFixed(2) + "%"); });
233 Mousetrap.bind('!', show_commands);
234 Mousetrap.bind('esc', function() { $("#name
").hide(); $("#shell_out
").hide(); });
236 function clean_picinfo() {
238 $.each(files, function(i, f) {
239 files_index[f] = true;
242 if (!files_index[f]) {
248 function undelete_all() {
250 delete picinfo[f].deleted;
253 say("Undeleted everything
");