xref: /haiku/src/servers/app/stackandtile/SATDecorator.cpp (revision e705c841d784f0035a0ef3e9e96f6e017df16681)
1 /*
2  * Copyright 2010-2015, Haiku, Inc.
3  * Distributed under the terms of the MIT License.
4  *
5  * Authors:
6  *		Clemens Zeidler <haiku@clemens-zeidler.de>
7  *		Ingo Weinhold <ingo_weinhold@gmx.de>
8  */
9 
10 
11 #include "SATDecorator.h"
12 
13 #include <new>
14 
15 #include <GradientLinear.h>
16 #include <WindowPrivate.h>
17 
18 #include "DrawingEngine.h"
19 #include "SATWindow.h"
20 
21 
22 //#define DEBUG_SATDECORATOR
23 #ifdef DEBUG_SATDECORATOR
24 #	define STRACE(x) debug_printf x
25 #else
26 #	define STRACE(x) ;
27 #endif
28 
29 
30 static const rgb_color kFrameColors[4] = {
31 	{ 152, 152, 152, 255 },
32 	{ 240, 240, 240, 255 },
33 	{ 152, 152, 152, 255 },
34 	{ 108, 108, 108, 255 }
35 };
36 
37 static const rgb_color kHighlightFrameColors[6] = {
38 	{ 52, 52, 52, 255 },
39 	{ 140, 140, 140, 255 },
40 	{ 124, 124, 124, 255 },
41 	{ 108, 108, 108, 255 },
42 	{ 52, 52, 52, 255 },
43 	{ 8, 8, 8, 255 }
44 };
45 
46 SATDecorator::SATDecorator(DesktopSettings& settings, BRect frame,
47 							Desktop* desktop)
48 	:
49 	DefaultDecorator(settings, frame, desktop)
50 {
51 }
52 
53 
54 void
55 SATDecorator::UpdateColors(DesktopSettings& settings)
56 {
57 	DefaultDecorator::UpdateColors(settings);
58 
59 	// Called during construction, and during any changes
60 	fHighlightTabColor		= tint_color(fFocusTabColor, B_DARKEN_2_TINT);
61 	fHighlightTabColorLight	= tint_color(fHighlightTabColor,
62 								(B_LIGHTEN_MAX_TINT + B_LIGHTEN_2_TINT) / 2);
63 	fHighlightTabColorBevel	= tint_color(fHighlightTabColor, B_LIGHTEN_2_TINT);
64 	fHighlightTabColorShadow= tint_color(fHighlightTabColor,
65 								(B_DARKEN_1_TINT + B_NO_TINT) / 2);
66 }
67 
68 
69 void
70 SATDecorator::GetComponentColors(Component component, uint8 highlight,
71 	ComponentColors _colors, Decorator::Tab* _tab)
72 {
73 	DefaultDecorator::Tab* tab = static_cast<DefaultDecorator::Tab*>(_tab);
74 
75 	// Get the standard colors from the DefaultDecorator
76 	DefaultDecorator::GetComponentColors(component, highlight, _colors, tab);
77 
78 	// Now we need to make some changes if the Stack and tile highlight is used
79 	if (highlight != HIGHLIGHT_STACK_AND_TILE)
80 		return;
81 
82 	if (tab && tab->isHighlighted == false
83 		&& (component == COMPONENT_TAB || component == COMPONENT_CLOSE_BUTTON
84 			|| component == COMPONENT_ZOOM_BUTTON)) {
85 		return;
86 	}
87 
88 	switch (component) {
89 		case COMPONENT_TAB:
90 			_colors[COLOR_TAB_FRAME_LIGHT] = kFrameColors[0];
91 			_colors[COLOR_TAB_FRAME_DARK] = kFrameColors[3];
92 			_colors[COLOR_TAB] = fHighlightTabColor;
93 			_colors[COLOR_TAB_LIGHT] = fHighlightTabColorLight;
94 			_colors[COLOR_TAB_BEVEL] = fHighlightTabColorBevel;
95 			_colors[COLOR_TAB_SHADOW] = fHighlightTabColorShadow;
96 			_colors[COLOR_TAB_TEXT] = fFocusTextColor;
97 			break;
98 
99 		case COMPONENT_CLOSE_BUTTON:
100 		case COMPONENT_ZOOM_BUTTON:
101 			_colors[COLOR_BUTTON] = fHighlightTabColor;
102 			_colors[COLOR_BUTTON_LIGHT] = fHighlightTabColorLight;
103 			break;
104 
105 		case COMPONENT_LEFT_BORDER:
106 		case COMPONENT_RIGHT_BORDER:
107 		case COMPONENT_TOP_BORDER:
108 		case COMPONENT_BOTTOM_BORDER:
109 		case COMPONENT_RESIZE_CORNER:
110 		default:
111 			_colors[0] = kHighlightFrameColors[0];
112 			_colors[1] = kHighlightFrameColors[1];
113 			_colors[2] = kHighlightFrameColors[2];
114 			_colors[3] = kHighlightFrameColors[3];
115 			_colors[4] = kHighlightFrameColors[4];
116 			_colors[5] = kHighlightFrameColors[5];
117 			break;
118 	}
119 }
120 
121 
122 SATWindowBehaviour::SATWindowBehaviour(Window* window, StackAndTile* sat)
123 	:
124 	DefaultWindowBehaviour(window),
125 
126 	fStackAndTile(sat)
127 {
128 }
129 
130 
131 bool
132 SATWindowBehaviour::AlterDeltaForSnap(Window* window, BPoint& delta,
133 	bigtime_t now)
134 {
135 	if (DefaultWindowBehaviour::AlterDeltaForSnap(window, delta, now) == true)
136 		return true;
137 
138 	SATWindow* satWindow = fStackAndTile->GetSATWindow(window);
139 	if (satWindow == NULL)
140 		return false;
141 	SATGroup* group = satWindow->GetGroup();
142 	if (group == NULL)
143 		return false;
144 
145 	BRect groupFrame = group->WindowAt(0)->CompleteWindowFrame();
146 	for (int32 i = 1; i < group->CountItems(); i++)
147 		groupFrame = groupFrame | group->WindowAt(i)->CompleteWindowFrame();
148 
149 	return fMagneticBorder.AlterDeltaForSnap(window->Screen(),
150 		groupFrame, delta, now);
151 }
152