void AudioView::OnUpdate(wxView *WXUNUSED(sender), wxObject *WXUNUSED(hint)) { if (trackPanel) REDRAW(trackPanel); if (rulerPanel) REDRAW(rulerPanel); }
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(); }
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); }
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); } }
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); } }
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); }
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(); }
void AudioView::OnZoomOutButton() { sinfo.zoom = sinfo.zoom/2.0; FixScrollbars(); REDRAW(trackPanel); REDRAW(rulerPanel); }
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; }
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); }
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); } }
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); } }
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(); }
void AudioView::NewLabelTrack() { LabelTrack *t = new LabelTrack(&((AudioDoc *)GetDocument())->dirManager); SelectNone(); GetTracks()->Add(t); t->selected = true; PushState(); FixScrollbars(); REDRAW(trackPanel); REDRAW(rulerPanel); }
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(); }
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; }
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(); }
void AudioView::Redo() { wxASSERT(undoManager.RedoAvailable()); TrackList *l = undoManager.Redo(&sel0, &sel1); PopState(l); FixScrollbars(); REDRAW(trackPanel); }
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); } }
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); } }
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; }
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; }
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; } }
// 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; }
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; }
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); } }