/* HomeBank -- Free, easy, personal accounting for everyone.
- * Copyright (C) 1995-2018 Maxime DOYEN
+ * Copyright (C) 1995-2019 Maxime DOYEN
*
* This file is part of HomeBank.
*
#include "homebank.h"
#include "gtk-chart-colors.h"
-#include "gtk-chart-stack.h"
+#include "gtk-chart-progress.h"
#define MYDEBUG 0
/* --- prototypes --- */
-static void ui_chart_stack_class_init (ChartStackClass *klass);
-static void ui_chart_stack_init (ChartStack *chart);
-static void ui_chart_stack_destroy (GtkWidget *chart);
-/*static void ui_chart_stack_set_property (GObject *object,
+static void ui_chart_progress_class_init (ChartProgressClass *klass);
+static void ui_chart_progress_init (ChartProgress *chart);
+static void ui_chart_progress_destroy (GtkWidget *chart);
+/*static void ui_chart_progress_set_property (GObject *object,
guint prop_id,
const GValue *value,
GParamSpec *pspec);*/
static gboolean drawarea_draw_callback(GtkWidget *widget, cairo_t *cr, gpointer user_data);
static gboolean drawarea_scroll_event_callback( GtkWidget *widget, GdkEventScroll *event, gpointer user_data);
static gboolean drawarea_motionnotifyevent_callback(GtkWidget *widget, GdkEventMotion *event, gpointer user_data);
-static void ui_chart_stack_first_changed( GtkAdjustment *adj, gpointer user_data);
+static void ui_chart_progress_first_changed( GtkAdjustment *adj, gpointer user_data);
-static void ui_chart_stack_clear(ChartStack *chart, gboolean store);
+static void ui_chart_progress_clear(ChartProgress *chart, gboolean store);
static gboolean drawarea_full_redraw(GtkWidget *widget, gpointer user_data);
-static void ui_chart_stack_queue_redraw(ChartStack *chart);
+static void ui_chart_progress_queue_redraw(ChartProgress *chart);
/* --- variables --- */
static GtkBoxClass *parent_class = NULL;
/* --- functions --- */
-GType ui_chart_stack_get_type ()
+GType ui_chart_progress_get_type ()
{
-static GType ui_chart_stack_type = 0;
+static GType ui_chart_progress_type = 0;
- if (G_UNLIKELY(ui_chart_stack_type == 0))
+ if (G_UNLIKELY(ui_chart_progress_type == 0))
{
- const GTypeInfo ui_chart_stack_info =
+ const GTypeInfo ui_chart_progress_info =
{
- sizeof (ChartStackClass),
+ sizeof (ChartProgressClass),
NULL, /* base_init */
NULL, /* base_finalize */
- (GClassInitFunc) ui_chart_stack_class_init,
+ (GClassInitFunc) ui_chart_progress_class_init,
NULL, /* class_finalize */
NULL, /* class_init */
- sizeof (ChartStack),
+ sizeof (ChartProgress),
0, /* n_preallocs */
- (GInstanceInitFunc) ui_chart_stack_init,
+ (GInstanceInitFunc) ui_chart_progress_init,
NULL /* value_table */
};
- ui_chart_stack_type = g_type_register_static (GTK_TYPE_BOX, "ChartStack",
- &ui_chart_stack_info, 0);
+ ui_chart_progress_type = g_type_register_static (GTK_TYPE_BOX, "ChartProgress",
+ &ui_chart_progress_info, 0);
}
- return ui_chart_stack_type;
+ return ui_chart_progress_type;
}
-static void ui_chart_stack_class_init (ChartStackClass * class)
+static void ui_chart_progress_class_init (ChartProgressClass * class)
{
//GObjectClass *gobject_class;
GtkWidgetClass *widget_class;
parent_class = g_type_class_peek_parent (class);
- //gobject_class->dispose = ui_chart_stack_dispose;
- //gobject_class->finalize = ui_chart_stack_finalize;
- //gobject_class->set_property = ui_chart_stack_set_property;
- //gobject_class->get_property = ui_chart_stack_get_property;
+ //gobject_class->dispose = ui_chart_progress_dispose;
+ //gobject_class->finalize = ui_chart_progress_finalize;
+ //gobject_class->set_property = ui_chart_progress_set_property;
+ //gobject_class->get_property = ui_chart_progress_get_property;
- widget_class->destroy = ui_chart_stack_destroy;
+ widget_class->destroy = ui_chart_progress_destroy;
}
static void
-ui_chart_stack_init (ChartStack * chart)
+ui_chart_progress_init (ChartProgress * chart)
{
GtkWidget *widget, *hbox, *frame;
chart->budget_title = "Budget";
chart->result_title = "Result";
- chart->barw = GTK_CHARTSTACK_BARW;
- ui_chart_stack_set_color_scheme(chart, CHART_COLMAP_HOMEBANK);
+ chart->barw = GTK_CHARTPROGRESS_BARW;
+ ui_chart_progress_set_color_scheme(chart, CHART_COLMAP_HOMEBANK);
widget=GTK_WIDGET(chart);
g_signal_connect( G_OBJECT(chart->drawarea), "motion-notify-event", G_CALLBACK(drawarea_motionnotifyevent_callback), chart );
#endif
- g_signal_connect (G_OBJECT(chart->adjustment), "value-changed", G_CALLBACK (ui_chart_stack_first_changed), chart);
+ g_signal_connect (G_OBJECT(chart->adjustment), "value-changed", G_CALLBACK (ui_chart_progress_first_changed), chart);
/*
- g_signal_connect( G_OBJECT(chart->drawarea), "leave-notify-event", G_CALLBACK(ui_chart_stack_leave), chart );
- g_signal_connect( G_OBJECT(chart->drawarea), "enter-notify-event", G_CALLBACK(ui_chart_stack_enter), chart );
- g_signal_connect( G_OBJECT(chart->drawarea), "button-press-event", G_CALLBACK(ui_chart_stack_button_press), chart );
- g_signal_connect( G_OBJECT(chart->drawarea), "button-release-event", G_CALLBACK(ui_chart_stack_button_release), chart );
+ g_signal_connect( G_OBJECT(chart->drawarea), "leave-notify-event", G_CALLBACK(ui_chart_progress_leave), chart );
+ g_signal_connect( G_OBJECT(chart->drawarea), "enter-notify-event", G_CALLBACK(ui_chart_progress_enter), chart );
+ g_signal_connect( G_OBJECT(chart->drawarea), "button-press-event", G_CALLBACK(ui_chart_progress_button_press), chart );
+ g_signal_connect( G_OBJECT(chart->drawarea), "button-release-event", G_CALLBACK(ui_chart_progress_button_release), chart );
*/
GtkWidget *
-ui_chart_stack_new (void)
+ui_chart_progress_new (void)
{
GtkWidget *chart;
- chart = (GtkWidget *)g_object_new (GTK_TYPE_CHARTSTACK, NULL);
+ chart = (GtkWidget *)g_object_new (GTK_TYPE_CHARTPROGRESS, NULL);
return chart;
}
void
-ui_chart_stack_destroy (GtkWidget * object)
+ui_chart_progress_destroy (GtkWidget * object)
{
-ChartStack *chart = GTK_CHARTSTACK(object);
+ChartProgress *chart = GTK_CHARTPROGRESS(object);
- g_return_if_fail (GTK_IS_CHARTSTACK (object));
+ g_return_if_fail (GTK_IS_CHARTPROGRESS (object));
- ui_chart_stack_clear(GTK_CHARTSTACK (object), FALSE);
+ ui_chart_progress_clear(GTK_CHARTPROGRESS (object), FALSE);
if(chart->pfd)
{
/*
** print a integer number
*/
-static gchar *ui_chart_stack_print_int(ChartStack *chart, gdouble value)
+static gchar *ui_chart_progress_print_int(ChartProgress *chart, gdouble value)
{
hb_strfmon(chart->buffer, CHART_BUFFER_LENGTH-1, value, chart->kcur, chart->minor);
}
-static void ui_chart_stack_clear(ChartStack *chart, gboolean store)
+static void ui_chart_progress_clear(ChartProgress *chart, gboolean store)
{
gint i;
}
-static void ui_chart_stack_setup_with_model(ChartStack *chart, GtkTreeModel *list_store, gchar *coltitle1, gchar *coltitle2)
+static void ui_chart_progress_setup_with_model(ChartProgress *chart, GtkTreeModel *list_store, gchar *coltitle1, gchar *coltitle2)
{
guint i;
gboolean valid;
DB( g_print("\n[chartstack] setup with model\n") );
- ui_chart_stack_clear(chart, TRUE);
+ ui_chart_progress_clear(chart, TRUE);
chart->nb_items = gtk_tree_model_iter_n_children(GTK_TREE_MODEL(list_store), NULL);
g_array_append_vals(chart->items, &item, 1);
-
//don't g_free(label); here done into chart_clear
//don't g_free(status); here done into chart_clear
}
-static void ui_chart_stack_set_font_size(ChartStack *chart, gint font_size)
+static void ui_chart_progress_set_font_size(ChartProgress *chart, gint font_size)
{
gint size = 10;
-static void ui_chart_stack_calculation(ChartStack *chart)
+static void ui_chart_progress_calculation(ChartProgress *chart)
{
GtkWidget *drawarea = chart->drawarea;
cairo_surface_t *surf;
if(chart->title)
{
//pango_font_description_set_size(chart->pfd, CHART_FONT_SIZE_TITLE * PANGO_SCALE);
- ui_chart_stack_set_font_size(chart, CHART_FONT_SIZE_TITLE);
+ ui_chart_progress_set_font_size(chart, CHART_FONT_SIZE_TITLE);
pango_layout_set_font_description (layout, chart->pfd);
pango_layout_set_text (layout, chart->title, -1);
if(chart->subtitle)
{
//pango_font_description_set_size(chart->pfd, CHART_FONT_SIZE_PERIOD * PANGO_SCALE);
- ui_chart_stack_set_font_size(chart, CHART_FONT_SIZE_SUBTITLE);
+ ui_chart_progress_set_font_size(chart, CHART_FONT_SIZE_SUBTITLE);
pango_layout_set_font_description (layout, chart->pfd);
pango_layout_set_text (layout, chart->subtitle, -1);
// compute other text
//pango_font_description_set_size(chart->pfd, CHART_FONT_SIZE_NORMAL * PANGO_SCALE);
- ui_chart_stack_set_font_size(chart, CHART_FONT_SIZE_NORMAL);
+ ui_chart_progress_set_font_size(chart, CHART_FONT_SIZE_NORMAL);
pango_layout_set_font_description (layout, chart->pfd);
double title_w = 0;
chart->rel_col_w += CHART_SPACING;
// compute budget/result width
- valstr = ui_chart_stack_print_int(chart, -maxbudget);
+ valstr = ui_chart_progress_print_int(chart, -maxbudget);
pango_layout_set_text (layout, valstr, -1);
pango_layout_get_size (layout, &tw, &th);
chart->bud_col_w = (tw / PANGO_SCALE);
DB( g_print(" - budget-col: w=%f, %.2f, '%s'\n", chart->bud_col_w, maxbudget, valstr) );
- valstr = ui_chart_stack_print_int(chart, -maxresult);
+ valstr = ui_chart_progress_print_int(chart, -maxresult);
pango_layout_set_text (layout, valstr, -1);
pango_layout_get_size (layout, &tw, &th);
chart->res_col_w = (tw / PANGO_SCALE);
blkw = chart->barw + floor(chart->barw * 0.2);
chart->blkw = blkw;
- chart->visible = MIN( 1 + (chart->graph_height / blkw), chart->nb_items);
+ chart->visible = (chart->graph_height - chart->t) / blkw;
+ chart->visible = MIN(chart->visible, chart->nb_items);
g_object_unref (layout);
#if (DBGDRAW_RECT + DBGDRAW_TEXT + DBGDRAW_ITEM) > 0
-static void ui_chart_stack_draw_help(GtkWidget *widget, gpointer user_data)
+static void ui_chart_progress_draw_help(GtkWidget *widget, gpointer user_data)
{
-ChartStack *chart = GTK_CHARTSTACK(user_data);
+ChartProgress *chart = GTK_CHARTPROGRESS(user_data);
cairo_t *cr;
double x, y, y2;
gint first = 0;
/*
** draw all visible bars
*/
-static void ui_chart_stack_draw_bars(ChartStack *chart, cairo_t *cr)
+static void ui_chart_progress_draw_bars(ChartProgress *chart, cairo_t *cr)
{
double x, y, x2, y2, h;
gint first;
if(chart->title)
{
//pango_font_description_set_size(chart->pfd, CHART_FONT_SIZE_TITLE * PANGO_SCALE);
- ui_chart_stack_set_font_size(chart, CHART_FONT_SIZE_TITLE);
+ ui_chart_progress_set_font_size(chart, CHART_FONT_SIZE_TITLE);
pango_layout_set_font_description (layout, chart->pfd);
pango_layout_set_text (layout, chart->title, -1);
pango_layout_get_size (layout, &tw, &th);
if(chart->subtitle)
{
//pango_font_description_set_size(chart->pfd, CHART_FONT_SIZE_PERIOD * PANGO_SCALE);
- ui_chart_stack_set_font_size(chart, CHART_FONT_SIZE_SUBTITLE);
+ ui_chart_progress_set_font_size(chart, CHART_FONT_SIZE_SUBTITLE);
pango_layout_set_font_description (layout, chart->pfd);
pango_layout_set_text (layout, chart->subtitle, -1);
pango_layout_get_size (layout, &tw, &th);
//cairo_user_set_rgbcol(cr, &global_colors[BLACK]);
cairo_user_set_rgbacol (cr, &global_colors[THTEXT], 0.78);
//pango_font_description_set_size(chart->pfd, CHART_FONT_SIZE_NORMAL * PANGO_SCALE);
- ui_chart_stack_set_font_size(chart, CHART_FONT_SIZE_NORMAL);
+ ui_chart_progress_set_font_size(chart, CHART_FONT_SIZE_NORMAL);
pango_layout_set_font_description (layout, chart->pfd);
pango_layout_set_text (layout, chart->budget_title, -1);
// draw items
//pango_font_description_set_size(chart->pfd, CHART_FONT_SIZE_NORMAL * PANGO_SCALE);
- ui_chart_stack_set_font_size(chart, CHART_FONT_SIZE_NORMAL);
+ ui_chart_progress_set_font_size(chart, CHART_FONT_SIZE_NORMAL);
pango_layout_set_font_description (layout, chart->pfd);
for(i=0; i<chart->visible ;i++)
// spent value
if( item->result != 0)
{
- valstr = ui_chart_stack_print_int(chart, item->spent);
+ valstr = ui_chart_progress_print_int(chart, item->spent);
pango_layout_set_text (layout, valstr, -1);
pango_layout_get_size (layout, &tw, &th);
}
// budget value
- valstr = ui_chart_stack_print_int(chart, item->budget);
+ valstr = ui_chart_progress_print_int(chart, item->budget);
pango_layout_set_text (layout, valstr, -1);
pango_layout_get_size (layout, &tw, &th);
//cairo_user_set_rgbcol(cr, &global_colors[BLACK]);
if( item->result != 0)
{
- valstr = ui_chart_stack_print_int(chart, item->result);
+ valstr = ui_chart_progress_print_int(chart, item->result);
if(item->warn)
//cairo_set_source_rgb(cr, COLTOCAIRO(164), COLTOCAIRO(0), COLTOCAIRO(0));
/*
** get the bar under the mouse pointer
*/
-static gint ui_chart_stack_get_active(GtkWidget *widget, gint x, gint y, gpointer user_data)
+static gint ui_chart_progress_get_active(GtkWidget *widget, gint x, gint y, gpointer user_data)
{
-ChartStack *chart = GTK_CHARTSTACK(user_data);
+ChartProgress *chart = GTK_CHARTPROGRESS(user_data);
gint retval, first, index, py;
gint blkw = chart->blkw;
double oy;
}
-static void ui_chart_stack_first_changed( GtkAdjustment *adj, gpointer user_data)
+static void ui_chart_progress_first_changed( GtkAdjustment *adj, gpointer user_data)
{
-ChartStack *chart = GTK_CHARTSTACK(user_data);
+ChartProgress *chart = GTK_CHARTPROGRESS(user_data);
//gint first;
DB( g_print("\n[chartstack] bar first changed\n") );
/*
** scrollbar set values for upper, page size, and also show/hide
*/
-static void ui_chart_stack_scrollbar_setvalues(ChartStack *chart)
+static void ui_chart_progress_scrollbar_setvalues(ChartProgress *chart)
{
GtkAdjustment *adj = chart->adjustment;
gint first;
}
-static void ui_chart_stack_recompute(ChartStack *chart)
+static void ui_chart_progress_recompute(ChartProgress *chart)
{
DB( g_print("\n[chartstack] recompute\n") );
- ui_chart_stack_calculation(chart);
+ ui_chart_progress_calculation(chart);
gtk_adjustment_set_value(chart->adjustment, 0);
- ui_chart_stack_scrollbar_setvalues(chart);
+ ui_chart_progress_scrollbar_setvalues(chart);
gtk_widget_show(chart->scrollbar);
gtk_widget_queue_draw( chart->drawarea );
/* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
static gboolean drawarea_full_redraw(GtkWidget *widget, gpointer user_data)
{
-ChartStack *chart = GTK_CHARTSTACK(user_data);
+ChartProgress *chart = GTK_CHARTPROGRESS(user_data);
cairo_t *cr;
DB( g_print("\n[gtkchart] drawarea full redraw\n") );
#if (DBGDRAW_RECT + DBGDRAW_TEXT + DBGDRAW_ITEM) > 0
- ui_chart_stack_draw_help(widget, user_data);
+ ui_chart_progress_draw_help(widget, user_data);
#endif
- ui_chart_stack_draw_bars(chart, cr);
+ ui_chart_progress_draw_bars(chart, cr);
cairo_destroy(cr);
GdkEventConfigure *event,
gpointer user_data)
{
-ChartStack *chart = GTK_CHARTSTACK(user_data);
+ChartProgress *chart = GTK_CHARTPROGRESS(user_data);
GtkAllocation allocation;
GtkStyleContext *context;
PangoFontDescription *desc;
chart->pfd_size = pango_font_description_get_size (desc) / PANGO_SCALE;
chart->barw = (6 + chart->pfd_size) * PHI;
+ //leak: we should free desc here ?
+ //or no need to copy above ?
+ //pango_font_description_free(desc);
DB( g_print("family: %s\n", pango_font_description_get_family(chart->pfd) ) );
DB( g_print("size : %d (%d)\n", chart->pfd_size, chart->pfd_size/PANGO_SCALE ) );
if( gtk_widget_get_realized(widget) )
{
- ui_chart_stack_recompute(chart);
+ ui_chart_progress_recompute(chart);
drawarea_full_redraw(widget, user_data);
}
static gboolean drawarea_draw_callback(GtkWidget *widget, cairo_t *cr, gpointer user_data)
{
-ChartStack *chart = GTK_CHARTSTACK(user_data);
+ChartProgress *chart = GTK_CHARTPROGRESS(user_data);
if( !gtk_widget_get_realized(widget) || chart->surface == NULL )
return FALSE;
static gboolean drawarea_motionnotifyevent_callback(GtkWidget *widget, GdkEventMotion *event, gpointer user_data)
{
-ChartStack *chart = GTK_CHARTSTACK(user_data);
+ChartProgress *chart = GTK_CHARTPROGRESS(user_data);
gint x, y;
if(chart->surface == NULL || chart->nb_items == 0)
//return FALSE;
}
- chart->active = ui_chart_stack_get_active(widget, x, y, chart);
+ chart->active = ui_chart_progress_get_active(widget, x, y, chart);
// rollover redraw ?
static gboolean drawarea_scroll_event_callback( GtkWidget *widget, GdkEventScroll *event, gpointer user_data)
{
-ChartStack *chart = GTK_CHARTSTACK(user_data);
+ChartProgress *chart = GTK_CHARTPROGRESS(user_data);
GtkAdjustment *adj = chart->adjustment;
gdouble first, upper, pagesize;
/* public functions */
/* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
-static void ui_chart_stack_queue_redraw(ChartStack *chart)
+static void ui_chart_progress_queue_redraw(ChartProgress *chart)
{
if( gtk_widget_get_realized(GTK_WIDGET(chart)) )
{
- ui_chart_stack_recompute(chart);
+ ui_chart_progress_recompute(chart);
drawarea_full_redraw(chart->drawarea, chart);
//gtk_widget_queue_draw( chart->drawarea );
}
/*
** change the model and/or column
*/
-void ui_chart_stack_set_dualdatas(ChartStack *chart, GtkTreeModel *model, gchar *coltitle1, gchar *coltitle2, gchar *title, gchar *subtitle)
+void ui_chart_progress_set_dualdatas(ChartProgress *chart, GtkTreeModel *model, gchar *coltitle1, gchar *coltitle2, gchar *title, gchar *subtitle)
{
- g_return_if_fail (GTK_IS_CHARTSTACK (chart));
+ g_return_if_fail (GTK_IS_CHARTPROGRESS (chart));
if( GTK_IS_TREE_MODEL(model) )
{
- ui_chart_stack_setup_with_model(chart, model, coltitle1, coltitle2 );
+ ui_chart_progress_setup_with_model(chart, model, coltitle1, coltitle2 );
if(title != NULL)
chart->title = g_strdup(title);
if(subtitle != NULL)
chart->subtitle = g_strdup(subtitle);
- ui_chart_stack_queue_redraw(chart);
+ ui_chart_progress_queue_redraw(chart);
}
else
{
- ui_chart_stack_clear(chart, TRUE);
+ ui_chart_progress_clear(chart, TRUE);
}
}
/*
** change the tooltip title
*/
-void ui_chart_stack_set_title(ChartStack * chart, gchar *title)
+void ui_chart_progress_set_title(ChartProgress * chart, gchar *title)
{
- g_return_if_fail (GTK_IS_CHARTSTACK (chart));
+ g_return_if_fail (GTK_IS_CHARTPROGRESS (chart));
chart->title = g_strdup(title);
DB( g_print("\n[chartstack] set title = %s\n", chart->title) );
- ui_chart_stack_recompute(chart);
+ ui_chart_progress_recompute(chart);
}
-void ui_chart_stack_set_subtitle(ChartStack * chart, gchar *subtitle)
+void ui_chart_progress_set_subtitle(ChartProgress * chart, gchar *subtitle)
{
- g_return_if_fail (GTK_IS_CHARTSTACK (chart));
+ g_return_if_fail (GTK_IS_CHARTPROGRESS (chart));
chart->subtitle = g_strdup(subtitle);
DB( g_print("\n[chartstack] set period = %s\n", chart->subtitle) );
- ui_chart_stack_recompute(chart);
+ ui_chart_progress_recompute(chart);
}
/*
** change the minor visibility
*/
-void ui_chart_stack_show_minor(ChartStack * chart, gboolean minor)
+void ui_chart_progress_show_minor(ChartProgress * chart, gboolean minor)
{
- g_return_if_fail (GTK_IS_CHARTSTACK (chart));
+ g_return_if_fail (GTK_IS_CHARTPROGRESS (chart));
chart->minor = minor;
- ui_chart_stack_queue_redraw(chart);
+ ui_chart_progress_queue_redraw(chart);
}
-void ui_chart_stack_set_color_scheme(ChartStack * chart, gint index)
+void ui_chart_progress_set_color_scheme(ChartProgress * chart, gint index)
{
colorscheme_init(&chart->color_scheme, index);
}
/*
** set the minor parameters
*/
-/*void ui_chart_stack_set_minor_prefs(ChartStack * chart, gdouble rate, gchar *symbol)
+/*void ui_chart_progress_set_minor_prefs(ChartProgress * chart, gdouble rate, gchar *symbol)
{
- g_return_if_fail (GTK_IS_CHARTSTACK (chart));
+ g_return_if_fail (GTK_IS_CHARTPROGRESS (chart));
chart->minor_rate = rate;
chart->minor_symbol = symbol;
}*/
-void ui_chart_stack_set_currency(ChartStack * chart, guint32 kcur)
+void ui_chart_progress_set_currency(ChartProgress * chart, guint32 kcur)
{
- g_return_if_fail (GTK_IS_CHARTSTACK (chart));
+ g_return_if_fail (GTK_IS_CHARTPROGRESS (chart));
chart->kcur = kcur;
}