Skip to content
Snippets Groups Projects
Commit 0e45d14f authored by Bruce Cowan's avatar Bruce Cowan :airplane:
Browse files

Initial port to GTK 4

parent d6effb8c
No related branches found
No related tags found
No related merge requests found
...@@ -14,9 +14,9 @@ flatpak: ...@@ -14,9 +14,9 @@ flatpak:
script: script:
- dnf install -y flatpak-builder - dnf install -y flatpak-builder
- flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo - flatpak remote-add --if-not-exists gnome-nightly https://nightly.gnome.org/gnome-nightly.flatpakrepo
- flatpak install -y flathub org.gnome.Platform 3.38 - flatpak install -y gnome-nightly org.gnome.Platform
- flatpak install -y flathub org.gnome.Sdk 3.38 - flatpak install -y gnome-nightly org.gnome.Sdk
- flatpak-builder --stop-at=${FLATPAK_MODULE} app ${MANIFEST_PATH} - flatpak-builder --stop-at=${FLATPAK_MODULE} app ${MANIFEST_PATH}
- flatpak build app meson --prefix=/app ${MESON_ARGS} _build - flatpak build app meson --prefix=/app ${MESON_ARGS} _build
- flatpak build app ninja -C _build install - flatpak build app ninja -C _build install
......
# SPDX-FileCopyrightText: 2018-2020 Bruce Cowan <bruce@bcowan.me.uk> # SPDX-FileCopyrightText: 2018-2021 Bruce Cowan <bruce@bcowan.me.uk>
# #
# SPDX-License-Identifier: CC0-1.0 # SPDX-License-Identifier: CC0-1.0
app-id: uk.me.bcowan.Rugby app-id: uk.me.bcowan.Rugby
runtime: org.gnome.Platform runtime: org.gnome.Platform
runtime-version: "3.38" runtime-version: "master"
sdk: org.gnome.Sdk sdk: org.gnome.Sdk
command: rugby command: rugby
......
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.22.0 -->
<!-- <!--
SPDX-FileCopyrightText: 2012-2020 Bruce Cowan <bruce@bcowan.me.uk> SPDX-FileCopyrightText: 2012-2020 Bruce Cowan <bruce@bcowan.me.uk>
SPDX-License-Identifier: GPL-3.0-or-later SPDX-License-Identifier: GPL-3.0-or-later
--> -->
<interface> <interface>
<requires lib="gtk+" version="3.16"/> <requires lib="gtk" version="4.0"/>
<object class="GtkAdjustment" id="adjustment1"> <object class="GtkAdjustment" id="adjustment1">
<property name="upper">200</property> <property name="upper">200</property>
<property name="step_increment">1</property> <property name="step_increment">1</property>
<property name="page_increment">10</property> <property name="page_increment">10</property>
</object> </object>
<object class="GtkPopoverMenu" id="popovermenu1"> <menu id="menu">
<property name="can_focus">False</property> <section>
<child> <item>
<object class="GtkGrid"> <attribute name="label" translatable="yes">_Preferences</attribute>
<property name="visible">True</property> <attribute name="action">app.prefs</attribute>
<property name="can_focus">False</property> </item>
<property name="margin_start">6</property> </section>
<property name="margin_end">6</property> <section>
<property name="margin_top">6</property> <item>
<property name="margin_bottom">6</property> <attribute name="label" translatable="yes">_About Rugby</attribute>
<child> <attribute name="action">app.about</attribute>
<object class="GtkModelButton"> </item>
<property name="visible">True</property> </section>
<property name="can_focus">True</property> </menu>
<property name="receives_default">True</property>
<property name="action_name">app.about</property>
<property name="text" translatable="yes">_About Rugby</property>
</object>
<packing>
<property name="left_attach">0</property>
<property name="top_attach">1</property>
</packing>
</child>
<child>
<object class="GtkModelButton">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="action_name">app.prefs</property>
<property name="text" translatable="yes">_Preferences</property>
</object>
<packing>
<property name="left_attach">0</property>
<property name="top_attach">0</property>
</packing>
</child>
</object>
<packing>
<property name="submenu">main</property>
</packing>
</child>
</object>
<template class="RugbyAppWindow" parent="GtkApplicationWindow"> <template class="RugbyAppWindow" parent="GtkApplicationWindow">
<property name="can_focus">False</property> <property name="can_focus">0</property>
<property name="title" translatable="yes">Rugby</property>
<child> <child>
<object class="GtkScrolledWindow"> <object class="GtkScrolledWindow">
<property name="height_request">400</property> <property name="height_request">400</property>
<property name="visible">True</property> <property name="child">
<property name="can_focus">True</property>
<property name="shadow_type">in</property>
<child>
<object class="GtkViewport"> <object class="GtkViewport">
<property name="visible">True</property> <property name="can_focus">0</property>
<property name="can_focus">False</property> <property name="child">
<child>
<object class="GtkListBox" id="listbox"> <object class="GtkListBox" id="listbox">
<property name="visible">True</property> <property name="can_focus">0</property>
<property name="can_focus">False</property>
<property name="selection_mode">none</property> <property name="selection_mode">none</property>
</object> </object>
</child> </property>
</object> </object>
</child> </property>
</object> </object>
</child> </child>
<child type="titlebar"> <child type="titlebar">
<object class="GtkHeaderBar"> <object class="GtkHeaderBar">
<property name="visible">True</property> <property name="can_focus">0</property>
<property name="can_focus">False</property>
<property name="title" translatable="yes">Rugby</property>
<property name="show_close_button">True</property>
<child> <child>
<object class="GtkLabel"> <object class="GtkLabel">
<property name="visible">True</property> <property name="can_focus">0</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">Score:</property> <property name="label" translatable="yes">Score:</property>
</object> </object>
</child> </child>
<child> <child>
<object class="GtkSpinButton" id="scorespin"> <object class="GtkSpinButton" id="scorespin">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="text" translatable="yes">0</property> <property name="text" translatable="yes">0</property>
<property name="adjustment">adjustment1</property> <property name="adjustment">adjustment1</property>
</object> </object>
<packing>
<property name="position">1</property>
</packing>
</child> </child>
<child> <child type="end">
<object class="GtkMenuButton"> <object class="GtkMenuButton" id="menu_button">
<property name="visible">True</property> <property name="direction">none</property>
<property name="can_focus">True</property> <property name="menu_model">menu</property>
<property name="receives_default">True</property>
<property name="popover">popovermenu1</property>
<child>
<object class="GtkImage">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="icon_name">open-menu</property>
</object>
</child>
</object> </object>
<packing>
<property name="pack_type">end</property>
<property name="position">2</property>
</packing>
</child> </child>
</object> </object>
</child> </child>
</template> </template>
</interface> </interface>
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.22.0 -->
<!-- <!--
SPDX-FileCopyrightText: 2020 Bruce Cowan <bruce@bcowan.me.uk> SPDX-FileCopyrightText: 2020 Bruce Cowan <bruce@bcowan.me.uk>
SPDX-License-Identifier: GPL-3.0-or-later SPDX-License-Identifier: GPL-3.0-or-later
--> -->
<interface> <interface>
<requires lib="gtk+" version="3.16"/> <requires lib="gtk" version="4.0"/>
<object class="GtkAdjustment" id="adjustment1"> <object class="GtkAdjustment" id="adjustment1">
<property name="lower">1</property> <property name="lower">1</property>
<property name="upper">7</property> <property name="upper">7</property>
...@@ -29,13 +28,11 @@ ...@@ -29,13 +28,11 @@
<property name="page_increment">1</property> <property name="page_increment">1</property>
</object> </object>
<template class="RugbyPrefWindow" parent="GtkWindow"> <template class="RugbyPrefWindow" parent="GtkWindow">
<property name="can_focus">False</property> <property name="can_focus">0</property>
<property name="title">Preferences</property> <property name="title">Preferences</property>
<property name="type_hint">dialog</property> <property name="child">
<child>
<object class="GtkGrid"> <object class="GtkGrid">
<property name="visible">True</property> <property name="can_focus">0</property>
<property name="can_focus">False</property>
<property name="margin_start">18</property> <property name="margin_start">18</property>
<property name="margin_end">18</property> <property name="margin_end">18</property>
<property name="margin_top">18</property> <property name="margin_top">18</property>
...@@ -44,81 +41,72 @@ ...@@ -44,81 +41,72 @@
<property name="column_spacing">12</property> <property name="column_spacing">12</property>
<child> <child>
<object class="GtkLabel"> <object class="GtkLabel">
<property name="visible">True</property> <property name="can_focus">0</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">Points for a _converted try</property> <property name="label" translatable="yes">Points for a _converted try</property>
<property name="use_underline">True</property> <property name="use_underline">1</property>
<property name="mnemonic_widget">try_spin</property> <property name="mnemonic_widget">try_spin</property>
<property name="xalign">1</property> <property name="xalign">1</property>
<layout>
<property name="column">0</property>
<property name="row">0</property>
</layout>
</object> </object>
<packing>
<property name="left_attach">0</property>
<property name="top_attach">0</property>
</packing>
</child> </child>
<child> <child>
<object class="GtkLabel"> <object class="GtkLabel">
<property name="visible">True</property> <property name="can_focus">0</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">Points for an _unconverted try</property> <property name="label" translatable="yes">Points for an _unconverted try</property>
<property name="use_underline">True</property> <property name="use_underline">1</property>
<property name="mnemonic_widget">utry_spin</property> <property name="mnemonic_widget">utry_spin</property>
<property name="xalign">1</property> <property name="xalign">1</property>
<layout>
<property name="column">0</property>
<property name="row">1</property>
</layout>
</object> </object>
<packing>
<property name="left_attach">0</property>
<property name="top_attach">1</property>
</packing>
</child> </child>
<child> <child>
<object class="GtkLabel"> <object class="GtkLabel">
<property name="visible">True</property> <property name="can_focus">0</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">Points for a _kick</property> <property name="label" translatable="yes">Points for a _kick</property>
<property name="use_underline">True</property> <property name="use_underline">1</property>
<property name="mnemonic_widget">kick_spin</property> <property name="mnemonic_widget">kick_spin</property>
<property name="xalign">1</property> <property name="xalign">1</property>
<layout>
<property name="column">0</property>
<property name="row">2</property>
</layout>
</object> </object>
<packing>
<property name="left_attach">0</property>
<property name="top_attach">2</property>
</packing>
</child> </child>
<child> <child>
<object class="GtkSpinButton" id="try_spin"> <object class="GtkSpinButton" id="try_spin">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="adjustment">adjustment1</property> <property name="adjustment">adjustment1</property>
<layout>
<property name="column">1</property>
<property name="row">0</property>
</layout>
</object> </object>
<packing>
<property name="left_attach">1</property>
<property name="top_attach">0</property>
</packing>
</child> </child>
<child> <child>
<object class="GtkSpinButton" id="utry_spin"> <object class="GtkSpinButton" id="utry_spin">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="adjustment">adjustment2</property> <property name="adjustment">adjustment2</property>
<layout>
<property name="column">1</property>
<property name="row">1</property>
</layout>
</object> </object>
<packing>
<property name="left_attach">1</property>
<property name="top_attach">1</property>
</packing>
</child> </child>
<child> <child>
<object class="GtkSpinButton" id="kick_spin"> <object class="GtkSpinButton" id="kick_spin">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="adjustment">adjustment3</property> <property name="adjustment">adjustment3</property>
<layout>
<property name="column">1</property>
<property name="row">2</property>
</layout>
</object> </object>
<packing>
<property name="left_attach">1</property>
<property name="top_attach">2</property>
</packing>
</child> </child>
</object> </object>
</child> </property>
<child type="titlebar"> <child type="titlebar">
<placeholder/> <placeholder/>
</child> </child>
......
# SPDX-FileCopyrightText: 2016-2020 Bruce Cowan <bruce@bcowan.me.uk> # SPDX-FileCopyrightText: 2016-2021 Bruce Cowan <bruce@bcowan.me.uk>
# #
# SPDX-License-Identifier: CC0-1.0 # SPDX-License-Identifier: CC0-1.0
...@@ -12,7 +12,7 @@ datadir = get_option('datadir') ...@@ -12,7 +12,7 @@ datadir = get_option('datadir')
gnome = import('gnome') gnome = import('gnome')
gio_dep = dependency('gio-2.0', version: '>= 2.44') gio_dep = dependency('gio-2.0', version: '>= 2.44')
gtk_dep = dependency('gtk+-3.0', version: '>= 3.16') gtk_dep = dependency('gtk4', version: '>= 4.0')
conf = configuration_data() conf = configuration_data()
conf.set_quoted('VERSION','@VCS_TAG@') conf.set_quoted('VERSION','@VCS_TAG@')
...@@ -30,8 +30,9 @@ config_h = declare_dependency( ...@@ -30,8 +30,9 @@ config_h = declare_dependency(
cflags = [] cflags = []
cflags += ['-DGLIB_VERSION_MIN_REQUIRED=GLIB_VERSION_2_44', cflags += ['-DGLIB_VERSION_MIN_REQUIRED=GLIB_VERSION_2_44',
'-DGLIB_VERSION_MAX_ALLOWED=GLIB_VERSION_2_44'] '-DGLIB_VERSION_MAX_ALLOWED=GLIB_VERSION_2_44']
cflags += ['-DGDK_VERSION_MIN_REQUIRED=GDK_VERSION_3_16', cflags += ['-DGDK_VERSION_MIN_REQUIRED=GDK_VERSION_4_0',
'-DGDK_VERSION_MAX_ALLOWED=GDK_VERSION_3_16'] '-DGDK_VERSION_MAX_ALLOWED=GDK_VERSION_4_0']
cflags += '-Wno-overlength-strings' cflags += '-Wno-overlength-strings'
cc = meson.get_compiler('c') cc = meson.get_compiler('c')
......
...@@ -72,9 +72,9 @@ on_startup (GApplication *app, ...@@ -72,9 +72,9 @@ on_startup (GApplication *app,
g_autoptr (GtkCssProvider) provider = gtk_css_provider_new (); g_autoptr (GtkCssProvider) provider = gtk_css_provider_new ();
gtk_css_provider_load_from_resource (provider, "/uk/me/bcowan/rugby/rugby.css"); gtk_css_provider_load_from_resource (provider, "/uk/me/bcowan/rugby/rugby.css");
gtk_style_context_add_provider_for_screen (gdk_screen_get_default (), gtk_style_context_add_provider_for_display (gdk_display_get_default (),
GTK_STYLE_PROVIDER (provider), GTK_STYLE_PROVIDER (provider),
GTK_STYLE_PROVIDER_PRIORITY_APPLICATION); GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
} }
int int
......
/* /*
* SPDX-FileCopyrightText: 2018, 2020 Bruce Cowan <bruce@bcowan.me.uk> * SPDX-FileCopyrightText: 2018-2021 Bruce Cowan <bruce@bcowan.me.uk>
*
* SPDX-License-Identifier: GPL-3.0-or-later * SPDX-License-Identifier: GPL-3.0-or-later
*/ */
...@@ -10,6 +11,7 @@ struct _RugbyPossibilityWidget ...@@ -10,6 +11,7 @@ struct _RugbyPossibilityWidget
{ {
GtkDrawingArea parent_instance; GtkDrawingArea parent_instance;
GSettings *settings;
RugbyPossibility *possibility; RugbyPossibility *possibility;
}; };
...@@ -31,6 +33,7 @@ rugby_possibility_widget_dispose (GObject *object) ...@@ -31,6 +33,7 @@ rugby_possibility_widget_dispose (GObject *object)
{ {
RugbyPossibilityWidget *self = RUGBY_POSSIBILITY_WIDGET (object); RugbyPossibilityWidget *self = RUGBY_POSSIBILITY_WIDGET (object);
g_clear_object (&self->settings);
g_clear_object (&self->possibility); g_clear_object (&self->possibility);
G_OBJECT_CLASS (rugby_possibility_widget_parent_class)->dispose (object); G_OBJECT_CLASS (rugby_possibility_widget_parent_class)->dispose (object);
...@@ -73,14 +76,20 @@ rugby_possibility_widget_set_property (GObject *object, ...@@ -73,14 +76,20 @@ rugby_possibility_widget_set_property (GObject *object,
} }
static void static void
rugby_possibility_widget_get_preferred_height (G_GNUC_UNUSED GtkWidget *widget, rugby_possibility_widget_measure (G_GNUC_UNUSED GtkWidget *widget,
int *minimum_height, GtkOrientation orientation,
int *natural_height) G_GNUC_UNUSED int for_size,
int *minimum,
int *natural,
G_GNUC_UNUSED int *minimum_baseline,
G_GNUC_UNUSED int *natural_baseline)
{ {
if (minimum_height) if (orientation == GTK_ORIENTATION_VERTICAL)
*minimum_height = FIXED_HEIGHT; {
if (natural_height) *minimum = FIXED_HEIGHT;
*natural_height = FIXED_HEIGHT; *natural = FIXED_HEIGHT;
}
} }
static void static void
...@@ -98,21 +107,23 @@ render_bar (cairo_t *cr, ...@@ -98,21 +107,23 @@ render_bar (cairo_t *cr,
gtk_style_context_restore (context); gtk_style_context_restore (context);
} }
static gboolean static void
rugby_possibility_widget_draw (GtkWidget *widget, draw_func (GtkDrawingArea *drawing_area,
cairo_t *cr) cairo_t *cr,
int width,
int height,
G_GNUC_UNUSED gpointer user_data)
{ {
RugbyPossibilityWidget *self = RUGBY_POSSIBILITY_WIDGET (widget); RugbyPossibilityWidget *self = RUGBY_POSSIBILITY_WIDGET (drawing_area);
double width = gtk_widget_get_allocated_width (widget);
double height = gtk_widget_get_allocated_height (widget);
double x = 0.0, y = 0.0;
GtkStyleContext *context = gtk_widget_get_style_context (widget); GtkStyleContext *context = gtk_widget_get_style_context (GTK_WIDGET (drawing_area));
gtk_style_context_save (context); gtk_widget_add_css_class (GTK_WIDGET (drawing_area), "possibility");
gtk_style_context_add_class (context, "possibility");
gtk_render_background (context, cr, x, y, width, height); double x = 0.0;
gtk_render_background (context, cr, x, 0.0, width, height);
int try_points = g_settings_get_int (self->settings, "try-points");
int utry_points = g_settings_get_int (self->settings, "utry-points");
int kick_points = g_settings_get_int (self->settings, "kick-points");
int tries, utries, kicks; int tries, utries, kicks;
...@@ -121,37 +132,33 @@ rugby_possibility_widget_draw (GtkWidget *widget, ...@@ -121,37 +132,33 @@ rugby_possibility_widget_draw (GtkWidget *widget,
"utries", &utries, "utries", &utries,
"kicks", &kicks, "kicks", &kicks,
NULL); NULL);
int score = tries * 7 + utries * 5 + kicks * 3; int score = tries * try_points + utries * utry_points + kicks * kick_points;
gtk_style_context_add_class (context, "score-block"); gtk_widget_add_css_class (GTK_WIDGET (drawing_area), "score-block");
// Tries // Tries
double w = width / (score / 7.0); double w = width / (score / (double) try_points);
for (int i = 0; i < tries; i++) for (int i = 0; i < tries; i++)
{ {
render_bar (cr, context, x, y, w, height, "try"); render_bar (cr, context, x, 0.0, w, height, "try");
x += w; x += w;
} }
// Unconverted tries // Unconverted tries
w = width / (score / 5.0); w = width / (score / (double) utry_points);
for (int i = 0; i < utries; i++) for (int i = 0; i < utries; i++)
{ {
render_bar (cr, context, x, y, w, height, "utry"); render_bar (cr, context, x, 0.0, w, height, "utry");
x += w; x += w;
} }
// Unconverted kicks // Unconverted kicks
w = width / (score / 3.0); w = width / (score / (double) kick_points);
for (int i = 0; i < kicks; i++) for (int i = 0; i < kicks; i++)
{ {
render_bar (cr, context, x, y, w, height, "kick"); render_bar (cr, context, x, 0.0, w, height, "kick");
x += w; x += w;
} }
gtk_style_context_restore (context);
return TRUE;
} }
static void static void
...@@ -195,8 +202,7 @@ rugby_possibility_widget_class_init (RugbyPossibilityWidgetClass *klass) ...@@ -195,8 +202,7 @@ rugby_possibility_widget_class_init (RugbyPossibilityWidgetClass *klass)
object_class->get_property = rugby_possibility_widget_get_property; object_class->get_property = rugby_possibility_widget_get_property;
object_class->set_property = rugby_possibility_widget_set_property; object_class->set_property = rugby_possibility_widget_set_property;
widget_class->draw = rugby_possibility_widget_draw; widget_class->measure = rugby_possibility_widget_measure;
widget_class->get_preferred_height = rugby_possibility_widget_get_preferred_height;
properties[PROP_POSSIBILITY] = g_param_spec_object ("possibility", properties[PROP_POSSIBILITY] = g_param_spec_object ("possibility",
"Possibility", "Possibility",
...@@ -210,8 +216,12 @@ rugby_possibility_widget_class_init (RugbyPossibilityWidgetClass *klass) ...@@ -210,8 +216,12 @@ rugby_possibility_widget_class_init (RugbyPossibilityWidgetClass *klass)
} }
static void static void
rugby_possibility_widget_init (G_GNUC_UNUSED RugbyPossibilityWidget *self) rugby_possibility_widget_init (RugbyPossibilityWidget *self)
{ {
gtk_drawing_area_set_draw_func (GTK_DRAWING_AREA (self),
draw_func, NULL, NULL);
self->settings = g_settings_new ("uk.me.bcowan.Rugby");
} }
GtkWidget * GtkWidget *
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment