OSDN Git Service

Merge remote-tracking branch 'marv/PseudoHome'
[radegast/radegast.git] / Radegast / GUI / Dialogs / Settings.cs
1 
2 // 
3 // Radegast Metaverse Client
4 // Copyright (c) 2009-2012, Radegast Development Team
5 // All rights reserved.
6 // 
7 // Redistribution and use in source and binary forms, with or without
8 // modification, are permitted provided that the following conditions are met:
9 // 
10 //     * Redistributions of source code must retain the above copyright notice,
11 //       this list of conditions and the following disclaimer.
12 //     * Redistributions in binary form must reproduce the above copyright
13 //       notice, this list of conditions and the following disclaimer in the
14 //       documentation and/or other materials provided with the distribution.
15 //     * Neither the name of the application "Radegast", nor the names of its
16 //       contributors may be used to endorse or promote products derived from
17 //       this software without specific prior written permission.
18 // 
19 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20 // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22 // DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
23 // FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24 // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
25 // SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
26 // CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
27 // OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 //
30 // $Id$
31 //
32 using System;
33 using System.Collections.Generic;
34 using System.ComponentModel;
35 using System.Data;
36 using System.Drawing;
37 using System.Linq;
38 using System.Text;
39 using System.Windows.Forms;
40
41 using OpenMetaverse;
42 using OpenMetaverse.StructuredData;
43
44 using Radegast.Bot;
45
46 namespace Radegast
47 {
48     public enum AutoResponseType : int
49     {
50         WhenBusy = 0,
51         WhenFromNonFriend = 1,
52         Always = 2
53     }
54
55     public partial class frmSettings : RadegastForm
56     {
57         private Settings s;
58         private static bool settingInitialized = false;
59
60         public static void InitSettigs(Settings s)
61         {
62             if (s["im_timestamps"].Type == OSDType.Unknown)
63             {
64                 s["im_timestamps"] = OSD.FromBoolean(true);
65             }
66
67             if (s["rlv_enabled"].Type == OSDType.Unknown)
68             {
69                 s["rlv_enabled"] = new OSDBoolean(false);
70             }
71
72             if (s["mu_emotes"].Type == OSDType.Unknown)
73             {
74                 s["mu_emotes"] = new OSDBoolean(false);
75             }
76
77             if (s["friends_notification_highlight"].Type == OSDType.Unknown)
78             {
79                 s["friends_notification_highlight"] = new OSDBoolean(true);
80             }
81
82             if (!s.ContainsKey("no_typing_anim")) s["no_typing_anim"] = OSD.FromBoolean(false);
83
84             if (!s.ContainsKey("auto_response_type"))
85             {
86                 s["auto_response_type"] = (int)AutoResponseType.WhenBusy;
87                 s["auto_response_text"] = "The Resident you messaged is in 'busy mode' which means they have requested not to be disturbed.  Your message will still be shown in their IM panel for later viewing.";
88             }
89
90             if (!s.ContainsKey("script_syntax_highlight")) s["script_syntax_highlight"] = OSD.FromBoolean(true);
91
92             if (!s.ContainsKey("display_name_mode")) s["display_name_mode"] = (int)NameMode.Smart;
93
94             // Convert legacy settings from first last name to username
95             if (!s.ContainsKey("username") && (s.ContainsKey("first_name") && s.ContainsKey("last_name")))
96             {
97                 s["username"] = s["first_name"] + " " + s["last_name"];
98                 s.Remove("first_name");
99                 s.Remove("last_name");
100             }
101
102             if (!s.ContainsKey("reconnect_time")) s["reconnect_time"] = 120;
103
104             if (!s.ContainsKey("transaction_notification_chat")) s["transaction_notification_chat"] = true;
105
106             if (!s.ContainsKey("transaction_notification_dialog")) s["transaction_notification_dialog"] = true;
107
108             if (!s.ContainsKey("minimize_to_tray")) s["minimize_to_tray"] = false;
109
110             if (!s.ContainsKey("scene_window_docked")) s["scene_window_docked"] = true;
111
112             if (!s.ContainsKey("taskbar_highlight")) s["taskbar_highlight"] = true;
113
114             if (!s.ContainsKey("rendering_occlusion_culling_enabled")) s["rendering_occlusion_culling_enabled"] = true;
115
116             if (!s.ContainsKey("rendering_use_vbo")) s["rendering_use_vbo"] = true;
117
118             if (!s.ContainsKey("send_rad_client_tag")) s["send_rad_client_tag"] = true;
119
120             if (!s.ContainsKey("log_to_file")) s["log_to_file"] = true;
121
122             if (!s.ContainsKey("disable_chat_im_log")) s["disable_chat_im_log"] = false;
123
124             if (!s.ContainsKey("disable_look_at")) s["disable_look_at"] = false;
125
126             if (!s.ContainsKey("highlight_on_chat")) s["highlight_on_chat"] = true;
127
128             if (!s.ContainsKey("highlight_on_im")) s["highlight_on_im"] = true;
129
130             if (!s.ContainsKey("highlight_on_group_im")) s["highlight_on_group_im"] = true;
131         }
132
133         public frmSettings(RadegastInstance instance)
134             : base(instance)
135         {
136             if (settingInitialized)
137             {
138                 frmSettings.InitSettigs(instance.GlobalSettings);
139             }
140
141             InitializeComponent();
142
143             s = instance.GlobalSettings;
144             tbpGraphics.Controls.Add(new Radegast.Rendering.GraphicsPreferences(instance));
145             cbChatTimestamps.Checked = s["chat_timestamps"].AsBoolean();
146
147             cbIMTimeStamps.Checked = s["im_timestamps"].AsBoolean();
148
149             cbChatTimestamps.CheckedChanged += new EventHandler(cbChatTimestamps_CheckedChanged);
150             cbIMTimeStamps.CheckedChanged += new EventHandler(cbIMTimeStamps_CheckedChanged);
151
152             cbTrasactDialog.Checked = s["transaction_notification_dialog"].AsBoolean();
153             cbTrasactChat.Checked = s["transaction_notification_chat"].AsBoolean();
154
155             cbFriendsNotifications.Checked = s["show_friends_online_notifications"].AsBoolean();
156             cbFriendsNotifications.CheckedChanged += new EventHandler(cbFriendsNotifications_CheckedChanged);
157
158             cbAutoReconnect.Checked = s["auto_reconnect"].AsBoolean();
159             cbAutoReconnect.CheckedChanged += new EventHandler(cbAutoReconnect_CheckedChanged);
160
161             cbHideLoginGraphics.Checked = s["hide_login_graphics"].AsBoolean();
162             cbHideLoginGraphics.CheckedChanged += new EventHandler(cbHideLoginGraphics_CheckedChanged);
163
164             cbRLV.Checked = s["rlv_enabled"].AsBoolean();
165             cbRLV.CheckedChanged += (object sender, EventArgs e) =>
166             {
167                 s["rlv_enabled"] = new OSDBoolean(cbRLV.Checked);
168             };
169
170             cbMUEmotes.Checked = s["mu_emotes"].AsBoolean();
171             cbMUEmotes.CheckedChanged += (object sender, EventArgs e) =>
172             {
173                 s["mu_emotes"] = new OSDBoolean(cbMUEmotes.Checked);
174             };
175
176             if (s["chat_font_size"].Type != OSDType.Real)
177             {
178                 s["chat_font_size"] = OSD.FromReal(((ChatConsole)instance.TabConsole.Tabs["chat"].Control).cbxInput.Font.Size);
179             }
180
181             cbFontSize.Text = s["chat_font_size"].AsReal().ToString(System.Globalization.CultureInfo.InvariantCulture);
182
183             if (!s.ContainsKey("minimize_to_tray")) s["minimize_to_tray"] = OSD.FromBoolean(false);
184             cbMinToTrey.Checked = s["minimize_to_tray"].AsBoolean();
185             cbMinToTrey.CheckedChanged += (object sender, EventArgs e) =>
186             {
187                 s["minimize_to_tray"] = OSD.FromBoolean(cbMinToTrey.Checked);
188             };
189
190
191             cbNoTyping.Checked = s["no_typing_anim"].AsBoolean();
192             cbNoTyping.CheckedChanged += (object sender, EventArgs e) =>
193             {
194                 s["no_typing_anim"] = OSD.FromBoolean(cbNoTyping.Checked);
195             };
196
197             txtAutoResponse.Text = s["auto_response_text"];
198             txtAutoResponse.TextChanged += (object sender, EventArgs e) =>
199             {
200                 s["auto_response_text"] = txtAutoResponse.Text;
201             };
202             AutoResponseType art = (AutoResponseType)s["auto_response_type"].AsInteger();
203             switch (art)
204             {
205                 case AutoResponseType.WhenBusy: rbAutobusy.Checked = true; break;
206                 case AutoResponseType.WhenFromNonFriend: rbAutoNonFriend.Checked = true; break;
207                 case AutoResponseType.Always: rbAutoAlways.Checked = true; break;
208             }
209
210             cbSyntaxHighlight.Checked = s["script_syntax_highlight"].AsBoolean();
211             cbSyntaxHighlight.CheckedChanged += (object sender, EventArgs e) =>
212             {
213                 s["script_syntax_highlight"] = OSD.FromBoolean(cbSyntaxHighlight.Checked);
214             };
215
216             switch ((NameMode)s["display_name_mode"].AsInteger())
217             {
218                 case NameMode.Standard: rbDNOff.Checked = true; break;
219                 case NameMode.Smart: rbDNSmart.Checked = true; break;
220                 case NameMode.DisplayNameAndUserName: rbDNDandUsernme.Checked = true; break;
221                 case NameMode.OnlyDisplayName: rbDNOnlyDN.Checked = true; break;
222             }
223
224             txtReconnectTime.Text = s["reconnect_time"].AsInteger().ToString();
225
226             cbRadegastClientTag.Checked = s["send_rad_client_tag"];
227             cbRadegastClientTag.CheckedChanged += (sender, e) =>
228             {
229                 s["send_rad_client_tag"] = cbRadegastClientTag.Checked;
230                 instance.SetClientTag();
231             };
232
233             cbOnInvOffer.SelectedIndex = s["inv_auto_accept_mode"].AsInteger();
234             cbOnInvOffer.SelectedIndexChanged += (sender, e) =>
235             {
236                 s["inv_auto_accept_mode"] = cbOnInvOffer.SelectedIndex;
237             };
238
239             cbRadegastLogToFile.Checked = s["log_to_file"];
240
241             cbDisableChatIMLog.Checked = s["disable_chat_im_log"];
242             cbDisableChatIMLog.CheckedChanged += (sender, e) =>
243             {
244                 s["disable_chat_im_log"] = cbDisableChatIMLog.Checked;
245             };
246
247             cbDisableLookAt.Checked = s["disable_look_at"];
248             cbDisableLookAt.CheckedChanged += (sender, e) =>
249             {
250                 s["disable_look_at"] = cbDisableLookAt.Checked;
251             };
252
253             cbTaskBarHighLight.Checked = s["taskbar_highlight"];
254             cbTaskBarHighLight.CheckedChanged += (sender, e) =>
255             {
256                 s["taskbar_highlight"] = cbTaskBarHighLight.Checked;
257                 UpdateEnabled();
258             };
259
260             cbFriendsHighlight.Checked = s["friends_notification_highlight"].AsBoolean();
261             cbFriendsHighlight.CheckedChanged += (object sender, EventArgs e) =>
262             {
263                 s["friends_notification_highlight"] = new OSDBoolean(cbFriendsHighlight.Checked);
264             };
265
266             cbHighlightChat.Checked = s["highlight_on_chat"];
267             cbHighlightChat.CheckedChanged += (sender, e) =>
268             {
269                 s["highlight_on_chat"] = cbHighlightChat.Checked;
270             };
271
272             cbHighlightIM.Checked = s["highlight_on_im"];
273             cbHighlightIM.CheckedChanged += (sender, e) =>
274             {
275                 s["highlight_on_im"] = cbHighlightIM.Checked;
276             };
277
278             cbHighlightGroupIM.Checked = s["highlight_on_group_im"];
279             cbHighlightGroupIM.CheckedChanged += (sender, e) =>
280             {
281                 s["highlight_on_group_im"] = cbHighlightGroupIM.Checked;
282             };
283
284             autoSitPrefsUpdate();
285             pseudoHomePrefsUpdated();
286
287             UpdateEnabled();
288         }
289
290         void UpdateEnabled()
291         {
292             if (cbTaskBarHighLight.Checked)
293             {
294                 cbFriendsHighlight.Enabled = cbHighlightChat.Enabled = cbHighlightGroupIM.Enabled = cbHighlightIM.Enabled = true;
295             }
296             else
297             {
298                 cbFriendsHighlight.Enabled = cbHighlightChat.Enabled = cbHighlightGroupIM.Enabled = cbHighlightIM.Enabled = false;
299             }
300         }
301
302         void cbHideLoginGraphics_CheckedChanged(object sender, EventArgs e)
303         {
304             s["hide_login_graphics"] = OSD.FromBoolean(cbHideLoginGraphics.Checked);
305         }
306
307         void cbAutoReconnect_CheckedChanged(object sender, EventArgs e)
308         {
309             s["auto_reconnect"] = OSD.FromBoolean(cbAutoReconnect.Checked);
310         }
311
312         void cbFriendsNotifications_CheckedChanged(object sender, EventArgs e)
313         {
314             s["show_friends_online_notifications"] = OSD.FromBoolean(cbFriendsNotifications.Checked);
315         }
316
317         void cbChatTimestamps_CheckedChanged(object sender, EventArgs e)
318         {
319             s["chat_timestamps"] = OSD.FromBoolean(cbChatTimestamps.Checked);
320         }
321
322         void cbIMTimeStamps_CheckedChanged(object sender, EventArgs e)
323         {
324             s["im_timestamps"] = OSD.FromBoolean(cbIMTimeStamps.Checked);
325         }
326
327         private void cbTrasactDialog_CheckedChanged(object sender, EventArgs e)
328         {
329             s["transaction_notification_dialog"] = OSD.FromBoolean(cbTrasactDialog.Checked);
330         }
331
332         private void cbTrasactChat_CheckedChanged(object sender, EventArgs e)
333         {
334             s["transaction_notification_chat"] = OSD.FromBoolean(cbTrasactChat.Checked);
335         }
336
337         private void UpdateFontSize()
338         {
339             double f = 8.25;
340             double existing = s["chat_font_size"].AsReal();
341
342             if (!double.TryParse(cbFontSize.Text, out f))
343             {
344                 cbFontSize.Text = s["chat_font_size"].AsReal().ToString(System.Globalization.CultureInfo.InvariantCulture);
345                 return;
346             }
347
348             if (Math.Abs(existing - f) > 0.0001f)
349                 s["chat_font_size"] = OSD.FromReal(f);
350
351         }
352
353         private void cbFontSize_SelectedIndexChanged(object sender, EventArgs e)
354         {
355             UpdateFontSize();
356         }
357
358         private void cbFontSize_KeyDown(object sender, KeyEventArgs e)
359         {
360             if (e.KeyCode == Keys.Enter)
361             {
362                 UpdateFontSize();
363                 e.Handled = e.SuppressKeyPress = true;
364             }
365         }
366
367         private void cbFontSize_Leave(object sender, EventArgs e)
368         {
369             UpdateFontSize();
370         }
371
372         private void rbAutobusy_CheckedChanged(object sender, EventArgs e)
373         {
374             s["auto_response_type"] = (int)AutoResponseType.WhenBusy;
375         }
376
377         private void rbAutoNonFriend_CheckedChanged(object sender, EventArgs e)
378         {
379             s["auto_response_type"] = (int)AutoResponseType.WhenFromNonFriend;
380         }
381
382         private void rbAutoAlways_CheckedChanged(object sender, EventArgs e)
383         {
384             s["auto_response_type"] = (int)AutoResponseType.Always;
385         }
386
387         private void rbDNOff_CheckedChanged(object sender, EventArgs e)
388         {
389             if (rbDNOff.Checked)
390                 s["display_name_mode"] = (int)NameMode.Standard;
391         }
392
393         private void rbDNSmart_CheckedChanged(object sender, EventArgs e)
394         {
395             if (rbDNSmart.Checked)
396                 s["display_name_mode"] = (int)NameMode.Smart;
397         }
398
399         private void rbDNDandUsernme_CheckedChanged(object sender, EventArgs e)
400         {
401             if (rbDNDandUsernme.Checked)
402                 s["display_name_mode"] = (int)NameMode.DisplayNameAndUserName;
403         }
404
405         private void rbDNOnlyDN_CheckedChanged(object sender, EventArgs e)
406         {
407             if (rbDNOnlyDN.Checked)
408                 s["display_name_mode"] = (int)NameMode.OnlyDisplayName;
409         }
410
411         private void txtReconnectTime_TextChanged(object sender, EventArgs e)
412         {
413             string input = System.Text.RegularExpressions.Regex.Replace(txtReconnectTime.Text, @"[^\d]", "");
414             int t = 120;
415             int.TryParse(input, out t);
416
417             if (txtReconnectTime.Text != t.ToString())
418             {
419                 txtReconnectTime.Text = t.ToString();
420                 txtReconnectTime.Select(txtReconnectTime.Text.Length, 0);
421             }
422
423             s["reconnect_time"] = t;
424         }
425
426         private void cbRadegastLogToFile_CheckedChanged(object sender, EventArgs e)
427         {
428             s["log_to_file"] = OSD.FromBoolean(cbRadegastLogToFile.Checked);
429         }
430
431         #region Auto-Sit
432
433         private void autoSitPrefsUpdate()
434         {
435             autoSit.Enabled = (Instance.Client.Network.Connected && Instance.ClientSettings != null);
436             if (!autoSit.Enabled)
437             {
438                 return;
439             }
440             AutoSitPreferences prefs = Instance.State.AutoSit.Preferences;
441             autoSitName.Text = prefs.PrimitiveName;
442             autoSitUUID.Text = prefs.Primitive.ToString();
443             autoSitSit.Enabled = prefs.Primitive != UUID.Zero;
444             autoSitEnabled.Checked = prefs.Enabled;
445         }
446
447         private void autoSitClear_Click(object sender, EventArgs e)
448         {
449             Instance.State.AutoSit.Preferences = new AutoSitPreferences();
450             autoSitPrefsUpdate();
451         }
452
453         private void autoSitNameLabel_Click(object sender, EventArgs e)
454         {
455             autoSitName.SelectAll();
456         }
457
458         private void autoSitUUIDLabel_Click(object sender, EventArgs e)
459         {
460             autoSitUUID.SelectAll();
461         }
462
463         private void autoSitSit_Click(object sender, EventArgs e)
464         {
465             Instance.State.AutoSit.TrySit();
466         }
467
468         private void autoSitEnabled_CheckedChanged(object sender, EventArgs e)
469         {
470             Instance.State.AutoSit.Preferences = new AutoSitPreferences
471             {
472                 Primitive = Instance.State.AutoSit.Preferences.Primitive,
473                 PrimitiveName = Instance.State.AutoSit.Preferences.PrimitiveName,
474                 Enabled = autoSitEnabled.Checked
475             };
476         }
477
478         #endregion
479
480         #region Pseudo Home
481
482         private void pseudoHomePrefsUpdated()
483         {
484             pseudoHome.Enabled = (Instance.Client.Network.Connected && Instance.ClientSettings != null);
485             if (!pseudoHome.Enabled)
486             {
487                 return;
488             }
489             PseudoHomePreferences prefs = Instance.State.PseudoHome.Preferences;
490             pseudoHomeLocation.Text = (prefs.Region != string.Empty) ? string.Format("{0} <{1}, {2}, {3}>", prefs.Region, (int)prefs.Position.X, (int)prefs.Position.Y, (int)prefs.Position.Z) : "";
491             pseudoHomeEnabled.Checked = prefs.Enabled;
492             pseudoHomeTP.Enabled = (prefs.Region.Trim() != string.Empty);
493             pseudoHomeTolerance.Value = Math.Max(pseudoHomeTolerance.Minimum, Math.Min(pseudoHomeTolerance.Maximum, prefs.Tolerance));
494         }
495
496         private void pseudoHomeLabel_Click(object sender, EventArgs e)
497         {
498             pseudoHomeLocation.SelectAll();
499         }
500
501         private void pseudoHomeEnabled_CheckedChanged(object sender, EventArgs e)
502         {
503             Instance.State.PseudoHome.Preferences = new PseudoHomePreferences
504             {
505                 Enabled = pseudoHomeEnabled.Checked,
506                 Region = Instance.State.PseudoHome.Preferences.Region,
507                 Position = Instance.State.PseudoHome.Preferences.Position,
508                 Tolerance = Instance.State.PseudoHome.Preferences.Tolerance
509             };
510         }
511
512         private void pseudoHomeTP_Click(object sender, EventArgs e)
513         {
514             Instance.State.PseudoHome.ETGoHome();
515         }
516
517         private void pseudoHomeSet_Click(object sender, EventArgs e)
518         {
519             Instance.State.PseudoHome.Preferences = new PseudoHomePreferences
520             {
521                 Enabled = Instance.State.PseudoHome.Preferences.Enabled,
522                 Region = Instance.Client.Network.CurrentSim.Name,
523                 Position = Instance.Client.Self.SimPosition,
524                 Tolerance = Instance.State.PseudoHome.Preferences.Tolerance
525             };
526             pseudoHomePrefsUpdated();
527         }
528
529         private void pseudoHomeTolerance_ValueChanged(object sender, EventArgs e)
530         {
531             Instance.State.PseudoHome.Preferences = new PseudoHomePreferences
532             {
533                 Enabled = Instance.State.PseudoHome.Preferences.Enabled,
534                 Region = Instance.State.PseudoHome.Preferences.Region,
535                 Position = Instance.State.PseudoHome.Preferences.Position,
536                 Tolerance = (uint)pseudoHomeTolerance.Value
537             };
538         }
539
540         #endregion
541     }
542 }