diff --git a/uppsrc/ide/LayDes/LayDes.h b/uppsrc/ide/LayDes/LayDes.h index 5005bbf00..0b9f5db75 100644 --- a/uppsrc/ide/LayDes/LayDes.h +++ b/uppsrc/ide/LayDes/LayDes.h @@ -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); diff --git a/uppsrc/ide/LayDes/laydes.cpp b/uppsrc/ide/LayDes/laydes.cpp index 16176380f..fa59fe5cd 100644 --- a/uppsrc/ide/LayDes/laydes.cpp +++ b/uppsrc/ide/LayDes/laydes.cpp @@ -1251,6 +1251,41 @@ void LayDes::MoveDown() ReloadItems(); } +void LayDes::DnDInsert(int line, PasteClip& d) +{ + if(GetInternalPtr(d, "layout-item") == &item && item.IsCursor() && + !IsNull(currentlayout) && cursor.GetCount() && d.Accept()) { + SaveState(); + LayoutData& l = CurrentLayout(); + Buffer 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(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(); diff --git a/uppsrc/ide/LayDes/laywin.cpp b/uppsrc/ide/LayDes/laywin.cpp index e763c6d36..953390324 100644 --- a/uppsrc/ide/LayDes/laywin.cpp +++ b/uppsrc/ide/LayDes/laywin.cpp @@ -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);