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