1/*
2 * Copyright 2019, Haiku, Inc.
3 * Distributed under the terms of the MIT License.
4 *
5 * Author:
6 *		Preetpal Kaur <preetpalok123@gmail.com>
7 */
8
9
10#include "InputKeyboard.h"
11
12#include <Box.h>
13#include <Button.h>
14#include <Catalog.h>
15#include <LayoutBuilder.h>
16#include <Locale.h>
17#include <Message.h>
18#include <SeparatorView.h>
19#include <Slider.h>
20#include <TextControl.h>
21
22#include "InputConstants.h"
23#include "KeyboardView.h"
24
25#undef B_TRANSLATION_CONTEXT
26#define B_TRANSLATION_CONTEXT "InputKeyboard"
27
28
29InputKeyboard::InputKeyboard(BInputDevice* dev)
30	:
31	BView("InputKeyboard", B_WILL_DRAW)
32{
33	// Add the main settings view
34	fSettingsView = new KeyboardView();
35
36	// Add the "Default" button..
37	fDefaultsButton = new BButton(B_TRANSLATE("Defaults"),
38        new BMessage(kMsgDefaults));
39
40	// Add the "Revert" button...
41	fRevertButton = new BButton(B_TRANSLATE("Revert"),
42        new BMessage(kMsgRevert));
43	fRevertButton->SetEnabled(false);
44
45	// Build the layout
46	BLayoutBuilder::Group<>(this, B_VERTICAL)
47		.AddGroup(B_HORIZONTAL)
48			.SetInsets(B_USE_WINDOW_SPACING, B_USE_WINDOW_SPACING,
49				B_USE_WINDOW_SPACING, 0)
50			.Add(fSettingsView)
51			.End()
52		.Add(new BSeparatorView(B_HORIZONTAL))
53		.AddGroup(B_HORIZONTAL)
54			.Add(fDefaultsButton)
55			.Add(fRevertButton)
56			.AddGlue()
57			.End();
58
59	BSlider* slider = (BSlider*)FindView("key_repeat_rate");
60	if (slider != NULL)
61		slider->SetValue(fSettings.KeyboardRepeatRate());
62
63	slider = (BSlider*)FindView("delay_until_key_repeat");
64	if (slider != NULL)
65		slider->SetValue(fSettings.KeyboardRepeatDelay());
66
67	fDefaultsButton->SetEnabled(fSettings.IsDefaultable());
68}
69
70
71void
72InputKeyboard::MessageReceived(BMessage* message)
73{
74	BSlider* slider = NULL;
75
76	switch (message->what) {
77		case kMsgDefaults:
78		{
79			fSettings.Defaults();
80
81			slider = (BSlider*)FindView("key_repeat_rate");
82			if (slider != NULL)
83				slider->SetValue(fSettings.KeyboardRepeatRate());
84
85			slider = (BSlider*)FindView("delay_until_key_repeat");
86			if (slider != NULL)
87				slider->SetValue(fSettings.KeyboardRepeatDelay());
88
89			fDefaultsButton->SetEnabled(false);
90
91			fRevertButton->SetEnabled(true);
92			break;
93		}
94		case kMsgRevert:
95		{
96			fSettings.Revert();
97
98			slider = (BSlider*)FindView("key_repeat_rate");
99			if (slider != NULL)
100				slider->SetValue(fSettings.KeyboardRepeatRate());
101
102			slider = (BSlider*)FindView("delay_until_key_repeat");
103			if (slider != NULL)
104				slider->SetValue(fSettings.KeyboardRepeatDelay());
105
106			fDefaultsButton->SetEnabled(fSettings.IsDefaultable());
107
108			fRevertButton->SetEnabled(false);
109			break;
110		}
111		case kMsgSliderrepeatrate:
112		{
113			int32 rate;
114			if (message->FindInt32("be:value", &rate) != B_OK)
115				break;
116			fSettings.SetKeyboardRepeatRate(rate);
117
118			fDefaultsButton->SetEnabled(fSettings.IsDefaultable());
119
120			fRevertButton->SetEnabled(true);
121			break;
122		}
123		case kMsgSliderdelayrate:
124		{
125			int32 delay;
126			if (message->FindInt32("be:value", &delay) != B_OK)
127				break;
128
129			// We need to look at the value from the slider and make it "jump"
130			// to the next notch along. Setting the min and max values of the
131			// slider to 1 and 4 doesn't work like the real Keyboard app.
132			if (delay < 375000)
133				delay = 250000;
134			if (delay >= 375000 && delay < 625000)
135				delay = 500000;
136			if (delay >= 625000 && delay < 875000)
137				delay = 750000;
138			if (delay >= 875000)
139				delay = 1000000;
140
141			fSettings.SetKeyboardRepeatDelay(delay);
142
143			slider = (BSlider*)FindView("delay_until_key_repeat");
144			if (slider != NULL)
145				slider->SetValue(delay);
146
147			fDefaultsButton->SetEnabled(fSettings.IsDefaultable());
148
149			fRevertButton->SetEnabled(true);
150			break;
151		}
152		default:
153			BView::MessageReceived(message);
154	}
155}
156