Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • SuborbitalPigeon/rugby
  • webpigeon/rugby
2 results
Show changes
<?xml version="1.0" encoding="UTF-8"?>
<!--
SPDX-FileCopyrightText: 2023-2024 Bruce Cowan
SPDX-License-Identifier: CC0-1.0
-->
<component type="desktop-application">
<id>uk.me.bcowan.Rugby</id>
<name>Rugby</name>
<developer_name>Bruce Cowan</developer_name>
<summary>Find possibilities for rugby scores</summary>
<metadata_license>CC0-1.0</metadata_license>
<project_license>GPL-3.0-or-later</project_license>
<supports>
<control>pointing</control>
<control>keyboard</control>
<control>touch</control>
</supports>
<description>
<p>
A program to determine possible combinations of scoring for rugby matches.
</p>
</description>
<launchable type="desktop-id">uk.me.bcowan.Rugby.desktop</launchable>
<icon type="stock">rugby</icon>
<categories>
<category>Utility</category>
<category>GNOME</category>
</categories>
<provides>
<binary>rugby</binary>
</provides>
</component>
# SPDX-FileCopyrightText: 2016-2022 Bruce Cowan <bruce@bcowan.me.uk> # SPDX-FileCopyrightText: 2016-2024 Bruce Cowan <bruce@bcowan.me.uk>
# #
# SPDX-License-Identifier: GPL-3.0-or-later # SPDX-License-Identifier: GPL-3.0-or-later
project('rugby', 'c', project('rugby', 'c',
version: '0.4.alpha', version: '0.4.alpha',
license:'GPLv3+', license:'GPLv3+',
meson_version: '>= 0.57.0', meson_version: '>= 1.1.0',
default_options: [ default_options: [
'buildtype=debugoptimized', 'buildtype=debugoptimized',
'c_std=gnu11', 'c_std=gnu11',
...@@ -18,9 +18,9 @@ desktopdir = datadir / 'applications' ...@@ -18,9 +18,9 @@ desktopdir = datadir / 'applications'
gnome = import('gnome') gnome = import('gnome')
gio_dep = dependency('gio-2.0', version: '>= 2.66') gio_dep = dependency('gio-2.0', version: '>= 2.76')
gtk_dep = dependency('gtk4', version: '>= 4.8') gtk_dep = dependency('gtk4', version: '>= 4.12')
libadwaita_dep = dependency('libadwaita-1') libadwaita_dep = dependency('libadwaita-1', version: '>=1.5.beta')
conf = configuration_data() conf = configuration_data()
...@@ -33,20 +33,10 @@ else ...@@ -33,20 +33,10 @@ else
conf.set_quoted('VERSION', meson.project_version()) conf.set_quoted('VERSION', meson.project_version())
endif endif
config_h = vcs_tag( cflags = ['-DGLIB_VERSION_MIN_REQUIRED=GLIB_VERSION_2_70',
input: configure_file( '-DGLIB_VERSION_MAX_ALLOWED=GLIB_VERSION_2_70',
output: 'config.h.in', '-DGDK_VERSION_MIN_REQUIRED=GDK_VERSION_4_12',
configuration: conf '-DGDK_VERSION_MAX_ALLOWED=GDK_VERSION_4_12',
),
output: 'config.h',
command: ['git', 'rev-parse', '--short', 'HEAD'],
fallback: (profile == 'development') ? 'devel' : '',
)
cflags = ['-DGLIB_VERSION_MIN_REQUIRED=GLIB_VERSION_2_66',
'-DGLIB_VERSION_MAX_ALLOWED=GLIB_VERSION_2_66',
'-DGDK_VERSION_MIN_REQUIRED=GDK_VERSION_4_8',
'-DGDK_VERSION_MAX_ALLOWED=GDK_VERSION_4_8',
'-Wno-overlength-strings', '-Wno-overlength-strings',
] ]
...@@ -58,4 +48,7 @@ add_project_arguments(cc.get_supported_arguments(cflags), ...@@ -58,4 +48,7 @@ add_project_arguments(cc.get_supported_arguments(cflags),
subdir('data') subdir('data')
subdir('src') subdir('src')
gnome.post_install(glib_compile_schemas: true) gnome.post_install(
glib_compile_schemas: true,
update_desktop_database: true,
)
File moved
/* /*
* SPDX-FileCopyrightText: 2012-2022 Bruce Cowan <bruce@bcowan.me.uk> * SPDX-FileCopyrightText: 2012-2024 Bruce Cowan <bruce@bcowan.me.uk>
* SPDX-License-Identifier: GPL-3.0-or-later * SPDX-License-Identifier: GPL-3.0-or-later
*/ */
#include <config.h> #include <config.h>
#include "rugby-app-window.h" #include "rugby-app-window.h"
#include "rugby-pref-window.h" #include "rugby-pref-dialog.h"
static void static void
on_activate ( GApplication *app, on_activate ( GApplication *app,
...@@ -32,14 +32,12 @@ about_activated (G_GNUC_UNUSED GSimpleAction *simple, ...@@ -32,14 +32,12 @@ about_activated (G_GNUC_UNUSED GSimpleAction *simple,
GtkApplication *app = GTK_APPLICATION (user_data); GtkApplication *app = GTK_APPLICATION (user_data);
GtkWindow *window = gtk_application_get_active_window (app); GtkWindow *window = gtk_application_get_active_window (app);
adw_show_about_window (window, adw_show_about_dialog_from_appdata (GTK_WIDGET (window),
"application-icon", "football-american", "uk/me/bcowan/Rugby/uk.me.bcowan.Rugby.metainfo.xml",
"application-name", "Rugby", NULL,
"copyright", "Copyright 2012–2022 Bruce Cowan", "application-icon", "football-american",
"license-type", GTK_LICENSE_GPL_3_0, "version", VERSION,
"developer-name", "Bruce Cowan", NULL);
"version", VERSION,
NULL);
} }
static void static void
...@@ -50,8 +48,8 @@ preferences_activated (G_GNUC_UNUSED GSimpleAction *simple, ...@@ -50,8 +48,8 @@ preferences_activated (G_GNUC_UNUSED GSimpleAction *simple,
GtkApplication *app = GTK_APPLICATION (user_data); GtkApplication *app = GTK_APPLICATION (user_data);
GtkWindow *window = gtk_application_get_active_window (app); GtkWindow *window = gtk_application_get_active_window (app);
RugbyPrefWindow *pref_window = rugby_pref_window_new (RUGBY_APP_WINDOW (window)); RugbyPrefDialog *pref_window = rugby_pref_dialog_new ();
gtk_window_present (GTK_WINDOW (pref_window)); adw_dialog_present (ADW_DIALOG (pref_window), GTK_WIDGET (window));
} }
static void static void
...@@ -78,7 +76,7 @@ main (int argc, ...@@ -78,7 +76,7 @@ main (int argc,
char **argv) char **argv)
{ {
g_autoptr (AdwApplication) app = adw_application_new ("uk.me.bcowan.Rugby", g_autoptr (AdwApplication) app = adw_application_new ("uk.me.bcowan.Rugby",
G_APPLICATION_FLAGS_NONE); G_APPLICATION_NON_UNIQUE);
g_signal_connect (app, "startup", g_signal_connect (app, "startup",
G_CALLBACK (on_startup), NULL); G_CALLBACK (on_startup), NULL);
......
# SPDX-FileCopyrightText: 2016-2022 Bruce Cowan <bruce@bcowan.me.uk> # SPDX-FileCopyrightText: 2016-2024 Bruce Cowan <bruce@bcowan.me.uk>
# #
# SPDX-License-Identifier: GPL-3.0-or-later # SPDX-License-Identifier: GPL-3.0-or-later
sources = [ sources = [
...@@ -7,11 +7,21 @@ sources = [ ...@@ -7,11 +7,21 @@ sources = [
'rugby-list-store.c', 'rugby-list-store.c',
'rugby-possibility.c', 'rugby-possibility.c',
'rugby-possibility-widget.c', 'rugby-possibility-widget.c',
'rugby-pref-window.c', 'rugby-pref-dialog.c',
] ]
config_h = vcs_tag(
input: configure_file(
output: 'config.h.in',
configuration: conf,
),
output: 'config.h',
command: ['git', 'rev-parse', '--short', 'HEAD'],
fallback: (profile == 'development') ? 'devel' : '',
)
executable('rugby', executable('rugby',
sources, config_h, resources, compiled_schemas, sources, config_h, resources,
dependencies: [gio_dep, gtk_dep, libadwaita_dep], dependencies: [gio_dep, gtk_dep, libadwaita_dep],
install_dir: get_option('bindir'), install_dir: get_option('bindir'),
install: true) install: true)
/* /*
* SPDX-FileCopyrightText: 2017-2022 Bruce Cowan <bruce@bcowan.me.uk> * SPDX-FileCopyrightText: 2017-2024 Bruce Cowan <bruce@bcowan.me.uk>
* *
* SPDX-License-Identifier: GPL-3.0-or-later * SPDX-License-Identifier: GPL-3.0-or-later
*/ */
...@@ -18,15 +18,12 @@ struct _RugbyAppWindow ...@@ -18,15 +18,12 @@ struct _RugbyAppWindow
AdwApplicationWindow parent; AdwApplicationWindow parent;
GtkWidget *scorespin; GtkWidget *scorespin;
GtkWidget *tryspin;
GtkWidget *stack; GtkWidget *stack;
GtkWidget *empty_page;
GtkWidget *list_page;
GtkCustomFilter *try_filter; GSettings *win_settings;
}; };
G_DEFINE_TYPE (RugbyAppWindow, rugby_app_window, ADW_TYPE_APPLICATION_WINDOW) G_DEFINE_FINAL_TYPE (RugbyAppWindow, rugby_app_window, ADW_TYPE_APPLICATION_WINDOW)
static void static void
list_store_items_changed_cb ( GListModel *model, list_store_items_changed_cb ( GListModel *model,
...@@ -37,9 +34,9 @@ list_store_items_changed_cb ( GListModel *model, ...@@ -37,9 +34,9 @@ list_store_items_changed_cb ( GListModel *model,
{ {
unsigned n_items = g_list_model_get_n_items (model); unsigned n_items = g_list_model_get_n_items (model);
if (n_items == 0) if (n_items == 0)
gtk_stack_set_visible_child (GTK_STACK (self->stack), self->empty_page); gtk_stack_set_visible_child_name (GTK_STACK (self->stack), "empty_page");
else else
gtk_stack_set_visible_child (GTK_STACK (self->stack), self->list_page); gtk_stack_set_visible_child_name (GTK_STACK (self->stack), "list_page");
} }
static char * static char *
...@@ -49,50 +46,55 @@ item_tooltip_cb (GtkListItem *item) ...@@ -49,50 +46,55 @@ item_tooltip_cb (GtkListItem *item)
if (!possibility) if (!possibility)
return NULL; return NULL;
int tries, utries, kicks;
GString *tooltip = g_string_new (NULL); GString *tooltip = g_string_new (NULL);
g_object_get (possibility, int tries = rugby_possibility_get_tries (possibility);
"tries", &tries, int utries = rugby_possibility_get_utries (possibility);
"utries", &utries, int kicks = rugby_possibility_get_kicks (possibility);
"kicks", &kicks,
NULL);
if (tries > 0 && utries == 0) if (tries > 0)
{ {
g_string_printf (tooltip, ngettext ("%d converted try", g_string_printf (tooltip, ngettext ("%d converted try",
"%d converted tries", "%d converted tries",
tries), tries),
tries); tries);
} }
else if (utries > 0 && tries == 0) if (utries > 0)
{ {
g_string_printf (tooltip, ngettext ("%d unconverted try", if (tooltip->len > 0)
"%d unconverted tries", g_string_append (tooltip, ", ");
utries),
utries);
}
else if (tries + utries > 0)
{
g_string_printf (tooltip, ngettext ("%d try, %d converted",
"%d tries, %d converted",
tries + utries),
tries + utries, tries);
}
g_string_append_printf (tooltip, ngettext ("%d unconverted try",
"%d unconverted tries",
utries),
utries);
}
if (kicks > 0) if (kicks > 0)
{ {
if (tries > 0 || utries > 0) if (tooltip->len > 0)
g_string_append_printf (tooltip, ", "); g_string_append (tooltip, ", ");
g_string_append_printf (tooltip, g_string_append_printf (tooltip, ngettext ("%d kick",
ngettext ("%d kick", "%d kicks", kicks), "%d kicks",
kicks); kicks),
kicks);
} }
return g_string_free (tooltip, FALSE); return g_string_free (tooltip, FALSE);
} }
static char *
header_label_cb (GtkListItem *item)
{
RugbyPossibility *possibility = gtk_list_header_get_item (GTK_LIST_HEADER (item));
if (!possibility)
return NULL;
int total_tries = rugby_possibility_total_tries (possibility);
return g_strdup_printf (ngettext ("%d try", "%d tries", total_tries), total_tries);
}
static void static void
activate_score_changed (G_GNUC_UNUSED GSimpleAction *action, activate_score_changed (G_GNUC_UNUSED GSimpleAction *action,
GVariant *parameter, GVariant *parameter,
...@@ -111,62 +113,15 @@ activate_score_changed (G_GNUC_UNUSED GSimpleAction *action, ...@@ -111,62 +113,15 @@ activate_score_changed (G_GNUC_UNUSED GSimpleAction *action,
g_assert_not_reached (); g_assert_not_reached ();
} }
static void
try_spin_value_changed_cb (G_GNUC_UNUSED GtkSpinButton *btn,
void *user_data)
{
RugbyAppWindow *self = RUGBY_APP_WINDOW (user_data);
gtk_filter_changed (GTK_FILTER (self->try_filter), GTK_FILTER_CHANGE_DIFFERENT);
}
static void static void
rugby_app_window_dispose (GObject *object) rugby_app_window_dispose (GObject *object)
{ {
gtk_widget_dispose_template (GTK_WIDGET (object), RUGBY_TYPE_APP_WINDOW); gtk_widget_dispose_template (GTK_WIDGET (object), RUGBY_TYPE_APP_WINDOW);
g_clear_object (&RUGBY_APP_WINDOW (object)->win_settings);
G_OBJECT_CLASS (rugby_app_window_parent_class)->dispose (object); G_OBJECT_CLASS (rugby_app_window_parent_class)->dispose (object);
} }
static gboolean
try_filter_func (void *item,
void *user_data)
{
RugbyPossibility *possibility = RUGBY_POSSIBILITY (item);
RugbyAppWindow *self = RUGBY_APP_WINDOW (user_data);
int tries, utries;
g_object_get (possibility,
"tries", &tries,
"utries", &utries,
NULL);
if ((tries + utries) == gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (self->tryspin)))
return TRUE;
return FALSE;
}
static void
show_try_filter_change_state (GSimpleAction *action,
GVariant *value,
void *user_data)
{
RugbyAppWindow *self = RUGBY_APP_WINDOW (user_data);
if (g_variant_get_boolean (value))
{
gtk_custom_filter_set_filter_func (self->try_filter, try_filter_func, self, NULL);
gtk_filter_changed (GTK_FILTER (self->try_filter), GTK_FILTER_CHANGE_DIFFERENT);
}
else
{
gtk_custom_filter_set_filter_func (self->try_filter, NULL, NULL, NULL);
}
g_simple_action_set_state (action, value);
}
static void static void
rugby_app_window_init (RugbyAppWindow *self) rugby_app_window_init (RugbyAppWindow *self)
{ {
...@@ -174,13 +129,20 @@ rugby_app_window_init (RugbyAppWindow *self) ...@@ -174,13 +129,20 @@ rugby_app_window_init (RugbyAppWindow *self)
const GActionEntry win_entries[] = { const GActionEntry win_entries[] = {
{ .name = "score-changed", .activate = activate_score_changed, .parameter_type = "s" }, { .name = "score-changed", .activate = activate_score_changed, .parameter_type = "s" },
{ .name = "show-try-filter", .state = "false", .change_state = show_try_filter_change_state },
}; };
g_action_map_add_action_entries (G_ACTION_MAP (self), g_action_map_add_action_entries (G_ACTION_MAP (self),
win_entries, win_entries,
G_N_ELEMENTS (win_entries), G_N_ELEMENTS (win_entries),
self); self);
self->win_settings = g_settings_new ("uk.me.bcowan.Rugby.window");
g_settings_bind (self->win_settings, "height",
self, "default-height",
G_SETTINGS_BIND_DEFAULT);
g_settings_bind (self->win_settings, "width",
self, "default-width",
G_SETTINGS_BIND_DEFAULT);
} }
static void static void
...@@ -198,14 +160,9 @@ rugby_app_window_class_init (RugbyAppWindowClass *klass) ...@@ -198,14 +160,9 @@ rugby_app_window_class_init (RugbyAppWindowClass *klass)
"/uk/me/bcowan/Rugby/gtk/window.ui"); "/uk/me/bcowan/Rugby/gtk/window.ui");
gtk_widget_class_bind_template_child (widget_class, RugbyAppWindow, scorespin); gtk_widget_class_bind_template_child (widget_class, RugbyAppWindow, scorespin);
gtk_widget_class_bind_template_child (widget_class, RugbyAppWindow, tryspin);
gtk_widget_class_bind_template_child (widget_class, RugbyAppWindow, stack); gtk_widget_class_bind_template_child (widget_class, RugbyAppWindow, stack);
gtk_widget_class_bind_template_child (widget_class, RugbyAppWindow, empty_page);
gtk_widget_class_bind_template_child (widget_class, RugbyAppWindow, list_page);
gtk_widget_class_bind_template_child (widget_class, RugbyAppWindow, try_filter);
gtk_widget_class_bind_template_callback (widget_class, try_spin_value_changed_cb); gtk_widget_class_bind_template_callback (widget_class, header_label_cb);
gtk_widget_class_bind_template_callback (widget_class, item_tooltip_cb); gtk_widget_class_bind_template_callback (widget_class, item_tooltip_cb);
gtk_widget_class_bind_template_callback (widget_class, list_store_items_changed_cb); gtk_widget_class_bind_template_callback (widget_class, list_store_items_changed_cb);
} }
......
/* /*
* SPDX-FileCopyrightText: 2018-2022 Bruce Cowan <bruce@bcowan.me.uk> * SPDX-FileCopyrightText: 2018-2024 Bruce Cowan <bruce@bcowan.me.uk>
* *
* SPDX-License-Identifier: GPL-3.0-or-later * SPDX-License-Identifier: GPL-3.0-or-later
*/ */
...@@ -9,6 +9,7 @@ ...@@ -9,6 +9,7 @@
#include "rugby-possibility.h" #include "rugby-possibility.h"
#include <gio/gio.h> #include <gio/gio.h>
#include <gtk/gtk.h>
struct _RugbyListStore struct _RugbyListStore
{ {
...@@ -21,10 +22,14 @@ struct _RugbyListStore ...@@ -21,10 +22,14 @@ struct _RugbyListStore
}; };
static void rugby_list_store_list_model_iface_init (GListModelInterface *iface); static void rugby_list_store_list_model_iface_init (GListModelInterface *iface);
static void rugby_list_store_section_model_iface_init (GtkSectionModelInterface *iface);
G_DEFINE_FINAL_TYPE_WITH_CODE (RugbyListStore, rugby_list_store, G_TYPE_OBJECT,
G_IMPLEMENT_INTERFACE (G_TYPE_LIST_MODEL,
rugby_list_store_list_model_iface_init)
G_IMPLEMENT_INTERFACE (GTK_TYPE_SECTION_MODEL,
rugby_list_store_section_model_iface_init))
G_DEFINE_TYPE_WITH_CODE (RugbyListStore, rugby_list_store, G_TYPE_OBJECT,
G_IMPLEMENT_INTERFACE (G_TYPE_LIST_MODEL,
rugby_list_store_list_model_iface_init))
enum enum
{ {
...@@ -41,17 +46,10 @@ sort_func ( gconstpointer a, ...@@ -41,17 +46,10 @@ sort_func ( gconstpointer a,
gconstpointer b, gconstpointer b,
G_GNUC_UNUSED void *user_data) G_GNUC_UNUSED void *user_data)
{ {
int atries, autries; int atries = rugby_possibility_get_tries ((void *) a);
int btries, butries; int autries = rugby_possibility_get_utries ((void *) a);
int btries = rugby_possibility_get_tries ((void *) b);
g_object_get ((void *) a, int butries = rugby_possibility_get_utries ((void *) b);
"tries", &atries,
"utries", &autries,
NULL);
g_object_get ((void *) b,
"tries", &btries,
"utries", &butries,
NULL);
int trydiff = (btries + butries) - (atries + autries); int trydiff = (btries + butries) - (atries + autries);
...@@ -141,6 +139,63 @@ rugby_list_store_list_model_iface_init (GListModelInterface *iface) ...@@ -141,6 +139,63 @@ rugby_list_store_list_model_iface_init (GListModelInterface *iface)
iface->get_item = rugby_list_store_get_item; iface->get_item = rugby_list_store_get_item;
} }
// SectionModel implementation
static void
rugby_list_store_get_section (GtkSectionModel *model,
unsigned position,
unsigned *out_start,
unsigned *out_end)
{
RugbyListStore *self = RUGBY_LIST_STORE (model);
unsigned n_items = g_list_model_get_n_items (G_LIST_MODEL (self->items));
RugbyPossibility *possibility = g_list_model_get_item (G_LIST_MODEL (self->items),
position);
if (!possibility)
{
*out_start = n_items;
*out_end = G_MAXUINT;
return;
}
int target_tries = rugby_possibility_total_tries (possibility);
// Find start
for (unsigned i = 0; i < n_items; i++)
{
possibility = g_list_model_get_item (G_LIST_MODEL (self->items), i);
int total = rugby_possibility_total_tries (possibility);
if (total == target_tries)
{
*out_start = i;
break;
}
}
// Find end
for (unsigned i = *out_start + 1; i < n_items; i++)
{
possibility = g_list_model_get_item (G_LIST_MODEL (self->items), i);
int total = rugby_possibility_total_tries (possibility);
if (total != target_tries)
{
*out_end = i;
return;
}
}
*out_end = n_items;
}
static void
rugby_list_store_section_model_iface_init (GtkSectionModelInterface *iface)
{
iface->get_section = rugby_list_store_get_section;
}
// Class functions // Class functions
static void static void
......
/* /*
* SPDX-FileCopyrightText: 2018-2022 Bruce Cowan <bruce@bcowan.me.uk> * SPDX-FileCopyrightText: 2018-2024 Bruce Cowan <bruce@bcowan.me.uk>
* *
* SPDX-License-Identifier: GPL-3.0-or-later * SPDX-License-Identifier: GPL-3.0-or-later
*/ */
...@@ -19,7 +19,7 @@ struct _RugbyPossibilityWidget ...@@ -19,7 +19,7 @@ struct _RugbyPossibilityWidget
RugbyPossibility *possibility; RugbyPossibility *possibility;
}; };
G_DEFINE_TYPE (RugbyPossibilityWidget, rugby_possibility_widget, GTK_TYPE_WIDGET) G_DEFINE_FINAL_TYPE (RugbyPossibilityWidget, rugby_possibility_widget, GTK_TYPE_WIDGET)
enum enum
{ {
...@@ -77,12 +77,12 @@ rugby_possibility_widget_set_property (GObject *object, ...@@ -77,12 +77,12 @@ rugby_possibility_widget_set_property (GObject *object,
} }
static void static void
render_bar (GtkWidget *widget, render_bar (GtkSnapshot *snapshot,
GtkSnapshot *snapshot, float x,
float x, float w,
float w, float h,
float h, const GdkRGBA fill,
const GdkRGBA rgba) const GdkRGBA border)
{ {
graphene_rect_t area = GRAPHENE_RECT_INIT (x, 0.0, w, h); graphene_rect_t area = GRAPHENE_RECT_INIT (x, 0.0, w, h);
...@@ -93,21 +93,17 @@ render_bar (GtkWidget *widget, ...@@ -93,21 +93,17 @@ render_bar (GtkWidget *widget,
gtk_snapshot_push_rounded_clip (snapshot, &rounded); gtk_snapshot_push_rounded_clip (snapshot, &rounded);
gtk_snapshot_append_color (snapshot, gtk_snapshot_append_color (snapshot,
&rgba, &fill,
&area); &area);
gtk_snapshot_pop (snapshot); gtk_snapshot_pop (snapshot);
GtkStyleContext *ctx = gtk_widget_get_style_context (widget);
GdkRGBA border_colour;
gtk_style_context_lookup_color (ctx, "card_fg_color", &border_colour);
gtk_snapshot_append_border (snapshot, gtk_snapshot_append_border (snapshot,
&rounded, &rounded,
(float[]) { 2.0, 2.0, 2.0, 2.0 }, (float[]) { 2.0, 2.0, 2.0, 2.0 },
(GdkRGBA[]) { border_colour, (GdkRGBA[]) { border,
border_colour, border,
border_colour, border,
border_colour }); border });
} }
static void static void
...@@ -124,41 +120,46 @@ rugby_possibility_widget_snapshot (GtkWidget *widget, ...@@ -124,41 +120,46 @@ rugby_possibility_widget_snapshot (GtkWidget *widget,
int height = gtk_widget_get_height (widget); int height = gtk_widget_get_height (widget);
float x = 0.0; float x = 0.0;
int tries, utries, kicks; int tries = rugby_possibility_get_tries (self->possibility);
g_object_get (self->possibility, int utries = rugby_possibility_get_utries (self->possibility);
"tries", &tries, int kicks = rugby_possibility_get_kicks (self->possibility);
"utries", &utries,
"kicks", &kicks,
NULL);
int score = tries * try_points + utries * utry_points + kicks * kick_points; int score = tries * try_points + utries * utry_points + kicks * kick_points;
GtkStyleContext *ctx = gtk_widget_get_style_context (widget);
GdkRGBA rgba; GdkRGBA fill;
GdkRGBA border;
AdwStyleManager *manager = adw_style_manager_get_default ();
if (adw_style_manager_get_dark (manager))
gdk_rgba_parse (&border, "white");
else
gdk_rgba_parse (&border, "black");
// Tries // Tries
float w = width / (score / (float) try_points); float w = width / (score / (float) try_points);
gdk_rgba_parse (&fill, "#33d17a"); // Green 3
for (int i = 0; i < tries; i++) for (int i = 0; i < tries; i++)
{ {
gtk_style_context_lookup_color (ctx, "green_3", &rgba); render_bar (snapshot, x, w, height, fill, border);
render_bar (widget, snapshot, x, w, height, rgba);
x += w; x += w;
} }
// Unconverted tries // Unconverted tries
w = width / (score / (float) utry_points); w = width / (score / (float) utry_points);
gdk_rgba_parse (&fill, "#f6d32d"); // Yellow 3
for (int i = 0; i < utries; i++) for (int i = 0; i < utries; i++)
{ {
gtk_style_context_lookup_color (ctx, "red_3", &rgba); render_bar (snapshot, x, w, height, fill, border);
render_bar (widget, snapshot, x, w, height, rgba);
x += w; x += w;
} }
// Unconverted kicks // Kicks
w = width / (score / (float) kick_points); w = width / (score / (float) kick_points);
gdk_rgba_parse (&fill, "#e01b24"); // Red 3
for (int i = 0; i < kicks; i++) for (int i = 0; i < kicks; i++)
{ {
gtk_style_context_lookup_color (ctx, "yellow_3", &rgba); render_bar (snapshot, x, w, height, fill, border);
render_bar (widget, snapshot, x, w, height, rgba);
x += w; x += w;
} }
} }
......
/* /*
* SPDX-FileCopyrightText: 2018-2021 Bruce Cowan <bruce@bcowan.me.uk> * SPDX-FileCopyrightText: 2018-2024 Bruce Cowan <bruce@bcowan.me.uk>
* *
* SPDX-License-Identifier: GPL-3.0-or-later * SPDX-License-Identifier: GPL-3.0-or-later
*/ */
...@@ -16,7 +16,7 @@ struct _RugbyPossibility ...@@ -16,7 +16,7 @@ struct _RugbyPossibility
int kicks; int kicks;
}; };
G_DEFINE_TYPE (RugbyPossibility, rugby_possibility, G_TYPE_OBJECT) G_DEFINE_FINAL_TYPE (RugbyPossibility, rugby_possibility, G_TYPE_OBJECT)
enum enum
{ {
...@@ -39,13 +39,13 @@ rugby_possibility_get_property (GObject *object, ...@@ -39,13 +39,13 @@ rugby_possibility_get_property (GObject *object,
switch (prop_id) switch (prop_id)
{ {
case PROP_TRIES: case PROP_TRIES:
g_value_set_int (value, self->tries); g_value_set_int (value, rugby_possibility_get_tries (self));
break; break;
case PROP_UTRIES: case PROP_UTRIES:
g_value_set_int (value, self->utries); g_value_set_int (value, rugby_possibility_get_utries (self));
break; break;
case PROP_KICKS: case PROP_KICKS:
g_value_set_int (value, self->kicks); g_value_set_int (value, rugby_possibility_get_kicks (self));
break; break;
default: default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
...@@ -119,3 +119,35 @@ rugby_possibility_new (int tries, ...@@ -119,3 +119,35 @@ rugby_possibility_new (int tries,
"kicks", kicks, "kicks", kicks,
NULL); NULL);
} }
int
rugby_possibility_get_tries (RugbyPossibility *self)
{
g_assert (RUGBY_IS_POSSIBILITY (self));
return self->tries;
}
int
rugby_possibility_get_utries (RugbyPossibility *self)
{
g_assert (RUGBY_IS_POSSIBILITY (self));
return self->utries;
}
int
rugby_possibility_get_kicks (RugbyPossibility *self)
{
g_assert (RUGBY_IS_POSSIBILITY (self));
return self->kicks;
}
int
rugby_possibility_total_tries (RugbyPossibility *self)
{
g_assert (RUGBY_IS_POSSIBILITY (self));
return self->tries + self->utries;
}
/* /*
* SPDX-FileCopyrightText: 2018-2022 Bruce Cowan <bruce@bcowan.me.uk> * SPDX-FileCopyrightText: 2018-2024 Bruce Cowan <bruce@bcowan.me.uk>
* *
* SPDX-License-Identifier: GPL-3.0-or-later * SPDX-License-Identifier: GPL-3.0-or-later
*/ */
...@@ -18,4 +18,10 @@ RugbyPossibility *rugby_possibility_new (int tries, ...@@ -18,4 +18,10 @@ RugbyPossibility *rugby_possibility_new (int tries,
int utries, int utries,
int kicks); int kicks);
int rugby_possibility_get_tries (RugbyPossibility *self);
int rugby_possibility_get_utries (RugbyPossibility *self);
int rugby_possibility_get_kicks (RugbyPossibility *self);
int rugby_possibility_total_tries (RugbyPossibility *self);
G_END_DECLS G_END_DECLS
...@@ -4,11 +4,11 @@ ...@@ -4,11 +4,11 @@
* SPDX-License-Identifier: GPL-3.0-or-later * SPDX-License-Identifier: GPL-3.0-or-later
*/ */
#include "rugby-pref-window.h" #include "rugby-pref-dialog.h"
struct _RugbyPrefWindow struct _RugbyPrefDialog
{ {
AdwPreferencesWindow parent_instance; AdwPreferencesDialog parent_instance;
GtkWidget *try_spin; GtkWidget *try_spin;
GtkWidget *utry_spin; GtkWidget *utry_spin;
...@@ -17,38 +17,37 @@ struct _RugbyPrefWindow ...@@ -17,38 +17,37 @@ struct _RugbyPrefWindow
GSettings *settings; GSettings *settings;
}; };
G_DEFINE_TYPE (RugbyPrefWindow, rugby_pref_window, ADW_TYPE_PREFERENCES_WINDOW) G_DEFINE_FINAL_TYPE (RugbyPrefDialog, rugby_pref_dialog, ADW_TYPE_PREFERENCES_DIALOG)
static void static void
rugby_pref_window_dispose (GObject *object) rugby_pref_dialog_dispose (GObject *object)
{ {
RugbyPrefWindow *self = RUGBY_PREF_WINDOW (object); RugbyPrefDialog *self = RUGBY_PREF_DIALOG (object);
g_clear_object (&self->settings); g_clear_object (&self->settings);
gtk_widget_dispose_template (GTK_WIDGET (object), RUGBY_TYPE_PREF_WINDOW); gtk_widget_dispose_template (GTK_WIDGET (object), RUGBY_TYPE_PREF_DIALOG);
G_OBJECT_CLASS (rugby_pref_window_parent_class)->dispose (object); G_OBJECT_CLASS (rugby_pref_dialog_parent_class)->dispose (object);
} }
static void static void
rugby_pref_window_class_init (RugbyPrefWindowClass *klass) rugby_pref_dialog_class_init (RugbyPrefDialogClass *klass)
{ {
GObjectClass *object_class = G_OBJECT_CLASS (klass); GObjectClass *object_class = G_OBJECT_CLASS (klass);
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
object_class->dispose = rugby_pref_window_dispose; object_class->dispose = rugby_pref_dialog_dispose;
gtk_widget_class_set_template_from_resource (widget_class, gtk_widget_class_set_template_from_resource (widget_class,
"/uk/me/bcowan/Rugby/gtk/prefs.ui"); "/uk/me/bcowan/Rugby/gtk/prefs.ui");
gtk_widget_class_bind_template_child (widget_class, RugbyPrefWindow, try_spin); gtk_widget_class_bind_template_child (widget_class, RugbyPrefDialog, try_spin);
gtk_widget_class_bind_template_child (widget_class, RugbyPrefWindow, utry_spin); gtk_widget_class_bind_template_child (widget_class, RugbyPrefDialog, utry_spin);
gtk_widget_class_bind_template_child (widget_class, RugbyPrefWindow, kick_spin); gtk_widget_class_bind_template_child (widget_class, RugbyPrefDialog, kick_spin);
} }
static void static void
rugby_pref_window_init (RugbyPrefWindow *self) rugby_pref_dialog_init (RugbyPrefDialog *self)
{ {
gtk_widget_init_template (GTK_WIDGET (self)); gtk_widget_init_template (GTK_WIDGET (self));
...@@ -65,10 +64,9 @@ rugby_pref_window_init (RugbyPrefWindow *self) ...@@ -65,10 +64,9 @@ rugby_pref_window_init (RugbyPrefWindow *self)
G_SETTINGS_BIND_DEFAULT); G_SETTINGS_BIND_DEFAULT);
} }
RugbyPrefWindow * RugbyPrefDialog *
rugby_pref_window_new (RugbyAppWindow *window) rugby_pref_dialog_new (void)
{ {
return g_object_new (RUGBY_TYPE_PREF_WINDOW, return g_object_new (RUGBY_TYPE_PREF_DIALOG,
"transient-for", window,
NULL); NULL);
} }
/* /*
* SPDX-FileCopyrightText: 2020-2022 Bruce Cowan <bruce@bcowan.me.uk> * SPDX-FileCopyrightText: 2020-2024 Bruce Cowan <bruce@bcowan.me.uk>
* *
* SPDX-License-Identifier: GPL-3.0-or-later * SPDX-License-Identifier: GPL-3.0-or-later
*/ */
...@@ -12,10 +12,10 @@ ...@@ -12,10 +12,10 @@
G_BEGIN_DECLS G_BEGIN_DECLS
#define RUGBY_TYPE_PREF_WINDOW (rugby_pref_window_get_type()) #define RUGBY_TYPE_PREF_DIALOG (rugby_pref_dialog_get_type())
G_DECLARE_FINAL_TYPE (RugbyPrefWindow, rugby_pref_window, RUGBY, PREF_WINDOW, AdwPreferencesWindow) G_DECLARE_FINAL_TYPE (RugbyPrefDialog, rugby_pref_dialog, RUGBY, PREF_DIALOG, AdwPreferencesDialog)
RugbyPrefWindow *rugby_pref_window_new (RugbyAppWindow *window); RugbyPrefDialog *rugby_pref_dialog_new (void);
G_END_DECLS G_END_DECLS
# SPDX-FileCopyrightText: 2022-2024 Bruce Cowan
#
# SPDX-License-Identifier: CC0-1.0
[wrap-git] [wrap-git]
directory = blueprint-compiler directory = blueprint-compiler
url = https://gitlab.gnome.org/jwestman/blueprint-compiler.git url = https://gitlab.gnome.org/jwestman/blueprint-compiler.git
revision = v0.4.0 revision = v0.14.0
depth = 1 depth = 1
[provide] [provide]
......
{
"app-id": "uk.me.bcowan.Rugby",
"runtime": "org.gnome.Platform",
"runtime-version": "47",
"sdk": "org.gnome.Sdk",
"command": "rugby",
"finish-args": [
"--share=ipc",
"--device=dri",
"--socket=fallback-x11",
"--socket=wayland"
],
"modules": [
{
"name": "blueprint-compiler",
"buildsystem": "meson",
"sources": [
{
"type": "git",
"url": "https://gitlab.gnome.org/jwestman/blueprint-compiler",
"tag": "v0.14.0"
}
]
},
{
"name": "rugby",
"buildsystem": "meson",
"builddir": true,
"sources": [
{
"type": "dir",
"path": "."
}
],
"config-opts": [
"-Dprofile=development"
]
}
]
}
SPDX-FileCopyrightText: 2024 Bruce Cowan <bruce@bcowan.me.uk>
SPDX-License-Identifier: GPL-3.0-or-later