2010-07-14 2 views
5

Je veux insigne le fichier et le dossier avec un peu de couleur (image), aucune idée de comment cela peut être réalisé J'ai essayé avec le service d'icône, cela fonctionne pour les fichiers, mais il ne fonctionne pas avec les dossiers .Comment badger le dossier et le dossier en utilisant le cacao

J'ai vu ce comportement fonctionner Dropbox (10.4, 10.5 et 10.6) - une idée de comment cela peut-il être fait?

Ce qui suit était très proche pour moi, mais il ne fonctionne pas comme prévu. http://www.cimgf.com/2008/06/16/cocoa-tutorial-custom-folder-icons/

Existe-t-il une autre solution autre que le service d'icône?

J'apprécie toute sorte d'aide.

+0

J'ai obtenu la solution: Ajouter une branche de ressources pour l'icône de badge dans un dossier et le charger comme un badge pour l'icône du dossier. Remarque: le nom de la fourchette de ressources doit se terminer par '\ r' –

+1

Voulez-vous ajouter une réponse et indiquer ce que vous avez fait? Je serais intéressé de voir. Merci! –

+0

@Dave DeLong S'il vous plaît trouver ma solution ci-dessous, Pass chemin Chemin que vous souhaitez badge et NSData de l'icône de badge. Le code ne fonctionnera que dans Intel si vous voulez que cela fonctionne dans PPC remplacer l'utilisation 'NSUTF16LittleEndianStringEncoding' par rapport à PPC. J'espère que vous trouverez ce code utile. –

Répondre

4

La fonction suivante est la solution que je trouve le problème

BOOL AddBadgeToItem(NSString* path,NSData* tag) 

{ 
    FSCatalogInfo info; 
    FSRef par; 
    FSRef ref; 
    Boolean dir = false; 

    if (tag&&(FSPathMakeRef([path fileSystemRepresentation],&par,&dir)==noErr)) 
    { 
     HFSUniStr255 fork = {0,{0}}; 
     sint16 refnum = kResFileNotOpened; 
     FSGetResourceForkName(&fork); 

     if (dir) 
     { 

      NSString *name = @"Icon\r"; 
      memset(&info,0,sizeof(info)); 
      ((FileInfo*)(&info.finderInfo))->finderFlags = kIsInvisible; 

      OSErr error = FSCreateResourceFile(&par,[name lengthOfBytesUsingEncoding:NSUTF16LittleEndianStringEncoding],(UniChar*)[name cStringUsingEncoding:NSUTF16LittleEndianStringEncoding],kFSCatInfoFinderXInfo,&info,fork.length, fork.unicode,&ref,NULL); 

      if(error == dupFNErr) 
      { 
       // file already exists; prepare to try to open it 
       const char *iconFileSystemPath = [[path stringByAppendingPathComponent:@"\000I\000c\000o\000n\000\r"] fileSystemRepresentation]; 

       OSStatus status = FSPathMakeRef((const UInt8 *)iconFileSystemPath, &ref, NULL); 
       if (status != noErr) 
       { 
        fprintf(stderr, "error: FSPathMakeRef() returned %d for file \"%s\"\n", (int)status, iconFileSystemPath); 

       } 
      }else if (error != noErr) 
      { 
       return NO; 
      } 

     } 
     else 
     { 
      BlockMoveData(&par,&ref,sizeof(FSRef)); 
      if (FSCreateResourceFork(&ref,fork.length,fork.unicode,0)!=noErr) 
      { 
       //test 

       if (FSOpenResourceFile(&ref,fork.length,fork.unicode,fsRdWrPerm,&refnum)!=noErr) { 
        return NO; 
       } 
       if (refnum!=kResFileNotOpened) { 

        UpdateResFile(refnum); 
        CloseResFile(refnum); 

        if (FSGetCatalogInfo(&par,kFSCatInfoFinderXInfo,&info,NULL,NULL,NULL)==noErr) { 
         ((ExtendedFileInfo*)(&info.extFinderInfo))->extendedFinderFlags = kExtendedFlagsAreInvalid; 
         FSSetCatalogInfo(&par,kFSCatInfoFinderXInfo,&info); 
        } 
       } 

       //Test end 
       return NO; 
      } 
     } 
     OSErr errorr = FSOpenResourceFile(&ref,fork.length,fork.unicode,fsRdWrPerm,&refnum); 
     if (errorr!=noErr) { 
      return NO; 
     } 
     if (refnum!=kResFileNotOpened) { 
      CustomBadgeResource* cbr; 

      int len = [tag length]; 
      Handle h = NewHandle(len); 
      if (h) { 
       BlockMoveData([tag bytes],*h,len); 
       AddResource(h,kIconFamilyType,128,"\p"); 
       WriteResource(h); 
       ReleaseResource(h); 
      } 

      h = NewHandle(sizeof(CustomBadgeResource)); 
      if (h) { 
       cbr = (CustomBadgeResource*)*h; 
       memset(cbr,0,sizeof(CustomBadgeResource)); 
       cbr->version = kCustomBadgeResourceVersion; 
       cbr->customBadgeResourceID = 128; 
       AddResource(h,kCustomBadgeResourceType,kCustomBadgeResourceID,"\p"); 
       WriteResource(h); 
       ReleaseResource(h); 
      } 

      UpdateResFile(refnum); 
      CloseResFile(refnum); 

      if (FSGetCatalogInfo(&par,kFSCatInfoFinderXInfo,&info,NULL,NULL,NULL)==noErr) { 
       ((ExtendedFileInfo*)(&info.extFinderInfo))->extendedFinderFlags = kExtendedFlagHasCustomBadge; 
       FSSetCatalogInfo(&par,kFSCatInfoFinderXInfo,&info); 
      } 
     } 
    } 
    return NO; 
} 
+1

Salut Girish, J'essaie d'enfiler des dossiers dans le viseur avec un badge d'icône accessoire, mais sans succès jusqu'ici. J'ai essayé ce code mais le résultat était un fichier nommé 'Icon' dans le dossier. Une idée de ce que je pourrais faire de mal? Merci! –

+0

@Joe Ricioppo: fork de ressources de fichier d'icône créé dans le cadre du dossier de badging. –

+0

@JoeRicioppo Je suis également confronté au même problème. Le code s'exécute sans aucune erreur mais rien ne se passe. Comment as-tu résolu le problème??? –

0

Vous pouvez le faire en utilisant la méthode -setIcon:forFile:options: sur NSWorkspace, qui vous permet de spécifier un NSImage à appliquer au fichier/dossier au chemin que vous lui donnez.

+0

Est-ce que cela fonctionne pour Mac HD et d'autres volumes? –

+0

Non, cela ne fonctionnera pas pour les volumes HD et autres. –

Questions connexes