mirror of https://gitlab.com/nakst/essence
				
				
				
			textboxes smart quotes
This commit is contained in:
		
							parent
							
								
									b535f73640
								
							
						
					
					
						commit
						10d936d7fc
					
				|  | @ -269,6 +269,7 @@ void MessageLoopThread(EsGeneric) { | ||||||
| 			textboxOutput = EsTextboxCreate(panel, ES_TEXTBOX_MULTILINE | ES_CELL_FILL, &styleMonospacedTextbox); | 			textboxOutput = EsTextboxCreate(panel, ES_TEXTBOX_MULTILINE | ES_CELL_FILL, &styleMonospacedTextbox); | ||||||
| 			EsSpacerCreate(panel, ES_CELL_H_FILL, ES_STYLE_SEPARATOR_HORIZONTAL); | 			EsSpacerCreate(panel, ES_CELL_H_FILL, ES_STYLE_SEPARATOR_HORIZONTAL); | ||||||
| 			textboxInput = EsTextboxCreate(panel, ES_CELL_H_FILL, &styleMonospacedTextbox); | 			textboxInput = EsTextboxCreate(panel, ES_CELL_H_FILL, &styleMonospacedTextbox); | ||||||
|  | 			EsTextboxEnableSmartQuotes(textboxInput, false); | ||||||
| 			textboxInput->messageUser = ProcessTextboxInputMessage; | 			textboxInput->messageUser = ProcessTextboxInputMessage; | ||||||
| 			EsElementFocus(textboxInput); | 			EsElementFocus(textboxInput); | ||||||
| 		} else if (message->type == MSG_RECEIVED_OUTPUT) { | 		} else if (message->type == MSG_RECEIVED_OUTPUT) { | ||||||
|  |  | ||||||
|  | @ -377,7 +377,7 @@ void ProcessApplicationMessage(EsMessage *message) { | ||||||
| 		EsPanel *switcher = EsPanelCreate(window, ES_CELL_FILL | ES_PANEL_SWITCHER, ES_STYLE_PANEL_WINDOW_DIVIDER); | 		EsPanel *switcher = EsPanelCreate(window, ES_CELL_FILL | ES_PANEL_SWITCHER, ES_STYLE_PANEL_WINDOW_DIVIDER); | ||||||
| 		instance->switcher = switcher; | 		instance->switcher = switcher; | ||||||
| 
 | 
 | ||||||
| 		instance->textboxGeneralLog = EsTextboxCreate(switcher, ES_TEXTBOX_MULTILINE | ES_CELL_FILL, &styleMonospacedTextbox); | 		instance->textboxGeneralLog = EsTextboxCreate(switcher, ES_TEXTBOX_MULTILINE | ES_CELL_FILL | ES_ELEMENT_DISABLED, &styleMonospacedTextbox); | ||||||
| 
 | 
 | ||||||
| 		AddListView(&instance->listViewProcesses, switcher, ListViewProcessesCallback,  | 		AddListView(&instance->listViewProcesses, switcher, ListViewProcessesCallback,  | ||||||
| 				listViewProcessesColumns, sizeof(listViewProcessesColumns), ES_LIST_VIEW_SINGLE_SELECT); | 				listViewProcessesColumns, sizeof(listViewProcessesColumns), ES_LIST_VIEW_SINGLE_SELECT); | ||||||
|  |  | ||||||
|  | @ -108,6 +108,7 @@ void SetLanguage(Instance *instance, uint32_t newLanguage) { | ||||||
| 
 | 
 | ||||||
| 	instance->syntaxHighlightingLanguage = newLanguage; | 	instance->syntaxHighlightingLanguage = newLanguage; | ||||||
| 	EsTextboxSetupSyntaxHighlighting(instance->textboxDocument, newLanguage); | 	EsTextboxSetupSyntaxHighlighting(instance->textboxDocument, newLanguage); | ||||||
|  | 	EsTextboxEnableSmartQuotes(instance->textboxDocument, !newLanguage); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void FormatPopupCreate(Instance *instance) { | void FormatPopupCreate(Instance *instance) { | ||||||
|  |  | ||||||
|  | @ -87,6 +87,7 @@ struct GlobalData { | ||||||
| 	volatile float uiScale; | 	volatile float uiScale; | ||||||
| 	volatile bool swapLeftAndRightButtons; | 	volatile bool swapLeftAndRightButtons; | ||||||
| 	volatile bool showCursorShadow; | 	volatile bool showCursorShadow; | ||||||
|  | 	volatile bool useSmartQuotes; | ||||||
| 	volatile bool enableHoverState; | 	volatile bool enableHoverState; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -2413,6 +2413,7 @@ function void EsTextboxSetTextSize(EsTextbox *textbox, uint16_t size); | ||||||
| function void EsTextboxSetFont(EsTextbox *textbox, EsFont font); | function void EsTextboxSetFont(EsTextbox *textbox, EsFont font); | ||||||
| function void EsTextboxSetupSyntaxHighlighting(EsTextbox *textbox, uint32_t language, uint32_t *customColors = ES_NULL, size_t customColorCount = 0); | function void EsTextboxSetupSyntaxHighlighting(EsTextbox *textbox, uint32_t language, uint32_t *customColors = ES_NULL, size_t customColorCount = 0); | ||||||
| function void EsTextboxStartEdit(EsTextbox *textbox); | function void EsTextboxStartEdit(EsTextbox *textbox); | ||||||
|  | function void EsTextboxEnableSmartQuotes(EsTextbox *textbox, bool enabled); | ||||||
| 
 | 
 | ||||||
| // Sliders. | // Sliders. | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -138,6 +138,7 @@ void SettingsUpdateGlobalAndWindowManager() { | ||||||
| 	api.global->clickChainTimeoutMs = EsSystemConfigurationReadInteger(EsLiteral("general"), EsLiteral("click_chain_timeout_ms")); | 	api.global->clickChainTimeoutMs = EsSystemConfigurationReadInteger(EsLiteral("general"), EsLiteral("click_chain_timeout_ms")); | ||||||
| 	api.global->swapLeftAndRightButtons = EsSystemConfigurationReadInteger(EsLiteral("general"), EsLiteral("swap_left_and_right_buttons")); | 	api.global->swapLeftAndRightButtons = EsSystemConfigurationReadInteger(EsLiteral("general"), EsLiteral("swap_left_and_right_buttons")); | ||||||
| 	api.global->showCursorShadow = EsSystemConfigurationReadInteger(EsLiteral("general"), EsLiteral("show_cursor_shadow")); | 	api.global->showCursorShadow = EsSystemConfigurationReadInteger(EsLiteral("general"), EsLiteral("show_cursor_shadow")); | ||||||
|  | 	api.global->useSmartQuotes = EsSystemConfigurationReadInteger(EsLiteral("general"), EsLiteral("use_smart_quotes")); | ||||||
| 	api.global->enableHoverState = EsSystemConfigurationReadInteger(EsLiteral("general"), EsLiteral("enable_hover_state")); | 	api.global->enableHoverState = EsSystemConfigurationReadInteger(EsLiteral("general"), EsLiteral("enable_hover_state")); | ||||||
| 
 | 
 | ||||||
| 	{ | 	{ | ||||||
|  | @ -541,6 +542,9 @@ void SettingsPageKeyboard(EsElement *element, SettingsPage *page) { | ||||||
| 	EsTextDisplayCreate(testBox, ES_CELL_H_FILL, ES_STYLE_TEXT_PARAGRAPH, INTERFACE_STRING(DesktopSettingsKeyboardTestTextboxIntroduction)); | 	EsTextDisplayCreate(testBox, ES_CELL_H_FILL, ES_STYLE_TEXT_PARAGRAPH, INTERFACE_STRING(DesktopSettingsKeyboardTestTextboxIntroduction)); | ||||||
| 	EsSpacerCreate(testBox, ES_FLAGS_DEFAULT, 0, 0, 5); | 	EsSpacerCreate(testBox, ES_FLAGS_DEFAULT, 0, 0, 5); | ||||||
| 	EsTextboxCreate(testBox, ES_CELL_H_LEFT)->accessKey = 'T'; | 	EsTextboxCreate(testBox, ES_CELL_H_LEFT)->accessKey = 'T'; | ||||||
|  | 
 | ||||||
|  | 	table = EsPanelCreate(container, ES_CELL_H_FILL, &styleSettingsCheckboxGroup); | ||||||
|  | 	SettingsAddCheckbox(table, INTERFACE_STRING(DesktopSettingsKeyboardUseSmartQuotes), 'Q', "general", "use_smart_quotes"); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void SettingsPageDisplay(EsElement *element, SettingsPage *page) { | void SettingsPageDisplay(EsElement *element, SettingsPage *page) { | ||||||
|  |  | ||||||
|  | @ -2919,6 +2919,8 @@ struct EsTextbox : EsElement { | ||||||
| 	uint32_t syntaxHighlightingLanguage; | 	uint32_t syntaxHighlightingLanguage; | ||||||
| 	uint32_t syntaxHighlightingColors[8]; | 	uint32_t syntaxHighlightingColors[8]; | ||||||
| 
 | 
 | ||||||
|  | 	bool smartQuotes; | ||||||
|  | 
 | ||||||
| 	bool inRightClickDrag; | 	bool inRightClickDrag; | ||||||
| 
 | 
 | ||||||
| 	// For smart context menus:
 | 	// For smart context menus:
 | ||||||
|  | @ -4056,6 +4058,7 @@ bool EsTextboxFind(EsTextbox *textbox, const char *needle, intptr_t _needleBytes | ||||||
| 		EsAssert(byteIndex <= bufferBytes); // Invalid find byte offset.
 | 		EsAssert(byteIndex <= bufferBytes); // Invalid find byte offset.
 | ||||||
| 
 | 
 | ||||||
| 		// TODO Case-insensitive search.
 | 		// TODO Case-insensitive search.
 | ||||||
|  | 		// TODO Ignore quotation mark type.
 | ||||||
| 
 | 
 | ||||||
| 		if (flags & ES_TEXTBOX_FIND_BACKWARDS) { | 		if (flags & ES_TEXTBOX_FIND_BACKWARDS) { | ||||||
| 			if (bufferBytes >= needleBytes) { | 			if (bufferBytes >= needleBytes) { | ||||||
|  | @ -4482,10 +4485,23 @@ int ProcessTextboxMessage(EsElement *element, EsMessage *message) { | ||||||
| 
 | 
 | ||||||
| 			int ic, isc; | 			int ic, isc; | ||||||
| 			ConvertScancodeToCharacter(message->keyboard.scancode, &ic, &isc, true, textbox->flags & ES_TEXTBOX_MULTILINE);  | 			ConvertScancodeToCharacter(message->keyboard.scancode, &ic, &isc, true, textbox->flags & ES_TEXTBOX_MULTILINE);  | ||||||
|  | 			int character = (message->keyboard.modifiers & ES_MODIFIER_SHIFT) ? isc : ic; | ||||||
| 
 | 
 | ||||||
| 			if (ic != -1 && (message->keyboard.modifiers & ~ES_MODIFIER_SHIFT) == 0) { | 			if (ic != -1 && (message->keyboard.modifiers & ~ES_MODIFIER_SHIFT) == 0) { | ||||||
|  | 				if (textbox->smartQuotes && api.global->useSmartQuotes) { | ||||||
|  | 					DocumentLine *currentLine = &textbox->lines[textbox->carets[0].line]; | ||||||
|  | 					const char *buffer = currentLine->GetBuffer(textbox); | ||||||
|  | 					bool left = !textbox->carets[0].byte || buffer[textbox->carets[0].byte - 1] == ' '; | ||||||
|  | 
 | ||||||
|  | 					if (character == '"') { | ||||||
|  | 						character = left ? 0x201C : 0x201D; | ||||||
|  | 					} else if (character == '\'') { | ||||||
|  | 						character = left ? 0x2018 : 0x2019; | ||||||
|  | 					} | ||||||
|  | 				} | ||||||
|  | 
 | ||||||
| 				char buffer[4]; | 				char buffer[4]; | ||||||
| 				EsTextboxInsert(textbox, buffer, utf8_encode((message->keyboard.modifiers & ES_MODIFIER_SHIFT) ? isc : ic, buffer)); | 				EsTextboxInsert(textbox, buffer, utf8_encode(character, buffer)); | ||||||
| 
 | 
 | ||||||
| 				if (buffer[0] == '\n' && textbox->carets[0].line) { | 				if (buffer[0] == '\n' && textbox->carets[0].line) { | ||||||
| 					// Copy the indentation from the previous line.
 | 					// Copy the indentation from the previous line.
 | ||||||
|  | @ -4695,6 +4711,8 @@ EsTextbox *EsTextboxCreate(EsElement *parent, uint64_t flags, const EsStyle *sty | ||||||
| 
 | 
 | ||||||
| 	textbox->currentStyle->GetTextStyle(&textbox->textStyle); | 	textbox->currentStyle->GetTextStyle(&textbox->textStyle); | ||||||
| 
 | 
 | ||||||
|  | 	textbox->smartQuotes = true; | ||||||
|  | 
 | ||||||
| 	DocumentLine firstLine = {}; | 	DocumentLine firstLine = {}; | ||||||
| 	firstLine.height = TextGetLineHeight(textbox, &textbox->textStyle); | 	firstLine.height = TextGetLineHeight(textbox, &textbox->textStyle); | ||||||
| 	textbox->lines.Add(firstLine); | 	textbox->lines.Add(firstLine); | ||||||
|  | @ -4934,6 +4952,10 @@ void EsTextboxSetupSyntaxHighlighting(EsTextbox *textbox, uint32_t language, uin | ||||||
| 	textbox->Repaint(true); | 	textbox->Repaint(true); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | void EsTextboxEnableSmartQuotes(EsTextbox *textbox, bool enabled) { | ||||||
|  | 	textbox->smartQuotes = enabled; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| // --------------------------------- Text displays.
 | // --------------------------------- Text displays.
 | ||||||
| 
 | 
 | ||||||
| // TODO Inline images and icons.
 | // TODO Inline images and icons.
 | ||||||
|  |  | ||||||
|  | @ -8,6 +8,7 @@ show_cursor_shadow=1 | ||||||
| scroll_lines_per_notch=3 | scroll_lines_per_notch=3 | ||||||
| ui_scale=100 | ui_scale=100 | ||||||
| window_color=6 | window_color=6 | ||||||
|  | use_smart_quotes=1 | ||||||
| enable_hover_state=1 | enable_hover_state=1 | ||||||
| 
 | 
 | ||||||
| [ui] | [ui] | ||||||
|  |  | ||||||
|  | @ -122,6 +122,7 @@ DEFINE_INTERFACE_STRING(DesktopSettingsKeyboardKeyRepeatDelay, "Key repeat delay | ||||||
| DEFINE_INTERFACE_STRING(DesktopSettingsKeyboardKeyRepeatRate, "Key repeat rate:"); | DEFINE_INTERFACE_STRING(DesktopSettingsKeyboardKeyRepeatRate, "Key repeat rate:"); | ||||||
| DEFINE_INTERFACE_STRING(DesktopSettingsKeyboardCaretBlinkRate, "Caret blink rate:"); | DEFINE_INTERFACE_STRING(DesktopSettingsKeyboardCaretBlinkRate, "Caret blink rate:"); | ||||||
| DEFINE_INTERFACE_STRING(DesktopSettingsKeyboardTestTextboxIntroduction, "Try your settings in the textbox below:"); | DEFINE_INTERFACE_STRING(DesktopSettingsKeyboardTestTextboxIntroduction, "Try your settings in the textbox below:"); | ||||||
|  | DEFINE_INTERFACE_STRING(DesktopSettingsKeyboardUseSmartQuotes, "Use smart quotes when typing"); | ||||||
| 
 | 
 | ||||||
| DEFINE_INTERFACE_STRING(DesktopSettingsMouseDoubleClickSpeed, "Double click time:"); | DEFINE_INTERFACE_STRING(DesktopSettingsMouseDoubleClickSpeed, "Double click time:"); | ||||||
| DEFINE_INTERFACE_STRING(DesktopSettingsMouseSpeed, "Cursor movement speed:"); | DEFINE_INTERFACE_STRING(DesktopSettingsMouseSpeed, "Cursor movement speed:"); | ||||||
|  |  | ||||||
|  | @ -456,3 +456,4 @@ _EsUISetFont=454 | ||||||
| EsWorkQueue=455 | EsWorkQueue=455 | ||||||
| EsWorkIsExiting=456 | EsWorkIsExiting=456 | ||||||
| EsPanelRadioGroupGetChecked=457 | EsPanelRadioGroupGetChecked=457 | ||||||
|  | EsTextboxEnableSmartQuotes=458 | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	 nakst
						nakst