add initial version of drag-zoom
This commit is contained in:
parent
2b7c9a240f
commit
674aa7d3ce
|
@ -229,6 +229,11 @@ public class WaveformCanvas extends Canvas{
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setZoomLevel(int level) {
|
public void setZoomLevel(int level) {
|
||||||
|
long tc=cursorPainters.get(0).getTime(); // cursor time
|
||||||
|
setZoomLevel(level, tc);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setZoomLevel(int level, long centerTime) {
|
||||||
long oldScaleFactor=scaleFactor;
|
long oldScaleFactor=scaleFactor;
|
||||||
if(level<Constants.unitMultiplier.length*Constants.unitString.length){
|
if(level<Constants.unitMultiplier.length*Constants.unitString.length){
|
||||||
this.level = level;
|
this.level = level;
|
||||||
|
@ -242,10 +247,9 @@ public class WaveformCanvas extends Canvas{
|
||||||
* xcn = tc/newScaleFactor
|
* xcn = tc/newScaleFactor
|
||||||
* t0n = (xcn-xoffs)*scaleFactor
|
* t0n = (xcn-xoffs)*scaleFactor
|
||||||
*/
|
*/
|
||||||
long tc=cursorPainters.get(0).getTime(); // cursor time
|
long xc=centerTime/oldScaleFactor; // cursor total x-offset
|
||||||
long xc=tc/oldScaleFactor; // cursor total x-offset
|
|
||||||
long xoffs=xc+origin.x; // cursor offset relative to left border
|
long xoffs=xc+origin.x; // cursor offset relative to left border
|
||||||
long xcn=tc/scaleFactor; // new total x-offset
|
long xcn=centerTime/scaleFactor; // new total x-offset
|
||||||
long originX=xcn-xoffs;
|
long originX=xcn-xoffs;
|
||||||
if(originX>0) {
|
if(originX>0) {
|
||||||
origin.x=(int) -originX; // new cursor time offset relative to left border
|
origin.x=(int) -originX; // new cursor time offset relative to left border
|
||||||
|
@ -557,7 +561,7 @@ public class WaveformCanvas extends Canvas{
|
||||||
return (getClientArea().width+origin.x)*scaleFactor;
|
return (getClientArea().width+origin.x)*scaleFactor;
|
||||||
}
|
}
|
||||||
|
|
||||||
long getOriginTime() {
|
long getMinVisibleTime() {
|
||||||
return origin.x * scaleFactor;
|
return origin.x * scaleFactor;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -194,26 +194,60 @@ public class WaveformViewer implements IWaveformViewer {
|
||||||
if((e.stateMask&SWT.MODIFIER_MASK&~SWT.SHIFT)!=0) return; //don't react on modifier except shift
|
if((e.stateMask&SWT.MODIFIER_MASK&~SWT.SHIFT)!=0) return; //don't react on modifier except shift
|
||||||
if(!start.equals(end)){
|
if(!start.equals(end)){
|
||||||
asyncUpdate(e.widget);
|
asyncUpdate(e.widget);
|
||||||
|
long startTime = waveformCanvas.getTimeForOffset(start.x);
|
||||||
|
long endTime = waveformCanvas.getTimeForOffset(end.x);
|
||||||
|
long targetTimeRange = endTime-startTime;
|
||||||
|
long currentTimeRange = waveformCanvas.getMaxVisibleTime()-waveformCanvas.getMinVisibleTime();
|
||||||
|
if(targetTimeRange==0) return;
|
||||||
|
long relation = currentTimeRange/targetTimeRange;
|
||||||
|
long i = 1;
|
||||||
|
int level=0;//relation>0?0:0;
|
||||||
|
do {
|
||||||
|
if(relation<0 ) {
|
||||||
|
if(-relation<i) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
level--;
|
||||||
|
if(-relation<i*3) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
level--;
|
||||||
|
} else {
|
||||||
|
if(relation<i) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
level++;
|
||||||
|
if(relation<i*3) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
level++;
|
||||||
|
}
|
||||||
|
i=i*10;
|
||||||
|
} while(i<10000);
|
||||||
|
if(i<10000) {
|
||||||
|
int curLevel = waveformCanvas.getZoomLevel();
|
||||||
|
waveformCanvas.setZoomLevel(curLevel-level, (startTime+endTime)/2);
|
||||||
|
}
|
||||||
} else if (e.button == 1 && ((e.stateMask&SWT.SHIFT)==0)) {
|
} else if (e.button == 1 && ((e.stateMask&SWT.SHIFT)==0)) {
|
||||||
// set cursor (button 1 and no shift)
|
// set cursor (button 1 and no shift)
|
||||||
if(Math.abs(e.x-start.x)<3 && Math.abs(e.y-start.y)<3){
|
if(Math.abs(e.x-start.x)<3 && Math.abs(e.y-start.y)<3){
|
||||||
// first set cursor time
|
// first set cursor time
|
||||||
setCursorTime(snapOffsetToEvent(e));
|
setCursorTime(snapOffsetToEvent(start));
|
||||||
// then set selection and reveal
|
// then set selection and reveal
|
||||||
setSelection(new StructuredSelection(initialSelected));
|
setSelection(new StructuredSelection(initialSelected));
|
||||||
asyncUpdate(e.widget);
|
asyncUpdate(e.widget);
|
||||||
}
|
}
|
||||||
}else if (e.button == 2 ||(e.button==1 && (e.stateMask&SWT.SHIFT)!=0)) {
|
}else if (e.button == 2 ||(e.button==1 && (e.stateMask&SWT.SHIFT)!=0)) {
|
||||||
// set marker (button 1 and shift)
|
// set marker (button 1 and shift)
|
||||||
setMarkerTime(snapOffsetToEvent(e), selectedMarker);
|
setMarkerTime(snapOffsetToEvent(start), selectedMarker);
|
||||||
asyncUpdate(e.widget);
|
asyncUpdate(e.widget);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected long snapOffsetToEvent(MouseEvent e) {
|
protected long snapOffsetToEvent(Point p) {
|
||||||
long time= waveformCanvas.getTimeForOffset(e.x);
|
long time= waveformCanvas.getTimeForOffset(p.x);
|
||||||
long scaling=5*waveformCanvas.getScaleFactor();
|
long scaling=5*waveformCanvas.getScaleFactor();
|
||||||
for(Object o:waveformCanvas.getClicked(start)){
|
for(Object o:waveformCanvas.getClicked(p)){
|
||||||
Entry<Long, ?> floorEntry=null, ceilEntry=null;
|
Entry<Long, ?> floorEntry=null, ceilEntry=null;
|
||||||
if(o instanceof TrackEntry){
|
if(o instanceof TrackEntry){
|
||||||
TrackEntry entry = (TrackEntry) o;
|
TrackEntry entry = (TrackEntry) o;
|
||||||
|
@ -1270,13 +1304,6 @@ public class WaveformViewer implements IWaveformViewer {
|
||||||
if(percent<-100) percent=-100;
|
if(percent<-100) percent=-100;
|
||||||
if(percent>100) percent=100;
|
if(percent>100) percent=100;
|
||||||
int diff = (waveformCanvas.getWidth()*percent)/100;
|
int diff = (waveformCanvas.getWidth()*percent)/100;
|
||||||
// ScrollBar sb = waveformCanvas.getHorizontalBar();
|
|
||||||
// int x = sb.getSelection();
|
|
||||||
// System.out.println("Setting sb to "+ (x+diff));
|
|
||||||
// if((x+diff)>0)
|
|
||||||
// sb.setSelection(x+diff);
|
|
||||||
// else
|
|
||||||
// sb.setSelection(0);
|
|
||||||
Point o = waveformCanvas.getOrigin();
|
Point o = waveformCanvas.getOrigin();
|
||||||
waveformCanvas.setOrigin(o.x-diff, o.y);
|
waveformCanvas.setOrigin(o.x-diff, o.y);
|
||||||
waveformCanvas.redraw();
|
waveformCanvas.redraw();
|
||||||
|
|
Loading…
Reference in New Issue