Implemented drag/drop from one ShowImage window to another
git-svn-id: file:///srv/svn/repos/haiku/trunk/current@5653 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -45,6 +45,7 @@ const uint32 MSG_DITHER_IMAGE = 'mDIM';
|
|||||||
const uint32 MSG_MODIFIED = 'mMOD';
|
const uint32 MSG_MODIFIED = 'mMOD';
|
||||||
const uint32 MSG_UPDATE_STATUS = 'mUPS';
|
const uint32 MSG_UPDATE_STATUS = 'mUPS';
|
||||||
const uint32 MSG_SELECTION = 'mSEL';
|
const uint32 MSG_SELECTION = 'mSEL';
|
||||||
|
const uint32 MSG_SELECTION_BITMAP = 'mSBT';
|
||||||
const uint32 MSG_PAGE_FIRST = 'mPGF';
|
const uint32 MSG_PAGE_FIRST = 'mPGF';
|
||||||
const uint32 MSG_PAGE_LAST = 'mPGL';
|
const uint32 MSG_PAGE_LAST = 'mPGL';
|
||||||
const uint32 MSG_PAGE_NEXT = 'mPGN';
|
const uint32 MSG_PAGE_NEXT = 'mPGN';
|
||||||
|
|||||||
@@ -895,13 +895,9 @@ ShowImageView::BeginDrag(BPoint sourcePoint)
|
|||||||
BMessage drag(B_SIMPLE_DATA);
|
BMessage drag(B_SIMPLE_DATA);
|
||||||
drag.AddInt32("be:actions", B_COPY_TARGET);
|
drag.AddInt32("be:actions", B_COPY_TARGET);
|
||||||
drag.AddString("be:clip_name", "Bitmap Clip");
|
drag.AddString("be:clip_name", "Bitmap Clip");
|
||||||
// XXX undocumented fields
|
// ShowImage specific fields
|
||||||
drag.AddPoint("be:_source_point", sourcePoint);
|
drag.AddPoint("be:_source_point", sourcePoint);
|
||||||
drag.AddRect("be:_frame", fSelectionRect);
|
drag.AddRect("be:_frame", fSelectionRect);
|
||||||
// XXX meaning unknown???
|
|
||||||
// drag.AddInt32("be:_format", e.g.: B_TGA_FORMAT);
|
|
||||||
// drag.AddInt32("be_translator", translator_id);
|
|
||||||
// drag.AddPointer("be:_bitmap_ptr, ?);
|
|
||||||
if (AddSupportedTypes(&drag, bitmap)) {
|
if (AddSupportedTypes(&drag, bitmap)) {
|
||||||
// we also support "Passing Data via File" protocol
|
// we also support "Passing Data via File" protocol
|
||||||
drag.AddString("be:types", B_FILE_MIME_TYPE);
|
drag.AddString("be:types", B_FILE_MIME_TYPE);
|
||||||
@@ -912,6 +908,7 @@ ShowImageView::BeginDrag(BPoint sourcePoint)
|
|||||||
sourcePoint.y *= fScaleY;
|
sourcePoint.y *= fScaleY;
|
||||||
// DragMessage takes ownership of bitmap
|
// DragMessage takes ownership of bitmap
|
||||||
DragMessage(&drag, bitmap, B_OP_ALPHA, sourcePoint);
|
DragMessage(&drag, bitmap, B_OP_ALPHA, sourcePoint);
|
||||||
|
bitmap = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1376,7 +1373,54 @@ void
|
|||||||
ShowImageView::MessageReceived(BMessage *pmsg)
|
ShowImageView::MessageReceived(BMessage *pmsg)
|
||||||
{
|
{
|
||||||
switch (pmsg->what) {
|
switch (pmsg->what) {
|
||||||
|
case MSG_SELECTION_BITMAP:
|
||||||
|
{
|
||||||
|
// In response to a B_SIMPLE_DATA message, a view will
|
||||||
|
// send this message and expect a reply with a pointer to
|
||||||
|
// the currently selected bitmap clip. Although this view
|
||||||
|
// allocates the BBitmap * sent in the reply, it is only
|
||||||
|
// to be used and deleted by the view that is being replied to.
|
||||||
|
BMessage msg;
|
||||||
|
msg.AddPointer("be:_bitmap_ptr", CopySelection());
|
||||||
|
pmsg->SendReply(&msg);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case B_SIMPLE_DATA:
|
||||||
|
// If a user drags a clip from another ShowImage window,
|
||||||
|
// request a BBitmap pointer to that clip, allocated by the
|
||||||
|
// other view, for use solely by this view, so that it can
|
||||||
|
// be dropped/pasted onto this view.
|
||||||
|
if (pmsg->WasDropped()) {
|
||||||
|
BMessenger retMsgr, localMsgr(this);
|
||||||
|
retMsgr = pmsg->ReturnAddress();
|
||||||
|
if (retMsgr != localMsgr) {
|
||||||
|
BMessage msgReply;
|
||||||
|
retMsgr.SendMessage(MSG_SELECTION_BITMAP, &msgReply);
|
||||||
|
BBitmap *bitmap = NULL;
|
||||||
|
if (msgReply.FindPointer("be:_bitmap_ptr",
|
||||||
|
reinterpret_cast<void **>(&bitmap)) == B_OK) {
|
||||||
|
BRect sourceRect;
|
||||||
|
BPoint point, sourcePoint;
|
||||||
|
pmsg->FindPoint("be:_source_point", &sourcePoint);
|
||||||
|
pmsg->FindRect("be:_frame", &sourceRect);
|
||||||
|
point = pmsg->DropPoint();
|
||||||
|
point.Set(point.x - (sourcePoint.x - sourceRect.left),
|
||||||
|
point.y - (sourcePoint.y - sourceRect.top));
|
||||||
|
// adjust drop point before scaling is factored in
|
||||||
|
point = ConvertFromScreen(point);
|
||||||
|
point = ViewToImage(point);
|
||||||
|
|
||||||
|
PasteBitmap(bitmap, point);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
case B_COPY_TARGET:
|
case B_COPY_TARGET:
|
||||||
|
printf("\n\nB_COPY_TARGET:\n");
|
||||||
|
pmsg->PrintToStream();
|
||||||
HandleDrop(pmsg);
|
HandleDrop(pmsg);
|
||||||
break;
|
break;
|
||||||
case B_MOUSE_WHEEL_CHANGED:
|
case B_MOUSE_WHEEL_CHANGED:
|
||||||
@@ -1485,31 +1529,38 @@ ShowImageView::Cut()
|
|||||||
AddWhiteRect(rect);
|
AddWhiteRect(rect);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
ShowImageView::PasteBitmap(BBitmap *bitmap, BPoint point)
|
||||||
|
{
|
||||||
|
if (bitmap && bitmap->IsValid()) {
|
||||||
|
MergeSelection();
|
||||||
|
|
||||||
|
SetHasSelection(true);
|
||||||
|
fSelBitmap = bitmap;
|
||||||
|
fCopyFromRect = BRect();
|
||||||
|
fSelectionRect = bitmap->Bounds();
|
||||||
|
|
||||||
|
if (fBitmap->Bounds().Contains(point))
|
||||||
|
// Set the selection rectangle to the same location it was
|
||||||
|
// copied from, but only if the background bitmap is large enough
|
||||||
|
// to contain that point
|
||||||
|
fSelectionRect.OffsetBy(point);
|
||||||
|
|
||||||
|
Invalidate();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
ShowImageView::Paste()
|
ShowImageView::Paste()
|
||||||
{
|
{
|
||||||
if (be_clipboard->Lock()) {
|
if (be_clipboard->Lock()) {
|
||||||
BMessage *pclip;
|
BMessage *pclip;
|
||||||
if ((pclip = be_clipboard->Data()) != NULL) {
|
if ((pclip = be_clipboard->Data()) != NULL) {
|
||||||
BBitmap *pbits = dynamic_cast<BBitmap *>(BBitmap::Instantiate(pclip));
|
BPoint point(0, 0);
|
||||||
if (pbits) {
|
pclip->FindPoint("be:location", &point);
|
||||||
MergeSelection();
|
BBitmap *pbits;
|
||||||
|
pbits = dynamic_cast<BBitmap *>(BBitmap::Instantiate(pclip));
|
||||||
SetHasSelection(true);
|
PasteBitmap(pbits, point);
|
||||||
fSelBitmap = pbits;
|
|
||||||
fCopyFromRect = BRect();
|
|
||||||
fSelectionRect = pbits->Bounds();
|
|
||||||
|
|
||||||
BPoint point;
|
|
||||||
if (pclip->FindPoint("be:location", &point) == B_OK &&
|
|
||||||
fBitmap->Bounds().Contains(point))
|
|
||||||
// Set the selection rectangle to the same location it was
|
|
||||||
// copied from, but only if the background bitmap is large enough
|
|
||||||
// to contain that point
|
|
||||||
fSelectionRect.OffsetBy(point);
|
|
||||||
|
|
||||||
Invalidate();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
be_clipboard->Unlock();
|
be_clipboard->Unlock();
|
||||||
|
|||||||
@@ -133,6 +133,7 @@ private:
|
|||||||
void AddToRecentDocuments();
|
void AddToRecentDocuments();
|
||||||
void AddWhiteRect(BRect &rect);
|
void AddWhiteRect(BRect &rect);
|
||||||
void GetSelMergeRects(BRect &srcBits, BRect &destRect);
|
void GetSelMergeRects(BRect &srcBits, BRect &destRect);
|
||||||
|
void PasteBitmap(BBitmap *bitmap, BPoint point);
|
||||||
void MergeSelection();
|
void MergeSelection();
|
||||||
void DeleteScaler();
|
void DeleteScaler();
|
||||||
void DeleteBitmap();
|
void DeleteBitmap();
|
||||||
|
|||||||
Reference in New Issue
Block a user