Improve photo contextmenu, reuse a single contextmenu element for all.
This commit is contained in:
		
							parent
							
								
									df5870502a
								
							
						
					
					
						commit
						c159dbbc0f
					
				
					 5 changed files with 64 additions and 49 deletions
				
			
		|  | @ -283,7 +283,7 @@ | ||||||
|     grid-area: toolbutton; |     grid-area: toolbutton; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| .photo_card_tools | .photo_card_contextmenu | ||||||
| { | { | ||||||
|     display: none; |     display: none; | ||||||
|     background-color: var(--color_secondary); |     background-color: var(--color_secondary); | ||||||
|  | @ -291,10 +291,10 @@ | ||||||
|     z-index: 1; |     z-index: 1; | ||||||
|     width: max-content; |     width: max-content; | ||||||
| } | } | ||||||
| .photo_card_tools.open_contextmenu | .photo_card_contextmenu.open_contextmenu | ||||||
| { | { | ||||||
|     display: initial; |     display: initial; | ||||||
|     position: fixed; |     position: absolute; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /* ########################################################################## */ | /* ########################################################################## */ | ||||||
|  |  | ||||||
|  | @ -244,17 +244,6 @@ function create(photo, view) | ||||||
|     photo_card_tags.innerText = tag_names_inner; |     photo_card_tags.innerText = tag_names_inner; | ||||||
|     photo_card.appendChild(photo_card_tags); |     photo_card.appendChild(photo_card_tags); | ||||||
| 
 | 
 | ||||||
|     const toolbutton = document.createElement("button"); |  | ||||||
|     toolbutton.className = "photo_card_toolbutton hidden"; |  | ||||||
|     toolbutton.onclick = "return cards.photos.show_tools(event);"; |  | ||||||
|     photo_card.appendChild(toolbutton); |  | ||||||
| 
 |  | ||||||
|     const photo_card_tools = document.createElement("div"); |  | ||||||
|     photo_card_tools.classList.add("photo_card_tools"); |  | ||||||
|     photo_card_tools.classList.add("contextmenu"); |  | ||||||
|     photo_card_tools.onclick = "event.stopPropagation(); return;"; |  | ||||||
|     photo_card.appendChild(photo_card_tools); |  | ||||||
| 
 |  | ||||||
|     if (photo_clipboard) |     if (photo_clipboard) | ||||||
|     { |     { | ||||||
|         const clipboard_checkbox = photo_clipboard.give_checkbox(photo_card); |         const clipboard_checkbox = photo_clipboard.give_checkbox(photo_card); | ||||||
|  | @ -284,18 +273,51 @@ function drag_drop(event) | ||||||
| { | { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| cards.photos.show_tools = | cards.photos.photo_contextmenu = null; | ||||||
| function show_tools(event) | cards.photos.set_contextmenu = | ||||||
|  | function set_contextmenu(element, build_function) | ||||||
| { | { | ||||||
|  |     element.classList.add("photo_card_contextmenu"); | ||||||
|  |     element.classList.add("contextmenu"); | ||||||
|  |     element.onclick = "event.stopPropagation(); return;"; | ||||||
|  |     cards.photos.photo_contextmenu = element; | ||||||
|  |     cards.photos.build_photo_contextmenu = build_function; | ||||||
|  |     contextmenus.hide_open_menus(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | cards.photos.right_clicked_photo = null; | ||||||
|  | cards.photos.photo_rightclick = | ||||||
|  | function photo_rightclick(event) | ||||||
|  | { | ||||||
|  |     if (["A", "IMG"].includes(event.target.tagName)) | ||||||
|  |     { | ||||||
|  |         return true; | ||||||
|  |     } | ||||||
|  |     if (cards.photos.photo_contextmenu === null) | ||||||
|  |     { | ||||||
|  |         return true; | ||||||
|  |     } | ||||||
|  |     if (event.ctrlKey || event.shiftKey || event.altKey) | ||||||
|  |     { | ||||||
|  |         return true; | ||||||
|  |     } | ||||||
|  |     const photo_card = event.target.closest(".photo_card"); | ||||||
|  |     if (! photo_card) | ||||||
|  |     { | ||||||
|  |         cards.photos.right_clicked_photo = null; | ||||||
|  |         contextmenus.hide_open_menus(); | ||||||
|  |         return true; | ||||||
|  |     } | ||||||
|  |     if (contextmenus.menu_is_open()) | ||||||
|  |     { | ||||||
|  |         contextmenus.hide_open_menus(); | ||||||
|  |     } | ||||||
|  |     cards.photos.right_clicked_photo = photo_card; | ||||||
|  |     const menu = cards.photos.photo_contextmenu; | ||||||
|  |     cards.photos.build_photo_contextmenu(photo_card, menu); | ||||||
|  |     setTimeout(() => {contextmenus.show_menu(event, menu);}, 0); | ||||||
|     event.stopPropagation(); |     event.stopPropagation(); | ||||||
|     event.preventDefault(); |     event.preventDefault(); | ||||||
|     const photo_card = event.target.closest(".photo_card"); |  | ||||||
|     const toolbox = photo_card.getElementsByClassName("photo_card_tools")[0]; |  | ||||||
|     if (toolbox.childElementCount === 0) |  | ||||||
|     { |  | ||||||
|         return; |  | ||||||
|     } |  | ||||||
|     contextmenus.show_menu(event, toolbox); |  | ||||||
|     return false; |     return false; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -36,7 +36,7 @@ function show_menu(event, menu) | ||||||
|     const over_right = Math.max(0, event.clientX + menu.offsetWidth - html.clientWidth); |     const over_right = Math.max(0, event.clientX + menu.offsetWidth - html.clientWidth); | ||||||
|     const over_bottom = Math.max(0, event.clientY + menu.offsetHeight - html.clientHeight); |     const over_bottom = Math.max(0, event.clientY + menu.offsetHeight - html.clientHeight); | ||||||
|     const left = event.clientX - over_right; |     const left = event.clientX - over_right; | ||||||
|     const top = event.clientY - over_bottom; |     const top = event.pageY - over_bottom; | ||||||
|     menu.style.left = left + "px"; |     menu.style.left = left + "px"; | ||||||
|     menu.style.top = top + "px"; |     menu.style.top = top + "px"; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -442,28 +442,29 @@ function add_album_datalist_on_load(datalist) | ||||||
| } | } | ||||||
| album_autocomplete.on_load_hooks.push(add_album_datalist_on_load); | album_autocomplete.on_load_hooks.push(add_album_datalist_on_load); | ||||||
| 
 | 
 | ||||||
| function add_photo_toolbox_entries() | function prepare_photo_contextmenu() | ||||||
| { | { | ||||||
|     const photo_cards = document.getElementsByClassName("photo_card"); |     function build_photo_contextmenu(photo, menu) | ||||||
|     for (const photo_card of photo_cards) |  | ||||||
|     { |     { | ||||||
|         const photo_id = photo_card.dataset.id; |         ; | ||||||
|         const toolbox = photo_card.getElementsByClassName("photo_card_tools")[0]; |  | ||||||
|         const toolbutton = photo_card.getElementsByClassName("photo_card_toolbutton")[0]; |  | ||||||
|         toolbutton.classList.remove("hidden"); |  | ||||||
|         const button = document.createElement("button"); |  | ||||||
|         button.innerText = "Set as Album thumbnail"; |  | ||||||
|         button.onclick = function(event) |  | ||||||
|         { |  | ||||||
|             api.albums.set_thumbnail_photo(ALBUM_ID, photo_id, common.refresh_or_alert); |  | ||||||
|         } |  | ||||||
|         toolbox.appendChild(button); |  | ||||||
|     } |     } | ||||||
|  |     const menu = document.createElement("div"); | ||||||
|  |     const set_thumbnail_button = document.createElement("button"); | ||||||
|  |     set_thumbnail_button.innerText = "Set as Album thumbnail"; | ||||||
|  |     set_thumbnail_button.onclick = function(event) | ||||||
|  |     { | ||||||
|  |         const photo_id = cards.photos.right_clicked_photo.dataset.id; | ||||||
|  |         api.albums.set_thumbnail_photo(ALBUM_ID, photo_id, common.refresh_or_alert); | ||||||
|  |     } | ||||||
|  |     menu.appendChild(set_thumbnail_button); | ||||||
|  |     document.body.appendChild(menu); | ||||||
|  |     cards.photos.set_contextmenu(menu, build_photo_contextmenu); | ||||||
| } | } | ||||||
|  | 
 | ||||||
| function on_pageload() | function on_pageload() | ||||||
| { | { | ||||||
|     photo_clipboard.register_hotkeys(); |     photo_clipboard.register_hotkeys(); | ||||||
|     add_photo_toolbox_entries(); |     prepare_photo_contextmenu(); | ||||||
| } | } | ||||||
| document.addEventListener("DOMContentLoaded", on_pageload); | document.addEventListener("DOMContentLoaded", on_pageload); | ||||||
| </script> | </script> | ||||||
|  | @ -474,11 +475,7 @@ document.addEventListener("DOMContentLoaded", on_pageload); | ||||||
| 
 | 
 | ||||||
| function create_album_form(event) | function create_album_form(event) | ||||||
| { | { | ||||||
|     const title = event.target.input_source.value; |     const title = event.target.input_source.value.trim() || undefined; | ||||||
|     if (! title) |  | ||||||
|     { |  | ||||||
|         title = undefined; |  | ||||||
|     } |  | ||||||
|     const parent_id = ALBUM_ID; |     const parent_id = ALBUM_ID; | ||||||
|     api.albums.create(title, parent_id, api.albums.callback_follow); |     api.albums.create(title, parent_id, api.albums.callback_follow); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -146,6 +146,7 @@ class="photo_card photo_card_{{view}} photo_card_unselected {%if photo.searchhid | ||||||
| ondragstart="return cards.photos.drag_start(event);" | ondragstart="return cards.photos.drag_start(event);" | ||||||
| ondragend="return cards.photos.drag_end(event);" | ondragend="return cards.photos.drag_end(event);" | ||||||
| ondragover="return cards.photos.drag_over(event);" | ondragover="return cards.photos.drag_over(event);" | ||||||
|  | oncontextmenu="return cards.photos.photo_rightclick(event);" | ||||||
| ondrop="return cards.photos.drag_drop(event);" | ondrop="return cards.photos.drag_drop(event);" | ||||||
| draggable="true" | draggable="true" | ||||||
| > | > | ||||||
|  | @ -177,11 +178,6 @@ draggable="true" | ||||||
|     {% endif %}{# if grid #} |     {% endif %}{# if grid #} | ||||||
| 
 | 
 | ||||||
|     <span class="photo_card_tags" title="{{tag_names_title}}">{{tag_names_inner}}</span> |     <span class="photo_card_tags" title="{{tag_names_title}}">{{tag_names_inner}}</span> | ||||||
| 
 |  | ||||||
|     {# This button should be unhidden by any page that inserts toolbox items #} |  | ||||||
|     <button class="photo_card_toolbutton hidden" onclick="return cards.photos.show_tools(event);"></button> |  | ||||||
|     <div class="photo_card_tools" onclick="event.stopPropagation(); return;"> |  | ||||||
|     </div> |  | ||||||
| </div> | </div> | ||||||
| 
 | 
 | ||||||
| {% endmacro %} | {% endmacro %} | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue