zoomedit:

* Removed scrollbars, allowing endless movement now
This commit is contained in:
neoraider 2008-04-16 19:13:03 +00:00
parent b90de8c582
commit a87e0ede82
6 changed files with 24 additions and 126 deletions

View file

@ -32,7 +32,7 @@ namespace Gui {
GdkGLConfig *RenderArea::glconfig = 0; GdkGLConfig *RenderArea::glconfig = 0;
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), view(0), xCenter(0), yCenter(0), zoomLevel(0), scale(100) { : Gtk::DrawingArea(cobject), view(0), xCenter(0), yCenter(0), viewWidth(0), viewHeight(0), zoomLevel(0), scale(100) {
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
@ -54,12 +54,6 @@ RenderArea::RenderArea(BaseObjectType *cobject, const Glib::RefPtr<Gnome::Glade:
xml->get_widget("ToolButtonZoomOut", button); xml->get_widget("ToolButtonZoomOut", 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);
hScrollbar->signal_value_changed().connect(sigc::mem_fun(this, &RenderArea::updateScrolling));
xml->get_widget("Vscrollbar", vScrollbar);
vScrollbar->signal_value_changed().connect(sigc::mem_fun(this, &RenderArea::updateScrolling));
gtk_widget_set_gl_capability(GTK_WIDGET(cobject), glconfig, 0, TRUE, GDK_GL_RGBA_TYPE); gtk_widget_set_gl_capability(GTK_WIDGET(cobject), glconfig, 0, TRUE, GDK_GL_RGBA_TYPE);
} }
@ -127,7 +121,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);
updateScrollbars(x, y); updateScrolling(x, y);
} }
void RenderArea::updateViewport() { void RenderArea::updateViewport() {
@ -144,75 +138,17 @@ void RenderArea::updateViewport() {
gdkGLEnd(); gdkGLEnd();
updateScrollbars();
}
void RenderArea::updateScrollbars(float x, float y) {
float minX, maxX, minY, maxY;
const gdouble width = getViewWidth(), height = getViewHeight();
gdouble lower, upper, pageSize, value;
if(!view)
return;
view->getBounds(&minX, &maxX, &minY, &maxY);
float xVal = std::max(std::fabs(minX), std::fabs(maxX));
float yVal = std::max(std::fabs(minY), std::fabs(maxY));
get_window()->freeze_updates();
lower = hScrollbar->get_adjustment()->get_lower();
upper = hScrollbar->get_adjustment()->get_upper();
pageSize = hScrollbar->get_adjustment()->get_page_size();
hScrollbar->get_adjustment()->set_lower(-xVal + width/2);
hScrollbar->get_adjustment()->set_upper(xVal + width/2);
hScrollbar->get_adjustment()->set_page_size(width);
if(pageSize > (upper-lower) && width < 2*xVal)
value = 0;
else
value = hScrollbar->get_value() + (x-0.5)*(pageSize-width);
hScrollbar->set_value(std::max(std::min(value, xVal - width/2), -xVal + width/2));
lower = vScrollbar->get_adjustment()->get_lower();
upper = vScrollbar->get_adjustment()->get_upper();
pageSize = vScrollbar->get_adjustment()->get_page_size();
vScrollbar->get_adjustment()->set_lower(-yVal + height/2);
vScrollbar->get_adjustment()->set_upper(yVal + height/2);
vScrollbar->get_adjustment()->set_page_size(height);
if(pageSize > (upper-lower) && height < 2*yVal)
value = 0;
else
value = vScrollbar->get_value() + (y-0.5)*(pageSize-height);
vScrollbar->set_value(std::max(std::min(value, yVal - height/2), -yVal + height/2));
get_window()->thaw_updates();
updateScrolling(); updateScrolling();
} }
void RenderArea::updateScrolling() { void RenderArea::updateScrolling(float x, float y) {
const float imageWidth = hScrollbar->get_adjustment()->get_upper()-hScrollbar->get_adjustment()->get_lower(); const float newWidth = get_width()/scale, newHeight = get_height()/scale;
const float imageHeight = vScrollbar->get_adjustment()->get_upper()-vScrollbar->get_adjustment()->get_lower();
if(hScrollbar) { xCenter += (x-0.5)*(viewWidth-newWidth);
if(imageWidth < getViewWidth()) yCenter += (y-0.5)*(viewHeight-newHeight);
xCenter = 0;
else
xCenter = hScrollbar->get_value();
}
if(vScrollbar) { viewWidth = newWidth;
if(imageHeight < getViewHeight()) viewHeight = newHeight;
yCenter = 0;
else
yCenter = vScrollbar->get_value();
}
queue_draw(); queue_draw();
} }

View file

@ -44,11 +44,11 @@ class RenderArea : public Gtk::DrawingArea {
} }
float getViewWidth() const { float getViewWidth() const {
return get_width()/scale; return viewWidth;
} }
float getViewHeight() const { float getViewHeight() const {
return get_height()/scale; return viewHeight;
} }
float getScale() const {return scale;} float getScale() const {return scale;}
@ -59,12 +59,10 @@ class RenderArea : public Gtk::DrawingArea {
private: private:
static GdkGLConfig *glconfig; static GdkGLConfig *glconfig;
Gtk::HScrollbar *hScrollbar;
Gtk::VScrollbar *vScrollbar;
View::View *view; View::View *view;
float xCenter, yCenter; float xCenter, yCenter;
float viewWidth, viewHeight;
int zoomLevel; int zoomLevel;
float scale; float scale;
@ -77,8 +75,7 @@ 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(float x = 0.5f, float y = 0.5f);
void updateScrolling();
bool gdkGLBegin() { bool gdkGLBegin() {
GtkWidget *widget = GTK_WIDGET(gobj()); GtkWidget *widget = GTK_WIDGET(gobj());

View file

@ -17,8 +17,8 @@
* with this program. If not, see <http://www.gnu.org/licenses/>. * with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
#ifndef ZOOMEDIT_DATA_XML_H_ #ifndef ZOOMEDIT_UTIL_XML_H_
#define ZOOMEDIT_DATA_XML_H_ #define ZOOMEDIT_UTIL_XML_H_
#include <libxml++/nodes/element.h> #include <libxml++/nodes/element.h>
@ -36,4 +36,4 @@ class Xml {
} }
} }
#endif /*XML_H_*/ #endif /*ZOOMEDIT_UTIL_XML_H_*/

