commit afc524da3f981d1377667ce38c30fe430e9d74a9
Author: Jean-Marc Lasgouttes <lasgout...@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:
-- 
lyx-cvs mailing list
lyx-cvs@lists.lyx.org
http://lists.lyx.org/mailman/listinfo/lyx-cvs

Reply via email to