ebc2d1b3675ee8fc2e4564b0344445b01bc3b85c
[occt.git] / tools / DFBrowser / DFBrowser_AttributePaneStack.cxx
1 // Created on: 2017-06-16
2 // Created by: Natalia ERMOLAEVA
3 // Copyright (c) 2017 OPEN CASCADE SAS
4 //
5 // This file is part of Open CASCADE Technology software library.
6 //
7 // This library is free software; you can redistribute it and/or modify it under
8 // the terms of the GNU Lesser General Public License version 2.1 as published
9 // by the Free Software Foundation, with special exception defined in the file
10 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
11 // distribution for complete text of the license and disclaimer of any warranty.
12 //
13 // Alternatively, this file may be used under the terms of Open CASCADE
14 // commercial license or contractual agreement. 
15
16 #include <inspector/DFBrowser_AttributePaneStack.hxx>
17
18 #include <inspector/DFBrowserPane_AttributePaneAPI.hxx>
19 #include <inspector/DFBrowserPane_AttributePaneSelector.hxx>
20 #include <inspector/DFBrowser_Item.hxx>
21 #include <inspector/DFBrowser_Module.hxx>
22 #include <inspector/DFBrowser_Tools.hxx>
23 #include <inspector/DFBrowser_TreeLevelView.hxx>
24 #include <inspector/DFBrowser_TreeModel.hxx>
25 #include <inspector/DFBrowser_SearchView.hxx>
26 #include <inspector/DFBrowser_Window.hxx>
27
28 #include <TDF_Attribute.hxx>
29
30 #include <Standard_WarningsDisable.hxx>
31 #include <QItemSelectionModel>
32 #include <QMap>
33 #include <QStackedWidget>
34 #include <Standard_WarningsRestore.hxx>
35
36 // =======================================================================
37 // function : Constructor
38 // purpose :
39 // =======================================================================
40 DFBrowser_AttributePaneStack::DFBrowser_AttributePaneStack (QObject* theParent)
41 : QObject (theParent), myCurrentPane (0), myAttributesStack (0), myModule (0), myTreeLevelView (0),
42   mySearchView (0), myEmptyWidget (0), myPaneMode (DFBrowser_AttributePaneType_ItemView)
43 {
44   myPaneSelector = new DFBrowserPane_AttributePaneSelector (theParent);
45 }
46
47 // =======================================================================
48 // function : CreateWidget
49 // purpose :
50 // =======================================================================
51 void DFBrowser_AttributePaneStack::CreateWidget (QWidget* theParent)
52 {
53   myAttributesStack = new QStackedWidget (theParent);
54   DFBrowser_Window::SetWhiteBackground (myAttributesStack);
55   myEmptyWidget = new QWidget (theParent);
56   DFBrowser_Window::SetWhiteBackground (myEmptyWidget);
57
58   myAttributesStack->addWidget (myEmptyWidget);
59
60   myTreeLevelView = new DFBrowser_TreeLevelView (theParent);
61   myAttributesStack->addWidget (myTreeLevelView->GetControl());
62
63   mySearchView = new DFBrowser_SearchView (theParent);
64   myAttributesStack->addWidget (mySearchView->GetControl());
65
66   myAttributesStack->setCurrentWidget (myEmptyWidget);
67 }
68
69 // =======================================================================
70 // function : SetPaneMode
71 // purpose :
72 // =======================================================================
73 void DFBrowser_AttributePaneStack::SetPaneMode (const DFBrowser_AttributePaneType& theMode)
74 {
75   if (myPaneMode == theMode)
76     return;
77
78   myPaneMode = theMode;
79   if (myPaneMode == DFBrowser_AttributePaneType_SearchView)
80   {
81     //! clear highlight in tree model
82     DFBrowser_TreeModel* aModel = dynamic_cast<DFBrowser_TreeModel*> (myModule->GetOCAFViewModel());
83     if (aModel && aModel->HasHighlighted())
84       aModel->SetHighlighted (QModelIndexList());
85     myAttributesStack->setCurrentWidget (mySearchView->GetControl());
86   }
87   else
88   {
89     QItemSelectionModel* aSelectionModel = myModule->GetOCAFViewSelectionModel();
90     QModelIndex anIndex = DFBrowser_Window::SingleSelected (aSelectionModel->selectedIndexes(), 0);
91     SetCurrentItem (anIndex);
92   }
93 }
94
95 // =======================================================================
96 // function : SetCurrentItem
97 // purpose :
98 // =======================================================================
99 void DFBrowser_AttributePaneStack::SetCurrentItem (const QModelIndex& theIndex)
100 {
101   if (myPaneMode != DFBrowser_AttributePaneType_ItemView)
102     return;
103
104   //! clear highlight in tree model
105   DFBrowser_TreeModel* aModel = dynamic_cast<DFBrowser_TreeModel*> (myModule->GetOCAFViewModel());
106   if (aModel && aModel->HasHighlighted())
107     aModel->SetHighlighted (QModelIndexList());
108
109   myCurrentPane = 0;
110   QWidget* aWidget = 0;
111   TreeModel_ItemBasePtr anItemBase = TreeModel_ModelBase::GetItemByIndex (theIndex);
112   if (!anItemBase)
113     return;
114
115   if (DFBrowser_TreeLevelView::ProcessItem (theIndex))
116     aWidget = myTreeLevelView->GetControl();
117   else
118   {
119     DFBrowser_ItemPtr anItem = itemDynamicCast<DFBrowser_Item> (anItemBase);
120     if (!anItem)
121       return;
122
123     if (myAttributesStack->currentWidget() == myTreeLevelView->GetControl())
124       myTreeLevelView->ClearSelection();
125     Handle(TDF_Attribute) anAttribute = anItem->GetAttribute();
126     myCurrentPane = myModule->GetAttributePane (anAttribute);
127     
128     if (myCurrentPane)
129     {
130       aWidget = myCurrentPane->GetWidget (myAttributesStack, true);
131       if (aWidget)
132       {
133         int aWidgetIndex = myAttributesStack->indexOf (aWidget);
134         if (aWidgetIndex < 0)
135           myAttributesStack->addWidget (aWidget);
136       }
137       myCurrentPane->Init (anAttribute);
138
139       std::list<QItemSelectionModel*> aSelectionModels = myCurrentPane->GetSelectionModels();
140       myPaneSelector->SetCurrentSelectionModels (aSelectionModels);
141     }
142   }
143   myAttributesStack->setCurrentWidget (aWidget != NULL ? aWidget : myEmptyWidget);
144 }