winamp/Src/resources/skins/Winamp Modern/scripts/playlistpro.m
2024-09-24 14:54:57 +02:00

426 lines
12 KiB
Objective-C

/*
PlaylistPro build 005
Originally done by pjn123 (www.skinconsortium.com) for the Classic Pro plugin
*/
#include "lib/std.mi"
#include "lib/pldir.mi"
#include "init_Playlist.m"
Function resizeResults(int items);
Function doSearch(String input);
Function setSearchBox(boolean onOff);
Function clearSearchBox();
Function int getPlEntry(int search_item);
Function String replaceString(string baseString, string toreplace, string replacedby);
Global Group frameGroup, topbar;
Global Edit searchBox;
Global Text helpSearch, searchNews;// fakeText;
Global GuiObject fakeSB, searchXUI, searchButtonXui;
Global Button searchButton, clearButton, clearButtonText;
Global GuiList searchResults;
Global Boolean foundsomething;
Global int tn, h_tune;
Global String temptoken;
Global Windowholder plwh;
GLobal Timer refreshActiveCheck;
Global PopupMenu search_rc;
Global Container results_container;
Global Layout results_layout, main_layout;
System.onScriptLoaded() {
frameGroup = getScriptGroup();
topbar = frameGroup.findObject("PlaylistPro.topbar");
plwh = frameGroup.findObject("wdh.playlist");
searchBox = frameGroup.findObject("wasabi.edit.box");
searchXUI = frameGroup.findObject("pl.search.edit");
searchButton = frameGroup.findObject("pl.search.go");
searchButtonXui = frameGroup.findObject("pl.search.go");
fakeSB = frameGroup.findObject("pl.search.edit.rect");
clearButton = frameGroup.findObject("pl.search.edit.clear");
clearButtonText = frameGroup.findObject("pl.search.edit.clear.text");
helpSearch = frameGroup.findObject("pl.search.edit.searchhelp");
//fakeText = frameGroup.findObject("pl.search.go.text.fake");
results_container = newDynamicContainer("searchresults");
results_layout = results_container.getLayout("normal");
searchResults = results_layout.findObject("PlaylistPro.list");
searchResults.setFontSize(16);
searchNews = results_layout.findObject("PlaylistPro.list.news");
main_layout = getContainer("Pledit").getLayout("normal");
initAttribs_Playlist();
//translation workaround
/*searchButtonXui.setXmlParam("text", System.translate("Search"));
searchButtonXui.setXmlParam("x", integerToString(-1*fakeText.getAutoWidth()-4));
searchButtonXui.setXmlParam("w", integerToString(fakeText.getAutoWidth()+2));
searchXUI.setXmlParam("w", integerToString(-1*fakeText.getAutoWidth()-9));*/
refreshActiveCheck = new Timer;
refreshActiveCheck.setDelay(100);
}
System.onScriptUnLoading() {
delete refreshActiveCheck;
}
refreshActiveCheck.onTimer(){
if((!System.isAppActive() || System.isMinimized()) && results_layout.isVisible() ) results_layout.hide();
}
results_layout.onSetVisible(boolean onOff){
if(onOff){
refreshActiveCheck.start();
}
else{
refreshActiveCheck.stop();
}
}
System.onShowLayout(Layout _layout){
if(main_layout.isVisible()) results_layout.setXmlParam("ontop", "1");
}
frameGroup.onSetVisible(boolean onOff){
if(!onOff) clearSearchBox();
}
searchButton.onLeftClick(){
doSearch(searchBox.getText());
}
resizeResults(int items){
/*results_layout.setTargetX(results_layout.getLeft());
results_layout.setTargetY(results_layout.getTop());
results_layout.setTargetW(results_layout.getWidth());
results_layout.setTargetH(500);
results_layout.setTargetSpeed(1);
results_layout.gotoTarget();*/
//items++; //temp add one extra for info... xx items found
if(items>20) items=20;
if(items>=1) h_tune=29;
else h_tune=25;
//results_layout.setXmlParam("h", integerToString(20+items*18));
/*results_layout.setTargetX(results_layout.getLeft());
results_layout.setTargetY(results_layout.getTop());
results_layout.setTargetW(results_layout.getWidth());
results_layout.setTargetH(h_tune+items*16);
results_layout.setTargetSpeed(0.3);
results_layout.gotoTarget();*/
results_layout.resize(results_layout.getLeft(), results_layout.getTop(), results_layout.getWidth(), h_tune+items*16);
}
searchBox.onEnter(){
doSearch(searchBox.getText());
}
doSearch(String input){
if(input==""){
clearSearchBox();
return;
}
//search history stuff
String history = getPublicString("cPro.PlaylistPro.history", "");
history = replaceString(history, input, "");
history = replaceString(history, ";;", ";");
if(strleft(history, 1)==";") history = strright(history, strlen(history)-1);
if(strright(history, 1)==";") history = strleft(history, strlen(history)-1);
if(history=="") history= input;
else history= input+";"+history;
String output = getToken(history, ";", 0);
for(int i = 1; i<15; i++){
if(getToken(history, ";", i)=="") break;
output+=";"+getToken(history, ";", i);
}
setPublicString("cPro.PlaylistPro.history", history);
int itemsfound = 0;
input = strlower(input);
results_layout.setXmlParam("x", integerToString(fakeSB.clientToScreenX(fakeSB.getLeft()-2)));
results_layout.setXmlParam("y", integerToString(fakeSB.clientToScreenY(fakeSB.getTop() + fakeSB.getHeight())));
results_layout.setXmlParam("w", integerToString(frameGroup.getWidth()-19));
if(!results_layout.isVisible()) results_layout.setXmlParam("h", "1");
searchResults.deleteAllItems();
searchResults.scrollToItem(0);
for(int i = 0; i<PlEdit.getNumTracks(); i++){
foundsomething=false;
for(tn = 0; tn<10; tn++){
if(getToken(input, " ", tn)==""){
break;
}
temptoken = getToken(input, " ", tn);
if(strsearch(strlower(PlEdit.getTitle(i) + " " + PlEdit.getFileName(i)), temptoken)>=0){
foundsomething=true;
}
else{
foundsomething=false;
}
if(!foundsomething){
break;
}
}
if(foundsomething){
itemsfound++;
searchResults.addItem(integerToString(i+1)+". " + PlEdit.getTitle(i));
if(itemsfound>500){
searchNews.setText("Search result limited to 500 items");
break;
}
}
}
if(itemsfound==0){
searchNews.setText("Nothing was found");
}
else if(itemsfound<=500){
searchNews.setText(System.translate("Items found: ") +integerToString(itemsfound));
}
if(!results_layout.isVisible()) results_layout.show();
// Fix if always on top is enabled.. it just refresh the ontop ;)
results_layout.setXmlParam("ontop", "1");
resizeResults(itemsfound);
}
searchResults.onDoubleClick(Int itemnum){
PlEdit.playTrack (getPlEntry(itemnum));
setSearchBox(false);
}
searchResults.onRightClick(Int itemnum){
search_rc = new PopupMenu;
search_rc.addCommand("Move selected to top", 1, 0, 0);
search_rc.addCommand("Move selected to bottom", 2, 0, 0);
search_rc.addCommand("Move selected after current", 3, 0, 0);
search_rc.addCommand("Move selected together", 4, 0, 0);
search_rc.addSeparator();
search_rc.addCommand("Remove selected from playlist", 5, 0, 0);
int result = search_rc.popAtMouse();
delete search_rc;
int lastselected = searchResults.getFirstItemSelected();
int itemcounter = 1;
if(result==1){
PlEdit.moveTo (getPlEntry(lastselected), 0);
while(searchResults.getNextItemSelected(lastselected) != -1){
lastselected = searchResults.getNextItemSelected(lastselected);
PlEdit.moveTo (getPlEntry(lastselected), itemcounter);
itemcounter++;
}
PlEdit.showTrack(0);
}
else if(result==2){
PlEdit.moveTo (getPlEntry(lastselected), PlEdit.getNumTracks ()-1);
while(searchResults.getNextItemSelected(lastselected) != -1){
lastselected = searchResults.getNextItemSelected(lastselected);
PlEdit.moveTo (getPlEntry(lastselected)-itemcounter, PlEdit.getNumTracks ()-1);
itemcounter++;
}
PlEdit.showTrack(PlEdit.getNumTracks ()-1);
}
else if(result==3){
int align = 0;
int orignalPos = PlEdit.getCurrentIndex();
int temp = getPlEntry(lastselected);
if(PlEdit.getCurrentIndex() > temp) align++;
if(orignalPos > getPlEntry(lastselected)) PlEdit.moveTo (getPlEntry(lastselected), PlEdit.getCurrentIndex());
else PlEdit.moveTo (getPlEntry(lastselected), PlEdit.getCurrentIndex()+1);
while(searchResults.getNextItemSelected(lastselected) != -1){
lastselected = searchResults.getNextItemSelected(lastselected);
if(orignalPos != getPlEntry(lastselected)){
if(orignalPos > getPlEntry(lastselected)){
PlEdit.moveTo (getPlEntry(lastselected)-align, PlEdit.getCurrentIndex()+itemcounter);
}
else{
PlEdit.moveTo (getPlEntry(lastselected), PlEdit.getCurrentIndex()+itemcounter+1);
}
temp = getPlEntry(lastselected);
if(orignalPos > temp) align++;
itemcounter++;
}
}
PlEdit.showCurrentlyPlayingTrack();
}
else if(result==4){
int startpos = getPlEntry(lastselected);
while(searchResults.getNextItemSelected(lastselected) != -1){
lastselected = searchResults.getNextItemSelected(lastselected);
PlEdit.moveTo (getPlEntry(lastselected), startpos+itemcounter);
itemcounter++;
}
PlEdit.showTrack(startpos);
}
else if(result==5){
PlEdit.removeTrack (getPlEntry(lastselected));
while(searchResults.getNextItemSelected(lastselected) != -1){
lastselected = searchResults.getNextItemSelected(lastselected);
PlEdit.removeTrack (getPlEntry(lastselected)-itemcounter);
itemcounter++;
}
}
else return;
//hides the search
setSearchBox(false);
}
int getPlEntry(int search_item){
return stringToInteger(getToken(searchResults.getItemLabel(search_item,0), ". ", 0))-1;
}
setSearchBox(boolean onOff){
if(onOff){
searchBox.show();
clearButton.show();
clearButtonText.show();
helpSearch.hide();
searchBox.setFocus();
}
else{
searchBox.hide();
clearButton.hide();
clearButtonText.hide();
helpSearch.show();
results_layout.hide();
}
}
fakeSB.onLeftButtonDown(int x, int y){
setSearchBox(true);
}
fakeSB.onRightButtonDown(int x, int y){
search_rc = new PopupMenu;
search_rc.addCommand("** Search history **", 0, 0, 1);
search_rc.addSeparator();
String history = getPublicString("cPro.PlaylistPro.history", "");
boolean historyfound=false;
for(int i=0;i<15;i++){
String historyitem = getToken(history, ";", i);
if(historyitem==""){
if(i>0) historyfound=true;
break;
}
search_rc.addCommand(historyitem, i+1, 0, 0);
}
if(historyfound) search_rc.addSeparator();
search_rc.addCommand("Clear History", 100, 0, 0);
int result = search_rc.popAtMouse();
delete search_rc;
if(result>0 && result<100){
setSearchBox(true);
searchBox.setText(getToken(history, ";", result-1));
searchButton.leftClick();
}
else if(result==100){
setPublicString("cPro.PlaylistPro.history", "");
}
}
clearSearchBox(){
searchBox.setText("");
setSearchBox(false);
}
main_layout.onMove(){
if(results_layout.isVisible()){
results_layout.setXmlParam("x", integerToString(fakeSB.clientToScreenX(fakeSB.getLeft()-2)));
results_layout.setXmlParam("y", integerToString(fakeSB.clientToScreenY(fakeSB.getTop() + fakeSB.getHeight())));
results_layout.setXmlParam("ontop", "1");
}
}
main_layout.onResize(int x, int y, int w, int h){
if(results_layout.isVisible()) clearSearchBox();
}
frameGroup.onResize(int x, int y, int w, int h){
if(results_layout.isVisible()) clearSearchBox();
//if(playlist_search_attib.getData()=="0") return;
if(h<102 || playlist_search_attrib.getData()=="0"){
if(!topbar.isVisible()) return; //Don't do the same code over and over
topbar.hide();
plwh.setXmlParam("y", "0");
plwh.setXmlParam("h", "0");
}
else{
if(topbar.isVisible()) return; //Don't do the same code over and over
topbar.show();
plwh.setXmlParam("y", "30");
plwh.setXmlParam("h", "-30");
}
}
clearButton.onLeftClick(){
clearSearchBox();
}
playlist_search_attrib.onDataChanged(){
frameGroup.onResize(frameGroup.getLeft(), frameGroup.getTop(), frameGroup.getWidth(), frameGroup.getHeight());
//debug("abc " + getData());
if (getData() == "0"){
topbar.hide();
plwh.setXMLParam("y", "0");
plwh.setXMLParam("h", "0");
}
else if(getData() == "1"){
topbar.show();
plwh.setXMLParam("y", "30");
plwh.setXMLParam("h", "-30");
}
}
String replaceString(string baseString, string toreplace, string replacedby){
if (toreplace == "") return baseString;
string sf1 = strupper(baseString);
string sf2 = strupper(toreplace);
int i = strsearch(sf1, sf2);
if (i == -1) return baseString;
string left = "", right = "";
if (i != 0) left = strleft(baseString, i);
if (strlen(basestring) - i - strlen(toreplace) != 0) {
right = strright(basestring, strlen(basestring) - i - strlen(toreplace));
}
return left + replacedby + right;
}