説明で GTK+ C API を使用していることを気にしないでください。ソリューションは PyGTK に簡単に変換でき、原則は同じままです。
2 番目の質問から始めます。テストするウィジェットがわかっている場合は、呼び出しgtk_widget_translate_coordinates(child, parent, 0, 0, &x, &y)
て親に対する子の位置を取得することで、その可視性を検出できます。親と子のサイズをgtk_widget_get_allocation()
取得し、子の四角形全体がスクロールされたウィンドウにあるかどうかをテストするだけです。
gboolean is_visible_in (GtkWidget *child, GtkWidget *scrolled)
{
gint x, y;
GtkAllocation child_alloc, scroll_alloc;
gtk_widget_translate_coordinates (child, scrolled, 0, 0, &x, &y);
gtk_widget_get_allocation(child, &child_alloc);
gtk_widget_get_allocation(scrolled, &scroll_alloc);
return (x >= 0 && y >= 0)
&& x + child_alloc.width <= scroll_alloc.width
&& y + child_alloc.height <= scroll_alloc.height;
}
ウィンドウで現在フォーカスされているウィジェットを取得しgtk_window_get_focus ()
たり、フォーカスが変更されたときにそれを検出したりできます。
自動スクロールの問題"focus"
では、フォーカスできるウィジェットに接続されたシグナル、または"set-focus-child"
ウィジェットを含むコンテナに接続されたイベントを処理できます。シグナル ハンドラーで、フォーカスされたウィジェットが表示されているかどうかを確認する必要があります。そうでない場合は、その位置を決定し、適切にスクロールします。
そのためには、スクロールされた領域全体でウィジェットの位置を検出する必要があります。スクロールをサポートしていないコンテナを使用している場合(ビューポートによって調整されるなどGtkHBox
)GtkScrolledWindow
、コンテナを基準にしてフォーカスされたウィジェットの座標を取得できますgtk_widget_translate_coordinates()
- スクロールされたウィンドウの代わりにコンテナを使用するようになりました。を使用する場合GtkViewport
、調整値はスクロール領域内のピクセル単位の位置に対応するため、調整値を x 相対座標に設定するとスクロールが行われます。したがって、ハンドラーの重要な部分は
GtkWidget *scrolled = /* The scrolled window */
GtkWidget *container = /* The container in the scrolled window */
GtkWidget *focused = /* The focused widget */
GtkAdjustment *hadj = gtk_scrolled_window_get_hadjustment(
GTK_SCROLLED_WINDOW(scrolled));
gint x, y;
gtk_widget_translate_coordinates (focused, container, 0, 0, &x, &y);
gtk_adjustment_set_value(hadj, min(x, maximal adjustment value allowed);
許容される最大の調整値は、adjustment.upper - Adjustment.page_size です。フォーカスされたウィジェットは、両方のシグナルのシグナル ハンドラー引数として渡され"set-focus-child"
ます。シグナルの場合は、コンテナも引数として取得します。