*/
#include <iostream>
-#include <gtkmm2ext/scroomer.h>
+
+#include "gtkmm2ext/scroomer.h"
+#include "gtkmm2ext/keyboard.h"
using namespace Gtkmm2ext;
using namespace Gtk;
Scroomer::Scroomer(Gtk::Adjustment& adjustment)
: adj(adjustment)
, handle_size(0)
- , grab_comp(None) {
-
+ , grab_comp(None)
+{
position[TopBase] = 0;
position[Handle1] = 0;
position[Slider] = 0;
//adjustment.signal_changed().connect (mem_fun (*this, &Scroomer::adjustment_changed));
}
-Scroomer::~Scroomer() {
+Scroomer::~Scroomer()
+{
}
bool
-Scroomer::on_motion_notify_event (GdkEventMotion* ev) {
+Scroomer::on_motion_notify_event (GdkEventMotion* ev)
+{
double range = adj.get_upper() - adj.get_lower();
double pixel2val = range / get_height();
double val_at_pointer = ((get_height() - ev->y) * pixel2val) + adj.get_lower();
double scale, temp, zoom;
double val, page;
- if(grab_comp == None || grab_comp == Total) {
+ if (grab_comp == None || grab_comp == Total) {
return true;
}
grab_y = ev->y;
- if (ev->state & GDK_CONTROL_MASK) {
- if (ev->state & GDK_MOD1_MASK) {
+ if (ev->state & Keyboard::PrimaryModifier) {
+ if (ev->state & Keyboard::SecondaryModifier) {
scale = 0.05;
} else {
scale = 0.1;
fract = max (-1.0, fract);
fract = -fract;
- switch(grab_comp) {
+ switch (grab_comp) {
case TopBase:
case BottomBase:
unzoomed_val += scale * fract * range;
break;
}
- /*
- * Then we handle zoom, which is dragging horizontally. We zoom around the area that is
+ /* Then we handle zoom, which is dragging horizontally. We zoom around the area that is
* the current y pointer value, not from the area that was the start of the drag.
* the point of zoom must have the same
*/
- if(ev->x > get_width()) {
+ if (ev->x > get_width()) {
zoom = ev->x - get_width();
double higher = unzoomed_val + unzoomed_page - half_min_page - val_at_pointer;
page = max(page, min_page_size);
- if(lower < 0) {
+ if (lower < 0) {
val = max(val, val_at_pointer - half_min_page);
- }
- else if(lower > 0) {
+ } else if (lower > 0) {
val = min(val, val_at_pointer - half_min_page);
}
val = min(val, adj.get_upper() - min_page_size);
page = min(page, adj.get_upper() - val);
- }
- else if (ev->x < 0) {
+ } else if (ev->x < 0) {
/* on zoom out increase the page size as well as moving the range towards the mouse pos*/
zoom = abs(ev->x);
page = max(page, min_page_size);
- if(lower < 0) {
+ if (lower < 0) {
val = max(val, val_at_pointer - half_min_page);
}
- else if(lower > 0) {
+ else if (lower > 0) {
val = min(val, val_at_pointer - half_min_page);
}
val = unzoomed_val;
page = unzoomed_page;
- }
- else {
+ } else {
val = unzoomed_val;
page = unzoomed_page;
}
adj.set_page_size(page);
- if(val == adj.get_value()) {
+ if (val == adj.get_value()) {
adj.value_changed();
}
- if(val < adj.get_lower()) {
+
+ if (val < adj.get_lower()) {
adj.value_changed();
- }
- else if(val > adj.get_upper()) {
+ } else if (val > adj.get_upper()) {
adj.value_changed();
- }
- else {
+ } else {
adj.set_value(val);
}
}
bool
-Scroomer::on_button_press_event (GdkEventButton* ev) {
- if(ev->button == 1) {
+Scroomer::on_button_press_event (GdkEventButton* ev)
+{
+ if (ev->button == 1) {
Component comp = point_in(ev->y);
- cerr << get_comp_name(comp) << " pressed" << endl;
-
- if(comp == Total || comp == None) {
+ if (comp == Total || comp == None) {
return false;
}
}
bool
-Scroomer::on_button_release_event (GdkEventButton* ev) {
- if(grab_comp == None || grab_comp == Total) {
+Scroomer::on_button_release_event (GdkEventButton* ev)
+{
+ if (grab_comp == None || grab_comp == Total) {
return true;
}
return true;
}
- switch(grab_comp) {
+ switch (grab_comp) {
case TopBase:
break;
case Handle1:
}
bool
-Scroomer::on_scroll_event (GdkEventScroll*) {
+Scroomer::on_scroll_event (GdkEventScroll*)
+{
return true;
}
void
-Scroomer::on_size_allocate (Allocation& a) {
+Scroomer::on_size_allocate (Allocation& a)
+{
Gtk::DrawingArea::on_size_allocate(a);
position[Total] = a.get_height();
update();
}
-/*
- * assumes that x and width are correct, and they will not be altered
+/** Assumes that x and width are correct, and they will not be altered.
*/
void
-Scroomer::set_comp_rect(GdkRectangle& r, Component c) const {
+Scroomer::set_comp_rect(GdkRectangle& r, Component c) const
+{
int index = (int) c;
- switch(c) {
+ switch (c) {
case None:
return;
case Total:
}
Scroomer::Component
-Scroomer::point_in(double point) const {
- for(int i = 0; i < Total; ++i) {
- if(position[i+1] >= point) {
+Scroomer::point_in(double point) const
+{
+ for (int i = 0; i < Total; ++i) {
+ if (position[i+1] >= point) {
return (Component) i;
}
}
}
void
-Scroomer::set_min_page_size(double ps) {
+Scroomer::set_min_page_size(double ps)
+{
double coeff = ((double)position[Total]) / (adj.get_upper() - adj.get_lower());
min_page_size = ps;
}
void
-Scroomer::update() {
+Scroomer::update()
+{
double range = adj.get_upper() - adj.get_lower();
//double value = adj.get_value() - adj.get_lower();
int height = position[Total];
double coeff = ((double) height) / range;
/* save the old positions to calculate update regions later*/
- for(int i = Handle1; i < Total; ++i) {
+ for (int i = Handle1; i < Total; ++i) {
old_pos[i] = position[i];
}
}
void
-Scroomer::adjustment_changed() {
+Scroomer::adjustment_changed()
+{
//cerr << floor(adj.get_value()) << " " << floor(adj.get_value() + adj.get_page_size()) << endl;
Gdk::Rectangle rect;
Glib::RefPtr<Gdk::Window> win = get_window();
update();
- if(!win) {
+ if (!win) {
return;
}
rect.set_x(0);
rect.set_width(get_width());
- if(position[Handle1] < old_pos[Handle1]) {
+ if (position[Handle1] < old_pos[Handle1]) {
rect.set_y(position[Handle1]);
rect.set_height(old_pos[Slider] - position[Handle1]);
win->invalidate_rect(rect, false);
- }
- else if(position[Handle1] > old_pos[Handle1]) {
+ } else if (position[Handle1] > old_pos[Handle1]) {
rect.set_y(old_pos[Handle1]);
rect.set_height(position[Slider] - old_pos[Handle1]);
win->invalidate_rect(rect, false);
}
- if(position[Handle2] < old_pos[Handle2]) {
+ if (position[Handle2] < old_pos[Handle2]) {
rect.set_y(position[Handle2]);
rect.set_height(old_pos[BottomBase] - position[Handle2]);
win->invalidate_rect(rect, false);
- }
- else if(position[Handle2] > old_pos[Handle2]) {
+ } else if (position[Handle2] > old_pos[Handle2]) {
rect.set_y(old_pos[Handle2]);
rect.set_height(position[BottomBase] - old_pos[Handle2]);
win->invalidate_rect(rect, false);
}
std::string
-Scroomer::get_comp_name(Component c) {
- switch(c) {
+Scroomer::get_comp_name(Component c)
+{
+ switch (c) {
case TopBase:
return "TopBase";
case Handle1: