From 34ff238b8850511c6b903e6eb934830a62356f1a Mon Sep 17 00:00:00 2001 From: Michael Lotz Date: Wed, 12 Apr 2006 20:26:56 +0000 Subject: [PATCH] Implemented the BRect version of DragMessage(). This just creates a drag bitmap with the rect. We may want to switch to a less heavy implementation later on though. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@17115 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/kits/interface/View.cpp | 67 +++++++++++++++---------------------- 1 file changed, 27 insertions(+), 40 deletions(-) diff --git a/src/kits/interface/View.cpp b/src/kits/interface/View.cpp index 8f6646e1ef..621514611c 100644 --- a/src/kits/interface/View.cpp +++ b/src/kits/interface/View.cpp @@ -1235,56 +1235,43 @@ BView::DragMessage(BMessage *message, BRect dragRect, BHandler *replyTo) if (!message || !dragRect.IsValid()) return; - if (replyTo == NULL) - replyTo = this; - - if (replyTo->Looper() == NULL) - debugger("DragMessage: warning - the Handler needs a looper"); - do_owner_check_no_pick(); + // calculate the offset BPoint offset; + uint32 buttons; + BMessage *current = fOwner->CurrentMessage(); + if (!current || current->FindPoint("be:view_where", &offset) != B_OK) + GetMouse(&offset, &buttons, false); + offset -= dragRect.LeftTop(); - if (!message->HasInt32("buttons")) { - BMessage *msg = fOwner->CurrentMessage(); - uint32 buttons; + // create a drag bitmap for the rect + BBitmap *bitmap = new BBitmap(dragRect, B_RGBA32); + uint32 *bits = (uint32*)bitmap->Bits(); + uint32 bytesPerRow = bitmap->BytesPerRow(); + uint32 width = dragRect.IntegerWidth() + 1; + uint32 height = dragRect.IntegerHeight() + 1; + uint32 lastRow = (height - 1) * width; - if (msg) { - if (msg->FindInt32("buttons", (int32 *)&buttons) != B_OK) { - BPoint point; - GetMouse(&point, &buttons, false); - } + memset(bits, 0x00, height * bytesPerRow); - BPoint point; - if (msg->FindPoint("be:view_where", &point) == B_OK) - offset = point - dragRect.LeftTop(); - } else { - BPoint point; - GetMouse(&point, &buttons, false); - } + // top + for (uint32 i = 0; i < width; i += 2) + bits[i] = 0xff000000; - message->AddInt32("buttons", buttons); - } + // bottom + for (uint32 i = (height % 2 == 0 ? 1 : 0); i < width; i += 2) + bits[lastRow + i] = 0xff000000; - BMessage::Private privateMessage(message); - privateMessage.SetReply(BMessenger(replyTo, replyTo->Looper())); + // left + for (uint32 i = 0; i < lastRow; i += width * 2) + bits[i] = 0xff000000; - int32 bufferSize = privateMessage.NativeFlattenedSize(); - char* buffer = new (nothrow) char[bufferSize]; - if (buffer) { - privateMessage.NativeFlatten(buffer, bufferSize); + // right + for (uint32 i = (width % 2 == 0 ? width : 0); i < lastRow; i += width * 2) + bits[width - 1 + i] = 0xff000000; - fOwner->fLink->StartMessage(AS_LAYER_DRAG_RECT); - fOwner->fLink->Attach(dragRect); - fOwner->fLink->Attach(offset); - fOwner->fLink->Attach(bufferSize); - fOwner->fLink->Attach(buffer, bufferSize); - fOwner->fLink->Flush(); - - delete [] buffer; - } else { - fprintf(stderr, "BView::DragMessage() - no memory to flatten drag message\n"); - } + DragMessage(message, bitmap, B_OP_BLEND, offset, replyTo); }