From 864081102a5f252415f41950b3039a896b4ae9c5 Mon Sep 17 00:00:00 2001 From: Vadim Dashevskiy Date: Mon, 8 Oct 2012 18:43:29 +0000 Subject: Awkwars's plugins - welcome to our trunk git-svn-id: http://svn.miranda-ng.org/main/trunk@1822 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c --- plugins/mRadio/i_tray.inc | 228 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 228 insertions(+) create mode 100644 plugins/mRadio/i_tray.inc (limited to 'plugins/mRadio/i_tray.inc') diff --git a/plugins/mRadio/i_tray.inc b/plugins/mRadio/i_tray.inc new file mode 100644 index 0000000000..096e288691 --- /dev/null +++ b/plugins/mRadio/i_tray.inc @@ -0,0 +1,228 @@ +{} +var + trayradioparent:THANDLE; + trayparent:THANDLE; + traymute :THANDLE; + trayplay :THANDLE; + srvtrayplaypause:THANDLE; + srvtraystop:THANDLE; +const + trayStations:TSortedList = (items:nil; realCount:0; limit:0; increment:8; sortFunc: nil); + +type + pTrayRadioStation = ^tTrayRadioStation; + tTrayRadioStation = record + name :pWideChar; + hContact:THANDLE; + service :THANDLE; + menuitem:THANDLE; + presents:int; // 0 - not used, 1 - ok, 2 - new + end; + +function MyStrSort(para1:pointer; para2:pointer):int; cdecl; +begin + result:=StrCmpW(pTrayRadioStation(para1).name,pTrayRadioStation(para2).name); +end; + +function ChooseStation(wParam:WPARAM;lParam,lParam1:LPARAM):int; cdecl; +begin + result:=Service_RadioPlayStop(lParam1,0); +end; + +procedure MakeStationsMenu; +var + hContact:Cardinal; + p:pWideChar; + i,idx:integer; + tmp:pTrayRadioStation; + srch:tTrayRadioStation; + pc:pAnsiChar; + buf:array [0..63] of AnsiChar; + mi:TCListMenuItem; +begin + trayStations.sortFunc:=@MyStrSort; + + // clear presents flag + if trayStations.realCount>0 then + for i:=0 to trayStations.realCount-1 do + pTrayRadioStation(trayStations.Items[i]).presents:=0; + + // Fill list + FillChar(srch,SizeOf(srch),0); + hContact:=CallService(MS_DB_CONTACT_FINDFIRST,0,0); + while hContact<>0 do + begin + if StrCmp(PAnsiChar(CallService(MS_PROTO_GETCONTACTBASEPROTO,hContact,0)),cPluginName)=0 then + begin + p:=DBReadUnicode(hContact,strCList,'MyHandle',nil); + if p<>nil then + begin + srch.name:=p; + // search in list + if List_GetIndex(@trayStations,@srch,@idx)<>0 then + // found - set mark + pTrayRadioStation(trayStations.Items[idx]).presents:=1 + else // add if not found + begin + mGetMem(tmp,SizeOf(tTrayRadioStation)); + tmp.name :=p; + tmp.presents:=2; + tmp.hContact:=hContact; + List_InsertPtr(@trayStations,tmp); + end; + end; + end; + hContact:=CallService(MS_DB_CONTACT_FINDNEXT,hContact,0); + end; + + // delete obsolete elements + for i:=trayStations.realCount-1 downto 0 do + begin + tmp:=pTrayRadioStation(trayStations.Items[i]); + if tmp.presents=0 then + begin + mFreeMem(tmp.name); + DestroyServiceFunction(tmp.service); + CallService(MS_CLIST_REMOVETRAYMENUITEM,tmp.menuitem,0); + mFreeMem(tmp); + List_Remove(@trayStations,i); + end; + end; + + // build menu from sorted list + FillChar(mi,SizeOf(mi),0); + mi.cbSize:=sizeof(mi); + mi.Flags :=CMIF_KEEPUNTRANSLATED or CMIF_UNICODE or CMIF_ROOTHANDLE; + mi.szPopupName:=TChar(trayparent); + pc:=StrCopyE(@buf,'mRadio/Choose'); + for i:=0 to trayStations.realCount-1 do + begin + tmp:=pTrayRadioStation(trayStations.Items[i]); + if tmp.presents=2 then + begin + IntToStr(pc,tmp.hContact); + tmp.service:=CreateServiceFunctionParam(@buf,@ChooseStation,tmp.hContact); + mi.position :=i; + mi.pszService:=@buf; + mi.szName.w :=tmp.name; + tmp.menuitem:=Menu_AddTrayMenuItem(@mi); + end; + end; +end; + +function TrayPlayPause(wParam:WPARAM;lParam:LPARAM):int_ptr; cdecl; +begin + result:=CallService(MS_RADIO_COMMAND,MRC_PAUSE,0); +end; + +function TrayStop(wParam:WPARAM;lParam:LPARAM):int_ptr; cdecl; +begin + result:=CallService(MS_RADIO_COMMAND,MRC_STOP,0); +end; + +procedure CreateTrayMenu(); +var + mi:TCListMenuItem; + playstr:pWideChar; +begin + FillChar(mi, sizeof(mi), 0); + mi.cbSize :=sizeof(mi); + mi.flags :=CMIF_UNICODE; + mi.szName.w:=cPluginName; + mi.hIcon :=CallService(MS_SKIN2_GETICON,0,lparam(IcoBtnSettings)); + trayradioparent:=Menu_AddTrayMenuItem(@mi); + + FillChar(mi, sizeof(mi), 0); + mi.cbSize :=sizeof(mi); + mi.szPopupName:=TChar(trayradioparent); + + if gVolume<0 then + mi.flags:=CMIF_UNICODE or CMIF_ROOTHANDLE or CMIF_CHECKED + else + mi.flags:=CMIF_UNICODE or CMIF_ROOTHANDLE; + mi.szName.w :='Mute'; + mi.pszService:=MS_RADIO_MUTE; + mi.position :=1; + traymute:=Menu_AddTrayMenuItem(@mi); + + mi.flags:=CMIF_UNICODE or CMIF_ROOTHANDLE; + if CallService(MS_RADIO_COMMAND,MRC_STATUS,RD_STATUS_GET)<>RD_STATUS_PLAYING then + playstr:='Play' + else + playstr:='Pause'; + mi.szName.w :=playstr; + mi.position :=2; + srvtrayplaypause:=CreateServiceFunction('mRadio/TrayPlayPause',@TrayPlayPause); + mi.pszService:='mRadio/TrayPlayPause'; + trayplay:=Menu_AddTrayMenuItem(@mi); + + mi.szName.w :='Stop'; + mi.position :=3; + srvtraystop:=CreateServiceFunction('mRadio/TrayStop',@TrayStop); + mi.pszService:='mRadio/TrayStop'; + Menu_AddTrayMenuItem(@mi); + + mi.szName.w :='Play Station'; + mi.position :=1000; + mi.pszService:=nil; + trayparent:=Menu_AddTrayMenuItem(@mi); +end; + +function TrayPrebuild(wParam:WPARAM;lParam:LPARAM):int; cdecl; +var + mi:tClistMenuItem; + playstr:pWideChar; +begin + FillChar(mi,sizeof(mi),0); + mi.cbSize:=sizeof(mi); + if gVolume<0 then + mi.flags:=CMIM_FLAGS or CMIF_CHECKED + else + mi.flags:=CMIM_FLAGS; + CallService(MS_CLIST_MODIFYMENUITEM,traymute,tlparam(@mi)); + + mi.flags:=CMIM_NAME or CMIF_UNICODE; + if CallService(MS_RADIO_COMMAND,MRC_STATUS,RD_STATUS_GET)<>RD_STATUS_PLAYING then + playstr:='Play' + else + playstr:='Pause'; + mi.szName.w:=playstr; + CallService(MS_CLIST_MODIFYMENUITEM,trayplay,tlparam(@mi)); + + MakeStationsMenu(); + result:=0; +end; + +procedure CreateMIMTrayMenu; +begin + if ServiceExists(MS_CLIST_ADDTRAYMENUITEM)<>0 then +// if hiddenwindow<>0 then + begin + CreateTrayMenu(); + MakeStationsMenu(); + HookEvent(ME_CLIST_PREBUILDTRAYMENU,@TrayPrebuild); + end; +end; + +procedure RemoveTrayItems; +var + i:integer; + tmp:pTrayRadioStation; +begin + // remove stations + for i:=trayStations.realCount-1 downto 0 do + begin + tmp:=pTrayRadioStation(trayStations.Items[i]); + mFreeMem(tmp.name); + DestroyServiceFunction(tmp.service); +// CallService(MS_CLIST_REMOVETRAYMENUITEM,tmp.menuitem,0); + mFreeMem(tmp); + end; + List_Destroy(@trayStations); + DestroyServiceFunction(srvtrayplaypause); + DestroyServiceFunction(srvtraystop); + + if ServiceExists(MS_CLIST_REMOVETRAYMENUITEM)<>0 then + CallService(MS_CLIST_REMOVETRAYMENUITEM,trayradioparent,0); + +end; -- cgit v1.2.3