FXbool GMPlayListSource::source_context_menu(FXMenuPane * pane){ new GMMenuCommand(pane,fxtr("Rename…"),GMIconTheme::instance()->icon_edit,this,GMPlayListSource::ID_EDIT_NAME); new GMMenuCommand(pane,fxtr("Import Playlist…"),GMIconTheme::instance()->icon_import,this,GMPlayListSource::ID_IMPORT); new GMMenuCommand(pane,fxtr("Export As…"),GMIconTheme::instance()->icon_export,this,GMPlayListSource::ID_EXPORT); new GMMenuCommand(pane,fxtr("Remove Playlist"),GMIconTheme::instance()->icon_delete,this,GMPlayListSource::ID_REMOVE); return true; }
long GMStreamSource::onCmdDeleteStation(FXObject*,FXSelector,void*){ const FXString title=fxtr("Remove Internet Radio Station(s)?"); const FXString subtitle=fxtr("Remove Internet Radio Station(s) from library?"); FXDialogBox dialog(GMPlayerManager::instance()->getMainWindow(),title,DECOR_TITLE|DECOR_BORDER|DECOR_RESIZE|DECOR_CLOSE,0,0,0,0,0,0,0,0,0,0); GMPlayerManager::instance()->getMainWindow()->create_dialog_header(&dialog,title,subtitle,nullptr); FXHorizontalFrame *closebox=new FXHorizontalFrame(&dialog,LAYOUT_SIDE_BOTTOM|LAYOUT_FILL_X|PACK_UNIFORM_WIDTH,0,0,0,0); new GMButton(closebox,fxtr("&Remove"),nullptr,&dialog,FXDialogBox::ID_ACCEPT,BUTTON_INITIAL|BUTTON_DEFAULT|LAYOUT_RIGHT|FRAME_RAISED|FRAME_THICK,0,0,0,0, 15,15); new GMButton(closebox,fxtr("&Cancel"),nullptr,&dialog,FXDialogBox::ID_CANCEL,BUTTON_DEFAULT|LAYOUT_RIGHT|FRAME_RAISED|FRAME_THICK,0,0,0,0, 15,15); // new FXSeparator(&dialog,SEPARATOR_GROOVE|LAYOUT_FILL_X|LAYOUT_SIDE_BOTTOM); if (dialog.execute()){ FXIntList tracks; GMPlayerManager::instance()->getTrackView()->getSelectedTracks(tracks); // db->beginDelete(); for (int i=0;i<tracks.no();i++){ if (!db->removeStream(tracks[i])){ FXMessageBox::error(GMPlayerManager::instance()->getMainWindow(),MBOX_OK,fxtr("Library Error"),fxtrformat("Unable to remove station from the library.")); } } // db->endDelete(); GMPlayerManager::instance()->getTrackView()->refresh(); } return 1; }
FXbool GMPlayQueue::track_context_menu(FXMenuPane * pane){ new GMMenuCommand(pane,fxtr("Edit…\tF2\tEdit Track Information."),GMIconTheme::instance()->icon_edit,this,GMDatabaseSource::ID_EDIT_TRACK); new GMMenuCommand(pane,fxtr("Copy\tCtrl-C\tCopy track(s) to clipboard."),GMIconTheme::instance()->icon_copy,this,ID_COPY_TRACK); new FXMenuSeparator(pane); new GMMenuCommand(pane,fxtr("Remove…\tDel\tRemove track(s) from play queue."),GMIconTheme::instance()->icon_delete,this,ID_DELETE_TRACK); return true; }
FXbool GMPlayListSource::album_context_menu(FXMenuPane * pane){ if (GMPlayerManager::instance()->getPreferences().play_from_queue) { new GMMenuCommand(pane,fxtr("Add to Play Queue…"),GMIconTheme::instance()->icon_playqueue,this,GMDatabaseSource::ID_QUEUE_ALBUM); } new GMMenuCommand(pane,fxtr("Copy\tCtrl-C\tCopy associated tracks to the clipboard."),GMIconTheme::instance()->icon_copy,this,ID_COPY_ALBUM); new FXMenuSeparator(pane); new GMMenuCommand(pane,fxtr("Remove…\tDel\tRemove track(s) from play list."),GMIconTheme::instance()->icon_delete,this,ID_DELETE_ALBUM); return true; }
long GMStreamSource::onCmdNewStation(FXObject*,FXSelector,void*){ FXDialogBox dialog(GMPlayerManager::instance()->getMainWindow(),fxtr("New Internet Radio Station"),DECOR_TITLE|DECOR_BORDER|DECOR_RESIZE,0,0,0,0,0,0,0,0,0,0); GMPlayerManager::instance()->getMainWindow()->create_dialog_header(&dialog,fxtr("New Internet Radio Station"),fxtr("Specify url and description of new station"),nullptr); FXHorizontalFrame *closebox=new FXHorizontalFrame(&dialog,LAYOUT_SIDE_BOTTOM|LAYOUT_FILL_X|PACK_UNIFORM_WIDTH,0,0,0,0); new GMButton(closebox,fxtr("C&reate"),nullptr,&dialog,FXDialogBox::ID_ACCEPT,BUTTON_INITIAL|BUTTON_DEFAULT|LAYOUT_RIGHT|FRAME_RAISED|FRAME_THICK,0,0,0,0, 15,15); new GMButton(closebox,fxtr("&Cancel"),nullptr,&dialog,FXDialogBox::ID_CANCEL,BUTTON_DEFAULT|LAYOUT_RIGHT|FRAME_RAISED|FRAME_THICK,0,0,0,0, 15,15); new FXSeparator(&dialog,SEPARATOR_GROOVE|LAYOUT_FILL_X|LAYOUT_SIDE_BOTTOM); FXVerticalFrame * main = new FXVerticalFrame(&dialog,LAYOUT_FILL_X|LAYOUT_FILL_Y,0,0,0,0,10,5,10,10); FXMatrix * matrix = new FXMatrix(main,2,LAYOUT_FILL_X|MATRIX_BY_COLUMNS); new FXLabel(matrix,fxtr("Location"),nullptr,LABEL_NORMAL|LAYOUT_RIGHT|LAYOUT_CENTER_Y); GMTextField * location_field = new GMTextField(matrix,40,nullptr,0,LAYOUT_FILL_X|LAYOUT_FILL_COLUMN|FRAME_SUNKEN|FRAME_THICK); new FXLabel(matrix,fxtr("Description"),nullptr,LABEL_NORMAL|LAYOUT_RIGHT|LAYOUT_CENTER_Y); GMTextField * description_field = new GMTextField(matrix,30,nullptr,0,LAYOUT_FILL_X|LAYOUT_FILL_COLUMN|FRAME_SUNKEN|FRAME_THICK); new FXLabel(matrix,fxtr("Tag"),nullptr,LABEL_NORMAL|LAYOUT_RIGHT|LAYOUT_CENTER_Y); GMComboBox * tagbox = new GMComboBox(matrix,20,nullptr,0,LAYOUT_FILL_X|FRAME_LINE); db->listTags(tagbox); tagbox->setSortFunc(genre_list_sort); tagbox->setNumVisible(FXMIN(10,tagbox->getNumItems())); tagbox->sortItems(); tagbox->setCurrentItem(-1); if (dialog.execute()) { FXString url=location_field->getText().trim(); FXString name=description_field->getText().trim(); FXString genre=tagbox->getText().trim(); if (!url.empty()) { if (genre.empty()) genre=fxtr("Untitled"); db->insertStream(url,name,genre); GMPlayerManager::instance()->getTrackView()->refresh(); } } return 1; }
FXbool GMPlayListSource::track_context_menu(FXMenuPane * pane){ if (GMPlayerManager::instance()->getPreferences().play_from_queue) { new GMMenuCommand(pane,fxtr("Add to Play Queue…"),GMIconTheme::instance()->icon_playqueue,this,GMDatabaseSource::ID_QUEUE_TRACK); new FXMenuSeparator(pane); } new GMMenuCommand(pane,fxtr("Edit…\tF2\tEdit Track Information."),GMIconTheme::instance()->icon_edit,this,GMDatabaseSource::ID_EDIT_TRACK); new GMMenuCommand(pane,fxtr("Copy\tCtrl-C\tCopy track(s) to clipboard."),GMIconTheme::instance()->icon_copy,this,ID_COPY_TRACK); new GMMenuCommand(pane,"Export\t\tCopy tracks to destination.",GMIconTheme::instance()->icon_export,this,ID_EXPORT_TRACK); new FXMenuSeparator(pane); if (GMPlayerManager::instance()->getTrackView()->numTrackSelected()==1) new GMMenuCommand(pane,"Open Folder Location\t\tOpen Folder Location.",NULL,this,ID_OPEN_FOLDER); new GMMenuCommand(pane,fxtr("Remove…\tDel\tRemove track(s) from play list."),GMIconTheme::instance()->icon_delete,this,ID_DELETE_TRACK); return true; }
static FXbool updateTrackFilenames(GMTrackDatabase * db,FXIntList & tracks) { register FXint i=0; FXint numchanges=0; FXString url; GMTrack trackinfo; FXStringList newurls; FXStringList oldurls; if (!GMPlayerManager::instance()->getPreferences().export_format_template.contains("%T")) { FXMessageBox::error(GMPlayerManager::instance()->getMainWindow(),MBOX_OK,fxtr("Invalid Template"),fxtr("The provided template is invalid. The track title %%T needs to be specified.\nPlease fix the filename template in the preference panel.")); return false; } FXTextCodec * codec = GMFilename::findcodec(GMPlayerManager::instance()->getPreferences().export_encoding); FXuint options=0; if (GMPlayerManager::instance()->getPreferences().export_lowercase) options|=GMFilename::LOWERCASE; if (GMPlayerManager::instance()->getPreferences().export_lowercase_extension) options|=GMFilename::LOWERCASE_EXTENSION; if (GMPlayerManager::instance()->getPreferences().export_underscore) options|=GMFilename::NOSPACES; /// Create New Mrls. for (i=0;i<tracks.no();i++) { db->begin(); if (!db->getTrack(tracks[i],trackinfo)) { db->commit(); FXMessageBox::error(GMPlayerManager::instance()->getMainWindow(),MBOX_OK,fxtr("Database Error"),fxtr("Oops. Database Error")); return true; } db->commit(); if (GMFilename::create(url,trackinfo,GMPlayerManager::instance()->getPreferences().export_format_template,GMPlayerManager::instance()->getPreferences().export_character_filter,options,codec) && url!=trackinfo.url) { newurls.append(url); oldurls.append(trackinfo.url); numchanges++; } else { newurls.append(FXString::null); oldurls.append(FXString::null); } } if (numchanges==0){ FXMessageBox::information(GMPlayerManager::instance()->getMainWindow(),MBOX_OK,fxtr("No changes"),fxtr("Filenames did not require any changes")); delete codec; return false; } /// Ask For Permission FXDialogBox dialog(GMPlayerManager::instance()->getMainWindow(),fxtr("Rename Audio Files?"),DECOR_TITLE|DECOR_BORDER|DECOR_RESIZE|DECOR_CLOSE,0,0,600,400,0,0,0,0,0,0); GMPlayerManager::instance()->getMainWindow()->create_dialog_header(&dialog,fxtr("Renaming Audio Files…"),fxtr("The following audio files are going to be renamed")); FXHorizontalFrame *closebox=new FXHorizontalFrame(&dialog,LAYOUT_SIDE_BOTTOM|LAYOUT_FILL_X|PACK_UNIFORM_WIDTH,0,0,0,0); new GMButton(closebox,fxtr("&Rename"),NULL,&dialog,FXDialogBox::ID_ACCEPT,BUTTON_INITIAL|BUTTON_DEFAULT|LAYOUT_RIGHT|FRAME_RAISED|FRAME_THICK,0,0,0,0, 15,15); new GMButton(closebox,fxtr("&Cancel"),NULL,&dialog,FXDialogBox::ID_CANCEL,BUTTON_DEFAULT|LAYOUT_RIGHT|FRAME_RAISED|FRAME_THICK,0,0,0,0, 15,15); FXVerticalFrame * main = new FXVerticalFrame(&dialog,LAYOUT_FILL_X|LAYOUT_FILL_Y); GMScrollFrame * sunken = new GMScrollFrame(main); GMList * list = new GMList(sunken,NULL,0,LAYOUT_FILL_X|LAYOUT_FILL_Y); for (i=0;i<tracks.no();i++) { if (!newurls[i].empty()) { list->appendItem(newurls[i]); } } if (dialog.execute()) { GMRenameTask * task = new GMRenameTask(db,tracks,newurls,oldurls); // task->setTarget(GMPlayerManager::instance()->getTrackView()->getSource()); // task->setSelector( GMPlayerManager::instance()->runTask(task); /* for (i=0;i<tracks.no();i++){ if (!newmrls[i].empty()) { if (gm_make_path(FXPath::directory(newmrls[i]))) { if (!FXStat::exists(newmrls[i])) { if (FXFile::rename(oldmrls[i],newmrls[i])){ db->setTrackFilename(tracks[i],newmrls[i]); } else { if (i+1<tracks.no()) { if (FXMessageBox::error(GMPlayerManager::instance()->getMainWindow(),MBOX_YES_NO,fxtr("Unable to rename file"),fxtrformat("Unable to rename:\n%s\n\nto:%s\nContinue renaming files?"),oldmrls[i].text(),newmrls[i].text())==MBOX_CLICKED_NO) break; } else { FXMessageBox::error(GMPlayerManager::instance()->getMainWindow(),MBOX_OK,fxtr("Unable to rename file"),fxtrformat("Unable to rename:\n%s\n\nto:%s"),oldmrls[i].text(),newmrls[i].text()); } } } } } } */ return true; } delete codec; return false; }
static FXbool updateTrackFilenames(GMTrackDatabase * db,FXIntList & tracks) { FXint i=0; FXint numchanges=0; FXString url; GMTrack trackinfo; FXStringList newurls; FXStringList oldurls; if (!GMPlayerManager::instance()->getPreferences().export_format_template.contains("%T")) { FXMessageBox::error(GMPlayerManager::instance()->getMainWindow(),MBOX_OK,fxtr("Invalid Template"),fxtr("The provided template is invalid. The track title %%T needs to be specified.\nPlease fix the filename template in the preference panel.")); return false; } const FXTextCodec * const codec = ap_get_usercodec(GMPlayerManager::instance()->getPreferences().export_encoding); FXuint options=0; if (GMPlayerManager::instance()->getPreferences().export_lowercase) options|=gm::TrackFormatter::LOWERCASE; if (GMPlayerManager::instance()->getPreferences().export_lowercase_extension) options|=gm::TrackFormatter::LOWERCASE_EXTENSION; if (GMPlayerManager::instance()->getPreferences().export_underscore) options|=gm::TrackFormatter::NOSPACE; gm::TrackFormatter trackformat(GMPlayerManager::instance()->getPreferences().export_format_template, codec, GMPlayerManager::instance()->getPreferences().export_character_filter, options); try { GMLockTransaction transaction(db); /// Create New Mrls. for (i=0;i<tracks.no();i++) { if (!db->getTrack(tracks[i],trackinfo)) { FXMessageBox::error(GMPlayerManager::instance()->getMainWindow(),MBOX_OK,fxtr("Database Error"),fxtr("Oops. Database Error")); return true; } url = trackformat.getPath(trackinfo); if (!url.empty() && url!=trackinfo.url) { newurls.append(url); oldurls.append(trackinfo.url); numchanges++; } else { newurls.append(FXString::null); oldurls.append(FXString::null); } } } catch(GMDatabaseException&) { FXMessageBox::error(GMPlayerManager::instance()->getMainWindow(),MBOX_OK,fxtr("Database Error"),fxtr("Failed to retrieve track filenames")); return false; } if (numchanges==0){ FXMessageBox::information(GMPlayerManager::instance()->getMainWindow(),MBOX_OK,fxtr("No changes"),fxtr("Filenames did not require any changes")); return false; } /// Ask For Permission FXDialogBox dialog(GMPlayerManager::instance()->getMainWindow(),fxtr("Rename Audio Files?"),DECOR_TITLE|DECOR_BORDER|DECOR_RESIZE|DECOR_CLOSE,0,0,600,400,0,0,0,0,0,0); GMPlayerManager::instance()->getMainWindow()->create_dialog_header(&dialog,fxtr("Renaming Audio Files…"),fxtr("The following audio files are going to be renamed")); FXHorizontalFrame *closebox=new FXHorizontalFrame(&dialog,LAYOUT_SIDE_BOTTOM|LAYOUT_FILL_X|PACK_UNIFORM_WIDTH,0,0,0,0); new GMButton(closebox,fxtr("&Rename"),nullptr,&dialog,FXDialogBox::ID_ACCEPT,BUTTON_INITIAL|BUTTON_DEFAULT|LAYOUT_RIGHT|FRAME_RAISED|FRAME_THICK,0,0,0,0, 15,15); new GMButton(closebox,fxtr("&Cancel"),nullptr,&dialog,FXDialogBox::ID_CANCEL,BUTTON_DEFAULT|LAYOUT_RIGHT|FRAME_RAISED|FRAME_THICK,0,0,0,0, 15,15); FXVerticalFrame * main = new FXVerticalFrame(&dialog,LAYOUT_FILL_X|LAYOUT_FILL_Y); GMScrollFrame * sunken = new GMScrollFrame(main); GMList * list = new GMList(sunken,nullptr,0,LAYOUT_FILL_X|LAYOUT_FILL_Y); for (i=0;i<tracks.no();i++) { if (!newurls[i].empty()) { if (codec && codec->mibEnum()!=106) { // Not UTF8 or Ascii // Translate back to UTF-8 list->appendItem(codec->mb2utf(newurls[i])); } else { list->appendItem(newurls[i]); } } } if (dialog.execute()) { GMRenameTask * task = new GMRenameTask(db,tracks,newurls,oldurls); GMPlayerManager::instance()->runTask(task); return true; } return false; }
void GMImportTask::detect_compilation() { if (ntracks) { FXbool same_artists=true; // Up to 10 discs and 255 tracks FXuchar position[10][255]={{0}}; for (FXint i=0;i<ntracks;i++) { // Check to make sure album_artist isn't explicity set. // url is empty if loaded from database. if (!tracks[i].album_artist.empty() && tracks[i].url.empty()) { GM_DEBUG_PRINT("detect_compilation: album_artist explicitely set.\n"); return; } const FXushort & disc = tracks[i].getDiscNumber(); const FXushort & no = tracks[i].getTrackNumber(); // Check for duplicate track/disc numbers if (disc<10 && no>0 && no<256) { if (position[disc][no]>0) { GM_DEBUG_PRINT("detect_compilation: found multiple albums (track number already in use)\n"); return; } position[disc][no]=1; } } // Check if albums are all the same and use the same artist for (FXint i=1;i<ntracks;i++) { if (tracks[0].album!=tracks[i].album) { GM_DEBUG_PRINT("detect_compilation: found multiple albums\n"); return; } if (same_artists && tracks[0].getAlbumArtist(dbtracks.default_artist)!=tracks[i].getAlbumArtist(dbtracks.default_artist)) same_artists=false; } // Bail out if we already use the same artist if (same_artists) { GM_DEBUG_PRINT("detect_compilation: same artist on all tracks\n"); return; } // Compilation Album detected GM_DEBUG_PRINT("detect_compilation: found compilation album\n"); // Default value for album_artist to use FXString album_artist_default = fxtr("Various Artists"); // Check if composer is set and are all the same if (has_same_composer()) album_artist_default = tracks[0].composer; // Use artist_album from database in case user already overwrote Various Artists for (FXint i=0;i<ntracks;i++) { if (tracks[i].url.empty()) { GM_DEBUG_PRINT("detect_compilation: using album_artist from database \"%s\"\n",tracks[i].album_artist.text()); album_artist_default = tracks[i].album_artist; break; } } // Update Album Artist for (FXint i=0;i<ntracks;i++) { tracks[i].album_artist = album_artist_default; } } }
GMDBTracks::GMDBTracks() { default_artist = fxtr("Unknown Artist"); default_album = fxtr("Unknown Album"); }
FXbool GMStreamSource::track_context_menu(FXMenuPane * pane){ new GMMenuCommand(pane,fxtr("Edit…"),GMIconTheme::instance()->icon_edit,this,ID_EDIT_STATION); new GMMenuCommand(pane,fxtr("Add Radio Station…"),nullptr,this,ID_NEW_STATION); new GMMenuCommand(pane,fxtr("Remove\t\tRemove."),GMIconTheme::instance()->icon_delete,this,ID_DELETE_STATION); return true; }
FXbool GMStreamSource::source_context_menu(FXMenuPane * pane){ new GMMenuCommand(pane,fxtr("Add Radio Station…"),nullptr,this,ID_NEW_STATION); return true; }
long GMStreamSource::onCmdEditStation(FXObject*,FXSelector,void*){ GMTextField * location_field=nullptr; FXIntList tracks; GMPlayerManager::instance()->getTrackView()->getSelectedTracks(tracks); FXDialogBox dialog(GMPlayerManager::instance()->getMainWindow(),fxtr("Edit Internet Radio Station"),DECOR_TITLE|DECOR_BORDER|DECOR_RESIZE|DECOR_CLOSE,0,0,0,0,0,0,0,0,0,0); GMPlayerManager::instance()->getMainWindow()->create_dialog_header(&dialog,fxtr("Edit Internet Radio Station"),fxtr("Update url and description of station"),nullptr); FXHorizontalFrame *closebox=new FXHorizontalFrame(&dialog,LAYOUT_SIDE_BOTTOM|LAYOUT_FILL_X|PACK_UNIFORM_WIDTH,0,0,0,0); new GMButton(closebox,fxtr("&Save"),nullptr,&dialog,FXDialogBox::ID_ACCEPT,BUTTON_INITIAL|BUTTON_DEFAULT|LAYOUT_RIGHT|FRAME_RAISED|FRAME_THICK,0,0,0,0, 15,15); new GMButton(closebox,fxtr("&Cancel"),nullptr,&dialog,FXDialogBox::ID_CANCEL,BUTTON_DEFAULT|LAYOUT_RIGHT|FRAME_RAISED|FRAME_THICK,0,0,0,0, 15,15); new FXSeparator(&dialog,SEPARATOR_GROOVE|LAYOUT_FILL_X|LAYOUT_SIDE_BOTTOM); FXVerticalFrame * main = new FXVerticalFrame(&dialog,LAYOUT_FILL_X|LAYOUT_FILL_Y,0,0,0,0,10,5,10,10); FXMatrix * matrix = new FXMatrix(main,2,LAYOUT_FILL_X|MATRIX_BY_COLUMNS); if (tracks.no()==1) { new FXLabel(matrix,fxtr("Location"),nullptr,LABEL_NORMAL|LAYOUT_RIGHT|LAYOUT_CENTER_Y); location_field = new GMTextField(matrix,40,nullptr,0,LAYOUT_FILL_X|LAYOUT_FILL_COLUMN|FRAME_SUNKEN|FRAME_THICK); } new FXLabel(matrix,fxtr("Description"),nullptr,LABEL_NORMAL|LAYOUT_RIGHT|LAYOUT_CENTER_Y); GMTextField * description_field = new GMTextField(matrix,30,nullptr,0,LAYOUT_FILL_X|LAYOUT_FILL_COLUMN|FRAME_SUNKEN|FRAME_THICK); new FXLabel(matrix,fxtr("Genre"),nullptr,LABEL_NORMAL|LAYOUT_RIGHT|LAYOUT_CENTER_Y); GMComboBox * tagbox = new GMComboBox(matrix,20,nullptr,0,LAYOUT_FILL_X|FRAME_LINE); db->listTags(tagbox); tagbox->setSortFunc(genre_list_sort); tagbox->setCurrentItem(-1); tagbox->setNumVisible(FXMIN(10,tagbox->getNumItems())); tagbox->sortItems(); GMStream info; if (tracks.no()==1) { db->getStream(tracks[0],info); location_field->setText(info.url); description_field->setText(info.description); tagbox->setCurrentItem(tagbox->findItem(info.tag)); } if (dialog.execute()) { FXbool changed=false; if (tracks.no()==1 && location_field->getText()!=info.url && !location_field->getText().empty()) { db->setStreamFilename(tracks[0],location_field->getText()); changed=true; } if (description_field->getText()!=info.description && !description_field->getText().empty()){ for (FXint i=0;i<tracks.no();i++) db->setStreamDescription(tracks[i],description_field->getText()); changed=true; } if (tagbox->getText()!=info.tag && !tagbox->getText().empty()){ for (FXint i=0;i<tracks.no();i++) db->setStreamGenre(tracks[i],tagbox->getText()); changed=true; } if (changed) GMPlayerManager::instance()->getTrackView()->refresh(); } return 1; }
FXbool GMPlayListSource::genre_context_menu(FXMenuPane * pane) { new GMMenuCommand(pane,fxtr("Remove…\tDel\tRemove track(s) from play list."),GMIconTheme::instance()->icon_delete,this,ID_DELETE_TAG); return true; }
FXbool GMPlayQueue::source_context_menu(FXMenuPane * pane) { new GMMenuCommand(pane,fxtr("Clear"),GMIconTheme::instance()->icon_delete,this,ID_CLEAR); return true; }