* Working scrollbars!
* More forward declarations: Compiles faster now
This commit is contained in:
parent
67f1708076
commit
e8e438f5ee
6 changed files with 104 additions and 11 deletions
|
@ -3,6 +3,7 @@
|
||||||
#include <cstdlib>
|
#include <cstdlib>
|
||||||
#include <cmath>
|
#include <cmath>
|
||||||
#include <gtkmm/toolbutton.h>
|
#include <gtkmm/toolbutton.h>
|
||||||
|
#include <gtkmm/adjustment.h>
|
||||||
#include <GL/gl.h>
|
#include <GL/gl.h>
|
||||||
|
|
||||||
namespace ZoomEdit {
|
namespace ZoomEdit {
|
||||||
|
@ -11,7 +12,7 @@ namespace Gui {
|
||||||
GdkGLConfig *RenderArea::glconfig = NULL;
|
GdkGLConfig *RenderArea::glconfig = NULL;
|
||||||
|
|
||||||
RenderArea::RenderArea(BaseObjectType *cobject, const Glib::RefPtr<Gnome::Glade::Xml> &xml)
|
RenderArea::RenderArea(BaseObjectType *cobject, const Glib::RefPtr<Gnome::Glade::Xml> &xml)
|
||||||
: Gtk::DrawingArea(cobject), zoomLevel(0), scale(100), x(0), y(0) {
|
: Gtk::DrawingArea(cobject), zoomLevel(0), scale(100), xCenter(0), yCenter(0) {
|
||||||
if(!glconfig) {
|
if(!glconfig) {
|
||||||
glconfig = gdk_gl_config_new_by_mode((GdkGLConfigMode)(GDK_GL_MODE_RGB | GDK_GL_MODE_DOUBLE));
|
glconfig = gdk_gl_config_new_by_mode((GdkGLConfigMode)(GDK_GL_MODE_RGB | GDK_GL_MODE_DOUBLE));
|
||||||
if(!glconfig) glconfig = gdk_gl_config_new_by_mode(GDK_GL_MODE_RGB); // Hmm, can't find double buffered config
|
if(!glconfig) glconfig = gdk_gl_config_new_by_mode(GDK_GL_MODE_RGB); // Hmm, can't find double buffered config
|
||||||
|
@ -35,6 +36,9 @@ RenderArea::RenderArea(BaseObjectType *cobject, const Glib::RefPtr<Gnome::Glade:
|
||||||
if(button)
|
if(button)
|
||||||
button->signal_clicked().connect(sigc::bind(sigc::mem_fun(this, &RenderArea::zoom), -2, 0.5f, 0.5f));
|
button->signal_clicked().connect(sigc::bind(sigc::mem_fun(this, &RenderArea::zoom), -2, 0.5f, 0.5f));
|
||||||
|
|
||||||
|
xml->get_widget("Hscrollbar", hScrollbar);
|
||||||
|
xml->get_widget("Vscrollbar", vScrollbar);
|
||||||
|
|
||||||
gtk_widget_set_gl_capability(GTK_WIDGET(cobject), glconfig, NULL, TRUE, GDK_GL_RGBA_TYPE);
|
gtk_widget_set_gl_capability(GTK_WIDGET(cobject), glconfig, NULL, TRUE, GDK_GL_RGBA_TYPE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -71,7 +75,7 @@ bool RenderArea::onExposeEvent(GdkEventExpose *event) {
|
||||||
glPushMatrix();
|
glPushMatrix();
|
||||||
|
|
||||||
glScalef(scale, scale, 1);
|
glScalef(scale, scale, 1);
|
||||||
glTranslatef(-x, -y, 0);
|
glTranslatef(-xCenter, -yCenter, 0);
|
||||||
|
|
||||||
|
|
||||||
drawGrid();
|
drawGrid();
|
||||||
|
@ -103,7 +107,7 @@ void RenderArea::zoom(int zoom, float x, float y) {
|
||||||
zoomLevel = std::max(std::min(zoomLevel + zoom, 50), -100);
|
zoomLevel = std::max(std::min(zoomLevel + zoom, 50), -100);
|
||||||
scale = 100*std::pow(1.1f, zoomLevel);
|
scale = 100*std::pow(1.1f, zoomLevel);
|
||||||
|
|
||||||
queue_draw();
|
updateScrollbars(x, y);
|
||||||
}
|
}
|
||||||
|
|
||||||
void RenderArea::updateViewport() {
|
void RenderArea::updateViewport() {
|
||||||
|
@ -120,17 +124,83 @@ void RenderArea::updateViewport() {
|
||||||
|
|
||||||
gdkGLEnd();
|
gdkGLEnd();
|
||||||
|
|
||||||
|
updateScrollbars();
|
||||||
|
}
|
||||||
|
|
||||||
|
void RenderArea::updateScrollbars(float x, float y) {
|
||||||
|
const gdouble imageWidth = getImageWidth(), imageHeight = getImageHeight();
|
||||||
|
const gdouble minX = -imageWidth/2, maxX = imageWidth/2;
|
||||||
|
const gdouble minY = -imageHeight/2, maxY = imageHeight/2;
|
||||||
|
const gdouble width = getViewWidth(), height = getViewHeight();
|
||||||
|
gdouble lower, upper, pageSize, value;
|
||||||
|
|
||||||
|
get_window()->freeze_updates();
|
||||||
|
|
||||||
|
if(hScrollbar) {
|
||||||
|
lower = hScrollbar->get_adjustment()->get_lower();
|
||||||
|
upper = hScrollbar->get_adjustment()->get_upper();
|
||||||
|
pageSize = hScrollbar->get_adjustment()->get_page_size();
|
||||||
|
|
||||||
|
hScrollbar->get_adjustment()->set_lower(minX + width/2);
|
||||||
|
hScrollbar->get_adjustment()->set_upper(maxX + width/2);
|
||||||
|
hScrollbar->get_adjustment()->set_page_size(width);
|
||||||
|
|
||||||
|
if(pageSize > (upper-lower) && width < imageWidth)
|
||||||
|
value = 0;
|
||||||
|
else
|
||||||
|
value = hScrollbar->get_value() + (x-0.5)*(pageSize-width);
|
||||||
|
|
||||||
|
hScrollbar->set_value(std::max(std::min(value, maxX - width/2), minX + width/2));
|
||||||
|
}
|
||||||
|
|
||||||
|
if(vScrollbar) {
|
||||||
|
lower = vScrollbar->get_adjustment()->get_lower();
|
||||||
|
upper = vScrollbar->get_adjustment()->get_upper();
|
||||||
|
pageSize = vScrollbar->get_adjustment()->get_page_size();
|
||||||
|
|
||||||
|
vScrollbar->get_adjustment()->set_lower(minY + height/2);
|
||||||
|
vScrollbar->get_adjustment()->set_upper(maxY + height/2);
|
||||||
|
vScrollbar->get_adjustment()->set_page_size(height);
|
||||||
|
|
||||||
|
if(pageSize > (upper-lower) && height < imageHeight)
|
||||||
|
value = 0;
|
||||||
|
else
|
||||||
|
value = vScrollbar->get_value() + (y-0.5)*(pageSize-height);
|
||||||
|
|
||||||
|
vScrollbar->set_value(std::max(std::min(value, maxY - height/2), minY + height/2));
|
||||||
|
}
|
||||||
|
|
||||||
|
get_window()->thaw_updates();
|
||||||
|
|
||||||
|
updateScrolling();
|
||||||
|
}
|
||||||
|
|
||||||
|
void RenderArea::updateScrolling() {
|
||||||
|
if(hScrollbar) {
|
||||||
|
if(getImageWidth() < getViewWidth())
|
||||||
|
xCenter = 0;
|
||||||
|
else
|
||||||
|
xCenter = hScrollbar->get_value();
|
||||||
|
}
|
||||||
|
|
||||||
|
if(vScrollbar) {
|
||||||
|
if(getImageHeight() < getViewHeight())
|
||||||
|
yCenter = 0;
|
||||||
|
else
|
||||||
|
yCenter = vScrollbar->get_value();
|
||||||
|
}
|
||||||
|
|
||||||
queue_draw();
|
queue_draw();
|
||||||
}
|
}
|
||||||
|
|
||||||
void RenderArea::drawGrid() {
|
void RenderArea::drawGrid() {
|
||||||
float depth = std::log10(scale)-0.75f;
|
float depth = 1.25f + 0.04f*zoomLevel;
|
||||||
float depth2 = std::floor(depth);
|
float depth2 = std::floor(depth);
|
||||||
float step = std::pow(0.1f, depth2);
|
float step = std::pow(0.1f, depth2);
|
||||||
float f;
|
float f;
|
||||||
int i;
|
int i;
|
||||||
float x1 = x-get_width()/(2*scale), y1 = y-get_height()/(2*scale);
|
float x1 = xCenter-getViewWidth()/2, y1 = yCenter-getViewHeight()/2;
|
||||||
float x2 = x+get_width()/(2*scale), y2 = y+get_height()/(2*scale);
|
float x2 = xCenter+getViewWidth()/2, y2 = yCenter+getViewHeight()/2;
|
||||||
|
|
||||||
|
|
||||||
glLineWidth(1.0f);
|
glLineWidth(1.0f);
|
||||||
|
@ -141,12 +211,12 @@ void RenderArea::drawGrid() {
|
||||||
f = std::min(0.4f*(depth-depth2+i), 0.5f);
|
f = std::min(0.4f*(depth-depth2+i), 0.5f);
|
||||||
glColor3f(f, f, f);
|
glColor3f(f, f, f);
|
||||||
|
|
||||||
for(f = x1 - std::fmod(x1, step) - step; f <= x2; f+=step) {
|
for(f = x1 - std::fmod(x1, step); f <= x2; f+=step) {
|
||||||
glVertex2f(f, y1);
|
glVertex2f(f, y1);
|
||||||
glVertex2f(f, y2);
|
glVertex2f(f, y2);
|
||||||
}
|
}
|
||||||
|
|
||||||
for(f = y1 - std::fmod(y1, step) - step; f <= y2; f+=step) {
|
for(f = y1 - std::fmod(y1, step); f <= y2; f+=step) {
|
||||||
glVertex2f(x1, f);
|
glVertex2f(x1, f);
|
||||||
glVertex2f(x2, f);
|
glVertex2f(x2, f);
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
#define ZOOMEDIT_GUI_RENDERAREA_H_
|
#define ZOOMEDIT_GUI_RENDERAREA_H_
|
||||||
|
|
||||||
#include <gtkmm/drawingarea.h>
|
#include <gtkmm/drawingarea.h>
|
||||||
|
#include <gtkmm/scrollbar.h>
|
||||||
#include <libglademm/xml.h>
|
#include <libglademm/xml.h>
|
||||||
#include <gtk/gtkgl.h>
|
#include <gtk/gtkgl.h>
|
||||||
|
|
||||||
|
@ -15,7 +16,10 @@ class RenderArea : public Gtk::DrawingArea {
|
||||||
private:
|
private:
|
||||||
static GdkGLConfig *glconfig;
|
static GdkGLConfig *glconfig;
|
||||||
|
|
||||||
float x, y;
|
Gtk::HScrollbar *hScrollbar;
|
||||||
|
Gtk::VScrollbar *vScrollbar;
|
||||||
|
|
||||||
|
float xCenter, yCenter;
|
||||||
|
|
||||||
int zoomLevel;
|
int zoomLevel;
|
||||||
float scale;
|
float scale;
|
||||||
|
@ -28,9 +32,22 @@ class RenderArea : public Gtk::DrawingArea {
|
||||||
void zoom(int zoom, float x = 0.5f, float y = 0.5f);
|
void zoom(int zoom, float x = 0.5f, float y = 0.5f);
|
||||||
|
|
||||||
void updateViewport();
|
void updateViewport();
|
||||||
|
void updateScrollbars(float x = 0.5f, float y = 0.5f);
|
||||||
|
void updateScrolling();
|
||||||
|
|
||||||
void drawGrid();
|
void drawGrid();
|
||||||
|
|
||||||
|
float getViewWidth() const {
|
||||||
|
return get_width()/scale;
|
||||||
|
}
|
||||||
|
|
||||||
|
float getViewHeight() const {
|
||||||
|
return get_height()/scale;
|
||||||
|
}
|
||||||
|
|
||||||
|
float getImageWidth() const {return 10;}
|
||||||
|
float getImageHeight() const {return 10;}
|
||||||
|
|
||||||
bool gdkGLBegin() {
|
bool gdkGLBegin() {
|
||||||
GtkWidget *widget = GTK_WIDGET(gobj());
|
GtkWidget *widget = GTK_WIDGET(gobj());
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
#include "Window.h"
|
#include "Window.h"
|
||||||
|
#include "RenderArea.h"
|
||||||
|
|
||||||
namespace ZoomEdit {
|
namespace ZoomEdit {
|
||||||
namespace Gui {
|
namespace Gui {
|
||||||
|
|
|
@ -3,11 +3,12 @@
|
||||||
|
|
||||||
#include <gtkmm/window.h>
|
#include <gtkmm/window.h>
|
||||||
#include <libglademm/xml.h>
|
#include <libglademm/xml.h>
|
||||||
#include "RenderArea.h"
|
|
||||||
|
|
||||||
namespace ZoomEdit {
|
namespace ZoomEdit {
|
||||||
namespace Gui {
|
namespace Gui {
|
||||||
|
|
||||||
|
class RenderArea;
|
||||||
|
|
||||||
class Window : public Gtk::Window {
|
class Window : public Gtk::Window {
|
||||||
private:
|
private:
|
||||||
RenderArea *renderArea;
|
RenderArea *renderArea;
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include "Instance.h"
|
#include "Instance.h"
|
||||||
|
#include "Gui/Window.h"
|
||||||
|
|
||||||
namespace ZoomEdit {
|
namespace ZoomEdit {
|
||||||
|
|
||||||
|
|
|
@ -3,10 +3,13 @@
|
||||||
|
|
||||||
#include <gtkmm/main.h>
|
#include <gtkmm/main.h>
|
||||||
#include <libglademm/xml.h>
|
#include <libglademm/xml.h>
|
||||||
#include "Gui/Window.h"
|
|
||||||
|
|
||||||
namespace ZoomEdit {
|
namespace ZoomEdit {
|
||||||
|
|
||||||
|
namespace Gui {
|
||||||
|
class Window;
|
||||||
|
}
|
||||||
|
|
||||||
class Instance {
|
class Instance {
|
||||||
public:
|
public:
|
||||||
virtual ~Instance();
|
virtual ~Instance();
|
||||||
|
|
Reference in a new issue