Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 13 additions & 8 deletions src/bz-data-graph.c
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,8 @@
#include <math.h>

#define LABEL_MARGIN 75.0
#define CARD_EDGE_THRESHOLD 160
#define LABEL_MARGIN_RIGHT 35.0
#define CARD_EDGE_THRESHOLD 120

struct _BzDataGraph
{
Expand Down Expand Up @@ -186,7 +187,7 @@ bz_data_graph_size_allocate (GtkWidget *widget,
{
BzDataGraph *self = BZ_DATA_GRAPH (widget);

refresh_path (self, (double) width - LABEL_MARGIN * 2.0, (double) height - LABEL_MARGIN);
refresh_path (self, (double) width - LABEL_MARGIN - LABEL_MARGIN_RIGHT, (double) height - LABEL_MARGIN);
gtk_widget_queue_draw (widget);
}

Expand Down Expand Up @@ -260,7 +261,7 @@ bz_data_graph_snapshot (GtkWidget *widget,

if (self->motion_x >= LABEL_MARGIN &&
self->motion_y >= 0.0 &&
self->motion_x < widget_width - LABEL_MARGIN &&
self->motion_x < widget_width - LABEL_MARGIN_RIGHT &&
self->motion_y < widget_height - LABEL_MARGIN)
{
guint n_items = 0;
Expand Down Expand Up @@ -291,7 +292,7 @@ bz_data_graph_snapshot (GtkWidget *widget,
const char *prefix = NULL;

n_items = g_list_model_get_n_items (self->model);
graph_width = widget_width - LABEL_MARGIN * 2.0;
graph_width = widget_width - LABEL_MARGIN - LABEL_MARGIN_RIGHT;
fraction = (self->motion_x - LABEL_MARGIN) / graph_width;
hovered_idx = floor ((double) n_items * fraction);
if (hovered_idx >= n_items)
Expand Down Expand Up @@ -508,7 +509,7 @@ update_cursor (BzDataGraph *self,
if (x >= LABEL_MARGIN &&
y >= 0.0 &&
x < widget_width - LABEL_MARGIN &&
y < widget_height - LABEL_MARGIN)
y < widget_height - LABEL_MARGIN_RIGHT)
gtk_widget_set_cursor_from_name (GTK_WIDGET (self), "crosshair");
else
gtk_widget_set_cursor (GTK_WIDGET (self), NULL);
Expand Down Expand Up @@ -832,7 +833,7 @@ refresh_path (BzDataGraph *self,
font_height = (double) (int) PANGO_PIXELS_CEIL (pango_font_metrics_get_height (metrics));
g_clear_pointer (&metrics, pango_font_metrics_unref);

num_ticks = floor (height / (font_height + 10.0));
num_ticks = floor (height / (font_height + 25.0));
if (num_ticks < 2)
num_ticks = 2;

Expand All @@ -843,7 +844,7 @@ refresh_path (BzDataGraph *self,
rounded_axis_max = ceil (max_dependent / tick_spacing) * tick_spacing;
self->rounded_axis_max = rounded_axis_max;

independent_label_step = MAX (1, n_items / MAX (1, floor (width / MAX (font_height + 10.0, LABEL_MARGIN))));
independent_label_step = MAX (1, n_items / MAX (1, floor (width / MAX (font_height + 10.0, LABEL_MARGIN)))) * 1.5 ;

curve_builder = gsk_path_builder_new ();
snapshot = gtk_snapshot_new ();
Expand Down Expand Up @@ -874,6 +875,7 @@ refresh_path (BzDataGraph *self,
const char *label = NULL;
char buf[32] = { 0 };
g_autoptr (PangoLayout) layout = NULL;
PangoRectangle extents;

label = bz_data_point_get_label (point);
if (label == NULL)
Expand Down Expand Up @@ -902,9 +904,12 @@ refresh_path (BzDataGraph *self,
layout = pango_layout_new (pango);
pango_layout_set_text (layout, label, -1);

pango_layout_get_pixel_extents (layout, NULL, &extents);

gtk_snapshot_save (snapshot);
gtk_snapshot_translate (snapshot, &GRAPHENE_POINT_INIT (x, height + LABEL_MARGIN / 10.0));
gtk_snapshot_rotate (snapshot, 25.0);
gtk_snapshot_rotate (snapshot, -LABEL_MARGIN_RIGHT);
gtk_snapshot_translate (snapshot, &GRAPHENE_POINT_INIT (-extents.width, 0));
gtk_snapshot_append_layout (snapshot, layout, &(GdkRGBA) { 1.0, 1.0, 1.0, 1.0 });
gtk_snapshot_restore (snapshot);

Expand Down
31 changes: 30 additions & 1 deletion src/bz-entry.c
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,7 @@ typedef struct
GListModel *download_stats;
GListModel *download_stats_per_country;
int recent_downloads;
int total_downloads;

GHashTable *flathub_prop_queries;
DexFuture *mini_icon_future;
Expand Down Expand Up @@ -166,6 +167,7 @@ enum
PROP_VERIFIED,
PROP_DOWNLOAD_STATS,
PROP_RECENT_DOWNLOADS,
PROP_TOTAL_DOWNLOADS,
PROP_LIGHT_ACCENT_COLOR,
PROP_DARK_ACCENT_COLOR,
PROP_IS_MOBILE_FRIENDLY,
Expand Down Expand Up @@ -417,6 +419,12 @@ bz_entry_get_property (GObject *object,
query_flathub (self, PROP_DOWNLOAD_STATS);
g_value_set_int (value, priv->recent_downloads);
break;

case PROP_TOTAL_DOWNLOADS:
query_flathub (self, PROP_TOTAL_DOWNLOADS);
g_value_set_int (value, priv->total_downloads);
break;

default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
}
Expand Down Expand Up @@ -633,6 +641,9 @@ bz_entry_set_property (GObject *object,
case PROP_RECENT_DOWNLOADS:
priv->recent_downloads = g_value_get_int (value);
break;
case PROP_TOTAL_DOWNLOADS:
priv->total_downloads = g_value_get_int (value);
break;
case PROP_HOLDING:
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
Expand Down Expand Up @@ -959,6 +970,13 @@ bz_entry_class_init (BzEntryClass *klass)
0, G_MAXINT, 0,
G_PARAM_READWRITE);

props[PROP_TOTAL_DOWNLOADS] =
g_param_spec_int (
"total-downloads",
NULL, NULL,
0, G_MAXINT, 0,
G_PARAM_READWRITE);

g_object_class_install_properties (object_class, LAST_PROP, props);
}

Expand Down Expand Up @@ -2109,6 +2127,7 @@ query_flathub_fiber (QueryFlathubData *data)
break;
case PROP_DOWNLOAD_STATS:
case PROP_DOWNLOAD_STATS_PER_COUNTRY:
case PROP_TOTAL_DOWNLOADS:
request = g_strdup_printf ("/stats/%s?all=false&days=175", id);
break;
case PROP_DEVELOPER_APPS:
Expand Down Expand Up @@ -2144,7 +2163,7 @@ query_flathub_fiber (QueryFlathubData *data)
if (!JSON_NODE_HOLDS_OBJECT (node))
{
g_debug ("No data for property %s for %s from flathub",
props[prop]->name, id);
props[prop]->name, id);
return dex_future_new_for_error (
g_error_new (G_IO_ERROR, G_IO_ERROR_INVALID_DATA,
"Unexpected JSON response format"));
Expand Down Expand Up @@ -2183,6 +2202,16 @@ query_flathub_fiber (QueryFlathubData *data)
return dex_future_new_for_object (store);
}
break;
case PROP_TOTAL_DOWNLOADS:
{
int total_downloads = 0;

if (json_object_has_member (json_node_get_object (node), "installs_total"))
total_downloads = json_object_get_int_member (json_node_get_object (node), "installs_total");

return dex_future_new_for_int (total_downloads);
}
break;

case PROP_DEVELOPER_APPS:
{
Expand Down
3 changes: 2 additions & 1 deletion src/bz-full-view.c
Original file line number Diff line number Diff line change
Expand Up @@ -619,12 +619,13 @@ dl_stats_cb (BzFullView *self,

ui_entry = bz_result_get_object (self->ui_entry);

dialog = bz_stats_dialog_new (NULL, NULL);
dialog = bz_stats_dialog_new (NULL, NULL, 0);
adw_dialog_set_content_width (dialog, 2000);
adw_dialog_set_content_height (dialog, 1500);

g_object_bind_property (ui_entry, "download-stats", dialog, "model", G_BINDING_SYNC_CREATE);
g_object_bind_property (ui_entry, "download-stats-per-country", dialog, "country-model", G_BINDING_SYNC_CREATE);
g_object_bind_property (ui_entry, "total-downloads", dialog, "total-downloads", G_BINDING_SYNC_CREATE);

adw_dialog_present (dialog, GTK_WIDGET (self));
bz_stats_dialog_animate_open (BZ_STATS_DIALOG (dialog));
Expand Down
22 changes: 19 additions & 3 deletions src/bz-stats-dialog.blp
Original file line number Diff line number Diff line change
Expand Up @@ -26,9 +26,25 @@ template $BzStatsDialog: Adw.Dialog {
title: _("Timeline");
icon-name: "graph2-symbolic";

child: $BzDataGraph graph {
model: bind template.model;
tooltip-prefix: _("Installs:");
child: Box {
orientation: vertical;

Label {
label: bind $format_total_downloads(template.total-downloads) as <string>;
halign: end;
hexpand: true;
margin-end: 34;
margin-bottom: 2;

styles ["dimmed"]
}

$BzDataGraph graph {
model: bind template.model;
tooltip-prefix: _("Installs:");
vexpand: true;
hexpand: true;
}
};
}

Expand Down
37 changes: 36 additions & 1 deletion src/bz-stats-dialog.c
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
*/

#include "config.h"
#include <glib/gi18n.h>

#include "bz-data-graph.h"
#include "bz-stats-dialog.h"
Expand All @@ -30,6 +31,7 @@ struct _BzStatsDialog

GListModel *model;
GListModel *country_model;
int total_downloads;

/* Template widgets */
BzDataGraph *graph;
Expand All @@ -44,6 +46,7 @@ enum

PROP_MODEL,
PROP_COUNTRY_MODEL,
PROP_TOTAL_DOWNLOADS,

LAST_PROP
};
Expand Down Expand Up @@ -76,6 +79,9 @@ bz_stats_dialog_get_property (GObject *object,
case PROP_COUNTRY_MODEL:
g_value_set_object (value, self->country_model);
break;
case PROP_TOTAL_DOWNLOADS:
g_value_set_int (value, self->total_downloads);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
}
Expand All @@ -99,11 +105,30 @@ bz_stats_dialog_set_property (GObject *object,
g_clear_object (&self->country_model);
self->country_model = g_value_dup_object (value);
break;
case PROP_TOTAL_DOWNLOADS:
self->total_downloads = g_value_get_int (value);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
}
}

static char *
format_total_downloads (gpointer object,
int value)
{
if (value <= 0)
return g_strdup ("---");
if (value >= 1000000)
/* Translators: M is the suffix for millions */
return g_strdup_printf ("%.2fM Total Installs", value / 1000000.0);
else if (value >= 1000)
/* Translators: K is the suffix for thousands*/
return g_strdup_printf ("%.2fK Total Installs", value / 1000.0);
else
return g_strdup_printf ("%'d Total Installs", value);
}

static void
bz_stats_dialog_class_init (BzStatsDialogClass *klass)
{
Expand All @@ -128,12 +153,20 @@ bz_stats_dialog_class_init (BzStatsDialogClass *klass)
G_TYPE_LIST_MODEL,
G_PARAM_READWRITE);

props[PROP_TOTAL_DOWNLOADS] =
g_param_spec_int (
"total-downloads",
NULL, NULL,
0, G_MAXINT, 0,
G_PARAM_READWRITE);

g_object_class_install_properties (object_class, LAST_PROP, props);

g_type_ensure (BZ_TYPE_DATA_GRAPH);
g_type_ensure (BZ_TYPE_WORLD_MAP);

gtk_widget_class_set_template_from_resource (widget_class, "/io/github/kolunmi/Bazaar/bz-stats-dialog.ui");
gtk_widget_class_bind_template_callback (widget_class, format_total_downloads);
gtk_widget_class_bind_template_child (widget_class, BzStatsDialog, graph);
gtk_widget_class_bind_template_child (widget_class, BzStatsDialog, world_map);
}
Expand All @@ -146,14 +179,16 @@ bz_stats_dialog_init (BzStatsDialog *self)

AdwDialog *
bz_stats_dialog_new (GListModel *model,
GListModel *country_model)
GListModel *country_model,
int total_downloads)
{
BzStatsDialog *stats_dialog = NULL;

stats_dialog = g_object_new (
BZ_TYPE_STATS_DIALOG,
"model", model,
"country-model", country_model,
"total-downloads", total_downloads,
NULL);

return ADW_DIALOG (stats_dialog);
Expand Down
3 changes: 2 additions & 1 deletion src/bz-stats-dialog.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,8 @@ G_DECLARE_FINAL_TYPE (BzStatsDialog, bz_stats_dialog, BZ, STATS_DIALOG, AdwDialo

AdwDialog *
bz_stats_dialog_new (GListModel *model,
GListModel *country_model);
GListModel *country_model,
int total_downloads);

void
bz_stats_dialog_animate_open (BzStatsDialog *self);
Expand Down