void dragTarget::recursiveAppend ( QTreeWidgetItem *source, QTreeWidgetItem *destination ) { QTreeWidgetItem *tmp = destination; for ( int i = 0; i < source -> childCount(); i++ ) { tmp = ramifica ( source ->child ( i ) -> text ( 1 ) + source ->child ( i ) -> text ( 0 ) + "!*mimetosend:" + source ->child ( i ) -> text ( 2 ), destination ); recursiveAppend ( source -> child ( i ), tmp ); } }
/* *Função Main */ int main(int argc, char const *argv[]) { // declara uma Pilha arvore Pilha* arvore; //faz arvore receber a entrada do usuário arvore = entrada_dados(); // declara e atribui um valor para a variável que contará o número de passos int nivel=0; //Laço de repetição que controlá quando o algoritimo achou o resultado do{ //chama a função para criar uma arvore de possibilidades arvore = ramifica(arvore,&nivel); }while(arvore != NULL); //imprime o resultado para o usuário printf("Número de passos %d\n",nivel); //fim do programa return 0; }
void dragTarget::dropEvent ( QDropEvent *event ) { //-------ripristiniamo a 0 gli indicatori--------------// puts("dropEvent deleting indicator"); if(indicatorToRestore != NULL) { delete indicatorToRestore; indicatorToRestore = NULL; } //cancelliamo l'indicatore //--------------------------------------------------------// puts("indicatore cancellato"); hideIndicator(); puts("nascondo indicatore"); if ( subLevel == false ) { //evito la duplicazione di uno stesso elemento sotto uno stesso ramo puts("inizio a ramificare"); QTreeWidgetItem *ultimo; if(event -> mimeData()->hasFormat("aku/newarchive")) ultimo = ramifica ( QString().fromAscii ( event -> mimeData() -> data ( "aku/newarchive" ) ),this); else ultimo = ramifica ( QString().fromAscii ( event -> mimeData() -> data ( "aku/newarchive-fromHere" ) ),this); bool allow = false; for ( int i = 0; i < topLevelItemCount(); i++ ) { if ( topLevelItem ( i ) -> text ( 1 ) + topLevelItem ( i ) -> text ( 0 ) == ultimo -> text ( 1 ) + ultimo -> text ( 0 ) && topLevelItem ( i ) != ultimo ) //se esiste già nego la possibilità di allocare l'elemento { delete ultimo; allow = false; break; } else allow = true; } if ( allow == true ) { //tramite la funzione retrieveChildren appendiamo anche tutti i figli della directory if(event -> mimeData() -> hasFormat("aku/newarchive-fromHere")) { //se selectedItems e' diverso da 0 sicuramente stiamo trascinando un elemento di questa stessa lista, quindi devo procedere al recupero di tutti i suoi figli prima di eliminarlo for(int i = 0; i < currentItem -> childCount(); i++) { //mi tocca simulare un mime per poter trascinare anche i figli QTreeWidgetItem *item = ramifica ( currentItem-> child ( i ) -> text ( 1 ) + currentItem -> child ( i ) -> text ( 0 ) + "!*mimetosend:" + currentItem -> child ( i ) -> text ( 2 ), ultimo); recursiveAppend ( currentItem -> child ( i ), item ); //passo come destinazione l'item appena creato } delete currentItem; event -> acceptProposedAction(); } else retrieveChildren ( ultimo ); //altrimenti recuperiamo i figli dalle directory, perchè significa che il trascinamento avviene dall'esterno event -> acceptProposedAction(); } else { event -> ignore(); return; } } else { //succede esattamente la stessa cosa di quello precedente, solo che con la ramificazione QList<QTreeWidgetItem*> selectedItems = this -> selectedItems(); QTreeWidgetItem *ultimo; if(event -> mimeData()->hasFormat("aku/newarchive")) ultimo = ramifica ( QString().fromAscii ( event -> mimeData() -> data ( "aku/newarchive" ) ), padre); else ultimo = ramifica ( QString().fromAscii ( event -> mimeData() -> data ( "aku/newarchive-fromHere" ) ), padre); bool allow = false; for ( int i = 0; i < padre -> childCount(); i++ ) { if ( padre -> child ( i ) -> text ( 1 ) + padre -> child ( i ) -> text ( 0 ) == ultimo -> text ( 1 ) + ultimo -> text ( 0 ) && padre -> child ( i ) != ultimo ) //se esiste già { delete ultimo; allow = false; break; } else allow = true; } if ( allow == true ) { padre -> setExpanded ( true ); if ( selectedItems.size() != 0 ) //se stiamo trascinando un elemento della stessa lista ci riportiamo i figli { for ( int i = 0; i < selectedItems[0] -> childCount(); i++ ) { //mi tocca simulare un mime per poter trascinare anche i figli QTreeWidgetItem *item = ramifica ( selectedItems[0] -> child ( i ) -> text ( 1 ) + selectedItems[0] -> child ( i ) -> text ( 0 ) + "!*mimetosend:" + selectedItems[0] -> child ( i ) -> text ( 2 ), ultimo ); recursiveAppend ( selectedItems[0] -> child ( i ), item ); } delete selectedItems[0]; } else retrieveChildren ( ultimo ); //altrimenti recuperiamo i figli dalle directory event -> acceptProposedAction(); } else { event -> ignore(); return; } } }