no more fake windowing system, I guess?
This commit is contained in:
		
							parent
							
								
									8ba5d1bb4a
								
							
						
					
					
						commit
						36fb6ce52e
					
				
					 5 changed files with 55 additions and 200 deletions
				
			
		
							
								
								
									
										5
									
								
								gui/popup_r.htm
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								gui/popup_r.htm
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,5 @@ | ||||||
|  | <html> | ||||||
|  |   <head> | ||||||
|  |     <script src="scripts/popup_r.JS" type="module"></script> | ||||||
|  |   </head> | ||||||
|  | </html> | ||||||
							
								
								
									
										14
									
								
								gui/scripts/popup_r.JS
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								gui/scripts/popup_r.JS
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,14 @@ | ||||||
|  | import {windowman} from './windowman.JS'; | ||||||
|  | 
 | ||||||
|  | function redirect() { | ||||||
|  |   new windowman(`gui/popup.htm`); | ||||||
|  | 
 | ||||||
|  |   window.close(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | function main() { | ||||||
|  |   redirect(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | main(); | ||||||
							
								
								
									
										16
									
								
								gui/scripts/settings_r.JS
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								gui/scripts/settings_r.JS
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,16 @@ | ||||||
|  | // Open the settings in a pop-up window.
 | ||||||
|  | 
 | ||||||
|  | import {windowman} from './windowman.JS'; | ||||||
|  | 
 | ||||||
|  | function redirect() { | ||||||
|  |   new windowman(`gui/settings.htm`); | ||||||
|  | 
 | ||||||
|  |   window.close(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | function main() { | ||||||
|  |   redirect(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | main(); | ||||||
|  | @ -3,7 +3,7 @@ Window management */ | ||||||
| 
 | 
 | ||||||
| import texts from "./read.JS"; | import texts from "./read.JS"; | ||||||
| 
 | 
 | ||||||
| export default class windowman { | class windowman { | ||||||
|      /* Initialize the window frame. */ |      /* Initialize the window frame. */ | ||||||
| 	static prepare() { | 	static prepare() { | ||||||
|           try { |           try { | ||||||
|  | @ -13,206 +13,21 @@ export default class windowman { | ||||||
|                $(`head`).append(`<script type="module" src="${UI.script}"></script>`); |                $(`head`).append(`<script type="module" src="${UI.script}"></script>`); | ||||||
|           } catch(error) { |           } catch(error) { | ||||||
|                console.error(texts.localized(`error_fileNotFound`, [error])); |                console.error(texts.localized(`error_fileNotFound`, [error])); | ||||||
|           }; |           } | ||||||
| 	} |  | ||||||
| 
 | 
 | ||||||
| 	/* | 					// Prevent scaling, similar to a real window. 
 | ||||||
| 	Updates an interface element. | 					$(`head`).append(`<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />`); | ||||||
| 
 |  | ||||||
| 	@param {string} interface_element the element to change |  | ||||||
| 	@param {string} modified_content the replacement of its content |  | ||||||
| 	@param {int} method Do you want to replace or just add? Type 0 or 1, respectively. |  | ||||||
| 	@return {string} the HTML content |  | ||||||
| 	*/ |  | ||||||
| 	update(interface_element, modified_content, method = 0) { |  | ||||||
| 		if (method > 0) { |  | ||||||
| 			$(`#${interface_element['ID']}`).append(modified_content); |  | ||||||
| 		} else if (method < 0) { |  | ||||||
| 			$(`#${interface_element['ID']}`).prepend(modified_content); |  | ||||||
| 		} else { |  | ||||||
| 			$(`#${interface_element['ID']}`).html(modified_content); |  | ||||||
| 		} |  | ||||||
| 		 |  | ||||||
| 		return ($(`#${interface_element['ID']}`).html()); |  | ||||||
| 	}; |  | ||||||
| 
 |  | ||||||
| 	/* |  | ||||||
| 	Inserts an interface element. |  | ||||||
| 
 |  | ||||||
| 	@param {string} element_ID the ID of the element to be injected |  | ||||||
| 	@param {string} element_name the colloquial name of this element |  | ||||||
| 	@param {string} parent_element_name the parent element's colloquial name |  | ||||||
| 	@param {string} element_type the type of this element to insert |  | ||||||
| 	@param {string} element_content the content of this new element |  | ||||||
| 	@param {array} element_class the class of this element |  | ||||||
| 	@param {dictionary} element_properties the element's properties |  | ||||||
| 	@return {string} the element ID |  | ||||||
| 	*/ |  | ||||||
| 	inject(element_ID, element_name, parent_element_name, element_type = `div`, element_class = [], element_content = ``, element_properties = {}) { |  | ||||||
|           let element_injection = {}; |  | ||||||
| 		 |  | ||||||
|           // If no element ID is provided, create a random ID as well. 
 |  | ||||||
| 		if (!element_ID) { |  | ||||||
| 			element_ID = (Math.floor((Math.random())**(-3))).toString(); |  | ||||||
|                element_injection[`ID`] = (((parent_element_name) ? parent_element_name[`ID`] : this[`ID`]).concat(`_`)).concat(element_ID); |  | ||||||
| 		} else { |  | ||||||
|                element_injection[`ID`] = element_ID; |  | ||||||
|           }; |  | ||||||
| 		 |  | ||||||
| 		// Prepare for injection. 
 |  | ||||||
| 		element_injection[`type`] = element_type; |  | ||||||
| 		if (element_properties) {element_injection[`properties`] = element_properties}; |  | ||||||
| 		if (element_class) {element_injection[`class`] = element_class;} |  | ||||||
| 		 |  | ||||||
| 		// Add it to this window's properties. 
 |  | ||||||
| 		if (parent_element_name) { |  | ||||||
| 			parent_element_name[element_name] = element_injection; |  | ||||||
| 		} else { |  | ||||||
| 			this[element_name] = element_injection; |  | ||||||
| 		} |  | ||||||
| 		 |  | ||||||
| 		// Inject the element. 
 |  | ||||||
| 		$(`#`.concat(((parent_element_name) ? parent_element_name : this)[`ID`]) ).append(`<${element_injection['type']} id=${element_injection['ID']}> </${element_injection['type']}>`) |  | ||||||
| 		 |  | ||||||
| 		// Now add the classes. 
 |  | ||||||
| 		if (element_injection[`class`]) { |  | ||||||
| 			(element_injection[`class`]).forEach((class_name) => { |  | ||||||
| 				$(`#`.concat(((parent_element_name) ? parent_element_name[element_name] : this[element_name])[`ID`])).addClass(class_name); |  | ||||||
| 			}); |  | ||||||
| 		}; |  | ||||||
| 		 |  | ||||||
| 		if (element_injection[`properties`]) { |  | ||||||
| 			(Object.keys(element_injection[`properties`])).forEach((property_name) => { |  | ||||||
| 				$(`#`.concat(((parent_element_name) ? parent_element_name[element_name] : this[element_name])[`ID`])).attr(property_name, element_injection[`properties`][property_name]); |  | ||||||
| 			}); |  | ||||||
| 		} |  | ||||||
| 		 |  | ||||||
| 		// Add the content. 
 |  | ||||||
| 		$(`#`.concat(element_injection[`ID`])).html(element_content); |  | ||||||
| 		 |  | ||||||
| 		// Return the content. 
 |  | ||||||
| 		return(element_injection[`ID`]); |  | ||||||
| 	}; |  | ||||||
| 	 |  | ||||||
| 	 |  | ||||||
| 	/* The following are reserved keywords in colloquial names:  |  | ||||||
| 		ID, properties, type, operation |  | ||||||
| 	*/ |  | ||||||
| 
 |  | ||||||
| 	/* |  | ||||||
| 	Creates a window frame within the specified element. |  | ||||||
| 
 |  | ||||||
| 	@param {string} element_target the element name to build into |  | ||||||
| 	@param {string} element_ID the target element ID; otherwise, a random ID is generated |  | ||||||
| 	@param {string} window_title the window's title |  | ||||||
| 	@param {dictionary} window_buttons the window buttons |  | ||||||
| 	*/ |  | ||||||
| 	constructor(element_target, element_ID, window_title = document.title, window_buttons = {'Close': false, 'Minimize': false, 'Maximize': false}) { |  | ||||||
| 		if (!element_ID) { |  | ||||||
| 			// Make a random element ID.
 |  | ||||||
| 			element_ID = (Math.floor((Math.random())**(-3))).toString(); |  | ||||||
| 		}; |  | ||||||
| 
 |  | ||||||
| 		let element_data = { |  | ||||||
| 			'ID': element_ID, |  | ||||||
| 			'titlebar': { |  | ||||||
| 				'ID': `${element_ID}_titlebar`, |  | ||||||
| 				'title': { |  | ||||||
| 					'ID': `${element_ID}_title` |  | ||||||
| 				}, |  | ||||||
| 				'controls': { |  | ||||||
| 					'ID': `${element_ID}_btns`, |  | ||||||
| 					'Close': { |  | ||||||
| 						'ID': `${element_ID}_btn_close`, |  | ||||||
| 						'visible': false |  | ||||||
| 					},  |  | ||||||
| 					'Minimize': { |  | ||||||
| 						'ID': `${element_ID}_btn_min`, |  | ||||||
| 						'visible': false |  | ||||||
| 					}, |  | ||||||
| 					'Maximize': { |  | ||||||
| 						'ID': `${element_ID}_btn_max`, |  | ||||||
| 						'visible': false |  | ||||||
| 					} |  | ||||||
| 				} |  | ||||||
| 			}, |  | ||||||
| 			'content': { |  | ||||||
| 				'ID': `${element_ID}_content` |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		function frame() { |  | ||||||
| 			$(element_target).append(`<section id="${element_data.ID}"></section>`); |  | ||||||
| 			$(`#${element_data.ID}`).addClass(`window glass active`); |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		function titlebar() { |  | ||||||
| 			$(`#${element_data.ID}`).append(`<top id="${element_data.titlebar.ID}"></top>`); |  | ||||||
| 			$(`#${element_data.titlebar.ID}`).addClass(`title-bar`); |  | ||||||
| 
 |  | ||||||
| 			function title() { |  | ||||||
| 				$(`#${element_data.titlebar.ID}`).append(`<span id="${element_data.titlebar.title.ID}"></span>`); |  | ||||||
| 				$(`#${element_data.titlebar.title.ID}`).addClass(`title-bar-text`); |  | ||||||
| 
 |  | ||||||
| 				if (window_title) { |  | ||||||
| 					$(`#${element_data.titlebar.title.ID}`).text(window_title); |  | ||||||
| 				}; |  | ||||||
| 			}; |  | ||||||
| 
 |  | ||||||
| 			function controls() { |  | ||||||
| 				if (window_buttons) { |  | ||||||
| 					$(`#${element_data.titlebar.ID}`).append(`<side id="${element_data.titlebar.controls.ID}"></side>`); |  | ||||||
| 					$(`#${element_data.titlebar.controls.ID}`).addClass(`title-bar-controls`); |  | ||||||
| 
 |  | ||||||
| 					// Set the possible
 |  | ||||||
| 					(Object.keys(window_buttons)).forEach((btn_label) => { |  | ||||||
| 						if (window_buttons[btn_label]) { |  | ||||||
| 							$(`#${element_data.titlebar.controls.ID}`).append(`<button id="${element_data.titlebar.controls[btn_label].ID}"></button>`); |  | ||||||
| 							$(`#${element_data.titlebar.controls[btn_label].ID}`).attr(`aria-label`, btn_label); |  | ||||||
| 						}; |  | ||||||
| 					}) |  | ||||||
| 				}; |  | ||||||
| 			}; |  | ||||||
| 
 |  | ||||||
| 			title(); |  | ||||||
| 			controls(); |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		function content() { |  | ||||||
| 			$(`#${element_data.ID}`).append(`<main id="${element_data.content.ID}"></main>`); |  | ||||||
| 			$(`#${element_data.content.ID}`).addClass(`window-body has-space`); |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		// Add to this window's properties. 
 |  | ||||||
| 		(Object.keys(element_data)).forEach((portion) => { |  | ||||||
| 			this[portion] = element_data[portion]; |  | ||||||
| 		}) |  | ||||||
| 
 |  | ||||||
| 		frame(); |  | ||||||
| 		titlebar(); |  | ||||||
| 		content(); |  | ||||||
| 	} |  | ||||||
| 	 |  | ||||||
| 	/*  |  | ||||||
| 	Close the window or an element.  |  | ||||||
| 
 |  | ||||||
| 	@param {bool} floating the window is not the tab itself |  | ||||||
| 	*/ |  | ||||||
| 	terminate(floating = true) { |  | ||||||
| 		let state_close = true;  |  | ||||||
| 		if ((this[`operation`]) ? this[`operation`][`Close`]: false) { |  | ||||||
| 			// Should run before closing the window. 
 |  | ||||||
| 			state_close = this[`operation`][`Close`](); |  | ||||||
| 		}; |  | ||||||
| 
 |  | ||||||
| 		if (state_close) { |  | ||||||
| 			$(`#${this.ID}`).remove(); |  | ||||||
| 	 |  | ||||||
| 			if (!floating) { |  | ||||||
| 				window.close(); |  | ||||||
| 			}; |  | ||||||
| 		} |  | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | 	constructor(URL, height, width) { | ||||||
|  | 		this.window = chrome.windows.create({ | ||||||
|  | 	    url: chrome.runtime.getURL(URL), | ||||||
|  | 	    type: "popup", | ||||||
|  | 	    width: (width) ? width: 400, | ||||||
|  | 	    height: (height) ? height: 600, | ||||||
|  | 	  }); | ||||||
|  | 	} | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | export {windowman}; | ||||||
|  |  | ||||||
							
								
								
									
										5
									
								
								gui/settings_r.htm
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								gui/settings_r.htm
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,5 @@ | ||||||
|  | <html> | ||||||
|  |   <head> | ||||||
|  |     <script src="scripts/settings_r.JS" type="module"></script> | ||||||
|  |   </head> | ||||||
|  | </html> | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue