haiku/src/apps/musiccollection/MusicFileListView.h

131 lines
2.7 KiB
C++

/*
* Copyright 2011, Haiku, Inc. All rights reserved.
* Distributed under the terms of the MIT License.
*
* Authors:
* Clemens Zeidler <haiku@clemens-zeidler.de>
*/
#ifndef MUSIC_FILE_LIST_VIEW_H
#define MUSIC_FILE_LIST_VIEW_H
#include <Bitmap.h>
#include <ListItem.h>
#include <OutlineListView.h>
#include <Roster.h>
#include "QueryMonitor.h"
class FileListItem : public BStringItem {
public:
FileListItem(const char* text, WatchedFile* file = NULL)
:
BStringItem(text),
fFile(file)
{
}
WatchedFile*
File()
{
return fFile;
}
private:
WatchedFile* fFile;
};
class MusicFileListView : public BOutlineListView {
public:
MusicFileListView(const char *name)
:
BOutlineListView(name)
{
}
bool
InitiateDrag(BPoint where, int32 index, bool wasSelected)
{
int32 itemIndex = IndexOf(where);
FileListItem* item = (FileListItem*)ItemAt(itemIndex);
if (item == NULL)
return false;
const char* text = item->Text();
BRect rect(0, 0, 200, 50);
BBitmap* bitmap = new BBitmap(rect, B_RGB32, true);
BView* bitmapView = new BView(rect, "bitmap", B_FOLLOW_NONE,
B_WILL_DRAW);
bitmap->Lock();
bitmap->AddChild(bitmapView);
bitmapView->SetLowColor(255, 255, 255, 0); // transparent
bitmapView->SetHighColor(0, 0, 0, 100);
bitmapView->SetDrawingMode(B_OP_COPY);
bitmapView->FillRect(bitmapView->Bounds(), B_SOLID_LOW);
bitmapView->SetDrawingMode(B_OP_OVER);
font_height height;
bitmapView->GetFontHeight(&height);
float fontHeight = height.ascent + height.descent;
BRect latchRect = LatchRect(BRect(0, 0, item->Width(), item->Height()),
item->OutlineLevel());
bitmapView->DrawString(text, BPoint(latchRect.Width(), fontHeight));
bitmapView->Sync();
bitmap->Unlock();
BMessage dragMessage(B_SIMPLE_DATA);
dragMessage.AddPoint("click_location", where);
_RecursiveAddRefs(dragMessage, item);
BRect itemFrame(ItemFrame(itemIndex));
BPoint pt(where.x + itemFrame.left, where.y - itemFrame.top);
DragMessage(&dragMessage, bitmap, B_OP_ALPHA, pt, this);
return true;
}
void
Launch(BMessage* message)
{
int32 index;
for (int32 i = 0; ; i++) {
if (message->FindInt32("index", i, &index) != B_OK)
break;
FileListItem* item = (FileListItem*)ItemAt(index);
BMessage refs(B_REFS_RECEIVED);
_RecursiveAddRefs(refs, item);
be_roster->Launch("application/x-vnd.Haiku-MediaPlayer", &refs);
}
};
private:
void
_RecursiveAddRefs(BMessage& message, FileListItem* item)
{
WatchedFile* file = item->File();
if (file != NULL) {
message.AddRef("refs", &(file->entry));
} else {
for (int32 i = 0; i < CountItemsUnder(item, true); i++) {
_RecursiveAddRefs(message, (FileListItem*)ItemUnderAt(
item, true, i));
}
}
}
};
#endif // MUSIC_FILE_LIST_VIEW_H