1 #include "config.h"
2 #include <QVectorIterator>
3 #include <iostream>
4
5
6 using namespace std;
7
8
CFG()9 CFG::CFG() :
10 settings(QSettings::IniFormat, QSettings::UserScope, QString::fromUtf8("katarakt")) {
11 // TODO warn about invalid user input
12 init_defaults();
13 }
14
CFG(const char * file)15 CFG::CFG(const char* file) :
16 // file comes from the command line, use locale
17 settings(QString::fromLocal8Bit(file), QSettings::IniFormat) {
18 init_defaults();
19 }
20
21 // explicitly interpret all strings as utf8
default_setting(const char * name,const char * value)22 void CFG::default_setting(const char *name, const char *value) {
23 vd.push_back(QString::fromUtf8(name));
24 defaults[vd.back()] = QString::fromUtf8(value);
25 }
26
27 // explicitly interpret all strings as utf8
28 template <typename T>
default_setting(const char * name,const T value)29 void CFG::default_setting(const char *name, const T value) {
30 vd.push_back(QString::fromUtf8(name));
31 defaults[vd.back()] = value;
32 }
33
34 // explicitly interpret all strings as utf8
default_key(const char * action,const char * key1,const char * key2=NULL)35 void CFG::default_key(const char *action, const char *key1, const char *key2 = NULL) {
36 vk.push_back(QString::fromUtf8(action));
37 keys[vk.back()] = QStringList() << QString::fromUtf8(key1);
38 if (key2 != NULL) {
39 keys[vk.back()] << QString::fromUtf8(key2);
40 }
41 }
42
init_defaults()43 void CFG::init_defaults() {
44 // settings
45 // canvas
46 default_setting("Settings/default_layout", "single");
47 default_setting("Settings/background_color", "0xDF202020");
48 default_setting("Settings/background_color_fullscreen", "0xFF000000");
49 default_setting("Settings/unrendered_page_color", "0x40FFFFFF");
50
51 default_setting("Settings/click_link_button", 1);
52 default_setting("Settings/drag_view_button", 2);
53 default_setting("Settings/select_text_button", 1);
54 default_setting("Settings/hide_mouse_timeout", 2000);
55 default_setting("Settings/smooth_scroll_delta", 30); // pixel scroll offset
56 default_setting("Settings/screen_scroll_factor", 0.9); // creates overlap for scrolling 1 screen down, should be <= 1
57 default_setting("Settings/jump_padding", 0.2); // must be <= 0.5
58 default_setting("Settings/rect_margin", 2);
59 default_setting("Settings/useless_gap", 2);
60 default_setting("Settings/min_zoom", -14);
61 default_setting("Settings/max_zoom", 30);
62 default_setting("Settings/zoom_factor", 0.05);
63 default_setting("Settings/min_page_width", 50);
64 default_setting("Settings/presenter_slide_ratio", 0.67);
65 // viewer
66 default_setting("Settings/quit_on_init_fail", false);
67 default_setting("Settings/single_instance_per_file", false);
68 default_setting("Settings/stylesheet", "");
69 default_setting("Settings/page_overlay_text", "Page %1/%2");
70 default_setting("Settings/icon_theme", "");
71 // internal
72 default_setting("Settings/prefetch_count", 4);
73 default_setting("Settings/inverted_color_contrast", 0.5);
74 default_setting("Settings/inverted_color_brightening", 0.15);
75 default_setting("Settings/mouse_wheel_factor", 120); // (qt-)delta for turning the mouse wheel 1 click
76 default_setting("Settings/thumbnail_filter", true); // filter when creating thumbnail image
77 default_setting("Settings/thumbnail_size", 32);
78
79 // keys
80 // movement
81 default_key("Keys/page_up", "PgUp");
82 default_key("Keys/page_down", "PgDown");
83 default_key("Keys/top", "Home", "G");
84 default_key("Keys/bottom", "End", "Shift+G");
85 default_key("Keys/goto_page", "Ctrl+G");
86 default_key("Keys/half_screen_up", "Ctrl+U");
87 default_key("Keys/half_screen_down", "Ctrl+D");
88 default_key("Keys/screen_up", "Backspace", "Ctrl+B");
89 default_key("Keys/screen_down", "Space", "Ctrl+F");
90 default_key("Keys/smooth_up", "Up", "K");
91 default_key("Keys/smooth_down", "Down", "J");
92 default_key("Keys/smooth_left", "Left", "H");
93 default_key("Keys/smooth_right", "Right", "L");
94 default_key("Keys/search", "/");
95 default_key("Keys/search_backward", "?");
96 default_key("Keys/next_hit", "N");
97 default_key("Keys/previous_hit", "Shift+N");
98 default_key("Keys/next_invisible_hit", "Ctrl+N");
99 default_key("Keys/previous_invisible_hit", "Ctrl+Shift+N");
100 default_key("Keys/jump_back", "Ctrl+O", "Alt+Left");
101 default_key("Keys/jump_forward", "Ctrl+I", "Alt+Right");
102 default_key("Keys/mark_jump", "M");
103 // layout
104 default_key("Keys/set_single_layout", "1");
105 default_key("Keys/set_grid_layout", "2");
106 default_key("Keys/set_presenter_layout", "3");
107 default_key("Keys/zoom_in", "=", "+");
108 default_key("Keys/zoom_out", "-");
109 default_key("Keys/reset_zoom", "Z");
110 default_key("Keys/increase_columns", "]");
111 default_key("Keys/decrease_columns", "[");
112 default_key("Keys/increase_offset", "}");
113 default_key("Keys/decrease_offset", "{");
114 default_key("Keys/rotate_left", ",");
115 default_key("Keys/rotate_right", ".");
116 // viewer
117 default_key("Keys/toggle_overlay", "T");
118 default_key("Keys/quit", "Q", "W,E,E,E");
119 default_key("Keys/close_search", "Esc");
120 default_key("Keys/invert_colors", "I");
121 default_key("Keys/copy_to_clipboard", "Ctrl+C");
122 default_key("Keys/swap_selection_and_panning_buttons", "V");
123 default_key("Keys/toggle_fullscreen", "F");
124 default_key("Keys/reload", "R");
125 default_key("Keys/open", "O");
126 default_key("Keys/save", "S");
127 default_key("Keys/toggle_toc", "F9");
128 default_key("Keys/freeze_presentation", "X");
129
130 // tmp values
131 tmp_values[QString::fromUtf8("start_page")] = 0;
132 tmp_values[QString::fromUtf8("fullscreen")] = false;
133 }
134
CFG(const CFG &)135 CFG::CFG(const CFG &/*other*/) {
136 }
137
operator =(const CFG &)138 CFG &CFG::operator=(const CFG &/*other*/) {
139 return *this;
140 }
141
~CFG()142 CFG::~CFG() {
143 // set_defaults(); // uncomment to create ini file with all the default settings
144 }
145
set_defaults()146 void CFG::set_defaults() {
147 QVectorIterator<QString> it(vd);
148 while (it.hasNext()) {
149 QString tmp = it.next();
150 settings.setValue(tmp, defaults[tmp]);
151 }
152
153 QVectorIterator<QString> i2(vk);
154 while (i2.hasNext()) {
155 QString tmp = i2.next();
156 settings.setValue(tmp, keys[tmp]);
157 }
158 }
159
get_instance()160 CFG *CFG::get_instance() {
161 static CFG instance;
162 return &instance;
163 }
164
write_defaults(const char * file)165 void CFG::write_defaults(const char *file) {
166 CFG inst(file);
167 inst.settings.clear();
168 inst.settings.setFallbacksEnabled(false);
169 inst.set_defaults();
170 inst.settings.sync();
171 get_instance();
172 }
173
get_value(const char * _key) const174 QVariant CFG::get_value(const char *_key) const {
175 QString key = QString::fromUtf8(_key);
176 #ifdef DEBUG
177 if (defaults.find(key) == defaults.end()) {
178 cout << "missing key " << _key << endl;
179 }
180 #endif
181 return settings.value(key, defaults[key]);
182 }
183
set_value(const char * key,QVariant value)184 void CFG::set_value(const char *key, QVariant value) {
185 settings.setValue(QString::fromUtf8(key), value);
186 }
187
get_tmp_value(const char * key) const188 QVariant CFG::get_tmp_value(const char *key) const {
189 return tmp_values[QString::fromUtf8(key)];
190 }
191
set_tmp_value(const char * key,QVariant value)192 void CFG::set_tmp_value(const char *key, QVariant value) {
193 tmp_values[QString::fromUtf8(key)] = value;
194 }
195
has_tmp_value(const char * key) const196 bool CFG::has_tmp_value(const char *key) const {
197 return tmp_values.contains(QString::fromUtf8(key));
198 }
199
get_most_current_value(const char * _key) const200 QVariant CFG::get_most_current_value(const char *_key) const {
201 QString key = QString::fromUtf8(_key);
202 if (tmp_values.contains(key)) {
203 return tmp_values[key];
204 } else {
205 #ifdef DEBUG
206 if (defaults.find(key) == defaults.end()) {
207 cout << "missing key " << _key << endl;
208 }
209 #endif
210 return settings.value(key, defaults[key]);
211 }
212 }
213
get_keys(const char * _action) const214 QStringList CFG::get_keys(const char *_action) const {
215 QString action = QString::fromUtf8(_action);
216 return settings.value(action, keys[action]).toStringList();
217 }
218
219