From 81d626dcb156444849c33324d72fcaa6a22318c0 Mon Sep 17 00:00:00 2001 From: jon Date: Sun, 20 Mar 2011 00:03:35 +0000 Subject: [PATCH 1/1] Updated UI to be transparent, added colour to output text. --- lib-stock-home-widget.c | 124 +++++++++++++++++++++++++++++++++++++++-------- lib-stock-home-widget.h | 23 ++++----- 2 files changed, 112 insertions(+), 35 deletions(-) diff --git a/lib-stock-home-widget.c b/lib-stock-home-widget.c index 9f9e054..8f8d5cb 100644 --- a/lib-stock-home-widget.c +++ b/lib-stock-home-widget.c @@ -13,12 +13,11 @@ HD_DEFINE_PLUGIN_MODULE (StockPlugin, stock_plugin, HD_TYPE_HOME_PLUGIN_ITEM) static void -OnClickRefresh(GtkWidget *widget, StockPluginContext *psContext) +OnClickRefresh(GtkWidget *widget, GdkEventButton *event, StockPluginContext *psContext) { DebugOut(("OnClickRefresh")); /* Disable button while getting latest stocks */ - gtk_widget_set_sensitive(GTK_WIDGET(psContext->psButton),FALSE); { float fPrice; float fChange; @@ -27,6 +26,7 @@ OnClickRefresh(GtkWidget *widget, StockPluginContext *psContext) if(RetrieveStockPrice(psContext->hSG,psContext->psSettings->ppszTickers[0],&fPrice,NULL,&fChange) == SG_OK) { char szTime[80]; + char *pszColour = NULL; time_t rawtime; struct tm *timeinfo; @@ -34,11 +34,19 @@ OnClickRefresh(GtkWidget *widget, StockPluginContext *psContext) timeinfo = localtime(&rawtime); strftime(szTime,80,"(%I:%M%p)",timeinfo); + /* Highlight the change in price */ + if(fChange > 0.0f) + pszColour = "green"; + else + pszColour = "red"; + /* Update to latest price */ - sprintf(szBuffer,"%s %.2f %.2f%% %s",psContext->psSettings->ppszTickers[0],fPrice,fChange,szTime); + sprintf(szBuffer, + "%s %.2f %.2f%% %s", + psContext->psSettings->ppszTickers[0],fPrice,pszColour,fChange,szTime); - hildon_button_set_title(HILDON_BUTTON(psContext->psButton),szBuffer); - gtk_widget_queue_draw(GTK_WIDGET(psContext->psBox)); + gtk_label_set_markup(GTK_LABEL(psContext->psLabel),szBuffer); + gtk_widget_queue_draw(GTK_WIDGET(psContext->psLabel)); } /* If it fails, leave the old price as the user can see the timestamp @@ -49,7 +57,6 @@ OnClickRefresh(GtkWidget *widget, StockPluginContext *psContext) hildon_banner_show_information(GTK_WIDGET(widget),NULL,"Failed to retrieve stock information, check ticker symbol and try again."); } } - gtk_widget_set_sensitive(GTK_WIDGET(psContext->psButton),TRUE); } static gboolean @@ -67,7 +74,7 @@ UpdateStockOnTimeout(gpointer data) return FALSE; /* Update stock price */ - OnClickRefresh(GTK_WIDGET(psContext->psButton),psContext); + OnClickRefresh(GTK_WIDGET(psContext->psLabel),NULL,psContext); return TRUE; } @@ -231,7 +238,7 @@ stock_show_settings_dialog(GtkWidget* widget, gpointer data) } /* Force a refresh as the ticker changed */ - OnClickRefresh(GTK_WIDGET(psContext->psButton),psContext); + OnClickRefresh(GTK_WIDGET(psContext->psLabel),NULL,psContext); } uiUpdateSelection = hildon_touch_selector_get_active(HILDON_TOUCH_SELECTOR(timeselector),0); @@ -270,24 +277,28 @@ stock_show_settings_dialog(GtkWidget* widget, gpointer data) static GtkWidget *stock_create_gui(gchar *pszStockLabel, StockPluginContext *psContext) { - HildonButton *psButton = NULL; + GtkWidget *label; + GtkWidget *eventbox; DebugOut(("stock_create_gui")); - psButton = (HildonButton*)hildon_button_new_with_text (HILDON_SIZE_AUTO_WIDTH | HILDON_SIZE_FINGER_HEIGHT, - HILDON_BUTTON_ARRANGEMENT_VERTICAL, - pszStockLabel, - NULL); + label = gtk_label_new(pszStockLabel); + eventbox = gtk_event_box_new(); + + gtk_event_box_set_visible_window(GTK_EVENT_BOX(eventbox),FALSE); + gtk_container_set_border_width(GTK_CONTAINER(eventbox),3); - psContext->psButton = psButton; + gtk_container_add(GTK_CONTAINER(eventbox),label); - /* Setup button click signal for refreshing stocks */ - gtk_signal_connect (GTK_OBJECT(psButton),"clicked",GTK_SIGNAL_FUNC(OnClickRefresh),(gpointer)psContext); + g_signal_connect(GTK_CONTAINER(eventbox),"button-press-event",G_CALLBACK(OnClickRefresh),(gpointer)psContext); /* Display */ - gtk_widget_show_all(GTK_WIDGET(psButton)); + gtk_widget_show_all(GTK_WIDGET(eventbox)); + + psContext->psLabel = label; + psContext->psEventBox = eventbox; - return GTK_WIDGET(psButton); + return eventbox; } static void @@ -347,9 +358,9 @@ stock_plugin_init (StockPlugin *desktop_plugin) stock_read_settings(psContext->psSettings); /* Create GUI widget interface (and sets links in context) */ - psContext->psBox = stock_create_gui("Click to Update",psContext); - - gtk_container_add (GTK_CONTAINER (desktop_plugin), psContext->psBox); + stock_create_gui("Click to Update",psContext); + + gtk_container_add(GTK_CONTAINER(desktop_plugin), psContext->psEventBox); psContext->hSG = hSG; psContext->nTimerID = -1; @@ -379,8 +390,79 @@ stock_plugin_init (StockPlugin *desktop_plugin) } static void +stock_plugin_realize(GtkWidget* widget) +{ + GdkScreen *screen = gtk_widget_get_screen(widget); + gtk_widget_set_colormap(widget, gdk_screen_get_rgba_colormap(screen)); + gtk_widget_set_app_paintable(widget, TRUE); + GTK_WIDGET_CLASS(stock_plugin_parent_class)->realize(widget); +} + +void +cairo_rounded_rectangle(cairo_t *cr, + double x, + double y, + double width, + double height, + double corner_div) +{ + double aspect = 1.0; + double corner_radius = height / corner_div; + double radius = corner_radius / aspect; + double degrees = 3.14159265 / 180.0; + + cairo_new_sub_path (cr); + cairo_arc (cr, x + width - radius, y + radius, radius, -90 * degrees, 0 * degrees); + cairo_arc (cr, x + width - radius, y + height - radius, radius, 0 * degrees, 90 * degrees); + cairo_arc (cr, x + radius, y + height - radius, radius, 90 * degrees, 180 * degrees); + cairo_arc (cr, x + radius, y + radius, radius, 180 * degrees, 270 * degrees); + cairo_close_path (cr); + + cairo_set_source_rgba (cr, 1.0, 1.0, 1.0, 0.25); + cairo_fill_preserve (cr); + cairo_set_source_rgba (cr, 1.0, 1.0, 1.0, 1.0); + cairo_set_line_width (cr, 1.0); + cairo_stroke (cr); +} + +static gboolean +stock_plugin_expose(GtkWidget* widget, GdkEventExpose *event) +{ + PangoLayout* layout; + PangoFontDescription* desc; + cairo_t* cr; + int width = 0; + int height = 0; + + GdkRectangle *psRect; + + StockPluginContext *psContext = STOCK_HOME_PLUGIN(widget)->context; + + cr = gdk_cairo_create(GDK_DRAWABLE(widget->window)); + + psRect = &event->area; + + width = psRect->width; + height = psRect->height; + + DebugOut(("X: %d Y: %d Width: %d Height %d",psRect->x,psRect->y,psRect->width,psRect->height)); + + cairo_set_source_rgba (cr, 1.0, 1.0, 1.0, 0.5); + cairo_rounded_rectangle(cr, 0, 0, width, height, 10.0); + cairo_fill(cr); + + cairo_destroy(cr); + return GTK_WIDGET_CLASS(stock_plugin_parent_class)->expose_event(widget, event); +} + +static void stock_plugin_class_init (StockPluginClass *klass) { + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS(klass); + #if 1 + widget_class->realize = stock_plugin_realize; + widget_class->expose_event = stock_plugin_expose; + #endif G_OBJECT_CLASS(klass)->finalize = stock_plugin_finalize; } diff --git a/lib-stock-home-widget.h b/lib-stock-home-widget.h index ef8f87b..0c2fbf4 100644 --- a/lib-stock-home-widget.h +++ b/lib-stock-home-widget.h @@ -19,29 +19,23 @@ G_BEGIN_DECLS typedef struct _StockPlugin StockPlugin; typedef struct _StockPluginClass StockPluginClass; -#define STOCK_TYPE_HOME_PLUGIN (stock_home_plugin_get_type ()) +#define STOCK_TYPE_HOME_PLUGIN (stock_plugin_get_type ()) -#define STOCK_HOME_PLUGIN(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), \ - STOCK_TYPE_HOME_PLUGIN, StockPlugin)) +#define STOCK_HOME_PLUGIN(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), STOCK_TYPE_HOME_PLUGIN, StockPlugin)) -#define STOCK_HOME_PLUGIN_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), \ - STOCK_TYPE_HOME_PLUGIN, StockPluginClass)) +#define STOCK_HOME_PLUGIN_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), STOCK_TYPE_HOME_PLUGIN, StockPluginClass)) -#define STOCK_IS_HOME_PLUGIN(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), \ - STOCK_TYPE_HOME_PLUGIN)) +#define STOCK_IS_HOME_PLUGIN(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), STOCK_TYPE_HOME_PLUGIN)) -#define STOCK_IS_HOME_PLUGIN_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), \ - STOCK_TYPE_HOME_PLUGIN)) +#define STOCK_IS_HOME_PLUGIN_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), STOCK_TYPE_HOME_PLUGIN)) -#define STOCK_HOME_PLUGIN_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), \ - STOCK_TYPE_HOME_PLUGIN, StockPluginClass)) +#define STOCK_HOME_PLUGIN_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), STOCK_TYPE_HOME_PLUGIN, StockPluginClass)) typedef struct _StockPluginContext { /* Used for updating when stock price changes */ - HildonButton *psButton; - GtkWidget *psLabel; - GtkWidget *psBox; + GtkWidget *psLabel; + GtkWidget *psEventBox; /* Stock Getter Handle */ SGHandle hSG; @@ -66,6 +60,7 @@ struct _StockPluginClass }; GType stock_home_plugin_get_type(void); + G_END_DECLS #define DEBUG -- 1.7.9.5