Jump to content

mvk25

Members
  • Posts

    13
  • Joined

  • Last visited

Recent Profile Visitors

251 profile views

mvk25's Achievements

Seeker

Seeker (1/7)

1

Reputation

  1. Does WMPlayer.ocx require windows media player to be installed?
  2. First post updated and download link added again and in-compliance with site and lyricWikia rules
  3. I will iron out a few bugs and put it up soon.
  4. Hi I wanted to share with you guys this automatic lyric snippet grabber that uses mainly LyricWiki API to get lyrics for you music. It can also identify your untagged music by the song's unique acoustic fingerprint using the AcoustID database and API. Additionally it will write the lyrics snippets and any missing artist and title ID3 tags to the mp3 files. This script will only get you a small part of the full lyrics for each song. This is because the LyricWiki API only returns part of the lyrics due to licensing restrictions. In order to view the full lyrics you have to click the "View full lyrics" button which will take you the lyric.wikia song page with the full lyrics. It *might* be possible to allows this script to fetch the whole lyrics if I show the mobile version of the lyric.wikia lyrics page inside a web panel in the script (source: link). But I have no experience with the IE commands in autoit so I won't be working on that any time soon. That's it, hope you like what you see Screenshot Credits LyricWiki API AcoustID API + fpcalc tool >GUIFrame by Melba >ID3 by joeyb1275 >JSMN by Ward WinHttp by trancexx and ProgAndy Silk icons by famfamfam Linecons by Designmodo Others included in source files Download here
  5. I was trying to write a function to delete specific elements from an array using their indices and found a function made by Bowmore here . I modified the function to take an array of indices as input and to support 0-based and 1-based arrays. Here is the function along with an example: #AutoIt3Wrapper_Au3Check_Parameters=-q -d -w 1 -w 2 -w 3 -w- 4 -w 5 -w 6 -w- 7 #include <array.au3> ; #FUNCTION# ==================================================================================================================== ; Name...........: _ArrayDeleteIndices ; Description ...: This function is passed an array with the indices of the elements that need to be deleted from a given 1 or 2 ; dimensional array. The elements are deleted and the remaining elements are shifted up to take the empty spaces ; Syntax.........: _ArrayDeleteIndices(ByRef $avArray, Byref $aiIndices[, $iBase = Default]) ; Parameters ....: $$avArray - The 1 or 2 dimensional array to delete elements from ; $aiIndices - The 1 dimensional array containing the indices of elements to delete ; $iBase - If true then the arrays will be treated as 1 based. Default is 0 ; Return values .: Success - Returns 1 ; Failure - Returns 0 and sets @error to a non zero value ; @error 1 - If first parameter is not an array or an empty array ; 2 - If Indices parameter is not an array or an empty array ; 3 - If data array has more than 2 dimensions ; 4 - If indices array starts with a non integer value or -ve value ; 5 - $iBase is invalid ; 6 - Element 0 is in indices array but the array is 1-based! ; Author ........: (mvk25) ... Based on _ArrayRemoveBlanks by (Bowmore) ; [autoitscript.com/forum/topic/132027-array-delete-blank-element/?p=919764] ; Modified.......: ; Remarks .......: Relies on _ArraySort and _ArrayUnique from array.au3 UDF ; ; Related .......: _ArrayDelete ; Link ..........: ; Example .......: Yes ; =============================================================================================================================== Func _ArrayDeleteIndices(ByRef $avArray, ByRef $aiIndicesUnsrtd, $iBase = Default) ; Make sure $iBase is either 1 or 0 If $iBase = Default Then $iBase = 0 If $iBase < 0 Or $iBase > 1 Or (Not IsInt($iBase)) Then Return SetError(5, 0, 0) ; Check array parameters Local $aiArraySize[2] = [UBound($avArray)] If $aiArraySize[0] = $iBase Then Return SetError(1, 0, 0) If UBound($aiIndicesUnsrtd) = $iBase Then Return SetError(2, 0, 0) ; Get number of dimensions in data array and if more than 2 throw an error Local $iDims = UBound($avArray, 0) If $iDims > 2 Then Return SetError(3, 0, 0) ; Remove duplicate elements from the indices array Local $iColumn = 1, $iCase = 1, $iCountIn0Index = $iBase Local $aiIndices = _ArrayUnique($aiIndicesUnsrtd, $iColumn, $iBase, $iCase, $iCountIn0Index) ; Sort it ascendingly Local $iDescending = 0, $iSortStart = $iBase _ArraySort($aiIndices, $iDescending, $iSortStart) ; Check if array has a non integer or -ve element as first base element and return error If (Not IsInt($aiIndices[$iBase])) Or ($aiIndices[$iBase] < 0) Then Return SetError(4, 0, 0) ; Check if first base element is 0 when $iBase = 1 and return error If $iBase And $aiIndices[1] = 0 Then Return SetError(6, 0, 0) Local $iIndicesCount = UBound($aiIndices) Local $iIndex = $iBase Local $iIndexDel = $iBase $aiArraySize[1] = UBound($avArray, 2) For $i = $iBase To ($aiArraySize[0] - 1) If $i <> $aiIndices[$iIndexDel] Then For $j = 0 To ($aiArraySize[1] - 1) $avArray[$iIndex][$j] = $avArray[$i][$j] Next $iIndex += 1 Else If $iIndexDel < ($iIndicesCount - 1) Then $iIndexDel += 1 EndIf Next ReDim $avArray[$iIndex][$aiArraySize[1]] Return 1 EndFunc ;==>_ArrayDeleteIndices Example() Func Example() Local $iBase = 0 ; Make the test array 0 based or 1 based Local $iElements = 13 ; Number of elements in test array Local $iDims = 2 ; Number of columns in test array ; Create the array Local $aArray[$iElements + $iBase][$iDims] ; Fill the array with characters starting from A For $i = $iBase To ($iElements + $iBase - 1) For $j = 0 To ($iDims - 1) $aArray[$i][$j] = Chr(65 + $i - $iBase + $j) Next Next ; Now create the array containing the indices to be deleted from test array Local $iCase = 1 ; Try different arrays Switch $iCase Case 1 Local $aDel[] = [1, 3, 4, 11] Case 2 Local $aDel[] = [10, 5, 3, 2, 0] ; Order is not important Case 3 Local $aDel[] = [0, 5, 5, 1, 9, 9] ; Duplicate items are ignored Case 4 Local $aDel[] = [999, 0, 1000000] ; Items outside range are ignored Case 5 Local $aDel[] = [0, 10, -2] Case 6 Local $aDel[] = [3, 5, 6, 0] ; Try this with $iBase = 1 Case 7 Local $aDel[5] EndSwitch _ArrayDisplay($aArray, "Before") _ArrayDeleteIndices($aArray, $aDel, $iBase) If @error Then ConsoleWrite("!Error Code: " & @error & @LF & @LF) Else _ArrayDisplay($aArray, "After") EndIf EndFunc ;==>Example I need some feedback regarding the support 1-based arrays.
  6. Hi, I found a bug in the _h_ID3v2_CreateFrameUSLT function Func _h_ID3v2_CreateFrameUSLT($sLyricsFilename, $sDescription = "", $sLanguage = "eng", $iTextEncoding = 0) ;--------------------------------------------------------------------------------- ;<Header for 'Unsynchronised lyrics/text transcription', ID: "USLT"> ;Text encoding $xx ;Language $xx xx xx ;Content descriptor <text string according to encoding> $00 (00) ;Lyrics/text <full text string according to encoding> ;--------------------------------------------------------------------------------- Local $sLyrics = "" If FileExists($sLyricsFilename) Then $sLyrics = FileRead($sLyricsFilename) Endif Local $bFrameData = Binary("0x0" & String($iTextEncoding)) $bFrameData &= _h_ID3v2_EncodeStringToBinary($iTextEncoding, $sLanguage) $bFrameData &= _h_ID3v2_EncodeStringToBinary($iTextEncoding, $sDescription) & Binary("0x00") $bFrameData &= _h_ID3v2_EncodeStringToBinary($iTextEncoding, $sLyrics) ;~ MsgBox(0,"$bFrameData",$bFrameData) Return $bFrameData EndFunc ;==>_h_ID3v2_CreateFrameUSLT The function assumes that is will be provided a file as the first parameter but internally it is called with the lyrics string itself so it never executes because the file does not exist changing the code to this will make it work: If FileExists($sLyricsFilename) Then $sLyrics = FileRead($sLyricsFilename) Else $sLyrics = $sLyricsFilename EndIf
  7. I didn't see those lines in the second example
  8. Thank you for your time and for providing three examples as well I tried the three examples and I think I'll stick with example 1 because in both examples 2 and 3 the resizing between the status bar and the frame is not quite right. Maybe I'll just create a fake status bar using a label since I won't be displaying any thing fancy down there. Here are the problems I found and fixed in example 1: After resizing the window, the top pane containing the toolbar is resizable again to some degree After resizing the window > clicking the separator of the top pane cause a weird resize of the frames and makes the top pane disappear altogether. Resizing the window again fixes everything again I fixed the first bug by adding: $aClient = WinGetClientSize($hBot_Pane) _GUIFrame_SetMin($iFrame_1, $iGUICtrl_TbarHeight, $aClient[1], True) again inside the _WM_SIZE() function. The second bug was fixed simply by making _GUIFrame_SIZE_Handler() run first inside the _WM_SIZE() and then my resizing code. I didn't know that the order matters and put my resizing code first. Here is example 1 with the fixes included and without a status bar. #include <WindowsConstants.au3> #include <ColorConstantS.au3> #include <GUIConstantsEx.au3> #include <GuiToolbar.au3> #include <GUIFrame.au3> Global $hGUI_Main = GUICreate("GUIFrame & toolbars ex", 800, 600, Default, Default, $WS_SIZEBOX) GUISetState() ; Forget about status bars :) ; Create first frame Global $iFrame_1 = _GUIFrame_Create($hGUI_Main, 1, 50, 3) ; Get handles of created panes $hTop_Pane = _GUIFrame_GetHandle($iFrame_1, 1) $hBot_Pane = _GUIFrame_GetHandle($iFrame_1, 2) GUISetBkColor($COLOR_SKYBLUE, $hTop_Pane) ; Create ToolBar Global $hGUICtrl_Tbar = _GUICtrlToolbar_Create($hTop_Pane) _GUICtrlToolbar_AddBitmap($hGUICtrl_Tbar, 1, -1, $IDB_STD_LARGE_COLOR) _GUICtrlToolbar_AddButton($hGUICtrl_Tbar, 1000, 0, _GUICtrlToolbar_AddString($hGUICtrl_Tbar, "Cut")) Global $iGUICtrl_TbarHeight = _GuiCtrlToolbar_GetHeight($hGUICtrl_Tbar) ; Correct separator bar pos and set min size _GUIFrame_SetSepPos($iFrame_1, $iGUICtrl_TbarHeight) ; Next 2 lines are also added inside the _WM_SIZE function because $aClient changes after resizing $aClient = WinGetClientSize($hBot_Pane) _GUIFrame_SetMin($iFrame_1, $iGUICtrl_TbarHeight, $aClient[1], True) ; Now create second level frame Global $iFrame_2 = _GUIFrame_Create($hBot_Pane) ; Get handles $hLeft_Pane = _GUIFrame_GetHandle($iFrame_2, 1) $hRight_Pane = _GUIFrame_GetHandle($iFrame_2, 2) GUISetBkColor($COLOR_WHITE, $hLeft_Pane) GUISetBkColor($COLOR_SILVER, $hRight_Pane) ; Create label in left bottom pane _GUIFrame_Switch($iFrame_2, 1) $aSize = WinGetClientSize($hLeft_Pane) Global $hLabel = GUICtrlCreateLabel("", 8, 8, $aSize[0]-16, $aSize[1]-16) GUICtrlSetBkColor($hLabel, $COLOR_MONEYGREEN) GUISetState(@SW_SHOW, $hGUI_Main) GUIRegisterMsg($WM_SIZE, "_WM_SIZE") _GUIFrame_ResizeSet($iFrame_1, 1) ; Fix top frame size _GUIFrame_ResizeSet($iFrame_2) ; Allow bottom frame to resize While 1 Switch GUIGetMsg() Case $GUI_EVENT_CLOSE _GUICtrlToolbar_Destroy($hGUICtrl_Tbar) Exit EndSwitch WEnd Func _GuiCtrlToolbar_GetHeight(ByRef $hTbar) If Not IsHWnd($hTbar) Then Return SetError(1, 0, 0) Local $aSize = _GUICtrlToolbar_GetMaxSize($hTbar) Local $aPadd = _GUICtrlToolbar_GetPadding($hTbar) Return $aSize[1] + $aPadd[1] EndFunc ;==>_GuiCtrlToolbar_GetHeight Func _WM_SIZE($hWnd, $iMsg, $wParam, $lParam) #forceref $iMsg, $wParam, $lParam _GUIFrame_SIZE_Handler($hWnd, $iMsg, $wParam, $lParam) ; fixes the resize on click proplem Static Local $aClientSize = WinGetClientSize($hBot_Pane) ; fixes the top pane being resizable $aClientSize = WinGetClientSize($hBot_Pane) ; After window resize _GUIFrame_SetMin($iFrame_1, $iGUICtrl_TbarHeight, $aClientSize[1], True) ;~ _GUIFrame_SIZE_Handler($hWnd, $iMsg, $wParam, $lParam) ; here top pane resizes on click EndFunc ;==>_WM_SIZE
  9. Hi, Thank you Melba23 for this great UDF I am having some trouble with this UDF because I have a toolbar and a status bar in my GUI. First, I can't get the frame to occupy only the space between the tool and status bars. Secondly, when resizing the GUI the frame overlaps and gets hidden behind the tool bar. Also note that I read the solution you posted regarding status bars in frames and I tried applying it to my GUI but the example you posted didn't divide the main GUI so it's different and I am not sure if I need to make additional status bars in each frame. Here is an example: #include <GUIConstantsEx.au3> #include <WindowsConstants.au3> #include <GuiToolbar.au3> #include <GuiStatusbar.au3> #include <GUIFrame.au3> Global $hGUI_Main = GUICreate("Lyric Tag", 800, 600, -1, -1, BitOR($WS_OVERLAPPEDWINDOW, $WS_POPUP)) GUISetState() ; Main statusbar ;~ Global $hGUICtrl_Sbar = _GUICtrlStatusBar_Create($hGUI_Main) ;~ _GUICtrlStatusBar_SetMinHeight($hGUICtrl_Sbar, 20) ; ToolBar Global $hGUICtrl_Tbar = _GUICtrlToolbar_Create($hGUI_Main) _GUICtrlToolbar_AddBitmap($hGUICtrl_Tbar, 1, -1, $IDB_STD_LARGE_COLOR) _GUICtrlToolbar_AddButton($hGUICtrl_Tbar, 1000, 0, _GUICtrlToolbar_AddString($hGUICtrl_Tbar, "&Cut")) Global $iGUICtrl_TbarHeight = _GuiCtrlToolbar_GetHeight($hGUICtrl_Tbar) ; Create GUI Frame Global $iFrameHeight = 600 - $iGUICtrl_TbarHeight - 0 - 2 Global $iFrame = _GUIFrame_Create($hGUI_Main, 0, 550, 6, 0, $iGUICtrl_TbarHeight + 1, 0, $iFrameHeight) ; Create listview in right frame _GUIFrame_Switch($iFrame, 1) ; Testing status bar inside frame but does not show correctly Global $hGUICtrl_Sbar = _GUICtrlStatusBar_Create(_GUIFrame_GetHandle($iFrame, 1)) _GUICtrlStatusBar_SetMinHeight($hGUICtrl_Sbar, 20) ; Listview $aSize = WinGetClientSize(_GUIFrame_GetHandle($iFrame, 1)) Global $hGUICtrl_Listv = GUICtrlCreateListView("test", 0, 0, $aSize[0], $aSize[1]) GUISetState(@SW_SHOW, $hGUI_Main) GUIRegisterMsg($WM_SIZE, "_WM_SIZE") _GUIFrame_ResizeSet(0) While 1 Switch GUIGetMsg() Case $GUI_EVENT_CLOSE _GUICtrlStatusBar_Destroy($hGUICtrl_Sbar) _GUICtrlToolbar_Destroy($hGUICtrl_Tbar) Exit EndSwitch WEnd Func _GuiCtrlToolbar_GetHeight(ByRef $hTbar) If Not IsHWnd($hTbar) Then Return SetError(1, 0, 0) Local $aSize = _GUICtrlToolbar_GetMaxSize($hTbar) Local $aPadd = _GUICtrlToolbar_GetPadding($hTbar) Return $aSize[1] + $aPadd[1] EndFunc ;==>_GuiCtrlToolbar_GetHeight Func _WM_SIZE($hWnd, $iMsg, $wParam, $lParam) #forceref $iMsg, $wParam, $lParam _GUIFrame_SIZE_Handler($hWnd, $iMsg, $wParam, $lParam) Local $aClientSize = WinGetClientSize($hGUI_Main) ; Resize toolbar & Resize Statusbar WinMove($hGUICtrl_Tbar, "", Default, Default, $aClientSize[0]) _GUICtrlStatusBar_Resize($hGUICtrl_Sbar) EndFunc ;==>_WM_SIZE Any help will be appreciated.
  10. Thanks you joeb1275 for this great UDF and thanks to all who helped make it better I noticed while using this UDF that it would take a long time(more than 10 seconds or so) to read the tags of 48 mp3 files (400 MB). Then I measured the time it takes for each mp3 and it turns out only a couple of mp3 files took around 3 seconds each while all rest were read in milliseconds. I loaded one of the troublesome mp3 files in mp3tag it it showed up as corrupted so clearly this is not this UDFs fault. But I still wanted to figure out why I took so long and after some time measuring I tracked down the slowdown to the _h_ID3v2Tag_EnumerateFrameIDs() function. Inside the function is the following For loop: For $itest = 1 To ($iBytesRead + $iFrameSize + 20) $bFrameHeader = BinaryMid($ID3v2_RawDataBinary,$iBytesRead + 1 + $itest,$iFrameHeaderLen) $sFrameID = _h_ID3v2FrameHeader_GetFrameID($bFrameHeader) If $sFrameID <> -1 Then $iBytesRead += $itest ;~ MsgBox(0,"$iBytesRead Really in Frame",$itest) $iFrameSize = _h_ID3v2FrameHeader_GetFrameSize($bFrameHeader) ;~ MsgBox(0,"$FrameSize",$iFrameSize) ExitLoop 1 Else ;~ MsgBox(0,"Error Check Scan Frame",String($iBytesRead + 1 + $itest) & " => " & $FrameID) EndIf Next I think this loops through the tag after an invalid tagID is found until a frameheader is found. I think there is a problem in either the $itest condition value or the $sFrameHeader initialization in binarymid. You can see that in both of those $iBytesRead is added and $iBytesRead is added to $itest in binarymid. This can lead to the for loop reading well beyond the tag size. I changed the code to the following: For $itest = 1 To ($iTagSize - $iBytesRead - $iFrameHeaderLen) $iBinStart = $iBytesRead + $itest $bFrameHeader = BinaryMid($ID3v2_RawDataBinary, $iBinStart, $iFrameHeaderLen) ;~ MsgBox(0, "new $bFrameHeader", $bFrameHeader) $sFrameID = _h_ID3v2FrameHeader_GetFrameID($bFrameHeader) If $sFrameID <> -1 Then $iBytesRead += $itest ;~ MsgBox(0, "$iBytesRead Really in Frame", $itest) $iFrameSize = _h_ID3v2FrameHeader_GetFrameSize($bFrameHeader) ;~ MsgBox(0, "$FrameSize", $iFrameSize) ExitLoop 1 Else ;~ MsgBox(0, "Error Check Scan Frame", String($iBytesRead + 1 + $itest) & " => " & $sFrameID) EndIf Next And the corrupted mp3 files are now read in about 300 milliseconds! I think another thing to add to increase the speed even more is to check if the tag padding area is reached. Although this speeds up things with my corrupted mp3s this might not be a fix at all for other cases since I don't understand the reason behind the original loop condition value. Edit: It seems this UDF does not work with the latest AutoIt v3.3.10.0 – 23rd December, 2013. The UDF compiles correctly but _ID3GetTagField() functions return nothing. And a link to one of the corrupt mp3s https://db.tt/g9xdTbU5 (Dropbox) Another edit: I did some debugging and noticed that the Dec() function that is used to convert hexadecimal frame size to decimal always returns 1 when the flag is set to 1(32 bit) or 2(64 bit) $bTagSize = "0x00031160" MsgBox(0, "", Dec(Hex($bTagSize), 1)) ;Returns 1 MsgBox(0, "", Dec(Hex($bTagSize), 2)) ;Returns 1 MsgBox(0, "", Dec(Hex($bTagSize))) ;Returns the correct decimal representation I removed the flag value from all the Dec() calls and it seems that fixed it, though I only tested it with ID3v2 tags because I removed v1 tags from my mp3s. here is the updated UDF https://db.tt/Yz4GUF48
  11. I improved the function written by funkey by expanding the range of accented charachters it can replace. $stest = "á|â|à|å|ä ð|é|ê|è|ë í|î|ì|ï ó|ô|ò|ø|õ|ö ú|û|ù|ü æ ç ß abc ABC 123" $stest = _StringReplaceAccend($stest) ConsoleWrite(@LF & @LF & "+>" & $stest & @LF & @LF) Func _StringReplaceAccend($sString) Local $exp, $rep Local $pattern[27][2] = [ _ ["[ÀÁÂÃÅÆ]", "A"],["[àáâãå]", "a"],["Ä", "Ae"],["[æä]", "ae"], _ ["Þ", "B"],["þ", "b"], _ ["Ç", "C"],["ç", "c"], _ ["[ÈÉÊË]", "E"],["[èéêë]", "e"], _ ["[ÌÍÎÏ]", "I"],["[ìíîï]", "i"], _ ["Ñ", "N"],["ñ", "n"], _ ["[ÒÓÔÕÖØ]", "O"],["[ðòóôõöø]", "o"], _ ["[Š]", "S"],["[š]", "s"], _ ["ß", "Ss"], _ ["[ÙÚÛ]", "U"],["[ùúû]", "u"],["Ü", "Ue"],["ü", "ue"], _ ["Ý", "Y"],["[ýýÿ]", "y"], _ ["Ž", "Z"],["ž", "z"]] For $i = 0 To (UBound($pattern) - 1) $exp = $pattern[$i][0] If $exp = "" Then ContinueLoop $rep = $pattern[$i][1] $sString = StringRegExpReplace($sString, $exp, $rep) If @error == 0 And @extended > 0 Then ConsoleWrite($sString & @LF & "--> " & $exp & @LF) EndIf Next Return $sString EndFunc ;==>_StringReplaceAccend
  12. Thank you Rover example 1 works great. And I am sorry for the late reply, I was away from home for while.
  13. Hi I am trying to embed an icon control and an AVI control in the status bar but the problem is they won't retain their transparency. An example: #include <GuiStatusBar.au3> #include <GUIConstantsEx.au3> Global $WindowMain = GUICreate("Example", 351, 176, -1, -1) GUISetBkColor( 0xDDDDDD, $WindowMain ) Global $Statusbar = _GUICtrlStatusBar_Create($WindowMain) Global $Statusbar_PartsWidth[2] = [324, -1] _GUICtrlStatusBar_SetParts($Statusbar, $Statusbar_PartsWidth) _GUICtrlStatusBar_SetText($Statusbar, "", 0) _GUICtrlStatusBar_SetText($Statusbar, "", 1) _GUICtrlStatusBar_SetMinHeight($Statusbar, 20) GUISetState(@SW_SHOW) $Icon = GUICtrlCreateIcon('ico.ico',-1,300,130,16,16) ;Icon on GUI ;Without this the icon will not be tranparent. No idea why. GUICtrlSetState($icon, $GUI_SHOW) $Icon2 = GUICtrlCreateIcon('ico.ico',-1,10,10,16,16) _GUICtrlStatusBar_EmbedControl($Statusbar, 1, GUICtrlGetHandle($Icon2), 1+2) ; This has no effect. Icon has a white square around it GUICtrlSetState($icon2, $GUI_SHOW) $AVI = GUICtrlCreateAvi( 'avi.avi',0,250,130,16,16) GUICtrlSetState( $AVI, 1 ) $AVI2 = GUICtrlCreateAvi( 'avi.avi',0,250,130,16,16) GUICtrlSetState( $AVI2, 1 ) _GUICtrlStatusBar_EmbedControl($Statusbar, 0, GUICtrlGetHandle($AVI2), 1+2) Global $GuiMsg Do $GuiMsg = GUIGetMsg() Until $GuiMsg = $GUI_EVENT_CLOSE I've tried a couple of things like using _GUICtrlStatusBar_SetIcon() or GDIplus for icons and that works and the icons are transparent. As for the AVI, I tried faking a status bar by drawing some lines at the buttom of the window and that worked ok too, But I'd love to be able to use it with a real status bar. example.zip
×
×
  • Create New...