📄 gtkpreferencewindow.cpp
字号:
/*____________________________________________________________________________
FreeAmp - The Free MP3 Player
Portions Copyright (C) 2000 EMusic.com
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: GTKPreferenceWindow.cpp,v 1.24 2000/01/18 20:40:39 ijr Exp $
____________________________________________________________________________*/
/* system headers */
#include <stdlib.h>
#include <assert.h>
#include <sys/stat.h>
#include <unistd.h>
#include "player.h"
#include "eventdata.h"
#include "GTKPreferenceWindow.h"
#include "GTKWindow.h"
#include "GTKFileSelector.h"
#include "MessageDialog.h"
#include "help.h"
GTKPreferenceWindow::GTKPreferenceWindow(FAContext *context,
ThemeManager *pThemeMan,
uint32 defaultPage) :
PreferenceWindow(context, pThemeMan)
{
startPage = defaultPage;
done = false;
}
GTKPreferenceWindow::~GTKPreferenceWindow(void)
{
}
static gboolean pref_destroy(GtkWidget *widget, GTKPreferenceWindow *p)
{
p->done = true;
return FALSE;
}
void GTKPreferenceWindow::ApplyInfo(void)
{
if (proposedValues != currentValues)
SavePrefsValues(m_pContext->prefs, &proposedValues);
}
void pref_ok_click(GtkWidget *w, GTKPreferenceWindow *p)
{
p->ApplyInfo();
gtk_widget_destroy(p->mainWindow);
p->done = true;
}
void pref_apply_click(GtkWidget *w, GTKPreferenceWindow *p)
{
p->ApplyInfo();
}
void GTKPreferenceWindow::CancelInfo(void)
{
if (currentValues != originalValues)
SavePrefsValues(m_pContext->prefs, &originalValues);
}
void pref_cancel_click(GtkWidget *w, GTKPreferenceWindow *p)
{
p->CancelInfo();
gtk_widget_destroy(p->mainWindow);
p->done = true;
}
void pref_close_click(GtkWidget *w, GTKPreferenceWindow *p)
{
gtk_widget_destroy(p->mainWindow);
p->done = true;
}
void GTKPreferenceWindow::ShowHelp(void)
{
string oHelpFile;
char dir[_MAX_PATH];
uint32 len = _MAX_PATH;
m_pContext->prefs->GetInstallDirectory(dir, &len);
oHelpFile = string(dir) + string(DIR_MARKER_STR) + string("../share/");
oHelpFile += string(HELP_FILE);
struct stat st;
if (stat(oHelpFile.c_str(), &st) == 0 && st.st_mode & S_IFREG)
LaunchBrowser((char *)oHelpFile.c_str());
else {
MessageDialog oBox(m_pContext);
string oMessage("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.");
oBox.Show(oMessage.c_str(), string(BRANDING), kMessageOk, true);
}
}
void help_click(GtkWidget *w, GTKPreferenceWindow *p)
{
p->ShowHelp();
}
bool GTKPreferenceWindow::Show(Window *pWindow)
{
GetPrefsValues(m_pContext->prefs, &originalValues);
fontDialog = NULL;
currentValues = proposedValues = originalValues;
gdk_threads_enter();
mainWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_modal(GTK_WINDOW(mainWindow), TRUE);
gtk_signal_connect(GTK_OBJECT(mainWindow), "destroy",
GTK_SIGNAL_FUNC(pref_destroy), this);
gtk_window_set_title(GTK_WINDOW(mainWindow), BRANDING" - Preferences");
GtkWidget *vbox = gtk_vbox_new(FALSE, 0);
gtk_container_add(GTK_CONTAINER(mainWindow), vbox);
gtk_widget_show(vbox);
GtkWidget *notebook = gtk_notebook_new();
gtk_notebook_set_tab_pos(GTK_NOTEBOOK(notebook), GTK_POS_TOP);
gtk_box_pack_start(GTK_BOX(vbox), notebook, TRUE, TRUE, 0);
gtk_container_set_border_width(GTK_CONTAINER(notebook), 5);
gtk_widget_realize(notebook);
GtkWidget *pane;
GtkWidget *label;
label = gtk_label_new("General");
gtk_widget_show(label);
pane = CreatePage1();
gtk_notebook_append_page(GTK_NOTEBOOK(notebook), pane, label);
label = gtk_label_new("Themes");
gtk_widget_show(label);
pane = CreatePage5();
gtk_notebook_append_page(GTK_NOTEBOOK(notebook), pane, label);
label = gtk_label_new("Streaming");
gtk_widget_show(label);
pane = CreatePage2();
gtk_notebook_append_page(GTK_NOTEBOOK(notebook), pane, label);
label = gtk_label_new("Plugins");
gtk_widget_show(label);
pane = CreatePage3();
gtk_notebook_append_page(GTK_NOTEBOOK(notebook), pane, label);
label = gtk_label_new("Advanced");
gtk_widget_show(label);
pane = CreatePage6();
gtk_notebook_append_page(GTK_NOTEBOOK(notebook), pane, label);
label = gtk_label_new("About");
gtk_widget_show(label);
pane = CreateAbout();
gtk_notebook_append_page(GTK_NOTEBOOK(notebook), pane, label);
gtk_widget_show(notebook);
GtkWidget *hbox = gtk_hbox_new(FALSE, 5);
gtk_container_set_border_width(GTK_CONTAINER(hbox), 5);
gtk_container_add(GTK_CONTAINER(vbox), hbox);
gtk_widget_show(hbox);
GtkWidget *button;
button = gtk_button_new_with_label(" Help ");
gtk_box_pack_end(GTK_BOX(hbox), button, FALSE, FALSE, 0);
gtk_signal_connect(GTK_OBJECT(button), "clicked",
GTK_SIGNAL_FUNC(help_click), this);
gtk_widget_show(button);
applyButton = gtk_button_new_with_label(" Apply ");
gtk_signal_connect(GTK_OBJECT(applyButton), "clicked",
GTK_SIGNAL_FUNC(pref_apply_click), this);
gtk_box_pack_end(GTK_BOX(hbox), applyButton, FALSE, FALSE, 0);
gtk_widget_show(applyButton);
gtk_widget_set_sensitive(applyButton, FALSE);
button = gtk_button_new_with_label(" Cancel ");
gtk_signal_connect(GTK_OBJECT(button), "clicked",
GTK_SIGNAL_FUNC(pref_cancel_click), this);
gtk_box_pack_end(GTK_BOX(hbox), button, FALSE, FALSE, 0);
gtk_widget_show(button);
button = gtk_button_new_with_label(" OK ");
gtk_signal_connect(GTK_OBJECT(button), "clicked",
GTK_SIGNAL_FUNC(pref_ok_click), this);
gtk_box_pack_end(GTK_BOX(hbox), button, FALSE, FALSE, 0);
gtk_widget_show(button);
gtk_notebook_set_page(GTK_NOTEBOOK(notebook), startPage);
gtk_widget_show(mainWindow);
firsttime = false;
gdk_threads_leave();
while (!done)
usleep(20);
return true;
}
void GTKPreferenceWindow::GetPrefsValues(Preferences* prefs,
PrefsStruct* values)
{
uint32 bufferSize = 1;
uint32 size;
char *buffer = (char *)malloc(bufferSize);
size = bufferSize;
if (kError_BufferTooSmall == prefs->GetDefaultPMO(buffer, &size)) {
buffer = (char *)realloc(buffer, size);
prefs->GetDefaultPMO(buffer, &size);
}
values->defaultPMO = buffer;
size = bufferSize;
prefs->GetInputBufferSize(&values->inputBufferSize);
prefs->GetOutputBufferSize(&values->outputBufferSize);
prefs->GetPrebufferLength(&values->preBufferLength);
prefs->GetStreamBufferInterval(&values->streamInterval);
prefs->GetSaveStreams(&values->saveStreams);
if (kError_BufferTooSmall == prefs->GetProxyServerAddress(buffer, &size)) {
buffer = (char *)realloc(buffer, size);
prefs->GetProxyServerAddress(buffer, &size);
}
values->proxyServer = buffer;
prefs->GetUseProxyServer(&values->useProxyServer);
size = bufferSize;
if(kError_BufferTooSmall == prefs->GetSaveStreamsDirectory(buffer, &size)) {
size++;
buffer = (char*)realloc(buffer, size);
prefs->GetSaveStreamsDirectory(buffer, &size);
}
values->saveStreamsDirectory = buffer;
size = bufferSize;
if(kError_BufferTooSmall == prefs->GetAlternateNICAddress(buffer, &size)) {
buffer = (char*)realloc(buffer, size);
prefs->GetAlternateNICAddress(buffer, &size);
}
values->alternateIP = buffer;
size = bufferSize;
prefs->GetUseAlternateNIC(&values->useAlternateIP);
prefs->GetUseDebugLog(&values->enableLogging);
prefs->GetLogMain(&values->logMain);
prefs->GetLogDecode(&values->logDecoder);
prefs->GetLogInput(&values->logInput);
prefs->GetLogOutput(&values->logOutput);
prefs->GetLogPerformance(&values->logPerformance);
if(kError_BufferTooSmall == prefs->GetThemeDefaultFont(buffer, &size)) {
size++;
buffer = (char*)realloc(buffer, size);
prefs->GetThemeDefaultFont(buffer, &size);
}
values->defaultFont = buffer;
size = bufferSize;
if(kError_BufferTooSmall == prefs->GetSaveMusicDirectory(buffer, &size)) {
buffer = (char*)realloc(buffer, size);
prefs->GetSaveMusicDirectory(buffer, &size);
}
values->saveMusicDirectory = buffer;
size = bufferSize;
m_pThemeMan->GetCurrentTheme(values->currentTheme);
prefs->GetShowToolbarTextLabels(&values->useTextLabels);
prefs->GetShowToolbarImages(&values->useImages);
prefs->GetSaveCurrentPlaylistOnExit(&values->savePlaylistOnExit);
prefs->GetPlayImmediately(&values->playImmediately);
if(kError_BufferTooSmall == prefs->GetSaveMusicDirectory(buffer, &size))
{
size++;
bufferSize = size;
buffer = (char*)realloc(buffer, bufferSize);
prefs->GetSaveMusicDirectory(buffer, &size);
}
values->saveMusicDirectory = buffer;
size = bufferSize;
if(kError_BufferTooSmall == prefs->GetPrefString(kALSADevicePref,
buffer, &size)) {
size++;
bufferSize = size;
buffer = (char*)realloc(buffer, bufferSize);
prefs->GetPrefString(kALSADevicePref, buffer, &size);
}
values->alsaOutput = buffer;
size = bufferSize;
if(kError_BufferTooSmall == prefs->GetUsersPortablePlayers(buffer, &size)) {
buffer = (char*)realloc(buffer, size);
prefs->GetUsersPortablePlayers(buffer, &size);
}
char* cp = buffer;
char* name = cp;
while ((cp = strchr(cp, ';'))) {
*cp = 0x00;
values->portablePlayers.insert(string(name));
cp++;
name = cp;
}
if (*name)
values->portablePlayers.insert(string(name));
free(buffer);
}
void GTKPreferenceWindow::SavePrefsValues(Preferences* prefs,
PrefsStruct* values)
{
prefs->SetShowToolbarTextLabels(values->useTextLabels);
prefs->SetShowToolbarImages(values->useImages);
prefs->SetSaveCurrentPlaylistOnExit(values->savePlaylistOnExit);
prefs->SetPlayImmediately(values->playImmediately);
prefs->SetDefaultPMO(values->defaultPMO.c_str());
prefs->SetInputBufferSize(values->inputBufferSize);
prefs->SetOutputBufferSize(values->outputBufferSize);
prefs->SetPrebufferLength(values->preBufferLength);
prefs->SetStreamBufferInterval(values->streamInterval);
prefs->SetSaveStreams(values->saveStreams);
prefs->SetSaveStreamsDirectory(values->saveStreamsDirectory.c_str());
prefs->SetProxyServerAddress(values->proxyServer.c_str());
prefs->SetUseProxyServer(values->useProxyServer);
prefs->SetAlternateNICAddress(values->alternateIP.c_str());
prefs->SetUseAlternateNIC(values->useAlternateIP);
prefs->SetUseDebugLog(values->enableLogging);
prefs->SetLogMain(values->logMain);
prefs->SetLogDecode(values->logDecoder);
prefs->SetLogInput(values->logInput);
prefs->SetLogOutput(values->logOutput);
prefs->SetLogPerformance(values->logPerformance);
prefs->SetThemeDefaultFont(values->defaultFont.c_str());
prefs->SetPrefString(kALSADevicePref, values->alsaOutput.c_str());
map<string, string>::iterator i;
int32 iLoop = 0;
for (i = m_oThemeList.begin(); i != m_oThemeList.end(); i++, iLoop++) {
if (iLoop == values->listboxIndex)
values->currentTheme = (*i).first;
}
m_pThemeMan->UseTheme(m_oThemeList[values->currentTheme]);
prefs->SetSaveMusicDirectory(values->saveMusicDirectory.c_str());
PortableSet::const_iterator j = values->portablePlayers.begin();
string portableList;
for (; j != values->portablePlayers.end(); j++) {
portableList += *j;
portableList += ";";
}
prefs->SetUsersPortablePlayers(portableList.c_str());
Registry *pmo = m_pContext->player->GetPMORegistry();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -