void CFolderHelper::StartDrag(TObject *Sender, TDragObject *&DragObject) { TElTree* tv = dynamic_cast<TElTree*>(Sender); VERIFY(Sender); drag_items.clear (); for (TElTreeItem* item=tv->GetNextSelected(0); item; item = tv->GetNextSelected(item)) drag_items.push_back(item); }
void CFolderHelper::DragOver(TObject *Sender, TObject *Source, int X, int Y, TDragState State, bool &Accept) { TElTree* tv = dynamic_cast<TElTree*>(Sender); VERIFY(Sender); TElTreeItem* tgt; for (ELVecIt it=drag_items.begin(); it!=drag_items.end(); it++){ TElTreeItem* src=*it; TSTItemPart IP; int HCol; if (!src) Accept = false; else{ tgt = tv->GetItemAt(X, Y, IP, HCol); if (tgt){ if (IsFolder(src)){ bool b = true; for (TElTreeItem* itm=tgt->Parent; itm; itm=itm->Parent) if (itm==src){b=false; break;} if (IsFolder(tgt)){ Accept = b&&(tgt!=src)&&(src->Parent!=tgt); }else if (IsObject(tgt)){ Accept = b&&(src!=tgt->Parent)&&(tgt!=src)&&(tgt->Parent!=src->Parent); } }else if (IsObject(src)){ if (IsFolder(tgt)){ Accept = (tgt!=src)&&(src->Parent!=tgt); }else if (IsObject(tgt)){ Accept = (tgt!=src)&&(src->Parent!=tgt->Parent); } } }else Accept = !!src->Parent; } if (false==Accept) return; } }
//--------------------------------------------------------------------------- // clip Drag'n'Drop // clip Mouse //. //--------------------------------------------------------------------------- void __fastcall TClipMaker::ClipDragOver(TObject *Sender, TObject *Source, int X, int Y, TDragState State, bool &Accept) { Accept = false; TElTreeDragObject* obj = dynamic_cast<TElTreeDragObject*>(Source); if (obj){ TMxPanel* A = dynamic_cast<TMxPanel*>(Sender); if (A==paClips){ TElTree* tv = dynamic_cast<TElTree*>(obj->Control); if (tv->SelectedCount){ for (TElTreeItem* item = tv->GetNextSelected(0); item; item = tv->GetNextSelected(item)){ ListItem* prop = (ListItem*)item->Tag; if (prop&&(prop->Type()==emMotion)){ Accept = true; } } } } }else{ Accept = (Sender==paClips); } }
void __fastcall TClipMaker::ClipDragDrop(TObject *Sender, TObject *Source, int X, int Y) { VERIFY (Sender==paClips); CUIClip* tgt = FindClip(X); VERIFY(tgt); TElTreeDragObject* obj = dynamic_cast<TElTreeDragObject*>(Source); if (obj){ TElTree* tv = dynamic_cast<TElTree*>(obj->Control); if (tv->SelectedCount){ for (TElTreeItem* item = tv->GetNextSelected(0); item; item = tv->GetNextSelected(item)){ ListItem* prop = (ListItem*)item->Tag; VERIFY(prop); u16 bp; BOOL fx; LPCSTR m_name = ATools->ExtractMotionName(prop->Key()); u16 m_slot = ATools->ExtractMotionSlot(prop->Key()); if (m_CurrentObject->m_SMotionRefs.size()){ CMotionDef* SM = ATools->m_RenderObject.FindMotionDef(m_name,m_slot); VERIFY(SM); bp = SM->bone_or_part; fx = SM->flags&esmFX; }else{ CSMotion* SM = ATools->FindMotion(m_name); VERIFY(SM); bp = SM->m_BoneOrPart; fx = SM->m_Flags.is(esmFX); } if (fx){ tgt->SetFX (m_name,m_slot); }else{ tgt->SetCycle (m_name,bp,m_slot); } } } }else{ float rt = float(X)/m_Zoom-tgt->RunTime(); if (rt<tgt->Length()/2.f) sel_clip->run_time = tgt->run_time-EPS_L; else sel_clip->run_time = tgt->run_time+EPS_L; } UpdateClips (); }
//--------------------------------------------------------------------------- // Drag'n'Drop //--------------------------------------------------------------------------- void CFolderHelper::DragDrop(TObject *Sender, TObject* Source, int X, int Y, TOnItemRename after_drag) { R_ASSERT(after_drag); TElTree* tv = dynamic_cast<TElTree*>(Sender); VERIFY(tv); tv->IsUpdating = true; TSTItemPart IP=(TSTItemPart)0; int hc=0; TElTreeItem* tgt_folder = tv->GetItemAt(X, Y, IP, hc); if (tgt_folder&&(IsObject(tgt_folder))) tgt_folder=tgt_folder->Parent; AnsiString base_name; MakeName(tgt_folder,0,base_name,true); AnsiString cur_fld_name=base_name; TElTreeItem* cur_folder=tgt_folder; //..FS.lock_rescan(); for (ELVecIt it=drag_items.begin(); it!=drag_items.end(); it++){ TElTreeItem* item = *it; int drg_level = item->Level; bool bFolderMove = IsFolder(item); do{ // проверяем есть ли в таргете такой элемент EItemType type = EItemType(item->Data); TElTreeItem* pNode = FindItemInFolder(type,tv,cur_folder,item->Text); if (pNode&&IsObject(item)){ Msg ("#!Item '%s' already exist in folder '%s'.",AnsiString(item->Text).c_str(),AnsiString(cur_folder->Text).c_str()); item = item->GetNext(); continue; } // если нет добавляем if (!pNode){ pNode = (type==TYPE_FOLDER)?LL_CreateFolder(tv,cur_folder,item->Text,item->ForceButtons):LL_CreateObject(tv,cur_folder,item->Text); if (type==TYPE_OBJECT) pNode->Assign(item); } if (IsFolder(item)){ cur_folder = pNode; MakeName (cur_folder,0,cur_fld_name,true); item = item->GetNext(); }else{ // rename AnsiString old_name, new_name; MakeName (item,0,old_name,false); MakeName (pNode,0,new_name,false); after_drag (old_name.c_str(),new_name.c_str(),TYPE_OBJECT); TElTreeItem* parent = item->Parent; // get next item && delete existence TElTreeItem* next = item->GetNext(); item->Delete (); if (parent&&((parent->GetLastChild()==item)||(0==parent->ChildrenCount))){ // if (0==parent->ChildrenCount) parent->Delete(); cur_folder = cur_folder?cur_folder->Parent:0; } item=next; } }while(item&&(item->Level>drg_level)); // delete folders if (bFolderMove){ AnsiString old_name; MakeName (*it,0,old_name,false); after_drag (old_name.c_str(),0,TYPE_FOLDER); (*it)->Delete (); } } //..FS.unlock_rescan(); tv->IsUpdating = false; }