← Back to team overview

ayatana-commits team mailing list archive

[Merge] lp:~cjcurran/indicator-sound/button-press into lp:indicator-sound

 

Conor Curran has proposed merging lp:~cjcurran/indicator-sound/button-press into lp:indicator-sound.

Requested reviews:
  Indicator Applet Developers (indicator-applet-developers)


- Backgrounds for the play/pause, skip and previous change colour on button press. 
- Some tidying of consts using typedef enums
-- 
https://code.launchpad.net/~cjcurran/indicator-sound/button-press/+merge/30012
Your team ayatana-commits is subscribed to branch lp:indicator-sound.
=== modified file 'src/play-button.c'
--- src/play-button.c	2010-07-12 13:46:13 +0000
+++ src/play-button.c	2010-07-15 14:59:39 +0000
@@ -53,22 +53,23 @@
 #define PAUSE_X 77.0f
 #define	PAUSE_Y 15.0f
 
-// Transport events
-enum {
-	PREVIOUS,
-	PLAY_PAUSE,
-	NEXT
+
+// Transport updates
+enum{
+	PAUSE,
+	PLAY
 };
 
 typedef struct _PlayButtonPrivate PlayButtonPrivate;
 
 struct _PlayButtonPrivate
 {
-	GdkColor 	background_colour_fg;
-	GdkColor 	background_colour_bg_dark;
-	GdkColor 	background_colour_bg_light;
-	GdkColor 	foreground_colour_fg;
-	GdkColor 	foreground_colour_bg;
+	GdkColor 				background_colour_fg;
+	GdkColor 				background_colour_bg_dark;
+	GdkColor 				background_colour_bg_light;
+	GdkColor 				foreground_colour_fg;
+	GdkColor 				foreground_colour_bg;
+	PlayButtonEvent current_command;
 };
 
 #define PLAY_BUTTON_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), PLAY_BUTTON_TYPE, PlayButtonPrivate))
@@ -324,6 +325,8 @@
 static void
 play_button_init (PlayButton *self)
 {
+	PlayButtonPrivate* priv = PLAY_BUTTON_GET_PRIVATE(self);	
+	priv->current_command	= TRANSPORT_NADA;
 	gtk_widget_set_size_request(GTK_WIDGET(self), 200, 80); 
 }
 
@@ -356,28 +359,72 @@
 }
 
 
-gint
+PlayButtonEvent
 determine_button_event(GtkWidget* button, GdkEventButton* event)
 {
 	g_debug("event x coordinate = %f", event->x);
 	g_debug("event y coordinate = %f", event->y);
-	gint result = 0;
+	PlayButtonEvent button_event = TRANSPORT_NADA;
 	// For now very simple rectangular collision detection
 	if(event->x > 55 && event->x < 95
 	   && event->y > 22 && event->y < 46){
-		result = PREVIOUS;
+		button_event = TRANSPORT_PREVIOUS;
 	}
 	else if(event->x > 101 && event->x < 133
 	   && event->y > 20 && event->y < 47){
-		result = PLAY_PAUSE;		
+		button_event = TRANSPORT_PLAY_PAUSE;	
 	}
 	else if(event->x > 137 && event->x < 179
 	   && event->y > 22 && event->y < 46){
-		result = NEXT;		
-	}
-	
-	return result;
-}
+		button_event = TRANSPORT_NEXT;
+	}	
+	return button_event;
+}
+
+void 
+play_button_react_to_button_press(GtkWidget* button, PlayButtonEvent command)
+{
+	g_return_if_fail(IS_PLAY_BUTTON(button));
+	PlayButtonPrivate* priv = PLAY_BUTTON_GET_PRIVATE(button);
+	priv->current_command = command;
+	
+	cairo_t *cr;
+	cr = gdk_cairo_create (button->window);
+
+
+	/*cairo_rectangle (cr,
+                   event->area.x, event->area.y,
+                   event->area.width, event->area.height);
+
+	cairo_clip(cr);*/
+	draw (button, cr);
+	cairo_destroy (cr);
+}
+
+
+void 
+play_button_react_to_button_release(GtkWidget* button)
+{
+	g_return_if_fail(IS_PLAY_BUTTON(button));
+	PlayButtonPrivate* priv = PLAY_BUTTON_GET_PRIVATE(button);	
+	priv->current_command = TRANSPORT_NADA;
+	cairo_t *cr;
+	cr = gdk_cairo_create (button->window);
+	/*cairo_rectangle (cr,
+                   event->area.x, event->area.y,
+                   event->area.width, event->area.height);
+
+	cairo_clip(cr);*/
+	draw (button, cr);
+	cairo_destroy (cr);
+	
+}    
+
+void 
+play_button_toggle_play_pause(GtkWidget* button, int update)
+{
+}
+
 
 void
 play_button_set_style(GtkWidget* button, GtkStyle* style)
