Overview
Examples
Screenshots
Comparisons
Applications
Download
Documentation
Tutorials
Bazaar
Status & Roadmap
FAQ
Authors & License
Forums
Funding Ultimate++
Search on this site
Search in forums












SourceForge.net Logo
Home » U++ Library support » ArrayCtrl, HeaderCtrl & GridCtrl » Problem with Drag&Drop in ArrayCtrl
Re: Problem with Drag&Drop in ArrayCtrl [message #22580 is a reply to message #22577] Tue, 28 July 2009 09:49 Go to previous messageGo to previous message
koldo is currently offline  koldo
Messages: 3437
Registered: August 2008
Senior Veteran
Hello Mirek

Thank you for the testcase. I have changed it to show the problem.

RefreshRow works well but Drag & Drop does not work while there are thumbnails to be loaded.

To run it put the file "c:\\demo.jpg" that will be the thumbnail to be loaded.

Perhaps to do this right would I have to use multitasking ?

Best regards
Koldo

#include <CtrlLib/CtrlLib.h>

using namespace Upp;

Array <Image> imgLst;
	
struct TestDisplay : Display {
	virtual void Paint(Draw& w, const Rect& r, const Value& q, Color ink, Color paper, dword style) const
	{
		w.DrawRect(r, paper);
		int id = q.Is<int>() ? q : -1;
		if (id >= 0 && id < imgLst.GetCount()) {
			Rect rect(r.left, r.top, r.left+70, r.top+70);
			if (imgLst[id])
				w.DrawImage(rect, imgLst[id]);
			else
				Display::Paint(w, r, "Image not loaded", ink, paper, style);
		} else
			Display::Paint(w, r, "Image not available", ink, paper, style);
	}
};

struct App : TopWindow {
	ArrayCtrl a, b;
	Splitter  s;
	TimeCallback tb;
	
	void Timer()
	{
		for (int i = 0; i < imgLst.GetCount(); ++i) {
			if (!imgLst[i]) {
				imgLst[i] = StreamRaster::LoadFileAny("c:\\demo.jpg");
				a.RefreshRow(i);
				return;
			}
		}
	}

	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();
	}

	typedef App CLASSNAME;

	App() {
		a.AddColumn("You can paste the text here too").SetDisplay(Single<TestDisplay>());
		a.MultiSelect();
		a.WhenDropInsert = THISBACK(DnDInsert);
		a.WhenDrop = THISBACK(DnD);
		a.WhenDrag = THISBACK(Drag);
		a.SetLineCy(70);
		
		b.AddColumn("Roman numbers");
		b.MultiSelect();
		b.WhenDropInsert = THISBACK(DnDInsertB);
		b.WhenDrag = THISBACK(DragB);

		Add(s.Horz(a, b));
		for(int i = 0; i < 40; i++) {
			a.Add(i);
			imgLst.Add();
			b.Add(FormatIntRoman(i, true));
		}
		Sizeable();
		
		tb.Set(-200, THISBACK(Timer));
	}
};

GUI_APP_MAIN
{
	App().Run();
}



Best regards
IƱaki
 
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Previous Topic: Substring formating in ArrayCtrl (SqlCtrl)
Next Topic: Right Click on GridCtrl
Goto Forum:
  


Current Time: Fri Jul 18 03:48:08 CEST 2025

Total time taken to generate the page: 0.04132 seconds