Overview
Examples
Screenshots
Comparisons
Applications
Download
Documentation
Tutorials
UppHub
Status & Roadmap
FAQ
Authors & License
Forums
Funding U++
Search on this site











SourceForge.net Logo

SourceForge.net Logo

GitHub Logo

Discord Logo

DragAndDrop1

 

Low-level drag and drop operation

 

 

main.cpp

 

#include <CtrlLib/CtrlLib.h>

 

using namespace Upp;

 

struct MyAppData {

    String text;

    Color  color;

};

 

struct MyApp : TopWindow {

    Point     pos;

    MyAppData data;

    Point     dragpos;

    

    virtual void CancelMode();

    virtual void Paint(Draw& w);

    virtual void DragAndDrop(Point p, PasteClip& clip);

    virtual void DragLeave();

    virtual void LeftDrag(Point p, dword keyflags);

    

    MyApp();

};

 

void MyApp::CancelMode()

{

    dragpos = Null;

    Refresh();

}

 

void MyApp::DragAndDrop(Point p, PasteClip& clip)

{

    if(clip.Accept("MyAppData")) {

        String bin = clip;

        if(bin.GetLength() > sizeof(Color)) { // prudent check

            pos = p;

            memcpy(&data.color, ~bin, sizeof(Color));

            data.text = bin.Mid(sizeof(Color));

        }

        Refresh();

    }

    if(AcceptText(clip)) {

        pos = p;

        data.text = GetString(clip);

    }

    dragpos = clip.IsAccepted() ? p : Null;

    Refresh();

}

 

void MyApp::DragLeave()

{

    dragpos = Null;

    Refresh();

}

 

void MyApp::LeftDrag(Point p, dword keyflags)

{

    String bin;

    bin.Cat((byte *)&data.color, sizeof(data.color));

    bin.Cat(data.text);

    VectorMap<String, ClipData> d;

    d.Add("MyAppData", bin);

    Append(d, data.text);

    Size sz(128, 64);

    ImageDraw iw(sz);

    iw.DrawRect(sz, Black());

    iw.Alpha().DrawRect(sz, Black());

    iw.Alpha().DrawText(0, 0, data.text, Courier(14), White());

    DoDragAndDrop(d, iw);

}

 

void MyApp::Paint(Draw& w)

{

    w.DrawRect(GetSize(), SColorPaper());

    w.DrawText(pos.x, pos.y, data.text, StdFont(), data.color);

    if(!IsNull(dragpos))

        w.DrawRect(RectC(dragpos.x - 1, dragpos.y - 1, 3, 3), LtBlue);

}

 

MyApp::MyApp()

{

    data.text = FormatIntRoman(Random(2000));

    data.color = Color(Random() & 127, Random() & 127, Random() & 127);

    pos = Point(10, 10);

    SetRect(0, 0, 500, 100);

    dragpos = Null;

}

 

GUI_APP_MAIN

{

    MyApp().Run();

}

 

 

 

 

Do you want to contribute?