Mouse over effects

This commit is contained in:
o9000
2015-11-04 01:32:13 +01:00
parent fe06ff5075
commit 294fdee57f
21 changed files with 2529 additions and 2136 deletions

View File

@@ -71,6 +71,8 @@
*
************************************************************/
Area *mouse_over_area = NULL;
void init_rendering(void *obj, int pos)
{
Area *a = (Area*)obj;
@@ -443,69 +445,44 @@ void draw (Area *a)
void draw_background (Area *a, cairo_t *c)
{
if (a->bg->back.alpha > 0.0) {
if (a->bg->back.alpha > 0.0 ||
(panel_config.mouse_effects && a->mouse_effects && a->mouse_state == MOUSE_OVER)) {
//printf(" draw_background (%d %d) RGBA (%lf, %lf, %lf, %lf)\n", a->posx, a->posy, pix->back.color[0], pix->back.color[1], pix->back.color[2], pix->back.alpha);
if (a->mouse_state == MOUSE_OVER) {
cairo_set_source_rgba(c, a->bg->back_hover.color[0], a->bg->back_hover.color[1], a->bg->back_hover.color[2], a->bg->back_hover.alpha);
} else
cairo_set_source_rgba(c, a->bg->back.color[0], a->bg->back.color[1], a->bg->back.color[2], a->bg->back.alpha);
draw_rect(c, a->bg->border.width, a->bg->border.width, a->width-(2.0 * a->bg->border.width), a->height-(2.0*a->bg->border.width), a->bg->border.rounded - a->bg->border.width/1.571);
cairo_set_source_rgba(c, a->bg->back.color[0], a->bg->back.color[1], a->bg->back.color[2], a->bg->back.alpha);
cairo_fill(c);
}
if (a->bg->border.width > 0 && a->bg->border.alpha > 0.0) {
if (a->bg->border.width > 0) {
cairo_set_line_width (c, a->bg->border.width);
// draw border inside (x, y, width, height)
if (a->mouse_state == MOUSE_OVER) {
cairo_set_source_rgba(c, a->bg->border_hover.color[0], a->bg->border_hover.color[1], a->bg->border_hover.color[2], a->bg->border_hover.alpha);
} else
cairo_set_source_rgba(c, a->bg->border.color[0], a->bg->border.color[1], a->bg->border.color[2], a->bg->border.alpha);
draw_rect(c, a->bg->border.width/2.0, a->bg->border.width/2.0, a->width - a->bg->border.width, a->height - a->bg->border.width, a->bg->border.rounded);
/*
// convert : radian = degre * M_PI/180
// definir le degrade dans un carre de (0,0) (100,100)
// ensuite ce degrade est extrapoler selon le ratio width/height
// dans repere (0, 0) (100, 100)
double X0, Y0, X1, Y1, degre;
// x = X * (a->width / 100), y = Y * (a->height / 100)
double x0, y0, x1, y1;
X0 = 0;
Y0 = 100;
X1 = 100;
Y1 = 0;
degre = 45;
// et ensuite faire la changement d'unite du repere
// car ce qui doit reste inchangee est les traits et pas la direction
// il faut d'abord appliquer une rotation de 90 (et -180 si l'angle est superieur a 180)
// ceci peut etre applique une fois pour toute au depart
// ensuite calculer l'angle dans le nouveau repare
// puis faire une rotation de 90
x0 = X0 * ((double)a->width / 100);
x1 = X1 * ((double)a->width / 100);
y0 = Y0 * ((double)a->height / 100);
y1 = Y1 * ((double)a->height / 100);
x0 = X0 * ((double)a->height / 100);
x1 = X1 * ((double)a->height / 100);
y0 = Y0 * ((double)a->width / 100);
y1 = Y1 * ((double)a->width / 100);
cairo_pattern_t *linpat;
linpat = cairo_pattern_create_linear (x0, y0, x1, y1);
cairo_pattern_add_color_stop_rgba (linpat, 0, a->border.color[0], a->border.color[1], a->border.color[2], a->border.alpha);
cairo_pattern_add_color_stop_rgba (linpat, 1, a->border.color[0], a->border.color[1], a->border.color[2], 0);
cairo_set_source (c, linpat);
*/
cairo_set_source_rgba (c, a->bg->border.color[0], a->bg->border.color[1], a->bg->border.color[2], a->bg->border.alpha);
cairo_stroke (c);
//cairo_pattern_destroy (linpat);
cairo_stroke(c);
}
}
void remove_area (Area *a)
void remove_area (void *a)
{
Area *parent = (Area*)a->parent;
Area *area = (Area*)a;
Area *parent = (Area*)area->parent;
parent->list = g_list_remove(parent->list, a);
parent->list = g_list_remove(parent->list, area);
parent->resize = 1;
set_redraw (parent);
if (mouse_over_area == a) {
mouse_over_area = NULL;
}
}
@@ -536,6 +513,9 @@ void free_area (Area *a)
XFreePixmap (server.dsp, a->pix);
a->pix = 0;
}
if (mouse_over_area == a) {
mouse_over_area = NULL;
}
}
@@ -566,3 +546,40 @@ void clear_pixmap(Pixmap p, int x, int y, int w, int h)
XRenderFillRectangle(server.dsp, PictOpSrc, pict, &col, x, y, w, h);
XRenderFreePicture(server.dsp, pict);
}
void mouse_over(Area *area)
{
if (mouse_over_area == area)
return;
mouse_out();
if (!area->mouse_effects)
return;
mouse_over_area = area;
mouse_over_area->mouse_state = MOUSE_OVER;
set_redraw(mouse_over_area);
panel_refresh = 1;
}
void mouse_out()
{
if (!mouse_over_area)
return;
mouse_over_area->mouse_state = MOUSE_NORMAL;
set_redraw(mouse_over_area);
panel_refresh = 1;
mouse_over_area = NULL;
}
void init_background(Background *bg)
{
memset(bg, 0, sizeof(Background));
bg->back_hover.color[0] = 0.8;
bg->back_hover.color[1] = 0.8;
bg->back_hover.color[2] = 0.8;
bg->back_hover.alpha = 0.3;
bg->border_hover.color[0] = 0.8;
bg->border_hover.color[1] = 0.8;
bg->border_hover.color[2] = 0.8;
bg->border_hover.alpha = 0.5;
}

