14#include <gtkmm/adjustment.h>
15#include <gtkmm/enums.h>
16#include <gtkmm/eventcontrollerfocus.h>
17#include <gtkmm/eventcontrollerkey.h>
18#include <gtkmm/object.h>
19#include <gtkmm/popovermenu.h>
20#include <gtkmm/checkbutton.h>
22#include <sigc++/functors/mem_fun.h>
49 g_message (
"%s", e.
what());
57 auto const key = Gtk::EventControllerKey::create();
59 key->set_propagation_phase(Gtk::PropagationPhase::CAPTURE);
62 auto focus = Gtk::EventControllerFocus::create();
63 focus->signal_enter().connect([
this] {
67 add_controller(focus);
83 Unit const *unit =
nullptr;
91 if (
result.dimension != (unit->isAbsolute() ? 1 : 0) ) {
99 g_message (
"%s", e.
what());
107 unsigned keyval,
unsigned keycode, Gdk::ModifierType state)
113 constexpr auto modifiers = Gdk::ModifierType::SHIFT_MASK |
114 Gdk::ModifierType::CONTROL_MASK |
115 Gdk::ModifierType::ALT_MASK |
116 Gdk::ModifierType::SUPER_MASK |
117 Gdk::ModifierType::HYPER_MASK |
118 Gdk::ModifierType::META_MASK;
133 case GDK_KEY_KP_Enter:
154 case GDK_KEY_KP_Down:
170 get_adjustment()->set_value(value);
185 auto adj = get_adjustment();
186 auto adj_value = adj->get_value();
187 auto lower = adj->get_lower();
188 auto upper = adj->get_upper();
189 auto page = adj->get_page_increment();
194 if (custom_data.first >= lower && custom_data.first <= upper) {
195 values.emplace(custom_data);
199 values.emplace(adj_value,
"");
200 values.emplace(std::fmin(adj_value +
page, upper),
"");
201 values.emplace(std::fmax(adj_value -
page, lower),
"");
204 _popover_menu = std::make_unique<UI::Widget::PopoverMenu>(Gtk::PositionType::BOTTOM);
209 Gtk::CheckButton *group =
nullptr;
211 for (
auto const &value : values) {
212 bool const enable = adj_value == value.first;
213 auto const item_label = !value.second.empty() ? Glib::ustring::compose(
"%1: %2", value.first, value.second)
215 auto const radio_button = Gtk::make_managed<Gtk::CheckButton>(item_label);
217 group = radio_button;
219 radio_button->set_group(*group);
221 radio_button->set_active(enable);
223 auto const item = Gtk::make_managed<UI::Widget::PopoverMenuItem>();
224 item->set_child(*radio_button);
256 widget->grab_focus();
virtual void onDefocus()=0
Special exception class for the expression evaluator.
const char * what() const noexcept override
EvaluatorQuantity evaluate()
Evaluates the given arithmetic expression, along with an optional dimension analysis,...
Utilities to more easily use Gtk::EventController & subclasses like Gesture.
TODO: insert short description here.
bool has_flag(Gdk::ModifierType const state, Gdk::ModifierType const flags)
Helper to query if ModifierType state contains one or more of given flag(s).
void on_popup_menu(Gtk::Widget &widget, PopupMenuSlot slot)
Connect slot to a widgetʼs key and button events that traditionally trigger a popup menu,...
std::optional< PopupMenuClick > PopupMenuOptionalClick
Optional: not present if popup wasnʼt triggered by click.
Glib::ustring format_classic(T const &... args)
static cairo_user_data_key_t key