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