@@ -615,6 +662,9 @@
 static void
 draw (GtkWidget* button, cairo_t *cr)
 {
+	g_return_if_fail(IS_PLAY_BUTTON(button));
+	PlayButtonPrivate* priv = PLAY_BUTTON_GET_PRIVATE(button);	
+
 	cairo_surface_t*  surf = NULL;
 	cairo_t*       cr_surf = NULL;
 
@@ -627,7 +677,8 @@
 	double BUTTON_START[] = {252.0f / 255.0f, 251.0f / 255.0f, 251.0f / 255.0f,1.0f};
 	double BUTTON_END[] = {186.0f / 255.0f,180.0f / 255.0f, 170.0f / 255.0f, 1.0f};
 	double BUTTON_SHADOW[] = {0.0f / 255.0f, 0.0f / 255.0f, 0.0f / 255.0f, 0.75f};
-	
+	double INNER_COMPRESSED_END[] = {61.0f / 255.0f, 60.0f / 255.0f, 57.0f / 255.0f, 1.0f};
+	double INNER_COMPRESSED_START[] = {36.0f / 255.0f, 35.0f / 255.0f, 33.0f / 255.0f, 1.0f};
 	
 	// prev/next-background
   draw_gradient (cr,
@@ -644,13 +695,32 @@
                  MIDDLE_RADIUS,
                  MIDDLE_START,
                  MIDDLE_END);
-  draw_gradient (cr,
-                 X,
-                 Y + 2,
-                 RECT_WIDTH - 4,
-                 INNER_RADIUS,
-                 INNER_START,
-                 INNER_END);
+	draw_gradient (cr,
+               X,
+               Y + 2,
+               RECT_WIDTH - 4,
+               INNER_RADIUS,
+               INNER_START,
+               INNER_END);
+
+	if(priv->current_command == TRANSPORT_PREVIOUS){
+		draw_gradient (cr,
+		               X,
+		               Y + 2,
+		               RECT_WIDTH/2,
+		               INNER_RADIUS,
+		               INNER_COMPRESSED_START,
+		               INNER_COMPRESSED_END);
+	}	
+	else if(priv->current_command == TRANSPORT_NEXT){
+		draw_gradient (cr,
+		               RECT_WIDTH / 2 + X,
+		               Y + 2,
+		               (RECT_WIDTH - 7)/2,
+		               INNER_RADIUS,
+		               INNER_COMPRESSED_START,
+		               INNER_COMPRESSED_END);		
+	}
 
 	// play/pause-background
         draw_circle (cr,
@@ -670,7 +740,16 @@
                      Y - ((CIRCLE_RADIUS - OUTER_RADIUS)) + 2.0f,
                      CIRCLE_RADIUS - 2.0f,
                      INNER_START,
-		     INNER_END);
+		     						 INNER_END);
+				if(priv->current_command == TRANSPORT_PLAY_PAUSE){
+		      draw_circle (cr,
+		                   X + RECT_WIDTH / 2.0f - 2.0f * OUTER_RADIUS - 4.5f + 2.0f,
+		                   Y - ((CIRCLE_RADIUS - OUTER_RADIUS)) + 2.0f,
+		                   CIRCLE_RADIUS - 2.0f,
+		               		 INNER_COMPRESSED_START,
+		                   INNER_COMPRESSED_END);
+				}
+					
 
 	// draw previous-button drop-shadow
 	_setup (&cr_surf, &surf, PREV_WIDTH, PREV_HEIGHT);
@@ -700,13 +779,13 @@
 		    TRI_HEIGHT,
 		    TRI_OFFSET);
 	_fill (cr_surf,
-	       (PREV_WIDTH - (2.0f * TRI_WIDTH - TRI_OFFSET)) / 2.0f,
-	       (PREV_HEIGHT - TRI_HEIGHT) / 2.0f,
-	       (PREV_WIDTH - (2.0f * TRI_WIDTH - TRI_OFFSET)) / 2.0f,
-	       (double) TRI_HEIGHT,
-	       BUTTON_START,
-	       BUTTON_END,
-	       FALSE);
+		     (PREV_WIDTH - (2.0f * TRI_WIDTH - TRI_OFFSET)) / 2.0f,
+		     (PREV_HEIGHT - TRI_HEIGHT) / 2.0f,
+		     (PREV_WIDTH - (2.0f * TRI_WIDTH - TRI_OFFSET)) / 2.0f,
+		     (double) TRI_HEIGHT,
+		     BUTTON_START,
+		     BUTTON_END,
+		     FALSE);		
 	_finalize (cr, &cr_surf, &surf, PREV_X, PREV_Y);
 
 	// draw next-button drop-shadow
@@ -791,8 +870,7 @@
 **/
 GtkWidget* 
 play_button_new()
