xref: /haiku/src/preferences/input/InputMouse.cpp (revision 68d37cfb3a755a7270d772b505ee15c8b18aa5e0)
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 "InputMouse.h"
11 
12 #include <Application.h>
13 #include <Bitmap.h>
14 #include <Box.h>
15 #include <Button.h>
16 #include <Catalog.h>
17 #include <ControlLook.h>
18 #include <Debug.h>
19 #include <CheckBox.h>
20 #include <MenuField.h>
21 #include <MenuItem.h>
22 #include <PopUpMenu.h>
23 #include <LayoutBuilder.h>
24 #include <Locale.h>
25 #include <Slider.h>
26 #include <Screen.h>
27 #include <StringView.h>
28 #include <TabView.h>
29 
30 #include "InputConstants.h"
31 #include "InputWindow.h"
32 #include "MouseSettings.h"
33 #include "MouseView.h"
34 
35 
36 #undef B_TRANSLATION_CONTEXT
37 #define B_TRANSLATION_CONTEXT "InputMouse"
38 
39 
40 InputMouse::InputMouse(BInputDevice* dev, MouseSettings* settings)
41 	: BView("InputMouse", B_WILL_DRAW)
42 {
43 	fSettings = settings;
44 
45 	fSettingsView = new SettingsView(*fSettings);
46 
47 	fDefaultsButton = new BButton(B_TRANSLATE("Defaults"),
48 		new BMessage(kMsgDefaults));
49 	fDefaultsButton->SetEnabled(fSettings->IsDefaultable());
50 
51 	fRevertButton = new BButton(B_TRANSLATE("Revert"),
52 		new BMessage(kMsgRevert));
53 	fRevertButton->SetEnabled(false);
54 
55 	BLayoutBuilder::Group<>(this, B_VERTICAL, B_USE_DEFAULT_SPACING)
56 		.Add(fSettingsView)
57 			.Add(new BSeparatorView(B_HORIZONTAL))
58 				.AddGroup(B_HORIZONTAL)
59 				.Add(fDefaultsButton)
60 				.Add(fRevertButton)
61 				.AddGlue()
62 				.End()
63 		.End();
64 }
65 
66 InputMouse::~InputMouse()
67 {
68 }
69 
70 void
71 InputMouse::MessageReceived(BMessage* message)
72 {
73 	switch (message->what) {
74 		case kMsgDefaults: {
75 			fSettings->Defaults();
76 			fSettingsView->UpdateFromSettings();
77 
78 			fDefaultsButton->SetEnabled(false);
79 			fRevertButton->SetEnabled(fSettings->IsRevertable());
80 			break;
81 		}
82 
83 		case kMsgRevert: {
84 			fSettings->Revert();
85 			fSettingsView->UpdateFromSettings();
86 
87 			fDefaultsButton->SetEnabled(fSettings->IsDefaultable());
88 			fRevertButton->SetEnabled(false);
89 			break;
90 
91 		}
92 
93 		case kMsgMouseType:
94 		{
95 			int32 type;
96 			if (message->FindInt32("be:value", &type) == B_OK) {
97 				if (type > 6)
98 					debugger("Mouse type is invalid");
99 				fSettings->SetMouseType(type);
100 				fSettingsView->SetMouseType(type);
101 				fDefaultsButton->SetEnabled(fSettings->IsDefaultable());
102 				fRevertButton->SetEnabled(fSettings->IsRevertable());
103 			}
104 			break;
105 		}
106 
107 		case kMsgMouseFocusMode:
108 		{
109 			int32 mode;
110 			if (message->FindInt32("mode", &mode) == B_OK) {
111 				fSettings->SetMouseMode((mode_mouse)mode);
112 				fDefaultsButton->SetEnabled(fSettings->IsDefaultable());
113 				fRevertButton->SetEnabled(fSettings->IsRevertable());
114 				fSettingsView->fFocusFollowsMouseMenu->SetEnabled(
115 					mode == B_FOCUS_FOLLOWS_MOUSE);
116 				fSettingsView->fAcceptFirstClickBox->SetEnabled(
117 					mode != B_FOCUS_FOLLOWS_MOUSE);
118 			}
119 			break;
120 		}
121 
122 		case kMsgFollowsMouseMode:
123 		{
124 			int32 mode;
125 			if (message->FindInt32("mode_focus_follows_mouse", &mode)
126 				== B_OK) {
127 				fSettings->SetFocusFollowsMouseMode(
128 					(mode_focus_follows_mouse)mode);
129 				fDefaultsButton->SetEnabled(fSettings->IsDefaultable());
130 				fRevertButton->SetEnabled(fSettings->IsRevertable());
131 			}
132 			break;
133 		}
134 
135 		case kMsgAcceptFirstClick:
136 		{
137 			BHandler *handler;
138 			if (message->FindPointer("source",
139 				reinterpret_cast<void**>(&handler)) == B_OK) {
140 				bool acceptFirstClick = true;
141 				BCheckBox *acceptFirstClickBox =
142 					dynamic_cast<BCheckBox*>(handler);
143 				if (acceptFirstClickBox)
144 					acceptFirstClick = acceptFirstClickBox->Value()
145 						== B_CONTROL_ON;
146 				fSettings->SetAcceptFirstClick(acceptFirstClick);
147 				fDefaultsButton->SetEnabled(fSettings->IsDefaultable());
148 				fRevertButton->SetEnabled(fSettings->IsRevertable());
149 			}
150 			break;
151 		}
152 
153 		case kMsgDoubleClickSpeed:
154 		{
155 			int32 value;
156 			if (message->FindInt32("be:value", &value) == B_OK) {
157 				// slow = 1000000, fast = 0
158 				fSettings->SetClickSpeed(value * 1000);
159 				fDefaultsButton->SetEnabled(fSettings->IsDefaultable());
160 				fRevertButton->SetEnabled(fSettings->IsRevertable());
161 			}
162 			break;
163 		}
164 
165 		case kMsgMouseSpeed:
166 		{
167 			int32 value;
168 			if (message->FindInt32("be:value", &value) == B_OK) {
169 				// slow = 8192, fast = 524287
170 				fSettings->SetMouseSpeed((int32)pow(2,
171 					value * 6.0 / 1000) * 8192);
172 				fDefaultsButton->SetEnabled(fSettings->IsDefaultable());
173 				fRevertButton->SetEnabled(fSettings->IsRevertable());
174 			}
175 			break;
176 		}
177 
178 		case kMsgAccelerationFactor:
179 		{
180 			int32 value;
181 			if (message->FindInt32("be:value", &value) == B_OK) {
182 				// slow = 0, fast = 262144
183 				fSettings->SetAccelerationFactor((int32)pow(
184 					value * 4.0 / 1000, 2) * 16384);
185 				fDefaultsButton->SetEnabled(fSettings->IsDefaultable());
186 				fRevertButton->SetEnabled(fSettings->IsRevertable());
187 			}
188 			break;
189 		}
190 
191 		case kMsgMouseMap:
192 		{
193 			int32 index;
194 			int32 button;
195 			if (message->FindInt32("index", &index) == B_OK
196 				&& message->FindInt32("button", &button) == B_OK) {
197 				int32 mapping = B_MOUSE_BUTTON(index + 1);
198 				fSettings->SetMapping(button, mapping);
199 				fDefaultsButton->SetEnabled(fSettings->IsDefaultable());
200 				fRevertButton->SetEnabled(fSettings->IsRevertable());
201 				fSettingsView->MouseMapUpdated();
202 			}
203 			break;
204 		}
205 
206 		default:
207 			BView::MessageReceived(message);
208 	}
209 }
210