X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FXGUI%2FXGUI_ObjectsBrowser.cpp;h=27b92756283b4e6304239e698a03adb627b4ba26;hb=f8d51abf2ab6024a974d42c139f7650ccf0ef774;hp=cf0e8577d5556843d6b32295085e96cbc24c443b;hpb=c23358fff93a754447d421ca606ae6f570e5c7a5;p=modules%2Fshaper.git diff --git a/src/XGUI/XGUI_ObjectsBrowser.cpp b/src/XGUI/XGUI_ObjectsBrowser.cpp index cf0e8577d..27b927562 100644 --- a/src/XGUI/XGUI_ObjectsBrowser.cpp +++ b/src/XGUI/XGUI_ObjectsBrowser.cpp @@ -1,13 +1,19 @@ #include "XGUI_ObjectsBrowser.h" #include "XGUI_DocumentDataModel.h" +#include "XGUI_Tools.h" #include +#include +#include +#include #include #include +#include #include #include #include +#include @@ -16,6 +22,7 @@ XGUI_DataTree::XGUI_DataTree(QWidget* theParent) { setHeaderHidden(true); setModel(new XGUI_DocumentDataModel(this)); + setEditTriggers(QAbstractItemView::NoEditTriggers); connect(selectionModel(), SIGNAL(selectionChanged(const QItemSelection&, const QItemSelection&)), this, SLOT(onSelectionChanged(const QItemSelection&, const QItemSelection&))); @@ -71,6 +78,22 @@ void XGUI_DataTree::contextMenuEvent(QContextMenuEvent* theEvent) emit contextMenuRequested(theEvent); } +void XGUI_DataTree::commitData(QWidget* theEditor) +{ + QLineEdit* aEditor = dynamic_cast(theEditor); + if (aEditor) { + QString aRes = aEditor->text(); + FeaturePtr aFeature = mySelectedData.first(); + PluginManagerPtr aMgr = ModelAPI_PluginManager::get(); + aMgr->rootDocument()->startOperation(); + if (!XGUI_Tools::isModelObject(aFeature)) + aFeature->data()->setName(qPrintable(aRes)); + else + boost::dynamic_pointer_cast(aFeature)->setName(qPrintable(aRes)); + aMgr->rootDocument()->finishOperation(); + } +} + //******************************************************************** //******************************************************************** //******************************************************************** @@ -81,21 +104,34 @@ XGUI_ObjectsBrowser::XGUI_ObjectsBrowser(QWidget* theParent) aLayout->setContentsMargins(0, 0, 0, 0); aLayout->setSpacing(0); - QWidget* aLabelWgt = new QWidget(this); + QFrame* aLabelWgt = new QFrame(this); + aLabelWgt->setAutoFillBackground(true); + QPalette aPalet = aLabelWgt->palette(); + aPalet.setColor(QPalette::Window, Qt::white); + aLabelWgt->setPalette(aPalet); + aLayout->addWidget(aLabelWgt); QHBoxLayout* aLabelLay = new QHBoxLayout(aLabelWgt); - aLabelLay->setContentsMargins(3, 3, 3, 3); + aLabelLay->setContentsMargins(0, 0, 0, 0); + aLabelLay->setSpacing(0); QLabel* aLbl = new QLabel(aLabelWgt); aLbl->setPixmap(QPixmap(":pictures/assembly.png")); + aLbl->setMargin(2); + + aLbl->setAutoFillBackground(true); + aLabelLay->addWidget(aLbl); - myActiveDocLbl = new QLabel("", aLabelWgt); - myActiveDocLbl->setAlignment(Qt::AlignHCenter); + PluginManagerPtr aMgr = ModelAPI_PluginManager::get(); + DocumentPtr aDoc = aMgr->rootDocument(); + // TODO: Find a name of the root document - QFont aFnt = myActiveDocLbl->font(); - aFnt.setBold(true); - myActiveDocLbl->setFont(aFnt); + myActiveDocLbl = new QLineEdit(tr("Part set"), aLabelWgt); + myActiveDocLbl->setReadOnly(true); + myActiveDocLbl->setFrame(false); + //myActiveDocLbl->setMargin(2); + myActiveDocLbl->setContextMenuPolicy(Qt::CustomContextMenu); myActiveDocLbl->installEventFilter(this); @@ -107,63 +143,115 @@ XGUI_ObjectsBrowser::XGUI_ObjectsBrowser(QWidget* theParent) myDocModel = myTreeView->dataModel(); - connect(myTreeView, SIGNAL(selectionChanged()), this, SIGNAL(selectionChanged())); + aLabelWgt->setFrameShape(myTreeView->frameShape()); + aLabelWgt->setFrameShadow(myTreeView->frameShadow()); + + connect(myTreeView, SIGNAL(selectionChanged()), this, SLOT(onSelectionChanged())); connect(myTreeView, SIGNAL(activePartChanged(FeaturePtr)), this, SLOT(onActivePartChanged(FeaturePtr))); connect(myTreeView, SIGNAL(activePartChanged(FeaturePtr)), this, SIGNAL(activePartChanged(FeaturePtr))); + + connect(myActiveDocLbl, SIGNAL(customContextMenuRequested(const QPoint&)), + this, SLOT(onLabelContextMenuRequested(const QPoint&))); connect(myTreeView, SIGNAL(contextMenuRequested(QContextMenuEvent*)), - this, SIGNAL(contextMenuRequested(QContextMenuEvent*))); + this, SLOT(onContextMenuRequested(QContextMenuEvent*))); onActivePartChanged(FeaturePtr()); -} + // Create internal actions + QAction* aAction = new QAction(QIcon(":pictures/rename_edit.png"), tr("Rename"), this); + aAction->setData("RENAME_CMD"); + connect(aAction, SIGNAL(triggered(bool)), this, SLOT(onEditItem())); + addAction(aAction); +} +//*************************************************** XGUI_ObjectsBrowser::~XGUI_ObjectsBrowser() { } - +//*************************************************** void XGUI_ObjectsBrowser::onActivePartChanged(FeaturePtr thePart) { QPalette aPalet = myActiveDocLbl->palette(); if (thePart) { - myActiveDocLbl->setText(tr("Activate Part set")); - aPalet.setColor(QPalette::Foreground, Qt::black); - myActiveDocLbl->setCursor(Qt::PointingHandCursor); + aPalet.setColor(QPalette::Text, Qt::black); } else { - myActiveDocLbl->setText(tr("Part set is active")); - aPalet.setColor(QPalette::Foreground, QColor(0, 72, 140)); - myActiveDocLbl->unsetCursor(); + aPalet.setColor(QPalette::Text, QColor(0, 72, 140)); } myActiveDocLbl->setPalette(aPalet); } +//*************************************************** bool XGUI_ObjectsBrowser::eventFilter(QObject* obj, QEvent* theEvent) { if (obj == myActiveDocLbl) { - if (theEvent->type() == QEvent::MouseButtonDblClick) { - if (myDocModel->activePartIndex().isValid()) { - myTreeView->setExpanded(myDocModel->activePartIndex(), false); + if (myActiveDocLbl->isReadOnly()) { + if (theEvent->type() == QEvent::MouseButtonDblClick) { + if (myDocModel->activePartIndex().isValid()) { + myTreeView->setExpanded(myDocModel->activePartIndex(), false); + } + myDocModel->deactivatePart(); + onActivePartChanged(FeaturePtr()); + emit activePartChanged(FeaturePtr()); + } + } else { + // End of editing by mouse click + if (theEvent->type() == QEvent::MouseButtonRelease) { + QMouseEvent* aEvent = (QMouseEvent*) theEvent; + QPoint aPnt = mapFromGlobal(aEvent->globalPos()); + if (childAt(aPnt) != myActiveDocLbl) { + closeDocNameEditing(true); + } + } else if (theEvent->type() == QEvent::KeyRelease) { + QKeyEvent* aEvent = (QKeyEvent*) theEvent; + switch (aEvent->key()) { + case Qt::Key_Return: // Accept current input + closeDocNameEditing(true); + break; + case Qt::Key_Escape: // Cancel the input + closeDocNameEditing(false); + break; + } } - myDocModel->deactivatePart(); - onActivePartChanged(FeaturePtr()); - emit activePartChanged(FeaturePtr()); } } return QWidget::eventFilter(obj, theEvent); } -void XGUI_ObjectsBrowser::activateCurrentPart(bool toActivate) +//*************************************************** +void XGUI_ObjectsBrowser::closeDocNameEditing(bool toSave) { - if (toActivate) { - QModelIndex aIndex = myTreeView->currentIndex(); + myActiveDocLbl->deselect(); + myActiveDocLbl->clearFocus(); + myActiveDocLbl->releaseMouse(); + myActiveDocLbl->setReadOnly(true); + if (toSave) { + // TODO: Save the name of root document + PluginManagerPtr aMgr = ModelAPI_PluginManager::get(); + DocumentPtr aDoc = aMgr->rootDocument(); + } else { + myActiveDocLbl->setText(myActiveDocLbl->property("OldText").toString()); + } +} + +//*************************************************** +void XGUI_ObjectsBrowser::activatePart(const FeaturePtr& thePart) +{ + if (thePart) { + QModelIndex aIndex = myDocModel->partIndex(thePart); if ((myDocModel->activePartIndex() != aIndex) && myDocModel->activePartIndex().isValid()) { myTreeView->setExpanded(myDocModel->activePartIndex(), false); } bool isChanged = myDocModel->activatedIndex(aIndex); - if ((isChanged) && (myDocModel->activePartIndex().isValid())) { - myTreeView->setExpanded(aIndex, true); - onActivePartChanged(myDocModel->feature(aIndex)); + if (isChanged) { + if (myDocModel->activePartIndex().isValid()) { + myTreeView->setExpanded(aIndex.parent(), true); + myTreeView->setExpanded(aIndex, true); + onActivePartChanged(myDocModel->feature(aIndex)); + } else { + onActivePartChanged(FeaturePtr()); + } } } else { QModelIndex aIndex = myDocModel->activePartIndex(); @@ -173,4 +261,87 @@ void XGUI_ObjectsBrowser::activateCurrentPart(bool toActivate) onActivePartChanged(FeaturePtr()); } } -} \ No newline at end of file +} + +//*************************************************** +void XGUI_ObjectsBrowser::onContextMenuRequested(QContextMenuEvent* theEvent) +{ + myFeaturesList = myTreeView->selectedFeatures(); + bool toEnable = myFeaturesList.size() > 0; + foreach(QAction* aCmd, actions()) { + aCmd->setEnabled(toEnable); + } + emit contextMenuRequested(theEvent); +} + +//*************************************************** +void XGUI_ObjectsBrowser::onLabelContextMenuRequested(const QPoint& thePnt) +{ + myFeaturesList.clear(); + //Empty feature pointer means that selected root document + myFeaturesList.append(FeaturePtr()); + + foreach(QAction* aCmd, actions()) { + aCmd->setEnabled(true); + } + QContextMenuEvent aEvent( QContextMenuEvent::Mouse, thePnt, myActiveDocLbl->mapToGlobal(thePnt) ); + emit contextMenuRequested(&aEvent); +} + +//*************************************************** +void XGUI_ObjectsBrowser::onEditItem() +{ + if (myFeaturesList.size() > 0) { + FeaturePtr aFeature = myFeaturesList.first(); + if (aFeature) { // Selection happens in TreeView + // Find index which corresponds the feature + QModelIndex aIndex; + foreach(QModelIndex aIdx, selectedIndexes()) { + FeaturePtr aFea = dataModel()->feature(aIdx); + if (dataModel()->feature(aIdx)->isSame(aFeature)) { + aIndex = aIdx; + break; + } + } + if (aIndex.isValid()) { + myTreeView->setCurrentIndex(aIndex); + myTreeView->edit(aIndex); + } + } else { //Selection happens in Upper label + myActiveDocLbl->setReadOnly(false); + myActiveDocLbl->setFocus(); + myActiveDocLbl->selectAll(); + myActiveDocLbl->grabMouse(); + myActiveDocLbl->setProperty("OldText", myActiveDocLbl->text()); + } + } +} + +//*************************************************** +void XGUI_ObjectsBrowser::onSelectionChanged() +{ + myFeaturesList = myTreeView->selectedFeatures(); + emit selectionChanged(); +} + +//*************************************************** +void XGUI_ObjectsBrowser::rebuildDataTree() +{ + myDocModel->rebuildDataTree(); + update(); +} + +//*************************************************** +void XGUI_ObjectsBrowser::setFeaturesSelected(const QFeatureList& theFeatures) +{ + QList theIndexes; + QItemSelectionModel* aSelectModel = myTreeView->selectionModel(); + aSelectModel->clear(); + + foreach(FeaturePtr aFeature, theFeatures) { + QModelIndex aIndex = myDocModel->featureIndex(aFeature); + if (aIndex.isValid()) { + aSelectModel->select(aIndex, QItemSelectionModel::Select); + } + } +}