Ticket #2508: MediaPlayer - Playlist Icons.diff

File MediaPlayer - Playlist Icons.diff, 4.4 KB (added by anxiety, 11 years ago)

Adds file icons to playlist

  • src/apps/mediaplayer/playlist/PlaylistListView.cpp

     
    1515#include <ScrollBar.h>
    1616#include <ScrollView.h>
    1717#include <Window.h>
     18#include <NodeInfo.h>
     19#include <Mime.h>
     20#include <Bitmap.h>
    1821
    1922#include "CommandStack.h"
    2023#include "Controller.h"
     
    5154    return ceilf(fh.ascent * 0.8);
    5255}
    5356
     57static BString
     58get_mime_string(const entry_ref* ref)
     59{
     60    BFile file(ref, B_READ_ONLY);
     61    BNodeInfo nodeInfo(&file);
     62    char mimeString[B_MIME_TYPE_LENGTH];
     63    if (nodeInfo.GetType(mimeString) != B_OK) {
     64        BMimeType type;
     65        if (BMimeType::GuessMimeType(ref, &type) != B_OK)
     66            return BString();
    5467
     68        strlcpy(mimeString, type.Type(), B_MIME_TYPE_LENGTH);
     69        nodeInfo.SetType(type.Type());
     70    }
     71    return BString(mimeString);
     72}
     73
    5574class PlaylistItem : public SimpleItem {
    5675 public:
    57                                 PlaylistItem(const entry_ref& ref);
    58         virtual                 ~PlaylistItem();
     76             PlaylistItem(const entry_ref& ref);
     77    virtual ~PlaylistItem();
    5978
    60                 void            Draw(BView* owner, BRect frame,
    61                                     const font_height& fh,
    62                                     bool tintedLine, uint32 mode,
    63                                     bool active,
    64                                     uint32 playbackState);
     79    void Draw(BView* owner, BRect frame, const font_height& fh, bool tintedLine,
     80                uint32 mode, bool active, uint32 playbackState);
    6581
    66  private:
    67                 entry_ref       fRef;
    68 
     82private:
     83    entry_ref   fRef;
     84    BBitmap *   fBitmap;
    6985};
    7086
    7187
    7288PlaylistItem::PlaylistItem(const entry_ref& ref)
    7389    : SimpleItem(ref.name),
    74       fRef(ref)
     90      fRef(ref),
     91      fBitmap(NULL)
    7592{
     93    BRect rect(0, 0, B_MINI_ICON - 1, B_MINI_ICON - 1);
     94
     95#ifdef HAIKU_TARGET_PLATFORM_HAIKU
     96    fBitmap = new BBitmap(rect, B_RGBA32);
     97#else
     98    fBitmap = new BBitmap(rect, B_CMAP8);
     99#endif
     100
     101    BString mimeString = get_mime_string(&ref);
     102    BMimeType mimeType(mimeString.String());
     103    status_t status = mimeType.GetIcon(fBitmap, B_MINI_ICON);
     104
     105    // get supertype icon
     106    if (status != B_OK) {
     107        BMimeType superType;
     108        status = mimeType.GetSupertype(&superType);
     109        if (status == B_OK)
     110            status = superType.GetIcon(fBitmap, B_MINI_ICON);
     111    }
     112
     113    // get default icon
     114    if (status != B_OK) {
     115        BMimeType genericType(B_FILE_MIME_TYPE);
     116        status = genericType.GetIcon(fBitmap, B_MINI_ICON);
     117    }
     118
     119    if (status != B_OK) {
     120        delete fBitmap;
     121        fBitmap = NULL;
     122    }
    76123}
    77124
    78125
    79126PlaylistItem::~PlaylistItem()
    80127{
     128    delete fBitmap;
    81129}
    82130
    83131
     
    88136    rgb_color color = (rgb_color){ 255, 255, 255, 255 };
    89137    if (tintedLine)
    90138        color = tint_color(color, 1.04);
     139
    91140    // background
    92141    if (IsSelected())
    93142        color = tint_color(color, B_DARKEN_2_TINT);
    94143    owner->SetLowColor(color);
    95144    owner->FillRect(frame, B_SOLID_LOW);
     145
    96146    // label
    97147    rgb_color black = (rgb_color){ 0, 0, 0, 255 };
    98148    owner->SetHighColor(black);
    99     const char* text = Text();
    100149    switch (mode) {
    101150        case DISPLAY_NAME:
    102151            // TODO
     
    108157            break;
    109158    }
    110159
    111     float playbackMarkSize = playback_mark_size(fh);
    112     float textOffset = text_offset(fh);
     160    float iconOffset = frame.left + 4;
     161    float textOffset = iconOffset + B_MINI_ICON + 4;
     162    float playbackSize = playback_mark_size(fh);
     163    float playbackOffset = frame.Width() - playbackSize - 4;
    113164
    114     BString truncatedString(text);
     165    BString truncatedString(Text());
     166
    115167    owner->TruncateString(&truncatedString, B_TRUNCATE_MIDDLE,
    116         frame.Width() - playbackMarkSize - textOffset);
    117     owner->DrawString(truncatedString.String(),
    118         BPoint(frame.left + playbackMarkSize + textOffset,
     168        playbackOffset - textOffset - text_offset(fh) - 4);
     169    owner->DrawString(truncatedString.String(), BPoint(textOffset,
    119170            floorf(frame.top + frame.bottom + fh.ascent) / 2 - 1));
    120171
     172    if (fBitmap) {
     173        BPoint point(iconOffset,
     174            frame.top + (frame.Height() - B_MINI_ICON) / 2.0f);
     175        owner->SetDrawingMode(B_OP_ALPHA);
     176        owner->DrawBitmap(fBitmap, point);
     177    }
     178
     179    owner->SetDrawingMode(B_OP_COPY);
     180
    121181    // playmark
    122182    if (active) {
    123183        rgb_color green = (rgb_color){ 0, 255, 0, 255 };
    124184        if (playbackState != PLAYBACK_STATE_PLAYING)
    125185            green = tint_color(color, B_DARKEN_1_TINT);
    126186
    127         BRect r(0, 0, playbackMarkSize, playbackMarkSize);
    128         r.OffsetTo(frame.left + 4,
    129             ceilf((frame.top + frame.bottom) / 2) - 5);
     187        BRect r(0, 0, playbackSize, playbackSize);
     188        r.OffsetTo(playbackOffset, ceilf((frame.top + frame.bottom) / 2) - 4);
    130189
    131190        BPoint arrow[3];
    132191        arrow[0] = r.LeftTop();