From 0a7576b8a8d2fc462bf80f2e3baaee0b08c9fea5 Mon Sep 17 00:00:00 2001 From: Jonathan Parr Date: Sun, 20 Mar 2011 20:57:55 +0000 Subject: [PATCH] Added a graphical image representing increase/decrease in price. --- Makefile | 3 ++ StockPluginDecrease.png | Bin 0 -> 1008 bytes StockPluginIncrease.png | Bin 0 -> 1025 bytes lib-stock-home-widget.c | 71 +++++++++++++++++++++++++++++++++++++++++------ lib-stock-home-widget.h | 11 ++++++++ lib-stock-settings.h | 12 ++++---- 6 files changed, 83 insertions(+), 14 deletions(-) create mode 100644 StockPluginDecrease.png create mode 100644 StockPluginIncrease.png diff --git a/Makefile b/Makefile index 709015a..8aa1eb4 100644 --- a/Makefile +++ b/Makefile @@ -9,6 +9,7 @@ all: stock-home-widget SOURCES=lib-stock-home-widget.c lib-stock-settings.c stockgetter.c TARGET =lib-stock-home-widget.so DESKTOP=stock-home-widget.desktop +RESOURCES=StockPluginIncrease.png StockPluginDecrease.png lib-stock-home-widget.c : lib-stock-home-widget.h stockgetter.c : stockgetter.h @@ -25,3 +26,5 @@ clobber: install: @cp -f $(TARGET) `pkg-config libhildondesktop-1 --variable=hildondesktoplibdir`/. @cp -f $(DESKTOP) `pkg-config libhildondesktop-1 --variable=hildonhomedesktopentrydir`/. + @cp -f $(RESOURCES) /etc/hildon/theme/images/. + diff --git a/StockPluginDecrease.png b/StockPluginDecrease.png new file mode 100644 index 0000000000000000000000000000000000000000..256653a3e759d86e3f968a87d6f9d9eebcb41c46 GIT binary patch literal 1008 zcmVPx#24YJ`L;wH)0002_L%V+f000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2ipS_ z6e(Vpc1000?uMObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HM@dakSAh-}0009^NklI4t;Hx1E9(OvH~-Za!f$XF+9MU>|p|$ zF9seiXdQ6K1ojmIZ6?rU5{nR+^ZJFr0F1!+4q}pr31~hW_{$66K?vOCs}cxCV9g{v z$t!sNeSU!9MuC51e1M^#$n)R~C z33wq2oP^MEV=uI}2TBJ-k$({BA9MDP5?_NYey})ZGItv)xB?~n(NvM0I0%7~ zC6bv+&qizRl|(Qj+#*wmoJ<8J5I0mQ;9bScLfOrs;>ewpMNR1>E*UbIW?y7aCb^qg z09x%+jqdyLaNQT`7hMLNgiOi2uVnlkmQJ=NUt7C&R-#_^#6E+LqD0&P+|@#NYa_9< ztCA`T?X!6yB*M=C&BB|VftUK>*2(|>TYu%fAP%)!-!ArhmWU#I$-WG@#bT|jb;Sw> z;9$u@ZMG2-I{TxLndLgyu!22IHr0~(yPJ=<;aSFTv1Rpw*&_%e&2p+twjjf2$@g0! zFv;{Aq%2BgvLxpq2Z+glNAm)=SHCyu(Mv+r(6izMq+l#nYBiC@hDx+k(ISfuri4Z* z&sE*90q!SX2iJGj$~Z27Pgasaa3U}T0qrXe));|g>ga*QJ4MfdPGV36#tc4eWbTXi z_MU%~{OCaHM8S6cYX6k9KU_#G6#^>%RQdQA zt?jmyIRAIK|2+Huu+jGc=KJ~}N)`FH_P`*SU%|h?*ce{>+6v!1lb9;CPZa|C@wruo e^Cw7-1Mm$tw=o`8C}h$A0000Px#24YJ`L;wH)0002_L%V+f000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2ipS_ z6e=6i*YZ37000?uMObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HM@dakSAh-}000AANkl)SqXb-Ft;7`ei&Z?pcs{+}1U%A{^@)NkT zb#3NJAR6n&fp-#`50?*Zc!r@Q;3%qSY2FQ76{-W&(d3U}^$wYKCo#JWO?Y~Glf*qorvL0gYs(%!Ok_Nqdmgjdos!^~<|F z6>yeAro^_C-bvzLNK8`qvvc6CMB)zc?CQ68oJvw<$YEVq3xV0S-&Dvr5--n~1|I!+ zTQIwJI=RMjvJ5JNhi^s&@FMS{?Bx}i%Tc_6=2gCOfQ&nRzkoMDmEjcr?FC~QKr}3l z$V~|pkK6E+J38>-X10sDg9C+<6C;8w` zkYpxQHLmZb;+2exoNnQ22{I76XY~Kx)+q# zU(&$x)0@$0=T=m#@)r|3_aE-`)LckuAph!aXhdpJpxL>cY6yH7rtdDO-x6@S;crDp v1n$7?=tBBm1oYFLw`n-|97qF?-|Y1l+dS<2`f|b=00000NkvXXu0mjfJTuiz literal 0 HcmV?d00001 diff --git a/lib-stock-home-widget.c b/lib-stock-home-widget.c index 14a2b81..13891cf 100644 --- a/lib-stock-home-widget.c +++ b/lib-stock-home-widget.c @@ -13,22 +13,40 @@ HD_DEFINE_PLUGIN_MODULE (StockPlugin, stock_plugin, HD_TYPE_HOME_PLUGIN_ITEM) static void +OnClickUpdate(GtkWidget *widget, GdkEventButton *event, StockPluginContext *psContext) +{ + char szBuffer[1024]; + + DebugOut(("OnClickUpdate")); + + sprintf(szBuffer,"Retrieving %s...",psContext->psSettings->ppszTickers[0]); + + /* Hide the stock arrow when we're updating */ + psContext->bArrowActive = FALSE; + gtk_widget_hide(GTK_WIDGET(psContext->psArrow)); + + gtk_label_set_markup(GTK_LABEL(psContext->psLabel),szBuffer); + gtk_widget_queue_draw(GTK_WIDGET(psContext->psParent)); +} + +static void OnClickRefresh(GtkWidget *widget, GdkEventButton *event, StockPluginContext *psContext) { DebugOut(("OnClickRefresh")); /* Disable button while getting latest stocks */ { + char szBuffer[1024]; float fPrice; float fChange; - char szBuffer[1024]; 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; + char szTime[80]; + int nImageSel; time(&rawtime); timeinfo = localtime(&rawtime); @@ -36,9 +54,23 @@ OnClickRefresh(GtkWidget *widget, GdkEventButton *event, StockPluginContext *psC /* Highlight the change in price */ if(fChange > 0.0f) + { + nImageSel = STOCK_IMAGE_INCREASE; pszColour = "green"; + } else + { + nImageSel = STOCK_IMAGE_DECREASE; pszColour = "red"; + } + + gtk_image_set_from_pixbuf(GTK_IMAGE(psContext->psArrow),psContext->asStockImage[nImageSel]); + + if(!psContext->bArrowActive) + { + gtk_widget_show(psContext->psArrow); + psContext->bArrowActive = TRUE; + } /* Update to latest price */ sprintf(szBuffer, @@ -54,7 +86,8 @@ OnClickRefresh(GtkWidget *widget, GdkEventButton *event, StockPluginContext *psC */ else { - hildon_banner_show_information(GTK_WIDGET(widget),NULL,"Failed to retrieve stock information, check ticker symbol and try again."); + gtk_label_set_markup(GTK_LABEL(psContext->psLabel),"Failed: Check ticker and try again."); + gtk_widget_queue_draw(GTK_WIDGET(psContext->psParent)); } } } @@ -277,25 +310,39 @@ stock_show_settings_dialog(GtkWidget* widget, gpointer data) static GtkWidget *stock_create_gui(gchar *pszStockLabel, StockPluginContext *psContext) { + GtkWidget *hbox; + GtkWidget *arrow; GtkWidget *label; GtkWidget *eventbox; DebugOut(("stock_create_gui")); + + psContext->asStockImage[STOCK_IMAGE_INCREASE] = gdk_pixbuf_new_from_file(STOCK_PLUGIN_RESOURCE_UP_ARROW, NULL); + psContext->asStockImage[STOCK_IMAGE_DECREASE] = gdk_pixbuf_new_from_file(STOCK_PLUGIN_RESOURCE_DOWN_ARROW, NULL); label = gtk_label_new(pszStockLabel); eventbox = gtk_event_box_new(); + arrow = gtk_image_new_from_pixbuf(psContext->asStockImage[0]); + hbox = gtk_hbox_new(FALSE,5); gtk_event_box_set_visible_window(GTK_EVENT_BOX(eventbox),FALSE); gtk_container_set_border_width(GTK_CONTAINER(eventbox),10); - gtk_container_add(GTK_CONTAINER(eventbox),label); + gtk_box_pack_start(GTK_BOX(hbox), arrow, FALSE, FALSE, 0); + gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); + + gtk_container_add(GTK_CONTAINER(eventbox),hbox); - g_signal_connect(GTK_CONTAINER(eventbox),"button-press-event",G_CALLBACK(OnClickRefresh),(gpointer)psContext); + g_signal_connect(GTK_CONTAINER(eventbox),"button-press-event",G_CALLBACK(OnClickUpdate),(gpointer)psContext); + g_signal_connect(GTK_CONTAINER(eventbox),"button-release-event",G_CALLBACK(OnClickRefresh),(gpointer)psContext); - /* Display */ - gtk_widget_show_all(GTK_WIDGET(eventbox)); + /* Display all but the arrow */ + gtk_widget_show_all(eventbox); + gtk_widget_hide(arrow); + psContext->bArrowActive = FALSE; - psContext->psLabel = label; + psContext->psArrow = arrow; + psContext->psLabel = label; psContext->psEventBox = eventbox; return eventbox; @@ -325,6 +372,12 @@ stock_plugin_finalize (GObject *object) psContext->nTimerID = -1; } + if(psContext->asStockImage[STOCK_IMAGE_DECREASE] != NULL) + g_object_unref(psContext->asStockImage[STOCK_IMAGE_DECREASE]); + + if(psContext->asStockImage[STOCK_IMAGE_INCREASE] != NULL) + g_object_unref(psContext->asStockImage[STOCK_IMAGE_INCREASE]); + if(psContext->hSG) FreeStockGetter(psContext->hSG); @@ -359,7 +412,7 @@ stock_plugin_init (StockPlugin *desktop_plugin) /* Create GUI widget interface (and sets links in context) */ stock_create_gui("Click to Update",psContext); - + gtk_container_add(GTK_CONTAINER(desktop_plugin), psContext->psEventBox); psContext->hSG = hSG; diff --git a/lib-stock-home-widget.h b/lib-stock-home-widget.h index 1f48194..0a6935e 100644 --- a/lib-stock-home-widget.h +++ b/lib-stock-home-widget.h @@ -9,6 +9,7 @@ /* Standard includes */ #include #include +#include /* Custom includes */ #include "stockgetter.h" @@ -35,9 +36,16 @@ typedef struct _StockPluginContext { /* Used for updating when stock price changes */ GtkWidget *psLabel; + GtkWidget *psArrow; GtkWidget *psEventBox; GtkWidget *psParent; + /* Arrow active */ + gboolean bArrowActive; + + /* PixBuf of stock images */ + GdkPixbuf *asStockImage[2]; + /* Stock Getter Handle */ SGHandle hSG; @@ -64,6 +72,9 @@ GType stock_home_plugin_get_type(void); G_END_DECLS +#define STOCK_IMAGE_INCREASE 0 +#define STOCK_IMAGE_DECREASE 1 + #define DEBUG /* Debug print only */ diff --git a/lib-stock-settings.h b/lib-stock-settings.h index 02683e9..72e9efc 100644 --- a/lib-stock-settings.h +++ b/lib-stock-settings.h @@ -8,11 +8,13 @@ #include /* Configuration file entries */ -#define STOCK_PLUGIN_APPLET_ID "stockwidget" -#define STOCK_PLUGIN_TICKERS "tickers" -#define STOCK_PLUGIN_UPDATE_TIME "updatetime" -#define STOCK_PLUGIN_SETTINGS_FILE "/stockwidget.config" -#define STOCK_PLUGIN_DEFAULT_TICKER "IMG.L" +#define STOCK_PLUGIN_APPLET_ID "stockwidget" +#define STOCK_PLUGIN_TICKERS "tickers" +#define STOCK_PLUGIN_UPDATE_TIME "updatetime" +#define STOCK_PLUGIN_SETTINGS_FILE "/stockwidget.config" +#define STOCK_PLUGIN_DEFAULT_TICKER "IMG.L" +#define STOCK_PLUGIN_RESOURCE_UP_ARROW "/etc/hildon/theme/images/StockPluginIncrease.png" +#define STOCK_PLUGIN_RESOURCE_DOWN_ARROW "/etc/hildon/theme/images/StockPluginDecrease.png" /* * Struct used for holding settings stored out and loaded -- 1.7.9.5