📄 gtkmusicbrowser.cpp
字号:
}
}
if (allgood)
GenPlaylist(items);
else {
string caption = "Generate Playlist Error";
string message = "The item(s) you selected to seed the Relatable Engine with are not signatured. If signaturing is presently taking place, please wait a while longer and try again. Otherwise, select 'Start Signaturing' from the Relatable menu to start the signaturing process.";
GTKMessageDialog *dialog = new GTKMessageDialog();
dialog->Show(message.c_str(), caption.c_str(), kMessageOk, true);
delete dialog;
}
delete items;
}
void GTKMusicBrowser::GenPlaylist(vector<PlaylistItem *> *seed)
{
APSInterface *pInterface = m_context->aps;
if (!pInterface)
return;
if (!pInterface->IsTurnedOn()) {
AskOptIn(false);
return;
}
int totaltracks = m_context->catalog->GetTotalNumTracks();
int needingsigs = m_context->catalog->GetNumNeedingSigs();
if ((needingsigs * 100) / totaltracks > 25) {
StillNeedSignature(false);
return;
}
APSPlaylist ResultPlaylist;
uint32 nResponse = 0;
if ((seed) && (!seed->empty())) {
APSPlaylist InputPlaylist;
vector<PlaylistItem *>::iterator i;
bool allgood = true;
for (i = seed->begin(); i != seed->end(); i++) {
if ((*i)->GetMetaData().GUID().size() != 16) {
allgood = false;
break;
}
InputPlaylist.Insert((*i)->GetMetaData().GUID().c_str(),
(*i)->URL().c_str());
}
if (allgood)
nResponse = m_context->aps->APSGetPlaylist(&InputPlaylist,
&ResultPlaylist);
else {
string caption = "Generate Playlist Error";
string message = "The item(s) you selected to seed the Relatable Engine with are not signatured. If signaturing is presently taking place, please wait a while longer and try again. Otherwise, select 'Start Signaturing' from the Relatable menu to start the signaturing process.";
GTKMessageDialog *dialog = new GTKMessageDialog();
dialog->Show(message.c_str(), caption.c_str(), kMessageOk, false);
delete dialog;
}
}
else {
APSPlaylist InputPlaylist;
nResponse = m_context->aps->APSGetPlaylist(&InputPlaylist,
&ResultPlaylist);
}
if (nResponse == APS_NOERROR) {
if (ResultPlaylist.Size() > 0) {
vector<string> newitems;
string strTemp;
string strFilename;
APSPlaylist::iterator j;
for (j = ResultPlaylist.begin(); j.isvalid(); j.next()) {
strFilename = m_context->catalog->GetFilename(j.first());
if (strFilename != "")
newitems.push_back(strFilename.c_str());
}
for (int z = m_plm->CountItems() - 1; z >= 0; z--) {
PlaylistItem *testitem = m_plm->ItemAt(z);
bool remove = true;
if ((seed) && (!seed->empty())) {
vector<PlaylistItem *>::iterator i = seed->begin();
for (; i != seed->end(); i++) {
if ((*i)->GetMetaData().GUID() ==
testitem->GetMetaData().GUID()) {
remove = false;
break;
}
}
}
if (remove)
m_plm->RemoveItem(z);
}
m_plm->AddItems(newitems);
}
else
cerr << "Recommendation didn't return any items\n";
}
else
cerr << "Recommendation server error\n";
}
void GTKMusicBrowser::AddPLStreamToFavs(void)
{
PlaylistItem *stream = m_plm->ItemAt(m_lastindex);
m_context->catalog->WriteMetaDataToDatabase(stream->URL().c_str(),
stream->GetMetaData(),
kTypeStream);
m_context->catalog->AddStream(stream->URL().c_str());
}
void GTKMusicBrowser::AddStreamToFavs(void)
{
vector<TreeData *>::iterator i = mbSelections->begin();
for (; i != mbSelections->end(); i++) {
if ((*i)->type != kTreeStream)
continue;
PlaylistItem *stream = (*i)->track;
m_context->catalog->WriteMetaDataToDatabase(stream->URL().c_str(),
stream->GetMetaData(),
kTypeStream);
m_context->catalog->AddStream(stream->URL().c_str());
}
}
void GTKMusicBrowser::VisitWebsite(void)
{
vector<TreeData *>::iterator i = mbSelections->begin();
for (; i != mbSelections->end(); i++) {
if ((*i)->type != kTreeStream)
continue;
PlaylistItem *stream = (*i)->track;
LaunchBrowser(stream->WebURL().c_str());
}
}
static gboolean add_new_destroy(GtkWidget *w, gpointer p)
{
gtk_main_quit();
return FALSE;
}
static gint add_new_kill(GtkWidget *w, GdkEvent *e, int *ret)
{
*ret = 2;
return FALSE;
}
static void add_new_ok(GtkWidget *w, int *ret)
{
*ret = 1;
}
static void add_new_cancel(GtkWidget *w, int *ret)
{
*ret = 2;
}
static void add_new_title(GtkWidget *w, string *title)
{
*title = gtk_entry_get_text(GTK_ENTRY(w));
}
static void add_new_url(GtkWidget *w, string *url)
{
*url = gtk_entry_get_text(GTK_ENTRY(w));
}
void GTKMusicBrowser::AddNewStream(void)
{
int iRet = 0;
string url, title;
GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_modal(GTK_WINDOW(window), TRUE);
gtk_signal_connect(GTK_OBJECT(window), "destroy",
GTK_SIGNAL_FUNC(add_new_destroy), NULL);
gtk_signal_connect(GTK_OBJECT(window), "delete_event",
GTK_SIGNAL_FUNC(add_new_kill), &iRet);
gtk_window_set_title(GTK_WINDOW(window), "Add a New Stream");
gtk_container_set_border_width(GTK_CONTAINER(window), 5);
gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
GtkWidget *vbox = gtk_vbox_new(FALSE, 0);
gtk_container_add(GTK_CONTAINER(window), vbox);
gtk_widget_show(vbox);
GtkWidget *table = gtk_table_new(8, 2, FALSE);
gtk_box_pack_start(GTK_BOX(vbox), table, FALSE, FALSE, 0);
gtk_widget_show(table);
GtkWidget *label = gtk_label_new("Title:");
gtk_misc_set_alignment(GTK_MISC(label), (gfloat)1.0, (gfloat)0.5);
gtk_table_attach(GTK_TABLE(table), label, 0, 1, 0, 1, GTK_FILL, GTK_FILL,
10, 1);
gtk_widget_show(label);
GtkWidget *titleEntry = gtk_entry_new();
gtk_table_attach_defaults(GTK_TABLE(table), titleEntry, 1, 2, 0, 1);
gtk_signal_connect(GTK_OBJECT(titleEntry), "changed",
GTK_SIGNAL_FUNC(add_new_title), &title);
gtk_widget_show(titleEntry);
label = gtk_label_new("URL:");
gtk_misc_set_alignment(GTK_MISC(label), (gfloat)1.0, (gfloat)0.5);
gtk_table_attach(GTK_TABLE(table), label, 0, 1, 1, 2, GTK_FILL, GTK_FILL,
10, 1);
gtk_widget_show(label);
GtkWidget *urlEntry = gtk_entry_new();
gtk_table_attach_defaults(GTK_TABLE(table), urlEntry, 1, 2, 1, 2);
gtk_signal_connect(GTK_OBJECT(urlEntry), "changed",
GTK_SIGNAL_FUNC(add_new_url), &url);
gtk_widget_show(urlEntry);
GtkWidget *separator = gtk_hseparator_new();
gtk_container_add(GTK_CONTAINER(vbox), separator);
gtk_widget_show(separator);
GtkWidget *hbox = gtk_hbox_new(FALSE, 10);
gtk_container_set_border_width(GTK_CONTAINER(hbox), 5);
gtk_container_add(GTK_CONTAINER(vbox), hbox);
gtk_widget_show(hbox);
GtkWidget *button = gtk_button_new_with_label("OK");
gtk_signal_connect(GTK_OBJECT(button), "clicked",
GTK_SIGNAL_FUNC(add_new_ok), &iRet);
gtk_signal_connect_object(GTK_OBJECT(button), "clicked",
GTK_SIGNAL_FUNC(gtk_widget_destroy),
GTK_OBJECT(window));
gtk_container_add(GTK_CONTAINER(hbox), button);
gtk_widget_show(button);
button = gtk_button_new_with_label("Cancel");
gtk_signal_connect(GTK_OBJECT(button), "clicked",
GTK_SIGNAL_FUNC(add_new_cancel), &iRet);
gtk_signal_connect_object(GTK_OBJECT(button), "clicked",
GTK_SIGNAL_FUNC(gtk_widget_destroy),
GTK_OBJECT(window));
gtk_container_add(GTK_CONTAINER(hbox), button);
gtk_widget_show(button);
gtk_widget_show(window);
gtk_main();
if (iRet != 1)
return;
if (!url.size() || !title.size())
return;
PlaylistItem *newitem = new PlaylistItem;
MetaData metadata;
newitem->SetURL(url);
metadata.SetTitle(title);
newitem->SetMetaData(&metadata);
m_context->catalog->WriteMetaDataToDatabase(newitem->URL().c_str(),
newitem->GetMetaData(),
kTypeStream);
m_context->catalog->AddStream(newitem->URL().c_str());
}
void GTKMusicBrowser::UpdateCD(void)
{
m_context->player->UpdateCDNow();
}
void GTKMusicBrowser::EjectCD(void)
{
#ifndef NO_CDAUDIO
Registry *pmoRegistry = m_context->player->GetPMORegistry();
RegistryItem *pmo_item = NULL;
int32 i = 0;
while (NULL != (pmo_item = pmoRegistry->GetItem(i++))) {
if (!strcmp("cd.pmo", pmo_item->Name())) {
break;
}
}
if (!pmo_item)
return;
PhysicalMediaOutput *pmo;
pmo = (PhysicalMediaOutput *)pmo_item->InitFunction()(m_context);
pmo->SetPropManager((Properties *)(m_context->player));
pmo->Init(NULL);
((CDPMO*)pmo)->Eject();
delete pmo;
#endif
}
void GTKMusicBrowser::PlayMenu()
{
if (pauseState)
m_context->target->AcceptEvent(new Event(CMD_Play));
else
m_context->target->AcceptEvent(new Event(CMD_Pause));
}
void GTKMusicBrowser::StopMenu()
{
m_context->target->AcceptEvent(new Event(CMD_Stop));
}
void GTKMusicBrowser::NextMenu(void)
{
m_context->target->AcceptEvent(new Event(CMD_NextMediaPiece));
}
void GTKMusicBrowser::PrevMenu(void)
{
m_context->target->AcceptEvent(new Event(CMD_PrevMediaPiece));
}
void GTKMusicBrowser::SetRepeat(int numrepeat)
{
iSetRepeatMode = true;
switch(numrepeat) {
case 0: {
m_plm->SetRepeatMode(kPlaylistMode_RepeatNone);
break; }
case 1: {
m_plm->SetRepeatMode(kPlaylistMode_RepeatOne);
break; }
case 2: {
m_plm->SetRepeatMode(kPlaylistMode_RepeatAll);
break; }
}
}
void GTKMusicBrowser::SetRepeatType(RepeatMode mode)
{
GtkWidget *w;
if (mode == kPlaylistMode_RepeatNone)
w = gtk_item_factory_get_widget(menuFactory,
"/Controls/Repeat No Tracks");
else if (mode == kPlaylistMode_RepeatOne)
w = gtk_item_factory_get_widget(menuFactory,
"/Controls/Repeat Current Track");
else
w = gtk_item_factory_get_widget(menuFactory,
"/Controls/Repeat All Tracks");
if (GTK_IS_CHECK_MENU_ITEM(GTK_OBJECT(w)))
gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(w), TRUE);
}
void GTKMusicBrowser::SetShuffleType(bool shuffled)
{
iSetShuffleMode = false;
GtkWidget *w;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -