/[svn]/gigedit/trunk/src/gigedit/Settings.cpp
ViewVC logotype

Contents of /gigedit/trunk/src/gigedit/Settings.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2967 - (show annotations) (download)
Mon Jul 18 11:22:38 2016 UTC (7 years, 9 months ago) by schoenebeck
File size: 9745 byte(s)
* Added option to main menu for performing "Save" operation with a
  tempoary file (may perform faster than directly modifying existing
  .gig file).
* Bumped version (2.0.0.svn19).

1 /*
2 Copyright (c) 2014-2016 Christian Schoenebeck
3
4 This file is part of "gigedit" and released under the terms of the
5 GNU General Public License version 2.
6 */
7
8 #include "Settings.h"
9 #include <glib.h>
10 #include "global.h"
11 #include <glibmm/keyfile.h>
12 #include <iostream>
13 #include <stdio.h>
14 #include <fstream>
15
16 #if (GTKMM_MAJOR_VERSION == 2 && GTKMM_MINOR_VERSION < 40) || GTKMM_MAJOR_VERSION < 2
17 # define HAS_GLIB_KEYFILE_SAVE_TO_FILE 0
18 #else
19 # define HAS_GLIB_KEYFILE_SAVE_TO_FILE 1
20 #endif
21
22 static std::string configDir() {
23 //printf("configDir '%s'\n", g_get_user_config_dir());
24 return g_get_user_config_dir();
25 }
26
27 static std::string dirSep() {
28 //printf("sep '%s'\n", G_DIR_SEPARATOR_S);
29 return G_DIR_SEPARATOR_S;
30 }
31
32 static std::string configFile() {
33 return configDir() + dirSep() + "gigedit.conf";
34 }
35
36 static std::string groupName(Settings::Group_t group) {
37 switch (group) {
38 case Settings::GLOBAL: return "Global";
39 case Settings::MAIN_WINDOW: return "MainWindow";
40 case Settings::SCRIPT_EDITOR: return "ScriptEditor";
41 case Settings::DIMENSION_MANAGER: return "DimensionManager";
42 case Settings::SCRIPT_SLOTS: return "ScriptSlots";
43 case Settings::COMBINE_INSTRUMENTS: return "CombineInstruments";
44 case Settings::MIDI_RULES: return "MidiRules";
45 case Settings::FILE_PROPS: return "FileProps";
46 case Settings::INSTR_PROPS: return "InstrProps";
47 case Settings::SAMPLE_REFS: return "SampleRefs";
48 }
49 return "Global";
50 }
51
52 #if !HAS_GLIB_KEYFILE_SAVE_TO_FILE
53
54 static bool saveToFile(Glib::KeyFile* keyfile, std::string filename) {
55 Glib::ustring s = keyfile->to_data();
56 std::ofstream out;
57 out.open(filename.c_str(), std::ios_base::out | std::ios_base::trunc);
58 out << s;
59 out.close();
60 return true;
61 }
62
63 #endif // ! HAS_GLIB_KEYFILE_SAVE_TO_FILE
64
65 static Settings* _instance = NULL;
66
67 Settings* Settings::singleton() {
68 if (!_instance) {
69 _instance = new Settings;
70 _instance->load();
71 }
72 return _instance;
73 }
74
75 Settings::Settings() : Glib::ObjectBase(typeid(Settings)),
76 warnUserOnExtensions(*this, GLOBAL, "warnUserOnExtensions", true),
77 syncSamplerInstrumentSelection(*this, GLOBAL, "syncSamplerInstrumentSelection", true),
78 moveRootNoteWithRegionMoved(*this, GLOBAL, "moveRootNoteWithRegionMoved", true),
79 autoRestoreWindowDimension(*this, GLOBAL, "autoRestoreWindowDimension", false),
80 saveWithTemporaryFile(*this, GLOBAL, "saveWithTemporaryFile", false),
81 mainWindowX(*this, MAIN_WINDOW, "x", -1),
82 mainWindowY(*this, MAIN_WINDOW, "y", -1),
83 mainWindowW(*this, MAIN_WINDOW, "w", -1),
84 mainWindowH(*this, MAIN_WINDOW, "h", -1),
85 scriptEditorWindowX(*this, SCRIPT_EDITOR, "x", -1),
86 scriptEditorWindowY(*this, SCRIPT_EDITOR, "y", -1),
87 scriptEditorWindowW(*this, SCRIPT_EDITOR, "w", -1),
88 scriptEditorWindowH(*this, SCRIPT_EDITOR, "h", -1),
89 scriptEditorFontSize(*this, SCRIPT_EDITOR, "fontSize", -1),
90 dimensionManagerWindowX(*this, DIMENSION_MANAGER, "x", -1),
91 dimensionManagerWindowY(*this, DIMENSION_MANAGER, "y", -1),
92 dimensionManagerWindowW(*this, DIMENSION_MANAGER, "w", -1),
93 dimensionManagerWindowH(*this, DIMENSION_MANAGER, "h", -1),
94 scriptSlotsWindowX(*this, SCRIPT_SLOTS, "x", -1),
95 scriptSlotsWindowY(*this, SCRIPT_SLOTS, "y", -1),
96 scriptSlotsWindowW(*this, SCRIPT_SLOTS, "w", -1),
97 scriptSlotsWindowH(*this, SCRIPT_SLOTS, "h", -1),
98 combineInstrumentsWindowX(*this, COMBINE_INSTRUMENTS, "x", -1),
99 combineInstrumentsWindowY(*this, COMBINE_INSTRUMENTS, "y", -1),
100 combineInstrumentsWindowW(*this, COMBINE_INSTRUMENTS, "w", -1),
101 combineInstrumentsWindowH(*this, COMBINE_INSTRUMENTS, "h", -1),
102 midiRulesWindowX(*this, MIDI_RULES, "x", -1),
103 midiRulesWindowY(*this, MIDI_RULES, "y", -1),
104 midiRulesWindowW(*this, MIDI_RULES, "w", -1),
105 midiRulesWindowH(*this, MIDI_RULES, "h", -1),
106 filePropsWindowX(*this, FILE_PROPS, "x", -1),
107 filePropsWindowY(*this, FILE_PROPS, "y", -1),
108 filePropsWindowW(*this, FILE_PROPS, "w", -1),
109 filePropsWindowH(*this, FILE_PROPS, "h", -1),
110 instrPropsWindowX(*this, INSTR_PROPS, "x", -1),
111 instrPropsWindowY(*this, INSTR_PROPS, "y", -1),
112 instrPropsWindowW(*this, INSTR_PROPS, "w", -1),
113 instrPropsWindowH(*this, INSTR_PROPS, "h", -1),
114 sampleRefsWindowX(*this, SAMPLE_REFS, "x", -1),
115 sampleRefsWindowY(*this, SAMPLE_REFS, "y", -1),
116 sampleRefsWindowW(*this, SAMPLE_REFS, "w", -1),
117 sampleRefsWindowH(*this, SAMPLE_REFS, "h", -1),
118 m_ignoreNotifies(false)
119 {
120 m_boolProps.push_back(&warnUserOnExtensions);
121 m_boolProps.push_back(&syncSamplerInstrumentSelection);
122 m_boolProps.push_back(&moveRootNoteWithRegionMoved);
123 m_boolProps.push_back(&autoRestoreWindowDimension);
124 m_boolProps.push_back(&saveWithTemporaryFile);
125 m_intProps.push_back(&mainWindowX);
126 m_intProps.push_back(&mainWindowY);
127 m_intProps.push_back(&mainWindowW);
128 m_intProps.push_back(&mainWindowH);
129 m_intProps.push_back(&scriptEditorWindowX);
130 m_intProps.push_back(&scriptEditorWindowY);
131 m_intProps.push_back(&scriptEditorWindowW);
132 m_intProps.push_back(&scriptEditorWindowH);
133 m_intProps.push_back(&scriptEditorFontSize);
134 m_intProps.push_back(&dimensionManagerWindowX);
135 m_intProps.push_back(&dimensionManagerWindowY);
136 m_intProps.push_back(&dimensionManagerWindowW);
137 m_intProps.push_back(&dimensionManagerWindowH);
138 m_intProps.push_back(&scriptSlotsWindowX);
139 m_intProps.push_back(&scriptSlotsWindowY);
140 m_intProps.push_back(&scriptSlotsWindowW);
141 m_intProps.push_back(&scriptSlotsWindowH);
142 m_intProps.push_back(&combineInstrumentsWindowX);
143 m_intProps.push_back(&combineInstrumentsWindowY);
144 m_intProps.push_back(&combineInstrumentsWindowW);
145 m_intProps.push_back(&combineInstrumentsWindowH);
146 m_intProps.push_back(&midiRulesWindowX);
147 m_intProps.push_back(&midiRulesWindowY);
148 m_intProps.push_back(&midiRulesWindowW);
149 m_intProps.push_back(&midiRulesWindowH);
150 m_intProps.push_back(&filePropsWindowX);
151 m_intProps.push_back(&filePropsWindowY);
152 m_intProps.push_back(&filePropsWindowW);
153 m_intProps.push_back(&filePropsWindowH);
154 m_intProps.push_back(&instrPropsWindowX);
155 m_intProps.push_back(&instrPropsWindowY);
156 m_intProps.push_back(&instrPropsWindowW);
157 m_intProps.push_back(&instrPropsWindowH);
158 m_intProps.push_back(&sampleRefsWindowX);
159 m_intProps.push_back(&sampleRefsWindowY);
160 m_intProps.push_back(&sampleRefsWindowW);
161 m_intProps.push_back(&sampleRefsWindowH);
162 }
163
164 void Settings::onPropertyChanged(Glib::PropertyBase* pProperty, RawValueType_t type, Group_t group) {
165 if (m_ignoreNotifies) return;
166
167 //printf("Settings::onPropertyChanged(%s)\n", pProperty->get_name().c_str());
168
169 Glib::KeyFile file;
170 try {
171 bool ok = file.load_from_file(configFile());
172 if (!ok) {
173 std::cerr << "Could not load '" << configFile() << "'\n" << std::flush;
174 }
175 } catch (...) {
176 std::cerr << "Could not load '" << configFile() << "'\n" << std::flush;
177 }
178
179 switch (type) {
180 case BOOLEAN: {
181 Property<bool>* prop = static_cast<Property<bool>*>(pProperty);
182 //std::cout << "Saving bool setting '" << prop->get_name() << "'\n" << std::flush;
183 file.set_boolean(groupName(prop->group()), prop->get_name(), prop->get_value());
184 break;
185 }
186 case INTEGER: {
187 Property<int>* prop = static_cast<Property<int>*>(pProperty);
188 //std::cout << "Saving int setting '" << prop->get_name() << "'\n" << std::flush;
189 file.set_integer(groupName(prop->group()), prop->get_name(), prop->get_value());
190 break;
191 }
192 case UNKNOWN:
193 std::cerr << "BUG: Unknown setting raw type of property '" << pProperty->get_name() << "'\n" << std::flush;
194 return;
195 }
196
197 try {
198 #if HAS_GLIB_KEYFILE_SAVE_TO_FILE
199 bool ok = file.save_to_file(configFile());
200 #else
201 bool ok = saveToFile(&file, configFile());
202 #endif
203 if (!ok) {
204 std::cerr << "Failed saving gigedit config to '" << configFile() << "'\n" << std::flush;
205 } else {
206 //std::cout <<"gigedit CONFIG SAVED\n";
207 }
208 } catch (...) {
209 std::cerr << "Failed saving gigedit config to '" << configFile() << "'\n" << std::flush;
210 }
211 }
212
213 void Settings::load() {
214 Glib::KeyFile file;
215 try {
216 bool ok = file.load_from_file(configFile());
217 if (!ok) return;
218 } catch (...) {
219 std::cerr << "Could not load gigedit config file '" << configFile() << "'\n" << std::flush;
220 return;
221 }
222
223 // ignore onPropertyChanged() calls during updating the property values below
224 m_ignoreNotifies = true;
225
226 for (int i = 0; i < m_boolProps.size(); ++i) {
227 Property<bool>* prop = static_cast<Property<bool>*>(m_boolProps[i]);
228 try {
229 const std::string group = groupName(prop->group());
230 if (!file.has_key(group, prop->get_name())) continue;
231 const bool value = file.get_boolean(group, prop->get_name());
232 prop->set_value(value);
233 } catch (...) {
234 continue;
235 }
236 }
237
238 for (int i = 0; i < m_intProps.size(); ++i) {
239 Property<int>* prop = static_cast<Property<int>*>(m_intProps[i]);
240 try {
241 const std::string group = groupName(prop->group());
242 if (!file.has_key(group, prop->get_name())) continue;
243 const int value = file.get_integer(group, prop->get_name());
244 prop->set_value(value);
245 } catch (...) {
246 continue;
247 }
248 }
249
250 m_ignoreNotifies = false;
251 }
252

  ViewVC Help
Powered by ViewVC