-{
-	
+{	
 	GtkWidget* widget =	g_object_new(PLAY_BUTTON_TYPE, NULL);
 	gtk_widget_set_app_paintable (widget, TRUE);	
 	return widget;

=== modified file 'src/play-button.h'
--- src/play-button.h	2010-07-08 15:12:59 +0000
+++ src/play-button.h	2010-07-15 14:59:39 +0000
@@ -33,6 +33,13 @@
 typedef struct _PlayButton      PlayButton;
 typedef struct _PlayButtonClass PlayButtonClass;
 
+typedef enum {
+	TRANSPORT_PREVIOUS,
+	TRANSPORT_PLAY_PAUSE,
+	TRANSPORT_NEXT,
+	TRANSPORT_NADA
+}PlayButtonEvent;
+
 struct _PlayButtonClass {
 	  GtkDrawingAreaClass parent_class;
 };
@@ -43,7 +50,10 @@
 
 GType play_button_get_type (void);
 void play_button_set_style(GtkWidget* button, GtkStyle* style);
-gint determine_button_event(GtkWidget* button, GdkEventButton* event);
+PlayButtonEvent determine_button_event(GtkWidget* button, GdkEventButton* event);
+void play_button_react_to_button_press(GtkWidget* button,  PlayButtonEvent command);
+void play_button_react_to_button_release(GtkWidget* button);
+void play_button_toggle_play_pause(GtkWidget* button, int update);
 
 GtkWidget* play_button_new();
 

=== modified file 'src/transport-widget.c'
--- src/transport-widget.c	2010-07-12 13:46:13 +0000
+++ src/transport-widget.c	2010-07-15 14:59:39 +0000
@@ -137,9 +137,7 @@
 transport_widget_button_press_event (GtkWidget *menuitem, 
                                   	GdkEventButton *event)
 {
-	if(IS_TRANSPORT_WIDGET(menuitem) == FALSE){
-		return FALSE;
-	}
+	g_return_val_if_fail(IS_TRANSPORT_WIDGET(menuitem), FALSE);
 
 	TransportWidgetPrivate * priv = TRANSPORT_WIDGET_GET_PRIVATE(TRANSPORT_WIDGET(menuitem));
 
@@ -147,14 +145,16 @@
 
   parent = gtk_widget_get_parent (GTK_WIDGET (menuitem));
 
-	gint result = determine_button_event(priv->play_button, event);
+	PlayButtonEvent result = determine_button_event(priv->play_button, event);
 
- 	GValue value = {0};
-  g_value_init(&value, G_TYPE_INT);
-	g_debug("TransportWidget::menu_press_event - going to send value %i", result);
-	g_value_set_int(&value, result);	
-	dbusmenu_menuitem_handle_event (priv->twin_item, "Transport state change", &value, 0);
-	
+	if(result != TRANSPORT_NADA){
+	 	GValue value = {0};
+		g_value_init(&value, G_TYPE_INT);
+		g_debug("TransportWidget::menu_press_event - going to send value %i", (int)result);
+		g_value_set_int(&value, (int)result);	
+		dbusmenu_menuitem_handle_event (priv->twin_item, "Transport state change", &value, 0);
+		play_button_react_to_button_press(priv->play_button, result);
+	}	
 	return TRUE;
 }
 
@@ -164,9 +164,9 @@
                                   GdkEventButton *event)
 {
 	g_debug("TransportWidget::menu_release_event");
-	if(IS_TRANSPORT_WIDGET(menuitem) == FALSE){
-		return FALSE;
-	}
+	g_return_val_if_fail(IS_TRANSPORT_WIDGET(menuitem), FALSE);
+	TransportWidgetPrivate * priv = TRANSPORT_WIDGET_GET_PRIVATE(TRANSPORT_WIDGET(menuitem));	
+  play_button_react_to_button_release(priv->play_button);
 	
 	return TRUE;
 }
@@ -180,12 +180,13 @@
                                  GValue* value, gpointer userdata)
 {
 	g_debug("transport_widget_update_state - with property  %s", property);  
-	//int update_value = g_value_get_int(value);
-	//g_debug("transport_widget_update_state - with value  %i", update_value);  
-
-	//TransportWidget* bar = (TransportWidget*)userdata;
-	//TransportWidgetPrivate *priv = TRANSPORT_WIDGET_GET_PRIVATE(bar);
+	TransportWidget* bar = (TransportWidget*)userdata;
+	g_return_if_fail(IS_TRANSPORT_WIDGET(bar));
 	
+	TransportWidgetPrivate *priv = TRANSPORT_WIDGET_GET_PRIVATE(bar);
+	int update_value = g_value_get_int(value);
+	g_debug("transport_widget_update_state - with value  %i", update_value);  
+	play_button_toggle_play_pause(priv->play_button, update_value);
 }
 
  /**


Follow ups