From afc524da3f981d1377667ce38c30fe430e9d74a9 Mon Sep 17 00:00:00 2001 From: Jean-Marc Lasgouttes Date: Mon, 14 Oct 2024 18:10:05 +0200 Subject: [PATCH] Add LFUN_WORD_TOGGLECASE (word-togglecase) The new function word-togglecase is a companion of word-upcase and word-lowcase: it toggles each character between lowcase and upcase, which is useful when one FORGOT THE cAPS lOCK KEY. Add bindings (except for emacs) and a menu entry. --- lib/RELEASE-NOTES | 6 +++++- lib/bind/de/menus.bind | 1 + lib/bind/menus.bind | 1 + lib/ui/stdmenus.inc | 1 + src/FuncCode.h | 1 + src/LyXAction.cpp | 11 +++++++++++ src/Paragraph.cpp | 27 ++++++++++++++++----------- src/Paragraph.h | 8 +++++--- src/Text.cpp | 5 +++++ 9 files changed, 46 insertions(+), 15 deletions(-) diff --git a/lib/RELEASE-NOTES b/lib/RELEASE-NOTES index b36b8cce74..3a6ee92d9d 100644 --- a/lib/RELEASE-NOTES +++ b/lib/RELEASE-NOTES @@ -13,9 +13,13 @@ !!!The following new LyX functions have been introduced in 2.5: +- The new function word-togglecase is a companion of word-upcase and + word-lowcase: it toggles each character between lowcase and upcase, + which is useful when one FORGOT THE cAPS lOCK KEY. + !!!The following LyX functions have been changed in 2.5: -- The funcion window_new does not take an optional +- The funcion window-new does not take an optional parameter anymore. This only worked in windows and existed for internal reasons. diff --git a/lib/bind/de/menus.bind b/lib/bind/de/menus.bind index de19222eef..3f0b166790 100644 --- a/lib/bind/de/menus.bind +++ b/lib/bind/de/menus.bind @@ -154,6 +154,7 @@ Format 5 \bind "M-z Down" "word-lowcase" \bind "M-z Up" "word-upcase" +\bind "M-z Left" "word-togglecase" \bind "M-z Right" "word-capitalize" \bind "M-z space" "font-default" diff --git a/lib/bind/menus.bind b/lib/bind/menus.bind index fafc2d36e2..4fdda8bbfc 100644 --- a/lib/bind/menus.bind +++ b/lib/bind/menus.bind @@ -155,6 +155,7 @@ Format 5 \bind "M-c Down" "word-lowcase" \bind "M-c Up" "word-upcase" +\bind "M-c Left" "word-togglecase" \bind "M-c Right" "word-capitalize" \bind "M-c space" "font-default" diff --git a/lib/ui/stdmenus.inc b/lib/ui/stdmenus.inc index b3ed8c9c53..01a4def3ff 100644 --- a/lib/ui/stdmenus.inc +++ b/lib/ui/stdmenus.inc @@ -190,6 +190,7 @@ Menuset Item "Capitalize|p" "word-capitalize" Item "Uppercase|U" "word-upcase" Item "Lowercase|L" "word-lowcase" + Item "Toggle Case|T" "word-togglecase" End Menu "edit_textstyles" diff --git a/src/FuncCode.h b/src/FuncCode.h index b8e2e0a0ac..691305274d 100644 --- a/src/FuncCode.h +++ b/src/FuncCode.h @@ -512,6 +512,7 @@ enum FuncCode LFUN_REFERENCE_INSERT, // spitz, 20240728 // 400 LFUN_REFERENCE_TO_PARAGRAPH, // spitz, 20240728 + LFUN_WORD_TOGGLECASE, // lasgouttes 20241014 LFUN_LASTACTION // end of the table }; diff --git a/src/LyXAction.cpp b/src/LyXAction.cpp index d7db81fe2e..72d9598652 100644 --- a/src/LyXAction.cpp +++ b/src/LyXAction.cpp @@ -4654,6 +4654,17 @@ void LyXAction::init() */ { LFUN_WORD_SELECT, "word-select", ReadOnly, Edit }, +/*! + * \var lyx::FuncCode lyx::LFUN_WORD_TOGGLECASE + * \li Action: Invert the case of the words in the selection or word at cursor position. + * \li Syntax: word-togglecase [] + * \li Params: : if this is equal to "partial", then the + * default word starts at cursor position (emacs-style). + * Otherwise, the whole word is considered. + * \endvar + */ + { LFUN_WORD_TOGGLECASE, "word-togglecase", Noop, Edit }, + /*! * \var lyx::FuncCode lyx::LFUN_WORD_UPCASE * \li Action: Change the words in the selection or word at cursor position diff --git a/src/Paragraph.cpp b/src/Paragraph.cpp index 72fdd85dde..33faa59254 100644 --- a/src/Paragraph.cpp +++ b/src/Paragraph.cpp @@ -4789,18 +4789,23 @@ void Paragraph::changeCase(BufferParams const & bparams, pos_type pos, // ignore insets and don't play with deleted text! if (oldChar != META_INSET && !isDeleted(pos)) { switch (action) { - case text_lowercase: - newChar = lowercase(oldChar); - break; - case text_capitalization: - if (capitalize) { - newChar = uppercase(oldChar); - capitalize = false; - } - break; - case text_uppercase: + case text_lowercase: + newChar = lowercase(oldChar); + break; + case text_capitalization: + if (capitalize) { + newChar = uppercase(oldChar); + capitalize = false; + } + break; + case text_uppercase: + newChar = uppercase(oldChar); + break; + case text_togglecase: + if (isUpperCase(oldChar)) + newChar = lowercase(oldChar); + else if (isLowerCase(oldChar)) newChar = uppercase(oldChar); - break; } } diff --git a/src/Paragraph.h b/src/Paragraph.h index 467054499c..91bc40eba2 100644 --- a/src/Paragraph.h +++ b/src/Paragraph.h @@ -110,11 +110,13 @@ public: /// enum TextCase { /// - text_lowercase = 0, + text_lowercase, /// - text_capitalization = 1, + text_capitalization, /// - text_uppercase = 2 + text_uppercase, + /// + text_togglecase }; diff --git a/src/Text.cpp b/src/Text.cpp index 7147c15719..4c7a445fc5 100644 --- a/src/Text.cpp +++ b/src/Text.cpp @@ -4946,6 +4946,10 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd) changeCase(cur, text_capitalization, cmd.getArg(0) == "partial"); break; + case LFUN_WORD_TOGGLECASE: + changeCase(cur, text_togglecase, cmd.getArg(0) == "partial"); + break; + case LFUN_CHARS_TRANSPOSE: charsTranspose(cur); break; @@ -7159,6 +7163,7 @@ bool Text::getStatus(Cursor & cur, FuncRequest const & cmd, case LFUN_WORD_UPCASE: case LFUN_WORD_LOWCASE: case LFUN_WORD_CAPITALIZE: + case LFUN_WORD_TOGGLECASE: case LFUN_CHARS_TRANSPOSE: case LFUN_SERVER_GET_XY: case LFUN_SERVER_SET_XY: