Changeset 157


Ignore:
Timestamp:
Aug 22, 2010, 6:28:25 AM (10 years ago)
Author:
sam
Message:

Implement scrolling in the GTK window using the scrollbars.

Location:
trunk/src
Files:
4 edited

Legend:

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

    r155 r157  
    2323static float const FPS = 30.0f;
    2424
     25static MapViewer *mv;
     26static GtkWidget *glarea;
     27static GtkAdjustment *hadj, *vadj;
     28
    2529static gint main_quit(GtkWidget *widget, GdkEventExpose *event)
    2630{
     
    4347    ticking = 1;
    4448
     49    mv->SetPOV(gtk_adjustment_get_value(hadj), gtk_adjustment_get_value(vadj));
     50
    4551    /* Tick the game */
    4652    Ticker::TickGame();
     
    5359static gint init(GtkWidget *widget)
    5460{
     61    struct
     62    {
     63        GtkAdjustment *adj;
     64        float map_size, sw_size;
     65    }
     66    s[2] =
     67    {
     68        { hadj, mv->GetWidth(), widget->allocation.width },
     69        { vadj, mv->GetHeight(), widget->allocation.height },
     70    };
     71
     72    for (int i = 0; i < 2; i++)
     73    {
     74        gtk_adjustment_set_lower(s[i].adj, 0);
     75        gtk_adjustment_set_upper(s[i].adj, s[i].map_size);
     76        gtk_adjustment_set_step_increment(s[i].adj, 1);
     77        gtk_adjustment_set_page_increment(s[i].adj, s[i].sw_size);
     78        gtk_adjustment_set_page_size(s[i].adj, s[i].sw_size);
     79
     80        float hval = gtk_adjustment_get_value(s[i].adj);
     81        if (hval + s[i].sw_size > s[i].map_size)
     82        {
     83            gtk_adjustment_set_value(s[i].adj, s[i].map_size - s[i].sw_size);
     84            gtk_adjustment_value_changed(s[i].adj);
     85        }
     86    }
     87
    5588    if (gtk_gl_area_make_current(GTK_GL_AREA(widget)))
    5689        Video::Setup(widget->allocation.width, widget->allocation.height);
     
    5992}
    6093
    61 static gint reshape(GtkWidget *widget, GdkEventConfigure *event)
     94static gint reshape_gl(GtkWidget *widget, GdkEventConfigure *event)
    6295{
    6396    (void)event;
     
    101134    }
    102135
    103     /* Build the rest of the application */
     136    /* Build the application interface and keep a few member pointers */
    104137    GtkBuilder *builder = gtk_builder_new();
    105138    if (!gtk_builder_add_from_file(builder, "src/gtk/editor.xml", NULL))
     
    110143
    111144    GtkWidget *window = GTK_WIDGET(gtk_builder_get_object(builder, "window1"));
    112     GtkWidget *sw = GTK_WIDGET(gtk_builder_get_object(builder, "sw1"));
     145    GtkWidget *viewport = GTK_WIDGET(
     146                              gtk_builder_get_object(builder, "viewport1"));
     147    hadj = gtk_range_get_adjustment(GTK_RANGE(
     148                              gtk_builder_get_object(builder, "hscrollbar1")));
     149    vadj = gtk_range_get_adjustment(GTK_RANGE(
     150                              gtk_builder_get_object(builder, "vscrollbar1")));
    113151    g_object_unref(G_OBJECT(builder));
    114152
     
    124162    };
    125163
    126     GtkWidget *glarea = gtk_gl_area_new(attrlist);
     164    glarea = gtk_gl_area_new(attrlist);
     165    gtk_widget_set_usize(glarea, 400, 300);
    127166    gtk_widget_set_events(glarea, GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK);
    128     gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(sw), glarea);
     167    gtk_container_add(GTK_CONTAINER(viewport), glarea);
    129168
    130169    /* Connect signals and show window */
    131170    gtk_signal_connect(GTK_OBJECT(window), "delete_event",
    132171                       GTK_SIGNAL_FUNC(main_quit), NULL);
     172
    133173    gtk_signal_connect(GTK_OBJECT(glarea), "expose_event",
    134174                       GTK_SIGNAL_FUNC(draw), NULL);
    135175    gtk_signal_connect(GTK_OBJECT(glarea), "configure_event",
    136                        GTK_SIGNAL_FUNC(reshape), NULL);
     176                       GTK_SIGNAL_FUNC(reshape_gl), NULL);
    137177    gtk_signal_connect(GTK_OBJECT(glarea), "realize",
    138178                       GTK_SIGNAL_FUNC(init), NULL);
    139179
    140     gtk_widget_show_all(window);
    141 
    142180    // FIXME: detect when the map viewer is killed
    143     new MapViewer("maps/testmap.tmx");
     181    mv = new MapViewer("maps/testmap.tmx");
    144182    new DebugFps();
    145183
     
    147185     * stealing time from the GTK loop when the callback time exceeds
    148186     * the timeout value. */
     187    gtk_widget_show_all(window);
    149188    gtk_idle_add(tick, glarea);
    150189    gtk_main();
  • trunk/src/gtk/editor.xml

    r155 r157  
    154154            <property name="can_focus">True</property>
    155155            <child>
    156               <object class="GtkScrolledWindow" id="sw1">
    157                 <property name="width_request">640</property>
    158                 <property name="height_request">480</property>
    159                 <property name="visible">True</property>
    160                 <property name="can_focus">True</property>
     156              <object class="GtkTable" id="table2">
     157                <property name="visible">True</property>
     158                <property name="n_rows">2</property>
     159                <property name="n_columns">2</property>
     160                <child>
     161                  <object class="GtkHScrollbar" id="hscrollbar1">
     162                    <property name="visible">True</property>
     163                  </object>
     164                  <packing>
     165                    <property name="top_attach">1</property>
     166                    <property name="bottom_attach">2</property>
     167                    <property name="y_options">GTK_SHRINK</property>
     168                  </packing>
     169                </child>
     170                <child>
     171                  <object class="GtkVScrollbar" id="vscrollbar1">
     172                    <property name="visible">True</property>
     173                    <property name="orientation">vertical</property>
     174                  </object>
     175                  <packing>
     176                    <property name="left_attach">1</property>
     177                    <property name="right_attach">2</property>
     178                    <property name="x_options">GTK_SHRINK</property>
     179                  </packing>
     180                </child>
     181                <child>
     182                  <object class="GtkViewport" id="viewport1">
     183                    <property name="visible">True</property>
     184                    <property name="resize_mode">queue</property>
     185                    <child>
     186                      <placeholder/>
     187                    </child>
     188                  </object>
     189                  <packing>
     190                    <property name="x_options">GTK_EXPAND | GTK_SHRINK | GTK_FILL</property>
     191                    <property name="y_options">GTK_EXPAND | GTK_SHRINK | GTK_FILL</property>
     192                  </packing>
     193                </child>
     194                <child>
     195                  <placeholder/>
     196                </child>
    161197              </object>
    162198              <packing>
     
    167203            <child>
    168204              <object class="GtkLabel" id="label1">
     205                <property name="width_request">150</property>
    169206                <property name="visible">True</property>
    170207                <property name="label" translatable="yes">Palette will be here  </property>
    171208              </object>
    172209              <packing>
    173                 <property name="resize">True</property>
    174                 <property name="shrink">True</property>
     210                <property name="resize">False</property>
     211                <property name="shrink">False</property>
    175212              </packing>
    176213            </child>
  • trunk/src/mapviewer.cpp

    r155 r157  
    2323    Map *map;
    2424    int x, y;
    25     int mousex, mousey;
     25    int povx, povy;
    2626    int done;
    2727
     
    6464    GetScene();
    6565
    66     data->map->Render(data->scene, -data->mousex, -data->mousey, 0);
     66    data->map->Render(data->scene, -data->povx, -data->povy, 0);
    6767    data->scene->Render();
    6868
     
    7878}
    7979
    80 void MapViewer::SetMouse(int x, int y)
     80int MapViewer::GetWidth()
    8181{
    82     data->mousex = x;
    83     data->mousey = y;
     82    return data->map->GetWidth();
    8483}
    8584
     85int MapViewer::GetHeight()
     86{
     87    return data->map->GetHeight();
     88}
     89
     90void MapViewer::SetPOV(int x, int y)
     91{
     92    data->povx = x;
     93    data->povy = y;
     94}
     95
  • trunk/src/mapviewer.h

    r155 r157  
    3232    /* New methods */
    3333    Scene *GetScene();
    34     void SetMouse(int x, int y);
     34    int GetWidth();
     35    int GetHeight();
     36    void SetPOV(int x, int y);
    3537
    3638private:
Note: See TracChangeset for help on using the changeset viewer.