2017-07-07 5 views
0

Ich wundere mich über die scroll_to(TextBuffer::iterator& iter, double within_margin = 0) Parameter dieser Member-Funktion innerhalb_margin. Die API sagt dies:Gtkmm scroll_to() Zweck

Der effektive Bildschirm für die Zwecke dieser Funktion wird durch eine Marge der Größe innerhalb_margin reduziert.
...
Parameter
within_margin Marge als [0.0,0.5] Fraktion von Bildschirmgröße.

Ich verstehe es einfach nicht. Was und wann ändert dieser Parameter das Verhalten? Jede Sprachbindung von Gtk enthält die gleiche Beschreibung. Ich habe eine kleine Anwendung geschrieben, so dass Sie das übergebene Argument selbst ändern können.

#include <gtkmm.h> 
#include <iostream> 
#include <string> 
using namespace std; 

Gtk::TextView* text_view; 
void on_add_button_clicked(); 
void on_scroll_button_clicked(); 

int main(int argc, char* argv[]) { 
    Glib::RefPtr<Gtk::Application> app = Gtk::Application::create(argc, argv, "org.gtkmm.examples.base"); 
    Gtk::Window window; 
    Glib::RefPtr<Gdk::Monitor> primary_monitor = window.get_screen()->get_display()->get_primary_monitor(); 
    Gdk::Rectangle monitor_size; 
    primary_monitor->get_geometry(monitor_size); 
    // half-size of primary-monitor 
    int width = monitor_size.get_width()/2; 
    int height = monitor_size.get_height()/2; 

    window.set_default_size(width, height); 
    window.set_title(__FILE__); 

    Gtk::Grid grid; 
    grid.set_row_spacing(5); 
    grid.set_column_spacing(5); 

    Gtk::ScrolledWindow scroll_window; 
    text_view = new Gtk::TextView(); 
    text_view->set_editable(true); 
    scroll_window.add(*text_view); 
    scroll_window.set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC); 
    scroll_window.set_hexpand(true); 
    scroll_window.set_vexpand(true); 
    Glib::RefPtr<Gtk::TextBuffer> text_buffer = text_view->get_buffer(); 
    text_buffer->set_text("Hello!\n"); 
    text_view->set_buffer(text_buffer); 
    grid.attach(scroll_window, 0, 0, 2, 2); 


    Gtk::Button add_button("add text"); 
    add_button.signal_clicked().connect(sigc::ptr_fun(&on_add_button_clicked)); 
    grid.attach_next_to(add_button, scroll_window, Gtk::POS_BOTTOM, 1, 1); 

    Gtk::Button scroll_button("scroll to somewhere"); 
    scroll_button.signal_clicked().connect(sigc::ptr_fun(&on_scroll_button_clicked)); 
    grid.attach_next_to(scroll_button, add_button, Gtk::POS_RIGHT, 1, 1); 

    window.add(grid); 
    window.show_all(); 

    return app->run(window); 
} 


void on_add_button_clicked() { 
    Glib::RefPtr<Gtk::TextBuffer> text_buffer = text_view->get_buffer(); 
    for (int i = 0; i != 100; ++i) { 
     text_buffer->insert_at_cursor("foobar\n"); 
    } 
} 

void on_scroll_button_clicked() { 
    Glib::RefPtr<Gtk::TextBuffer> text_buffer = text_view->get_buffer(); 
    Gtk::TextBuffer::iterator it = text_buffer->end(); 
    text_view->scroll_to(it, 0.49); 
} 

können Sie den Code mit g++ -o scroll scroll.cpp -Wall -pedantic-errors `pkg-config gtkmm-3.0 --cflags --libs` kompilieren.

Danke

Antwort

1

Wenn margin 0 ist, dann scroll_to() frei ist, das Ziel irgendwo auf dem Bildschirm zu setzen. Wenn margin beispielsweise 0,45 ist, dann wird scroll_to() das Ziel in die Mitte von 10% des Bildschirms setzen, wenn möglich.

Der Grund, warum Sie dies in Ihrem Beispiel nicht sehen, ist, weil Sie zum Ende Iterator scrollen, und es ist nicht möglich, die Ansicht zu scrollen, so dass das Ende des Textes in der Mitte des Bildschirms angezeigt wird. (Einige Textansichten enthalten zusätzlichen Platz nach dem Text, um dies zu ermöglichen; Gtk::TextView nicht.)

+0

Es tut mir leid für eine späte Antwort. Sie haben Recht! – Peter