[LyX/master] Add LFUN_WORD_TOGGLECASE (word-togglecase)

Jean-Marc Lasgouttes lasgouttes at lyx.org
Mon Oct 14 16:27:03 UTC 2024


commit afc524da3f981d1377667ce38c30fe430e9d74a9
Author: Jean-Marc Lasgouttes <lasgouttes at lyx.org>
Date:   Mon Oct 14 18:10:05 2024 +0200

    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      | 25 +++++++++++++++----------
 src/Paragraph.h        |  8 +++++---
 src/Text.cpp           |  5 +++++
 9 files changed, 45 insertions(+), 14 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 <GEOMETRY>
+- The funcion window-new does not take an optional <GEOMETRY>
   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 [<SEL_TYPE>]
+ * \li Params: <SEL_TYPE>: 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:
+			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);
-					break;
-				case text_capitalization:
-					if (capitalize) {
-						newChar = uppercase(oldChar);
-						capitalize = false;
-					}
-					break;
-				case text_uppercase:
+				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:


More information about the lyx-cvs mailing list