View file

@ -17,8 +17,8 @@
* with this program. If not, see <http://www.gnu.org/licenses/>. * with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
#ifndef ZOOMEDIT_TOPVIEW_H_ #ifndef ZOOMEDIT_VIEW_TOPVIEW_H_
#define ZOOMEDIT_TOPVIEW_H_ #define ZOOMEDIT_VIEW_TOPVIEW_H_
#include "View.h" #include "View.h"
@ -64,4 +64,4 @@ class TopView : public View {
} }
} }
#endif /*ZOOMEDIT_TOPVIEW_H_*/ #endif /*ZOOMEDIT_VIEW_TOPVIEW_H_*/

View file

@ -17,8 +17,8 @@
* with this program. If not, see <http://www.gnu.org/licenses/>. * with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
#ifndef ZOOMEDIT_VIEW_H_ #ifndef ZOOMEDIT_VIEW_VIEW_H_
#define ZOOMEDIT_VIEW_H_ #define ZOOMEDIT_VIEW_VIEW_H_
namespace ZoomEdit { namespace ZoomEdit {
@ -39,4 +39,4 @@ class View {
} }
} }
#endif /*ZOOMEDIT_RENDERER_H_*/ #endif /*ZOOMEDIT_VIEW_VIEW_H_*/

View file

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE glade-interface SYSTEM "glade-2.0.dtd"> <!DOCTYPE glade-interface SYSTEM "glade-2.0.dtd">
<!--Generated with glade3 3.4.0 on Tue Apr 8 21:03:00 2008 --> <!--Generated with glade3 3.4.0 on Wed Apr 16 11:06:45 2008 -->
<glade-interface> <glade-interface>
<widget class="GtkWindow" id="WindowMain"> <widget class="GtkWindow" id="WindowMain">
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
@ -200,48 +200,13 @@
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">True</property> <property name="can_focus">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<child>
<widget class="GtkTable" id="tableDrawer">
<property name="visible">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<property name="n_rows">2</property>
<property name="n_columns">2</property>
<child>
<placeholder/>
</child>
<child> <child>
<widget class="GtkDrawingArea" id="RenderArea"> <widget class="GtkDrawingArea" id="RenderArea">
<property name="visible">True</property> <property name="visible">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
</widget> </widget>
</child>
<child>
<widget class="GtkVScrollbar" id="Vscrollbar">
<property name="visible">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<property name="adjustment">0 0 100 1 10 10</property>
</widget>
<packing> <packing>
<property name="left_attach">1</property> <property name="resize">True</property>
<property name="right_attach">2</property>
<property name="x_options"></property>
</packing>
</child>
<child>
<widget class="GtkHScrollbar" id="Hscrollbar">
<property name="visible">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<property name="adjustment">0 0 100 1 10 10</property>
</widget>
<packing>
<property name="top_attach">1</property>
<property name="bottom_attach">2</property>
<property name="y_options"></property>
</packing>
</child>
</widget>
<packing>
<property name="resize">False</property>
<property name="shrink">True</property> <property name="shrink">True</property>
</packing> </packing>
</child> </child>