void ToolManager::Reset() { int ndx; // Disconnect all docked bars for( ndx = 0; ndx < ToolBarCount; ndx++ ) { wxWindow *parent; ToolDock *dock; ToolBar *bar = mBars[ ndx ]; // Disconnect the bar if( bar->IsDocked() ) { bar->GetDock()->Undock( bar ); parent = NULL; } else { parent = bar->GetParent(); } if( ndx == SelectionBarID ) { dock = mBotDock; wxCommandEvent e; bar->GetEventHandler()->ProcessEvent(e); } else { dock = mTopDock; bar->ReCreateButtons(); } bar->EnableDisableButtons(); #if 0 if( bar->IsResizable() ) { bar->SetSize(bar->GetBestFittingSize()); } #endif dock->Dock( bar ); Expose( ndx, ndx == DeviceBarID ? false : true ); if( parent ) { parent->Destroy(); } } LayoutToolBars(); Updated(); }
void ToolManager::Reset() { int ndx; // The mInputMeter and mOutputMeter may be in use if audio is playing // when this happens. gAudioIO->SetMeters( NULL, NULL ); // Disconnect all docked bars for( ndx = 0; ndx < ToolBarCount; ndx++ ) { wxWindow *parent; ToolDock *dock; ToolBar *bar = mBars[ ndx ]; // Disconnect the bar if( bar->IsDocked() ) { bar->GetDock()->Undock( bar ); parent = NULL; } else { parent = bar->GetParent(); } if( ndx == SelectionBarID ) { dock = mBotDock; wxCommandEvent e; bar->GetEventHandler()->ProcessEvent(e); } else { dock = mTopDock; bar->ReCreateButtons(); } bar->EnableDisableButtons(); #if 0 if( bar->IsResizable() ) { bar->SetSize(bar->GetBestFittingSize()); } #endif dock->Dock( bar ); Expose( ndx, true ); if( parent ) { parent->Destroy(); } } // TODO:?? // If audio was playing, we stopped the VU meters, // It would be nice to show them again, but hardly essential as // they will show up again on the next play. // SetVUMeters(AudacityProject *p); LayoutToolBars(); Updated(); }
// // Determine the location and bar before which a new bar would be placed // // 'rect' will be the rectangle for the dock marker. int ToolDock::PositionBar( ToolBar *t, wxPoint & pos, wxRect & rect ) { struct { wxRect rect; wxSize min; } tinfo[ ToolBarCount + 1 ]; wxRect stack[ ToolBarCount + 1 ]; wxPoint cpos, lpos; int ct, lt = 0; int ndx, stkcnt = 0; int tindx = -1; int cnt = mDockedBars.GetCount(); int width, height; // Get size of our parent since we haven't been sized yet GetParent()->GetClientSize( &width, &height ); width -= toolbarGap; height -= toolbarGap; // Set initial stack entry to maximum size stack[ 0 ].SetX( toolbarGap ); stack[ 0 ].SetY( toolbarGap ); // The stack width and height are the remaining width and height. stack[ 0 ].SetWidth( width ); stack[ 0 ].SetHeight( height ); // Process all docked and visible toolbars // // Careful...slightly different from above in that we expect to // process one more bar than is currently docked (<= in for) for (ndx = 0, ct = 0; ndx <= cnt; ndx++, ct++) { // If last entry, then it is the if (ndx == cnt) { // ...so check to see if the new bar has been placed yet if (tindx == -1) { // Add the new bars' dimensions to the mix tinfo[ct].rect = t->GetRect(); tinfo[ct].min = t->GetDockedSize(); tindx = ct; } } else { // Cache toolbar pointer ToolBar *b = (ToolBar *)mDockedBars[ndx]; // Remember current bars' dimensions tinfo[ct].rect = b->GetRect(); tinfo[ct].min = b->GetSize(); // Maybe insert the new bar if it hasn't already been done // and is in the right place. if (tindx == -1) { wxRect r; // Get bar rect and make gap part of it r.SetPosition(b->GetParent()->ClientToScreen(b->GetPosition())); r.SetSize(b->IsResizable() ? b->GetSize() : b->GetSize()); r.width += toolbarGap; r.height += toolbarGap; // Does the location fall within this bar? if (r.Contains(pos) || pos.y <= r.y) { // Add the new bars' dimensions to the mix tinfo[ct].rect = t->GetRect(); tinfo[ct].min = t->GetDockedSize(); tindx = ct; ndx--; } } } // Get and cache the toolbar sizes wxSize sz = tinfo[ct].min; int tw = sz.GetWidth() + toolbarGap; int th = sz.GetHeight() + toolbarGap; // This loop reduces stkcnt until it gives a box // that we fit in. while (stkcnt > 0) { // Get out if it will fit bool bTooWide = tw > stack[stkcnt].GetWidth(); // We'd like to be able to add a tall toolbar in at the start of a row, // even if there isn't enough height for it. // If so, we'd have to at least change how we calculate 'bTooHigh'. bool bTooHigh = th > stack[stkcnt].GetHeight(); //bTooHigh &= stack[stkcnt].GetWidth() < (width - toolbarGap); //bTooHigh = false; if (!bTooWide && !bTooHigh) break; stkcnt--; } // The current stack entry position is where the bar // will be placed. cpos = stack[stkcnt].GetPosition(); // We'll be using at least a portion of this stack entry, so // adjust the location and size. It is possible that these // will become zero if this entry and the toolbar have the // same height. This is (?) what we want as it will be destacked // in the next iteration. stack[stkcnt].SetY(stack[stkcnt].GetY() + th); stack[stkcnt].SetHeight(stack[stkcnt].GetHeight() - th); // Calc the next possible horizontal location. int x = cpos.x + tw; // Add a new stack entry stkcnt++; stack[stkcnt].SetX(x); stack[stkcnt].SetY(cpos.y); stack[stkcnt].SetWidth(width - x); stack[stkcnt].SetHeight(th); // Position the previous toolbar if (ndx > 0) { // Place the unstretched toolbar tinfo[lt].rect.x = lpos.x; tinfo[lt].rect.y = lpos.y; } // Remember for next iteration lt = ct; lpos = cpos; // If we've placed it, we're done. if (tindx != -1) { tinfo[tindx].rect.x = cpos.x; tinfo[tindx].rect.y = cpos.y; break; } } // Fill in the final position rect = tinfo[ tindx ].rect; return tindx; }
// // Determine the location and bar before which a new bar would be placed // int ToolDock::PositionBar( ToolBar *t, wxPoint & pos, wxRect & rect ) { struct { wxRect rect; wxSize min; } tinfo[ ToolBarCount + 1 ]; wxRect stack[ ToolBarCount + 1 ]; wxPoint cpos, lpos; int ct, lt = 0; int ndx, stkcnt = 0; int tindx = -1; int cnt = mDockedBars.GetCount(); int width, height; // Get size of our parent since we haven't been sized yet GetParent()->GetClientSize( &width, &height ); width -= toolbarGap; height -= toolbarGap; // Set initial stack entry to maximum size stack[ 0 ].SetX( toolbarGap ); stack[ 0 ].SetY( toolbarGap ); stack[ 0 ].SetWidth( width ); stack[ 0 ].SetHeight( height ); // Process all docked and visible toolbars // // Careful...slightly different from above in that we expect to // process one more bar than is currently docked (<= in for) for( ndx = 0, ct = 0; ndx <= cnt; ndx++, ct++ ) { // We're on the last entry... if( ndx == cnt ) { // ...so check to see if the new bar has been placed yet if( tindx == -1 ) { // Add the new bars' dimensions to the mix tinfo[ ct ].rect = t->GetRect(); tinfo[ ct ].min = t->GetMinSize(); tindx = ct; } } else { // Cache toolbar pointer ToolBar *b = (ToolBar *) mDockedBars[ ndx ]; // Remember current bars' dimensions tinfo[ ct ].rect = b->GetRect(); tinfo[ ct ].min = b->GetSize(); // Insert the new bar if it hasn't already been done if( tindx == -1 ) { wxRect r; // Get bar rect and make gap part of it r.SetPosition( b->GetParent()->ClientToScreen( b->GetPosition() ) ); r.SetSize( b->IsResizable() ? b->GetSize() : b->GetSize() ); r.width += toolbarGap; r.height += toolbarGap; // Does the location fall within this bar? if( r.Contains( pos ) || pos.y <= r.y ) { // Add the new bars' dimensions to the mix tinfo[ ct ].rect = t->GetRect(); tinfo[ ct ].min = t->GetSize(); tindx = ct; ndx--; } } } // Get and cache the toolbar sizes wxSize sz = tinfo[ ct ].min; int tw = sz.GetWidth() + toolbarGap; int th = sz.GetHeight() + toolbarGap; // Will this one fit in remaining horizontal space? if( ( tw > stack[ stkcnt ].GetWidth() ) || ( th > stack[ stkcnt ].GetHeight() ) ) { // Destack entries until one is found in which this bar // will fit or until we run out of stacked entries while( stkcnt > 0 ) { stkcnt--; // Get out if it will fit if( ( tw <= stack[ stkcnt ].GetWidth() ) && ( th <= stack[ stkcnt ].GetHeight() ) ) { break; } } } // The current stack entry position is where the bar // will be placed. cpos = stack[ stkcnt ].GetPosition(); // We'll be using at least a portion of this stack entry, so // adjust the location and size. It is possible that these // will become zero if this entry and the toolbar have the // same height. This is what we want as it will be destacked // in the next iteration. stack[ stkcnt ].SetY( stack[ stkcnt ].GetY() + th ); stack[ stkcnt ].SetHeight( stack[ stkcnt ].GetHeight() - th ); // Calc the next possible horizontal location. int x = cpos.x + tw; // Add a new stack entry stkcnt++; stack[ stkcnt ].SetX( x ); stack[ stkcnt ].SetY( cpos.y ); stack[ stkcnt ].SetWidth( width - x ); stack[ stkcnt ].SetHeight( th ); // Position the previous toolbar if( ndx > 0 ) { // Place the unstretched toolbar tinfo[ lt ].rect.x = lpos.x; tinfo[ lt ].rect.y = lpos.y; } // Place and stretch the final toolbar if( ndx == cnt ) { tinfo[ ct ].rect.x = cpos.x; tinfo[ ct ].rect.y = cpos.y; } // Remember for next iteration lt = ct; lpos = cpos; } // Fill in the final position rect = tinfo[ tindx ].rect; return tindx; }
void ToolManager::Reset() { // Disconnect all docked bars for ( const auto &entry : DefaultConfigTable ) { int ndx = entry.barID; ToolBar *bar = mBars[ ndx ].get(); ToolBarConfiguration::Position position { (entry.rightOf == NoBarID) ? nullptr : mBars[ entry.rightOf ].get(), (entry.below == NoBarID) ? nullptr : mBars[ entry.below ].get() }; wxWindow *floater; ToolDock *dock; bool expose = true; // Disconnect the bar if( bar->IsDocked() ) { bar->GetDock()->Undock( bar ); floater = NULL; } else { floater = bar->GetParent(); } if (ndx == SelectionBarID #ifdef EXPERIMENTAL_SPECTRAL_EDITING || ndx == SpectralSelectionBarID #endif ) { dock = mBotDock; wxCommandEvent e; bar->GetEventHandler()->ProcessEvent(e); } else { dock = mTopDock; bar->ReCreateButtons(); } bar->EnableDisableButtons(); #if 0 if( bar->IsResizable() ) { bar->SetSize(bar->GetBestFittingSize()); } #endif if( ndx == MeterBarID #ifdef EXPERIMENTAL_SPECTRAL_EDITING || ndx == SpectralSelectionBarID #endif || ndx == ScrubbingBarID ) { expose = false; } if( dock != NULL ) { // when we dock, we reparent, so bar is no longer a child of floater. dock->Dock( bar, false, position ); Expose( ndx, expose ); //OK (and good) to DELETE floater, as bar is no longer in it. if( floater ) floater->Destroy(); } else { // The (tool)bar has a dragger window round it, the floater. // in turn floater will have mParent (the entire App) as its // parent. // Maybe construct a NEW floater // this happens if we have just been bounced out of a dock. if( floater == NULL ) { wxASSERT(mParent); floater = safenew ToolFrame( mParent, this, bar, wxPoint(-1,-1) ); bar->Reparent( floater ); } // This bar is undocked and invisible. // We are doing a reset toolbars, so even the invisible undocked bars should // be moved somewhere sensible. Put bar near center of window. // If there were multiple hidden toobars the ndx * 10 adjustment means // they won't overlap too much. floater->CentreOnParent( ); floater->Move( floater->GetPosition() + wxSize( ndx * 10 - 200, ndx * 10 )); bar->SetDocked( NULL, false ); Expose( ndx, false ); } } // TODO:?? // If audio was playing, we stopped the VU meters, // It would be nice to show them again, but hardly essential as // they will show up again on the next play. // SetVUMeters(AudacityProject *p); LayoutToolBars(); Updated(); }