ide: Layout designer D&D on layouts, items

git-svn-id: svn://ultimatepp.org/upp/trunk@9264 f0d560ea-af0d-0410-9eb7-867de7ffcac7
This commit is contained in:
cxl 2015-12-05 20:05:31 +00:00
parent afca7630b7
commit bd727f2c83
3 changed files with 67 additions and 0 deletions

View file

@ -405,6 +405,8 @@ private:
void Duplicate();
void MoveUp();
void MoveDown();
void DnDInsert(int line, PasteClip& d);
void Drag();
void SortItems();
void SelectAll();
@ -437,6 +439,8 @@ private:
void NextLayout();
void MoveLayoutUp();
void MoveLayoutDown();
void DnDInsertLayout(int line, PasteClip& d);
void DragLayout();
void LayoutMenu(Bar& bar);
void EditBar(Bar& bar);

View file

@ -1251,6 +1251,41 @@ void LayDes::MoveDown()
ReloadItems();
}
void LayDes::DnDInsert(int line, PasteClip& d)
{
if(GetInternalPtr<ArrayCtrl>(d, "layout-item") == &item && item.IsCursor() &&
!IsNull(currentlayout) && cursor.GetCount() && d.Accept()) {
SaveState();
LayoutData& l = CurrentLayout();
Buffer<bool> sel(l.item.GetCount(), false);
int n = l.item.GetCount();
l.item.InsertN(n, n);
for(int i = 0; i < cursor.GetCount(); i++)
sel[cursor[i]] = true;
cursor.Clear();
int j = n;
for(int i = 0; i < line; i++)
if(!sel[i])
l.item.Swap(j++, i);
for(int i = 0; i < n; i++)
if(sel[i]) {
cursor.Add(j - n);
l.item.Swap(j++, i);
}
for(int i = line; i < n; i++)
if(!sel[i])
l.item.Swap(j++, i);
l.item.Remove(0, n);
ReloadItems();
}
}
void LayDes::Drag()
{
item.DoDragAndDrop(InternalClip(item, "layout-item"), item.GetDragSample(), DND_MOVE);
}
bool RectLess(const Rect& a, const Rect& b)
{
int d = min(a.bottom, b.bottom) - max(a.top, b.top);
@ -1469,6 +1504,28 @@ void LayDes::MoveLayoutDown()
}
}
void LayDes::DnDInsertLayout(int line, PasteClip& d)
{
if(GetInternalPtr<ArrayCtrl>(d, "layout") == &list && list.IsCursor() &&
line >= 0 && line <= layout.GetCount() && d.Accept()) {
if(!IsNull(search)) {
search <<= Null;
SyncLayoutList();
}
int c = list.GetKey();
layout.Move(c, line);
if(c <= line)
line--;
SyncLayoutList();
GoTo(line);
}
}
void LayDes::DragLayout()
{
list.DoDragAndDrop(InternalClip(list, "layout"), list.GetDragSample(), DND_MOVE);
}
void LayDes::LayoutMenu(Bar& bar)
{
bool iscursor = list.IsCursor();

View file

@ -322,6 +322,9 @@ LayDes::LayDes()
item.NoWantFocus();
item.WhenBar = THISBACK(MoveBar);
item.WhenDrag = THISBACK(Drag);
item.WhenDropInsert = THISBACK(DnDInsert);
SetFrame(toolbar);
AddFrame(InsetFrame());
AddFrame(sb);
@ -336,6 +339,9 @@ LayDes::LayDes()
list.WhenLeftDouble = THISBACK(RenameLayout);
list.NoWantFocus();
list.WhenDrag = THISBACK(DragLayout);
list.WhenDropInsert = THISBACK(DnDInsertLayout);
search.NullText("Search (Ctrl+F)");
search <<= THISBACK(Search);
search.SetFilter(CharFilterToUpper);