X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FXGUI%2FXGUI_ObjectsBrowser.cpp;h=15fba977ca2d02a3318d9a14d981641015534e74;hb=77ba7eded7a204044a5a09e029da6c2fa990933b;hp=a083bc3db324a2e5013f6b1a3caac90efef9bada;hpb=3e2dacc5ae3d561000e39ea48a065067ca34764d;p=modules%2Fshaper.git diff --git a/src/XGUI/XGUI_ObjectsBrowser.cpp b/src/XGUI/XGUI_ObjectsBrowser.cpp index a083bc3db..15fba977c 100644 --- a/src/XGUI/XGUI_ObjectsBrowser.cpp +++ b/src/XGUI/XGUI_ObjectsBrowser.cpp @@ -8,12 +8,10 @@ #include #include #include -#include #include #include -#include #include #include #include @@ -22,6 +20,13 @@ #include #include +#ifdef WIN32 +#ifdef HAVE_SALOME +#include +#endif +#endif + + /// Width of second column (minimum acceptable = 27) #define SECOND_COL_WIDTH 30 @@ -62,6 +67,15 @@ private: XGUI_DataTree::XGUI_DataTree(QWidget* theParent) : QTreeView(theParent) { +#ifdef WIN32 +#ifdef HAVE_SALOME + setStyle(new QWindowsStyle()); +#else + myStyle = new XGUI_TreeViewStyle(); + setStyle(myStyle); +#endif +#endif + setHeaderHidden(true); setEditTriggers(QAbstractItemView::NoEditTriggers); setSelectionBehavior(QAbstractItemView::SelectRows); @@ -125,6 +139,7 @@ void XGUI_DataTree::resizeEvent(QResizeEvent* theEvent) setColumnWidth(0, aSize.width() - SECOND_COL_WIDTH); setColumnWidth(1, SECOND_COL_WIDTH); } + QTreeView::resizeEvent(theEvent); } void XGUI_DataTree::onDoubleClick(const QModelIndex& theIndex) @@ -167,9 +182,134 @@ void XGUI_DataTree::onDoubleClick(const QModelIndex& theIndex) int aSize = aModel->rowCount(aParent); for (int i = 0; i < aSize; i++) { update(aModel->index(i, 0, aParent)); + update(aModel->index(i, 1, aParent)); + } +} + +#if (!defined HAVE_SALOME) && (defined WIN32) +void XGUI_DataTree::drawRow(QPainter* thePainter, + const QStyleOptionViewItem& theOptions, + const QModelIndex& theIndex) const +{ + QStyleOptionViewItemV4 aOptions = theOptions; + myStyle->setIndex(theIndex); + QTreeView::drawRow(thePainter, aOptions, theIndex); +} + +//******************************************************************** +//******************************************************************** +//******************************************************************** +void XGUI_TreeViewStyle::drawPrimitive(PrimitiveElement theElement, + const QStyleOption* theOption, + QPainter* thePainter, const QWidget* theWidget) const +{ + if ((theElement == QStyle::PE_PanelItemViewRow) || (theElement == QStyle::PE_PanelItemViewItem)) { + const QStyleOptionViewItemV4* aOptions = qstyleoption_cast(theOption); + if (myIndex.isValid() && ((myIndex.flags() & Qt::ItemIsSelectable) == 0)) { + QStyle::State aState = aOptions->state; + if ((aState & QStyle::State_MouseOver) != 0) + aState &= ~QStyle::State_MouseOver; + QStyleOptionViewItemV4* aOpt = (QStyleOptionViewItemV4*) aOptions; + aOpt->state = aState; + QWindowsVistaStyle::drawPrimitive(theElement, aOpt, thePainter, theWidget); + } + } + QWindowsVistaStyle::drawPrimitive(theElement, theOption, thePainter, theWidget); +} +#endif + + +//******************************************************************** +//******************************************************************** +//******************************************************************** +XGUI_ActiveDocLbl::XGUI_ActiveDocLbl(const QString& theText, QWidget* theParent ) + : QLabel(theText, theParent), + myPreSelectionStyle(""), + myNeutralStyle(""), + mySelectionStyle(""), + myIsSelected(false) +{ +} + +void XGUI_ActiveDocLbl::setTreeView(QTreeView* theView) +{ + myTreeView = theView; + setFont(myTreeView->font()); + + QPalette aPalet = myTreeView->palette(); + QColor aHighlight = aPalet.highlight().color(); + QColor aHighlightText = aPalet.highlightedText().color(); + + myPreSelectionStyle = "QLabel {background-color: "; + myPreSelectionStyle += "qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 white, stop:1 " + aHighlight.lighter(170).name() + ");"; + myPreSelectionStyle += "border: 1px solid lightblue; border-radius: 2px }"; + + QString aName = aPalet.color(QPalette::Base).name(); + myNeutralStyle = "QLabel { border: 1px solid " + aName + " }"; + + +#if (!defined HAVE_SALOME) && (defined WIN32) + mySelectionStyle = "QLabel {background-color: "; + mySelectionStyle += "qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 rgb(236, 245, 255)"; + mySelectionStyle += ", stop:1 rgb(208, 229, 255));"; + mySelectionStyle += "border: 1px solid rgb(132, 172, 221); border-radius: 2px }"; +#else + mySelectionStyle = "QLabel {background-color: " + aHighlight.name(); + mySelectionStyle += "; color : " + aHighlightText.name() + "}"; +#endif + + myTreeView->viewport()->installEventFilter(this); +} + + +#if (!defined HAVE_SALOME) && (defined WIN32) +bool XGUI_ActiveDocLbl::event(QEvent* theEvent) +{ + switch (theEvent->type()) { + case QEvent::Enter: + if (!myIsSelected) + setStyleSheet(myPreSelectionStyle); + break; + case QEvent::Leave: + if (!myIsSelected) + setStyleSheet(myNeutralStyle); + break; + } + return QLabel::event(theEvent); +} +#endif + +bool XGUI_ActiveDocLbl::eventFilter(QObject* theObj, QEvent* theEvent) +{ + if (theObj == myTreeView->viewport()) { + if (theEvent->type() == QEvent::MouseButtonRelease) + unselect(); + } + return QLabel::eventFilter(theObj, theEvent); +} + +static bool MYClearing = false; +void XGUI_ActiveDocLbl::mouseReleaseEvent( QMouseEvent* e) +{ + MYClearing = true; + myIsSelected = true; + setStyleSheet(mySelectionStyle); + // We can not block signals because on + // clear selection the View state will not be updated + myTreeView->clearSelection(); + QLabel::mouseReleaseEvent(e); + MYClearing = false; +} + +void XGUI_ActiveDocLbl::unselect() +{ + if (!MYClearing) { + myIsSelected = false; + setStyleSheet(myNeutralStyle); } } + //******************************************************************** //******************************************************************** //******************************************************************** @@ -180,12 +320,8 @@ XGUI_ObjectsBrowser::XGUI_ObjectsBrowser(QWidget* theParent) ModuleBase_Tools::zeroMargins(aLayout); aLayout->setSpacing(0); - QFrame* aLabelWgt = new QFrame(this); - //QWidget* aLabelWgt = new QWidget(this); + QWidget* aLabelWgt = new QWidget(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); @@ -195,41 +331,38 @@ XGUI_ObjectsBrowser::XGUI_ObjectsBrowser(QWidget* theParent) QLabel* aLbl = new QLabel(aLabelWgt); aLbl->setPixmap(QPixmap(":pictures/assembly.png")); aLbl->setMargin(2); - - aLbl->setAutoFillBackground(true); + // Do not paint background of the label (in order to show icon) + aLbl->setAutoFillBackground(false); aLabelLay->addWidget(aLbl); SessionPtr aMgr = ModelAPI_Session::get(); DocumentPtr aDoc = aMgr->moduleDocument(); - // TODO: Find a name of the root document - myActiveDocLbl = new QLineEdit(tr("Part set"), aLabelWgt); - myActiveDocLbl->setReadOnly(true); - myActiveDocLbl->setFrame(false); - //myActiveDocLbl->setMargin(2); + myActiveDocLbl = new XGUI_ActiveDocLbl(tr("Part set"), aLabelWgt); +// myActiveDocLbl->setReadOnly(true); +// myActiveDocLbl->setFrame(false); myActiveDocLbl->setContextMenuPolicy(Qt::CustomContextMenu); - myActiveDocLbl->installEventFilter(this); - aLabelLay->addWidget(myActiveDocLbl); aLabelLay->setStretch(1, 1); myTreeView = new XGUI_DataTree(this); - //myTreeView->setFrameShape(QFrame::NoFrame); + myTreeView->setFrameShape(QFrame::NoFrame); aLayout->addWidget(myTreeView); - aLabelWgt->setFrameShape(myTreeView->frameShape()); - aLabelWgt->setFrameShadow(myTreeView->frameShadow()); + QPalette aTreePalet = myTreeView->palette(); + QColor aTreeBack = aTreePalet.color(QPalette::Base); + + QPalette aPalet; + aPalet.setColor(QPalette::Base, aTreeBack); + aPalet.setColor(QPalette::Window, aTreeBack); + aLabelWgt->setPalette(aPalet); myDocModel = new XGUI_DataModel(this); - myTreeView->setModel(myDocModel); - QItemSelectionModel* aSelMod = myTreeView->selectionModel(); - connect(aSelMod, SIGNAL(selectionChanged(const QItemSelection&, const QItemSelection&)), - this, SLOT(onSelectionChanged(const QItemSelection&, const QItemSelection&))); + connect(myDocModel, SIGNAL(modelAboutToBeReset()), SLOT(onBeforeReset())); + connect(myDocModel, SIGNAL(treeRebuilt()), SLOT(onAfterModelReset())); - connect(myActiveDocLbl, SIGNAL(customContextMenuRequested(const QPoint&)), this, - SLOT(onLabelContextMenuRequested(const QPoint&))); connect(myTreeView, SIGNAL(contextMenuRequested(QContextMenuEvent*)), this, SLOT(onContextMenuRequested(QContextMenuEvent*))); } @@ -239,54 +372,17 @@ XGUI_ObjectsBrowser::~XGUI_ObjectsBrowser() { } -//*************************************************** -bool XGUI_ObjectsBrowser::eventFilter(QObject* obj, QEvent* theEvent) -{ - if (obj == myActiveDocLbl) { - if (!myActiveDocLbl->isReadOnly()) { - // 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: - case Qt::Key_Enter: // Accept current input - closeDocNameEditing(true); - break; - case Qt::Key_Escape: // Cancel the input - closeDocNameEditing(false); - break; - } - } - } else { - if (theEvent->type() == QEvent::MouseButtonDblClick) { - emit headerMouseDblClicked(QModelIndex()); - return true; - } - } - } - return QWidget::eventFilter(obj, theEvent); -} +void XGUI_ObjectsBrowser::setXMLReader(Config_DataModelReader* theReader) +{ + myDocModel->setXMLReader(theReader); + myTreeView->setModel(myDocModel); -//*************************************************** -void XGUI_ObjectsBrowser::closeDocNameEditing(bool toSave) -{ - myActiveDocLbl->deselect(); - myActiveDocLbl->clearFocus(); - myActiveDocLbl->releaseMouse(); - myActiveDocLbl->setReadOnly(true); - if (toSave) { - // TODO: Save the name of root document - SessionPtr aMgr = ModelAPI_Session::get(); - DocumentPtr aDoc = aMgr->moduleDocument(); - } else { - myActiveDocLbl->setText(myActiveDocLbl->property("OldText").toString()); - } + // It has to be done after setting of model + myActiveDocLbl->setTreeView(myTreeView); + + QItemSelectionModel* aSelMod = myTreeView->selectionModel(); + connect(aSelMod, SIGNAL(selectionChanged(const QItemSelection&, const QItemSelection&)), + this, SLOT(onSelectionChanged(const QItemSelection&, const QItemSelection&))); } //*************************************************** @@ -327,19 +423,19 @@ void XGUI_ObjectsBrowser::onEditItem() { QObjectPtrList aSelectedData = selectedObjects(); if (aSelectedData.size() > 0) { - ObjectPtr aFeature = aSelectedData.first(); - if (aFeature) { // Selection happens in TreeView - QObjectPtrList aList; - aList.append(aFeature); - // check whether the object can be deleted. There should not be parts which are not loaded - if (!XGUI_Tools::canRemoveOrRename((QWidget*)parent(), aList)) + ObjectPtr anObject = aSelectedData.first(); + if (anObject.get()) { // Selection happens in TreeView + // check whether the object can be renamed. There should not be parts which are not loaded + std::set aFeatures; + aFeatures.insert(ModelAPI_Feature::feature(anObject)); + if (!XGUI_Tools::canRemoveOrRename((QWidget*)parent(), aFeatures)) return; // Find index which corresponds the feature QModelIndex aIndex; foreach(QModelIndex aIdx, selectedIndexes()) { ObjectPtr aFea = dataModel()->object(aIdx); - if (dataModel()->object(aIdx)->isSame(aFeature)) { + if (dataModel()->object(aIdx)->isSame(anObject)) { aIndex = aIdx; break; } @@ -351,12 +447,25 @@ void XGUI_ObjectsBrowser::onEditItem() return; } } - //Selection happens in Upper label - myActiveDocLbl->setReadOnly(false); - myActiveDocLbl->setFocus(); - myActiveDocLbl->selectAll(); - myActiveDocLbl->grabMouse(); - myActiveDocLbl->setProperty("OldText", myActiveDocLbl->text()); +} + +//*************************************************** +QModelIndexList XGUI_ObjectsBrowser::expandedItems(const QModelIndex& theParent) const +{ + QModelIndexList aIndexes; + QModelIndex aIndex; + for (int i = 0; i < myDocModel->rowCount(theParent); i++) { + aIndex = myDocModel->index(i, 0, theParent); + if (myDocModel->hasChildren(aIndex)) { + if (myTreeView->isExpanded(aIndex)) { + aIndexes.append(aIndex); + QModelIndexList aSubIndexes = expandedItems(aIndex); + if (!aSubIndexes.isEmpty()) + aIndexes.append(aSubIndexes); + } + } + } + return aIndexes; } //*************************************************** @@ -411,4 +520,16 @@ QObjectPtrList XGUI_ObjectsBrowser::selectedObjects(QModelIndexList* theIndexes) } } return aList; -} \ No newline at end of file +} + +void XGUI_ObjectsBrowser::onBeforeReset() +{ + myExpandedItems = expandedItems(); +} + +void XGUI_ObjectsBrowser::onAfterModelReset() +{ + foreach(QModelIndex aIndex, myExpandedItems) { + myTreeView->setExpanded(aIndex, true); + } +}