From adaa18cd299cb896d56f174fd83413cd92272fa0 Mon Sep 17 00:00:00 2001 From: Alexander Valavanis Date: Wed, 5 Dec 2018 22:11:03 +0000 Subject: desktop-widget: C++ify rotation_status --- src/widgets/desktop-widget.cpp | 220 ++++++++++++++--------------------------- 1 file changed, 76 insertions(+), 144 deletions(-) (limited to 'src/widgets/desktop-widget.cpp') diff --git a/src/widgets/desktop-widget.cpp b/src/widgets/desktop-widget.cpp index e11618abf..515a8a076 100644 --- a/src/widgets/desktop-widget.cpp +++ b/src/widgets/desktop-widget.cpp @@ -113,14 +113,8 @@ static void sp_desktop_widget_adjustment_value_changed (GtkAdjustment *adj, SPDe static gdouble sp_dtw_zoom_value_to_display (gdouble value); static gdouble sp_dtw_zoom_display_to_value (gdouble value); -static void sp_dtw_zoom_value_changed (GtkSpinButton *spin, gpointer data); static void sp_dtw_zoom_menu_handler (SPDesktop *dt, gdouble factor); -static gint sp_dtw_rotation_input (GtkSpinButton *spin, gdouble *new_val, gpointer data); -static bool sp_dtw_rotation_output (GtkSpinButton *spin, gpointer data); -static void sp_dtw_rotation_value_changed (GtkSpinButton *spin, gpointer data); -static void sp_dtw_rotation_populate_popup (GtkEntry *entry, GtkMenu *menu, gpointer data); - SPViewWidgetClass *dtw_parent_class; class CMSPrefWatcher { @@ -622,28 +616,28 @@ void SPDesktopWidget::init( SPDesktopWidget *dtw ) context_zoom->add_provider(css_provider_spinbutton, GTK_STYLE_PROVIDER_PRIORITY_APPLICATION); // Rotate status spinbutton --------------- - dtw->rotation_status = gtk_spin_button_new_with_range (-360.0,360.0, 1.0); - g_object_set_data (G_OBJECT (dtw->rotation_status), "dtw", dtw->canvas); - gtk_widget_set_tooltip_text (dtw->rotation_status, _("Rotation. (Also Ctrl+Shift+Scroll)")); - gtk_widget_set_size_request (dtw->rotation_status, STATUS_ROTATION_WIDTH, -1); - gtk_entry_set_width_chars (GTK_ENTRY (dtw->rotation_status), 7); - gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (dtw->rotation_status), FALSE); - gtk_spin_button_set_digits (GTK_SPIN_BUTTON (dtw->rotation_status), 2); - gtk_spin_button_set_increments (GTK_SPIN_BUTTON (dtw->rotation_status), 1.0, 15.0); - gtk_spin_button_set_update_policy (GTK_SPIN_BUTTON (dtw->rotation_status), GTK_UPDATE_ALWAYS); + auto rotation_adj = Gtk::Adjustment::create(0, -360.0, 360.0, 1.0); + dtw->_rotation_status = Gtk::manage(new Gtk::SpinButton(rotation_adj)); + dtw->_rotation_status->set_data("dtw", dtw->canvas); + dtw->_rotation_status->set_tooltip_text(_("Rotation. (Also Ctrl+Shift+Scroll)")); + dtw->_rotation_status->set_size_request(STATUS_ROTATION_WIDTH, -1); + dtw->_rotation_status->set_width_chars(7); + dtw->_rotation_status->set_numeric(false); + dtw->_rotation_status->set_digits(2); + dtw->_rotation_status->set_increments(1.0, 15.0); + dtw->_rotation_status->set_update_policy(Gtk::UPDATE_ALWAYS); // Callbacks - g_signal_connect (G_OBJECT (dtw->rotation_status), "input", G_CALLBACK (sp_dtw_rotation_input), dtw); - g_signal_connect (G_OBJECT (dtw->rotation_status), "output", G_CALLBACK (sp_dtw_rotation_output), dtw); - g_signal_connect (G_OBJECT (dtw->rotation_status), "focus-in-event", G_CALLBACK (spinbutton_focus_in), dtw->rotation_status); - g_signal_connect (G_OBJECT (dtw->rotation_status), "key-press-event", G_CALLBACK (spinbutton_keypress), dtw->rotation_status); - dtw->rotation_update = g_signal_connect (G_OBJECT (dtw->rotation_status), "value_changed", G_CALLBACK (sp_dtw_rotation_value_changed), dtw); - g_signal_connect (G_OBJECT (dtw->rotation_status), "populate_popup", G_CALLBACK (sp_dtw_rotation_populate_popup), dtw); + dtw->_rotation_status_input_connection = dtw->_rotation_status->signal_input().connect(sigc::mem_fun(dtw, &SPDesktopWidget::rotation_input)); + dtw->_rotation_status_output_connection = dtw->_rotation_status->signal_output().connect(sigc::mem_fun(dtw, &SPDesktopWidget::rotation_output)); + g_signal_connect (G_OBJECT (dtw->_rotation_status->gobj()), "focus-in-event", G_CALLBACK (spinbutton_focus_in), dtw->_rotation_status->gobj()); + g_signal_connect (G_OBJECT (dtw->_rotation_status->gobj()), "key-press-event", G_CALLBACK (spinbutton_keypress), dtw->_rotation_status->gobj()); + dtw->_rotation_status_value_changed_connection = dtw->_rotation_status->signal_value_changed().connect(sigc::mem_fun(dtw, &SPDesktopWidget::rotation_value_changed)); + dtw->_rotation_status_populate_popup_connection = dtw->_rotation_status->signal_populate_popup().connect(sigc::mem_fun(dtw, &SPDesktopWidget::rotation_populate_popup)); // Style - auto rotstat = Glib::wrap(dtw->rotation_status); - rotstat->set_name("RotationStatus"); - auto context_rotation = rotstat->get_style_context(); + dtw->_rotation_status->set_name("RotationStatus"); + auto context_rotation = dtw->_rotation_status->get_style_context(); context_rotation->add_provider(css_provider_spinbutton, GTK_STYLE_PROVIDER_PRIORITY_APPLICATION); @@ -681,7 +675,7 @@ void SPDesktopWidget::init( SPDesktopWidget *dtw ) dtw->_coord_status->attach(*label_z, 3, 0, 1, 2); dtw->_coord_status->attach(*label_r, 5, 0, 1, 2); dtw->_coord_status->attach(*dtw->_zoom_status, 4, 0, 1, 2); - dtw->_coord_status->attach(*Glib::wrap(dtw->rotation_status), 6, 0, 1, 2); + dtw->_coord_status->attach(*dtw->_rotation_status, 6, 0, 1, 2); sp_set_font_size_smaller(GTK_WIDGET(dtw->_coord_status->gobj())); @@ -754,11 +748,11 @@ SPDesktopWidget::dispose(GObject *object) dtw->_zoom_status_populate_popup_connection.disconnect(); // Rotation - g_signal_handlers_disconnect_by_func(G_OBJECT (dtw->rotation_status), (gpointer) G_CALLBACK(sp_dtw_rotation_input), dtw); - g_signal_handlers_disconnect_by_func(G_OBJECT (dtw->rotation_status), (gpointer) G_CALLBACK(sp_dtw_rotation_output), dtw); - g_signal_handlers_disconnect_matched (G_OBJECT (dtw->rotation_status), G_SIGNAL_MATCH_DATA, 0, 0, nullptr, nullptr, dtw->rotation_status); - g_signal_handlers_disconnect_by_func (G_OBJECT (dtw->rotation_status), (gpointer) G_CALLBACK (sp_dtw_rotation_value_changed), dtw); - g_signal_handlers_disconnect_by_func (G_OBJECT (dtw->rotation_status), (gpointer) G_CALLBACK (sp_dtw_rotation_populate_popup), dtw); + dtw->_rotation_status_input_connection.disconnect(); + dtw->_rotation_status_output_connection.disconnect(); + g_signal_handlers_disconnect_matched (G_OBJECT (dtw->_rotation_status->gobj()), G_SIGNAL_MATCH_DATA, 0, 0, nullptr, nullptr, dtw->_rotation_status); + dtw->_rotation_status_value_changed_connection.disconnect(); + dtw->_rotation_status_populate_popup_connection.disconnect(); // Canvas g_signal_handlers_disconnect_by_func (G_OBJECT (dtw->canvas), (gpointer) G_CALLBACK (sp_desktop_widget_event), dtw); @@ -1961,10 +1955,10 @@ SPDesktopWidget::update_zoom() // ---------------------- Rotation ------------------------ -static gint -sp_dtw_rotation_input (GtkSpinButton *spin, gdouble *new_val, gpointer /*data*/) +int +SPDesktopWidget::rotation_input(double *new_val) { - gchar *b = g_strdup (gtk_entry_get_text (GTK_ENTRY (spin))); + auto *b = g_strdup(_rotation_status->get_text().c_str()); gchar *comma = g_strstr_len (b, -1, ","); if (comma) { @@ -1979,150 +1973,88 @@ sp_dtw_rotation_input (GtkSpinButton *spin, gdouble *new_val, gpointer /*data*/) g_free (b); *new_val = new_value; - return TRUE; + return true; } -static bool -sp_dtw_rotation_output (GtkSpinButton *spin, gpointer /*data*/) +bool +SPDesktopWidget::rotation_output() { gchar b[64]; - double val = gtk_spin_button_get_value (spin); + double val = _rotation_status->get_value(); if (val < -180) val += 360; if (val > 180) val -= 360; g_snprintf (b, 64, "%7.2f°", val); - gtk_entry_set_text (GTK_ENTRY (spin), b); - return TRUE; + _rotation_status->set_text(b); + return true; } -static void -sp_dtw_rotation_value_changed (GtkSpinButton *spin, gpointer data) +void +SPDesktopWidget::rotation_value_changed() { - double const rotate_factor = M_PI / 180.0 * gtk_spin_button_get_value (spin); - // std::cout << "sp_dtw_rotation_value_changed: " - // << gtk_spin_button_get_value (spin) + double const rotate_factor = M_PI / 180.0 * _rotation_status->get_value(); + // std::cout << "SPDesktopWidget::rotation_value_changed: " + // << _rotation_status->get_value() // << " (" << rotate_factor << ")" <desktop; - // Rotate around center of window Geom::Rect const d_canvas = desktop->getCanvas()->getViewbox(); - g_signal_handler_block(spin, dtw->rotation_update); + _rotation_status_value_changed_connection.block(); Geom::Point midpoint = desktop->w2d(d_canvas.midpoint()); desktop->rotate_absolute_center_point (midpoint, rotate_factor); - g_signal_handler_unblock(spin, dtw->rotation_update); - - spinbutton_defocus (GTK_WIDGET(spin)); -} - -static void -sp_dtw_rotate_minus_135 (GtkMenuItem */*item*/, SPDesktopWidget * data) -{ - gtk_spin_button_set_value (GTK_SPIN_BUTTON((data)->rotation_status), -135); -} - -static void -sp_dtw_rotate_minus_90 (GtkMenuItem */*item*/, SPDesktopWidget * data) -{ - gtk_spin_button_set_value (GTK_SPIN_BUTTON((data)->rotation_status), -90); -} + _rotation_status_value_changed_connection.unblock(); -static void -sp_dtw_rotate_minus_45 (GtkMenuItem */*item*/, SPDesktopWidget * data) -{ - gtk_spin_button_set_value (GTK_SPIN_BUTTON((data)->rotation_status), -45); -} - -static void -sp_dtw_rotate_0 (GtkMenuItem */*item*/,SPDesktopWidget * data) -{ - gtk_spin_button_set_value (GTK_SPIN_BUTTON((data)->rotation_status), 0); -} - -static void -sp_dtw_rotate_45 (GtkMenuItem */*item*/, SPDesktopWidget * data) -{ - gtk_spin_button_set_value (GTK_SPIN_BUTTON((data)->rotation_status), 45); -} - -static void -sp_dtw_rotate_90 (GtkMenuItem */*item*/, SPDesktopWidget * data) -{ - gtk_spin_button_set_value (GTK_SPIN_BUTTON((data)->rotation_status), 90); -} - -static void -sp_dtw_rotate_135 (GtkMenuItem */*item*/, SPDesktopWidget * data) -{ - gtk_spin_button_set_value (GTK_SPIN_BUTTON((data)->rotation_status), 135); -} - -static void -sp_dtw_rotate_180 (GtkMenuItem */*item*/, SPDesktopWidget * data) -{ - gtk_spin_button_set_value (GTK_SPIN_BUTTON((data)->rotation_status),180); + spinbutton_defocus(GTK_WIDGET(_rotation_status->gobj())); } void -sp_dtw_rotation_populate_popup (GtkEntry */*entry*/, GtkMenu *menu, gpointer data) +SPDesktopWidget::rotation_populate_popup(Gtk::Menu *menu) { - SPDesktopWidget *dtw = static_cast(data); - - std::vector children = Glib::wrap(GTK_CONTAINER(menu))->get_children(); - for ( auto iter : children) { - Glib::wrap(GTK_CONTAINER(menu))->remove(*iter); + for ( auto iter : menu->get_children()) { + menu->remove(*iter); } - GtkWidget *item; - - item = gtk_menu_item_new_with_label ("-135°"); - g_signal_connect (G_OBJECT (item), "activate", G_CALLBACK (sp_dtw_rotate_minus_135), dtw); - gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); - - item = gtk_menu_item_new_with_label ("-90°"); - g_signal_connect (G_OBJECT (item), "activate", G_CALLBACK (sp_dtw_rotate_minus_90), dtw); - gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); - - item = gtk_menu_item_new_with_label ("-45°"); - g_signal_connect (G_OBJECT (item), "activate", G_CALLBACK (sp_dtw_rotate_minus_45), dtw); - gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); + auto item_m135 = Gtk::manage(new Gtk::MenuItem("-135°")); + auto item_m90 = Gtk::manage(new Gtk::MenuItem( "-90°")); + auto item_m45 = Gtk::manage(new Gtk::MenuItem( "-45°")); + auto item_0 = Gtk::manage(new Gtk::MenuItem( "0°")); + auto item_p45 = Gtk::manage(new Gtk::MenuItem( "45°")); + auto item_p90 = Gtk::manage(new Gtk::MenuItem( "90°")); + auto item_p135 = Gtk::manage(new Gtk::MenuItem( "135°")); + auto item_p180 = Gtk::manage(new Gtk::MenuItem( "180°")); + + item_m135->signal_activate().connect(sigc::bind(sigc::mem_fun(_rotation_status, &Gtk::SpinButton::set_value), -135)); + item_m90->signal_activate().connect( sigc::bind(sigc::mem_fun(_rotation_status, &Gtk::SpinButton::set_value), -90)); + item_m45->signal_activate().connect( sigc::bind(sigc::mem_fun(_rotation_status, &Gtk::SpinButton::set_value), -45)); + item_0->signal_activate().connect( sigc::bind(sigc::mem_fun(_rotation_status, &Gtk::SpinButton::set_value), 0)); + item_p45->signal_activate().connect( sigc::bind(sigc::mem_fun(_rotation_status, &Gtk::SpinButton::set_value), 45)); + item_p90->signal_activate().connect( sigc::bind(sigc::mem_fun(_rotation_status, &Gtk::SpinButton::set_value), 90)); + item_p135->signal_activate().connect(sigc::bind(sigc::mem_fun(_rotation_status, &Gtk::SpinButton::set_value), 135)); + item_p180->signal_activate().connect(sigc::bind(sigc::mem_fun(_rotation_status, &Gtk::SpinButton::set_value), 180)); + + menu->append(*item_m135); + menu->append(*item_m90); + menu->append(*item_m45); + menu->append(*item_0); + menu->append(*item_p45); + menu->append(*item_p90); + menu->append(*item_p135); + menu->append(*item_p180); - item = gtk_menu_item_new_with_label ("0°"); - g_signal_connect (G_OBJECT (item), "activate", G_CALLBACK (sp_dtw_rotate_0), dtw); - gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); - - item = gtk_menu_item_new_with_label ("45°"); - g_signal_connect (G_OBJECT (item), "activate", G_CALLBACK (sp_dtw_rotate_45), dtw); - gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); - - item = gtk_menu_item_new_with_label ("90°"); - g_signal_connect (G_OBJECT (item), "activate", G_CALLBACK (sp_dtw_rotate_90), dtw); - gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); - - item = gtk_menu_item_new_with_label ("135°"); - g_signal_connect (G_OBJECT (item), "activate", G_CALLBACK (sp_dtw_rotate_135), dtw); - gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); - - item = gtk_menu_item_new_with_label ("180°"); - g_signal_connect (G_OBJECT (item), "activate", G_CALLBACK (sp_dtw_rotate_180), dtw); - gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); - - gtk_widget_show_all (GTK_WIDGET (menu)); + menu->show_all(); } void -sp_desktop_widget_update_rotation (SPDesktopWidget *dtw) +SPDesktopWidget::update_rotation() { - GdkWindow *window = gtk_widget_get_window(GTK_WIDGET(dtw->rotation_status)); + _rotation_status_value_changed_connection.block(); + _rotation_status->set_value(desktop->current_rotation() / M_PI * 180.0); + _rotation_status->queue_draw(); + _rotation_status_value_changed_connection.unblock(); - g_signal_handler_block(G_OBJECT(dtw->rotation_status), dtw->rotation_update); - gtk_spin_button_set_value (GTK_SPIN_BUTTON (dtw->rotation_status), dtw->desktop->current_rotation() / M_PI * 180.0); - gtk_widget_queue_draw(GTK_WIDGET(dtw->rotation_status)); - g_signal_handler_unblock(G_OBJECT(dtw->rotation_status), dtw->rotation_update); } -- cgit v1.2.3