예제 #1
0
void AudioView::OnUpdate(wxView *WXUNUSED(sender), wxObject *WXUNUSED(hint))
{
  if (trackPanel)
    REDRAW(trackPanel);
  if (rulerPanel)
    REDRAW(rulerPanel);
}
예제 #2
0
void AudioView::Cut()
{
  ClearClipboard();

  TrackList *tracks = GetTracks();
  VTrack *n = tracks->First();
  VTrack *dest = 0;

  while(n) {
	if (n->selected) {
	  n->Cut(sel0, sel1, &dest);
	  if (dest)
		clipboard->Add(dest);
	}
	n = tracks->Next();
  }

  clipLen = (sel1 - sel0);

  sel1 = sel0;

  PushState();

  FixScrollbars();
  REDRAW(trackPanel);
  REDRAW(rulerPanel);
  UpdateMenus();
}
예제 #3
0
bool AudioView::ProcessEvent(wxEvent& event)
{
  if (event.GetEventType() == wxEVT_COMMAND_MENU_SELECTED &&
      event.GetId() >= FirstEffectID &&
      event.GetId() < FirstEffectID + numEffects) {
    Effect *f = Effect::GetEffect(event.GetId() - FirstEffectID);

    TrackList *tracks = GetTracks();
    VTrack *t = tracks->First();
    
    while(t) {
      if (t->selected && t->GetKind() == (VTrack::Wave)) {
	f->DoInPlaceEffect((WaveTrack *)t, sel0, sel1);
      }
      
      t = tracks->Next();
    }
    
    PushState();
    
    FixScrollbars();
    REDRAW(trackPanel);
    REDRAW(rulerPanel);
    
    // This indicates we handled the event.
    return true;
  }
  
  return wxView::ProcessEvent(event);
}
예제 #4
0
void AudioView::ImportMIDI()
{
  wxString fileName =
	wxFileSelector("Select a MIDI File...",
				   "", // Path
				   "", // Name
				   ".mid", // Extension
				   "*.mid", // Wildcard
				   0, // Flags
				   GetFrame()); // Parent

  if (fileName == "")
    return;

  NoteTrack *newTrack =
	new NoteTrack(&((AudioDoc *)GetDocument())->dirManager);
  
  if (::ImportMIDI(fileName, newTrack)) {

    SelectNone();
    GetTracks()->Add(newTrack);
	newTrack->selected = true;
    
    PushState();

    FixScrollbars();
    REDRAW(trackPanel);
    REDRAW(rulerPanel);
  }
}
예제 #5
0
void AudioView::Pitch()
{
  VTrack *t;
  bool success = false;

  TrackList *tracks = GetTracks();
  t = tracks->First();
  while(t) {
    if (t->selected && t->GetKind() == VTrack::Wave) {
      NoteTrack *note = PitchExtract((WaveTrack *)t,
				     &((AudioDoc *)GetDocument())->dirManager);
      if (note) {
		success = true;
		tracks->Add(note);
      }
    }

    t = tracks->Next();
  }

  if (success) {
    PushState();
    
    FixScrollbars();
    REDRAW(trackPanel);
    REDRAW(rulerPanel);
  }
}
예제 #6
0
void TrackPanel::FastScroll(int hoffset, int voffset)
{
#ifdef __WXMSW__
  REDRAW(this);
  return;
#endif

  int labelWidth = view->labelWidth;

  wxRect r;
  GetSize(&r.width, &r.height);
  r.width -= labelWidth;

  if (hoffset && voffset) {
    // Tricks don't work if we scroll horizontally AND vertically
    // at the same time
    REDRAW(this);
    return;
  }
  
  if (r.width != bitWidth || r.height != bitHeight || !bitmap) {
    // Don't try any tricks if we got resized, too
    REDRAW(this);
    return;
  }
  
  r.x = 0;
  r.y = 0;

  if (hoffset > 0)
    r.width = hoffset;
  else if (hoffset < 0) {
    r.x = (r.width + hoffset);
    r.width = -hoffset;
  }
  else if (voffset > 0)
    r.height = voffset;
  else if (voffset < 0) {
    r.y = (r.height + voffset);
    r.height = -voffset;
  }
  else
    return;

  r.x += labelWidth;
  r.y += 4;
  r.height -= 16;

  wxPaintDC dc(this);

  wxMemoryDC memDC;

  memDC.SelectObject(*bitmap);

  view->DrawTracks(&memDC, &r);

  ScrollWindow(hoffset, voffset);
  dc.Blit(r.x, r.y, r.width, r.height, &memDC, r.x, r.y, wxCOPY, FALSE);
    
}
예제 #7
0
void AudioView::Paste()
{
  if (sel0 != sel1)
    Clear();
    
  wxASSERT(sel0 == sel1);

  double tsel = sel0;

  TrackList *tracks = GetTracks();
  VTrack *n = tracks->First();
  VTrack *c = clipboard->First();

  while(n && c) {
	if (n->selected) {
	  n->Paste(tsel, c);
	  c = clipboard->Next();
	}
	  
	n = tracks->Next();
  }

  // TODO: What if we clicked past the end of the track?

  sel0 = tsel;
  sel1 = tsel + clipLen;

  PushState();

  FixScrollbars();
  REDRAW(trackPanel);
  REDRAW(rulerPanel);
  UpdateMenus();
}
예제 #8
0
void AudioView::OnZoomOutButton()
{
  sinfo.zoom = sinfo.zoom/2.0;

  FixScrollbars();
  REDRAW(trackPanel);
  REDRAW(rulerPanel);
}
예제 #9
0
bool AudioView::DClickLabel(wxMouseEvent &event)
{
  VTrack *t = FindTrack(event.m_x, event.m_y, true);
  
  if (t) {
    t->Toggle();
    REDRAW(trackPanel);
  	REDRAW(rulerPanel);
    return true;
  }
  else
    return false;
}
예제 #10
0
void AudioView::SpectrumDisplay()
{
  TrackList *tracks = GetTracks();
  VTrack *n = tracks->First();

  while(n) {
	if (n->selected && n->GetKind() == VTrack::Wave)
	  ((WaveTrack *)n)->SetDisplay(WaveTrack::SpectrumDisplay);
	n = tracks->Next();
  }

  REDRAW(trackPanel);
  REDRAW(rulerPanel);
}
예제 #11
0
void AudioView::ImportMP3()
{
  #if 0 // seems to be working better now!
    static bool warned=false;

    if (!warned) {
	wxMessageBox("Warning: This feature is not stable and may crash.  "
				 "Proceed at your own risk.");
	warned = true;
    }
  #endif // 0

  wxString fileName =
	wxFileSelector("Select a MP3 File...",
				   "", // Path
				   "", // Name
				   ".mp3", // Extension
				   "*.mp3", // Wildcard
				   0, // Flags
				   GetFrame()); // Parent
  
  if (fileName == "")
    return;

  WaveTrack *left = 0;
  WaveTrack *right = 0;

  if (::ImportMP3(fileName, &left, &right,
		  &((AudioDoc *)GetDocument())->dirManager)) {  
    if (left || right) {
      SelectNone();
    }
    
    if (left) {
      GetTracks()->Add(left);
      left->selected = true;
    }
    
    if (right) {
      GetTracks()->Add(right);
      right->selected = true;
    }
    
    PushState();
    
    FixScrollbars();
    REDRAW(trackPanel);
    REDRAW(rulerPanel);
  }
}
예제 #12
0
void AudioView::Scroll(wxScrollEvent &evt)
{
  int  hlast = sinfo.sbarH;
  int  vlast = vpos;
  int  hoffset = 0;
  int  voffset = 0;

  sinfo.sbarH = hsbar->GetThumbPosition();

  if (sinfo.sbarH != hlast) {
	  sinfo.h = (sinfo.sbarH * sinfo.scrollStep) / sinfo.zoom;
	  if (sinfo.h > sinfo.total - sinfo.screen)
		  sinfo.h = sinfo.total - sinfo.screen;
	  if (sinfo.h < 0.0)
		  sinfo.h = 0.0;
		hoffset = (sinfo.sbarH - hlast) * sinfo.scrollStep;
  }

  vpos = vsbar->GetThumbPosition() * sinfo.scrollStep;
  voffset = vpos - vlast;

  // Track panel is updated either way, but it is smart and only redraws
  // what is needed
  trackPanel->FastScroll(-hoffset, -voffset);

  // Ruler panel updated if we scroll horizontally
  if (hoffset) {
    REDRAW(rulerPanel);
  }
}
예제 #13
0
void AudioView::SelectAll()
{
  TrackList *tracks = GetTracks();

  VTrack *t = tracks->First();
  while(t) {
	t->selected = true;
	t = tracks->Next();
  }
  sel0 = 0.0;
  sel1 = tracks->GetMaxLen();
  
  REDRAW(trackPanel);
  REDRAW(rulerPanel);
  UpdateMenus();
}
예제 #14
0
void AudioView::NewLabelTrack()
{
  LabelTrack *t = new LabelTrack(&((AudioDoc *)GetDocument())->dirManager);

  SelectNone();

  GetTracks()->Add(t);
  t->selected = true;

  PushState();

  FixScrollbars();
    
  REDRAW(trackPanel);
  REDRAW(rulerPanel);
}
예제 #15
0
void AudioView::RemoveTracks()
{
  TrackList *list = GetTracks();
  VTrack *t = list->First();

  while(t) {
	if (t->selected)
	  t = list->RemoveCurrent();
	else
	  t = list->Next();
  }

  PushState();

  REDRAW(trackPanel);
  REDRAW(rulerPanel);
  UpdateMenus();
}
예제 #16
0
bool AudioView::ClickLabel(wxMouseEvent &event)
{
  VTrack *t = FindTrack(event.m_x, event.m_y, true);

  SelectNone();
  
  if (t) {
	t->selected = true;

	sel0 = 0.0;
	sel1 = t->GetMaxLen();
  }

  REDRAW(trackPanel);
  REDRAW(rulerPanel);
  
  return true;
}
예제 #17
0
void AudioView::Clear()
{
  TrackList *tracks = GetTracks();
  VTrack *n = tracks->First();

  while(n) {
	if (n->selected)
	  n->Clear(sel0, sel1);
	n = tracks->Next();
  }

  sel1 = sel0;

  PushState();
  FixScrollbars();
  REDRAW(trackPanel);
  REDRAW(rulerPanel);
  UpdateMenus();
}
예제 #18
0
void AudioView::Redo()
{
  wxASSERT(undoManager.RedoAvailable());
  
  TrackList *l = undoManager.Redo(&sel0, &sel1);
  PopState(l);

  FixScrollbars();
  REDRAW(trackPanel);
}
예제 #19
0
void AudioView::Import()
{
  wxString fileName =
	wxFileSelector("Select an audio file...",
				   "", // Path
				   "", // Name
				   "", // Extension
				   "", // Wildcard
				   0, // Flags
				   GetFrame()); // Parent

  if (fileName == "")
    return;

  WaveTrack *left = 0;
  WaveTrack *right = 0;
  
  if (ImportWAV(fileName, &left, &right, &((AudioDoc *)GetDocument())->dirManager)) {

	if (left || right) {
	  SelectNone();
	}

    if (left) {
      GetTracks()->Add(left);
	  left->selected = true;
    }

    if (right) {
      GetTracks()->Add(right);
	  right->selected = true;
    }

    PushState();

    FixScrollbars();
    REDRAW(trackPanel);
    REDRAW(rulerPanel);
  }
  
}
예제 #20
0
void AudioView::QuickMix()
{
  WaveTrack **waveArray;
  VTrack *t;
  int numWaves = 0;
  int w;

  TrackList *tracks = GetTracks();
  t = tracks->First();
  while(t) {
    if (t->selected && t->GetKind() == VTrack::Wave)
      numWaves++;
    t = tracks->Next();
  }
  
  if (numWaves == 0)
	return;

  waveArray = new WaveTrack*[numWaves];
  w = 0;
  t = tracks->First();
  while(t) {
    if (t->selected && t->GetKind() == VTrack::Wave)
      waveArray[w++] = (WaveTrack *)t;
    t = tracks->Next();
  }  

  WaveTrack *mix = ::QuickMix(numWaves, waveArray,
			    &((AudioDoc *)GetDocument())->dirManager);
  if (mix) {
    tracks->Add(mix);

    PushState();
    
    FixScrollbars();
    REDRAW(trackPanel);
    REDRAW(rulerPanel);
  }
}
예제 #21
0
파일: agtk.c 프로젝트: ufaith/d2imdev
int d_agtk_push_proc(int msg, DIALOG *d, int c)
{
    int ret = D_O_K;

    d->flags |= D_EXIT;

    ret |= d_agtk_button_proc(msg, d, c);

    if (ret & D_CLOSE) {
        ret &= ~D_CLOSE;
        REDRAW(d);

        if (d->dp3)
            ret |= ((int (*)(DIALOG *))d->dp3)(d);
    }

    return ret;
}
예제 #22
0
int AppBrowser (void)
	{
	Debug ("AppBrowser");

	u32 btn;
	
	redraw = 1;
	appsSelected = -1;	// Current selected app with wimote
	spotSelected = -1;
	spotSelectedLast = -1;
	
	browserRet = -1;
	
	grlibSettings.color_window = RGBA(192,192,192,255);
	grlibSettings.color_windowBg = RGBA(32,32,32,128);
	
	grlib_SetRedrawCallback (Redraw, Overlay);
	
	apps = (s_app*) vars.bigblock; //malloc (usedBytes);
	memset (apps, 0, APPSMAX * sizeof(s_app));
	
	config.run.enabled = 0;
	
	// Immediately draw the screen...
	AppsFree ();
	
	InitializeGui ();
	
	/*
	Redraw ();
	grlib_PushScreen ();
	grlib_PopScreen ();
	grlib_Render();  // Render the frame buffer to the TV
	*/
	
	AppsBrowse (0);
	
	if (config.appPage >= 0 && config.appPage <= pageMax)
		page = config.appPage;
	else
		page = 0;

   FeedCoverCache ();
   LiveCheck (1);
   
   // Loop forever
    while (browserRet == -1)
		{
		if (LiveCheck (0)) redraw = 1;
		
		btn = grlib_GetUserInput();
		
		// If [HOME] was pressed on the first Wiimote, break out of the loop
		if (btn)
			{
			browserRet = ChooseDPadReturnMode (btn);
			if (browserRet != -1) break;
			
			if (btn & WPAD_BUTTON_1) 
				{
				spotSelected = -1;
				page = GoToPage (page, pageMax);
				FeedCoverCache ();
				redraw = 1;
				}
			if (btn & WPAD_BUTTON_2) 
				{
				ShowFilterMenu();
				redraw = 1;
				}
			if (btn & WPAD_BUTTON_A && appsSelected != -1 && sortMode == 0) 
				{
				if (apps[appsSelected].type == AT_HBA)
					{
					if (!QuerySelection (appsSelected))
						{
						redraw = 1;
						continue;
						}
					AppsSetRun (appsSelected);
					browserRet = INTERACTIVE_RET_HBSEL;
					break;
					}
				else if (apps[appsSelected].type == AT_FOLDER) // This is a folder ! Jump inside
					{	
					sprintf (config.subpath, "%s/", apps[appsSelected].path);
					sprintf (config.submount, "%s", apps[appsSelected].mount);
					
					AppsBrowse (0);
					redraw = 1;
					}
				else if (apps[appsSelected].type == AT_FOLDERUP) // This is a folder ! Jump inside
					{	
					int i = strlen(config.subpath);
					
					if (i > 0) i--;
					if (i > 0) i--;
					
					while (i >= 0 && config.subpath[i] != '/')
						config.subpath[i--] = 0;
					
					gui.spotsIdx = 0;
					AppsBrowse (0);
					redraw = 1;
					}
				}

			/////////////////////////////////////////////////////////////////////////////////////////////
			// We are in sort mode, check item
			if (btn & WPAD_BUTTON_A && appsSelected != -1 && sortMode > 0) 
				{
				if (!apps[appsSelected].checked)
					{
					apps[appsSelected].priority = sortMode--;
					apps[appsSelected].checked = TRUE;
					redraw = 1;
					//Debug ("selected %s (%d)\n", apps[appsSelected].name, apps[appsSelected].priority);
					}
				else
					{
					}
				}

			/////////////////////////////////////////////////////////////////////////////////////////////
			// Select application as default
			if (btn & WPAD_BUTTON_B && appsSelected != -1 && sortMode == 0)
				{
				ShowAppMenu (appsSelected);
				redraw = 1;
				}

			/////////////////////////////////////////////////////////////////////////////////////////////
			// If user press (B) stop sort mode
			if (btn & WPAD_BUTTON_B && sortMode > 0)
				{
				SortItems();
				
				int i;
				for (i = 0; i < appsCnt; i++)
					{
					apps[i].priority = appsCnt - i;
					apps[i].checked = FALSE;
					}
				sortMode = 0;
				needToSave = 1;
				redraw = 1;
				}

			if (btn & WPAD_BUTTON_HOME && sortMode > 0)
				{
				grlib_menu (0, "You are in sort mode.\n", "Close");
				redraw = 1;
				}

			if (btn & WPAD_BUTTON_HOME && sortMode == 0)
				{
				ShowMainMenu ();
				redraw = 1;
				}
			
			if (btn & WPAD_BUTTON_MINUS)
				{
				page = ChangePage (0);
				}
			if (btn & WPAD_BUTTON_PLUS) 
				{
				page = ChangePage (1);
				}
			}

		if (CoverCache_IsUpdated ()) 
			{
			redraw = 1;
			}
		
		FindSpot ();

		if (redraw)
			{
			Redraw ();
			grlib_PushScreen ();
			redraw = 0;
			}

		REDRAW();
		
		if (grlibSettings.wiiswitch_poweroff)
			{
			browserRet = INTERACTIVE_RET_SHUTDOWN;
			}

		if (grlibSettings.wiiswitch_reset)
			{
			browserRet = INTERACTIVE_RET_WIIMENU;
			}
			
		if (wiiload.status == WIILOAD_HBZREADY)
			{
			WiiloadZipMenu ();
			AppsBrowse (0);
			redraw = 1;
			}
			
		if (wiiload.status == WIILOAD_HBREADY)
			{
			if (WiiloadCheck())
				browserRet = INTERACTIVE_RET_WIILOAD;
			else
				redraw = 1;
			}
		
		if (vars.themeReloaded) // Restart the browser
			{
			vars.themeReloaded = 0;
			browserRet = INTERACTIVE_RET_TOHOMEBREW;
			}
		}
	
	// Lets close the topbar, if needed
	CLOSETOPBAR();
	CLOSEBOTTOMBAR();
	
	// save current page
	config.appPage = page;

	SaveSettings ();
	
	// Clean up all data
	AppsFree ();
	gui_Clean ();
	//free (apps);
	
	grlib_SetRedrawCallback (NULL, NULL);

	return browserRet;
	}
