insilmaril@726: #include "vymview.h" insilmaril@726: insilmaril@727: #include insilmaril@742: using namespace std; insilmaril@727: insilmaril@804: #include "branchitem.h" insilmaril@808: #include "findwidget.h" insilmaril@732: #include "mainwindow.h" insilmaril@726: #include "mapeditor.h" insilmaril@769: #include "treeeditor.h" insilmaril@726: insilmaril@732: extern Main *mainWindow; insilmaril@732: insilmaril@732: insilmaril@742: VymView::VymView(VymModel *m) insilmaril@726: { insilmaril@742: model=m; insilmaril@742: insilmaril@808: // Create findWidget insilmaril@808: findWidget=new FindWidget (this); insilmaril@810: findWidget->hide(); insilmaril@808: insilmaril@726: // Create TreeView insilmaril@769: treeEditor=new TreeEditor (model); insilmaril@788: //treeEditor->setModel ((QAbstractItemModel*)model); insilmaril@769: //treeEditor->setMinimumWidth (50); insilmaril@761: insilmaril@788: treeEditor->setColumnWidth (0,150); insilmaril@788: treeEditor->setAnimated (true); insilmaril@726: insilmaril@804: // FIXME-2 use proxySelModel=treeEditor->selectionModel(); insilmaril@801: selModel=new QItemSelectionModel (model); insilmaril@801: insilmaril@801: //model->setSelectionModel (proxySelModel); insilmaril@728: model->setSelectionModel (selModel); insilmaril@804: treeEditor->setSelectionModel (selModel); insilmaril@727: insilmaril@726: // Create good old MapEditor insilmaril@761: mapEditor=model->getMapEditor(); insilmaril@761: if (!mapEditor) mapEditor=new MapEditor (model); insilmaril@772: insilmaril@808: // Create Layout insilmaril@808: QVBoxLayout* mainLayout = new QVBoxLayout (this); insilmaril@808: QSplitter *splitter= new QSplitter; insilmaril@808: insilmaril@808: QSizePolicy sizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); insilmaril@808: //sizePolicy.setHorizontalStretch(0); insilmaril@808: //sizePolicy.setVerticalStretch(0); insilmaril@808: //sizePolicy.setHeightForWidth(this->sizePolicy().hasHeightForWidth()); insilmaril@808: splitter->setSizePolicy(sizePolicy); insilmaril@808: mainLayout->addWidget (splitter); insilmaril@808: mainLayout->addWidget (findWidget); insilmaril@808: insilmaril@801: // Connect selections insilmaril@801: insilmaril@801: // Proxymodel changed insilmaril@804: /* insilmaril@801: connect ( insilmaril@801: proxySelModel, SIGNAL (selectionChanged(const QItemSelection &, const QItemSelection &)), insilmaril@801: this,SLOT (changeProxySelection(const QItemSelection &,const QItemSelection &))); insilmaril@804: */ insilmaril@801: insilmaril@804: // Selection in Model changed insilmaril@801: connect ( insilmaril@801: selModel, SIGNAL (selectionChanged(const QItemSelection &, const QItemSelection &)), insilmaril@801: this,SLOT (changeSelection(const QItemSelection &,const QItemSelection &))); insilmaril@801: insilmaril@804: // Tell MapEditor to update selection insilmaril@807: /* FIXME-3 done implicit here in VymView insilmaril@801: connect ( insilmaril@801: selModel, SIGNAL (selectionChanged(const QItemSelection &, const QItemSelection &)), insilmaril@801: mapEditor,SLOT (updateSelection(const QItemSelection &,const QItemSelection &))); insilmaril@807: */ insilmaril@801: insilmaril@804: // FIXME-2 testing, if that reenables updating selbox during animation insilmaril@804: connect ( insilmaril@804: model, SIGNAL (selectionChanged(const QItemSelection &, const QItemSelection &)), insilmaril@804: mapEditor,SLOT (updateSelection(const QItemSelection &,const QItemSelection &))); insilmaril@804: insilmaril@801: // Connect data changed signals insilmaril@753: connect ( insilmaril@753: model, SIGNAL (dataChanged(const QModelIndex &, const QModelIndex &)), insilmaril@761: mapEditor,SLOT (updateData(const QModelIndex &) ) ); insilmaril@726: insilmaril@800: connect ( insilmaril@800: model, SIGNAL (sortFilterChanged (const QString &)), insilmaril@800: treeEditor, SLOT (setSortFilter (const QString &) ) ); insilmaril@800: insilmaril@746: connect ( insilmaril@753: model, SIGNAL (noteHasChanged(QModelIndex) ), insilmaril@753: mainWindow, SLOT (updateNoteEditor (QModelIndex) ) ); insilmaril@746: insilmaril@763: connect ( insilmaril@763: model, SIGNAL (expandAll() ), insilmaril@763: this, SLOT (expandAll () ) ); insilmaril@763: insilmaril@763: connect ( insilmaril@804: model, SIGNAL (expandOneLevel() ), insilmaril@804: this, SLOT (expandOneLevel() ) ); insilmaril@804: insilmaril@804: connect ( insilmaril@804: model, SIGNAL (collapseOneLevel() ), insilmaril@804: this, SLOT (collapseOneLevel() ) ); insilmaril@804: insilmaril@804: connect ( insilmaril@763: model, SIGNAL (showSelection() ), insilmaril@763: this, SLOT (showSelection() ) ); insilmaril@763: insilmaril@808: // Find insilmaril@808: connect ( insilmaril@808: model, SIGNAL (showFindWidget() ), insilmaril@808: this, SLOT (showFindWidget() ) ); insilmaril@808: insilmaril@808: connect ( insilmaril@812: findWidget , SIGNAL (hideFindWidget() ), insilmaril@812: this, SLOT (hideFindWidget() ) ); insilmaril@812: insilmaril@812: connect ( insilmaril@808: findWidget, SIGNAL (nextButton (QString) ), insilmaril@808: this, SLOT (findNext(QString) ) ); insilmaril@808: insilmaril@761: mapEditor->setAntiAlias (mainWindow->isAliased()); insilmaril@761: mapEditor->setSmoothPixmap(mainWindow->hasSmoothPixmapTransform()); insilmaril@726: insilmaril@808: splitter->addWidget (treeEditor); insilmaril@808: splitter->addWidget (mapEditor); insilmaril@726: insilmaril@726: // Set geometry insilmaril@761: QList widths; insilmaril@788: widths<<200; insilmaril@761: widths<<600; insilmaril@808: splitter->setSizes(widths); insilmaril@726: } insilmaril@726: insilmaril@772: VymView::~VymView() insilmaril@772: { insilmaril@772: //cout << "Destructor VymView\n"; insilmaril@772: } insilmaril@772: insilmaril@772: VymModel* VymView::getModel() insilmaril@772: { insilmaril@772: return model; insilmaril@772: } insilmaril@772: insilmaril@772: MapEditor* VymView::getMapEditor() insilmaril@772: { insilmaril@772: return mapEditor; insilmaril@772: } insilmaril@772: insilmaril@769: void VymView::initFocus() insilmaril@769: { insilmaril@769: mapEditor->setFocus(); insilmaril@769: } insilmaril@769: insilmaril@807: void VymView::changeSelection (const QItemSelection &newsel, const QItemSelection &oldsel) insilmaril@727: { insilmaril@807: //cout << "VV::changeSelection newsel.count="<changeSelection (model,newsel,oldsel); insilmaril@807: mapEditor->updateSelection (newsel,oldsel); insilmaril@804: insilmaril@804: if (newsel.indexes().count()>0) insilmaril@804: { insilmaril@804: insilmaril@804: /* FIXME-2 use proxymodel insilmaril@804: proxySelModel->select ( insilmaril@804: treeEditor->getProxyModel()->mapSelectionFromSource (newsel), insilmaril@804: QItemSelectionModel::ClearAndSelect ); insilmaril@804: */ insilmaril@807: insilmaril@804: QModelIndex ix=newsel.indexes().first(); insilmaril@804: selModel->setCurrentIndex (ix,QItemSelectionModel::ClearAndSelect ); insilmaril@804: treeEditor->setCurrentIndex (ix); insilmaril@804: showSelection(); insilmaril@807: insilmaril@804: } insilmaril@801: } insilmaril@777: insilmaril@810: void VymView::changeProxySelection (const QItemSelection &newsel, const QItemSelection &) insilmaril@801: { insilmaril@801: // Notify mainwindow to update satellites, but map selection to insilmaril@801: // original model first insilmaril@801: insilmaril@806: //cout << "VV::changeProxySelection newsel.count="<setCurrentIndex ( insilmaril@804: newsel.indexes().first(), insilmaril@804: QItemSelectionModel::ClearAndSelect ); insilmaril@804: treeEditor->setCurrentIndex (newsel.indexes().first() ); insilmaril@804: } insilmaril@804: insilmaril@801: // Re-emit but map selection first insilmaril@804: selModel->select ( insilmaril@804: treeEditor->getProxyModel()->mapSelectionToSource (newsel), insilmaril@802: QItemSelectionModel::ClearAndSelect ); insilmaril@804: insilmaril@803: showSelection(); insilmaril@727: } insilmaril@727: insilmaril@763: void VymView::expandAll() insilmaril@763: { insilmaril@769: treeEditor->expandAll(); insilmaril@763: } insilmaril@763: insilmaril@804: void VymView::expandOneLevel() insilmaril@804: { insilmaril@804: int level=999999; insilmaril@804: int d; insilmaril@804: BranchItem *cur=NULL; insilmaril@804: BranchItem *prev=NULL; insilmaril@804: QModelIndex pix; insilmaril@804: insilmaril@804: // Find level to expand insilmaril@804: model->nextBranch(cur,prev); insilmaril@804: while (cur) insilmaril@804: { insilmaril@804: // FIXME-2 use proxy pix=treeEditor->getProxyModel()->mapFromSource (model->index (cur)); insilmaril@804: pix=model->index (cur); insilmaril@804: d=cur->depth(); insilmaril@804: if (!treeEditor->isExpanded(pix) && d < level) insilmaril@804: level=d; insilmaril@804: model->nextBranch(cur,prev); insilmaril@804: } insilmaril@804: insilmaril@804: // Expand all to level insilmaril@804: cur=NULL; insilmaril@804: prev=NULL; insilmaril@804: model->nextBranch(cur,prev); insilmaril@804: while (cur) insilmaril@804: { insilmaril@804: // FIXME-2 use proxy pix=treeEditor->getProxyModel()->mapFromSource (model->index (cur)); insilmaril@804: pix=model->index (cur); insilmaril@804: d=cur->depth(); insilmaril@804: if (!treeEditor->isExpanded(pix) && d <= level && cur->branchCount()>0) insilmaril@804: treeEditor->setExpanded(pix,true); insilmaril@804: model->nextBranch(cur,prev); insilmaril@804: } insilmaril@804: /* FIXME-3 optimize expanding by using flat version of next insilmaril@804: model->nextBranch(cur,prev,false); insilmaril@804: while (cur) insilmaril@804: { insilmaril@804: cout << "ok: "<getHeadingStd()<nextBranch(cur,prev,false); insilmaril@804: } insilmaril@804: */ insilmaril@804: } insilmaril@804: insilmaril@804: void VymView::collapseOneLevel() insilmaril@804: { insilmaril@804: int level=-1; insilmaril@804: int d; insilmaril@804: BranchItem *cur=NULL; insilmaril@804: BranchItem *prev=NULL; insilmaril@804: QModelIndex pix; insilmaril@804: insilmaril@804: // Find level to collapse insilmaril@804: model->nextBranch(cur,prev); insilmaril@804: while (cur) insilmaril@804: { insilmaril@804: // FIXME-2 use proxy pix=treeEditor->getProxyModel()->mapFromSource (model->index (cur)); insilmaril@804: pix=model->index (cur); insilmaril@804: d=cur->depth(); insilmaril@804: if (treeEditor->isExpanded(pix) && d > level) insilmaril@804: level=d; insilmaril@804: model->nextBranch(cur,prev); insilmaril@804: } insilmaril@804: insilmaril@804: // collapse all to level insilmaril@804: cur=NULL; insilmaril@804: prev=NULL; insilmaril@804: model->nextBranch(cur,prev); insilmaril@804: while (cur) insilmaril@804: { insilmaril@804: // FIXME-2 use proxy pix=treeEditor->getProxyModel()->mapFromSource (model->index (cur)); insilmaril@804: pix=model->index (cur); insilmaril@804: d=cur->depth(); insilmaril@804: if (treeEditor->isExpanded(pix) && d >= level) insilmaril@804: treeEditor->setExpanded(pix,false); insilmaril@804: model->nextBranch(cur,prev); insilmaril@804: } insilmaril@804: } insilmaril@804: insilmaril@763: void VymView::showSelection() insilmaril@763: { insilmaril@772: QModelIndex ix=model->getSelectedIndex(); insilmaril@772: treeEditor->scrollTo( ix, QAbstractItemView::EnsureVisible); insilmaril@807: mapEditor->scrollTo ( ix); // FIXME-3 also called from MapEditor::updateSelection... insilmaril@763: } insilmaril@763: insilmaril@808: void VymView::showFindWidget() insilmaril@808: { insilmaril@810: findWidget->popup(); insilmaril@808: } insilmaril@808: insilmaril@812: void VymView::hideFindWidget() insilmaril@812: { insilmaril@812: // findWidget hides itself, but we want to have focus back at mapEditor usually insilmaril@812: if (mapEditor) mapEditor->setFocus(); insilmaril@812: } insilmaril@812: insilmaril@808: void VymView::findNext (QString s) insilmaril@808: { insilmaril@808: bool cs=false; insilmaril@808: BranchItem *bi=model->findText(s, cs); insilmaril@808: if (bi) insilmaril@810: findWidget->setStatus (FindWidget::Success); insilmaril@810: else insilmaril@810: findWidget->setStatus (FindWidget::Failed); insilmaril@808: insilmaril@808: } insilmaril@811: insilmaril@811: void VymView::findReset() insilmaril@811: { insilmaril@811: model->findReset(); insilmaril@811: if (mapEditor) mapEditor->setFocus(); insilmaril@811: } insilmaril@811: