14#include <gtkmm/enums.h>
15#include <gtkmm/object.h>
16#include <gtkmm/popovermenu.h>
17#include <gtkmm/checkbutton.h>
19#include <sigc++/functors/mem_fun.h>
43 auto result = eval.evaluate();
46 g_message (
"%s", e.
what());
54 Controller::add_key<&SpinButton::on_key_pressed>(*
this, *
this);
71 Unit
const *unit =
nullptr;
80 if (
result.dimension != (unit->isAbsolute() ? 1 : 0) ) {
89 g_message (
"%s", e.
what());
104 unsigned const keyval,
unsigned const keycode,
105 GdkModifierType
const state)
111 constexpr auto modifiers = GDK_SHIFT_MASK | GDK_CONTROL_MASK | GDK_ALT_MASK | GDK_SUPER_MASK | GDK_HYPER_MASK | GDK_META_MASK;
113 if ((state & modifiers) == 0) {
126 case GDK_KEY_KP_Enter:
131 case GDK_KEY_ISO_Left_Tab:
154 case GDK_KEY_KP_Down:
170 auto adj = get_adjustment();
171 adj->set_value(value);
186 auto adj = get_adjustment();
187 auto adj_value =
adj->get_value();
188 auto lower =
adj->get_lower();
189 auto upper =
adj->get_upper();
190 auto page =
adj->get_page_increment();
195 if (custom_data.first >= lower && custom_data.first <= upper) {
196 values.emplace(custom_data);
200 values.emplace(adj_value,
"");
201 values.emplace(std::fmin(adj_value +
page, upper),
"");
202 values.emplace(std::fmax(adj_value -
page, lower),
"");
205 _popover_menu = std::make_unique<UI::Widget::PopoverMenu>(Gtk::PositionType::BOTTOM);
210 Gtk::CheckButton *group =
nullptr;
212 for (
auto const &value : values) {
213 bool const enable = adj_value == value.first;
214 auto const item_label = !value.second.empty() ?
Glib::ustring::compose(
"%1: %2", value.first, value.second)
216 auto const radio_button = Gtk::make_managed<Gtk::CheckButton>(item_label);
218 group = radio_button;
220 radio_button->set_group(*group);
222 radio_button->set_active(enable);
224 auto const item = Gtk::make_managed<UI::Widget::PopoverMenuItem>();
225 item->set_child(*radio_button);
256 widget->grab_focus();
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.
SymmetricMatrix< N > adj(const ConstBaseSymmetricMatrix< N > &S)
D2< T > compose(D2< T > const &a, T const &b)
iter inc(iter const &x, unsigned n)
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)