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

ArrayCtrlDnD

 

Drag&Drop with ArrayCtrl as target

 

 

main.cpp

 

#include <CtrlLib/CtrlLib.h>

 

using namespace Upp;

 

struct App : TopWindow {

    ArrayCtrl a, b;

    Splitter  s;

 

    void DnD(PasteClip& d)

    {

        if(AcceptText(d)) {

            a.Add(GetString(d), GetString(d));

            a.SetFocus();

        }

    }

 

    void DnDInsert(int line, PasteClip& d)

    {

        if(AcceptInternal<ArrayCtrl>(d, "array")) {

            a.InsertDrop(line, d);

            a.SetFocus();

        }

        if(AcceptText(d)) {

            a.Insert(line);

            a.Set(line, 0, GetString(d));

            a.SetCursor(line);

            a.SetFocus();

        }

    }

 

    void DnDInsertB(int line, PasteClip& d)

    {

        if(AcceptInternal<ArrayCtrl>(d, "array")) {

            const ArrayCtrl& src = GetInternal<ArrayCtrl>(d);

            bool self = &src == &b;

            Vector< Vector<Value> > data;

            for(int i = 0; i < src.GetCount(); i++)

                if(src.IsSel(i)) {

                    Value v = src.Get(i, 0);

                    data.Add().Add(IsNumber(v) ? FormatIntRoman((int)src.Get(i, 0)) : String(v));

                }

            b.InsertDrop(line, data, d, self);

            b.SetFocus();

        }

    }

 

    void Drag()

    {

        if(a.DoDragAndDrop(InternalClip(a, "array")) == DND_MOVE)

            a.RemoveSelection();

    }

 

    void DragB()

    {

        if(b.DoDragAndDrop(InternalClip(b, "array"), b.GetDragSample()) == DND_MOVE)

            b.RemoveSelection();

    }

 

    App() {

        a.AddColumn("You can paste the text here too");

        a.MultiSelect();

        a.WhenDropInsert = [=](int line, PasteClip& d) { DnDInsert(line, d); };

        a.WhenDrop = [=] (PasteClip& d) { DnD(d); };

        a.WhenDrag = [=] { Drag(); };

 

        b.AddColumn("Roman numbers");

        b.MultiSelect();

        b.WhenDropInsert = [=](int line, PasteClip& d) { DnDInsertB(line, d); };

        b.WhenDrag = [=] { DragB(); };

 

        Add(s.Horz(a, b));

        for(int i = 0; i < 15; i++) {

            a.Add(i);

            b.Add(FormatIntRoman(i, true));

        }

        Sizeable();

    }

};

 

GUI_APP_MAIN

{

    App().Run();

}

 

 

 

 

Do you want to contribute?