]> git.deb.at Git - pkg/abook.git/commitdiff
* statusline_askchoice(): handles localized keybindings for multiple choices
authorCedric Duval <cedricduval@free.fr>
Mon, 26 Sep 2005 15:59:04 +0000 (15:59 +0000)
committerCedric Duval <cedricduval@free.fr>
Mon, 26 Sep 2005 15:59:04 +0000 (15:59 +0000)
* Use of terminal underlining to show keys if available
* Fixed screen not refreshed after cancel
* xstrndup()

filter.c
ui.c
ui.h
xmalloc.c
xmalloc.h

index 41756ad029889ee2db0c07ea1a3655904bb91cc0..d2bc6efc0f35fbe801b683270877cfdd089aed8d 100644 (file)
--- a/filter.c
+++ b/filter.c
@@ -23,6 +23,7 @@
 #include "list.h"
 #include "misc.h"
 #include "options.h"
+#include "ui.h"
 #include "xmalloc.h"
 #include <assert.h>
 
@@ -322,13 +323,14 @@ export_database()
        mvaddstr(5+filter, 2, "->");
 
        if(selected_items()) {
-               /* TODO gettext: handle translated keypresses? */
-               statusline_addstr(_("Export All/Selected/Cancel (A/s/c)?"));
-               switch( tolower(getch()) ) {
-                       case 's':
+               switch(statusline_askchoice(_("Export <a>ll, export <s>elected, or <c>ancel?"), S_("keybindings:all/selected/cancel|asc"), 3)) {
+                       case 1:
+                               break;
+                       case 2:
                                enum_mode = ENUM_SELECTED;
                                break;
-                       case 'c':
+                       case 0:
+                       case 3:
                                refresh_screen();
                                return 1;
                }
diff --git a/ui.c b/ui.c
index 901322b50712c6f4295d71e11336d1713845c096..6917f77863768a80180909797f6f6d5dcbb05f5c 100644 (file)
--- a/ui.c
+++ b/ui.c
@@ -15,6 +15,7 @@
 #include <signal.h>
 #include <ctype.h>
 #include "abook.h"
+#include <assert.h>
 #include "ui.h"
 #include "edit.h"
 #include "database.h"
@@ -231,6 +232,80 @@ statusline_addstr(const char *str)
        wrefresh(bottom);
 }
 
+/* Same as statusline_addstr(), but hilight "<str>" sequences if the terminal
+ * supports it */
+static void
+statusline_addhlstr(const char *str)
+{
+#if defined(A_BOLD) && defined(A_NORMAL)
+       const char *p = str, *start = str;
+       char *tmp;
+       int pos = 0;
+
+       while(1) {
+               if(!*p || strchr("<>", *p)) {
+                       if(p - start > 0) {
+                               wattrset(bottom, (*p == '>') ? A_UNDERLINE : A_NORMAL);
+                               tmp = xstrndup(start, p - start);
+                               mvwaddstr(bottom, 1, pos, tmp);
+                               free(tmp);
+                               pos += p - start;
+                       }
+                       if(*p) {
+                               start = p + 1;
+#if 0
+                               /* show tag markers */
+                               wattrset(bottom, A_DIM);
+                               mvwaddch(bottom, 1, pos++, *p);
+#endif
+                       }
+               }
+
+               if(!*p) {
+                       wattrset(bottom, A_NORMAL);
+                       break;
+               }
+
+               p++;
+       }
+#else
+       mvwaddstr(bottom, 1, 0, str);
+#endif
+
+       refresh();
+       wrefresh(bottom);
+}
+
+int
+statusline_askchoice(const char *msg, const char *choices, short dflt)
+{
+       char *s;
+       int ch;
+
+       assert((dflt < 0) || (dflt > strlen(choices)));
+
+       if(dflt) {
+               s = mkstr("%s [%c]", msg, choices[dflt - 1]);
+               statusline_addhlstr(s);
+               free(s);
+       } else
+               statusline_addhlstr(msg);
+
+       while(1)
+       {
+               ch = tolower(getch());
+
+               if(ch == 7) /* ctrl+G */
+                       return 0;
+
+               if(dflt && (ch == '\r')) /* default choice */
+                       return dflt;
+
+               if((s = strchr(choices, ch)))
+                       return (s - choices + 1);
+       }
+}
+
 char *
 ui_readline(char *prompt, char *s, size_t limit, bool use_completion)
 {
@@ -544,13 +619,11 @@ ui_print_database()
        if(list_is_empty())
                return;
 
-       statusline_addstr(_("Print All/Selected/Cancel (a/s/C)?"));
-
-       switch(tolower(getch())) {
-               case 'a':
+       switch(statusline_askchoice(_("Print <a>ll, print <s>elected, or <c>ancel?"), S_("keybindings:all/selected/cancel|asc"), 3)) {
+               case 1:
                        mode = ENUM_ALL;
                        break;
-               case 's':
+               case 2:
                        if( !selected_items() ) {
                                statusline_msg(_("No selected items"));
                                return;
@@ -558,7 +631,7 @@ ui_print_database()
                        mode = ENUM_SELECTED;
                        break;
                default:
-                       clear_statusline();
+                       refresh_screen();
                        return;
        }
 
diff --git a/ui.h b/ui.h
index db85b59aa58238933b0034c4b4e36bcde59dfae2..7e1b8a8cda6008d8882236bc2d2ad0e447f346a6 100644 (file)
--- a/ui.h
+++ b/ui.h
@@ -15,6 +15,7 @@ void          close_ui();
 void           headerline(const char *str);
 void            refresh_screen();
 int            statusline_msg(const char *msg);
+int            statusline_askchoice(const char *msg, const char *choices, short dflt);
 char           *ask_filename(char *prompt);
 int            statusline_ask_boolean(char *msg, int def);
 void            clear_statusline();
index ca784be299a418063bc5fb4478a7e5959136e11e..3a34e1ce187a864a029c434a221a4c4fd2fbe0db 100644 (file)
--- a/xmalloc.c
+++ b/xmalloc.c
@@ -149,3 +149,21 @@ xstrdup(const char *s)
        return (char *)memcpy(new, s, len + 1);
 }
 
+char *
+xstrndup(const char *s, size_t len)
+{
+       char *new;
+       size_t n = strlen(s);
+
+       if(n > len)
+               n = len;
+
+       new = xmalloc_inc(n, 1);
+       if(new == NULL)
+               return NULL;
+
+       memcpy(new, s, n);
+       new[n] = '\0';
+
+       return new;
+}
index 9b0f6de03098c5f18cfd2225ac15c18f87d589da..7351f123a54baa7f5b5af60f8afc82a3092a0658 100644 (file)
--- a/xmalloc.h
+++ b/xmalloc.h
@@ -17,6 +17,7 @@ void *                xmalloc_inc(size_t, size_t);
 void *         xrealloc(void *, size_t);
 void *         xrealloc_inc(void *, size_t, size_t);
 char *         xstrdup(const char *s);
+char *         xstrndup(const char *s, size_t);
 
 #define xfree(ptr)     do { free(ptr); ptr = NULL; } while(0)