]> granicus.if.org Git - mutt/commitdiff
Fix the expand/collapse code to use the virtual index. (see #3728)
authorKevin McCarthy <kevin@8t8.us>
Fri, 11 Aug 2017 01:18:24 +0000 (18:18 -0700)
committerKevin McCarthy <kevin@8t8.us>
Fri, 11 Aug 2017 01:18:24 +0000 (18:18 -0700)
Fix the init code to respect OPTDIGESTCOLLAPSE.

recvattach.c

index 630f85949621c22cfb64dd0f94a004719b47087d..df98c3538967c60c9ea687af23fc5f15c4265b4b 100644 (file)
@@ -980,7 +980,12 @@ void mutt_attach_init (ATTACH_CONTEXT *actx)
   for (i = 0; i < actx->idxlen; i++)
   {
     actx->idx[i]->content->tagged = 0;
-    actx->idx[i]->content->collapsed = 0;
+    if (option (OPTDIGESTCOLLAPSE) &&
+        actx->idx[i]->content->type == TYPEMULTIPART &&
+       !ascii_strcasecmp (actx->idx[i]->content->subtype, "digest"))
+      actx->idx[i]->content->collapsed = 1;
+    else
+      actx->idx[i]->content->collapsed = 0;
   }
 }
 
@@ -1004,21 +1009,28 @@ static void mutt_update_recvattach_menu (ATTACH_CONTEXT *actx, MUTTMENU *menu, i
   menu->redraw |= REDRAW_INDEX;
 }
 
-/* TODO: fix this to use the index */
-static void attach_collapse (BODY *b, short collapse, short init, short just_one)
+static void attach_collapse (ATTACH_CONTEXT *actx, MUTTMENU *menu)
 {
-  short i;
-  for (; b; b = b->next)
+  int rindex, curlevel;
+
+  CURATTACH->content->collapsed = !CURATTACH->content->collapsed;
+  /* When expanding, expand all the children too */
+  if (CURATTACH->content->collapsed)
+    return;
+
+  curlevel = CURATTACH->level;
+  rindex = actx->v2r[menu->current] + 1;
+
+  while ((rindex < actx->idxlen) &&
+         (actx->idx[rindex]->level > curlevel))
   {
-    i = init || b->collapsed;
-    if (i && option (OPTDIGESTCOLLAPSE) && b->type == TYPEMULTIPART
-       && !ascii_strcasecmp (b->subtype, "digest"))
-      attach_collapse (b->parts, 1, 1, 0);
-    else if (b->type == TYPEMULTIPART || mutt_is_message_type (b->type, b->subtype))
-      attach_collapse (b->parts, collapse, i, 0);
-    b->collapsed = collapse;
-    if (just_one)
-      return;
+    if (option (OPTDIGESTCOLLAPSE) &&
+        actx->idx[rindex]->content->type == TYPEMULTIPART &&
+       !ascii_strcasecmp (actx->idx[rindex]->content->subtype, "digest"))
+      actx->idx[rindex]->content->collapsed = 1;
+    else
+      actx->idx[rindex]->content->collapsed = 0;
+    rindex++;
   }
 }
 
@@ -1096,13 +1108,10 @@ void mutt_view_attachments (HEADER *hdr)
          mutt_error _("There are no subparts to show!");
          break;
        }
-        if (!CURATTACH->content->collapsed)
-         attach_collapse (CURATTACH->content, 1, 0, 1);
-        else
-         attach_collapse (CURATTACH->content, 0, 1, 1);
+        attach_collapse (actx, menu);
         mutt_update_recvattach_menu (actx, menu, 0);
         break;
-      
+
       case OP_FORGET_PASSPHRASE:
         crypt_forget_passphrase ();
         break;
@@ -1110,12 +1119,12 @@ void mutt_view_attachments (HEADER *hdr)
       case OP_EXTRACT_KEYS:
         if ((WithCrypto & APPLICATION_PGP))
         {
-          crypt_pgp_extract_keys_from_attachment_list (fp, menu->tagprefix, 
+          crypt_pgp_extract_keys_from_attachment_list (fp, menu->tagprefix,
                    menu->tagprefix ? cur : CURATTACH->content);
           menu->redraw = REDRAW_FULL;
         }
         break;
-      
+
       case OP_CHECK_TRADITIONAL:
         if ((WithCrypto & APPLICATION_PGP)
             && crypt_pgp_check_traditional (fp, menu->tagprefix ? cur