View File

@@ -44,6 +44,8 @@ typedef struct
{
Color back;
Border border;
Color back_hover;
Color border_hover;
} Background;
@@ -53,6 +55,12 @@ typedef struct
enum { SIZE_BY_LAYOUT, SIZE_BY_CONTENT };
enum { ALIGN_LEFT = 0, ALIGN_CENTER = 1, ALIGN_RIGHT = 2 };
typedef enum {
MOUSE_NORMAL = 0,
MOUSE_OVER = 1
} MouseState;
typedef struct {
// coordinate relative to panel window
int posx, posy;
@@ -83,6 +91,9 @@ typedef struct {
// panel
void *panel;
int mouse_effects;
MouseState mouse_state;
// each object can overwrite following function
void (*_draw_foreground)(void *obj, cairo_t *c);
// update area's content and update size (width/heith).
@@ -95,6 +106,8 @@ typedef struct {
char* (*_get_tooltip_text)(void *obj);
} Area;
void init_background(Background *bg);
// on startup, initialize fixed pos/size
void init_rendering(void *obj, int pos);
@@ -118,7 +131,7 @@ void show(Area *a);
void draw (Area *a);
void draw_background (Area *a, cairo_t *c);
void remove_area (Area *a);
void remove_area (void *a);
void add_area (Area *a);
void free_area (Area *a);
@@ -127,5 +140,9 @@ void draw_rect(cairo_t *c, double x, double y, double w, double h, double r);
// clear pixmap with transparent color
void clear_pixmap(Pixmap p, int x, int y, int w, int h);
void mouse_over(Area *area);
void mouse_out();
#endif