Improve UI performance of selecting / deselecting photo cards.
Move save_clipboard into a 0-timeout. Check checkboxes immediately instead of relying on apply_check_all / update_pagestate to make a redundant loop through everything.
This commit is contained in:
		
							parent
							
								
									7f2d463062
								
							
						
					
					
						commit
						8f9b4142a6
					
				
					 1 changed files with 44 additions and 10 deletions
				
			
		|  | @ -84,6 +84,8 @@ function apply_check(checkbox) | |||
|     checkbox.checked = photo_clipboard.clipboard.has(photo_id); | ||||
|     if (! photo_card) | ||||
|     { | ||||
|         // E.g. on the Photo page there is a checkbox for adding it to the
 | ||||
|         // clipboard, though it does not reside in a photo_card div.
 | ||||
|         return; | ||||
|     } | ||||
|     if (checkbox.checked) | ||||
|  | @ -128,16 +130,35 @@ function on_photo_select(event) | |||
|     let action; | ||||
|     if (checkbox.checked) | ||||
|     { | ||||
|         action = photo_clipboard.clipboard.add.bind(photo_clipboard.clipboard); | ||||
|         action = function(photo_div) | ||||
|         { | ||||
|             console.log("photo_card_selected"); | ||||
|             photo_clipboard.clipboard.add(photo_div.dataset.id); | ||||
|             photo_div.classList.remove("photo_card_unselected"); | ||||
|             photo_div.classList.add("photo_card_selected"); | ||||
|         } | ||||
|     } | ||||
|     else | ||||
|     { | ||||
|         action = photo_clipboard.clipboard.delete.bind(photo_clipboard.clipboard); | ||||
|         action = function(photo_div) | ||||
|         { | ||||
|             console.log("photo_card_unselected"); | ||||
|             photo_clipboard.clipboard.delete(photo_div.dataset.id); | ||||
|             photo_div.classList.remove("photo_card_selected"); | ||||
|             photo_div.classList.add("photo_card_unselected"); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     if (! checkbox.parentElement.classList.contains("photo_card")) | ||||
|     { | ||||
|         action(checkbox.dataset.photoId); | ||||
|         if (checkbox.checked) | ||||
|         { | ||||
|             photo_clipboard.clipboard.add(checkbox.dataset.photoId); | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             photo_clipboard.clipboard.delete(checkbox.dataset.photoId); | ||||
|         } | ||||
|     } | ||||
|     else if (event.shiftKey && photo_clipboard.previous_photo_select) | ||||
|     { | ||||
|  | @ -162,17 +183,17 @@ function on_photo_select(event) | |||
| 
 | ||||
|         for (const photo_div of slice) | ||||
|         { | ||||
|             action(photo_div.dataset.id); | ||||
|             action(photo_div); | ||||
|         } | ||||
|         photo_clipboard.previous_photo_select = current_photo_div; | ||||
|     } | ||||
|     else | ||||
|     { | ||||
|         const photo_div = checkbox.parentElement; | ||||
|         action(photo_div.dataset.id); | ||||
|         action(photo_div); | ||||
|         photo_clipboard.previous_photo_select = photo_div; | ||||
|     } | ||||
|     photo_clipboard.save_clipboard(); | ||||
|     setTimeout(() => photo_clipboard.save_clipboard(), 0); | ||||
| } | ||||
| 
 | ||||
| photo_clipboard.select_all_photos = | ||||
|  | @ -182,9 +203,16 @@ function select_all_photos() | |||
|     for (const photo_div of photo_divs) | ||||
|     { | ||||
|         photo_clipboard.clipboard.add(photo_div.dataset.id); | ||||
|         photo_div.classList.remove("photo_card_unselected"); | ||||
|         photo_div.classList.add("photo_card_selected"); | ||||
|         const checkbox = photo_div.getElementsByClassName("photo_card_selector_checkbox")[0]; | ||||
|         if (checkbox) | ||||
|         { | ||||
|             checkbox.checked = true; | ||||
|         } | ||||
|     photo_clipboard.apply_check_all(); | ||||
|     photo_clipboard.save_clipboard(); | ||||
|     } | ||||
|     photo_clipboard.previous_photo_select = null; | ||||
|     setTimeout(() => photo_clipboard.save_clipboard(), 0); | ||||
| } | ||||
| 
 | ||||
| photo_clipboard.unselect_all_photos = | ||||
|  | @ -194,10 +222,16 @@ function unselect_all_photos() | |||
|     for (const photo_div of photo_divs) | ||||
|     { | ||||
|         photo_clipboard.clipboard.delete(photo_div.dataset.id); | ||||
|         photo_div.classList.remove("photo_card_selected"); | ||||
|         photo_div.classList.add("photo_card_unselected"); | ||||
|         const checkbox = photo_div.getElementsByClassName("photo_card_selector_checkbox")[0]; | ||||
|         if (checkbox) | ||||
|         { | ||||
|             checkbox.checked = false; | ||||
|         } | ||||
|     } | ||||
|     photo_clipboard.apply_check_all() | ||||
|     photo_clipboard.previous_photo_select = null; | ||||
|     photo_clipboard.save_clipboard(); | ||||
|     setTimeout(() => photo_clipboard.save_clipboard(), 0); | ||||
| } | ||||
| 
 | ||||
| // Tray management /////////////////////////////////////////////////////////////////////////////////
 | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue