mirror of
				https://github.com/cookiengineer/audacity
				synced 2025-11-03 23:53:55 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			251 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			251 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
/**********************************************************************
 | 
						|
 | 
						|
  Audacity: A Digital Audio Editor
 | 
						|
 | 
						|
  Themability.dox2
 | 
						|
 | 
						|
  James Crook
 | 
						|
 | 
						|
********************************************************************//**
 | 
						|
 | 
						|
\page Themability Themability of Audacity
 | 
						|
 | 
						|
\section ThemeIntro Introduction
 | 
						|
 | 
						|
Audacity is Themable.  That means the images, colours and fonts can be
 | 
						|
changed at run time, and pre-built combinations can be loaded when the
 | 
						|
program starts.
 | 
						|
 | 
						|
A sample of the saved ImageCache is shown here, hover over any 
 | 
						|
part to see its name (if there is no image shown here, you will need
 | 
						|
to add the image ImageCache.png into the html directory):
 | 
						|
 | 
						|
\htmlonly
 | 
						|
<img src="ImageCache.png" width=192 height=584 usemap="#map1" align="left" hspace="10">
 | 
						|
<map name="map1">
 | 
						|
<area title="Bitmap:Pause" shape=rect coords="0,0,15,15">
 | 
						|
<area title="Bitmap:PauseDisabled" shape=rect coords="0,16,15,31">
 | 
						|
<area title="Bitmap:Play" shape=rect coords="16,0,31,15">
 | 
						|
<area title="Bitmap:PlayDisabled" shape=rect coords="16,16,31,31">
 | 
						|
<area title="Bitmap:Loop" shape=rect coords="32,0,47,15">
 | 
						|
<area title="Bitmap:LoopDisabled" shape=rect coords="32,16,47,31">
 | 
						|
<area title="Bitmap:Stop" shape=rect coords="48,0,63,15">
 | 
						|
<area title="Bitmap:StopDisabled" shape=rect coords="48,16,63,31">
 | 
						|
<area title="Bitmap:Rewind" shape=rect coords="64,0,79,15">
 | 
						|
<area title="Bitmap:RewindDisabled" shape=rect coords="64,16,79,31">
 | 
						|
<area title="Bitmap:FFwd" shape=rect coords="80,0,95,15">
 | 
						|
<area title="Bitmap:FFwdDisabled" shape=rect coords="80,16,95,31">
 | 
						|
<area title="Bitmap:Record" shape=rect coords="96,0,111,15">
 | 
						|
<area title="Bitmap:RecordDisabled" shape=rect coords="96,16,111,31">
 | 
						|
<area title="Bitmap:CleanSpeech" shape=rect coords="112,0,127,15">
 | 
						|
<area title="Bitmap:CleanSpeechDisabled" shape=rect coords="112,16,127,31">
 | 
						|
<area title="Bitmap:ToolBarToggle" shape=rect coords="0,32,42,66">
 | 
						|
<area title="Bitmap:ToolBarTarget" shape=rect coords="43,32,59,57">
 | 
						|
<area title="Bitmap:ToolBarGrabber" shape=rect coords="60,32,76,39">
 | 
						|
<area title="Bitmap:UpButton" shape=rect coords="0,67,47,114">
 | 
						|
<area title="Bitmap:DownButton" shape=rect coords="48,67,95,114">
 | 
						|
<area title="Bitmap:HiliteButton" shape=rect coords="96,67,143,114">
 | 
						|
<area title="Bitmap:RecolouredUpButton" shape=rect coords="144,67,191,114">
 | 
						|
<area title="Bitmap:RecolouredDownButton" shape=rect coords="0,115,47,162">
 | 
						|
<area title="Bitmap:RecolouredHiliteButton" shape=rect coords="48,115,95,162">
 | 
						|
<area title="Bitmap:IBeamCursor" shape=rect coords="0,163,31,194">
 | 
						|
<area title="Bitmap:DrawCursor" shape=rect coords="0,195,31,226">
 | 
						|
<area title="Bitmap:EnvCursor" shape=rect coords="32,163,63,194">
 | 
						|
<area title="Bitmap:TimeCursor" shape=rect coords="32,195,63,226">
 | 
						|
<area title="Bitmap:ZoomInCursor" shape=rect coords="64,163,95,194">
 | 
						|
<area title="Bitmap:ZoomOutCursor" shape=rect coords="64,195,95,226">
 | 
						|
<area title="Bitmap:LabelCursorLeft" shape=rect coords="96,163,127,194">
 | 
						|
<area title="Bitmap:LabelCursorRight" shape=rect coords="96,195,127,226">
 | 
						|
<area title="Bitmap:DisabledCursor" shape=rect coords="128,163,159,194">
 | 
						|
<area title="Bitmap:Cut" shape=rect coords="0,227,25,250">
 | 
						|
<area title="Bitmap:CutDisabled" shape=rect coords="0,251,25,274">
 | 
						|
<area title="Bitmap:Copy" shape=rect coords="26,227,51,250">
 | 
						|
<area title="Bitmap:CopyDisabled" shape=rect coords="26,251,51,274">
 | 
						|
<area title="Bitmap:Paste" shape=rect coords="52,227,77,250">
 | 
						|
<area title="Bitmap:PasteDisabled" shape=rect coords="52,251,77,274">
 | 
						|
<area title="Bitmap:Trim" shape=rect coords="78,227,103,250">
 | 
						|
<area title="Bitmap:TrimDisabled" shape=rect coords="78,251,103,274">
 | 
						|
<area title="Bitmap:Silence" shape=rect coords="104,227,129,250">
 | 
						|
<area title="Bitmap:SilenceDisabled" shape=rect coords="104,251,129,274">
 | 
						|
<area title="Bitmap:Undo" shape=rect coords="130,227,155,250">
 | 
						|
<area title="Bitmap:UndoDisabled" shape=rect coords="130,251,155,274">
 | 
						|
<area title="Bitmap:Redo" shape=rect coords="156,227,181,250">
 | 
						|
<area title="Bitmap:RedoDisabled" shape=rect coords="156,251,181,274">
 | 
						|
<area title="Bitmap:ZoomFit" shape=rect coords="0,275,26,301">
 | 
						|
<area title="Bitmap:ZoomFitDisabled" shape=rect coords="0,302,26,328">
 | 
						|
<area title="Bitmap:ZoomIn" shape=rect coords="27,275,53,301">
 | 
						|
<area title="Bitmap:ZoomInDisabled" shape=rect coords="27,302,53,328">
 | 
						|
<area title="Bitmap:ZoomOut" shape=rect coords="54,275,80,301">
 | 
						|
<area title="Bitmap:ZoomOutDisabled" shape=rect coords="54,302,80,328">
 | 
						|
<area title="Bitmap:ZoomSel" shape=rect coords="81,275,107,301">
 | 
						|
<area title="Bitmap:ZoomSelDisabled" shape=rect coords="81,302,107,328">
 | 
						|
<area title="Bitmap:IBeam" shape=rect coords="108,275,134,301">
 | 
						|
<area title="Bitmap:Zoom" shape=rect coords="108,302,134,328">
 | 
						|
<area title="Bitmap:Envelope" shape=rect coords="135,275,161,301">
 | 
						|
<area title="Bitmap:TimeShift" shape=rect coords="135,302,161,328">
 | 
						|
<area title="Bitmap:Draw" shape=rect coords="162,275,188,301">
 | 
						|
<area title="Bitmap:Multi" shape=rect coords="162,302,188,328">
 | 
						|
<area title="Bitmap:Mic" shape=rect coords="0,329,24,353">
 | 
						|
<area title="Bitmap:Speaker" shape=rect coords="25,329,49,353">
 | 
						|
<area title="Bitmap:Up" shape=rect coords="0,354,26,380">
 | 
						|
<area title="Bitmap:Down" shape=rect coords="27,354,53,380">
 | 
						|
<area title="Bitmap:Hilite" shape=rect coords="54,354,80,380">
 | 
						|
<area title="Bitmap:PostfishHome" shape=rect coords="81,354,99,370">
 | 
						|
<area title="Bitmap:PostfishFastRewind" shape=rect coords="100,354,116,370">
 | 
						|
<area title="Bitmap:PostfishRewind" shape=rect coords="117,354,134,370">
 | 
						|
<area title="Bitmap:PostfishPlay" shape=rect coords="135,354,163,370">
 | 
						|
<area title="Bitmap:PostfishForward" shape=rect coords="164,354,181,370">
 | 
						|
<area title="Bitmap:PostfishFastForward" shape=rect coords="0,381,16,397">
 | 
						|
<area title="Bitmap:PostfishEnd" shape=rect coords="17,381,35,397">
 | 
						|
<area title="Bitmap:PostfishLoop" shape=rect coords="36,381,64,397">
 | 
						|
<area title="Colour:Blank" shape=rect coords="0,398,9,407">
 | 
						|
<area title="Colour:Unselected" shape=rect coords="10,398,19,407">
 | 
						|
<area title="Colour:Selected" shape=rect coords="20,398,29,407">
 | 
						|
<area title="Colour:Sample" shape=rect coords="30,398,39,407">
 | 
						|
<area title="Colour:SelSample" shape=rect coords="40,398,49,407">
 | 
						|
<area title="Colour:DragSample" shape=rect coords="50,398,59,407">
 | 
						|
<area title="Colour:MuteSample" shape=rect coords="60,398,69,407">
 | 
						|
<area title="Colour:Rms" shape=rect coords="70,398,79,407">
 | 
						|
<area title="Colour:MuteRms" shape=rect coords="80,398,89,407">
 | 
						|
<area title="Colour:Shadow" shape=rect coords="90,398,99,407">
 | 
						|
</map>
 | 
						|
\endhtmlonly
 | 
						|
 | 
						|
ThemeBase provides most of the implementation of Themes.  It is destined for 
 | 
						|
\ref WidgetMigration.   Theme is Audacity's variant of a class derived 
 | 
						|
from ThemeBase.  It contains the Audacity specific list of icons and images
 | 
						|
and overloads for the required virtual functions.  A singleton instance, 
 | 
						|
\p theTheme is created by Audacity.
 | 
						|
 | 
						|
Another class, ThemePrefs, provides the GUI for loading and saving theme 
 | 
						|
information.
 | 
						|
 | 
						|
<hr>
 | 
						|
 | 
						|
\section RepresentationOfIcons The Different Ways Theme Images are Stored 
 | 
						|
 | 
						|
Audacity includes a system for loading and saving different icons and 
 | 
						|
colours.
 | 
						|
 | 
						|
There are three formats:
 | 
						|
 - Images stored combined into one PNG file.
 | 
						|
 - Images stored as individual PNG files.
 | 
						|
 - The PNG file as a file of comma separated numbers.
 | 
						|
 
 | 
						|
The first form is the one usually used.  It is useful for designers 
 | 
						|
making systematic changes of the images, particularly systematic 
 | 
						|
colour changes.  It is also convenient for archives containing many 
 | 
						|
themes and for sharing of themes.  However it is inconvenient when 
 | 
						|
there are additions to and removals from the image set used in 
 | 
						|
Audacity, as can happen between versions.  A combined PNG made 
 | 
						|
for one version of Audacity may no longer be suitable for the next 
 | 
						|
version.
 | 
						|
 | 
						|
Storing as individual images solves that problem and makes it easier
 | 
						|
for a designer to change just one image.  In SVN we check in the 
 | 
						|
individual images.
 | 
						|
 | 
						|
The third form allows Audacity to store the combined PNG in 'C' format
 | 
						|
for use in the exe.  It is only ever used by developers.  It is this 
 | 
						|
third form that provides the built in defaults in Audacity.
 | 
						|
 | 
						|
\attention The button to save a theme in the 'C' format is only 
 | 
						|
provided in debug builds. 
 | 
						|
 | 
						|
<hr>
 | 
						|
 | 
						|
\section ThemesChoosingVersion How Audacity Chooses Which Version Of The images To Use?  
 | 
						|
 | 
						|
At the time of writing this document, Audacity also has a deprecated system
 | 
						|
for its images where they initially start out with contents determined by
 | 
						|
XPMs built into the program.  
 | 
						|
 | 
						|
The current algorithm for determining which image to use is:
 | 
						|
  - IF loading the theme at start up is disabled, use the XPM defaults.
 | 
						|
  - ELSE if the image cache is available THEN use it.
 | 
						|
  - ELSE use the built in ' ThemeAsCeeCode.h ' defaults.
 | 
						|
 | 
						|
This is handled in function \ref ThemeBase::LoadThemeAtStartUp().  Once the 
 | 
						|
deprecated XPMs have been removed, we wil switch over to using the built 
 | 
						|
in 'ThemeAsCeeCode.h' defualts where we currently use the XPM defaults.
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
<hr>
 | 
						|
 | 
						|
\section ChangingTheColourScheme Changing The Colour Scheme
 | 
						|
 | 
						|
To change the colour scheme:
 | 
						|
 | 
						|
 - Run the program and use the 'Save Theme' button on the ThemePrefs panel.  
 | 
						|
This saves all the images as a single .png file, ImageCache.png.
 | 
						|
 - Use the GIMP to modify the colours in ImageCache.png.  Using the colour 
 | 
						|
balance feature provides a nice way to make a systematic change.  Note in 
 | 
						|
particular near the end of the image a row of small squares.  These are 
 | 
						|
used for colours such as the colours in the waveform.
 | 
						|
 - Use the 'Load Theme' button on the ThemePrefs panel to accept the 
 | 
						|
changes.
 | 
						|
 - Check the 'Load Theme At Startup' check box so that the theme will be 
 | 
						|
loaded next time you start Audacity.
 | 
						|
 | 
						|
<hr>
 | 
						|
 | 
						|
\section AddingNewImages Adding New Images
 | 
						|
 | 
						|
To add a new image to Audacity, add a blank place holder for the image into
 | 
						|
the program like so:
 | 
						|
 | 
						|
\code
 | 
						|
	IMAGE( bmpSomeNewImage, wxBitmap(64,64), wxT("SomeNewImage") )
 | 
						|
\endcode
 | 
						|
 | 
						|
This reserves a 64 x 64 pixel bitmap.  You can now refer to it from within the 
 | 
						|
program using bmpSomeNewImage.  If you add images on to the end of the list 
 | 
						|
you will generally have the least problems with compatability of versions.  
 | 
						|
If you are adding many images, the most efficient packing of images occurs 
 | 
						|
when the images are added in tallest-first order since Audacity starts a new
 | 
						|
row whenever the height increases.
 | 
						|
 | 
						|
Having defined the new image, follow these steps:
 | 
						|
 | 
						|
 - Compile Audacity in debug mode.
 | 
						|
 - Run the program and use the 'Save Components' button on the 
 | 
						|
ThemePrefs panel.  This saves all the images as .png files, including 
 | 
						|
a blank image for your new image.  
 | 
						|
 - Replace that .png file with the image you want to use.
 | 
						|
 - Press the 'Load Components' button on the ThemPrefs panel.
 | 
						|
 - Press the 'Save Theme' button on the ThemePrefs panel.  You now have
 | 
						|
a composite .png file that includes your image.
 | 
						|
 - Press the 'Output Sourcery' button on the Theme prefs panel.  This
 | 
						|
generates a new data file, ThemeAsCeeCode.h, which can be used for defaults.
 | 
						|
 - Replace the existing ThemeAsCeeCode.h in the Audacity source code
 | 
						|
and recompile.  You should now have a version of Audacity with the new
 | 
						|
.png as a built in default.
 | 
						|
 
 | 
						|
Audacity will now be using the image.  
 | 
						|
 | 
						|
 - When you come to check in the updated code into SVN, including 
 | 
						|
ThemeAsCeeCode.h, remember to also add your new .png image into SVN 
 | 
						|
too.
 | 
						|
 | 
						|
<hr>
 | 
						|
 | 
						|
\section RescuingDefaultImages Rescuing Default Images
 | 
						|
 | 
						|
It is possible to completely screw up the built in default images 
 | 
						|
through using an incorrect ThemeAsCeeCode.h.  A correct ThemeAsCeeCode.h
 | 
						|
can be regenerated as follows:
 | 
						|
 | 
						|
 - Retrieve a correct set of images from SVN and place them in the 
 | 
						|
components directory used by Audacity.
 | 
						|
 - Compile Audacity in debug mode.
 | 
						|
 - Use ThemePrefs 'Load Components' to load the correct set of images.
 | 
						|
 - Press the 'Output Sourcery' button on the Theme prefs panel.  This
 | 
						|
generates a corrected ThemeAsCeeCode.h using the images you just loaded.
 | 
						|
 - Replace the existing ThemeAsCeeCode.h in the Audacity source code
 | 
						|
and recompile.  
 | 
						|
 | 
						|
 | 
						|
 | 
						|
*//********************************************************************/ |