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); |     checkbox.checked = photo_clipboard.clipboard.has(photo_id); | ||||||
|     if (! photo_card) |     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; |         return; | ||||||
|     } |     } | ||||||
|     if (checkbox.checked) |     if (checkbox.checked) | ||||||
|  | @ -128,16 +130,35 @@ function on_photo_select(event) | ||||||
|     let action; |     let action; | ||||||
|     if (checkbox.checked) |     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 |     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")) |     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) |     else if (event.shiftKey && photo_clipboard.previous_photo_select) | ||||||
|     { |     { | ||||||
|  | @ -162,17 +183,17 @@ function on_photo_select(event) | ||||||
| 
 | 
 | ||||||
|         for (const photo_div of slice) |         for (const photo_div of slice) | ||||||
|         { |         { | ||||||
|             action(photo_div.dataset.id); |             action(photo_div); | ||||||
|         } |         } | ||||||
|         photo_clipboard.previous_photo_select = current_photo_div; |         photo_clipboard.previous_photo_select = current_photo_div; | ||||||
|     } |     } | ||||||
|     else |     else | ||||||
|     { |     { | ||||||
|         const photo_div = checkbox.parentElement; |         const photo_div = checkbox.parentElement; | ||||||
|         action(photo_div.dataset.id); |         action(photo_div); | ||||||
|         photo_clipboard.previous_photo_select = photo_div; |         photo_clipboard.previous_photo_select = photo_div; | ||||||
|     } |     } | ||||||
|     photo_clipboard.save_clipboard(); |     setTimeout(() => photo_clipboard.save_clipboard(), 0); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| photo_clipboard.select_all_photos = | photo_clipboard.select_all_photos = | ||||||
|  | @ -182,9 +203,16 @@ function select_all_photos() | ||||||
|     for (const photo_div of photo_divs) |     for (const photo_div of photo_divs) | ||||||
|     { |     { | ||||||
|         photo_clipboard.clipboard.add(photo_div.dataset.id); |         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 = | photo_clipboard.unselect_all_photos = | ||||||
|  | @ -194,10 +222,16 @@ function unselect_all_photos() | ||||||
|     for (const photo_div of photo_divs) |     for (const photo_div of photo_divs) | ||||||
|     { |     { | ||||||
|         photo_clipboard.clipboard.delete(photo_div.dataset.id); |         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.previous_photo_select = null; | ||||||
|     photo_clipboard.save_clipboard(); |     setTimeout(() => photo_clipboard.save_clipboard(), 0); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // Tray management /////////////////////////////////////////////////////////////////////////////////
 | // Tray management /////////////////////////////////////////////////////////////////////////////////
 | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue