1 #include "lc_global.h"
2 #include "lc_shortcuts.h"
3 #include "lc_profile.h"
4 
5 lcKeyboardShortcuts gKeyboardShortcuts;
6 lcMouseShortcuts gMouseShortcuts;
7 
lcLoadDefaultKeyboardShortcuts()8 void lcLoadDefaultKeyboardShortcuts()
9 {
10 	QByteArray Buffer = lcGetProfileBuffer(LC_PROFILE_KEYBOARD_SHORTCUTS);
11 	QTextStream Stream(Buffer, QIODevice::ReadOnly);
12 
13 	if (Buffer.isEmpty() || !gKeyboardShortcuts.Load(Stream))
14 		gKeyboardShortcuts.Reset();
15 }
16 
lcSaveDefaultKeyboardShortcuts()17 void lcSaveDefaultKeyboardShortcuts()
18 {
19 	QByteArray Buffer;
20 	QTextStream Stream(&Buffer, QIODevice::WriteOnly);
21 
22 	gKeyboardShortcuts.Save(Stream);
23 
24 	lcSetProfileBuffer(LC_PROFILE_KEYBOARD_SHORTCUTS, Buffer);
25 }
26 
lcResetDefaultKeyboardShortcuts()27 void lcResetDefaultKeyboardShortcuts()
28 {
29 	gKeyboardShortcuts.Reset();
30 
31 	lcRemoveProfileKey(LC_PROFILE_KEYBOARD_SHORTCUTS);
32 }
33 
lcLoadDefaultMouseShortcuts()34 void lcLoadDefaultMouseShortcuts()
35 {
36 	QStringList Shortcuts = lcGetProfileStringList(LC_PROFILE_MOUSE_SHORTCUTS);
37 
38 	if (Shortcuts.isEmpty() || !gMouseShortcuts.Load(Shortcuts))
39 		gMouseShortcuts.Reset();
40 }
41 
lcSaveDefaultMouseShortcuts()42 void lcSaveDefaultMouseShortcuts()
43 {
44 	QStringList Shortcuts;
45 
46 	gMouseShortcuts.Save(Shortcuts);
47 
48 	lcSetProfileStringList(LC_PROFILE_MOUSE_SHORTCUTS, Shortcuts);
49 }
50 
lcResetDefaultMouseShortcuts()51 void lcResetDefaultMouseShortcuts()
52 {
53 	gMouseShortcuts.Reset();
54 
55 	lcRemoveProfileKey(LC_PROFILE_MOUSE_SHORTCUTS);
56 }
57 
Reset()58 void lcKeyboardShortcuts::Reset()
59 {
60 	for (int CommandIdx = 0; CommandIdx < LC_NUM_COMMANDS; CommandIdx++)
61 		mShortcuts[CommandIdx] = gCommands[CommandIdx].DefaultShortcut;
62 }
63 
Save(const QString & FileName)64 bool lcKeyboardShortcuts::Save(const QString& FileName)
65 {
66 	QFile File(FileName);
67 
68 	if (!File.open(QIODevice::WriteOnly))
69 		return false;
70 
71 	QTextStream Stream(&File);
72 
73 	return Save(Stream);
74 }
75 
Save(QTextStream & Stream)76 bool lcKeyboardShortcuts::Save(QTextStream& Stream)
77 {
78 	for (int CommandIdx = 0; CommandIdx < LC_NUM_COMMANDS; CommandIdx++)
79 	{
80 		if (mShortcuts[CommandIdx].isEmpty())
81 			continue;
82 
83 		Stream << gCommands[CommandIdx].ID << QLatin1String("=") << mShortcuts[CommandIdx] << QLatin1String("\n");
84 	}
85 
86 	Stream.flush();
87 
88 	return true;
89 }
90 
Load(const QString & FileName)91 bool lcKeyboardShortcuts::Load(const QString& FileName)
92 {
93 	QFile File(FileName);
94 
95 	if (!File.open(QIODevice::ReadOnly))
96 		return false;
97 
98 	QTextStream Stream(&File);
99 
100 	return Load(Stream);
101 }
102 
Load(QTextStream & Stream)103 bool lcKeyboardShortcuts::Load(QTextStream& Stream)
104 {
105 	for (int CommandIdx = 0; CommandIdx < LC_NUM_COMMANDS; CommandIdx++)
106 		mShortcuts[CommandIdx].clear();
107 
108 	for (QString Line = Stream.readLine(); !Line.isNull(); Line = Stream.readLine())
109 	{
110 		int Equals = Line.indexOf('=');
111 
112 		if (Equals == -1)
113 			continue;
114 
115 		QString Key = Line.left(Equals);
116 
117 		int CommandIdx;
118 		for (CommandIdx = 0; CommandIdx < LC_NUM_COMMANDS; CommandIdx++)
119 			if (gCommands[CommandIdx].ID == Key)
120 				break;
121 
122 		if (CommandIdx == LC_NUM_COMMANDS)
123 			continue;
124 
125 		mShortcuts[CommandIdx] = Line.mid(Equals + 1);
126 	}
127 
128 	return true;
129 }
130 
Reset()131 void lcMouseShortcuts::Reset()
132 {
133 	memset(mShortcuts, 0, sizeof(mShortcuts));
134 
135 	lcToolShortcut& RotateViewShortcut = mShortcuts[static_cast<int>(lcTool::RotateView)];
136 	RotateViewShortcut.Modifiers1 = Qt::AltModifier;
137 	RotateViewShortcut.Button1 = Qt::LeftButton;
138 	RotateViewShortcut.Modifiers2 = Qt::NoModifier;
139 	RotateViewShortcut.Button2 = Qt::RightButton;
140 
141 	lcToolShortcut& PanShortcut = mShortcuts[static_cast<int>(lcTool::Pan)];
142 	PanShortcut.Modifiers1 = Qt::AltModifier;
143 	PanShortcut.Button1 = Qt::MiddleButton;
144 	PanShortcut.Modifiers2 = Qt::ShiftModifier;
145 	PanShortcut.Button2 = Qt::RightButton;
146 
147 	lcToolShortcut& ZoomShortcut = mShortcuts[static_cast<int>(lcTool::Zoom)];
148 	ZoomShortcut.Modifiers1 = Qt::AltModifier;
149 	ZoomShortcut.Button1 = Qt::RightButton;
150 }
151 
Save(const QString & FileName)152 bool lcMouseShortcuts::Save(const QString& FileName)
153 {
154 	QStringList Shortcuts;
155 
156 	if (!Save(Shortcuts))
157 		return false;
158 
159 	QFile File(FileName);
160 
161 	if (!File.open(QIODevice::WriteOnly))
162 		return false;
163 
164 	QTextStream Stream(&File);
165 
166 	for (const QString& Shortcut : Shortcuts)
167 		Stream << Shortcut << QLatin1String("\n");
168 
169 	Stream.flush();
170 
171 	return true;
172 }
Save(QStringList & Shortcuts)173 bool lcMouseShortcuts::Save(QStringList& Shortcuts)
174 {
175 	Shortcuts.clear();
176 
177 	for (int ToolIdx = 0; ToolIdx < static_cast<int>(lcTool::Count); ToolIdx++)
178 	{
179 		int ButtonIndex1 = 0;
180 		for (int Button1 = mShortcuts[ToolIdx].Button1; Button1; Button1 >>= 1)
181 			ButtonIndex1++;
182 
183 		if (!ButtonIndex1)
184 			continue;
185 
186 		QString Shortcut = QKeySequence(mShortcuts[ToolIdx].Modifiers1 | (Qt::Key_0 + ButtonIndex1)).toString(QKeySequence::PortableText);
187 
188 		int ButtonIndex2 = 0;
189 		for (int Button2 = mShortcuts[ToolIdx].Button2; Button2; Button2 >>= 1)
190 			ButtonIndex2++;
191 
192 		if (ButtonIndex2)
193 			Shortcut += ',' + QKeySequence(mShortcuts[ToolIdx].Modifiers2 | (Qt::Key_0 + ButtonIndex2)).toString(QKeySequence::PortableText);
194 
195 		Shortcuts << QString::fromLatin1(gToolNames[ToolIdx]) + QLatin1String("=") + Shortcut;
196 	}
197 
198 	return true;
199 }
200 
Load(const QString & FileName)201 bool lcMouseShortcuts::Load(const QString& FileName)
202 {
203 	QFile File(FileName);
204 
205 	if (!File.open(QIODevice::ReadOnly))
206 		return false;
207 
208 	QTextStream Stream(&File);
209 	QStringList Lines;
210 
211 	while (!Stream.atEnd())
212 		Lines += Stream.readLine();
213 
214 	return Load(Lines);
215 }
216 
Load(const QStringList & FullShortcuts)217 bool lcMouseShortcuts::Load(const QStringList& FullShortcuts)
218 {
219 	memset(mShortcuts, 0, sizeof(mShortcuts));
220 
221 	for (const QString& FullShortcut : FullShortcuts)
222 	{
223 		int Equals = FullShortcut.indexOf('=');
224 
225 		if (Equals == -1)
226 			continue;
227 
228 		QString Key = FullShortcut.left(Equals);
229 
230 		int ToolIdx;
231 		for (ToolIdx = 0; ToolIdx < static_cast<int>(lcTool::Count); ToolIdx++)
232 			if (Key == gToolNames[ToolIdx])
233 				break;
234 
235 		if (ToolIdx == static_cast<int>(lcTool::Count))
236 			continue;
237 
238 		QStringList Shortcuts = FullShortcut.mid(Equals + 1).split(',');
239 		bool AddedShortcut = false;
240 
241 		for (const QString& Shortcut : Shortcuts)
242 		{
243 			QKeySequence KeySequence(Shortcut);
244 
245 			if (KeySequence.isEmpty())
246 				continue;
247 
248 			int ShortcutKey = KeySequence[0];
249 			Qt::KeyboardModifiers Modifiers = (Qt::KeyboardModifier)(ShortcutKey & Qt::KeyboardModifierMask);
250 			Qt::MouseButton Button = (Qt::MouseButton)(1 << ((ShortcutKey & ~Qt::KeyboardModifierMask) - Qt::Key_0 - 1));
251 
252 			if (!AddedShortcut)
253 			{
254 				mShortcuts[ToolIdx].Modifiers1 = Modifiers;
255 				mShortcuts[ToolIdx].Button1 = Button;
256 				AddedShortcut = true;
257 			}
258 			else
259 			{
260 				mShortcuts[ToolIdx].Modifiers2 = Modifiers;
261 				mShortcuts[ToolIdx].Button2 = Button;
262 			}
263 		}
264 	}
265 
266 	return true;
267 }
268 
GetTool(Qt::MouseButton Button,Qt::KeyboardModifiers Modifiers) const269 lcTool lcMouseShortcuts::GetTool(Qt::MouseButton Button, Qt::KeyboardModifiers Modifiers) const
270 {
271 	for (int ToolIdx = 0; ToolIdx < static_cast<int>(lcTool::Count); ToolIdx++)
272 		if ((mShortcuts[ToolIdx].Button1 == Button && mShortcuts[ToolIdx].Modifiers1 == Modifiers) || (mShortcuts[ToolIdx].Button2 == Button && mShortcuts[ToolIdx].Modifiers2 == Modifiers))
273 			return (lcTool)ToolIdx;
274 
275 	return lcTool::Count;
276 }
277