Esempio n. 1
0
void RMdiChildQt::closeEvent(QCloseEvent* closeEvent) {
    // ask before closing (document was modified):
    if (documentInterface != NULL) {
        emit closeRequested(this);
    }
    else {
        closeEvent->accept();
        return;
    }

    // close canceled:
    if (!closeEventAccepted) {
        closeEvent->ignore();
        return;
    }

    if (documentInterface != NULL) {
        if (diLast==documentInterface) {
            diLast = NULL;
        }

        // 20130510: leads to empty layer list, etc when
        // closing background tab
        //RMainWindowQt::getMainWindow()->notifyListeners(true);

        // make sure rulers don't try to access view anymore:
        QList<RRulerQt*> rulers = findChildren<RRulerQt*>();
        for (int i=0; i<rulers.size(); i++) {
            rulers.at(i)->setGraphicsView(NULL);
        }

        // give current action a chance to clean up:
        RAction* action = documentInterface->getCurrentAction();
        if (action!=NULL) {
            action->suspendEvent();
        }

        RDocumentInterface* di = documentInterface;
        documentInterface=NULL;
        delete di;
        di = NULL;
    }
    closeEvent->accept();

#ifndef Q_OS_WIN32
    // part of the workaround for QMdiArea bug
    // with events filtering through all stacked windows:
    QMdiArea* mdiArea = RMainWindowQt::getMainWindow()->getMdiArea();
    QMdiSubWindow* child =  mdiArea->currentSubWindow();
    QList<QMdiSubWindow *> children = mdiArea->subWindowList(QMdiArea::ActivationHistoryOrder);
    int index = children.indexOf(child);
    int nextIndex = children.length()-2;
    nextIndex = nextIndex%children.length();
    if (nextIndex!=index) {
        children.at(nextIndex)->showMaximized();
        mdiArea->setActiveSubWindow(children.at(nextIndex));
    }
#endif
}
/**
 * Closes all windows that are editing the given block.
 */
void QC_DialogFactory::closeEditBlockWindow(RS_Block* block) {
    RS_DEBUG->print("QC_DialogFactory::closeEditBlockWindow");

    QC_ApplicationWindow* appWindow = QC_ApplicationWindow::getAppWindow();
    QMdiArea* mdiAreaCAD = appWindow->getMdiArea();

    if (mdiAreaCAD==NULL) return; //should not happen
    RS_DEBUG->print("QC_DialogFactory::closeEditBlockWindow: workspace found");

    for (int i = 0; i <mdiAreaCAD->subWindowList().size(); ) {
        RS_DEBUG->print("QC_DialogFactory::closeEditBlockWindow: window: %d",
                        i);
        QC_MDIWindow* m = qobject_cast<QC_MDIWindow*>(mdiAreaCAD->subWindowList().at(i));
        if(m==NULL) {
            mdiAreaCAD->removeSubWindow(mdiAreaCAD->subWindowList().at(i));
            continue;
        }
        RS_DEBUG->print(
                    "QC_DialogFactory::closeEditBlockWindow: got mdi");
        if (m->getDocument()==block) {
            RS_DEBUG->print(
                        "QC_DialogFactory::closeEditBlockWindow: closing mdi");
            appWindow->slotFilePrintPreview(false);
            m->closeMDI(true, false);

            mdiAreaCAD->removeSubWindow(mdiAreaCAD->subWindowList().at(i));
            continue;
//            m->setAttribute(Qt::WA_DeleteOnClose);//RLZ: to ensure the window is deleted
//            m->close();
        }
        i++;
    }
    //activate a subWindow, bug#3486357
    QMdiSubWindow* subWindow=mdiAreaCAD->currentSubWindow();
    appWindow->slotWindowActivated(subWindow);

    RS_DEBUG->print("QC_DialogFactory::closeEditBlockWindow: OK");
}