• DnD.cpp
  • #include "GraphicsHelper.h"
    #include <Gorgon/Graphics/EmptyImage.h>
    #include <Gorgon/Input/Layer.h>
    #include <Gorgon/Input/DnD.h>
    #include <Gorgon/Resource/GID.h>
    #include <Gorgon/Graphics/StackedObject.h>
    #include <Gorgon/Graphics/TintedObject.h>
    
    
    void Init();
    
    std::string helptext = 
        "Key list:\n"
    	"esc\tClose\n"
    ;
    using namespace Gorgon;
    
    namespace GID = Gorgon::Resource::GID;
    
    int main() {
    	Application app("generictest", "Test", helptext);
    
    	Graphics::Layer l;
        app.wind.Add(l);
    
    	auto cursorhead = Triangle1(12, 12);
    	cursorhead.Prepare();
    	auto cursortail_img = Triangle1(8, 8);
    	cursortail_img.Prepare();
    	Graphics::TintedBitmapProvider cursortail(cursortail_img, 0xff000000);
    	Graphics::StackedObjectProvider cursor(cursorhead, cursortail, {1, 4});
    
    
    	Graphics::DrawablePointer ptr(cursor.CreateAnimation(), 0,0);
    
    	app.wind.Pointers.Add(Graphics::PointerType::Arrow, ptr);
    	app.wind.SwitchToLocalPointers();
    
    	auto bmp = Pattern(2);
    	bmp.Prepare();
    
    	Graphics::BlankImage bg;
    
    	bg.DrawIn(l, 40, 40, 100, 100, 0xffffa090);
    	bmp.DrawIn(l, 40, 40, 100, 100, 0x80000000);
    
    	bg.DrawIn(l, 200, 200, 100, 100, 0xff606060);
    
    	Input::Layer inlayer;
    	app.wind.Add(inlayer);
    	inlayer.Move({200,200});
    	inlayer.Resize(100,100);
    
    	inlayer.SetOver([] {
    		std::cout<<"Mouse over."<<std::endl;
    	});
    	
    	inlayer.SetDown([] () {
    		Input::BeginDrag("AAa");
    	});
    
    	Input::DragStarted.Register([](Input::DragInfo &info) {
    		std::cout<<"Drag operation has started with: "<<std::endl;
            
            for(auto &data : info) {
                std::cout<<"   "<<data.Name();
                if(info.IsDataReady()) 
                    std::cout<<": "<<data.Text()<<std::endl;
                else
                    std::cout<<": [Data not ready!]"<<std::endl;
            }
    	});
    
    	Input::DragEnded.Register([](Input::DragInfo &info, bool status) {
    		std::cout<<"Drag operation has "<<(status ? "successfully finished":"failed")<<" with:"<<std::endl;
            
            for(auto &data : info) {
                std::cout<<"   "<<data.Name();
                if(info.IsDataReady()) 
                    std::cout<<": "<<data.Text()<<std::endl;
                else
                    std::cout<<": [Data not ready!]"<<std::endl;
            }
    	});
    
    	Input::DropTarget target;
    	app.wind.Add(target);
    	target.Move(40,40);
    	target.Resize(100,100);
    
    	target.SetOver([](Input::DragInfo &info) {
    		std::cout<<"Over"<<std::endl;
    
    		return true;
    	});
    
    	target.SetOut([](Input::DragInfo &info) {
    		std::cout<<"Out"<<std::endl;
    	});
    
    	target.SetDrop([](Input::DragInfo &info) {
    		if(info.HasData(GID::Text)) {
    			std::cout<<"Accepted: "<<info.GetData(GID::Text).Text()<<std::endl;
    		}
    		else if(info.HasData(GID::File)) {
    			std::cout<<"Accepted: "<<info.GetData(GID::File).Text()<<std::endl;
    		}
    
    		return true;
    	});
        
        Graphics::Layer l2;
        app.wind.Add(l2);
    
    	while(true) {
            l2.Clear();
            app.sty.Print(l2, String::From(app.wind.GetMouseLocation()),0,0);
            
    		Gorgon::NextFrame();
    	}
    
    	return 0;
    }