📄 freeamptheme.cpp
字号:
/*____________________________________________________________________________
FreeAmp - The Free MP3 Player
Copyright (C) 1999 EMusic.com
Portions Copyright (C) 1999 Valters Vingolds
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
$Id: FreeAmpTheme.cpp,v 1.67 2000/01/19 22:20:30 ijr Exp $
____________________________________________________________________________*/
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#ifndef WIN32
#include <unistd.h>
#define _stat stat
#define _S_IFDIR S_IFDIR
#endif
#include "config.h"
#include "downloadmanager.h"
#ifdef HAVE_GTK
#include "GTKUtility.h"
#include "GTKPreferenceWindow.h"
#elif defined(WIN32)
#include "Win32Window.h"
#include "Win32PreferenceWindow.h"
#include "win32updatemanager.h"
#include "resource.h"
extern HINSTANCE g_hinst;
#elif defined(__BEOS__)
#include "BeOSPreferenceWindow.h"
#include "win32impl.h"
#endif
#include "FreeAmpTheme.h"
#include "MessageDialog.h"
#include "eventdata.h"
#include "event.h"
#include "debug.h"
#include "PreferenceWindow.h"
#include "playlist.h"
#include "player.h"
#include "help.h"
#include "properties.h"
void WorkerThreadStart(void* arg);
#define DB Debug_v("%s:%d\n", __FILE__, __LINE__);
const char *szWelcomeMsg = "Welcome to "the_BRANDING"!";
const char *szParseError = "Parsing the Theme description failed. Cause: ";
const char *szCantFindHelpError = "Cannot find the help files. Please make "
"sure that the help files are properly "
"installed, and you are not running "
the_BRANDING" from the build directory.";
const char *szKeepThemeMessage = "Would you like to keep this theme?";
const int iVolumeChangeIncrement = 10;
struct OptionsArgs
{
FreeAmpTheme *pThis;
uint32 uDefaultPage;
};
extern "C"
{
UserInterface *Initialize(FAContext * context)
{
//Debug_v("##Clear");
return new FreeAmpTheme(context);
}
}
FreeAmpTheme::FreeAmpTheme(FAContext * context)
:Theme(context)
{
char szTemp[255];
uint32 iLen = 255;
m_pContext = context;
m_iCurrentSeconds = 0;
m_iTotalSeconds = -1;
m_iSeekSeconds = 0;
m_bSeekInProgress = false;
m_iVolume = -1;
m_iSeekPos = -1;
m_bPlayShown = true;
m_oTitle = string("");
m_eTimeDisplayState = kNormal;
m_oStreamInfo = string("");
m_pUpdateMan = NULL;
m_pUpdateThread = NULL;
m_pOptionsThread = NULL;
m_bInOptions = false;
m_bPaused = false;
#if defined( WIN32 )
m_pUpdateMan = new Win32UpdateManager(m_pContext);
m_pUpdateMan->DetermineLocalVersions();
m_pUpdateMan->SetPlatform(string("WIN32"));
#if defined( _M_ALPHA )
m_pUpdateMan->SetArchitecture(string("ALPHA"));
#else
m_pUpdateMan->SetArchitecture(string("X86"));
#endif // _M_ALPHA
#endif // WIN32
m_pContext->prefs->GetPrefString(kWindowModePref, szTemp, &iLen);
if (iLen > 0)
m_oCurrentWindow = string(szTemp);
else
m_oCurrentWindow = string("MainWindow");
LoadFreeAmpTheme();
}
FreeAmpTheme::~FreeAmpTheme()
{
if (m_pOptionsThread)
{
delete m_pOptionsThread;
m_pOptionsThread = NULL;
}
#if defined( WIN32 )
delete m_pUpdateMan;
#endif // WIN32
}
Error FreeAmpTheme::Init(int32 startup_type)
{
assert(this);
m_iStartupType = startup_type;
m_uiThread = Thread::CreateThread();
m_uiThread->Create(WorkerThreadStart, this);
return kError_NoErr;
}
void FreeAmpTheme::WorkerThread(void)
{
char szTemp[255];
uint32 iLen = 255;
Error eRet;
int32 iValue;
m_pContext->prefs->GetTimeDisplay(&iValue);
if (iValue)
m_eTimeDisplayState = kTimeRemaining;
m_pContext->prefs->GetPrefString(kMainWindowPosPref, szTemp, &iLen);
sscanf(szTemp, " %d , %d", &m_oWindowPos.x, &m_oWindowPos.y);
#ifdef WIN32
bool checkForUpdates = false;
m_pContext->prefs->GetCheckForUpdates(&checkForUpdates);
if(checkForUpdates)
{
m_pUpdateThread = Thread::CreateThread();
m_pUpdateThread->Create(update_thread, this);
}
#endif
eRet = Theme::Run(m_oWindowPos);
if (!IsError(eRet))
{
sprintf(szTemp, "%d,%d", m_oWindowPos.x, m_oWindowPos.y);
m_pContext->prefs->SetPrefString(kMainWindowPosPref, szTemp);
m_pContext->prefs->SetPrefString(kWindowModePref, m_oCurrentWindow.c_str());
}
else
m_pContext->target->AcceptEvent(new Event(CMD_QuitPlayer));
m_pContext->prefs->SetTimeDisplay(m_eTimeDisplayState == kTimeRemaining);
}
void WorkerThreadStart(void* arg)
{
FreeAmpTheme* ui = (FreeAmpTheme*)arg;
ui->WorkerThread();
}
void FreeAmpTheme::LoadFreeAmpTheme(void)
{
char szTemp[255];
uint32 iLen = 255;
string oThemePath;
Error eRet;
m_pContext->prefs->GetPrefString(kThemePathPref, szTemp, &iLen);
oThemePath = szTemp;
if (strchr(szTemp, DIR_MARKER) == NULL)
{
string oBase = oThemePath;
map<string, string> oThemeList;
m_pThemeMan->GetThemeList(oThemeList);
char *dot;
if ((dot = strchr(oBase.c_str(), '.')))
dot = '\0';
oThemePath = oThemeList[oBase];
}
iLen = 255;
m_pContext->prefs->GetPrefString(kThemeDefaultFontPref, szTemp, &iLen);
SetDefaultFont(string(szTemp));
eRet = LoadTheme(oThemePath, m_oCurrentWindow);
if (IsError(eRet) && eRet != kError_InvalidParam)
{
MessageDialog oBox(m_pContext);
string oErr, oMessage(szParseError);
GetErrorString(oErr);
oMessage += oErr;
oBox.Show(oMessage.c_str(), string(BRANDING), kMessageOk);
m_pContext->target->AcceptEvent(new Event(CMD_QuitPlayer));
}
if (eRet == kError_InvalidParam)
m_pContext->target->AcceptEvent(new Event(CMD_QuitPlayer));
}
Error FreeAmpTheme::Close(void)
{
Theme::Close();
if (!m_uiThread)
return kError_NoErr;
m_uiThread->Join();
delete m_uiThread;
m_uiThread = NULL;
return kError_NoErr;
}
int32 FreeAmpTheme::AcceptEvent(Event * e)
{
switch (e->Type())
{
case INFO_ErrorMessage:
{
MessageDialog oBox(m_pContext);
ErrorMessageEvent *pEvent = (ErrorMessageEvent *)e;
string oDesc(pEvent->GetErrorMessage());
oBox.Show(oDesc.c_str(), string(BRANDING), kMessageOk);
break;
}
case INFO_StatusMessage:
{
StatusMessageEvent *pEvent = (StatusMessageEvent *)e;
string oDesc(pEvent->GetStatusMessage());
m_pWindow->ControlStringValue("Info", true, oDesc);
break;
}
case CMD_Cleanup:
{
string oName("MainWindow");
Close();
m_pContext->target->AcceptEvent(new Event(INFO_ReadyToDieUI));
break;
}
case INFO_Playing:
{
bool bEnable;
int iState;
iState = 1;
m_pWindow->ControlIntValue(string("PlayPause"), true, iState);
iState = 1;
m_pWindow->ControlIntValue(string("PlayStop"), true, iState);
iState = 0;
m_pWindow->ControlIntValue(string("MPause"), true, iState);
bEnable = false;
m_pWindow->ControlEnable(string("Play"), true, bEnable);
bEnable = true;
m_pWindow->ControlEnable(string("Pause"), true, bEnable);
bEnable = true;
m_pWindow->ControlEnable(string("Stop"), true, bEnable);
m_bPlayShown = false;
m_bPaused = false;
break;
}
case INFO_Paused:
case INFO_Stopped:
{
int iState = 0;
bool bEnable = true;
string oEmpty("");
iState = 0;
m_pWindow->ControlIntValue(string("PlayPause"), true, iState);
m_bPaused = e->Type() == INFO_Paused;
iState = e->Type() == INFO_Paused ? 1 : 0;
m_pWindow->ControlIntValue(string("PlayStop"), true, iState);
iState = e->Type() == INFO_Paused ? 1 : 0;
m_pWindow->ControlIntValue(string("MPause"), true, iState);
bEnable = true;
m_pWindow->ControlEnable(string("Play"), true, bEnable);
bEnable = false;
m_pWindow->ControlEnable(string("Pause"), true, bEnable);
bEnable = false;
m_pWindow->ControlEnable(string("Stop"), true, bEnable);
m_bPlayShown = true;
m_pWindow->ControlStringValue("BufferInfo", true, oEmpty);
m_oStreamInfo = "";
m_pWindow->ControlStringValue("StreamInfo", true, oEmpty);
if (e->Type() == INFO_Stopped)
{
m_iSeekPos = 0;
m_iTotalSeconds = -1;
m_iCurrentSeconds = -1;
m_pWindow->ControlIntValue(string("Seek"), true, m_iSeekPos);
UpdateTimeDisplay(m_iCurrentSeconds);
if ((int32)m_pContext->plm->GetCurrentIndex() < 0)
{
m_oTitle = szWelcomeMsg;
m_pWindow->ControlStringValue("Title", true, m_oTitle);
string title = BRANDING;
m_pWindow->SetTitle(title);
}
}
break;
}
case INFO_DoneOutputting:
{
m_iSeekPos = 0;
m_iTotalSeconds = -1;
m_iCurrentSeconds = -1;
m_pWindow->ControlIntValue(string("Seek"), true, m_iSeekPos);
UpdateTimeDisplay(m_iCurrentSeconds);
break;
}
case INFO_MediaInfo:
{
MediaInfoEvent *info = (MediaInfoEvent *) e;
string oName("Title"), oText;
char *pFoo = strrchr(info->m_filename, '/');
bool bSet = true;
if (m_oTitle.length() == 0)
{
pFoo = (pFoo ? ++pFoo : info->m_filename);
m_oTitle = string(pFoo);
m_pWindow->ControlStringValue(oName, true, m_oTitle);
oText = string(BRANDING": ") + string(pFoo);
m_pWindow->SetTitle(oText);
}
// Enable/disable the seek slider
m_iTotalSeconds = (int32) info->m_totalSeconds;
bSet = (m_iTotalSeconds < 0) ? false : true;
oName = string("Seek");
m_pWindow->ControlEnable(oName, true, bSet);
m_pContext->target->AcceptEvent(new Event(CMD_GetVolume));
bSet = true;
m_pWindow->ControlEnable(string("Volume"), true, bSet);
m_pWindow->ControlEnable(string("VolumePlus"), true, bSet);
m_pWindow->ControlEnable(string("VolumeMinus"), true, bSet);
break;
}
case INFO_PlaylistItemUpdated :
{
int i;
PlaylistItemUpdatedEvent *pInfo =
(PlaylistItemUpdatedEvent *)e;
i = m_pContext->plm->GetCurrentIndex();
if (i >= 0)
{
if (m_pContext->plm->ItemAt(i) == pInfo->Item())
UpdateMetaData(pInfo->Item());
}
break;
}
case INFO_PlaylistCurrentItemInfo:
{
PlaylistCurrentItemInfoEvent *pInfo =
(PlaylistCurrentItemInfoEvent *)e;
if (m_pContext->plm->GetCurrentIndex() != kInvalidIndex)
UpdateMetaData(pInfo->Item());
break;
}
case INFO_StreamInfo:
{
char szTitle[100];
string oName("Title"), oText;
StreamInfoEvent *pInfo = (StreamInfoEvent *) e;
pInfo->GetTitle(szTitle, 100);
m_oTitle = string(szTitle);
m_pWindow->ControlStringValue(oName, true, m_oTitle);
oText = string(BRANDING": ") + string(szTitle);
m_pWindow->SetTitle(oText);
break;
}
case INFO_BufferStatus:
{
StreamBufferEvent *info = (StreamBufferEvent *) e;
char szTemp[100];
string oName("BufferInfo"), oText;
sprintf(szTemp, "I: %3ld O: %3ld %c",
(long int)info->GetInputPercent(),
(long int)info->GetOutputPercent(),
info->IsBufferingUp() ? '^' : ' ');
oText = string(szTemp);
m_pWindow->ControlStringValue(oName, true, oText);
break;
}
case INFO_MediaTimeInfo:
{
MediaTimeInfoEvent *info = (MediaTimeInfoEvent *) e;
int iSeconds;
string oName("Time"), oText;
iSeconds = (info->m_hours * 3600) + (info->m_minutes * 60) +
info->m_seconds;
if (iSeconds == m_iCurrentSeconds || m_bSeekInProgress)
break;
m_iCurrentSeconds = iSeconds;
UpdateTimeDisplay(m_iCurrentSeconds);
if (m_iTotalSeconds > 0)
{
m_iSeekPos = (iSeconds * 100) / m_iTotalSeconds;
oName = string("Seek");
m_pWindow->ControlIntValue(oName, true, m_iSeekPos);
}
break;
}
case INFO_MPEGInfo:
{
MpegInfoEvent *info = (MpegInfoEvent *) e;
char text[100];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -