//----------------------------------------------------------- void ListaOperacoes::refazerOperacao(void) { if(refazerHabilitado()) { Operacao *operacao=NULL; bool enc_ativo=false; Excecao erro; unsigned tam_enc=0, pos=0; //Calcula o tamanho do encademanto de operações atual if(!this->signalsBlocked()) tam_enc=obterTamanhoEncadeamento(); do { //Obtém elemento atual da lista de operações operacao=operacoes[idx_atual]; /* Caso seja detectada que a operação é encadeada com outras e o flag de encadeamento ativo esteja desmarcado, marca o flag para dar início a executação de várias operações de uma só vez */ if(!anular_enc && !enc_ativo && operacao->tipo_enc!=Operacao::SEM_ENCADEAMENTO) enc_ativo=true; /* Caso o encadeamento esteja ativo e a operação atual não faça parte do encadeamento, aborta a execução da operação */ else if(enc_ativo && (operacao->tipo_enc==Operacao::ENC_INICIO || operacao->tipo_enc==Operacao::SEM_ENCADEAMENTO)) break; try { if(tam_enc > 0) { //Dispara um sinal com o progresso da operação encadeada pos++; emit s_operacaoExecutada((pos/static_cast<float>(tam_enc))*100, trUtf8("Redoing operation on object:: %1 (%2)") .arg(operacao->obj_pool->obterNome()) .arg(operacao->obj_pool->obterNomeTipoObjeto()), operacao->obj_pool->obterTipoObjeto()); } //Executa a operação de refazer (segundo parametro = true) executarOperacao(operacao, true); } catch(Excecao &e) { erro=e; } idx_atual++; } /* Executa a operação enquanto a operação faça parte de encadeamento ou a opção de refazer esteja habilidata */ while(!anular_enc && refazerHabilitado() && operacao->tipo_enc!=Operacao::SEM_ENCADEAMENTO); if(erro.obterTipoErro()!=ERR_NULO) throw Excecao(erro.obterMensagemErro(), erro.obterTipoErro(),__PRETTY_FUNCTION__,__FILE__,__LINE__); } }
//----------------------------------------------------------- void ListaOperacoes::desfazerOperacao(void) { if(desfazerHabilitado()) { Operacao *operacao=NULL; bool enc_ativo=false; Excecao erro; unsigned tam_enc=0, pos=0; if(!this->signalsBlocked()) tam_enc=obterTamanhoEncadeamento(); do { /* Na operação de desfazer, é necessário obter o objeto no índice atual decrementado em 1 pois o índice atual sempre aponta para o elemento posterior ao último elemento */ operacao=operacoes[idx_atual-1]; /* Caso seja detectada que a operação é encadeada com outras e o flag de encadeamento ativo esteja desmarcado, marca o flag para dar início a executação de várias operações de uma só vez */ if(!anular_enc && !enc_ativo && operacao->tipo_enc!=Operacao::SEM_ENCADEAMENTO) enc_ativo=true; /* Caso o encadeamento esteja ativo e a operação atual não faça parte do encadeamento, aborta a execução da operação */ else if(enc_ativo && (operacao->tipo_enc==Operacao::ENC_FINAL || operacao->tipo_enc==Operacao::SEM_ENCADEAMENTO)) break; try { if(!this->signalsBlocked() && tam_enc > 0) { //Dispara um sinal com o progresso da operação encadeada pos++; emit s_operacaoExecutada((pos/static_cast<float>(tam_enc))*100, trUtf8("Undoing operation on object: %1 (%2)") .arg(operacao->obj_pool->obterNome()) .arg(operacao->obj_pool->obterNomeTipoObjeto()), operacao->obj_pool->obterTipoObjeto()); } //Executa a operação de desfazer executarOperacao(operacao, false); } catch(Excecao &e) { erro=e; } idx_atual--; } /* Executa a operação enquanto a operação faça parte de encadeamento ou a opção de desfazer esteja habilidata */ while(!anular_enc && desfazerHabilitado() && operacao->tipo_enc!=Operacao::SEM_ENCADEAMENTO); if(erro.obterTipoErro()!=ERR_NULO) throw Excecao(erro.obterMensagemErro(), erro.obterTipoErro(),__PRETTY_FUNCTION__,__FILE__,__LINE__); } }