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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2893 - (hide annotations) (download)
Fri Apr 29 14:19:53 2016 UTC (7 years, 11 months ago) by schoenebeck
File size: 6042 byte(s)
* Automatically save & restore window size and position
  (yet limited to main window and script editor window).
* Bumped version (1.0.0.svn6).

1 schoenebeck 2541 /*
2 schoenebeck 2891 Copyright (c) 2014-2016 Christian Schoenebeck
3 schoenebeck 2541
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 schoenebeck 2891 #include <glib.h>
10     #include "global.h"
11     #include <glibmm/keyfile.h>
12     #include <iostream>
13     #include <stdio.h>
14 schoenebeck 2892 #include <fstream>
15 schoenebeck 2541
16 schoenebeck 2892 #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 schoenebeck 2891 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 schoenebeck 2893 switch (group) {
38     case Settings::GLOBAL: return "Global";
39     case Settings::MAIN_WINDOW: return "MainWindow";
40     case Settings::SCRIPT_EDITOR: return "ScriptEditor";
41     }
42 schoenebeck 2891 return "Global";
43     }
44    
45 schoenebeck 2892 #if !HAS_GLIB_KEYFILE_SAVE_TO_FILE
46    
47     static bool saveToFile(Glib::KeyFile* keyfile, std::string filename) {
48     Glib::ustring s = keyfile->to_data();
49     std::ofstream out;
50     out.open(filename.c_str(), std::ios_base::out | std::ios_base::trunc);
51     out << s;
52     out.close();
53     return true;
54     }
55    
56     #endif // ! HAS_GLIB_KEYFILE_SAVE_TO_FILE
57    
58 schoenebeck 2891 static Settings* _instance = NULL;
59 schoenebeck 2541
60     Settings* Settings::singleton() {
61 schoenebeck 2891 if (!_instance) {
62     _instance = new Settings;
63     _instance->load();
64     }
65     return _instance;
66 schoenebeck 2541 }
67    
68 schoenebeck 2891 Settings::Settings() : Glib::ObjectBase(typeid(Settings)),
69     warnUserOnExtensions(*this, GLOBAL, "warnUserOnExtensions", true),
70     syncSamplerInstrumentSelection(*this, GLOBAL, "syncSamplerInstrumentSelection", true),
71     moveRootNoteWithRegionMoved(*this, GLOBAL, "moveRootNoteWithRegionMoved", true),
72 schoenebeck 2893 mainWindowX(*this, MAIN_WINDOW, "x", -1),
73     mainWindowY(*this, MAIN_WINDOW, "y", -1),
74     mainWindowW(*this, MAIN_WINDOW, "w", -1),
75     mainWindowH(*this, MAIN_WINDOW, "h", -1),
76     scriptEditorWindowX(*this, SCRIPT_EDITOR, "x", -1),
77     scriptEditorWindowY(*this, SCRIPT_EDITOR, "y", -1),
78     scriptEditorWindowW(*this, SCRIPT_EDITOR, "w", -1),
79     scriptEditorWindowH(*this, SCRIPT_EDITOR, "h", -1),
80 schoenebeck 2891 m_ignoreNotifies(false)
81     {
82     m_boolProps.push_back(&warnUserOnExtensions);
83     m_boolProps.push_back(&syncSamplerInstrumentSelection);
84     m_boolProps.push_back(&moveRootNoteWithRegionMoved);
85 schoenebeck 2893 m_intProps.push_back(&mainWindowX);
86     m_intProps.push_back(&mainWindowY);
87     m_intProps.push_back(&mainWindowW);
88     m_intProps.push_back(&mainWindowH);
89     m_intProps.push_back(&scriptEditorWindowX);
90     m_intProps.push_back(&scriptEditorWindowY);
91     m_intProps.push_back(&scriptEditorWindowW);
92     m_intProps.push_back(&scriptEditorWindowH);
93 schoenebeck 2541 }
94 schoenebeck 2891
95     void Settings::onPropertyChanged(Glib::PropertyBase* pProperty, RawValueType_t type, Group_t group) {
96     if (m_ignoreNotifies) return;
97    
98     //printf("Settings::onPropertyChanged(%s)\n", pProperty->get_name().c_str());
99    
100     Glib::KeyFile file;
101     try {
102     bool ok = file.load_from_file(configFile());
103     if (!ok) {
104     std::cerr << "Could not load '" << configFile() << "'\n" << std::flush;
105     }
106     } catch (...) {
107     std::cerr << "Could not load '" << configFile() << "'\n" << std::flush;
108     }
109    
110     switch (type) {
111     case BOOLEAN: {
112     Property<bool>* prop = static_cast<Property<bool>*>(pProperty);
113     //std::cout << "Saving bool setting '" << prop->get_name() << "'\n" << std::flush;
114     file.set_boolean(groupName(prop->group()), prop->get_name(), prop->get_value());
115     break;
116     }
117     case INTEGER: {
118     Property<int>* prop = static_cast<Property<int>*>(pProperty);
119     //std::cout << "Saving int setting '" << prop->get_name() << "'\n" << std::flush;
120     file.set_integer(groupName(prop->group()), prop->get_name(), prop->get_value());
121     break;
122     }
123     case UNKNOWN:
124     std::cerr << "BUG: Unknown setting raw type of property '" << pProperty->get_name() << "'\n" << std::flush;
125     return;
126     }
127    
128     try {
129 schoenebeck 2892 #if HAS_GLIB_KEYFILE_SAVE_TO_FILE
130 schoenebeck 2891 bool ok = file.save_to_file(configFile());
131 schoenebeck 2892 #else
132     bool ok = saveToFile(&file, configFile());
133     #endif
134 schoenebeck 2891 if (!ok) {
135     std::cerr << "Failed saving gigedit config to '" << configFile() << "'\n" << std::flush;
136     } else {
137     //std::cout <<"gigedit CONFIG SAVED\n";
138     }
139     } catch (...) {
140     std::cerr << "Failed saving gigedit config to '" << configFile() << "'\n" << std::flush;
141     }
142     }
143    
144     void Settings::load() {
145     Glib::KeyFile file;
146     try {
147     bool ok = file.load_from_file(configFile());
148     if (!ok) return;
149     } catch (...) {
150     std::cerr << "Could not load gigedit config file '" << configFile() << "'\n" << std::flush;
151     return;
152     }
153    
154     // ignore onPropertyChanged() calls during updating the property values below
155     m_ignoreNotifies = true;
156    
157     for (int i = 0; i < m_boolProps.size(); ++i) {
158     Property<bool>* prop = static_cast<Property<bool>*>(m_boolProps[i]);
159     try {
160     const std::string group = groupName(prop->group());
161     if (!file.has_key(group, prop->get_name())) continue;
162     const bool value = file.get_boolean(group, prop->get_name());
163     prop->set_value(value);
164     } catch (...) {
165     continue;
166     }
167     }
168    
169     for (int i = 0; i < m_intProps.size(); ++i) {
170     Property<int>* prop = static_cast<Property<int>*>(m_intProps[i]);
171     try {
172     const std::string group = groupName(prop->group());
173     if (!file.has_key(group, prop->get_name())) continue;
174     const int value = file.get_integer(group, prop->get_name());
175     prop->set_value(value);
176     } catch (...) {
177     continue;
178     }
179     }
180    
181     m_ignoreNotifies = false;
182     }
183    

  ViewVC Help
Powered by ViewVC