mirror of
https://github.com/cookiengineer/audacity
synced 2025-06-25 16:48:44 +02:00
This change is believed to be a direct refactoring that does not change functionality. It paves the way for more complex kinds of selection, such as selections involving frequency as well as time. It also reduces risk of left and right edges being swapped in future code using SelectedRegion, as the default is to swap on assignment if needed.
184 lines
4.6 KiB
C++
184 lines
4.6 KiB
C++
/**********************************************************************
|
|
|
|
Audacity: A Digital Audio Editor
|
|
|
|
Printing.cpp
|
|
|
|
Dominic Mazzoni
|
|
|
|
*******************************************************************//*!
|
|
|
|
\class AudacityPrintout
|
|
\brief Derived from wxPrintout, this class helps with printing.
|
|
|
|
*//*******************************************************************/
|
|
|
|
|
|
#include "Audacity.h"
|
|
|
|
#include <wx/defs.h>
|
|
#include <wx/dc.h>
|
|
#include <wx/intl.h>
|
|
#include <wx/msgdlg.h>
|
|
#include <wx/print.h>
|
|
#include <wx/printdlg.h>
|
|
|
|
#include "AColor.h"
|
|
#include "Track.h"
|
|
#include "TrackArtist.h"
|
|
#include "ViewInfo.h"
|
|
#include "WaveTrack.h"
|
|
#include "widgets/Ruler.h"
|
|
#include "Printing.h"
|
|
|
|
// Globals, so that we remember settings from session to session
|
|
static wxPrintData *gPrintData = NULL;
|
|
static wxPageSetupData *gPageSetupData = NULL;
|
|
|
|
class AudacityPrintout : public wxPrintout
|
|
{
|
|
public:
|
|
AudacityPrintout(wxString title,
|
|
TrackList *tracks):
|
|
wxPrintout(title),
|
|
mTracks(tracks)
|
|
{
|
|
}
|
|
bool OnPrintPage(int page);
|
|
bool HasPage(int page);
|
|
bool OnBeginDocument(int startPage, int endPage);
|
|
void GetPageInfo(int *minPage, int *maxPage,
|
|
int *selPageFrom, int *selPageTo);
|
|
|
|
private:
|
|
TrackList *mTracks;
|
|
};
|
|
|
|
bool AudacityPrintout::OnPrintPage(int WXUNUSED(page))
|
|
{
|
|
wxDC *dc = GetDC();
|
|
if (!dc)
|
|
return false;
|
|
|
|
int width, height;
|
|
dc->GetSize(&width, &height);
|
|
|
|
int rulerScreenHeight = 40;
|
|
int screenTotalHeight = mTracks->GetHeight() + rulerScreenHeight;
|
|
|
|
double scale = height / (double)screenTotalHeight;
|
|
|
|
int rulerPageHeight = (int)(rulerScreenHeight * scale);
|
|
Ruler ruler;
|
|
ruler.SetBounds(0, 0, width, rulerPageHeight);
|
|
ruler.SetOrientation(wxHORIZONTAL);
|
|
ruler.SetRange(0.0, mTracks->GetEndTime());
|
|
ruler.SetFormat(Ruler::TimeFormat);
|
|
ruler.SetLabelEdges(true);
|
|
ruler.Draw(*dc);
|
|
|
|
TrackArtist artist;
|
|
artist.SetBackgroundBrushes(*wxWHITE_BRUSH, *wxWHITE_BRUSH,
|
|
*wxWHITE_PEN, *wxWHITE_PEN);
|
|
ViewInfo viewInfo;
|
|
viewInfo.selectedRegion = SelectedRegion();
|
|
viewInfo.vpos = 0;
|
|
viewInfo.h = 0.0;
|
|
viewInfo.screen = mTracks->GetEndTime() - viewInfo.h;
|
|
viewInfo.total = viewInfo.screen;
|
|
viewInfo.zoom = viewInfo.lastZoom = width / viewInfo.screen;
|
|
int y = rulerPageHeight;
|
|
|
|
TrackListIterator iter(mTracks);
|
|
Track *n = iter.First();
|
|
while (n) {
|
|
wxRect r;
|
|
r.x = 0;
|
|
r.y = y;
|
|
r.width = width;
|
|
r.height = (int)(n->GetHeight() * scale);
|
|
|
|
artist.DrawTrack(n, *dc, r, &viewInfo, false, false, false, false);
|
|
|
|
dc->SetPen(*wxBLACK_PEN);
|
|
AColor::Line(*dc, 0, r.y, width, r.y);
|
|
|
|
#ifdef EXPERIMENTAL_OUTPUT_DISPLAY
|
|
if(MONO_WAVE_PAN(n)){
|
|
y += r.height;
|
|
r.x = 0;
|
|
r.y = y;
|
|
r.width = width;
|
|
r.height = (int)(n->GetHeight(true) * scale);
|
|
artist.DrawTrack(n, *dc, r, &viewInfo, false, false, false, false);
|
|
dc->SetPen(*wxBLACK_PEN);
|
|
AColor::Line(*dc, 0, r.y, width, r.y);
|
|
}
|
|
#endif
|
|
n = iter.Next();
|
|
y += r.height;
|
|
};
|
|
|
|
return true;
|
|
}
|
|
|
|
bool AudacityPrintout::HasPage(int page)
|
|
{
|
|
return (page==1);
|
|
}
|
|
|
|
bool AudacityPrintout::OnBeginDocument(int startPage, int endPage)
|
|
{
|
|
return wxPrintout::OnBeginDocument(startPage, endPage);
|
|
}
|
|
|
|
void AudacityPrintout::GetPageInfo(int *minPage, int *maxPage,
|
|
int *selPageFrom, int *selPageTo)
|
|
{
|
|
*minPage = 1;
|
|
*maxPage = 1;
|
|
*selPageFrom = 1;
|
|
*selPageTo = 1;
|
|
}
|
|
|
|
void HandlePageSetup(wxWindow *parent)
|
|
{
|
|
if (gPageSetupData == NULL)
|
|
gPageSetupData = new wxPageSetupDialogData();
|
|
if (gPrintData == NULL)
|
|
gPrintData = new wxPrintData();
|
|
|
|
(*gPageSetupData) = *gPrintData;
|
|
|
|
wxPageSetupDialog pageSetupDialog(parent, gPageSetupData);
|
|
pageSetupDialog.ShowModal();
|
|
|
|
(*gPrintData) = pageSetupDialog.GetPageSetupData().GetPrintData();
|
|
(*gPageSetupData) = pageSetupDialog.GetPageSetupData();
|
|
}
|
|
|
|
void HandlePrint(wxWindow *parent, wxString name, TrackList *tracks)
|
|
{
|
|
if (gPageSetupData == NULL)
|
|
gPageSetupData = new wxPageSetupDialogData();
|
|
if (gPrintData == NULL)
|
|
gPrintData = new wxPrintData();
|
|
|
|
wxPrintDialogData printDialogData(*gPrintData);
|
|
|
|
wxPrinter printer(&printDialogData);
|
|
AudacityPrintout printout(name, tracks);
|
|
if (!printer.Print(parent, &printout, true)) {
|
|
if (wxPrinter::GetLastError() == wxPRINTER_ERROR) {
|
|
wxMessageBox(_("There was a problem printing."),
|
|
_("Print"), wxOK);
|
|
}
|
|
else {
|
|
// Do nothing, the user cancelled...
|
|
}
|
|
}
|
|
else {
|
|
*gPrintData = printer.GetPrintDialogData().GetPrintData();
|
|
}
|
|
}
|