From 37732d5ccae97d80a9083ae295af018f154edb5a Mon Sep 17 00:00:00 2001 From: Felix Morgner Date: Sun, 14 Jul 2024 16:39:58 +0200 Subject: domain: add basic turn order type --- CMakeLists.txt | 11 +++++--- app/include/turns/app/windows/main.hpp | 4 +-- app/src/windows/main.cpp | 9 +++---- domain/CMakeLists.txt | 2 ++ domain/include/turns/domain/participant.hpp | 4 +-- domain/include/turns/domain/turn_order.hpp | 26 +++++++++++++++++++ domain/src/participant.cpp | 10 +++----- domain/src/turn_order.cpp | 40 +++++++++++++++++++++++++++++ domain/tests/participant.cpp | 6 ++--- 9 files changed, 91 insertions(+), 21 deletions(-) create mode 100644 domain/include/turns/domain/turn_order.hpp create mode 100644 domain/src/turn_order.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 03b69c8..10c2d9e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -29,6 +29,10 @@ set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/lib") set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/lib") set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/bin") +set(GLIB_MINIMUM_VERSION "2.80") +set(GTK4_MINIMUM_VERSION "4.14") +set(LIBADWAITA_MINIMUM_VERSION "1.5") + # Build options option(TURNS_USE_INSTALLED_TRANSLATIONS "Use the installed translation files" ON) @@ -49,9 +53,10 @@ FetchContent_MakeAvailable("Catch2") find_package("Catch2" REQUIRED) -pkg_check_modules("glibmm" IMPORTED_TARGET REQUIRED "glibmm-2.68>=2.80") -pkg_check_modules("gtkmm" IMPORTED_TARGET REQUIRED "gtkmm-4.0>=4.14") -pkg_check_modules("adwaita" IMPORTED_TARGET REQUIRED "libadwaita-1>=1.5.0") +pkg_check_modules("adwaita" IMPORTED_TARGET REQUIRED "libadwaita-1>=${LIBADWAITA_MINIMUM_VERSION}") +pkg_check_modules("giomm" IMPORTED_TARGET REQUIRED "giomm-2.68>=${GLIB_MINIMUM_VERSION}") +pkg_check_modules("glibmm" IMPORTED_TARGET REQUIRED "glibmm-2.68>=${GLIB_MINIMUM_VERSION}") +pkg_check_modules("gtkmm" IMPORTED_TARGET REQUIRED "gtkmm-4.0>=${GTK4_MINIMUM_VERSION}") include("Catch") diff --git a/app/include/turns/app/windows/main.hpp b/app/include/turns/app/windows/main.hpp index a73c966..d98e1a8 100644 --- a/app/include/turns/app/windows/main.hpp +++ b/app/include/turns/app/windows/main.hpp @@ -1,7 +1,7 @@ #ifndef TURNS_APP_WINDOWS_MAIN_WINDOW_HPP #define TURNS_APP_WINDOWS_MAIN_WINDOW_HPP -#include "turns/domain/participant.hpp" +#include "turns/domain/turn_order.hpp" #include #include @@ -31,7 +31,7 @@ namespace turns::app::windows Gtk::ListBox * m_participant_list; AdwWindowTitle * m_title; - Glib::RefPtr> m_participants; + Glib::RefPtr m_participants; }; } // namespace turns::app::windows diff --git a/app/src/windows/main.cpp b/app/src/windows/main.cpp index d248229..bb8d55e 100644 --- a/app/src/windows/main.cpp +++ b/app/src/windows/main.cpp @@ -21,7 +21,7 @@ namespace turns::app::windows , m_open_main_menu{builder->get_widget("open_main_menu")} , m_participant_list{builder->get_widget("participant_list")} , m_title(ADW_WINDOW_TITLE(builder->get_widget("title")->gobj())) - , m_participants{Gio::ListStore::create()} + , m_participants{domain::turn_order::create()} { m_add_participant->set_tooltip_text(_(lang::add_participant)); m_open_main_menu->set_tooltip_text(_(lang::main_menu)); @@ -29,14 +29,13 @@ namespace turns::app::windows m_add_participant->signal_clicked().connect(sigc::mem_fun(*this, &main::handle_create_participant)); + m_participant_list->bind_model(m_participants, sigc::mem_fun(*this, &main::handle_create_list_row)); + for (auto n : std::views::iota(0, 32)) { auto name = std::format("Participant #{}", n); - auto participant = domain::participant::create(name, n); - m_participants->append(participant); + m_participants->append(name, n); } - - m_participant_list->bind_model(m_participants, sigc::mem_fun(*this, &main::handle_create_list_row)); } auto main::handle_create_list_row(Glib::RefPtr const item) -> Gtk::Widget * diff --git a/domain/CMakeLists.txt b/domain/CMakeLists.txt index 2de847a..066f638 100644 --- a/domain/CMakeLists.txt +++ b/domain/CMakeLists.txt @@ -2,6 +2,7 @@ add_library("domain" "src/participant.cpp" + "src/turn_order.cpp" ) add_library("turns::domain" ALIAS "domain") @@ -24,6 +25,7 @@ target_include_directories("domain" PUBLIC target_link_libraries("domain" PUBLIC "$<$,$>:gcov>" + "PkgConfig::giomm" "PkgConfig::glibmm" ) diff --git a/domain/include/turns/domain/participant.hpp b/domain/include/turns/domain/participant.hpp index 7c047ea..934e0bb 100644 --- a/domain/include/turns/domain/participant.hpp +++ b/domain/include/turns/domain/participant.hpp @@ -22,8 +22,8 @@ namespace turns::domain auto property_name() -> Glib::PropertyProxy; auto property_name() const -> Glib::PropertyProxy_ReadOnly; - auto property_over_value() -> Glib::PropertyProxy; - auto property_over_value() const -> Glib::PropertyProxy_ReadOnly; + auto property_order_value() -> Glib::PropertyProxy; + auto property_order_value() const -> Glib::PropertyProxy_ReadOnly; private: Glib::Property m_name; diff --git a/domain/include/turns/domain/turn_order.hpp b/domain/include/turns/domain/turn_order.hpp new file mode 100644 index 0000000..8c9afa7 --- /dev/null +++ b/domain/include/turns/domain/turn_order.hpp @@ -0,0 +1,26 @@ +#ifndef TURNS_DOMAIN_TURN_ORDER_HPP +#define TURNS_DOMAIN_TURN_ORDER_HPP + +#include "turns/domain/participant.hpp" + +#include +#include +#include + +namespace turns::domain +{ + + struct turn_order : Gio::ListStore + { + using super = Gio::ListStore; + using super::super; + + auto static create() -> Glib::RefPtr; + + auto append(Glib::ustring const & name, float order_value) -> turn_order &; + auto sort() -> void; + }; + +} // namespace turns::domain + +#endif \ No newline at end of file diff --git a/domain/src/participant.cpp b/domain/src/participant.cpp index 8b16916..b52bcca 100644 --- a/domain/src/participant.cpp +++ b/domain/src/participant.cpp @@ -13,11 +13,9 @@ namespace turns::domain participant::participant(Glib::ustring name, float order_value) : Glib::ObjectBase{typeid(participant)} - , m_name{*this, "name"} - , m_order_value{*this, "order_value"} + , m_name{*this, "name", name} + , m_order_value{*this, "order_value", order_value} { - m_name = name; - m_order_value = order_value; } auto participant::operator<=>(participant const & other) const noexcept -> std::partial_ordering @@ -35,12 +33,12 @@ namespace turns::domain return m_name.get_proxy(); } - auto participant::property_over_value() -> Glib::PropertyProxy + auto participant::property_order_value() -> Glib::PropertyProxy { return m_order_value.get_proxy(); } - auto participant::property_over_value() const -> Glib::PropertyProxy_ReadOnly + auto participant::property_order_value() const -> Glib::PropertyProxy_ReadOnly { return m_order_value.get_proxy(); } diff --git a/domain/src/turn_order.cpp b/domain/src/turn_order.cpp new file mode 100644 index 0000000..8b9e042 --- /dev/null +++ b/domain/src/turn_order.cpp @@ -0,0 +1,40 @@ +#include "turns/domain/turn_order.hpp" + +namespace turns::domain +{ + + namespace + { + auto constexpr comparator = [](auto lhs, auto rhs){ + auto result = *lhs <=> *rhs; + if(result == std::partial_ordering::equivalent || result == std::partial_ordering::unordered) + { + return 0; + } + else if(result == std::partial_ordering::less) + { + return 1; + } + return -1; + }; + } + + auto turn_order::create() -> Glib::RefPtr + { + return Glib::make_refptr_for_instance(new turn_order{}); + } + + auto turn_order::append(Glib::ustring const & name, float order_value) -> turn_order & + { + auto participant = participant::create(name, order_value); + participant->property_order_value().signal_changed().connect([this] { sort(); }); + insert_sorted(participant, comparator); + return *this; + } + + auto turn_order::sort() -> void + { + super::sort(comparator); + } + +} // namespace turns::domain \ No newline at end of file diff --git a/domain/tests/participant.cpp b/domain/tests/participant.cpp index aa6ddcb..4f32aa0 100644 --- a/domain/tests/participant.cpp +++ b/domain/tests/participant.cpp @@ -33,13 +33,13 @@ namespace turns::domain::tests SECTION("the order can be read") { - REQUIRE(instance.property_over_value() == constructed_order); + REQUIRE(instance.property_order_value() == constructed_order); } SECTION("the order can be changed") { - instance.property_over_value() = 8; - REQUIRE(instance.property_over_value() == 8); + instance.property_order_value() = 8; + REQUIRE(instance.property_order_value() == 8); } SECTION("can be compared with another participant") -- cgit v1.2.3