projects
/
ardour.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
audio interpolation is really private
[ardour.git]
/
libs
/
gtkmm2ext
/
scroomer.cc
diff --git
a/libs/gtkmm2ext/scroomer.cc
b/libs/gtkmm2ext/scroomer.cc
index a8bd0289f23771d5050a59cb3ab18ae9e43da38d..23fa71718ba0ddb1d24577552f1f5435199519d4 100644
(file)
--- a/
libs/gtkmm2ext/scroomer.cc
+++ b/
libs/gtkmm2ext/scroomer.cc
@@
-18,7
+18,9
@@
*/
#include <iostream>
*/
#include <iostream>
-#include <gtkmm2ext/scroomer.h>
+
+#include "gtkmm2ext/scroomer.h"
+#include "gtkmm2ext/keyboard.h"
using namespace Gtkmm2ext;
using namespace Gtk;
using namespace Gtkmm2ext;
using namespace Gtk;
@@
-28,8
+30,8
@@
using namespace std;
Scroomer::Scroomer(Gtk::Adjustment& adjustment)
: adj(adjustment)
, handle_size(0)
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;
position[TopBase] = 0;
position[Handle1] = 0;
position[Slider] = 0;
@@
-72,10
+74,14
@@
Scroomer::on_motion_notify_event (GdkEventMotion* ev)
return true;
}
return true;
}
+ if (ev->y < 0 || ev->y > get_height ()) {
+ return true;
+ }
+
grab_y = ev->y;
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;
scale = 0.05;
} else {
scale = 0.1;
@@
-88,7
+94,7
@@
Scroomer::on_motion_notify_event (GdkEventMotion* ev)
fract = max (-1.0, fract);
fract = -fract;
fract = max (-1.0, fract);
fract = -fract;
- switch(grab_comp) {
+ switch
(grab_comp) {
case TopBase:
case BottomBase:
unzoomed_val += scale * fract * range;
case TopBase:
case BottomBase:
unzoomed_val += scale * fract * range;
@@
-101,17
+107,33
@@
Scroomer::on_motion_notify_event (GdkEventMotion* ev)
unzoomed_val = max(unzoomed_val, adj.get_lower());
break;
case Handle1:
unzoomed_val = max(unzoomed_val, adj.get_lower());
break;
case Handle1:
+
unzoomed_page += scale * fract * range;
unzoomed_page = min(unzoomed_page, adj.get_upper() - unzoomed_val);
unzoomed_page = max(unzoomed_page, min_page_size);
unzoomed_page += scale * fract * range;
unzoomed_page = min(unzoomed_page, adj.get_upper() - unzoomed_val);
unzoomed_page = max(unzoomed_page, min_page_size);
+
+ if (pinch){
+ temp = unzoomed_val + unzoomed_page;
+ unzoomed_val -= scale * fract * range * 0.5;
+ unzoomed_val = min(unzoomed_val, temp - min_page_size);
+ unzoomed_val = max(unzoomed_val, adj.get_lower());
+ }
+
break;
case Handle2:
temp = unzoomed_val + unzoomed_page;
unzoomed_val += scale * fract * range;
unzoomed_val = min(unzoomed_val, temp - min_page_size);
unzoomed_val = max(unzoomed_val, adj.get_lower());
break;
case Handle2:
temp = unzoomed_val + unzoomed_page;
unzoomed_val += scale * fract * range;
unzoomed_val = min(unzoomed_val, temp - min_page_size);
unzoomed_val = max(unzoomed_val, adj.get_lower());
-
+
unzoomed_page = temp - unzoomed_val;
unzoomed_page = temp - unzoomed_val;
+
+ if (pinch){
+
+ unzoomed_page -= scale * fract * range;
+ }
+
+ unzoomed_page = min(unzoomed_page, adj.get_upper() - unzoomed_val);
unzoomed_page = max(unzoomed_page, min_page_size);
break;
default:
unzoomed_page = max(unzoomed_page, min_page_size);
break;
default:
@@
-120,10
+142,11
@@
Scroomer::on_motion_notify_event (GdkEventMotion* ev)
/* 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.
/* 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
+ * We don't start doing zoom until we are at least one scroomer width outside the scroomer's
+ * area.
*/
*/
- if (ev->x >
get_width(
)) {
+ if (ev->x >
(get_width() * 2
)) {
zoom = ev->x - get_width();
double higher = unzoomed_val + unzoomed_page - half_min_page - val_at_pointer;
zoom = ev->x - get_width();
double higher = unzoomed_val + unzoomed_page - half_min_page - val_at_pointer;
@@
-147,9
+170,9
@@
Scroomer::on_motion_notify_event (GdkEventMotion* ev)
page = min(page, adj.get_upper() - val);
} else if (ev->x < 0) {
/* on zoom out increase the page size as well as moving the range towards the mouse pos*/
page = min(page, adj.get_upper() - val);
} 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);
+
/*
zoom = abs(ev->x);
-
/*
double higher = unzoomed_val + unzoomed_page - half_min_page - val_at_pointer;
+ double higher = unzoomed_val + unzoomed_page - half_min_page - val_at_pointer;
double lower = val_at_pointer - (unzoomed_val + half_min_page);
higher *= zoom / 128;
double lower = val_at_pointer - (unzoomed_val + half_min_page);
higher *= zoom / 128;
@@
-177,18
+200,26
@@
Scroomer::on_motion_notify_event (GdkEventMotion* ev)
page = unzoomed_page;
}
page = unzoomed_page;
}
- adj.set_page_size(page);
+ /* Round these values to stop the scroomer handlers quivering about during drags */
+ adj.set_page_size (rint (page));
+ adj.set_value (rint (val));
+ adj.value_changed();
- if (val == adj.get_value()) {
- adj.value_changed();
- }
+ return true;
+}
- if (val < adj.get_lower()) {
- adj.value_changed();
- } else if (val > adj.get_upper()) {
- adj.value_changed();
- } else {
- adj.set_value(val);
+bool
+Scroomer::on_scroll_event (GdkEventScroll* ev)
+{
+ switch (ev->direction) {
+ case GDK_SCROLL_UP:
+ adj.set_value (min (adj.get_value() + adj.get_page_size() / 10.0, adj.get_upper() - adj.get_page_size()));
+ break;
+ case GDK_SCROLL_DOWN:
+ adj.set_value (adj.get_value() - adj.get_page_size() / 10.0);
+ break;
+ default:
+ return false;
}
return true;
}
return true;
@@
-197,7
+228,7
@@
Scroomer::on_motion_notify_event (GdkEventMotion* ev)
bool
Scroomer::on_button_press_event (GdkEventButton* ev)
{
bool
Scroomer::on_button_press_event (GdkEventButton* ev)
{
- if (ev->button == 1) {
+ if (ev->button == 1
|| ev->button == 3
) {
Component comp = point_in(ev->y);
if (comp == Total || comp == None) {
Component comp = point_in(ev->y);
if (comp == Total || comp == None) {
@@
-210,8
+241,21
@@
Scroomer::on_button_press_event (GdkEventButton* ev)
unzoomed_val = adj.get_value();
unzoomed_page = adj.get_page_size();
grab_window = ev->window;
unzoomed_val = adj.get_value();
unzoomed_page = adj.get_page_size();
grab_window = ev->window;
+
+ if (ev->button == 3){
+ pinch = true;
+ } else {
+ pinch = false;
+ }
+
+ DragStarting (); /* EMIT SIGNAL */
}
}
- return false;
+
+ if (ev->type == GDK_2BUTTON_PRESS && ev->button == 1) {
+ DoubleClicked();
+ }
+
+ return true;
}
bool
}
bool
@@
-227,11
+271,11
@@
Scroomer::on_button_release_event (GdkEventButton* ev)
return true;
}
return true;
}
- if (ev->button != 1) {
+ if (ev->button != 1
&& ev->button != 3
) {
return true;
}
return true;
}
- switch(grab_comp) {
+ switch
(grab_comp) {
case TopBase:
break;
case Handle1:
case TopBase:
break;
case Handle1:
@@
-249,12
+293,7
@@
Scroomer::on_button_release_event (GdkEventButton* ev)
grab_comp = None;
remove_modal_grab();
grab_comp = None;
remove_modal_grab();
- return true;
-}
-
-bool
-Scroomer::on_scroll_event (GdkEventScroll*)
-{
+ DragFinishing (); /* EMIT SIGNAL */
return true;
}
return true;
}
@@
-275,7
+314,7
@@
Scroomer::set_comp_rect(GdkRectangle& r, Component c) const
{
int index = (int) c;
{
int index = (int) c;
- switch(c) {
+ switch
(c) {
case None:
return;
case Total:
case None:
return;
case Total:
@@
-365,29
+404,5
@@
Scroomer::adjustment_changed()
rect.set_height(position[BottomBase] - old_pos[Handle2]);
win->invalidate_rect(rect, false);
}
rect.set_height(position[BottomBase] - old_pos[Handle2]);
win->invalidate_rect(rect, false);
}
-
- win->process_updates(false);
}
}
-std::string
-Scroomer::get_comp_name(Component c)
-{
- switch(c) {
- case TopBase:
- return "TopBase";
- case Handle1:
- return "Handle1";
- case Slider:
- return "Slider";
- case Handle2:
- return "Handle2";
- case BottomBase:
- return "BottomBase";
- case Total:
- return "Total";
- case None:
- return "None";
- default:
- return "ERROR";
- }
-}