libxputty 0.1
Loading...
Searching...
No Matches
xslider_private.c
Go to the documentation of this file.
1/*
2 * 0BSD
3 *
4 * BSD Zero Clause License
5 *
6 * Copyright (c) 2019 Hermann Meyer
7 *
8 * Permission to use, copy, modify, and/or distribute this software for any
9 * purpose with or without fee is hereby granted.
10
11 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
12 * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
13 * AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
14 * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
15 * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
16 * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17 * PERFORMANCE OF THIS SOFTWARE.
18 *
19 */
20
21
22#include "xslider_private.h"
23
24
25void _pattern_vslider(Widget_t *w, Color_state st, int width) {
26 Colors *c = get_color_scheme(w,st);
27 if (!c) return;
28 cairo_pattern_t *pat = cairo_pattern_create_linear (2, 2, width, 2);
29 cairo_pattern_add_color_stop_rgba(pat, 0.0, c->base[0], c->base[1], c->base[2], c->base[3]);
30 cairo_pattern_add_color_stop_rgba(pat, 0.5, 0.0, 0.0, 0.0, 0.0);
31 cairo_pattern_add_color_stop_rgba(pat, 1.0, c->base[0], c->base[1], c->base[2], c->base[3]);
32 cairo_set_source(w->crb, pat);
33 cairo_pattern_destroy (pat);
34}
35
36void _pattern_hslider(Widget_t *w, Color_state st, int height) {
37 Colors *c = get_color_scheme(w,st);
38 if (!c) return;
39 cairo_pattern_t *pat = cairo_pattern_create_linear (2, 2, 2, height);
40 cairo_pattern_add_color_stop_rgba(pat, 0.0, c->base[0], c->base[1], c->base[2], c->base[3]);
41 cairo_pattern_add_color_stop_rgba(pat, 0.5, 0.0, 0.0, 0.0, 0.0);
42 cairo_pattern_add_color_stop_rgba(pat, 1.0, c->base[0], c->base[1], c->base[2], c->base[3]);
43 cairo_set_source(w->crb, pat);
44 cairo_pattern_destroy (pat);
45}
46
47void _draw_image_slider(Widget_t *w, int width_t, int height_t) {
48 Slider_t *slider = (Slider_t*)w->private_struct;
49 int width, height;
50 os_get_surface_size(w->image, &width, &height);
51 int size = width/slider->frames;
52 double x = (double)width_t/(double)size;
53 double y = (double)height_t/(double)height;
54 double x1 = (double)size/(double)width_t;
55 double y1 = (double)height/(double)height_t;
56 double s = x>y ? y : x;
57 double s1 = x1>y1 ? y1 : x1;
58 int posx = (width_t/2 -(size*s)/2);
59 int posy = (height_t/2 - ((height*s)/2));
60 double sliderstate = adj_get_state(w->adj);
61 int findex = (int)(((slider->frames)-1) * sliderstate);
62 cairo_save(w->crb);
63 cairo_scale(w->crb, s,s);
64 cairo_translate(w->crb, posx * ((1-s)/s), posy * ((1-s)/s));
65 cairo_set_source_surface (w->crb, w->image, -size*findex + posx, posy);
66 cairo_rectangle(w->crb, posx, posy, size, height);
67 cairo_fill(w->crb);
68 cairo_scale(w->crb, s1,s1);
69 cairo_restore(w->crb);
70}
71
72void _draw_vslider(void *w_, void* user_data) {
73 Widget_t *w = (Widget_t*)w_;
74 Metrics_t metrics;
75 os_get_window_metrics(w, &metrics);
76 int width = metrics.width-2;
77 int height = metrics.height-2;
78 if (!metrics.visible) return;
79 float center = (float)width/2;
80 float upcenter = (float)width;
81
82 if (w->image) {
83 _draw_image_slider(w, width, height-10);
84 } else {
85 float sliderstate = adj_get_state(w->adj_y);
87 cairo_move_to (w->crb, center, center);
88 cairo_line_to(w->crb,center,height-center-10);
89 cairo_set_line_cap (w->crb,CAIRO_LINE_CAP_ROUND);
90 cairo_set_line_width(w->crb,center);
91 cairo_stroke(w->crb);
92
94 cairo_move_to (w->crb, center, center);
95 cairo_line_to(w->crb,center,height-center-10);
96 cairo_set_line_width(w->crb,center/10);
97 cairo_stroke(w->crb);
98
100 cairo_arc(w->crb,center, (height-center-10) -
101 ((height-10-upcenter) * sliderstate), center/2, 0, 2 * M_PI );
102 cairo_fill_preserve(w->crb);
103 cairo_set_line_width(w->crb,1);
104 cairo_stroke(w->crb);
105
106
108 cairo_arc(w->crb,center, (height-center-10) -
109 ((height-10-upcenter) * sliderstate), center/3, 0, 2 * M_PI );
110 cairo_fill_preserve(w->crb);
112 cairo_set_line_width(w->crb,center/15);
113 cairo_stroke(w->crb);
114 cairo_new_path (w->crb);
115 }
116
117 cairo_text_extents_t extents;
119 cairo_set_font_size (w->crb, min(w->app->normal_font/w->scale.ascale, center/1.8));
120 cairo_text_extents(w->crb,w->label , &extents);
121
122 cairo_move_to (w->crb, center-extents.width/2, height);
123 cairo_show_text(w->crb, w->label);
124 cairo_new_path (w->crb);
125
126 char s[64];
127 const char* format[] = {"%.1f", "%.2f", "%.3f"};
128 float value = adj_get_value(w->adj);
129 if (fabs(w->adj->step)>0.99) {
130 snprintf(s, 63,"%d", (int) value);
131 } else if (fabs(w->adj->step)>0.09) {
132 snprintf(s, 63, format[1-1], value);
133 } else {
134 snprintf(s, 63, format[2-1], value);
135 }
136 cairo_set_font_size (w->crb, min(w->app->small_font/w->scale.ascale, center/1.8));
137 cairo_text_extents(w->crb,s , &extents);
138 cairo_move_to (w->crb, center-extents.width/2, extents.height );
139 cairo_show_text(w->crb, s);
140 cairo_new_path (w->crb);
141}
142
143void _draw_hslider(void *w_, void* user_data) {
144 Widget_t *w = (Widget_t*)w_;
145 Metrics_t metrics;
146 os_get_window_metrics(w, &metrics);
147 int width = metrics.width-2;
148 int height = metrics.height-2;
149 if (!metrics.visible) return;
150 float center = (float)height/2;
151 float upcenter = (float)height;
152
153 if (w->image) {
154 _draw_image_slider(w, width, height);
155 } else {
156 float sliderstate = adj_get_state(w->adj_x);
157 _pattern_hslider(w, get_color_state(w), height);
158 cairo_move_to (w->crb, center, center);
159 cairo_line_to(w->crb,width-center-10,center);
160 cairo_set_line_cap (w->crb,CAIRO_LINE_CAP_ROUND);
161 cairo_set_line_width(w->crb,center);
162 cairo_stroke(w->crb);
163
165 cairo_move_to (w->crb, center, center);
166 cairo_line_to(w->crb,width-center-10,center);
167 cairo_set_line_width(w->crb,center/10);
168 cairo_stroke(w->crb);
169
171 cairo_arc(w->crb, (center) +
172 ((width-10-upcenter) * sliderstate),center, center/2, 0, 2 * M_PI );
173 cairo_fill_preserve(w->crb);
174 cairo_set_line_width(w->crb,1);
175 cairo_stroke(w->crb);
176
178 cairo_arc(w->crb, (center) +
179 ((width-10-upcenter) * sliderstate),center, center/3, 0, 2 * M_PI );
180 cairo_fill_preserve(w->crb);
182 cairo_set_line_width(w->crb,center/15);
183 cairo_stroke(w->crb);
184 cairo_new_path (w->crb);
185 }
186 cairo_text_extents_t extents;
188 cairo_set_font_size (w->crb, w->app->normal_font/w->scale.ascale);
189 cairo_text_extents(w->crb,w->label , &extents);
190
191 cairo_move_to (w->crb, width/2-extents.width/2, height );
192 cairo_show_text(w->crb, w->label);
193 cairo_new_path (w->crb);
194
195 cairo_set_font_size (w->crb, w->app->small_font/w->scale.ascale);
196 char s[64];
197 const char* format[] = {"%.1f", "%.2f", "%.3f"};
198 float value = adj_get_value(w->adj);
199 if (fabs(w->adj->step)>0.99) {
200 snprintf(s, 63,"%d", (int) value);
201 } else if (fabs(w->adj->step)>0.09) {
202 snprintf(s, 63, format[1-1], value);
203 } else {
204 snprintf(s, 63, format[2-1], value);
205 }
206 cairo_text_extents(w->crb,s , &extents);
207 cairo_move_to (w->crb, width/2-extents.width/2, extents.height );
208 cairo_show_text(w->crb, s);
209 cairo_new_path (w->crb);
210}
211
212void _slider_released(void *w_, void* button_, void* user_data) {
213 Widget_t *w = (Widget_t*)w_;
214 expose_widget(w);
215}
Color_t - struct used to set cairo color for Widget_t.
Definition xcolor.h:85
double base[4]
Definition xcolor.h:88
Metrics_t - struct to receive window size, position & visibility Pass this struct to os_get_window_...
float ascale
Definition xwidget.h:369
int frames
Definition xslider.h:33
Widget_t - struct to hold the basic Widget_t info.
Definition xwidget.h:457
Resize_t scale
Definition xwidget.h:525
Adjustment_t * adj_y
Definition xwidget.h:495
Adjustment_t * adj_x
Definition xwidget.h:493
cairo_surface_t * image
Definition xwidget.h:491
Adjustment_t * adj
Definition xwidget.h:497
cairo_t * crb
Definition xwidget.h:489
void * private_struct
Definition xwidget.h:475
const char * label
Definition xwidget.h:463
Xputty * app
Definition xwidget.h:465
int normal_font
Definition xputty.h:248
int small_font
Definition xputty.h:246
float adj_get_value(Adjustment_t *adj)
adj_get_value - get the current value of the Adjustment_t
float adj_get_state(Adjustment_t *adj)
adj_get_state - get the current state of the Adjustment_t
Color_state get_color_state(Widget_t *wid)
get_color_state - get the Color_state to use in relation to the Widget_t state
Definition xcolor.c:222
void use_text_color_scheme(Widget_t *w, Color_state st)
use_text_color_scheme - use text Colors to paint on Widget_t
Definition xcolor.c:266
void use_bg_color_scheme(Widget_t *w, Color_state st)
use_bg_color_scheme - use background Colors to paint on Widget_t
Definition xcolor.c:252
void use_fg_color_scheme(Widget_t *w, Color_state st)
use_fg_color_scheme - use forground Colors to paint on Widget_t
Definition xcolor.c:245
Colors * get_color_scheme(Widget_t *wid, Color_state st)
get_color_scheme - get pointer to the Colors struct to use in relation to the Color_state
Definition xcolor.c:197
void use_shadow_color_scheme(Widget_t *w, Color_state st)
use_shadow_color_scheme - use shadow Colors to paint on Widget_t
Definition xcolor.c:273
Color_state
Color_state - select color mode to use on Widget_t.
Definition xcolor.h:43
@ NORMAL_
Definition xcolor.h:44
void _slider_released(void *w_, void *button_, void *user_data)
_slider_released - redraw the slider when button released
void _draw_hslider(void *w_, void *user_data)
_draw_hslider - internal draw the slider to the buffer
void _pattern_hslider(Widget_t *w, Color_state st, int height)
_pattern_hslider - set pattern for the slider base
void _draw_vslider(void *w_, void *user_data)
_draw_vslider - internal draw the slider to the buffer
void _draw_image_slider(Widget_t *w, int width_t, int height_t)
_draw_image_slider - draw slider from a horizontal sprite image
void _pattern_vslider(Widget_t *w, Color_state st, int width)
_pattern_vslider - set pattern for the slider base
void os_get_window_metrics(Widget_t *w, Metrics_t *metrics)
os_get_window_metrics - Get the Merics_t struct related to a Widget_t
void os_get_surface_size(cairo_surface_t *surface, int *width, int *height)
os_get_surface_size - get the size of the cairo surface
void expose_widget(Widget_t *w)
expose_widgets - send a expose event (EXPOSE) to a Widget_t
Definition xwidget.c:445