]> SALOME platform Git repositories - modules/shaper.git/blob - src/XGUI/XGUI_Preferences.cpp
Salome HOME
Merge branch 'master' of newgeom:newgeom
[modules/shaper.git] / src / XGUI / XGUI_Preferences.cpp
1 // File:        XGUI_Preferences.cpp
2 // Created:     07 Aug 2014
3 // Author:      Vitaly SMETANNIKOV
4
5 #include "XGUI_Preferences.h"
6 #include "XGUI_Constants.h"
7
8 #include <SUIT_ResourceMgr.h>
9 #include <SUIT_PreferenceMgr.h>
10
11 #include <QLayout>
12 #include <QApplication>
13 #include <QDialogButtonBox>
14
15
16 const QString XGUI_Preferences::VIEWER_SECTION = "Viewer";
17 const QString XGUI_Preferences::MENU_SECTION = "Menu";
18
19
20 SUIT_ResourceMgr* XGUI_Preferences::myResourceMgr = 0;
21
22
23 SUIT_ResourceMgr* XGUI_Preferences::resourceMgr()
24 {
25   if (!myResourceMgr) {
26     myResourceMgr = new SUIT_ResourceMgr("NewGeom");
27     myResourceMgr->setCurrentFormat("xml");
28   }
29   return myResourceMgr;
30 }
31
32 bool XGUI_Preferences::editPreferences(XGUI_Prefs& theModified)
33 {
34   XGUI_PreferencesDlg aDlg(resourceMgr(), QApplication::activeWindow());
35   aDlg.exec();
36   if (aDlg.isChanged()) {
37     aDlg.modified(theModified);
38     resourceMgr()->save();
39     return true;
40   }
41   return false;
42 }
43
44
45
46 //**********************************************************
47 //**********************************************************
48 //**********************************************************
49 XGUI_PreferencesDlg::XGUI_PreferencesDlg(SUIT_ResourceMgr* theResurces, QWidget* theParent)
50   : QDialog(theParent), myIsChanged(false)
51 {
52   setWindowTitle( tr("Edit preferences") );
53
54   QVBoxLayout* main = new QVBoxLayout(this);
55   main->setMargin( 5 );
56   main->setSpacing( 5 );
57
58   myPreferences = new XGUI_PreferencesMgr(theResurces, this);
59   main->addWidget( myPreferences );
60
61   setFocusProxy( myPreferences );
62   myPreferences->setFrameStyle( QFrame::Box | QFrame::Sunken );
63
64   QDialogButtonBox* aBtnBox = new QDialogButtonBox(
65     QDialogButtonBox::Ok | QDialogButtonBox::Cancel, Qt::Horizontal, this);
66   main->addWidget(aBtnBox);
67   connect(aBtnBox, SIGNAL(accepted()), this, SLOT(accept()));
68   connect(aBtnBox, SIGNAL(rejected()), this, SLOT(reject()));  
69   createEditors();
70
71   myPreferences->retrieve();
72   setMinimumSize(800, 200);
73 }
74
75 XGUI_PreferencesDlg::~XGUI_PreferencesDlg()
76 {
77 }
78
79 void XGUI_PreferencesDlg::createEditors()
80 {
81   int aLFpage = myPreferences->addItem("Desktop");
82   //myPreferences->setItemIcon(aLFpage, QIcon(":pictures/view_prefs.png"));
83
84   createMenuPage(aLFpage);
85   createViewerPage(aLFpage);
86
87   std::list<std::string> aOwners = Config_PropManager::getOwners();
88   std::list<std::string>::const_iterator aIt;
89   for (aIt = aOwners.cbegin(); aIt != aOwners.cend(); ++ aIt) {
90     int aPage = myPreferences->addItem((*aIt).c_str());
91     createCustomPage(aPage, Config_PropManager::getProperties((*aIt)));
92   }
93 }
94
95 void XGUI_PreferencesDlg::createViewerPage(int thePageId)
96 {
97   int viewTab = myPreferences->addItem( tr("Viewer"), thePageId );
98
99   QStringList gradList;
100   gradList << tr("Horizontal gradient")     << tr("Vertical gradient")        <<
101               tr("First diagonal gradient") << tr("Second diagonal gradient") <<
102               tr("First corner gradient")   << tr("Second corner gradient")   <<
103               tr("Third corner gradient")   << tr("Fourth corner gradient");
104   
105   QList<QVariant> idList;
106   for (int i = 0; i < gradList.size(); i++)
107     idList << i;
108
109   int bgGroup = myPreferences->addItem( tr( "Background" ), viewTab );
110
111   QString aImgFiles("Image files (*.bmp *.gif *.pix *.xwd *.rgb *.rs)");
112
113   int bgId = myPreferences->addItem( tr("Viewer 3d" ), bgGroup,
114                                   SUIT_PreferenceMgr::Background, 
115                                   XGUI_Preferences::VIEWER_SECTION, "background" );
116   myPreferences->setItemProperty( "gradient_names", gradList, bgId );
117   myPreferences->setItemProperty( "gradient_ids", idList, bgId );
118   myPreferences->setItemProperty( "texture_enabled", true, bgId );
119   myPreferences->setItemProperty( "texture_center_enabled", true, bgId );
120   myPreferences->setItemProperty( "texture_tile_enabled", true, bgId );
121   myPreferences->setItemProperty( "texture_stretch_enabled", true, bgId );
122   myPreferences->setItemProperty( "custom_enabled", false, bgId );
123   myPreferences->setItemProperty( "image_formats", aImgFiles, bgId );
124 }
125
126 void XGUI_PreferencesDlg::createMenuPage(int thePageId)
127 {
128   int aMenuTab = myPreferences->addItem(tr("Main menu"), thePageId );
129
130   int aSizeGroup = myPreferences->addItem(tr("Size"), aMenuTab );
131   myPreferences->setItemProperty( "columns", 2, aSizeGroup );
132
133   int aItemSizeItem = myPreferences->addItem( tr( "Item size" ), 
134                                               aSizeGroup, 
135                                               SUIT_PreferenceMgr::Selector,
136                                               XGUI_Preferences::MENU_SECTION, 
137                                               "item_size" );
138   QStringList aValuesList;
139   QList<QVariant> anIndicesList;
140   aValuesList << tr("Small") << tr("Medium") << tr("Large");
141   anIndicesList << 20 << 25 << 30;
142   myPreferences->setItemProperty( "strings", aValuesList,   aItemSizeItem );
143   myPreferences->setItemProperty( "indexes", anIndicesList, aItemSizeItem );
144
145   int aRowsNb = myPreferences->addItem( tr( "Number of rows" ), 
146                                         aSizeGroup,
147                                         SUIT_PreferenceMgr::IntSpin, 
148                                         XGUI_Preferences::MENU_SECTION, 
149                                         "rows_number" );
150   myPreferences->setItemProperty( "min", 1, aRowsNb );
151   myPreferences->setItemProperty( "max", 10, aRowsNb );
152 }
153
154
155 void XGUI_PreferencesDlg::createCustomPage(int thePageId, Config_Properties& theProps)
156 {
157   SUIT_ResourceMgr* aResMgr = XGUI_Preferences::resourceMgr();
158   bool isResModified = false;
159
160   // Sort by sections
161   QMap<QString, Config_Properties> aGroupMap;
162   Config_Properties::const_iterator aIt;
163   for (aIt = theProps.cbegin(); aIt != theProps.cend(); ++aIt) {
164     QString aGroup((*aIt)->section().c_str());
165     if (aGroupMap.contains(aGroup)) {
166       aGroupMap[aGroup].push_back(*aIt);
167     } else {
168       Config_Properties aProps;
169       aProps.push_back(*aIt);
170       aGroupMap[aGroup] = aProps;
171     }
172     // check that the property is defined
173     QString aName((*aIt)->name().c_str());
174     if (!aResMgr->hasValue(aGroup, aName)) {
175       aResMgr->setValue(aGroup, aName, QString((*aIt)->value().c_str()));
176       isResModified = true;
177     }
178   }
179   if (isResModified)
180     aResMgr->save();
181
182   // Make a Tab from each section
183   QMap<QString, Config_Properties>::iterator it;
184   for (it = aGroupMap.begin(); it != aGroupMap.end(); ++it) {
185     int aTab = myPreferences->addItem(it.key(), thePageId );
186     myPreferences->setItemProperty( "columns", 2, aTab );
187     Config_Properties& aProps = it.value();
188     for (aIt = aProps.cbegin(); aIt != aProps.cend(); ++aIt) {
189       myPreferences->addItem( QString((*aIt)->title().c_str()), aTab,
190                               (SUIT_PreferenceMgr::PrefItemType)(*aIt)->type(), 
191                               QString((*aIt)->section().c_str()), 
192                                QString((*aIt)->name().c_str()) );
193     }
194   }
195 }
196
197
198 void XGUI_PreferencesDlg::accept()
199 {
200   myPreferences->store();
201   myIsChanged = true;
202   QDialog::accept();
203 }
204
205 void XGUI_PreferencesDlg::modified(XGUI_Prefs& theModified) const
206 {
207   theModified = myPreferences->modified();
208 }
209
210
211
212 //**********************************************************
213 //**********************************************************
214 //**********************************************************
215 void XGUI_PreferencesMgr::changedResources( const ResourceMap& theMap)
216 {
217   myModified.clear();
218   ResourceMap::ConstIterator it;
219   QString sec, param;
220   for (it = theMap.begin(); it != theMap.end(); ++it ) {
221     XGUI_Pref aPref;
222     it.key()->resource( aPref.first, aPref.second );
223     myModified.append(aPref);
224   }
225 }