1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-07-02 08:03:48 +02:00

Apply theme preference at start

This commit is contained in:
James Crook 2017-04-02 10:51:08 +01:00
parent 35a4f1a09c
commit 46fc78919a
4 changed files with 74 additions and 77 deletions

View File

@ -189,19 +189,16 @@ WX_DEFINE_USER_EXPORTED_OBJARRAY( ArrayOfColours )
#include "AllThemeResources.h"
// Include the ImageCache...
// DA: Default theme is dark
#ifdef EXPERIMENTAL_DA
static unsigned char ImageCacheAsData[] = {
static unsigned char DarkImageCacheAsData[] = {
#include "DarkThemeAsCeeCode.h"
};
static unsigned char LightImageCacheAsData[] = {
#include "LightThemeAsCeeCode.h"
};
#else
static unsigned char ImageCacheAsData[] = {
static unsigned char ClassicImageCacheAsData[] = {
#include "ThemeAsCeeCode.h"
};
#endif
// theTheme is a global variable.
AUDACITY_DLL_API Theme theTheme;
@ -228,9 +225,20 @@ void Theme::EnsureInitialised()
RegisterExtraThemeResources();
#endif
bool bLoadThemeAtStart;
gPrefs->Read( wxT("/Theme/LoadAtStart"), &bLoadThemeAtStart, false );
LoadThemeAtStartUp( bLoadThemeAtStart );
LoadPreferredTheme();
}
bool ThemeBase::LoadPreferredTheme()
{
// DA: Default themes differ.
#ifdef EXPERIMENTAL_DA
wxString theme = gPrefs->Read(wxT("/GUI/Theme"), wxT("dark"));
#else
wxString theme = gPrefs->Read(wxT("/GUI/Theme"), wxT("classic"));
#endif
theTheme.LoadTheme( theTheme.ThemeTypeOfTypeName( theme ) );
return true;
}
void Theme::ApplyUpdatedImages()
@ -275,40 +283,17 @@ ThemeBase::~ThemeBase(void)
}
/// This function is called to load the initial Theme images.
/// There are many possible choices for what this function
/// should do, as we have (potentially) four sources of images.
/// - (deprecated) programmed in XPMs.
/// - Programmed in in-built theme.
/// - External image Cache file.
/// - External component files.
///
/// We currently still have the deprecated XPMs, so we have
/// those being used if the user decides not to load themes.
///
/// @param bLookForExternalFiles uses file iff true.
void ThemeBase::LoadThemeAtStartUp( bool bLookForExternalFiles )
/// It does not though cause the GUI to refresh.
void ThemeBase::LoadTheme( teThemeType Theme )
{
EnsureInitialised();
const bool cbOkIfNotFound = true;
// IF not interested in external files,
// THEN just use the internal default set.
if( !bLookForExternalFiles )
{
// IF the XPMs have been retired, THEN we'd better use the built-in cache
// at start up.
// ELSE do nothing, we already have XPM based images.
#ifdef XPMS_RETIRED
ReadThemeInternal();
#endif
return;
}
// ELSE IF can't read the external image cache.
else if( !ReadImageCache( themeDark, cbOkIfNotFound ) )
if( !ReadImageCache( Theme, cbOkIfNotFound ) )
{
// THEN get the default set.
ReadThemeInternal();
ReadImageCache( GetFallbackThemeType(), !cbOkIfNotFound );
// JKC: Now we could go on and load the individual images
// on top of the default images using the commented out
@ -798,7 +783,28 @@ void ThemeBase::WriteImageDefs( )
}
teThemeType ThemeBase::GetFallbackThemeType(){
// Fallback must be an internally supported type,
// to guarantee it is found.
#ifdef EXPERIMENTAL_DA
return themeDark;
#else
return themeClassic;
#endif
}
teThemeType ThemeBase::ThemeTypeOfTypeName( const wxString & Name )
{
wxArrayString aThemes;
aThemes.Add( "classic" );
aThemes.Add( "dark" );
aThemes.Add( "light" );
aThemes.Add( "custom" );
int themeIx = aThemes.Index( Name );
if( themeIx < 0 )
return GetFallbackThemeType();
return (teThemeType)themeIx;
}
@ -845,18 +851,25 @@ bool ThemeBase::ReadImageCache( teThemeType type, bool bOkIfNotFound)
// ELSE we are reading from internal storage.
else
{
// DA: Has more built-in theme sources.
#ifdef EXPERIMENTAL_DA
wxMemoryInputStream DarkInternalStream(
(char *)ImageCacheAsData, sizeof(ImageCacheAsData));
wxMemoryInputStream LightInternalStream(
(char *)LightImageCacheAsData, sizeof(LightImageCacheAsData));
wxMemoryInputStream & InternalStream = (type == themeDark) ?
DarkInternalStream : LightInternalStream;
#else
wxMemoryInputStream InternalStream(
(char *)ImageCacheAsData, sizeof(ImageCacheAsData));
#endif
size_t ImageSize = 0;
char * pImage = NULL;
switch( type ){
case themeClassic :
ImageSize = sizeof(ClassicImageCacheAsData);
pImage = (char *)ClassicImageCacheAsData;
break;
default:
case themeDark :
ImageSize = sizeof(DarkImageCacheAsData);
pImage = (char *)DarkImageCacheAsData;
break;
case themeLight :
ImageSize = sizeof(LightImageCacheAsData);
pImage = (char *)LightImageCacheAsData;
break;
}
wxMemoryInputStream InternalStream( pImage, ImageSize );
if( !ImageCache.LoadFile( InternalStream, wxBITMAP_TYPE_PNG ))
{
// If we get this message, it means that the data in file
@ -1039,11 +1052,6 @@ void ThemeBase::SaveComponents()
FileNames::ThemeComponentsDir().c_str() ));
}
void ThemeBase::ReadThemeInternal()
{
// false indicates not using standard binary method.
ReadImageCache( themeDark );
}
void ThemeBase::SaveThemeAsCode()
{

View File

@ -46,9 +46,10 @@ enum teResourceFlags
enum teThemeType
{
themeClassic,
themeDark,
themeLight,
themeFromFile
themeFromFile,
};
WX_DECLARE_USER_EXPORTED_OBJARRAY(wxImage, ArrayOfImages, AUDACITY_DLL_API);
@ -100,19 +101,22 @@ public:
public:
virtual void EnsureInitialised()=0;
virtual void ApplyUpdatedImages()=0;
void LoadThemeAtStartUp( bool bLookForExternalFiles );
void LoadTheme( teThemeType Theme );
void RegisterImage( int &iIndex,char const** pXpm, const wxString & Name);
void RegisterImage( int &iIndex, const wxImage &Image, const wxString & Name );
void RegisterColour( int &iIndex, const wxColour &Clr, const wxString & Name );
teThemeType GetFallbackThemeType();
teThemeType ThemeTypeOfTypeName( const wxString & Name );
void CreateImageCache(bool bBinarySave = true);
bool ReadImageCache( teThemeType type = themeFromFile, bool bOkIfNotFound=false);
void LoadComponents( bool bOkIfNotFound =false);
void SaveComponents();
void ReadThemeInternal();
void SaveThemeAsCode();
void WriteImageDefs( );
void WriteImageMap( );
static bool LoadPreferredTheme();
wxColour & Colour( int iIndex );
wxBitmap & Bitmap( int iIndex );

View File

@ -166,6 +166,8 @@ void GUIPrefs::PopulateOrExchange(ShuttleGui & S)
{
S.StartRadioButtonGroup(wxT("/GUI/Theme"), wxT("dark"));
{
S.TieRadioButton(_("Classic"),
wxT("classic"));
S.TieRadioButton(_("Dark"),
wxT("dark"));
S.TieRadioButton(_("Light"),
@ -191,26 +193,9 @@ bool GUIPrefs::Apply()
gPrefs->Write(wxT("/Locale/Language"), usedLang);
gPrefs->Flush();
}
// DA: Default themes differ.
#ifdef EXPERIMENTAL_DA
wxString theme = gPrefs->Read(wxT("/GUI/Theme"), wxT("dark"));
#else
wxString theme = gPrefs->Read(wxT("/GUI/Theme"), wxT("light"));
#endif
if( theme != "foo" ){
// gPrefs->Write(wxT("/GUI/Theme"), theme);
// gPrefs->Flush();
wxArrayString aThemes;
aThemes.Add( "dark" );
aThemes.Add( "light" );
aThemes.Add( "custom" );
int themeIx = std::max( 0, aThemes.Index( theme ));
theTheme.ReadImageCache( (teThemeType)themeIx );
theTheme.ApplyUpdatedImages();
}
// Reads preference /GUI/Theme
theTheme.LoadPreferredTheme();
theTheme.ApplyUpdatedImages();
return true;
}

View File

@ -185,7 +185,7 @@ void ThemePrefs::OnSaveThemeCache(wxCommandEvent & WXUNUSED(event))
/// Read Theme from internal storage.
void ThemePrefs::OnReadThemeInternal(wxCommandEvent & WXUNUSED(event))
{
theTheme.ReadThemeInternal();
theTheme.ReadImageCache( theTheme.GetFallbackThemeType() );
theTheme.ApplyUpdatedImages();
}