Changeset 159


Ignore:
Timestamp:
Aug 22, 2010, 6:02:17 PM (10 years ago)
Author:
sam
Message:

Allow the sprite viewer window to pan.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/gtk/editor.cpp

    r157 r159  
    2121
    2222static int ticking = 0;
     23static int panning = 0;
     24static double xpan = 0.0f, ypan = 0.0f;
    2325static float const FPS = 30.0f;
    2426
     
    5759}
    5860
     61static gboolean mouse_button(GtkWidget *widget, GdkEventButton *event,
     62                                                gpointer user_data)
     63{
     64    if (event->type == GDK_BUTTON_PRESS && event->button == 2)
     65    {
     66        panning = 1;
     67        xpan = event->x;
     68        ypan = event->y;
     69        GdkCursor *cursor = gdk_cursor_new(GDK_HAND1);
     70        gdk_window_set_cursor(widget->window, cursor);
     71        gdk_cursor_unref(cursor);
     72        return FALSE;
     73    }
     74    else if (event->type == GDK_BUTTON_RELEASE && event->button == 2)
     75    {
     76        panning = 0;
     77        gdk_window_set_cursor(widget->window, NULL);
     78        return FALSE;
     79    }
     80
     81    return TRUE;
     82}
     83
     84static gboolean mouse_motion(GtkWidget *widget, GdkEventMotion *event,
     85                                                gpointer user_data)
     86{
     87    if (panning)
     88    {
     89        if (event->x != xpan)
     90        {
     91            double val = gtk_adjustment_get_value(hadj);
     92            val += xpan - event->x;
     93            xpan = event->x;
     94            if (val + widget->allocation.width > mv->GetWidth())
     95                val = mv->GetWidth() - widget->allocation.width;
     96            gtk_adjustment_set_value(hadj, val);
     97            gtk_adjustment_value_changed(hadj);
     98        }
     99
     100        if (event->y != ypan)
     101        {
     102            double val = gtk_adjustment_get_value(vadj);
     103            val += ypan - event->y;
     104            ypan = event->y;
     105            if (val + widget->allocation.height > mv->GetHeight())
     106                val = mv->GetHeight() - widget->allocation.height;
     107            gtk_adjustment_set_value(vadj, val);
     108            gtk_adjustment_value_changed(vadj);
     109        }
     110    }
     111
     112    return TRUE;
     113}
     114
    59115static gint init(GtkWidget *widget)
    60116{
     117    /* Manage adjustments */
    61118    struct
    62119    {
     
    78135        gtk_adjustment_set_page_size(s[i].adj, s[i].sw_size);
    79136
    80         float hval = gtk_adjustment_get_value(s[i].adj);
    81         if (hval + s[i].sw_size > s[i].map_size)
     137        float val = gtk_adjustment_get_value(s[i].adj);
     138        if (val + s[i].sw_size > s[i].map_size)
    82139        {
    83140            gtk_adjustment_set_value(s[i].adj, s[i].map_size - s[i].sw_size);
     
    86143    }
    87144
     145    /* Set up display */
    88146    if (gtk_gl_area_make_current(GTK_GL_AREA(widget)))
    89147        Video::Setup(widget->allocation.width, widget->allocation.height);
     
    92150}
    93151
    94 static gint reshape_gl(GtkWidget *widget, GdkEventConfigure *event)
     152static gint reshape(GtkWidget *widget, GdkEventConfigure *event)
    95153{
    96154    (void)event;
     
    164222    glarea = gtk_gl_area_new(attrlist);
    165223    gtk_widget_set_usize(glarea, 400, 300);
    166     gtk_widget_set_events(glarea, GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK);
     224    gtk_widget_set_events(glarea, GDK_EXPOSURE_MASK | GDK_POINTER_MOTION_MASK
     225                           | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK);
    167226    gtk_container_add(GTK_CONTAINER(viewport), glarea);
     227
     228    /* We tick from the idle function instead of a timeout to avoid
     229     * stealing time from the GTK loop when the callback time exceeds
     230     * the timeout value. */
     231    gtk_idle_add(tick, glarea);
    168232
    169233    /* Connect signals and show window */
     
    174238                       GTK_SIGNAL_FUNC(draw), NULL);
    175239    gtk_signal_connect(GTK_OBJECT(glarea), "configure_event",
    176                        GTK_SIGNAL_FUNC(reshape_gl), NULL);
     240                       GTK_SIGNAL_FUNC(reshape), NULL);
    177241    gtk_signal_connect(GTK_OBJECT(glarea), "realize",
    178242                       GTK_SIGNAL_FUNC(init), NULL);
     243    gtk_signal_connect(GTK_OBJECT(glarea), "button_press_event",
     244                       GTK_SIGNAL_FUNC(mouse_button), NULL);
     245    gtk_signal_connect(GTK_OBJECT(glarea), "button_release_event",
     246                       GTK_SIGNAL_FUNC(mouse_button), NULL);
     247    gtk_signal_connect(GTK_OBJECT(glarea), "motion_notify_event",
     248                       GTK_SIGNAL_FUNC(mouse_motion), NULL);
    179249
    180250    // FIXME: detect when the map viewer is killed
     
    182252    new DebugFps();
    183253
    184     /* We tick from the idle function instead of a timeout to avoid
    185      * stealing time from the GTK loop when the callback time exceeds
    186      * the timeout value. */
    187254    gtk_widget_show_all(window);
    188     gtk_idle_add(tick, glarea);
    189255    gtk_main();
    190256
Note: See TracChangeset for help on using the changeset viewer.