예제 #23
0
bool AudioView::ClickTrack(wxMouseEvent &event)
{
  wxRect r;
  int num;

  VTrack *t = FindTrack(event.m_x, event.m_y, false, &r, &num);

  if (t) {
	capturedTrack = t;
	capturedRect = r;
	capturedNum = num;
	
	mouseClickX = event.m_x;
	mouseClickY = event.m_y;

	mouseMostRecentX = event.m_x;
	mouseMostRecentY = event.m_y;

	if (mouseClickY >= r.y + r.height - 12 && mouseClickY < r.y + r.height) {
	  resizing = true;
	  initialTrackHeight = t->GetHeight();
	}
	else {
	  resizing = false;

	  if (event.ShiftDown()) { // Extend selection
		double selend = sinfo.h + ((event.m_x - r.x) / sinfo.zoom);
		
		if (selend > sel1) {
		  sel1 = selend;
		}
		else if (selend < sel0) {
		  sel0 = selend;
		} else {
		  // This is not ideal.  Fix???
		  sel1 = selend;
		  selstart = sel0;
		}
	  } 
	  else if (event.ControlDown()) {// Drag Track
		selstart = sinfo.h + ((event.m_x - r.x) / sinfo.zoom);

		dragging = true;
	  }
	  else { // Selecting
		dragging = false;

		selstart = sinfo.h + ((event.m_x - r.x) / sinfo.zoom);
		
		SelectNone();
		t->selected = true;
		
		sel0 = selstart;
		sel1 = selstart;
	  }
	}
	
    REDRAW(trackPanel);
  	REDRAW(rulerPanel);
	
	return true;
  }
  else {
	// No track was selected

	SelectNone();
	resizing = false;
	dragging = false;
    REDRAW(trackPanel);
  	REDRAW(rulerPanel);
    
    return true;
  }
}
예제 #24
0
// What to do when a view is created. Creates actual
// windows for displaying the view.
bool AudioView::OnCreate(wxDocument *doc, long WXUNUSED(flags) )
{
  gNumViewsOpen++;

  frame = wxGetApp().CreateChildFrame(doc, this, TRUE);

  //
  // Create Menu Bar
  //

  menuBar = new wxMenuBar();

  fileMenu = new wxMenu();
  fileMenu->Append(wxID_NEW, "&New...\tCtrl+N");
  fileMenu->Append(wxID_OPEN, "&Open...\tCtrl+O");
  fileMenu->Append(wxID_CLOSE, "&Close\tCtrl+W");
  fileMenu->Append(wxID_SAVE, "&Save\tCtrl+S");
  fileMenu->Append(wxID_SAVEAS, "Save As...");
  fileMenu->Append(ExportID, "&Export...");
  fileMenu->AppendSeparator();
  fileMenu->Append(wxID_PRINT, "&Print...\tCtrl+P");
  fileMenu->Append(wxID_PRINT_SETUP, "Print Setup...");
  fileMenu->Append(wxID_PREVIEW, "Print Preview");
  fileMenu->AppendSeparator();
  fileMenu->Append(wxID_EXIT, "E&xit");

  editMenu = new wxMenu();
  editMenu->Append(UndoID, "&Undo\tCtrl+Z");
  editMenu->Append(RedoID, "&Redo\tCtrl+R");
  editMenu->AppendSeparator();
  editMenu->Append(CutID, "Cut\tCtrl+X");
  editMenu->Append(CopyID, "Copy\tCtrl+C");
  editMenu->Append(PasteID, "Paste\tCtrl+V");
  editMenu->Append(ClearID, "Clear\tCtrl+B");
  editMenu->AppendSeparator();
  editMenu->Append(SelectAllID, "Select All\tCtrl+A");

  doc->GetCommandProcessor()->SetEditMenu(editMenu);

  projectMenu = new wxMenu();

  projectMenu->Append(ImportID, "&Import Audio...\tCtrl+I");
  projectMenu->Append(ImportRawID, "Import Raw Data...");
  projectMenu->Append(ImportMIDIID, "Import &MIDI...");
  projectMenu->Append(ImportMP3ID, "Import MP3...");
  projectMenu->AppendSeparator();
  projectMenu->Append(WaveTrackID, "New Audio Track");
  //  projectMenu->Append(LabelTrackID, "New Label Track");
  projectMenu->AppendSeparator();
  projectMenu->Append(RemoveTrackID, "&Remove Track(s)");

  trackMenu = new wxMenu();
  trackMenu->Append(QuickMixID, "Quick Mix");
  trackMenu->AppendSeparator();
  trackMenu->Append(WaveDisplayID, "Waveform Display");
  trackMenu->Append(SpectrumDisplayID, "Spectrum Display");
  trackMenu->AppendSeparator();
  //  trackMenu->Append(AutoCorrelateID, "AutoCorrelate");
  trackMenu->Append(PitchID, "Pitch Extract");
  
  effectMenu = new wxMenu();

  numEffects = Effect::GetNumEffects();
  for(int fi = 0; fi < numEffects; fi++)
    effectMenu->Append(FirstEffectID+fi,
		       (Effect::GetEffect(fi))->GetEffectName());

  helpMenu = new wxMenu;
  helpMenu->Append(wxID_ABOUT, "&About Audacity...");

  menuBar->Append(fileMenu, "&File");
  menuBar->Append(editMenu, "&Edit");
  menuBar->Append(projectMenu, "&Project");
  menuBar->Append(trackMenu, "&Track");
  menuBar->Append(effectMenu, "E&ffect");
  menuBar->Append(helpMenu, "&Help");

  frame->SetMenuBar(menuBar);  
  
  //
  // Make all child windows
  //

  int sbarWidth = 15;

  rulerPanel =
	new RulerPanel(this, frame, wxDefaultPosition,
				   wxSize(600 - labelWidth, 30), 0);

  trackPanel =
	new TrackPanel(this, frame, wxDefaultPosition,
				   wxSize(600, 300), 0);

  hsbar =
	new wxScrollBar(frame, HSBarID, wxDefaultPosition,
					wxSize(600, sbarWidth), wxSB_HORIZONTAL);

  vsbar =
	new wxScrollBar(frame, VSBarID, wxDefaultPosition,
					wxSize(sbarWidth, 300), wxSB_VERTICAL);

  status = new wxStaticText(frame, 0, "", wxDefaultPosition,
			  wxDefaultSize);
  status->SetLabel("");

  wxButton *b1;
  wxButton *b2;
  wxButton *b3;
  wxButton *b4;

  wxBitmap *zoomIn = new wxBitmap();
  wxBitmap *zoomOut = new wxBitmap();
  wxBitmap *play = new wxBitmap();
  wxBitmap *stop = new wxBitmap();

  if (zoomIn->LoadFile(BITMAP_PRE "ZoomIn" BITMAP_SUF,AUDACITY_BITMAP_TYPE) &&
      zoomOut->LoadFile(BITMAP_PRE "ZoomOut" BITMAP_SUF,AUDACITY_BITMAP_TYPE) &&
      play->LoadFile(BITMAP_PRE "Play" BITMAP_SUF,AUDACITY_BITMAP_TYPE) &&
      stop->LoadFile(BITMAP_PRE "Stop" BITMAP_SUF,AUDACITY_BITMAP_TYPE)) {
    
    b1 = (wxButton *)new wxBitmapButton
      (frame, ZoomInButtonID, *zoomIn,
       wxPoint(0, 0), wxSize(36, 36));
    b2 = (wxButton *)new wxBitmapButton
      (frame, ZoomOutButtonID, *zoomOut,
       wxPoint(30, 0), wxSize(36, 36));
    b3 = (wxButton *)new wxBitmapButton
      (frame, PlayButtonID, *play,
	   wxPoint(30, 0), wxSize(36, 36));
    b4 = (wxButton *)new wxBitmapButton
      (frame, StopButtonID, *stop,
       wxPoint(30, 0), wxSize(36, 36));

    b1->SetBackgroundColour(backgroundColor);
    b2->SetBackgroundColour(backgroundColor);
    b3->SetBackgroundColour(backgroundColor);
    b4->SetBackgroundColour(backgroundColor);
  }	  
  else {
	delete zoomIn;
	delete zoomOut;
	delete play;
	delete stop;
	
	b1 = new wxButton(frame, ZoomInButtonID, "<",
					  wxPoint(0, 0), wxSize(36,36));
	b2 = new wxButton(frame, ZoomOutButtonID, ">",
					  wxPoint(0, 0), wxSize(36,36));
	b3 = new wxButton(frame, PlayButtonID, "Play",
					  wxPoint(0, 0), wxSize(128,36));
	b4 = new wxButton(frame, StopButtonID, "Stop",
					  wxPoint(0, 0), wxSize(128,36));
  }

  wxBitmap *smallLogoBitmap = new wxBitmap();
  wxStaticBitmap *smallLogo = 0;
  if (smallLogoBitmap->LoadFile(BITMAP_PRE "AudacitySmall" BITMAP_SUF,
				AUDACITY_BITMAP_TYPE)) {
    smallLogo = new wxStaticBitmap(frame, 0, *smallLogoBitmap,
				   wxDefaultPosition, wxDefaultSize);
  }

  //
  // Lay them out using box sizers
  //

  mainSizer = new wxBoxSizer(wxVERTICAL);
  topSizer = new wxBoxSizer(wxHORIZONTAL);
  bottomSizer = new wxBoxSizer(wxHORIZONTAL);
  trackSizer = new wxBoxSizer(wxVERTICAL);

  mainSizer->Add(topSizer, 1, wxEXPAND, 0);
  mainSizer->Add(bottomSizer, 0, wxEXPAND | wxALL, 2);

  topSizer->Add(trackSizer, 1, wxEXPAND, 0);
  topSizer->Add(vsbar, 0, wxEXPAND | wxBOTTOM, sbarWidth);

  trackSizer->Add(rulerPanel, 0, wxEXPAND | wxLEFT, labelWidth);
  trackSizer->Add(trackPanel, 1, wxEXPAND, 0);
  trackSizer->Add(hsbar, 0, wxEXPAND, 0);

  bottomSizer->Add(b1, 0, wxEXPAND, 0);
  bottomSizer->Add(b2, 0, wxEXPAND, 0);
  bottomSizer->Add(b3, 0, wxEXPAND | wxLEFT, 24);
  bottomSizer->Add(b4, 0, wxEXPAND, 0);
  bottomSizer->Add(status, 1, wxEXPAND | wxLEFT, 24);
  if (smallLogo)
    bottomSizer->Add(smallLogo, 0, wxLEFT | wxRIGHT, 24);

  frame->SetAutoLayout(true);
  frame->SetSizer(mainSizer);

  mainSizer->Fit(frame);
  mainSizer->SetSizeHints(frame);

  //
  //
  //

  InitialState();

  FixScrollbars();
  
  frame->SetBackgroundColour(backgroundColor);

#ifdef __X__
  // X seems to require a forced resize
  int x, y;
  frame->GetSize(&x, &y);
  frame->SetSize(-1, -1, x, y);
#endif

  // Min size, max size
  frame->SetSizeHints(250,200,20000,20000);

  frame->Show(TRUE);

  #ifdef __WXMAC__
  
  // This (hack) tells various windows not to erase the background on update events.
  //frame->m_MacEraseBack = false;
  trackPanel->m_MacEraseBack = false;
  rulerPanel->m_MacEraseBack = false;
  hsbar->m_MacEraseBack = false;
  vsbar->m_MacEraseBack = false;
  #endif

  #ifdef DEBUG_PASTE_BUG  // probably can remove this - fixed

  WaveTrack *left = 0;
  WaveTrack *right = 0;
  ImportWAV("Mussorgsky1.WAV", &left, &right,
			&((AudioDoc *)GetDocument())->dirManager);

  selected->Clear();  
  GetTracks()->Add(left);
  selected->Add(left);

  PushState();

  sel0 = 2.0;
  sel1 = 4.0;

  Cut();

  left->Debug();

  sel0 = 4.0;
  sel1 = 4.0;

  Paste();

  left->Debug();

  FixScrollbars();
  REDRAW(trackPanel);
  REDRAW(rulerPanel);

  #endif
  
  return TRUE;
}
예제 #25
0
bool AudioView::DragTrack(wxMouseEvent &event)
{
  VTrack *t;
  wxRect r;
  int num;
  
  if (capturedTrack) {
	t = capturedTrack;
	r = capturedRect;
	num = capturedNum;
  }
  else
	t = FindTrack(event.m_x, event.m_y, false, &r, &num);
  
  if (t) {
	mouseMostRecentX = event.m_x;
	mouseMostRecentY = event.m_y;

	if (resizing) {
	  int delta = (event.m_y - mouseClickY);
	  int newTrackHeight = initialTrackHeight + delta;
	  if (newTrackHeight < 20)
		newTrackHeight = 20;
	  t->SetHeight(newTrackHeight);
	  REDRAW(trackPanel);
	}
    else if (dragging) {
      double selend = sinfo.h + ((event.m_x - r.x) / sinfo.zoom);

	  if (selend < 0.0)
		selend = 0.0;
      
      if (selend != selstart) {
        t->Offset(selend - selstart);
        REDRAW(trackPanel);
      }
    
      selstart = selend;
    }
    else {
	  // Selecting

      double selend = sinfo.h + ((event.m_x - r.x) / sinfo.zoom);
      
	  if (selend < 0.0)
		selend = 0.0;

      if (selend >= selstart) {
		sel0 = selstart;
		sel1 = selend;
	  }
	  else {
		sel0 = selend;
		sel1 = selstart;
	  }

	  // Handle which tracks are selected

	  int num2;
	  if (0 != FindTrack(event.m_x, event.m_y, false, NULL, &num2)) {
		// The tracks numbered num...num2 should be selected
		
		TrackList *tracks = GetTracks();
		VTrack *t = tracks->First();
		int i=1;
		while(t) {
		  t->selected = (i>=num && i<=num2) || (i>=num2 && i<=num);
		  t = tracks->Next();
		  i++;
		}
	  }

	  wxString str;
	  str.Printf("Selection: %lf - %lf seconds",sel0,sel1);
	  status->SetLabel(str);

      REDRAW(trackPanel);
    }
 
    return true;
  }
  else
    return false;
}
예제 #26
0
void AudioView::FixScrollbars()
{
  if (!hsbar || !vsbar)
    return;

  AudioDoc *doc = ((AudioDoc *)GetDocument());
  if (!doc)
    return;
    
  bool rescroll = false;

  TrackList *tracks = GetTracks();
  int totalHeight = (tracks->GetHeight() + 32);

  int panelWidth, panelHeight;
  trackPanel->GetSize(&panelWidth, &panelHeight);

  sinfo.total = tracks->GetMaxLen() + 1.0;
  sinfo.screen = ((double)panelWidth) / sinfo.zoom;

  if (sinfo.h > sinfo.total - sinfo.screen) {
  	sinfo.h = sinfo.total - sinfo.screen;
  	rescroll = true;
  }
  if (sinfo.h < 0.0) {
  	sinfo.h = 0.0;
  	rescroll = true;
  }

  sinfo.sbarTotal = (int)(sinfo.total * sinfo.zoom) / sinfo.scrollStep;
  sinfo.sbarScreen = (int)(sinfo.screen * sinfo.zoom) / sinfo.scrollStep;

  sinfo.sbarH = (int)(sinfo.h * sinfo.zoom) / sinfo.scrollStep;

  vpos =
	vsbar->GetThumbPosition() * sinfo.scrollStep;

  if (vpos >= totalHeight)
	vpos = totalHeight-1;
  if (vpos < 0)
	vpos = 0;

  hsbar->Show(sinfo.screen < sinfo.total);
  vsbar->Show(panelHeight < totalHeight);

  if (panelHeight >= totalHeight && vpos != 0) {
	vpos = 0;
	REDRAW(trackPanel);
	REDRAW(rulerPanel);
	rescroll = false;
  }
  if (sinfo.screen >= sinfo.total && sinfo.sbarH != 0) {
	sinfo.sbarH = 0;
	REDRAW(trackPanel);
	REDRAW(rulerPanel);
	rescroll = false;
  }

  hsbar->SetScrollbar(sinfo.sbarH, sinfo.sbarScreen,
					  sinfo.sbarTotal, sinfo.sbarScreen, TRUE);
  vsbar->SetScrollbar(vpos / sinfo.scrollStep,
					  panelHeight / sinfo.scrollStep,
					  totalHeight / sinfo.scrollStep,
					  panelHeight / sinfo.scrollStep,
					  TRUE);

  sinfo.lastZoom = sinfo.zoom;
  
  if (rescroll && sinfo.screen < sinfo.total) {
	  REDRAW(trackPanel);
		REDRAW(rulerPanel);
  }
}