diff --git a/applications/cactusjukebox/source/mainform.lfm b/applications/cactusjukebox/source/mainform.lfm index 9a8175a49..a9721421f 100644 --- a/applications/cactusjukebox/source/mainform.lfm +++ b/applications/cactusjukebox/source/mainform.lfm @@ -604,18 +604,22 @@ object Main: TMain item AutoSize = True Caption = 'Title' + Width = 37 end item AutoSize = True Caption = 'Album' + Width = 52 end item AutoSize = True Caption = 'Track' + Width = 45 end item AutoSize = True Caption = 'Genre' + Width = 49 end item AutoSize = True @@ -627,7 +631,7 @@ object Main: TMain AutoSize = True Caption = 'Length' MaxWidth = 60 - Width = 57 + Width = 55 end> PopupMenu = titlelistmenu ReadOnly = True @@ -843,7 +847,7 @@ object Main: TMain end object current_title_edit: TEdit Left = 12 - Height = 21 + Height = 27 Top = 109 Width = 200 Color = clBtnFace @@ -852,7 +856,7 @@ object Main: TMain end object current_title_edit1: TEdit Left = 12 - Height = 21 + Height = 27 Top = 141 Width = 200 Color = clBtnFace @@ -861,9 +865,9 @@ object Main: TMain end object randomcheck: TCheckBox Left = 135 - Height = 19 + Height = 23 Top = 257 - Width = 62 + Width = 75 Caption = 'Random' OnChange = randomcheckChange TabOrder = 3 @@ -946,10 +950,10 @@ object Main: TMain TabOrder = 2 object filetypebox: TComboBox Left = 360 - Height = 21 + Height = 27 Top = 14 Width = 90 - ItemHeight = 13 + ItemHeight = 19 ItemIndex = 0 Items.Strings = ( 'all types' @@ -967,7 +971,7 @@ object Main: TMain end object searchstr: TEdit Left = 120 - Height = 21 + Height = 27 Top = 14 Width = 232 OnKeyUp = searchstrKeyUp @@ -977,7 +981,7 @@ object Main: TMain Left = 16 Height = 28 Hint = 'Search the library' - Top = 10 + Top = 12 Width = 90 BorderSpacing.InnerBorder = 4 Caption = 'Search' @@ -1012,7 +1016,7 @@ object Main: TMain Left = 501 Height = 30 Hint = 'Clear Playlist' - Top = 12 + Top = 14 Width = 84 Anchors = [akTop, akRight] AutoSize = True @@ -1196,7 +1200,7 @@ object Main: TMain end object artistsearch: TEdit Left = 8 - Height = 21 + Height = 27 Top = 32 Width = 110 OnKeyUp = ArtistTreeKeyUp diff --git a/applications/cactusjukebox/source/mainform.pas b/applications/cactusjukebox/source/mainform.pas index 51ccb31e0..dbb353d61 100644 --- a/applications/cactusjukebox/source/mainform.pas +++ b/applications/cactusjukebox/source/mainform.pas @@ -1,5 +1,3 @@ - - { Main unit for Cactus Jukebox @@ -9,89 +7,81 @@ Contact the author at: sebastian_kraft@gmx.de This Software is published under the GPL - - - - - } //TODO: Check if position icon in playlist works after loading playlist from file -Unit mainform; - +unit mainform; //{$mode delphi}{$H+} {$mode objfpc}{$H+} -{$ifdef CPU86} //compile with fmod support enabled by default on i386 +{$ifdef CPU86}//compile with fmod support enabled by default on i386 {$define fmod} {$endif} -Interface +interface - -Uses - -Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, Buttons, -ExtCtrls, ComCtrls, StdCtrls, Menus,{$ifdef fmod} fmodplayer,{$endif} -ActnList, FileUtil, mediacol, dos, SimpleIPC, functions, EditBtn, last_fm, debug, config, -playlist, playerclass, mplayer, mp3file, Messages, LMessages, cj_interfaces; +uses + Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, Buttons, + ExtCtrls, ComCtrls, StdCtrls, Menus,{$ifdef fmod} fmodplayer,{$endif} + ActnList, FileUtil, mediacol, dos, SimpleIPC, functions, EditBtn, last_fm, debug, config, + playlist, playerclass, MPlayer, mp3file, Messages, LMessages, cj_interfaces; resourcestring -rsQuit = 'Quit'; -rsFile = 'File'; -rsOpenFile = 'Open File...'; -rsOpenDirector = 'Open Directory...'; -rsPlayerOnly = 'Player only'; -rsChooseSkin = 'Choose Skin...'; -rsSettings = 'Settings...'; -rsLibrary = 'Library'; -rsNewLibrary = 'New library'; -rsLoadLibrary = 'Load library'; -rsSaveLibrary = 'Save library'; -rsLibraryInfo = 'Library info'; -rsManageLibrar = 'Manage library...'; -// unused ? rsRescanDirect = 'Rescan directories'; -rsPlaylist = 'Playlist'; -rsPlay = 'Play'; -rsNext = 'Next'; -rsPrevious = 'Previous'; -rsMute = 'Mute'; -rsLoadPlaylist = 'Load playlist'; -rsSavePlaylist = 'Save playlist'; -rsMobilePlayer = 'Mobile player'; -rsClearPlaylist = 'Clear Playlist'; -rsRandomPlaylist = 'Random Playlist'; -rsDevices = 'Devices'; -rsDeviceInfo = 'Device info'; -rsScanPlayer = 'Scan player'; -rsSync = 'Sync'; -rsClearPlayer = 'Clear player'; -rsUndoSelectio = 'Undo selection'; -rsAudioCD = 'Audio CD'; -rsRipEncode = 'Rip / Encode...'; -rsHelp = 'Help'; -rsAbout = 'About...'; -rsManual = 'Manual...'; -rsClear = 'Clear'; -rsSearch = 'Search'; -rsAlbum = 'Album'; -rsFilename = 'Filename'; -rsArtist = 'Artist'; -rsTitle = 'Title'; -rsRandom = 'Random'; -rsNotConnected = 'Device not Connected'; -rsOK = 'OK'; -rsLenght = 'Length'; -rsTrack = 'Track'; + rsQuit = 'Quit'; + rsFile = 'File'; + rsOpenFile = 'Open File...'; + rsOpenDirector = 'Open Directory...'; + rsPlayerOnly = 'Player only'; + rsChooseSkin = 'Choose Skin...'; + rsSettings = 'Settings...'; + rsLibrary = 'Library'; + rsNewLibrary = 'New library'; + rsLoadLibrary = 'Load library'; + rsSaveLibrary = 'Save library'; + rsLibraryInfo = 'Library info'; + rsManageLibrar = 'Manage library...'; + // unused ? rsRescanDirect = 'Rescan directories'; + rsPlaylist = 'Playlist'; + rsPlay = 'Play'; + rsNext = 'Next'; + rsPrevious = 'Previous'; + rsMute = 'Mute'; + rsLoadPlaylist = 'Load playlist'; + rsSavePlaylist = 'Save playlist'; + rsMobilePlayer = 'Mobile player'; + rsClearPlaylist = 'Clear Playlist'; + rsRandomPlaylist = 'Random Playlist'; + rsDevices = 'Devices'; + rsDeviceInfo = 'Device info'; + rsScanPlayer = 'Scan player'; + rsSync = 'Sync'; + rsClearPlayer = 'Clear player'; + rsUndoSelectio = 'Undo selection'; + rsAudioCD = 'Audio CD'; + rsRipEncode = 'Rip / Encode...'; + rsHelp = 'Help'; + rsAbout = 'About...'; + rsManual = 'Manual...'; + rsClear = 'Clear'; + rsSearch = 'Search'; + rsAlbum = 'Album'; + rsFilename = 'Filename'; + rsArtist = 'Artist'; + rsTitle = 'Title'; + rsRandom = 'Random'; + rsNotConnected = 'Device not Connected'; + rsOK = 'OK'; + rsLenght = 'Length'; + rsTrack = 'Track'; -Type +type TCactusFlags = (cfTrayIconPressed, cfProgHide); { TMain } - TMain = Class(TForm) + TMain = class(TForm) ApplicationProperties1: TApplicationProperties; ArtistTree: TTreeView; artistsearch: TEdit; @@ -254,211 +244,209 @@ Type TrayIcon: TTrayIcon; Volumebar: TProgressBar; procedure ApplicationProperties1Minimize(Sender: TObject); - Procedure ArtistTreeClick(Sender: TObject); - Procedure ArtistTreeDblClick(Sender: TObject); - Procedure ArtistTreeEndDrag(Sender, Target: TObject; X, Y: Integer); - Procedure ArtistTreeKeyUp(Sender: TObject; Var Key: Word; Shift: TShiftState - ); - Procedure ArtistTreeMouseDown(Sender: TOBject; Button: TMouseButton; - Shift: TShiftState; X, Y: Integer); - Procedure ArtistTreeSelectionChanged(Sender: TObject); - Procedure ArtistTreeStartDrag(Sender: TObject; Var DragObject: TDragObject); - Procedure Button1Click(Sender: TObject); + procedure ArtistTreeClick(Sender: TObject); + procedure ArtistTreeDblClick(Sender: TObject); + procedure ArtistTreeEndDrag(Sender, Target: TObject; X, Y: integer); + procedure ArtistTreeKeyUp(Sender: TObject; var Key: word; Shift: TShiftState); + procedure ArtistTreeMouseDown(Sender: TObject; Button: TMouseButton; + Shift: TShiftState; X, Y: integer); + procedure ArtistTreeSelectionChanged(Sender: TObject); + procedure ArtistTreeStartDrag(Sender: TObject; var DragObject: TDragObject); + procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); - Procedure CoverImageMouseUp(Sender: TObject; Button: TMouseButton; - Shift: TShiftState; X, Y: Integer); - Procedure DeviceModeBtnClick(Sender: TObject); + procedure CoverImageMouseUp(Sender: TObject; Button: TMouseButton; + Shift: TShiftState; X, Y: integer); + procedure DeviceModeBtnClick(Sender: TObject); procedure FormCloseQuery(Sender: TObject; var CanClose: boolean); - Procedure FormMouseDown(Sender: TOBject; Button: TMouseButton; - Shift: TShiftState; X, Y: Integer); + procedure FormMouseDown(Sender: TObject; Button: TMouseButton; + Shift: TShiftState; X, Y: integer); procedure itemTrayExitClick(Sender: TObject); procedure itemTrayPlayClick(Sender: TObject); - Procedure LibModeBtnClick(Sender: TObject); - Procedure MenuItem15Click(Sender: TObject); - Procedure MenuItem25Click(Sender: TObject); + procedure LibModeBtnClick(Sender: TObject); + procedure MenuItem15Click(Sender: TObject); + procedure MenuItem25Click(Sender: TObject); procedure MIrandom_playlistClick(Sender: TObject); procedure MIViewAlbumClick(Sender: TObject); procedure MIViewArtistClick(Sender: TObject); - Procedure MenuItem32Click(Sender: TObject); - Procedure MenuItem6Click(Sender: TObject); - Procedure MenuItem7Click(Sender: TObject); - Procedure MenuItem9Click(Sender: TObject); + procedure MenuItem32Click(Sender: TObject); + procedure MenuItem6Click(Sender: TObject); + procedure MenuItem7Click(Sender: TObject); + procedure MenuItem9Click(Sender: TObject); procedure MIDeviceInfoClick(Sender: TObject); - Procedure MIremoveRadioClick(Sender: TObject); + procedure MIremoveRadioClick(Sender: TObject); procedure MIRipAudioClick(Sender: TObject); procedure MIViewFilenameClick(Sender: TObject); procedure MIViewGenreClick(Sender: TObject); procedure MIViewTitleClick(Sender: TObject); procedure MIViewTrackClick(Sender: TObject); procedure mnuCleanLibClick(Sender: TObject); - Procedure NetModeBtnClick(Sender: TObject); - Procedure NextButtonImgClick(Sender: TObject); - Procedure NextButtonImgMouseDown(Sender: TOBject; Button: TMouseButton; - Shift: TShiftState; X, Y: Integer); - Procedure NextButtonImgMouseEnter(Sender: TObject); - Procedure NextButtonImgMouseLeave(Sender: TObject); - Procedure NextButtonImgMouseUp(Sender: TOBject; Button: TMouseButton; - Shift: TShiftState; X, Y: Integer); - Procedure PlaylistCustomDrawItem(Sender: TCustomListView; Item: TListItem; - State: TCustomDrawState; Var DefaultDraw: Boolean); + procedure NetModeBtnClick(Sender: TObject); + procedure NextButtonImgClick(Sender: TObject); + procedure NextButtonImgMouseDown(Sender: TObject; Button: TMouseButton; + Shift: TShiftState; X, Y: integer); + procedure NextButtonImgMouseEnter(Sender: TObject); + procedure NextButtonImgMouseLeave(Sender: TObject); + procedure NextButtonImgMouseUp(Sender: TObject; Button: TMouseButton; + Shift: TShiftState; X, Y: integer); + procedure PlaylistCustomDrawItem(Sender: TCustomListView; + Item: TListItem; State: TCustomDrawState; + var DefaultDraw: boolean); procedure pnlPlaytimeClick(Sender: TObject); procedure PopupMenuTrayPopup(Sender: TObject); procedure randomcheckChange(Sender: TObject); - Procedure SearchPanelClick(Sender: TObject); - Procedure PlayerControlsPanelClick(Sender: TObject); - Procedure PauseButtonImgClick(Sender: TObject); - Procedure PauseButtonImgMouseDown(Sender: TOBject; Button: TMouseButton; - Shift: TShiftState; X, Y: Integer); - Procedure PauseButtonImgMouseEnter(Sender: TObject); - Procedure PauseButtonImgMouseLeave(Sender: TObject); - Procedure PauseButtonImgMouseUp(Sender: TOBject; Button: TMouseButton; - Shift: TShiftState; X, Y: Integer); - Procedure PlayButtonImgClick(Sender: TObject); - Procedure PlayButtonImgMouseDown(Sender: TOBject; Button: TMouseButton; - Shift: TShiftState; X, Y: Integer); - Procedure PlayButtonImgMouseEnter(Sender: TObject); - Procedure PlayButtonImgMouseLeave(Sender: TObject); - Procedure PlayButtonImgMouseUp(Sender: TOBject; Button: TMouseButton; - Shift: TShiftState; X, Y: Integer); - Procedure MainClose(Sender: TObject; Var CloseAction: TCloseAction); - Procedure MainCreate(Sender: TObject); - Procedure MenuItem11Click(Sender: TObject); - Procedure MenuItem14Click(Sender: TObject); - Procedure MenuItem16Click(Sender: TObject); - Procedure MenuItem20Click(Sender: TObject); - Procedure MenuItem26Click(Sender: TObject); - Procedure MenuItem27Click(Sender: TObject); - Procedure MenuItem2Click(Sender: TObject); - Procedure MenuItem37Click(Sender: TObject); - Procedure MenuItem43Click(Sender: TObject); - Procedure Panel1Click(Sender: TObject); - Procedure Panel1Resize(Sender: TObject); - Procedure Panel4Click(Sender: TObject); - Procedure ArtistSrchFieldClick(Sender: TObject); - Procedure PreviousButtonImgClick(Sender: TObject); - Procedure PreviousButtonImgMouseDown(Sender: TOBject; Button: TMouseButton; - Shift: TShiftState; X, Y: Integer); - Procedure PreviousButtonImgMouseEnter(Sender: TObject); - Procedure PreviousButtonImgMouseLeave(Sender: TObject); - Procedure PreviousButtonImgMouseUp(Sender: TOBject; Button: TMouseButton; - Shift: TShiftState; X, Y: Integer); - Procedure SettingsItemClick(Sender: TObject); - Procedure SimpleIPCServer1Message(Sender: TObject); + procedure SearchPanelClick(Sender: TObject); + procedure PlayerControlsPanelClick(Sender: TObject); + procedure PauseButtonImgClick(Sender: TObject); + procedure PauseButtonImgMouseDown(Sender: TObject; Button: TMouseButton; + Shift: TShiftState; X, Y: integer); + procedure PauseButtonImgMouseEnter(Sender: TObject); + procedure PauseButtonImgMouseLeave(Sender: TObject); + procedure PauseButtonImgMouseUp(Sender: TObject; Button: TMouseButton; + Shift: TShiftState; X, Y: integer); + procedure PlayButtonImgClick(Sender: TObject); + procedure PlayButtonImgMouseDown(Sender: TObject; Button: TMouseButton; + Shift: TShiftState; X, Y: integer); + procedure PlayButtonImgMouseEnter(Sender: TObject); + procedure PlayButtonImgMouseLeave(Sender: TObject); + procedure PlayButtonImgMouseUp(Sender: TObject; Button: TMouseButton; + Shift: TShiftState; X, Y: integer); + procedure MainClose(Sender: TObject; var CloseAction: TCloseAction); + procedure MainCreate(Sender: TObject); + procedure MenuItem11Click(Sender: TObject); + procedure MenuItem14Click(Sender: TObject); + procedure MenuItem16Click(Sender: TObject); + procedure MenuItem20Click(Sender: TObject); + procedure MenuItem26Click(Sender: TObject); + procedure MenuItem27Click(Sender: TObject); + procedure MenuItem2Click(Sender: TObject); + procedure MenuItem37Click(Sender: TObject); + procedure MenuItem43Click(Sender: TObject); + procedure Panel1Click(Sender: TObject); + procedure Panel1Resize(Sender: TObject); + procedure Panel4Click(Sender: TObject); + procedure ArtistSrchFieldClick(Sender: TObject); + procedure PreviousButtonImgClick(Sender: TObject); + procedure PreviousButtonImgMouseDown(Sender: TObject; Button: TMouseButton; + Shift: TShiftState; X, Y: integer); + procedure PreviousButtonImgMouseEnter(Sender: TObject); + procedure PreviousButtonImgMouseLeave(Sender: TObject); + procedure PreviousButtonImgMouseUp(Sender: TObject; Button: TMouseButton; + Shift: TShiftState; X, Y: integer); + procedure SettingsItemClick(Sender: TObject); + procedure SimpleIPCServer1Message(Sender: TObject); procedure skinmenuClick(Sender: TObject); - Procedure SpeedButton1Click(Sender: TObject); + procedure SpeedButton1Click(Sender: TObject); - Procedure Splitter1Moved(Sender: TObject); - Procedure SrchAlbumItemClick(Sender: TObject); - Procedure SrchArtItemClick(Sender: TObject); - Procedure SrchFileItemClick(Sender: TObject); - Procedure SrchTitleItemClick(Sender: TObject); - Procedure StopButtonImgClick(Sender: TObject); - Procedure StopButtonImgMouseDown(Sender: TOBject; Button: TMouseButton; - Shift: TShiftState; X, Y: Integer); - Procedure StopButtonImgMouseEnter(Sender: TObject); - Procedure StopButtonImgMouseLeave(Sender: TObject); - Procedure StopButtonImgMouseUp(Sender: TOBject; Button: TMouseButton; - Shift: TShiftState; X, Y: Integer); + procedure Splitter1Moved(Sender: TObject); + procedure SrchAlbumItemClick(Sender: TObject); + procedure SrchArtItemClick(Sender: TObject); + procedure SrchFileItemClick(Sender: TObject); + procedure SrchTitleItemClick(Sender: TObject); + procedure StopButtonImgClick(Sender: TObject); + procedure StopButtonImgMouseDown(Sender: TObject; Button: TMouseButton; + Shift: TShiftState; X, Y: integer); + procedure StopButtonImgMouseEnter(Sender: TObject); + procedure StopButtonImgMouseLeave(Sender: TObject); + procedure StopButtonImgMouseUp(Sender: TObject; Button: TMouseButton; + Shift: TShiftState; X, Y: integer); procedure TestPlugin1(Sender: TObject); - Procedure TitleTreeClick(Sender: TObject); - Procedure TitleTreeColumnClick(Sender: TObject; Column: TListColumn); - Procedure TitleTreeDragOver(Sender, Source: TObject; X, Y: Integer; - State: TDragState; Var Accept: Boolean); - Procedure TitleTreeEndDrag(Sender, Target: TObject; X, Y: Integer); - Procedure TitleTreeMouseDown(Sender: TOBject; Button: TMouseButton; - Shift: TShiftState; X, Y: Integer); - Procedure TitleTreeSelectItem(Sender: TObject; Item: TListItem; - Selected: Boolean); - Procedure TitleTreeStartDrag(Sender: TObject; Var DragObject: TDragObject); - Procedure TrackInfoClick(Sender: TObject); - Procedure artisttreemenuPopup(Sender: TObject); - Procedure checkmobileTimer(Sender: TObject); - Procedure clearPlayerItemClick(Sender: TObject); - Procedure clear_listClick(Sender: TObject); - Procedure filetypeboxChange(Sender: TObject); - Procedure libinfoClick(Sender: TObject); - Procedure muteClick(Sender: TObject); - Procedure opendirClick(Sender: TObject); - Procedure openfileClick(Sender: TObject); - Procedure pauseClick(Sender: TObject); - Procedure player_libClick(Sender: TObject); - Procedure playlistClick(Sender: TObject); - Procedure playlistDblClick(Sender: TObject); - Procedure playlistDragDrop(Sender, Source: TObject; X, Y: Integer); - Procedure playlistDragOver(Sender, Source: TObject; X, Y: Integer; - State: TDragState; Var Accept: Boolean); - Procedure playlistEndDrag(Sender, Target: TObject; X, Y: Integer); - Procedure playlistKeyDown(Sender: TObject; Var Key: Word; Shift: TShiftState - ); - Procedure playlistKeyUp(Sender: TObject; Var Key: Word; Shift: TShiftState); - Procedure playlistMouseDown(Sender: TOBject; Button: TMouseButton; - Shift: TShiftState; X, Y: Integer); - Procedure playlistSelectItem(Sender: TObject; Item: TListItem; - Selected: Boolean); - Procedure playlistStartDrag(Sender: TObject; Var DragObject: TDragObject); - Procedure playtimerStartTimer(Sender: TObject); - Procedure prevClick(Sender: TObject); - Procedure EditID3itemClick(Sender: TObject); - Procedure MenuItem30Click(Sender: TObject); - Procedure MenuItem33Click(Sender: TObject); - Procedure rm_artist_playeritemClick(Sender: TObject); - Procedure searchstrClick(Sender: TObject); - Procedure syncplayeritem(Sender: TObject); - Procedure MenuItem3Click(Sender: TObject); - Procedure MenuItem22aClick(Sender: TObject); - Procedure Menuitem10Click(Sender: TObject); - Procedure RemoveClick(Sender: TObject); - Procedure QuitItemClick(Sender: TObject); - Procedure TitleTreeDblClick(Sender: TObject); - Procedure loadlibClick(Sender: TObject); - Procedure newlibClick(Sender: TObject); - Procedure nextClick(Sender: TObject); - Procedure playClick(Sender: TObject); - Procedure playtimerTimer(Sender: TObject); - Procedure removeselectClick(Sender: TObject); - Procedure save_listClick(Sender: TObject); - Procedure savelibClick(Sender: TObject); - Procedure scanplayeritemClick(Sender: TObject); - Procedure searchstrKeyUp(Sender: TObject; Var Key: Word; Shift: TShiftState - ); - Procedure srch_buttonClick(Sender: TObject); - Procedure stopClick(Sender: TObject); - Procedure titlelistmenuPopup(Sender: TObject); - Procedure toggle_playpause(Sender: TObject); - Procedure trackbarMouseDown(Sender: TOBject; Button: TMouseButton; - Shift: TShiftState; X, Y: Integer); - Procedure trackbarMouseUp(Sender: TOBject; Button: TMouseButton; - Shift: TShiftState; X, Y: Integer); + procedure TitleTreeClick(Sender: TObject); + procedure TitleTreeColumnClick(Sender: TObject; Column: TListColumn); + procedure TitleTreeDragOver(Sender, Source: TObject; X, Y: integer; + State: TDragState; var Accept: boolean); + procedure TitleTreeEndDrag(Sender, Target: TObject; X, Y: integer); + procedure TitleTreeMouseDown(Sender: TObject; Button: TMouseButton; + Shift: TShiftState; X, Y: integer); + procedure TitleTreeSelectItem(Sender: TObject; Item: TListItem; + Selected: boolean); + procedure TitleTreeStartDrag(Sender: TObject; var DragObject: TDragObject); + procedure TrackInfoClick(Sender: TObject); + procedure artisttreemenuPopup(Sender: TObject); + procedure checkmobileTimer(Sender: TObject); + procedure clearPlayerItemClick(Sender: TObject); + procedure clear_listClick(Sender: TObject); + procedure filetypeboxChange(Sender: TObject); + procedure libinfoClick(Sender: TObject); + procedure muteClick(Sender: TObject); + procedure opendirClick(Sender: TObject); + procedure openfileClick(Sender: TObject); + procedure pauseClick(Sender: TObject); + procedure player_libClick(Sender: TObject); + procedure playlistClick(Sender: TObject); + procedure playlistDblClick(Sender: TObject); + procedure playlistDragDrop(Sender, Source: TObject; X, Y: integer); + procedure playlistDragOver(Sender, Source: TObject; X, Y: integer; + State: TDragState; var Accept: boolean); + procedure playlistEndDrag(Sender, Target: TObject; X, Y: integer); + procedure playlistKeyDown(Sender: TObject; var Key: word; Shift: TShiftState); + procedure playlistKeyUp(Sender: TObject; var Key: word; Shift: TShiftState); + procedure playlistMouseDown(Sender: TObject; Button: TMouseButton; + Shift: TShiftState; X, Y: integer); + procedure playlistSelectItem(Sender: TObject; Item: TListItem; + Selected: boolean); + procedure playlistStartDrag(Sender: TObject; var DragObject: TDragObject); + procedure playtimerStartTimer(Sender: TObject); + procedure prevClick(Sender: TObject); + procedure EditID3itemClick(Sender: TObject); + procedure MenuItem30Click(Sender: TObject); + procedure MenuItem33Click(Sender: TObject); + procedure rm_artist_playeritemClick(Sender: TObject); + procedure searchstrClick(Sender: TObject); + procedure syncplayeritem(Sender: TObject); + procedure MenuItem3Click(Sender: TObject); + procedure MenuItem22aClick(Sender: TObject); + procedure Menuitem10Click(Sender: TObject); + procedure RemoveClick(Sender: TObject); + procedure QuitItemClick(Sender: TObject); + procedure TitleTreeDblClick(Sender: TObject); + procedure loadlibClick(Sender: TObject); + procedure newlibClick(Sender: TObject); + procedure nextClick(Sender: TObject); + procedure playClick(Sender: TObject); + procedure playtimerTimer(Sender: TObject); + procedure removeselectClick(Sender: TObject); + procedure save_listClick(Sender: TObject); + procedure savelibClick(Sender: TObject); + procedure scanplayeritemClick(Sender: TObject); + procedure searchstrKeyUp(Sender: TObject; var Key: word; Shift: TShiftState); + procedure srch_buttonClick(Sender: TObject); + procedure stopClick(Sender: TObject); + procedure titlelistmenuPopup(Sender: TObject); + procedure toggle_playpause(Sender: TObject); + procedure trackbarMouseDown(Sender: TObject; Button: TMouseButton; + Shift: TShiftState; X, Y: integer); + procedure trackbarMouseUp(Sender: TObject; Button: TMouseButton; + Shift: TShiftState; X, Y: integer); procedure TrayIconClick(Sender: TObject); - Procedure undoSyncItemClick(Sender: TObject); + procedure undoSyncItemClick(Sender: TObject); - Procedure loadskin(Sender: TObject); - Procedure update_player_hdd_relations; - Procedure VolumebarMouseUp(Sender: TObject; Button: TMouseButton; - Shift: TShiftState; X, Y: Integer); - Private - { private declarations } + procedure loadskin(Sender: TObject); + procedure update_player_hdd_relations; + procedure VolumebarMouseUp(Sender: TObject; Button: TMouseButton; + Shift: TShiftState; X, Y: integer); + private + { private declarations } ctrl_pressed, SplitterResize: boolean; oldSplitterWidth, LoopCount: integer; sourceitem: TListItem; - CoverFound, title_drag, playlist_drag, artist_drag: Boolean; + CoverFound, title_drag, playlist_drag, artist_drag: boolean; DeviceMode, NetworkMode, LibraryMode: boolean; LastFMAPI: TLastfmAPIObject; - ScanSyncCount: Integer; + ScanSyncCount: integer; FileOpneDialogPath: string; bPnlPlaytimeNegated: boolean; - oldWindowState :TWindowState; - fromTrayDBLClick :Boolean; + oldWindowState: TWindowState; + fromTrayDBLClick: boolean; FFlags: set of TCactusFlags; - Procedure MoveNode(TargetNode, SourceNode : TTreeNode); - Procedure ApplicationIdle(Sender: TObject; Var Done: Boolean); - Procedure update_player_display; - Function LoadFile(path: String): boolean; + procedure MoveNode(TargetNode, SourceNode: TTreeNode); + procedure ApplicationIdle(Sender: TObject; var Done: boolean); + procedure update_player_display; + function LoadFile(path: string): boolean; procedure MinimizeMe(Data: Ptrint); - Public + public player_connected, playermode: boolean; playpos: integer; playnode: TTreeNode; @@ -468,170 +456,177 @@ Type tempbitmap, timetmpbmp: TBitmap; player_freespace, player_totalspace: longint; - skinmenuitems: array[1..16] Of TMenuItem; + skinmenuitems: array[1..16] of TMenuItem; - TestPluginI :TCJ_MenuItem; + TestPluginI: TCJ_MenuItem; - Procedure update_playlist; - Procedure disconnectDAP; - Function connectDAP: byte; - Procedure ScanSyncronize(dir:String); - Procedure update_artist_view; + procedure update_playlist; + procedure disconnectDAP; + function connectDAP: byte; + procedure ScanSyncronize(dir: string); + procedure update_artist_view; { public declarations } //Test Plugins....cut in future - procedure SayHello(Sender :TCJ_MenuItem); - function SayMsgHello(var Message: TMessage):Boolean; - function SayMsgHello2(var Message: TMessage):Boolean; + procedure SayHello(Sender: TCJ_MenuItem); + function SayMsgHello(var Message: TMessage): boolean; + function SayMsgHello2(var Message: TMessage): boolean; - End; + end; -Type +type - { TScanThread } + { TScanThread } - TScanThread = Class(TThread) - Private - Procedure ShowStatus; - Protected - Procedure Execute; - override; - Public - fStatus : byte; + TScanThread = class(TThread) + private + procedure ShowStatus; + protected + procedure Execute; + override; + public + fStatus: byte; tmpcollection: TMediaCollectionClass; PTargetCollection: TMediaCollectionClass; - Constructor Create(Suspd : boolean); - End; + constructor Create(Suspd: boolean); + end; - { TScanThread } +{ TScanThread } -Type +type - { TSyncThread } + { TSyncThread } TSyncAction = (SCopy, SDelete); - TSyncThread = Class(TThread) - Private - Procedure SyncStatus; - Protected + TSyncThread = class(TThread) + private + procedure SyncStatus; + protected CopyList, TargetList, DeleteList: TStringList; - DeletedCnt, DeleteTotal, CopyTotal, CopiedCnt: Integer; + DeletedCnt, DeleteTotal, CopyTotal, CopiedCnt: integer; OpSuccess, finished: boolean; SAction: TSyncAction; TargetCollection: TMediaCollectionClass; - Procedure Execute; - override; - Public - Target: String; - Constructor Create(Suspd : boolean); + procedure Execute; + override; + public + Target: string; + constructor Create(Suspd: boolean); destructor Destroy; - override; - Procedure CopyFile( fromFile, toFile: String); - Procedure DeleteFile( path: String); - End; + override; + procedure CopyFile(fromFile, toFile: string); + procedure DeleteFile(path: string); + end; - { TSyncThread } +{ TSyncThread } -Var +var Main: TMain; SyncThread: TSyncThread; ScanThread: TscanThread; - //procedure update_title_view_album; -Procedure update_title_view; -Procedure artist_to_playlist; -Procedure artist_to_playlist_at(index: integer); -Procedure title_to_playlist_at(index: integer); -Procedure title_to_playlist; +//procedure update_title_view_album; +procedure update_title_view; +procedure artist_to_playlist; +procedure artist_to_playlist_at(index: integer); +procedure title_to_playlist_at(index: integer); +procedure title_to_playlist; -Implementation +implementation -Uses editid3, status, settings, player, directories, skin, cdrip, translations, bigcoverimg, -streamcol, addradio, CleanLibrary, global_vars, cj_pluginslist, cj_interfaces_impl, LCLType; +uses editid3, status, settings, player, directories, skin, cdrip, + translations, bigcoverimg, + streamcol, addradio, CleanLibrary, global_vars, cj_pluginslist, + cj_interfaces_impl, LCLType; {$R *.lfm} {$i cactus_const.inc} -Var sizediff: int64; +var + sizediff: int64; { TSyncThread } -Procedure TSyncThread.SyncStatus; -Begin - If finished=false Then - Begin - If SAction=SCopy Then Main.StatusBar1.Panels[1].Text := IntToStr(CopiedCnt)+' of '+IntToStr( - CopyTotal)+ - ' copied. Don''t Disconnect...'; - If SAction=SDelete Then Main.StatusBar1.Panels[1].Text := IntToStr(DeletedCnt)+' of '+IntToStr - (DeleteTotal)+ - ' deleted. Don''t Disconnect...'; - End - Else - Begin - writeln('finished'); - TargetCollection.SaveToFile; - TargetCollection.Free; - main.connectDAP; - Main.StatusBar1.Panels[1].Text := 'Synchronizing finished. Device Ready...'; - End; -End; +procedure TSyncThread.SyncStatus; +begin + if finished = False then + begin + if SAction = SCopy then + Main.StatusBar1.Panels[1].Text := + IntToStr(CopiedCnt) + ' of ' + IntToStr( + CopyTotal) + + ' copied. Don''t Disconnect...'; + if SAction = SDelete then + Main.StatusBar1.Panels[1].Text := + IntToStr(DeletedCnt) + ' of ' + IntToStr + (DeleteTotal) + + ' deleted. Don''t Disconnect...'; + end + else + begin + writeln('finished'); + TargetCollection.SaveToFile; + TargetCollection.Free; + main.connectDAP; + Main.StatusBar1.Panels[1].Text := 'Synchronizing finished. Device Ready...'; + end; +end; -Procedure TSyncThread.Execute; -Begin - finished := false; +procedure TSyncThread.Execute; +begin + finished := False; DeleteTotal := DeleteList.Count; CopyTotal := CopyList.Count; DeletedCnt := 0; CopiedCnt := 0; - TargetCollection := TMediaCollectionClass.create; + TargetCollection := TMediaCollectionClass.Create; TargetCollection.PathFmt := FRelative; TargetCollection.LoadFromFile(Target); - While DeleteList.Count>0 Do - Begin - OpSuccess := false; - Try + while DeleteList.Count > 0 do + begin + OpSuccess := False; + try - sysutils.DeleteFile(self.DeleteList[0]); - If FileExists(self.DeleteList[0])=false Then - Begin - TargetCollection.remove(TargetCollection.getIndexByPath(self.DeleteList[0])); - End; - If DirectoryIsEmpty(ExtractFileDir(DeleteList[0])) Then - RemoveDir(ExtractFileDir(DeleteList[0])) - Except - End; - inc(DeletedCnt); - SAction := SDelete; - self.DeleteList.Delete(0); - Synchronize(@SyncStatus); - End; + SysUtils.DeleteFile(self.DeleteList[0]); + if FileExists(self.DeleteList[0]) = False then + begin + TargetCollection.remove(TargetCollection.getIndexByPath(self.DeleteList[0])); + end; + if DirectoryIsEmpty(ExtractFileDir(DeleteList[0])) then + RemoveDir(ExtractFileDir(DeleteList[0])) + except + end; + Inc(DeletedCnt); + SAction := SDelete; + self.DeleteList.Delete(0); + Synchronize(@SyncStatus); + end; DebugOutLn('copying files...', 6); - While CopyList.Count>0 Do - Begin - OpSuccess := false; - OpSuccess := FileCopy(CopyList[0],TargetList[0]); - inc(CopiedCnt); - SAction := SCopy; - TargetCollection.add(TargetList[0]); - CopyList.Delete(0); - TargetList.Delete(0); - Synchronize(@SyncStatus); - End; + while CopyList.Count > 0 do + begin + OpSuccess := False; + OpSuccess := FileCopy(CopyList[0], TargetList[0]); + Inc(CopiedCnt); + SAction := SCopy; + TargetCollection.add(TargetList[0]); + CopyList.Delete(0); + TargetList.Delete(0); + Synchronize(@SyncStatus); + end; - Finished := true; + Finished := True; Synchronize(@SyncStatus); -End; +end; constructor TSyncThread.Create(Suspd: boolean); -Begin +begin inherited Create(suspd); FreeOnTerminate := True; CopyList := TStringList.Create; @@ -639,28 +634,28 @@ Begin DeleteList := TStringList.Create; DeletedCnt := 0; CopiedCnt := 0; -End; +end; destructor TSyncThread.Destroy; -Begin +begin inherited Destroy; CopyList.Free; TargetList.Free; - DeleteList.free; -End; + DeleteList.Free; +end; -Procedure TSyncThread.CopyFile(fromFile, toFile: String); -Begin +procedure TSyncThread.CopyFile(fromFile, toFile: string); +begin CopyList.Add(fromFile); TargetList.Add(toFile); -End; +end; -Procedure TSyncThread.DeleteFile(path: String); -Begin +procedure TSyncThread.DeleteFile(path: string); +begin DeleteList.Add(path); -End; +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ @@ -669,64 +664,65 @@ End; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TScanThread.ShowStatus; -Begin - If fStatus=1 Then Main.StatusBar1.Panels[0].Text := 'Scanning folders in background...'; - If fStatus=0 Then - Begin - main.Enabled := false; - If MessageDlg('Some files on your harddisk seem to have changed.'+LineEnding+ - 'Adopt changes in Cactus library?', mtWarning, mbOKCancel, 0)= mrOK Then - Begin - writeln(1); - fstatus := 255; - writeln('assigning'); +procedure TScanThread.ShowStatus; +begin + if fStatus = 1 then + Main.StatusBar1.Panels[0].Text := 'Scanning folders in background...'; + if fStatus = 0 then + begin + main.Enabled := False; + if MessageDlg('Some files on your harddisk seem to have changed.' + LineEnding + + 'Adopt changes in Cactus library?', mtWarning, mbOKCancel, 0) = mrOk then + begin + writeln(1); + fstatus := 255; + writeln('assigning'); - // PTargetCollection^.Assign(tmpcollection); - writeln('saving'); - // PTargetCollection^.save_lib(PTargetCollection^.savepath); - Main.clear_listClick(Nil); + // PTargetCollection^.Assign(tmpcollection); + writeln('saving'); + // PTargetCollection^.save_lib(PTargetCollection^.savepath); + Main.clear_listClick(nil); - writeln('WARNING: if excption occurs, playlist has to be cleared here!'); - // Main.update_player_hdd_relations; - main.update_artist_view; - update_title_view; + writeln('WARNING: if excption occurs, playlist has to be cleared here!'); + // Main.update_player_hdd_relations; + main.update_artist_view; + update_title_view; - Main.StatusBar1.Panels[0].Text := ('Succesfully updated library...'); - tmpcollection.Free; - End; - main.Enabled := true; - End; - If (fstatus=0) Or (fstatus=128) Then - Begin - Main.StatusBar1.Panels[0].Text := 'Ready'; - writeln('fstatus 0, 126'); - Main.StatusBar1.Panels[1].Alignment := taRightJustify; + Main.StatusBar1.Panels[0].Text := ('Succesfully updated library...'); tmpcollection.Free; - End; + end; + main.Enabled := True; + end; + if (fstatus = 0) or (fstatus = 128) then + begin + Main.StatusBar1.Panels[0].Text := 'Ready'; + writeln('fstatus 0, 126'); + Main.StatusBar1.Panels[1].Alignment := taRightJustify; + tmpcollection.Free; + end; writeln('showStatus'); -End; +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TScanThread.Execute; -Begin +procedure TScanThread.Execute; +begin fStatus := 1; Synchronize(@ShowStatus); // fstatus:=tmpcollection.ScanForNew; Synchronize(@ShowStatus); -End; +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ constructor TScanThread.Create(Suspd: boolean); -Begin +begin inherited Create(suspd); FreeOnTerminate := True; - tmpcollection := TMediaCollectionClass.create; + tmpcollection := TMediaCollectionClass.Create; fStatus := 255; -End; +end; { // End TScanThread } @@ -742,627 +738,690 @@ End; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TMain.loadskin(Sender: TObject); -Begin +procedure TMain.loadskin(Sender: TObject); +begin DebugOutLn('loading skin', 2); - With (sender as TMenuitem) Do - Begin - SkinData.load_skin(caption); - CactusConfig.CurrentSkin := caption; - End; -End; + with (Sender as TMenuitem) do + begin + SkinData.load_skin(Caption); + CactusConfig.CurrentSkin := Caption; + end; +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TMain.update_player_hdd_relations; +procedure TMain.update_player_hdd_relations; -Var i, z: integer; -Begin - For i:= 0 To PlayerCol.itemcount-1 Do - Begin - z := 0; - PlayerCol.items[i].action := AONPLAYER; - While z < MediaCollection.ItemCount-1 Do - Begin - If MediaCollection.items[z].id=PlayerCol.items[i].id Then - Begin - MediaCollection.items[z].action := 1; - z := MediaCollection.ItemCount-1; - End; - inc(z); - End; - End; - Playercol.SaveToFile(CactusConfig.DAPPath+'cactuslib'); -End; +var + i, z: integer; +begin + for i := 0 to PlayerCol.itemcount - 1 do + begin + z := 0; + PlayerCol.items[i].action := AONPLAYER; + while z < MediaCollection.ItemCount - 1 do + begin + if MediaCollection.items[z].id = PlayerCol.items[i].id then + begin + MediaCollection.items[z].action := 1; + z := MediaCollection.ItemCount - 1; + end; + Inc(z); + end; + end; + Playercol.SaveToFile(CactusConfig.DAPPath + 'cactuslib'); +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TMain.VolumebarMouseUp(Sender: TObject; Button: TMouseButton; - Shift: TShiftState; X, Y: Integer); +procedure TMain.VolumebarMouseUp(Sender: TObject; Button: TMouseButton; + Shift: TShiftState; X, Y: integer); -Var newVolume: byte; -Begin - If y>Volumebar.Height Then y := Volumebar.Height; - If y<0 Then y := 0; +var + newVolume: byte; +begin + if y > Volumebar.Height then + y := Volumebar.Height; + if y < 0 then + y := 0; writeln(y); - newVolume := 100-((y*100) Div (Volumebar.Height)); + newVolume := 100 - ((y * 100) div (Volumebar.Height)); PlayerObj.set_volume(newVolume); Volumebar.Position := newVolume; - DebugOutLn('volume set '+ IntToStr(PlayerObj.volume), 3); -End; + DebugOutLn('volume set ' + IntToStr(PlayerObj.volume), 3); +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TMain.loadlibClick(Sender: TObject); +procedure TMain.loadlibClick(Sender: TObject); -Var OpenDialog: TOpenDialog; -Begin +var + OpenDialog: TOpenDialog; +begin OpenDialog := TOpenDialog.Create(self); OpenDialog.Filter := 'Mp3lib Library|*.mlb'; OpenDialog.InitialDir := CactusConfig.HomeDir; OpenDialog.FilterIndex := 1; - If Opendialog.execute=true Then MediaCollection.LoadFromFile(Opendialog.Filename); - OpenDialog.free; -End; + if Opendialog.Execute = True then + MediaCollection.LoadFromFile(Opendialog.Filename); + OpenDialog.Free; +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TMain.newlibClick(Sender: TObject); -Begin - Enabled := false; +procedure TMain.newlibClick(Sender: TObject); +begin + Enabled := False; Selectdirectorydialog1.initialdir := CactusConfig.HomeDir; Selectdirectorydialog1.title := 'Add Directory...'; - If Selectdirectorydialog1.execute=true Then - Begin - DebugOutLn('clear old collection', 7); - MediaCollection.clear; - DebugOutLn('lll', 7); + if Selectdirectorydialog1.Execute = True then + begin + DebugOutLn('clear old collection', 7); + MediaCollection.Clear; + DebugOutLn('lll', 7); + update_artist_view; + update_title_view; + Application.ProcessMessages; + MediaCollection.add_directory(Selectdirectorydialog1.Filename); + DebugOutLn('finished scan of ' + Selectdirectorydialog1.Filename, 2); + if MediaCollection.ItemCount > 0 then + begin + ArtistTree.Selected := nil; update_artist_view; update_title_view; - Application.ProcessMessages; - MediaCollection.add_directory(Selectdirectorydialog1.Filename); - DebugOutLn('finished scan of '+Selectdirectorydialog1.Filename, 2); - If MediaCollection.ItemCount>0 Then - Begin - ArtistTree.Selected := Nil; - update_artist_view; - update_title_view; - End; - End; - Enabled := true; -End; + end; + end; + Enabled := True; +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TMain.nextClick(Sender: TObject); +procedure TMain.nextClick(Sender: TObject); -Var oldindex, err, i: integer; -Begin - playtimer.Enabled := false; +var + oldindex, err, i: integer; +begin + playtimer.Enabled := False; oldindex := PlayerObj.CurrentTrack; - If randomcheck.Checked=false Then err := PlayerObj.next_track - Else err := PlayerObj.play(PlayerObj.Playlist.RandomIndex); - If err=0 Then - Begin - i := PlayerObj.CurrentTrack; - If i >= 0 Then - Begin - If oldindex>=0 Then playlist.Items[oldindex].ImageIndex := -1; - writeln(oldindex); - playlist.Items[i].ImageIndex := 0; - playlist.Items[i].MakeVisible(false); - playtimer.Enabled := true; - //CactusPlugins.SendEvent(evnStartPlay, PlayerObj.Playlist.Items[PlayerObj.CurrentTrack].artist+' - '+PlayerObj.Playlist.Items[PlayerObj.CurrentTrack].title); - End; - End - Else stopClick(Nil); + if randomcheck.Checked = False then + err := PlayerObj.next_track + else + err := PlayerObj.play(PlayerObj.Playlist.RandomIndex); + if err = 0 then + begin + i := PlayerObj.CurrentTrack; + if i >= 0 then + begin + if oldindex >= 0 then + playlist.Items[oldindex].ImageIndex := -1; + writeln(oldindex); + playlist.Items[i].ImageIndex := 0; + playlist.Items[i].MakeVisible(False); + playtimer.Enabled := True; + //CactusPlugins.SendEvent(evnStartPlay, PlayerObj.Playlist.Items[PlayerObj.CurrentTrack].artist+' - '+PlayerObj.Playlist.Items[PlayerObj.CurrentTrack].title); + end; + end + else + stopClick(nil); update_player_display; -End; +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TMain.prevClick(Sender: TObject); +procedure TMain.prevClick(Sender: TObject); -Var err: byte; +var + err: byte; i, OldTrack: integer; -Begin - playtimer.Enabled := false; +begin + playtimer.Enabled := False; OldTrack := PlayerObj.CurrentTrack; err := PlayerObj.prev_track; - If (err=0) Then - Begin - i := PlayerObj.CurrentTrack; - If playlist.Items.Count>1 Then - Begin - If OldTrack>=0 Then playlist.Items[OldTrack].ImageIndex := -1; - playlist.Items[i].ImageIndex := 0; - playlist.Items[i].MakeVisible(false); - //CactusPlugins.SendEvent(evnStartPlay, PlayerObj.Playlist.Items[PlayerObj.CurrentTrack].artist+' - '+PlayerObj.Playlist.Items[PlayerObj.CurrentTrack].title); - End; - playtimer.Enabled := true; - End - Else stopClick(Nil); + if (err = 0) then + begin + i := PlayerObj.CurrentTrack; + if playlist.Items.Count > 1 then + begin + if OldTrack >= 0 then + playlist.Items[OldTrack].ImageIndex := -1; + playlist.Items[i].ImageIndex := 0; + playlist.Items[i].MakeVisible(False); + //CactusPlugins.SendEvent(evnStartPlay, PlayerObj.Playlist.Items[PlayerObj.CurrentTrack].artist+' - '+PlayerObj.Playlist.Items[PlayerObj.CurrentTrack].title); + end; + playtimer.Enabled := True; + end + else + stopClick(nil); update_player_display; -End; +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TMain.playClick(Sender: TObject); +procedure TMain.playClick(Sender: TObject); -Var err: integer; -Begin - If (Not PlayerObj.paused) Then - Begin - playtimer.Enabled := false; - If (Playlist.items.count>0) And (Playlist.Selected=Nil)Then playitem := Playlist.Items[0] - Else playitem := playlist.selected; - If (PlayerObj.playing) And (PlayerObj.Playlist.Count>0) And (PlayerObj.CurrentTrack=0) - Then playlist.Items[PlayerObj.CurrentTrack].ImageIndex := -1;; - If playitem<>Nil Then - Begin - err := PlayerObj.play(playitem.Index); - If (err=0) Then - Begin - Playlist.BeginUpdate; - playitem.ImageIndex := 0; - Playlist.EndUpdate; - writeln(playitem.ImageIndex); - writeln(playitem.index); - playitem.MakeVisible(false); - update_player_display; - //CactusPlugins.SendEvent(evnStartPlay, PlayerObj.Playlist.Items[PlayerObj.CurrentTrack].artist+' - '+PlayerObj.Playlist.Items[PlayerObj.CurrentTrack].title); - playtimer.enabled := true; - End - Else - Begin - If (err=1) Then Showmessage( - 'File not Found! Goto Library/Rescan Directories for updating file links' - ); - If (err=2) Then Showmessage('Init of sound device failed.'+#10+#13+ - 'Perhaps sound ressource is blocked by another application...' - ); - End; - End; - End - Else - Begin - //if player paused - pauseClick(Nil); - End; -End; +var + err: integer; +begin + if (not PlayerObj.paused) then + begin + playtimer.Enabled := False; + if (Playlist.items.Count > 0) and (Playlist.Selected = nil) then + playitem := Playlist.Items[0] + else + playitem := playlist.selected; + if (PlayerObj.playing) and (PlayerObj.Playlist.Count > 0) and + (PlayerObj.CurrentTrack < PlayerObj.Playlist.Count) and (PlayerObj.CurrentTrack >= 0) + then + playlist.Items[PlayerObj.CurrentTrack].ImageIndex := -1; + ; + if playitem <> nil then + begin + err := PlayerObj.play(playitem.Index); + if (err = 0) then + begin + Playlist.BeginUpdate; + playitem.ImageIndex := 0; + Playlist.EndUpdate; + writeln(playitem.ImageIndex); + writeln(playitem.index); + playitem.MakeVisible(False); + update_player_display; + //CactusPlugins.SendEvent(evnStartPlay, PlayerObj.Playlist.Items[PlayerObj.CurrentTrack].artist+' - '+PlayerObj.Playlist.Items[PlayerObj.CurrentTrack].title); + playtimer.Enabled := True; + end + else + begin + if (err = 1) then + ShowMessage( + 'File not Found! Goto Library/Rescan Directories for updating file links' + ); + if (err = 2) then + ShowMessage('Init of sound device failed.' + #10 + #13 + + 'Perhaps sound ressource is blocked by another application...' + ); + end; + end; + end + else + begin + //if player paused + pauseClick(nil); + end; +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TMain.stopClick(Sender: TObject); -Begin - playtimer.Enabled:=false; - If (PlayerObj.CurrentTrack>=0) And (PlayerObj.CurrentTrack= 0) and + (PlayerObj.CurrentTrack < PlayerObj.Playlist.ItemCount) then + playlist.Items[PlayerObj.CurrentTrack].ImageIndex := -1; PlayerObj.stop; PlayerObj.playlist.reset_random; update_player_display; //CactusPlugins.SendEvent(evnStopPlay, ''); -End; +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TMain.playtimerTimer(Sender: TObject); +procedure TMain.playtimerTimer(Sender: TObject); -Var spos, slength: real; +var + spos, slength: real; r: real; x2: integer; tmppos: integer; fileobj: TMediaFileClass; -Begin - Try - // if PlayerObj.playing=false then stopClick(nil); - If PlayerObj.PlaybackMode=STREAMING_MODE Then - Begin - If PlayerObj.Get_Stream_Status=STREAM_READY Then - StatusBar1.Panels[0].Text := 'Stream Ready' - Else - StatusBar1.Panels[0].Text := 'Buffering Stream...'; - End; -// writeln('ontimer'); - If (PlayerObj.playing) And (PlayerObj.PlaybackMode=FILE_MODE) and (PlayerObj.paused=false) Then - Begin - // writeln('player playing'); +begin + try + // if PlayerObj.playing=false then stopClick(nil); + if PlayerObj.PlaybackMode = STREAMING_MODE then + begin + if PlayerObj.Get_Stream_Status = STREAM_READY then + StatusBar1.Panels[0].Text := 'Stream Ready' + else + StatusBar1.Panels[0].Text := 'Buffering Stream...'; + end; + // writeln('ontimer'); + if (PlayerObj.playing) and (PlayerObj.PlaybackMode = FILE_MODE) and + (PlayerObj.paused = False) then + begin + // writeln('player playing'); - if not bPnlPlaytimeNegated then - pnlPlaytime.Caption:= PlayerObj.get_timestr - else - pnlPlaytime.Caption:= PlayerObj.Get_TimeRemainingStr; - playwin.TimeImg.Picture.LoadFromFile(SkinData.Time.Img); - playwin.TimeImg.Canvas.Font.Color := ClNavy; - playwin.TimeImg.Canvas.TextOut(5,3, pnlPlaytime.Caption); + if not bPnlPlaytimeNegated then + pnlPlaytime.Caption := PlayerObj.get_timestr + else + pnlPlaytime.Caption := PlayerObj.Get_TimeRemainingStr; + playwin.TimeImg.Picture.LoadFromFile(SkinData.Time.Img); + playwin.TimeImg.Canvas.Font.Color := ClNavy; + playwin.TimeImg.Canvas.TextOut(5, 3, pnlPlaytime.Caption); - tmppos:= PlayerObj.Get_FilePosition; - trackbar.position:= tmppos; - // writeln(tmppos); - x2 := (trackbar.position*2)-3; - If x2<3 Then x2 := 3; - If (tmppos=100) then begin - // writeln('nexttrack'); - // WriteLn(PlayerObj.CurrentTrack); - if (PlayerObj.CurrentTrack=20) And (CoverFound=false) Then CoverImage.Picture.Clear; - End - Else {playtimer.Enabled:=false}; - Except + tmppos := PlayerObj.Get_FilePosition; + trackbar.position := tmppos; + // writeln(tmppos); + x2 := (trackbar.position * 2) - 3; + if x2 < 3 then + x2 := 3; + if (tmppos = 100) then + begin + // writeln('nexttrack'); + // WriteLn(PlayerObj.CurrentTrack); + if (PlayerObj.CurrentTrack < PlayerObj.Playlist.ItemCount) then + nextclick(nil) + else + stopClick(nil); + end; + if CactusConfig.CoverDownload and (CoverFound = False) and (LoopCount < 20) then + begin + Inc(LoopCount); + if (assigned(LastFMAPI)) and (LastFMAPI.data_ready) then + begin + fileobj := TMediaFileClass(playlist.Items[PlayerObj.CurrentTrack].Data); + if FileExists(fileobj.CoverPath) then + begin + try + CoverImage.Picture.LoadFromFile(fileobj.CoverPath); + playwin.AlbumCoverImg.Picture.LoadFromFile(fileobj.CoverPath); + except + DebugOutLn('EXCEPTION', 3); + end; + end; + CoverFound := True; + FreeAndNil(LastFMAPI); + end; + end + else if (LoopCount >= 20) and (CoverFound = False) then + CoverImage.Picture.Clear; + end + else + {playtimer.Enabled:=false}; + except DebugOutLn('CAUGHT EXCEPTION IN PLAYTIMER!!!!', 3); - End; + end; -End; +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TMain.removeselectClick(Sender: TObject); +procedure TMain.removeselectClick(Sender: TObject); -Var curartist, curalbum: string; +var + curartist, curalbum: string; album_mode: boolean; MediaFileObj: TMediaFileClass; MediaColObj: TMediaCollectionClass; z: integer; tsnode: TTreeNode; -Begin +begin tsnode := Main.ArtistTree.Selected; - If (tsnode<>Nil) And (tsnode.Level>0) Then - Begin - If MessageDlg('The selected file(s) will permanently be'+#10+#13+'removed from harddisk!'+#10+ - #13+' Proceed?', mtWarning, mbOKCancel, 0)=mrOK Then - Begin - If tsnode.level<2 Then album_mode := false - Else album_mode := true; - MediaFileObj := TMediaFileClass(tsnode.data); - MediaColObj := MediaFileObj.Collection; - curartist := lowercase(MediaFileObj.Artist); - curalbum := lowercase(MediaFileObj.album); + if (tsnode <> nil) and (tsnode.Level > 0) then + begin + if MessageDlg('The selected file(s) will permanently be' + #10 + + #13 + 'removed from harddisk!' + #10 + #13 + ' Proceed?', mtWarning, + mbOKCancel, 0) = mrOk then + begin + if tsnode.level < 2 then + album_mode := False + else + album_mode := True; + MediaFileObj := TMediaFileClass(tsnode.Data); + MediaColObj := MediaFileObj.Collection; + curartist := lowercase(MediaFileObj.Artist); + curalbum := lowercase(MediaFileObj.album); - z := MediaColObj.getTracks(curartist, MediaFileObj.index); - Repeat - Begin - If (album_mode=false) Or - ((album_mode=true) And (lowercase(MediaColObj.items[z].album)=curalbum)) Then - Begin - If DeleteFile(MediaColObj.items[z].path) Then - begin - DebugOutLn('deleted file from disk: '+MediaColObj.items[z].path, 2); - MediaColObj.remove(z); - end - else - DebugOutLn('ERROR deleting file: '+MediaColObj.items[z].path, 2); - End; - z := MediaColObj.getNext; - End; - Until (z=-1); - - update_artist_view; - update_title_view; - MediaColObj.SaveToFile; - End; - End; -End; + z := MediaColObj.getTracks(curartist, MediaFileObj.index); + repeat + begin + if (album_mode = False) or ((album_mode = True) and + (lowercase(MediaColObj.items[z].album) = curalbum)) then + begin + if DeleteFile(MediaColObj.items[z].path) then + begin + DebugOutLn('deleted file from disk: ' + MediaColObj.items[z].path, 2); + MediaColObj.remove(z); + end + else + DebugOutLn('ERROR deleting file: ' + MediaColObj.items[z].path, 2); + end; + z := MediaColObj.getNext; + end; + until (z = -1); + + update_artist_view; + update_title_view; + MediaColObj.SaveToFile; + end; + end; +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TMain.save_listClick(Sender: TObject); -Begin +procedure TMain.save_listClick(Sender: TObject); +begin SaveDialog1.Title := 'Save Playlist...'; saveDialog1.Filter := 'M3U Playlist|*.m3u'; saveDialog1.DefaultExt := 'm3u'; saveDialog1.FilterIndex := 1; SaveDialog1.InitialDir := CactusConfig.HomeDir; - If Savedialog1.execute=true Then - Begin - If FileExists(SaveDialog1.FileName) Then - If MessageDlg('File '+SaveDialog1.FileName+' alreday exists'+sLineBreak+sLineBreak+ - 'Overwrite?', mtWarning, mbOKCancel, 0)=mrCancel Then exit; - PlayerObj.playlist.SaveToFile(Savedialog1.Filename); - End; -End; + if Savedialog1.Execute = True then + begin + if FileExists(SaveDialog1.FileName) then + if MessageDlg('File ' + SaveDialog1.FileName + ' alreday exists' + + sLineBreak + sLineBreak + 'Overwrite?', mtWarning, mbOKCancel, 0) = mrCancel then + exit; + PlayerObj.playlist.SaveToFile(Savedialog1.Filename); + end; +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TMain.savelibClick(Sender: TObject); -Begin +procedure TMain.savelibClick(Sender: TObject); +begin SaveDialog1.Title := 'Save Library...'; saveDialog1.Filter := 'Cactus Media Library|*.cml'; saveDialog1.DefaultExt := 'cml'; saveDialog1.FilterIndex := 1; SaveDialog1.InitialDir := CactusConfig.HomeDir; - If Savedialog1.execute=true Then MediaCollection.SaveToFile(Savedialog1.Filename); -End; + if Savedialog1.Execute = True then + MediaCollection.SaveToFile(Savedialog1.Filename); +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TMain.scanplayeritemClick(Sender: TObject); +procedure TMain.scanplayeritemClick(Sender: TObject); -Var tmps: string; +var + tmps: string; ScanCol: TMediaCollectionClass; -Begin - If FileExists(CactusConfig.DAPPath)=false Then - Begin - ShowMessage(rsNotConnected); - exit; - End; +begin + if FileExists(CactusConfig.DAPPath) = False then + begin + ShowMessage(rsNotConnected); + exit; + end; - If FileExists(CactusConfig.DAPPath) Then - Begin - checkmobile.Enabled := false; - writeln('ooo'); - disconnectDAP; - writeln('aa'); - ScanCol := TMediaCollectionClass.create; - ScanCol.syncronize := @ScanSyncronize; - Enabled := false; - writeln('ll'); - ScanCol.PathFmt := FRelative; - ScanCol.savepath := CactusConfig.DAPPath+'cactuslib'; - writeln('dd'); - ScanCol.add_directory(CactusConfig.DAPPath); - ScanCol.SaveToFile; - ScanCol.Free; - Enabled := true; - connectDAP; - checkmobile.Enabled := true; - tmps := ByteToFmtString(FreeSpaceOnDAP, 3, 2); - StatusBar1.Panels[1].Text := 'Device connected '+tmps+' Free'; - End - Else DebugOutLn(CactusConfig.DAPPath+' does not exist', 2); -End; + if FileExists(CactusConfig.DAPPath) then + begin + checkmobile.Enabled := False; + writeln('ooo'); + disconnectDAP; + writeln('aa'); + ScanCol := TMediaCollectionClass.Create; + ScanCol.syncronize := @ScanSyncronize; + Enabled := False; + writeln('ll'); + ScanCol.PathFmt := FRelative; + ScanCol.savepath := CactusConfig.DAPPath + 'cactuslib'; + writeln('dd'); + ScanCol.add_directory(CactusConfig.DAPPath); + ScanCol.SaveToFile; + ScanCol.Free; + Enabled := True; + connectDAP; + checkmobile.Enabled := True; + tmps := ByteToFmtString(FreeSpaceOnDAP, 3, 2); + StatusBar1.Panels[1].Text := 'Device connected ' + tmps + ' Free'; + end + else + DebugOutLn(CactusConfig.DAPPath + ' does not exist', 2); +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TMain.searchstrKeyUp(Sender: TObject; Var Key: Word; - Shift: TShiftState); -Begin - If length(searchstr.Text)>1 Then srch_buttonClick(Nil) - Else TitleTree.Clear; -End; +procedure TMain.searchstrKeyUp(Sender: TObject; var Key: word; + Shift: TShiftState); +begin + if length(searchstr.Text) > 1 then + srch_buttonClick(nil) + else + TitleTree.Clear; +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TMain.srch_buttonClick(Sender: TObject); +procedure TMain.srch_buttonClick(Sender: TObject); -Var searchstring, ft: string; +var + searchstring, ft: string; found: boolean; Listitem: TListitem; i: integer; -Begin +begin TitleTree.Items.Clear; TitleTree.BeginUpdate; - artisttree.selected := Nil; - searchstring := lowercase(searchstr.text); - found := false; - For i:= 0 To MediaCollection.ItemCount-1 Do - Begin - If SrchTitleItem.checked Then If pos(searchstring,lowercase(MediaCollection.items[i].title))<>0 Then found := true; - If SrchArtItem.checked Then If pos(searchstring,lowercase(MediaCollection.items[i].Artist))<>0 Then found := true; - If SrchAlbumItem.checked Then If pos(searchstring,lowercase(MediaCollection.items[i].album))<>0 Then found := true; - If SrchFileItem.checked Then If pos(searchstring,lowercase(extractfilename(MediaCollection.items[i].path)))<>0 Then found := true; - If found Then - Begin - found := false; - ft := ''; - Case filetypebox.ItemIndex Of - 0: ft := 'all'; - 1: ft := '.flac'; - 2: ft := '.mp3'; - 3: ft := '.ogg'; - 4: ft := '.wav'; - End; - If (ft='all') Or (ft=MediaCollection.items[i].filetype) Then - Begin + artisttree.selected := nil; + searchstring := lowercase(searchstr.Text); + found := False; + for i := 0 to MediaCollection.ItemCount - 1 do + begin + if SrchTitleItem.Checked then + if pos(searchstring, lowercase(MediaCollection.items[i].title)) <> 0 then + found := True; + if SrchArtItem.Checked then + if pos(searchstring, lowercase(MediaCollection.items[i].Artist)) <> 0 then + found := True; + if SrchAlbumItem.Checked then + if pos(searchstring, lowercase(MediaCollection.items[i].album)) <> 0 then + found := True; + if SrchFileItem.Checked then + if pos(searchstring, lowercase(extractfilename(MediaCollection.items[i].path))) <> 0 then + found := True; + if found then + begin + found := False; + ft := ''; + case filetypebox.ItemIndex of + 0: ft := 'all'; + 1: ft := '.flac'; + 2: ft := '.mp3'; + 3: ft := '.ogg'; + 4: ft := '.wav'; + end; + if (ft = 'all') or (ft = MediaCollection.items[i].filetype) then + begin - ListItem := Main.Titletree.Items.Add; + ListItem := Main.Titletree.Items.Add; - listitem.data := MediaCollection.items[i]; - Listitem.ImageIndex := MediaCollection.items[i].action; - Listitem.caption := ''; + listitem.Data := MediaCollection.items[i]; + Listitem.ImageIndex := MediaCollection.items[i].action; + Listitem.Caption := ''; - If MediaCollection.items[i].title<>'' Then ListItem.SubItems.Add(MediaCollection.items - [i].Artist) - Else ListItem.SubItems.Add(SysToUTF8(extractfilename(MediaCollection.items[i].path))); - ListItem.SubItems.Add (MediaCollection.items[i].title); - ListItem.SubItems.Add (MediaCollection.items[i].album); - ListItem.SubItems.Add (MediaCollection.items[i].Track); - ListItem.SubItems.Add (MediaCollection.items[i].playtime); - End; - End; - End; + if MediaCollection.items[i].title <> '' then + ListItem.SubItems.Add(MediaCollection.items[i].Artist) + else + ListItem.SubItems.Add(SysToUTF8(extractfilename(MediaCollection.items[i].path))); + ListItem.SubItems.Add(MediaCollection.items[i].title); + ListItem.SubItems.Add(MediaCollection.items[i].album); + ListItem.SubItems.Add(MediaCollection.items[i].Track); + ListItem.SubItems.Add(MediaCollection.items[i].playtime); + end; + end; + end; TitleTree.EndUpdate; -End; +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TMain.EditID3itemClick(Sender: TObject); -Var tsitem: TListitem; -Begin +procedure TMain.EditID3itemClick(Sender: TObject); +var + tsitem: TListitem; +begin tsitem := TitleTree.Selected; - if tsitem<>nil then begin - editid3win.display_window(TMediaFileClass(tsitem.data)); - EditID3win.ShowModal; - end; -End; + if tsitem <> nil then + begin + editid3win.display_window(TMediaFileClass(tsitem.Data)); + EditID3win.ShowModal; + end; +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TMain.ArtistTreeSelectionChanged(Sender: TObject); -Begin - If Not NetworkMode Then update_title_view; -End; +procedure TMain.ArtistTreeSelectionChanged(Sender: TObject); +begin + if not NetworkMode then + update_title_view; +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TMain.ArtistTreeStartDrag(Sender: TObject; Var DragObject: TDragObject); -Begin - artist_drag := true; -End; +procedure TMain.ArtistTreeStartDrag(Sender: TObject; var DragObject: TDragObject); +begin + artist_drag := True; +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TMain.Button1Click(Sender: TObject); -Begin +procedure TMain.Button1Click(Sender: TObject); +begin TitleTree.Clear; -End; +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TMain.CoverImageMouseUp(Sender: TObject; Button: TMouseButton; - Shift: TShiftState; X, Y: Integer); -var medFileObj: TMediaFileClass; -Begin +procedure TMain.CoverImageMouseUp(Sender: TObject; Button: TMouseButton; + Shift: TShiftState; X, Y: integer); +var + medFileObj: TMediaFileClass; +begin //TODO: check why large cover image is linux only? - If PlayerObj.playing and (PlayerObj.PlaybackMode=FILE_MODE) and (PlayerObj.CurrentTrack>=0) Then - Begin + if PlayerObj.playing and (PlayerObj.PlaybackMode = FILE_MODE) and + (PlayerObj.CurrentTrack >= 0) then + begin - MedFileObj := TMediaFileClass(playlist.Items[PlayerObj.CurrentTrack].Data); - If (MedFileObj.CoverPath<>'') and FileExists(MedFileObj.CoverPath) then begin + MedFileObj := TMediaFileClass(playlist.Items[PlayerObj.CurrentTrack].Data); + if (MedFileObj.CoverPath <> '') and FileExists(MedFileObj.CoverPath) then + begin - BigCoverImgForm := TBigCoverImg.Create(self); - BigCoverImgForm.Caption := PlayerObj.Playlist.Items[PlayerObj.CurrentTrack].Album; + BigCoverImgForm := TBigCoverImg.Create(self); + BigCoverImgForm.Caption := + PlayerObj.Playlist.Items[PlayerObj.CurrentTrack].Album; - BigCoverImgForm.Image1.Picture.LoadFromFile(MedFileObj.CoverPath); - BigCoverImgForm.Width := BigCoverImgForm.Image1.Picture.Width+32; - BigCoverImgForm.Height := BigCoverImgForm.Image1.Picture.Height+32; + BigCoverImgForm.Image1.Picture.LoadFromFile(MedFileObj.CoverPath); + BigCoverImgForm.Width := BigCoverImgForm.Image1.Picture.Width + 32; + BigCoverImgForm.Height := BigCoverImgForm.Image1.Picture.Height + 32; - BigCoverImgForm.Image1.AutoSize := true; - BigCoverImgForm.BackImg.Width := BigCoverImgForm.Image1.Picture.Width+32; - BigCoverImgForm.BackImg.Height := BigCoverImgForm.Image1.Picture.Height+32; + BigCoverImgForm.Image1.AutoSize := True; + BigCoverImgForm.BackImg.Width := BigCoverImgForm.Image1.Picture.Width + 32; + BigCoverImgForm.BackImg.Height := BigCoverImgForm.Image1.Picture.Height + 32; - BigCoverImgForm.BackImg.Canvas.FillRect(0,0, BigCoverImgForm.Width, BigCoverImgForm.Height); + BigCoverImgForm.BackImg.Canvas.FillRect(0, 0, BigCoverImgForm.Width, + BigCoverImgForm.Height); - BigCoverImgForm.BackImg.Canvas.Rectangle(8, 8, BigCoverImgForm.Width-8, BigCoverImgForm.Height-8); + BigCoverImgForm.BackImg.Canvas.Rectangle(8, 8, BigCoverImgForm.Width - 8, + BigCoverImgForm.Height - 8); - BigCoverImgForm.Image1.Top := 16; - BigCoverImgForm.Image1.Left := 16; + BigCoverImgForm.Image1.Top := 16; + BigCoverImgForm.Image1.Left := 16; - BigCoverImgForm.Left := x+Panel1.Left+self.Left; - BigCoverImgForm.Top := y+Panel1.height+self.top- 220; + BigCoverImgForm.Left := x + Panel1.Left + self.Left; + BigCoverImgForm.Top := y + Panel1.Height + self.top - 220; {$ifdef win32 or win64} - BigCoverImgForm.Position:= poScreenCenter; + BigCoverImgForm.Position := poScreenCenter; {$endif} - BigCoverImgForm.BorderStyle := bsDialog; - BigCoverImgForm.ShowModal; + BigCoverImgForm.BorderStyle := bsDialog; + BigCoverImgForm.ShowModal; - end; - End; + end; + end; -End; +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TMain.DeviceModeBtnClick(Sender: TObject); -Begin - DeviceModeBtn.Down := true; - If Not DeviceMode Then - Begin - ArtistTree.Selected := Nil; - LibModeBtn.Down := false; - NetModeBtn.Down := false; - LibraryMode := false; - DeviceMode := true; - NetworkMode := false; - Playlist.Enabled := true; - TitleTree.Enabled := true; - trackbar.Enabled := true; - update_artist_view; - End; -End; +procedure TMain.DeviceModeBtnClick(Sender: TObject); +begin + DeviceModeBtn.Down := True; + if not DeviceMode then + begin + ArtistTree.Selected := nil; + LibModeBtn.Down := False; + NetModeBtn.Down := False; + LibraryMode := False; + DeviceMode := True; + NetworkMode := False; + Playlist.Enabled := True; + TitleTree.Enabled := True; + trackbar.Enabled := True; + update_artist_view; + end; +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TMain.FormMouseDown(Sender: TOBject; Button: TMouseButton; - Shift: TShiftState; X, Y: Integer); -Begin +procedure TMain.FormMouseDown(Sender: TObject; Button: TMouseButton; + Shift: TShiftState; X, Y: integer); +begin ArtistSrchField.hide; //unguenstig, wird bei jedem klick aufgerufen... :( -End; +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ procedure TMain.itemTrayExitClick(Sender: TObject); begin - Close; + Close; end; procedure TMain.itemTrayPlayClick(Sender: TObject); begin - if (PlayerObj.playing) - then pauseClick(nil) - else playClick(nil); + if (PlayerObj.playing) then + pauseClick(nil) + else + playClick(nil); end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TMain.LibModeBtnClick(Sender: TObject); -Begin - LibModeBtn.Down := true; - If Not LibraryMode Then - Begin - ArtistTree.Selected := Nil; - DeviceModeBtn.Down := false; - NetModeBtn.Down := false; - LibraryMode := true; - DeviceMode := false; - NetworkMode := false; - Playlist.Enabled := true; - TitleTree.Enabled := true; - trackbar.Enabled := true; - update_artist_view; - End; -End; +procedure TMain.LibModeBtnClick(Sender: TObject); +begin + LibModeBtn.Down := True; + if not LibraryMode then + begin + ArtistTree.Selected := nil; + DeviceModeBtn.Down := False; + NetModeBtn.Down := False; + LibraryMode := True; + DeviceMode := False; + NetworkMode := False; + Playlist.Enabled := True; + TitleTree.Enabled := True; + trackbar.Enabled := True; + update_artist_view; + end; +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TMain.MenuItem15Click(Sender: TObject); +procedure TMain.MenuItem15Click(Sender: TObject); -Var i: integer; -Begin +var + i: integer; +begin i := playlist.Items.Count; artist_to_playlist; - Playlist.Selected := Nil; - If playlist.Items.Count>0 Then playlist.Items[i].Selected := true; - playClick(Nil); + Playlist.Selected := nil; + if playlist.Items.Count > 0 then + playlist.Items[i].Selected := True; + playClick(nil); -End; +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TMain.MenuItem25Click(Sender: TObject); -Begin +procedure TMain.MenuItem25Click(Sender: TObject); +begin addRadioForm := TaddRadioForm.Create(self); addRadioForm.ShowModal; -End; +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ @@ -1376,118 +1435,125 @@ end; procedure TMain.MIViewArtistClick(Sender: TObject); begin MIViewArtist.Checked := not MIViewArtist.Checked; - CactusConfig.TLShowArtist:= MIViewArtist.Checked; + CactusConfig.TLShowArtist := MIViewArtist.Checked; TitleTree.Column[1].Visible := CactusConfig.TLShowArtist; end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TMain.MenuItem32Click(Sender: TObject); -Begin - If (ArtistTree.Selected<>Nil) And (ArtistTree.Selected.Level>0) Then - Begin - editid3win.display_window(TStreamInfoItemClass(ArtistTree.Selected.Data)); - EditID3win.ShowModal; - End; -End; +procedure TMain.MenuItem32Click(Sender: TObject); +begin + if (ArtistTree.Selected <> nil) and (ArtistTree.Selected.Level > 0) then + begin + editid3win.display_window(TStreamInfoItemClass(ArtistTree.Selected.Data)); + EditID3win.ShowModal; + end; +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TMain.MenuItem6Click(Sender: TObject); +procedure TMain.MenuItem6Click(Sender: TObject); -Var MedFileObj: TMediaFileClass; +var + MedFileObj: TMediaFileClass; MedColObj: TMediaCollectionClass; i: integer; -Begin - If TitleTree.Selected<>Nil Then - If MessageDlg('The selected file(s) will permanently be'+#10+#13+'removed from harddisk!'+#10+#13+' Proceed?', mtWarning, mbOKCancel, 0)=mrOK Then - Begin - MedFileObj := TMediaFileClass(TitleTree.Selected.Data); - MedColObj := MedFileObj.collection; - i := MedFileObj.index; +begin + if TitleTree.Selected <> nil then + if MessageDlg('The selected file(s) will permanently be' + #10 + #13 + + 'removed from harddisk!' + #10 + #13 + ' Proceed?', mtWarning, mbOKCancel, 0) = mrOk then + begin + MedFileObj := TMediaFileClass(TitleTree.Selected.Data); + MedColObj := MedFileObj.collection; + i := MedFileObj.index; - If DeleteFile(MedFileObj.path) Then - Begin - DebugOutLn('deleted file from disk: '+MedFileObj.path, 2); - MedColObj.remove(i); - End - Else - If FileGetAttr(MedFileObj.path)=faReadOnly Then - ShowMessage('File is read only!'); + if DeleteFile(MedFileObj.path) then + begin + DebugOutLn('deleted file from disk: ' + MedFileObj.path, 2); + MedColObj.remove(i); + end + else + if FileGetAttr(MedFileObj.path) = faReadOnly then + ShowMessage('File is read only!'); - update_artist_view; - update_title_view; - MedColObj.SaveToFile; - End; -End; + update_artist_view; + update_title_view; + MedColObj.SaveToFile; + end; +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TMain.MenuItem7Click(Sender: TObject); -Begin +procedure TMain.MenuItem7Click(Sender: TObject); +begin title_to_playlist; - Playlist.Items[Playlist.Items.Count-1].Focused := true; + Playlist.Items[Playlist.Items.Count - 1].Focused := True; {$ifdef win32} - Playlist.Items[Playlist.Items.Count-1].Selected := true;{$endif} - playClick(Nil); -End; + Playlist.Items[Playlist.Items.Count - 1].Selected := True; +{$endif} + playClick(nil); +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TMain.MenuItem9Click(Sender: TObject); -Begin - title_to_playlist_at(PlayerObj.CurrentTrack+1); -End; +procedure TMain.MenuItem9Click(Sender: TObject); +begin + title_to_playlist_at(PlayerObj.CurrentTrack + 1); +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ procedure TMain.MIDeviceInfoClick(Sender: TObject); -Var z: int64; +var + z: int64; s, tmps, used: string; i: integer; -Begin - If player_connected Then - Begin - z := 0; - For i:= 0 To PlayerCol.ItemCount-1 Do - z := z+PlayerCol.items[i].size; +begin + if player_connected then + begin + z := 0; + for i := 0 to PlayerCol.ItemCount - 1 do + z := z + PlayerCol.items[i].size; - used := ByteToFmtString(z, 4, 2); + used := ByteToFmtString(z, 4, 2); - tmps := ByteToFmtString(FreeSpaceOnDAP, 4 , 2); - str(PlayerCol.ItemCount-1, s); + tmps := ByteToFmtString(FreeSpaceOnDAP, 4, 2); + str(PlayerCol.ItemCount - 1, s); - ShowMessage(s+' Files on mobile player '+#10+used+' of music'+#10+'Free Disk Space: '+tmps) - ; - End - Else ShowMessage(rsNotConnected); + ShowMessage(s + ' Files on mobile player ' + #10 + used + ' of music' + #10 + + 'Free Disk Space: ' + tmps); + end + else + ShowMessage(rsNotConnected); end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TMain.MIremoveRadioClick(Sender: TObject); +procedure TMain.MIremoveRadioClick(Sender: TObject); -Var index: integer; -Begin - If (ArtistTree.Selected<>Nil) And (ArtistTree.Selected.Level>0) Then - Begin - index := StreamCollection.IndexOfObject(TStreamInfoItemClass(ArtistTree.Selected.Data)); - StreamCollection.Delete(index); - ArtistTree.Selected := Nil; - End; +var + index: integer; +begin + if (ArtistTree.Selected <> nil) and (ArtistTree.Selected.Level > 0) then + begin + index := StreamCollection.IndexOfObject(TStreamInfoItemClass( + ArtistTree.Selected.Data)); + StreamCollection.Delete(index); + ArtistTree.Selected := nil; + end; update_artist_view; -End; +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ procedure TMain.MIRipAudioClick(Sender: TObject); begin cdripwin := Tcdrip.Create(Application); - Enabled := false; + Enabled := False; cdripwin.ShowModal; cdripwin.Free; - Enabled := true; + Enabled := True; end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ @@ -1495,7 +1561,7 @@ end; procedure TMain.MIViewFilenameClick(Sender: TObject); begin MIViewFilename.Checked := not MIViewFilename.Checked; - CactusConfig.TLShowFilename:= MIViewFilename.Checked; + CactusConfig.TLShowFilename := MIViewFilename.Checked; TitleTree.Column[6].Visible := CactusConfig.TLShowFilename; end; @@ -1504,7 +1570,7 @@ end; procedure TMain.MIViewGenreClick(Sender: TObject); begin MIViewGenre.Checked := not MIViewGenre.Checked; - CactusConfig.TLShowGenre:=MIViewGenre.Checked; + CactusConfig.TLShowGenre := MIViewGenre.Checked; TitleTree.Column[5].Visible := CactusConfig.TLShowGenre; end; @@ -1513,7 +1579,7 @@ end; procedure TMain.MIViewTitleClick(Sender: TObject); begin MIViewTitle.Checked := not MIViewTitle.Checked; - CactusConfig.TLShowTitle:= MIViewTitle.Checked; + CactusConfig.TLShowTitle := MIViewTitle.Checked; TitleTree.Column[2].Visible := CactusConfig.TLShowTitle; end; @@ -1522,7 +1588,7 @@ end; procedure TMain.MIViewTrackClick(Sender: TObject); begin MIViewTrack.Checked := not MIViewTrack.Checked; - CactusConfig.TLShowTrack:= MIViewTrack.Checked; + CactusConfig.TLShowTrack := MIViewTrack.Checked; TitleTree.Column[4].Visible := CactusConfig.TLShowTrack; end; @@ -1531,88 +1597,88 @@ end; procedure TMain.mnuCleanLibClick(Sender: TObject); begin FrmCleanLibrary := TFrmCleanLibrary.Create(Application); - Enabled := false; + Enabled := False; FrmCleanLibrary.ShowModal; FrmCleanLibrary.Free; update_artist_view; update_title_view; - Enabled := true; + Enabled := True; end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TMain.NetModeBtnClick(Sender: TObject); -Begin - NetModeBtn.Down := true; - If Not NetworkMode Then - Begin - ArtistTree.Selected := Nil; - DeviceModeBtn.down := false; - LibModeBtn.down := false; - LibraryMode := false; - DeviceMode := false; - NetworkMode := true; - Playlist.Enabled := false; - TitleTree.Enabled := false; - trackbar.Enabled := false; - update_artist_view; - update_title_view; - End; -End; +procedure TMain.NetModeBtnClick(Sender: TObject); +begin + NetModeBtn.Down := True; + if not NetworkMode then + begin + ArtistTree.Selected := nil; + DeviceModeBtn.down := False; + LibModeBtn.down := False; + LibraryMode := False; + DeviceMode := False; + NetworkMode := True; + Playlist.Enabled := False; + TitleTree.Enabled := False; + trackbar.Enabled := False; + update_artist_view; + update_title_view; + end; +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TMain.NextButtonImgClick(Sender: TObject); -Begin - nextClick(Nil); -End; +procedure TMain.NextButtonImgClick(Sender: TObject); +begin + nextClick(nil); +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TMain.NextButtonImgMouseDown(Sender: TOBject; Button: TMouseButton; - Shift: TShiftState; X, Y: Integer); -Begin - NextButtonImg.Picture.LoadFromFile(SkinData.next.Clicked); +procedure TMain.NextButtonImgMouseDown(Sender: TObject; Button: TMouseButton; + Shift: TShiftState; X, Y: integer); +begin + NextButtonImg.Picture.LoadFromFile(SkinData.Next.Clicked); -End; +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TMain.NextButtonImgMouseEnter(Sender: TObject); -Begin - NextButtonImg.Picture.LoadFromFile(SkinData.next.MouseOver); -End; +procedure TMain.NextButtonImgMouseEnter(Sender: TObject); +begin + NextButtonImg.Picture.LoadFromFile(SkinData.Next.MouseOver); +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TMain.NextButtonImgMouseLeave(Sender: TObject); -Begin - NextButtonImg.Picture.LoadFromFile(SkinData.next.Img); -End; +procedure TMain.NextButtonImgMouseLeave(Sender: TObject); +begin + NextButtonImg.Picture.LoadFromFile(SkinData.Next.Img); +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TMain.NextButtonImgMouseUp(Sender: TOBject; Button: TMouseButton; - Shift: TShiftState; X, Y: Integer); -Begin - NextButtonImg.Picture.LoadFromFile(SkinData.next.MouseOver); -End; +procedure TMain.NextButtonImgMouseUp(Sender: TObject; Button: TMouseButton; + Shift: TShiftState; X, Y: integer); +begin + NextButtonImg.Picture.LoadFromFile(SkinData.Next.MouseOver); +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TMain.PlaylistCustomDrawItem(Sender: TCustomListView; - Item: TListItem; State: TCustomDrawState; Var DefaultDraw: - Boolean); -Begin +procedure TMain.PlaylistCustomDrawItem(Sender: TCustomListView; + Item: TListItem; State: TCustomDrawState; + var DefaultDraw: boolean); +begin // not working because font colors not implemented in Lazarus 0.9.23 - If (PlayerObj.Playlist.Items[Item.Index].Played) And (PlayerObj.CurrentTrack<>Item - .Index) Then + if (PlayerObj.Playlist.Items[Item.Index].Played) and + (PlayerObj.CurrentTrack <> Item.Index) then Sender.Canvas.Font.Color := clGrayText - Else + else Sender.Canvas.Font.Color := clWindowText; -End; +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ @@ -1623,15 +1689,16 @@ end; procedure TMain.PopupMenuTrayPopup(Sender: TObject); begin - if (PlayerObj.playing) and (not(PlayerObj.paused)) - then begin - itemTrayPlay.Caption:='Pause'; - itemTrayPlay.ImageIndex:=2; - end - else begin - itemTrayPlay.Caption:='Play'; - itemTrayPlay.ImageIndex:=1; - end; + if (PlayerObj.playing) and (not (PlayerObj.paused)) then + begin + itemTrayPlay.Caption := 'Pause'; + itemTrayPlay.ImageIndex := 2; + end + else + begin + itemTrayPlay.Caption := 'Play'; + itemTrayPlay.ImageIndex := 1; + end; end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ @@ -1643,202 +1710,213 @@ end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TMain.SearchPanelClick(Sender: TObject); -Begin +procedure TMain.SearchPanelClick(Sender: TObject); +begin ArtistSrchField.Hide; -End; +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TMain.PlayerControlsPanelClick(Sender: TObject); -Begin +procedure TMain.PlayerControlsPanelClick(Sender: TObject); +begin ArtistSrchField.hide; -End; +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TMain.PauseButtonImgClick(Sender: TObject); -Begin - pauseClick(Nil); -End; +procedure TMain.PauseButtonImgClick(Sender: TObject); +begin + pauseClick(nil); +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TMain.PauseButtonImgMouseDown(Sender: TOBject; Button: TMouseButton; - Shift: TShiftState; X, Y: Integer); -Begin +procedure TMain.PauseButtonImgMouseDown(Sender: TObject; Button: TMouseButton; + Shift: TShiftState; X, Y: integer); +begin pauseButtonImg.Picture.LoadFromFile(SkinData.pause.Clicked); -End; +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TMain.PauseButtonImgMouseEnter(Sender: TObject); -Begin +procedure TMain.PauseButtonImgMouseEnter(Sender: TObject); +begin pauseButtonImg.Picture.LoadFromFile(SkinData.pause.MouseOver); -End; +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TMain.PauseButtonImgMouseLeave(Sender: TObject); -Begin +procedure TMain.PauseButtonImgMouseLeave(Sender: TObject); +begin pauseButtonImg.Picture.LoadFromFile(SkinData.pause.Img); -End; +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TMain.PauseButtonImgMouseUp(Sender: TOBject; Button: TMouseButton; - Shift: TShiftState; X, Y: Integer); -Begin +procedure TMain.PauseButtonImgMouseUp(Sender: TObject; Button: TMouseButton; + Shift: TShiftState; X, Y: integer); +begin pauseButtonImg.Picture.LoadFromFile(SkinData.pause.MouseOver); -End; +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TMain.PlayButtonImgClick(Sender: TObject); -Begin - playclick(Nil); -End; +procedure TMain.PlayButtonImgClick(Sender: TObject); +begin + playclick(nil); +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TMain.PlayButtonImgMouseDown(Sender: TOBject; Button: TMouseButton; - Shift: TShiftState; X, Y: Integer); -Begin +procedure TMain.PlayButtonImgMouseDown(Sender: TObject; Button: TMouseButton; + Shift: TShiftState; X, Y: integer); +begin PlayButtonImg.Picture.LoadFromFile(SkinData.play.Clicked); -End; +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TMain.PlayButtonImgMouseEnter(Sender: TObject); -Begin +procedure TMain.PlayButtonImgMouseEnter(Sender: TObject); +begin PlayButtonImg.Picture.LoadFromFile(SkinData.play.MouseOver); -End; +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TMain.PlayButtonImgMouseLeave(Sender: TObject); -Begin +procedure TMain.PlayButtonImgMouseLeave(Sender: TObject); +begin PlayButtonImg.Picture.LoadFromFile(SkinData.play.Img); -End; +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TMain.PlayButtonImgMouseUp(Sender: TOBject; Button: TMouseButton; - Shift: TShiftState; X, Y: Integer); -Begin +procedure TMain.PlayButtonImgMouseUp(Sender: TObject; Button: TMouseButton; + Shift: TShiftState; X, Y: integer); +begin PlayButtonImg.Picture.LoadFromFile(SkinData.play.MouseOver); -End; +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TMain.MainClose(Sender: TObject; Var CloseAction: TCloseAction); -Begin +procedure TMain.MainClose(Sender: TObject; var CloseAction: TCloseAction); +begin PlayerObj.stop; -// if CactusConfig.PluginsEnabled then CactusPlugins.SendEvent(evnStopPlay, 'ps'); + // if CactusConfig.PluginsEnabled then CactusPlugins.SendEvent(evnStopPlay, 'ps'); CactusConfig.WHeight := Height; CactusConfig.WWidth := Width; CactusConfig.WSplitterWidth := Splitter1.Left; - CactusConfig.bDisplayPlayTimeNegated:= bPnlPlaytimeNegated; + CactusConfig.bDisplayPlayTimeNegated := bPnlPlaytimeNegated; - if CactusConfig.LoadLastPlaylist and (PlayerObj.Playlist.Count>0) then begin - if PlayerObj.Playlist.SaveToFile(CactusConfig.ConfigPrefix+'lib'+DirectorySeparator+'last.m3u')<>0 then - DebugOutLn('ERROR saving playlist', 2); - end else if PlayerObj.Playlist.Count=0 then DeleteFile(CactusConfig.ConfigPrefix+'lib'+DirectorySeparator+'last.m3u'); + if CactusConfig.LoadLastPlaylist and (PlayerObj.Playlist.Count > 0) then + begin + if PlayerObj.Playlist.SaveToFile(CactusConfig.ConfigPrefix + + 'lib' + DirectorySeparator + 'last.m3u') <> 0 then + DebugOutLn('ERROR saving playlist', 2); + end + else if PlayerObj.Playlist.Count = 0 then + DeleteFile(CactusConfig.ConfigPrefix + 'lib' + DirectorySeparator + 'last.m3u'); - If (MediaCollection.ItemCount>0) Then - Begin - MediaCollection.SaveToFile(CactusConfig.ConfigPrefix+'lib'+DirectorySeparator+'last.mlb'); - CactusConfig.LastLib := MediaCollection.savepath; - End; - If StreamCollection.Count>0 Then - Begin - StreamCollection.SaveToFile(CactusConfig.ConfigPrefix+'lib'+DirectorySeparator+'streams.col'); - CactusConfig.StreamColPath := CactusConfig.ConfigPrefix+'lib'+DirectorySeparator+'streams.col' - ; - End - Else - Begin - If Not DeleteFile(CactusConfig.ConfigPrefix+'lib'+DirectorySeparator+'streams.col') Then - DebugOutLn('Cannot delete streamcolelction savefile: '+CactusConfig.ConfigPrefix+'lib'+ - DirectorySeparator+'streams.col', 1); - End; + if (MediaCollection.ItemCount > 0) then + begin + MediaCollection.SaveToFile(CactusConfig.ConfigPrefix + 'lib' + + DirectorySeparator + 'last.mlb'); + CactusConfig.LastLib := MediaCollection.savepath; + end; + if StreamCollection.Count > 0 then + begin + StreamCollection.SaveToFile(CactusConfig.ConfigPrefix + 'lib' + + DirectorySeparator + 'streams.col'); + CactusConfig.StreamColPath := + CactusConfig.ConfigPrefix + 'lib' + DirectorySeparator + 'streams.col'; + end + else + begin + if not DeleteFile(CactusConfig.ConfigPrefix + 'lib' + DirectorySeparator + + 'streams.col') then + DebugOutLn('Cannot delete streamcolelction savefile: ' + + CactusConfig.ConfigPrefix + 'lib' + DirectorySeparator + 'streams.col', 1); + end; MediaCollection.Free; - PlayerCol.free; - checkmobile.Enabled := false; - playtimer.Enabled := false; + PlayerCol.Free; + checkmobile.Enabled := False; + playtimer.Enabled := False; - PlayerObj.free; + PlayerObj.Free; CoverImage.Free; - If playermode=false Then - Begin - playwin.close; - // playwin.Free; - End; - Try + if playermode = False then + begin + playwin.Close; + // playwin.Free; + end; + try SimpleIPCServer1.StopServer; - SimpleIPCServer1.free; - Except + SimpleIPCServer1.Free; + except DebugOutLn('ERROR: Exception while shutting down IPC server', 2); - End; + end; writeln('end.'); //CactusPlugins.FlushPluginConfig; //CactusPlugins.Free; - If CactusConfig.FlushConfig Then DebugOutLn('Config succesfully written to disk', 3) - Else DebugOutLn('ERROR: writing config to disk', 3); + if CactusConfig.FlushConfig then + DebugOutLn('Config succesfully written to disk', 3) + else + DebugOutLn('ERROR: writing config to disk', 3); CactusConfig.Free; Application.Terminate; -End; +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ procedure TMain.FormCloseQuery(Sender: TObject; var CanClose: boolean); begin - CanClose :=PluginsList.CanClose; - if CanClose then - begin - PluginsList.Free; - CJ_Interface.Free; - end; + CanClose := PluginsList.CanClose; + if CanClose then + begin + PluginsList.Free; + CJ_Interface.Free; + end; end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TMain.MainCreate(Sender: TObject); +procedure TMain.MainCreate(Sender: TObject); -Var tmps1: string; - MPlayerExeDialog: TSelectDirectoryDialog; - id: longint; - listitem: TListItem; -Begin +var + tmps1: string; + MPlayerExeDialog: TSelectDirectoryDialog; + id: longint; + listitem: TListItem; +begin DebugOutLn('## Main.onCreate ##', 3); - Caption := 'Cactus Jukebox '+CACTUS_VERSION; + Caption := 'Cactus Jukebox ' + CACTUS_VERSION; - LibraryMode := true; - DeviceMode := false; - NetworkMode := false; - LibModeBtn.Down := true; - DeviceModeBtn.Down := false; - NetModeBtn.Down := false; + LibraryMode := True; + DeviceMode := False; + NetworkMode := False; + LibModeBtn.Down := True; + DeviceModeBtn.Down := False; + NetModeBtn.Down := False; MediaCollection.syncronize := @ScanSyncronize; Width := CactusConfig.WWidth; Height := CactusConfig.WHeight; DebugOutLn('loading main form translations...', 5); - TranslateUnitResourceStrings('mainform', CactusConfig.DataPrefix+'languages'+DirectorySeparator+ - 'cactus.%s.po', CactusConfig.language, copy(CactusConfig.language, 0, - 2)); - If SystemCharSetIsUTF8 Then DebugOutLn('##System charset is UTF8', 3); + TranslateUnitResourceStrings('mainform', CactusConfig.DataPrefix + + 'languages' + DirectorySeparator + 'cactus.%s.po', + CactusConfig.language, copy(CactusConfig.language, 0, 2)); + if SystemCharSetIsUTF8 then + DebugOutLn('##System charset is UTF8', 3); // Load resourcestrings to Captions QuitItem.Caption := rsQuit; FileItem.Caption := rsFile; - openfile.Caption := rsOpenFile; + openfile.Caption := rsOpenFile; opendir.Caption := rsOpenDirector; player_lib.Caption := rsPlayerOnly; skinmenu.Caption := rsChooseSkin; @@ -1846,7 +1924,7 @@ Begin MIlibrary.Caption := rsLibrary; MInewlib.Caption := rsNewLibrary; - MIloadlib.Caption := rsLoadLibrary; + MIloadlib.Caption := rsLoadLibrary; MIsavelib.Caption := rsSaveLibrary; MIlibinfo.Caption := rsLibraryInfo; MIManagLib.Caption := rsManageLibrar; @@ -1861,7 +1939,7 @@ Begin MIclear_playlist.Caption := rsClearPlaylist; MIrandom_playlist.Caption := rsRandomPlaylist; - MIDevices.Caption:=rsDevices; + MIDevices.Caption := rsDevices; MIMobilePlayer.Caption := rsMobilePlayer; MIDeviceInfo.Caption := rsDeviceInfo; @@ -1899,85 +1977,106 @@ Begin TitleTree.Column[4].Visible := CactusConfig.TLShowTrack; TitleTree.Column[5].Visible := CactusConfig.TLShowGenre; TitleTree.Column[6].Visible := CactusConfig.TLShowFilename; - TitleTree.Column[7].Visible := true; + TitleTree.Column[7].Visible := True; - MIViewFilename.Checked:=CactusConfig.TLShowFilename; - MIViewGenre.Checked:=CactusConfig.TLShowGenre; - MIViewTrack.Checked:=CactusConfig.TLShowTrack; - MIViewAlbum.Checked:=CactusConfig.TLShowAlbum; - MIViewTitle.Checked:=CactusConfig.TLShowTitle; - MIViewArtist.Checked:=CactusConfig.TLShowArtist; + MIViewFilename.Checked := CactusConfig.TLShowFilename; + MIViewGenre.Checked := CactusConfig.TLShowGenre; + MIViewTrack.Checked := CactusConfig.TLShowTrack; + MIViewAlbum.Checked := CactusConfig.TLShowAlbum; + MIViewTitle.Checked := CactusConfig.TLShowTitle; + MIViewArtist.Checked := CactusConfig.TLShowArtist; oldSplitterWidth := CactusConfig.WSplitterWidth; bPnlPlaytimeNegated := CactusConfig.bDisplayPlayTimeNegated; - SplitterResize := true; - SrchTitleItem.checked := true; - SrchArtItem.checked := true; + SplitterResize := True; + SrchTitleItem.Checked := True; + SrchArtItem.Checked := True; {$ifdef CPU86} - if CactusConfig.AudioBackend=MPLAYERBACK then begin - PlayerObj:=TMPlayerClass.create; - DebugOutLn('MPlayer audio backend loaded', 2); - end - else begin + if CactusConfig.AudioBackend = MPLAYERBACK then + begin + PlayerObj := TMPlayerClass.Create; + DebugOutLn('MPlayer audio backend loaded', 2); + end + else + begin {$ifndef fmod} - DebugOutLn('WARNING: Cactus Jukebox has been compiled without fmod support. Trying to load mplayer backend instead', 0); - PlayerObj:=TMPlayerClass.create; - DebugOutLn('MPlayer audio backend loaded', 2); + DebugOutLn( + 'WARNING: Cactus Jukebox has been compiled without fmod support. Trying to load mplayer backend instead', + 0); + PlayerObj := TMPlayerClass.Create; + DebugOutLn('MPlayer audio backend loaded', 2); {$endif} {$ifdef fmod} - PlayerObj:=TFModPlayerClass.create; - DebugOutLn('FMOD audio backend loaded', 2); + PlayerObj := TFModPlayerClass.Create; + DebugOutLn('FMOD audio backend loaded', 2); {$endif} - end; + end; {$endif} -{$ifdef CPUX86_64} // Fmod library is only available on 32bit systems. Always try to load mplayer instead - if CactusConfig.AudioBackend=MPLAYERBACK then begin - PlayerObj:=TMPlayerClass.create; - DebugOutLn('MPlayer audio backend loaded', 2); - end - else begin - PlayerObj:=TMPlayerClass.create; - DebugOutLn('WARNING: Fmod backend not available on 64bit systems. Trying to load mplayer backend instead', 0); - end; +{$ifdef CPUX86_64}// Fmod library is only available on 32bit systems. Always try to load mplayer instead + if CactusConfig.AudioBackend = MPLAYERBACK then + begin + PlayerObj := TMPlayerClass.Create; + DebugOutLn('MPlayer audio backend loaded', 2); + end + else + begin + PlayerObj := TMPlayerClass.Create; + DebugOutLn( + 'WARNING: Fmod backend not available on 64bit systems. Trying to load mplayer backend instead', + 0); + end; {$endif} - if (PlayerObj is TMPlayerClass) then begin - (PlayerObj as TMPlayerClass).UseExternalConfig:=CactusConfig.MPlayerUseExternalConfig; - if FileExists(IncludeTrailingPathDelimiter(CactusConfig.DataPrefix)+'mplayer.cfg') then - (PlayerObj as TMPlayerClass).ExternalConfigFile:=IncludeTrailingPathDelimiter(CactusConfig.DataPrefix)+'mplayer.cfg'; - if FileExists(IncludeTrailingPathDelimiter(CactusConfig.ConfigPrefix)+'mplayer.cfg') then - (PlayerObj as TMPlayerClass).ExternalConfigFile:=IncludeTrailingPathDelimiter(CactusConfig.ConfigPrefix)+'mplayer.cfg'; + if (PlayerObj is TMPlayerClass) then + begin + (PlayerObj as TMPlayerClass).UseExternalConfig := + CactusConfig.MPlayerUseExternalConfig; + if FileExists(IncludeTrailingPathDelimiter(CactusConfig.DataPrefix) + + 'mplayer.cfg') then + (PlayerObj as TMPlayerClass).ExternalConfigFile := + IncludeTrailingPathDelimiter(CactusConfig.DataPrefix) + 'mplayer.cfg'; + if FileExists(IncludeTrailingPathDelimiter(CactusConfig.ConfigPrefix) + + 'mplayer.cfg') then + (PlayerObj as TMPlayerClass).ExternalConfigFile := + IncludeTrailingPathDelimiter(CactusConfig.ConfigPrefix) + 'mplayer.cfg'; end; - if (PlayerObj is TMPlayerClass) and ((PlayerObj as TMPlayerClass).MPlayerPath='') then begin - if CactusConfig.MPlayerPath='' then begin - ShowMessage('MPlayer executable not found! Please select MPlayer directory...'); - MPlayerExeDialog:=TSelectDirectoryDialog.Create(self); - MPlayerExeDialog.Title:='Locate mplayer executable...'; - if MPlayerExeDialog.Execute then begin - CactusConfig.MPlayerPath:=MPlayerExeDialog.FileName; - end; - end; - if (PlayerObj as TMPlayerClass).setMplayerBinaryDir(CactusConfig.MPlayerPath)=false then begin - ShowMessage('MPlayer executable not found in '+LineEnding+MPlayerExeDialog.FileName); - halt; - end; + if (PlayerObj is TMPlayerClass) and ((PlayerObj as TMPlayerClass).MPlayerPath = '') then + begin + if CactusConfig.MPlayerPath = '' then + begin + ShowMessage('MPlayer executable not found! Please select MPlayer directory...'); + MPlayerExeDialog := TSelectDirectoryDialog.Create(self); + MPlayerExeDialog.Title := 'Locate mplayer executable...'; + if MPlayerExeDialog.Execute then + begin + CactusConfig.MPlayerPath := MPlayerExeDialog.FileName; + end; end; + if (PlayerObj as TMPlayerClass).setMplayerBinaryDir( + CactusConfig.MPlayerPath) = False then + begin + ShowMessage('MPlayer executable not found in ' + LineEnding + + MPlayerExeDialog.FileName); + halt; + end; + end; - PlayerObj.OutputMode:=CactusConfig.AudioSystem; + PlayerObj.OutputMode := CactusConfig.AudioSystem; - player_connected := false; + player_connected := False; {$ifdef linux} - Try + try DebugOut('loading program icon... ', 2); - Icon.LoadFromFile(CactusConfig.DataPrefix+'icon'+DirectorySeparator+'cactus-icon.ico'); + Icon.LoadFromFile(CactusConfig.DataPrefix + 'icon' + DirectorySeparator + + 'cactus-icon.ico'); - // CoverImage.Picture.LoadFromFile(DataPrefix+'tools'+DirectorySeparator+'cactus-logo-small.png'); + // CoverImage.Picture.LoadFromFile(DataPrefix+'tools'+DirectorySeparator+'cactus-logo-small.png'); DebugOutLn('... loaded', 2); - Except + except DebugOutLn('ERROR loading bitmaps, files not found', 2); - End; + end; {$endif} @@ -1992,7 +2091,7 @@ Begin {$endif} {$ifdef LCLGtk2} - Main.Titletree.Columns[0].width := 20; + Main.Titletree.Columns[0].Width := 20; {$endif LCLGtk2} @@ -2001,184 +2100,203 @@ Begin {$ifdef unix} Application.OnIdle := @ApplicationIdle; {$endif} - SimpleIPCServer1.Global := true; + SimpleIPCServer1.Global := True; SimpleIPCServer1.StartServer; - checkmobile.Enabled := true; + checkmobile.Enabled := True; // unused ?? main.tempbitmap := TBitmap.Create; main.timetmpbmp := TBitmap.Create; - main.tempbitmap.width := 300; + main.tempbitmap.Width := 300; main.tempbitmap.Height := 150; // ------ - If FileExists(CactusConfig.LastLib) Then - Begin - //main.StatusBar1.Panels[0].Text:='Loading last library...'; - If Mediacollection.LoadFromFile(CactusConfig.LastLib)=false Then - Begin - //MediaCollection.clear; - ShowMessage('ERROR while reading last library. You need to create a new one.'+LineEnding+ - 'Please choose a directory to scan for mediafiles...'); - newlibClick(Nil); - TitleTree.Clear; - End; - End; - If FileExists(CactusConfig.StreamColPath) Then - Begin - If StreamCollection.LoadFromFile(CactusConfig.StreamColPath)=false Then - Begin - writeln('Error loading stream collection'); - End; - End; + if FileExists(CactusConfig.LastLib) then + begin + //main.StatusBar1.Panels[0].Text:='Loading last library...'; + if Mediacollection.LoadFromFile(CactusConfig.LastLib) = False then + begin + //MediaCollection.clear; + ShowMessage('ERROR while reading last library. You need to create a new one.' + + LineEnding + 'Please choose a directory to scan for mediafiles...'); + newlibClick(nil); + TitleTree.Clear; + end; + end; + if FileExists(CactusConfig.StreamColPath) then + begin + if StreamCollection.LoadFromFile(CactusConfig.StreamColPath) = False then + begin + writeln('Error loading stream collection'); + end; + end; - If CactusConfig.LoadLastPlaylist then begin - if FileExists(CactusConfig.ConfigPrefix+'lib'+DirectorySeparator+'last.m3u') then - Begin - if PlayerObj.Playlist.LoadFromFile(CactusConfig.ConfigPrefix+'lib'+DirectorySeparator+'last.m3u')<>0 then - DebugOutLn('ERROR loading last playlist',2); - For id:= 0 To PlayerObj.Playlist.Count-1 Do - Begin - ListItem := Playlist.Items.Add; - listitem.Data := TMediaFileClass.create(PlayerObj.Playlist.Items[id].path, Nil); - if (PlayerObj.Playlist.items[id].Artist<>'') or (PlayerObj.Playlist.items[id].Title<>'') then - ListItem.Caption := PlayerObj.Playlist.items[id].Artist+' - '+PlayerObj.Playlist.Items[id].Title - else - ListItem.Caption := ExtractFileName(PlayerObj.Playlist.items[id].Path); - End; - if Playlist.Items.Count>0 then Playlist.Selected:=Playlist.Items[0]; - end; + if CactusConfig.LoadLastPlaylist then + begin + if FileExists(CactusConfig.ConfigPrefix + 'lib' + DirectorySeparator + 'last.m3u') then + begin + if PlayerObj.Playlist.LoadFromFile( + CactusConfig.ConfigPrefix + 'lib' + DirectorySeparator + 'last.m3u') <> 0 then + DebugOutLn('ERROR loading last playlist', 2); + for id := 0 to PlayerObj.Playlist.Count - 1 do + begin + ListItem := Playlist.Items.Add; + listitem.Data := + TMediaFileClass.Create(PlayerObj.Playlist.Items[id].path, nil); + if (PlayerObj.Playlist.items[id].Artist <> '') or + (PlayerObj.Playlist.items[id].Title <> '') then + ListItem.Caption := + PlayerObj.Playlist.items[id].Artist + ' - ' + PlayerObj.Playlist.Items[id].Title + else + ListItem.Caption := + UTF8Encode(ExtractFileName(PlayerObj.Playlist.items[id].Path)); end; + if Playlist.Items.Count > 0 then + Playlist.Selected := Playlist.Items[0]; + end; + end; - If CactusConfig.AlbumCoverFirsttime Then - Begin - tmps1 := 'Cactus Jukebox can download album cover art from internet and show it on playback' - +LineEnding+'(No private data is submitted. Only album title and artist)' - +LineEnding+LineEnding+'Do you want to enable this feature?' - +LineEnding+LineEnding+'You can change this behaviour later in File->Settings'; + if CactusConfig.AlbumCoverFirsttime then + begin + tmps1 := + 'Cactus Jukebox can download album cover art from internet and show it on playback' + + LineEnding + '(No private data is submitted. Only album title and artist)' + + LineEnding + LineEnding + 'Do you want to enable this feature?' + + LineEnding + LineEnding + + 'You can change this behaviour later in File->Settings'; - If MessageDlg(tmps1, mtConfirmation , mbYesNo, 0)=mrYes Then CactusConfig.CoverDownload := - true - ; - End; + if MessageDlg(tmps1, mtConfirmation, mbYesNo, 0) = mrYes then + CactusConfig.CoverDownload := + True + ; + end; // Load file specified on commandline - If CactusConfig.LoadOnStart<>'' Then - Begin - LoadFile(CactusConfig.LoadOnStart); - End; + if CactusConfig.LoadOnStart <> '' then + begin + LoadFile(CactusConfig.LoadOnStart); + end; DebugOutLn('main.create end', 5); update_artist_view; //update_title_view; DebugOutLn('main.create end', 5); - Self.fromTrayDBLClick :=False; - oldWindowState :=Self.WindowState; + Self.fromTrayDBLClick := False; + oldWindowState := Self.WindowState; //Build of Interfaces and Plugins List (may be moved....) - MenuOwner :=Self; - CJ_Interface :=TCJ_Interface_Impl.Create; - global_vars.AppMainMenu :=Self.Mainmenu1; - global_vars.AppTrayIcon :=Self.TrayIcon; - global_vars.ImageListNormal :=Self.ImageListNormal; - PluginsList :=TCJ_PluginsList.Create; + MenuOwner := Self; + CJ_Interface := TCJ_Interface_Impl.Create; + global_vars.AppMainMenu := Self.Mainmenu1; + global_vars.AppTrayIcon := Self.TrayIcon; + global_vars.ImageListNormal := Self.ImageListNormal; + PluginsList := TCJ_PluginsList.Create; PluginsList.LoadFromINI; - Self.TrayIcon.Hint:='Cactus Juke Box...'; -End; + Self.TrayIcon.Hint := 'Cactus Juke Box...'; +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TMain.ApplicationIdle(Sender: TObject; Var Done: Boolean); +procedure TMain.ApplicationIdle(Sender: TObject; var Done: boolean); -Begin +begin {$ifdef linux} //linux doesn't recognize onIPCMessage Event. so we call it manually - If SimpleIPCServer1.PeekMessage(1,true) Then - Begin - //PeekMessage automaticly calls OnMessage event - DebugOutLn('IPC Messge received', 2); - End; + if SimpleIPCServer1.PeekMessage(1, True) then + begin + //PeekMessage automaticly calls OnMessage event + DebugOutLn('IPC Messge received', 2); + end; {$endif} -End; +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TMain.update_player_display; +procedure TMain.update_player_display; -Var +var i: integer; -Begin - If PlayerObj.playing Then - Begin - i := PlayerObj.CurrentTrack; - //MedFileObj:=playlist.Items[player.CurrentTrack].Data; +begin + if PlayerObj.playing then + begin + i := PlayerObj.CurrentTrack; + //MedFileObj:=playlist.Items[player.CurrentTrack].Data; - If PlayerObj.Playlist.items[i].Artist<>'' Then - current_title_edit.text := PlayerObj.Playlist.items[i].Artist - Else current_title_edit.text := ExtractFileName(PlayerObj.Playlist.items[i].path); - current_title_edit1.text := PlayerObj.Playlist.items[i].title; + if PlayerObj.Playlist.items[i].Artist <> '' then + current_title_edit.Text := PlayerObj.Playlist.items[i].Artist + else + current_title_edit.Text := ExtractFileName(PlayerObj.Playlist.items[i].path); + current_title_edit1.Text := PlayerObj.Playlist.items[i].title; - playwin.TitleImg.Picture.LoadFromFile(SkinData.Title.Img); - playwin.TitleImg.canvas.Font.Color := Clnavy; + playwin.TitleImg.Picture.LoadFromFile(SkinData.Title.Img); + playwin.TitleImg.canvas.Font.Color := Clnavy; - If PlayerObj.Playlist.items[i].Artist<>'' Then - playwin.TitleImg.canvas.textout(5,5,PlayerObj.Playlist.items[i].Artist) - Else playwin.TitleImg.canvas.textout(5,5,ExtractFileName(PlayerObj.Playlist.items[i].path)); - playwin.TitleImg.canvas.textout(5,25,PlayerObj.Playlist.items[i].title); - End - Else - Begin - //clear everything - playwin.TitleImg.canvas.Clear; - CoverImage.Picture.Clear; - playwin.TimeImg.Canvas.Clear; - current_title_edit.Text := ''; - current_title_edit1.Text := ''; - pnlPlaytime.Caption:= '00:00'; - trackbar.Position := 0; - End; -End; + if PlayerObj.Playlist.items[i].Artist <> '' then + playwin.TitleImg.canvas.textout(5, 5, PlayerObj.Playlist.items[i].Artist) + else + playwin.TitleImg.canvas.textout(5, 5, ExtractFileName(PlayerObj.Playlist.items[i].path)); + playwin.TitleImg.canvas.textout(5, 25, PlayerObj.Playlist.items[i].title); + end + else + begin + //clear everything + playwin.TitleImg.canvas.Clear; + CoverImage.Picture.Clear; + playwin.TimeImg.Canvas.Clear; + current_title_edit.Text := ''; + current_title_edit1.Text := ''; + pnlPlaytime.Caption := '00:00'; + trackbar.Position := 0; + end; +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Function TMain.LoadFile(path: String): boolean; +function TMain.LoadFile(path: string): boolean; -Var z: integer; aPath: string; +var + z: integer; + aPath: string; listitem: TListItem; -Begin +begin DebugOutLn('** Loadfile **', 2); Application.ProcessMessages; {$IFDEF WINDOWS} aPath := UTF8Decode(path); {$ENDIF} - If FileExists(aPath) Then - Begin - z := MediaCollection.GetIndexByPath(path); - DebugOutLn(z, 3); - If z<0 Then - Begin - z := MediaCollection.add(apath); - End; - PlayerObj.playlist.add(MediaCollection.items[z]); - ListItem := Playlist.Items.Add; - listitem.data := MediaCollection.items[z]; + if FileExists(aPath) then + begin + z := MediaCollection.GetIndexByPath(path); + DebugOutLn(z, 3); + if z < 0 then + begin + z := MediaCollection.add(apath); + end; + PlayerObj.playlist.add(MediaCollection.items[z]); + ListItem := Playlist.Items.Add; + listitem.Data := MediaCollection.items[z]; - If MediaCollection.items[z].title<>'' Then ListItem.Caption := MediaCollection.items[z].Artist - +' - '+MediaCollection.items[z] - .title - Else ListItem.Caption := extractfilename(MediaCollection.items[z].path); - playlist.Column[0].Caption := 'Playlist ('+IntToStr(PlayerObj. - playlist.ItemCount)+' Files/ '+PlayerObj.Playlist. - TotalPlayTimeStr +')'; - result := true; - update_artist_view; - update_title_view; - End - Else result := false; + if MediaCollection.items[z].title <> '' then + ListItem.Caption := MediaCollection.items[z].Artist + + + ' - ' + MediaCollection.items[z] + .title + else + ListItem.Caption := extractfilename(MediaCollection.items[z].path); + playlist.Column[0].Caption := + 'Playlist (' + IntToStr( + PlayerObj.playlist.ItemCount) + + ' Files/ ' + PlayerObj.Playlist.TotalPlayTimeStr + ')'; + Result := True; + update_artist_view; + update_title_view; + end + else + Result := False; Application.ProcessMessages; -End; +end; procedure TMain.MinimizeMe(Data: Ptrint); begin @@ -2189,648 +2307,701 @@ end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TMain.ScanSyncronize(dir: String); -Begin - inc(ScanSyncCount); +procedure TMain.ScanSyncronize(dir: string); +begin + Inc(ScanSyncCount); - If ScanSyncCount>=500 Then - Begin - update_artist_view; - ScanSyncCount := 0; - End; + if ScanSyncCount >= 500 then + begin + update_artist_view; + ScanSyncCount := 0; + end; - if (ScanSyncCount mod 50)= 0 then begin - StatusBar1.Panels[0].Text := 'scanning trough: '+dir; - Application.ProcessMessages; - end; -End; + if (ScanSyncCount mod 50) = 0 then + begin + StatusBar1.Panels[0].Text := 'scanning trough: ' + dir; + Application.ProcessMessages; + end; +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TMain.update_artist_view; +procedure TMain.update_artist_view; // TODO: rewrite method to reselect artist -Var curartist, curalbum: string; +var + curartist, curalbum: string; tsnode, artnode, TopNode: Ttreenode; AlbumList: TStringList; MedFileObj: TMediaFileClass; i, z: integer; restoreEnabled, album_selected: boolean; -Begin +begin - If Enabled Then restoreEnabled := true Else restoreEnabled := false; - Enabled := false; + if Enabled then + restoreEnabled := True + else + restoreEnabled := False; + Enabled := False; StatusBar1.Panels[0].Text := 'Please wait... updating...'; - ArtistTree.OnSelectionChanged:=nil; //Disable event while working on selection in artisttree!! + ArtistTree.OnSelectionChanged := nil; + //Disable event while working on selection in artisttree!! DebugOutLn('', 2); DebugOut('## update artist view... ', 2); tsnode := ArtistTree.Selected; - If (tsnode<>Nil) Then begin - if tsnode.Level=1 then begin - curartist := lowercase(tsnode.Text); - curalbum := ''; - album_selected:=false; - end; - if tsnode.Level=2 then begin - curartist := lowercase(tsnode.Parent.Text); - curalbum := lowercase(tsnode.Text); - // writeln(curalbum); - album_selected:=true; - end; - end - Else + if (tsnode <> nil) then + begin + if tsnode.Level = 1 then + begin + curartist := lowercase(tsnode.Text); + curalbum := ''; + album_selected := False; + end; + if tsnode.Level = 2 then + begin + curartist := lowercase(tsnode.Parent.Text); + curalbum := lowercase(tsnode.Text); + // writeln(curalbum); + album_selected := True; + end; + end + else curartist := ''; artisttree.beginupdate; DebugOut(' clear tree...', 2); ArtistTree.Items.Clear; - If NetworkMode Then - Begin + if NetworkMode then + begin - TopNode := ArtistTree.Items.Add(Nil, 'Webradio stations'); - TopNode.Data := pointer(1); - For i:=0 To StreamCollection.Count-1 Do - Begin - artnode := ArtistTree.Items.AddChild(TopNode, StreamCollection.Strings[i]); - With artnode Do - Begin - MakeVisible; - ImageIndex := -1; - SelectedIndex := -1; - Data := StreamCollection.Objects[i]; - End; - End; - End; + TopNode := ArtistTree.Items.Add(nil, 'Webradio stations'); + TopNode.Data := pointer(1); + for i := 0 to StreamCollection.Count - 1 do + begin + artnode := ArtistTree.Items.AddChild(TopNode, StreamCollection.Strings[i]); + with artnode do + begin + MakeVisible; + ImageIndex := -1; + SelectedIndex := -1; + Data := StreamCollection.Objects[i]; + end; + end; + end; // If library mode add Mediacollection - If LibraryMode And (MediaCollection.Count>0) Then - Begin - TopNode := Main.ArtistTree.Items.Add(Nil, rsLibrary); - TopNode.ImageIndex := 4; - TopNode.SelectedIndex := 4; - TopNode.data := pointer(1); + if LibraryMode and (MediaCollection.Count > 0) then + begin + TopNode := Main.ArtistTree.Items.Add(nil, rsLibrary); + TopNode.ImageIndex := 4; + TopNode.SelectedIndex := 4; + TopNode.Data := pointer(1); - i := MediaCollection.getArtists; - Repeat - Begin - If MediaCollection.Items[i].Artist<>'' Then artnode := Main.ArtistTree.Items.AddChild( - TopNode, MediaCollection.Items[i]. - Artist) - Else artnode := Main.ArtistTree.Items.AddChild(TopNode, 'Unknown'); - With artnode Do - Begin - MakeVisible; - ImageIndex := 6; //MediaCollection.Items[i].Action; - SelectedIndex := 6; //MediaCollection.Items[i].Action; - Data := MediaCollection.items[i]; - Expanded:=false; - End; - AlbumList := MediaCollection.getAlbums(MediaCollection.Items[i].Artist, i); - For z:=0 To AlbumList.Count-1 Do - Begin - // add albums to node of current SrchArtItem - With Main.ArtistTree.Items.Addchild(artnode, AlbumList[z]) Do - Begin - MakeVisible; - MedFileObj:=TMediaFileClass(AlbumList.Objects[z]); - ImageIndex := 7;//MedFileObj.Action; - SelectedIndex := 7;//MedFileObj.Action; - Data := AlbumList.Objects[z]; - End; - End; - artnode.Expanded := false; - i := MediaCollection.getNextArtist; - End; - Until i<0; - // finally free AlbumList - AlbumList.Free; - End; + i := MediaCollection.getArtists; + repeat + begin + if MediaCollection.Items[i].Artist <> '' then + artnode := Main.ArtistTree.Items.AddChild( + TopNode, + MediaCollection.Items[i]. + Artist) + else + artnode := Main.ArtistTree.Items.AddChild(TopNode, 'Unknown'); + with artnode do + begin + MakeVisible; + ImageIndex := 6; //MediaCollection.Items[i].Action; + SelectedIndex := 6; //MediaCollection.Items[i].Action; + Data := MediaCollection.items[i]; + Expanded := False; + end; + AlbumList := MediaCollection.getAlbums(MediaCollection.Items[i].Artist, i); + for z := 0 to AlbumList.Count - 1 do + begin + // add albums to node of current SrchArtItem + with Main.ArtistTree.Items.Addchild(artnode, AlbumList[z]) do + begin + MakeVisible; + MedFileObj := TMediaFileClass(AlbumList.Objects[z]); + ImageIndex := 7;//MedFileObj.Action; + SelectedIndex := 7;//MedFileObj.Action; + Data := AlbumList.Objects[z]; + end; + end; + artnode.Expanded := False; + i := MediaCollection.getNextArtist; + end; + until i < 0; + // finally free AlbumList + AlbumList.Free; + end; // If Device mode add playercollection and other devices - If DeviceMode And player_connected Then - Begin + if DeviceMode and player_connected then + begin - TopNode := Main.ArtistTree.Items.Add(Nil, rsMobileDevice); - TopNode.SelectedIndex := 1; - TopNode.ImageIndex := 1; - TopNode.data := pointer(0); + TopNode := Main.ArtistTree.Items.Add(nil, rsMobileDevice); + TopNode.SelectedIndex := 1; + TopNode.ImageIndex := 1; + TopNode.Data := pointer(0); - i := PlayerCol.getArtists; - Repeat - Begin - If PlayerCol.Items[i].Artist<>'' Then artnode := Main.ArtistTree.Items.AddChild(TopNode, - PlayerCol.Items[i].Artist) - Else artnode := Main.ArtistTree.Items.AddChild(TopNode, 'Unknown'); - With artnode Do - Begin - MakeVisible; - ImageIndex := PlayerCol.Items[i].Action; - SelectedIndex := PlayerCol.Items[i].Action; - Data := PlayerCol.items[i]; - End; - AlbumList := PlayerCol.getAlbums(PlayerCol.Items[i].Artist, i); - For z:=0 To AlbumList.Count-1 Do - Begin - // add albums to node of current SrchArtItem - With Main.ArtistTree.Items.Addchild(artnode, AlbumList[z]) Do - Begin - MakeVisible; - MedFileObj:=TMediaFileClass(AlbumList.Objects[z]); - ImageIndex := MedFileObj.Action; - SelectedIndex := MedFileObj.Action; - Data := AlbumList.Objects[z]; - End; - End; - artnode.Expanded := false; - i := PlayerCol.getNextArtist; - End; - Until i<0; - // finally free AlbumList - AlbumList.Free; - End; + i := PlayerCol.getArtists; + repeat + begin + if PlayerCol.Items[i].Artist <> '' then + artnode := Main.ArtistTree.Items.AddChild(TopNode, + PlayerCol.Items[i].Artist) + else + artnode := Main.ArtistTree.Items.AddChild(TopNode, 'Unknown'); + with artnode do + begin + MakeVisible; + ImageIndex := PlayerCol.Items[i].Action; + SelectedIndex := PlayerCol.Items[i].Action; + Data := PlayerCol.items[i]; + end; + AlbumList := PlayerCol.getAlbums(PlayerCol.Items[i].Artist, i); + for z := 0 to AlbumList.Count - 1 do + begin + // add albums to node of current SrchArtItem + with Main.ArtistTree.Items.Addchild(artnode, AlbumList[z]) do + begin + MakeVisible; + MedFileObj := TMediaFileClass(AlbumList.Objects[z]); + ImageIndex := MedFileObj.Action; + SelectedIndex := MedFileObj.Action; + Data := AlbumList.Objects[z]; + end; + end; + artnode.Expanded := False; + i := PlayerCol.getNextArtist; + end; + until i < 0; + // finally free AlbumList + AlbumList.Free; + end; ArtistTree.EndUpdate; DebugOut(' reselecting last item ', 2); // Reselect last selected item if possible i := 0; - If ArtistTree.Items.Count>0 Then ArtistTree.Selected := ArtistTree.Items[0]; - If ((curalbum<>'') or (curartist<>'')) And (ArtistTree.Items.Count>0) Then - Begin - Repeat //try to keep old album - Begin - MedFileObj := TMediaFileClass(ArtistTree.items[i].data); - inc(i); - End; - Until ((lowercase(artisttree.items[i].text)=curalbum) And (ArtistTree.Items[i].Level=2)) - Or (i>=artisttree.items.count-1); + if ArtistTree.Items.Count > 0 then + ArtistTree.Selected := ArtistTree.Items[0]; + if ((curalbum <> '') or (curartist <> '')) and (ArtistTree.Items.Count > 0) then + begin + repeat //try to keep old album + begin + MedFileObj := TMediaFileClass(ArtistTree.items[i].Data); + Inc(i); + end; + until ((lowercase(artisttree.items[i].Text) = curalbum) and + (ArtistTree.Items[i].Level = 2)) or (i >= artisttree.items.Count - 1); - If lowercase(artisttree.items[i].text)=curalbum Then - Begin - artisttree.selected := main.artisttree.items[i]; - End + if lowercase(artisttree.items[i].Text) = curalbum then + begin + artisttree.selected := main.artisttree.items[i]; + end - Else if (curartist<>'') And (ArtistTree.Items.Count>0) then - begin //Select artist if album not possible - i:=0; - Repeat - Begin - MedFileObj := TMediaFileClass(ArtistTree.items[i].data); - inc(i); - End; - Until ((lowercase(artisttree.items[i].text)=curartist) And (ArtistTree.Items[i].Level=1)) - Or (i>=artisttree.items.count-1); - writeln(curartist); - writeln(artisttree.items[i].text); - If lowercase(artisttree.items[i].text)=curartist Then - Begin - artisttree.selected := main.artisttree.items[i]; - End; - End; - - if ArtistTree.Selected.AbsoluteIndex '') and (ArtistTree.Items.Count > 0) then + begin //Select artist if album not possible + i := 0; + repeat begin - ArtistTree.Items[ArtistTree.Selected.AbsoluteIndex+9].MakeVisible; - if ArtistTree.Items[ArtistTree.Selected.AbsoluteIndex+9].Level>1 then - ArtistTree.Items[ArtistTree.Selected.AbsoluteIndex+9].Parent.Expanded:=false; - end - else begin - ArtistTree.Items[ArtistTree.Items.Count-1].MakeVisible; - if ArtistTree.Items[ArtistTree.Items.Count-1].Level>1 then - ArtistTree.Items[ArtistTree.Items.Count-1].Parent.Expanded:=false; + MedFileObj := TMediaFileClass(ArtistTree.items[i].Data); + Inc(i); end; - End; - ArtistTree.OnSelectionChanged:=@ArtistTreeSelectionChanged; //Reenable event!! + until ((lowercase(artisttree.items[i].Text) = curartist) and + (ArtistTree.Items[i].Level = 1)) or (i >= artisttree.items.Count - 1); + writeln(curartist); + writeln(artisttree.items[i].Text); + if lowercase(artisttree.items[i].Text) = curartist then + begin + artisttree.selected := main.artisttree.items[i]; + end; + end; + + if ArtistTree.Selected.AbsoluteIndex < ArtistTree.Items.Count - 10 then + begin + ArtistTree.Items[ArtistTree.Selected.AbsoluteIndex + 9].MakeVisible; + if ArtistTree.Items[ArtistTree.Selected.AbsoluteIndex + 9].Level > 1 then + ArtistTree.Items[ArtistTree.Selected.AbsoluteIndex + + 9].Parent.Expanded := False; + end + else + begin + ArtistTree.Items[ArtistTree.Items.Count - 1].MakeVisible; + if ArtistTree.Items[ArtistTree.Items.Count - 1].Level > 1 then + ArtistTree.Items[ArtistTree.Items.Count - 1].Parent.Expanded := False; + end; + end; + ArtistTree.OnSelectionChanged := @ArtistTreeSelectionChanged; //Reenable event!! DebugOutLn(' finished artistview ##', 2); StatusBar1.Panels[0].Text := 'Ready.'; Enabled := restoreEnabled; -End; +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TMain.MenuItem11Click(Sender: TObject); -Begin +procedure TMain.MenuItem11Click(Sender: TObject); +begin dirwin := Tdirwin.Create(Application); - Enabled := false; + Enabled := False; dirwin.ShowModal; dirwin.Free; - Enabled := true; -End; + Enabled := True; +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TMain.MenuItem14Click(Sender: TObject); +procedure TMain.MenuItem14Click(Sender: TObject); -Var tsitem: TListItem; - tmps : string; - MedFileObj: TMediaFileClass; - i: integer; -Begin - tsitem := TitleTree.Selected; - If (tsitem<>Nil) And player_connected Then - Begin - MedFileObj := TMediaFileClass(tsitem.data); - For i:= 1 To MediaCollection.ItemCount-1 Do - If MedFileObj.id=MediaCollection.items[i].id Then MediaCollection.items[i].action := AREMOVE - ; - - For i:= 1 To PlayerCol.ItemCount-1 Do - If MedFileObj.id=PlayerCol.items[i].id Then PlayerCol.items[i].action := AREMOVE; - update_artist_view; - update_title_view; - - tmps := ByteToFmtString(FreeSpaceOnDAP + sizediff, 3, 2); - - StatusBar1.Panels[1].Text := 'Device connected '+tmps+' Free'; - End; -End; - -//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - -Procedure TMain.MenuItem16Click(Sender: TObject); - -Var tsitem: TListItem; +var + tsitem: TListItem; tmps: string; MedFileObj: TMediaFileClass; -Begin + i: integer; +begin tsitem := TitleTree.Selected; - If (tsitem<>Nil) And player_connected Then - Begin - MedFileObj := TMediaFileClass(tsitem.data); - MedFileObj.action := AUPLOAD; + if (tsitem <> nil) and player_connected then + begin + MedFileObj := TMediaFileClass(tsitem.Data); + for i := 1 to MediaCollection.ItemCount - 1 do + if MedFileObj.id = MediaCollection.items[i].id then + MediaCollection.items[i].action := AREMOVE; - update_artist_view; - update_title_view; + for i := 1 to PlayerCol.ItemCount - 1 do + if MedFileObj.id = PlayerCol.items[i].id then + PlayerCol.items[i].action := AREMOVE; + update_artist_view; + update_title_view; - tmps := ByteToFmtString(FreeSpaceOnDAP + sizediff, 3, 2); - StatusBar1.Panels[1].Text := 'Device connected '+tmps+' Free'; - End; -End; + tmps := ByteToFmtString(FreeSpaceOnDAP + sizediff, 3, 2); + + StatusBar1.Panels[1].Text := 'Device connected ' + tmps + ' Free'; + end; +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TMain.MenuItem20Click(Sender: TObject); +procedure TMain.MenuItem16Click(Sender: TObject); -Var tsitem: TListItem; +var + tsitem: TListItem; + tmps: string; + MedFileObj: TMediaFileClass; +begin + tsitem := TitleTree.Selected; + if (tsitem <> nil) and player_connected then + begin + MedFileObj := TMediaFileClass(tsitem.Data); + MedFileObj.action := AUPLOAD; + + update_artist_view; + update_title_view; + + tmps := ByteToFmtString(FreeSpaceOnDAP + sizediff, 3, 2); + StatusBar1.Panels[1].Text := 'Device connected ' + tmps + ' Free'; + end; +end; + +//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +procedure TMain.MenuItem20Click(Sender: TObject); + +var + tsitem: TListItem; MedFileObj: TMediaFileClass; tmps: string; i: integer; -Begin +begin tsitem := TitleTree.Selected; - If tsitem<>Nil Then - Begin - MedFileObj := TMediaFileClass(tsitem.data); - If MedFileObj.action=AREMOVE Then - Begin - //PFobj^.action:=1; - sizediff := sizediff-MedFileObj.size; - For i:= 1 To MediaCollection.ItemCount-1 Do - If MedFileObj.id=MediaCollection.items[i].id Then MediaCollection.items[i].action := 1; + if tsitem <> nil then + begin + MedFileObj := TMediaFileClass(tsitem.Data); + if MedFileObj.action = AREMOVE then + begin + //PFobj^.action:=1; + sizediff := sizediff - MedFileObj.size; + for i := 1 to MediaCollection.ItemCount - 1 do + if MedFileObj.id = MediaCollection.items[i].id then + MediaCollection.items[i].action := 1; - For i:= 1 To PlayerCol.ItemCount-1 Do - If MedFileObj.id=PlayerCol.items[i].id Then PlayerCol.items[i].action := -1; - End - Else - Begin - MedFileObj.action := -1; - sizediff := sizediff+MedFileObj.size; - End; + for i := 1 to PlayerCol.ItemCount - 1 do + if MedFileObj.id = PlayerCol.items[i].id then + PlayerCol.items[i].action := -1; + end + else + begin + MedFileObj.action := -1; + sizediff := sizediff + MedFileObj.size; + end; - update_artist_view; - update_title_view; + update_artist_view; + update_title_view; - tmps := ByteToFmtString(FreeSpaceOnDAP + sizediff, 3, 2); - StatusBar1.Panels[1].Text := 'Device connected '+tmps+' Free'; - End; -End; + tmps := ByteToFmtString(FreeSpaceOnDAP + sizediff, 3, 2); + StatusBar1.Panels[1].Text := 'Device connected ' + tmps + ' Free'; + end; +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ //Random Paylist with 50 tracks by monta procedure TMain.MIrandom_playlistClick(Sender: TObject); - Var listitem: TListitem; +var + listitem: TListitem; MedFileObj: TMediaFileClass; i: integer; -Begin - if MediaCollection.Count < 2 then exit; +begin + if MediaCollection.Count < 2 then + exit; Randomize; i := 1; repeat MedFileObj := MediaCollection.Items[Random(MediaCollection.Count)]; PlayerObj.playlist.add(MedFileObj); ListItem := Main.Playlist.Items.Add; - listitem.data := MedFileObj; - listitem.MakeVisible(false); - If MedFileObj.title<>'' Then ListItem.Caption := MedFileObj.Artist+' - '+MedFileObj.title - Else ListItem.Caption := extractfilename(MedFileObj.path); - If Not PlayerObj.playing And CactusConfig.AutostartPlay And (main.Playlist.Items.Count - =1) Then - Begin - main.Playlist.Selected := Main.Playlist.Items[0]; - DebugOutLn(Main.Playlist.Selected.Caption, 3); - Main.playClick(main); - End; - inc(i); - until (i > 50) or (i >= MediaCollection.count); - main.playlist.Column[0].Caption := rsplaylist+' ('+IntToStr(PlayerObj.playlist. - ItemCount)+' Files/ '+PlayerObj.Playlist. - TotalPlayTimeStr+' )'; + listitem.Data := MedFileObj; + listitem.MakeVisible(False); + if MedFileObj.title <> '' then + ListItem.Caption := MedFileObj.Artist + ' - ' + MedFileObj.title + else + ListItem.Caption := extractfilename(MedFileObj.path); + if not PlayerObj.playing and CactusConfig.AutostartPlay and + (main.Playlist.Items.Count = 1) then + begin + main.Playlist.Selected := Main.Playlist.Items[0]; + DebugOutLn(Main.Playlist.Selected.Caption, 3); + Main.playClick(main); + end; + Inc(i); + until (i > 50) or (i >= MediaCollection.Count); + main.playlist.Column[0].Caption := + rsplaylist + ' (' + IntToStr( + PlayerObj.playlist.ItemCount) + + ' Files/ ' + PlayerObj.Playlist.TotalPlayTimeStr + ' )'; end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TMain.MenuItem26Click(Sender: TObject); -Begin +procedure TMain.MenuItem26Click(Sender: TObject); +begin - ShowMessage('Cactus Jukebox'+LineEnding+'version'+CACTUS_VERSION+LineEnding+ - 'written by Sebastian Kraft '+LineEnding+LineEnding+'(c) 2005-2009'+LineEnding+ - 'http://cactus.hey-you-freaks.de '); + ShowMessage('Cactus Jukebox' + LineEnding + 'version' + CACTUS_VERSION + LineEnding + + 'written by Sebastian Kraft ' + LineEnding + LineEnding + + '(c) 2005-2009' + LineEnding + 'http://cactus.hey-you-freaks.de '); -End; +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TMain.MenuItem27Click(Sender: TObject); +procedure TMain.MenuItem27Click(Sender: TObject); -Var id: longint; +var + id: longint; listitem: TListitem; OpenDialog: TOpenDialog; -Begin +begin OpenDialog := TOpenDialog.Create(self); OpenDialog.Filter := 'M3U Playlist|*.m3u|All Files|*.*'; OpenDialog.InitialDir := CactusConfig.HomeDir; OpenDialog.FilterIndex := 1; - If Opendialog.execute=true Then - Begin - playlist.Clear; - PlayerObj.Playlist.clear; - DebugOut('Loading playlist from -> '+Opendialog.Filename+' ... ', 2); - if PlayerObj.Playlist.LoadFromFile(Opendialog.Filename)=0 then begin - DebugOutLn('done', 2); - DebugOut('Adding items... ', 4); - For id:= 0 To PlayerObj.Playlist.Count-1 Do - Begin - ListItem := Playlist.Items.Add; - listitem.ImageIndex:=-1; - listitem.Data := TMediaFileClass.create(PlayerObj.Playlist.Items[id].path, Nil); - if (PlayerObj.Playlist.items[id].Artist<>'') or (PlayerObj.Playlist.items[id].Title<>'') then - ListItem.Caption := PlayerObj.Playlist.items[id].Artist+' - '+PlayerObj.Playlist.Items[id].Title - else - ListItem.Caption := ExtractFileName(PlayerObj.Playlist.items[id].Path); - End; - DebugOutLn('done', 4); - if Playlist.Items.Count>0 then Playlist.Selected:=Playlist.Items[0]; - end else ShowMessage('ERROR loading Playlist'); - End; + if Opendialog.Execute = True then + begin + playlist.Clear; + PlayerObj.Playlist.Clear; + DebugOut('Loading playlist from -> ' + Opendialog.Filename + ' ... ', 2); + if PlayerObj.Playlist.LoadFromFile(Opendialog.Filename) = 0 then + begin + DebugOutLn('done', 2); + DebugOut('Adding items... ', 4); + for id := 0 to PlayerObj.Playlist.Count - 1 do + begin + ListItem := Playlist.Items.Add; + listitem.ImageIndex := -1; + listitem.Data := + TMediaFileClass.Create(PlayerObj.Playlist.Items[id].path, nil); + if (PlayerObj.Playlist.items[id].Artist <> '') or + (PlayerObj.Playlist.items[id].Title <> '') then + ListItem.Caption := + PlayerObj.Playlist.items[id].Artist + ' - ' + PlayerObj.Playlist.Items[id].Title + else + ListItem.Caption := + UTF8Encode(ExtractFileName(PlayerObj.Playlist.items[id].Path)); + end; + DebugOutLn('done', 4); + if Playlist.Items.Count > 0 then + Playlist.Selected := Playlist.Items[0]; + end + else + ShowMessage('ERROR loading Playlist'); + end; OpenDialog.Free; -End; +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TMain.MenuItem2Click(Sender: TObject); +procedure TMain.MenuItem2Click(Sender: TObject); -Var i: integer; +var + i: integer; MedFileObj: TMediaFileClass; Listitem: TListItem; -Begin +begin - If (TitleTree.Items.Count>0) Then - Begin - For i:= 0 To TitleTree.Items.Count-1 Do - Begin - MedFileObj := TMediaFileClass(TitleTree.Items[i].Data); - PlayerObj.playlist.add(MedFileObj); + if (TitleTree.Items.Count > 0) then + begin + for i := 0 to TitleTree.Items.Count - 1 do + begin + MedFileObj := TMediaFileClass(TitleTree.Items[i].Data); + PlayerObj.playlist.add(MedFileObj); - ListItem := Playlist.Items.Add; - listitem.data := MedFileObj; + ListItem := Playlist.Items.Add; + listitem.Data := MedFileObj; - If MedFileObj.title<>'' Then - ListItem.Caption := MedFileObj.Artist+' - '+MedFileObj.title - Else - ListItem.Caption := extractfilename(MedFileObj.path); - End; - End; - playlist.Column[0].Caption := 'Playlist ('+IntToStr(PlayerObj. - playlist.ItemCount)+' Files/ '+PlayerObj.Playlist. - TotalPlayTimeStr +')'; -End; + if MedFileObj.title <> '' then + ListItem.Caption := MedFileObj.Artist + ' - ' + MedFileObj.title + else + ListItem.Caption := extractfilename(MedFileObj.path); + end; + end; + playlist.Column[0].Caption := + 'Playlist (' + IntToStr( + PlayerObj.playlist.ItemCount) + ' Files/ ' + + PlayerObj.Playlist.TotalPlayTimeStr + ')'; +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TMain.MenuItem37Click(Sender: TObject); +procedure TMain.MenuItem37Click(Sender: TObject); -Var MedColObj: TMediaCollectionClass; +var + MedColObj: TMediaCollectionClass; curartist, curalbum, tmps: string; MedFileObj: TMediaFileClass; i: integer; tsnode: TTreeNode; -Begin +begin tsnode := ArtistTree.Selected; - If (tsnode<>Nil) And (tsnode.level>0) Then - Begin - MedFileObj := TMediaFileClass(tsnode.data); - MedColObj := MedFileObj.collection; - i := MedColObj.getTracks(MedFileObj.Artist, MedFileObj.index); - If tsnode.level=2 Then - Begin - curartist := lowercase(MedFileObj.Artist); - curalbum := lowercase(MedFileObj.album); - Repeat - Begin - If (lowercase(MedColObj.items[i].album)=curalbum) And (MedColObj.items[i].action= - AREMOVE) Then - Begin - MedColObj.items[i].action := AONPLAYER; - sizediff := sizediff-MedColObj.items[i].size; - End; - If (lowercase(MedColObj.items[i].album)=curalbum) And (MedColObj.items[i].action<> - AONPLAYER) Then - Begin - MedColObj.items[i].action := ANOTHING; - sizediff := sizediff+MedColObj.items[i].size; - End; - i := MedColObj.GetNext; - End; - Until i<0; + if (tsnode <> nil) and (tsnode.level > 0) then + begin + MedFileObj := TMediaFileClass(tsnode.Data); + MedColObj := MedFileObj.collection; + i := MedColObj.getTracks(MedFileObj.Artist, MedFileObj.index); + if tsnode.level = 2 then + begin + curartist := lowercase(MedFileObj.Artist); + curalbum := lowercase(MedFileObj.album); + repeat + begin + if (lowercase(MedColObj.items[i].album) = curalbum) and + (MedColObj.items[i].action = AREMOVE) then + begin + MedColObj.items[i].action := AONPLAYER; + sizediff := sizediff - MedColObj.items[i].size; + end; + if (lowercase(MedColObj.items[i].album) = curalbum) and + (MedColObj.items[i].action <> AONPLAYER) then + begin + MedColObj.items[i].action := ANOTHING; + sizediff := sizediff + MedColObj.items[i].size; + end; + i := MedColObj.GetNext; + end; + until i < 0; - End; - If tsnode.level=1 Then - Begin - curartist := lowercase(MedFileObj.Artist); - Repeat - Begin - If (MedColObj.items[i].action=AREMOVE) Then - Begin - MedColObj.items[i].action := AONPLAYER; - sizediff := sizediff-MedColObj.items[i].size; - End; - If (MedColObj.items[i].action<>AONPLAYER) Then - Begin - MedColObj.items[i].action := ANOTHING; - sizediff := sizediff+MedColObj.items[i].size; - End; - i := MedColObj.GetNext; - End; - Until i<0; - End; - update_artist_view; - update_title_view; + end; + if tsnode.level = 1 then + begin + curartist := lowercase(MedFileObj.Artist); + repeat + begin + if (MedColObj.items[i].action = AREMOVE) then + begin + MedColObj.items[i].action := AONPLAYER; + sizediff := sizediff - MedColObj.items[i].size; + end; + if (MedColObj.items[i].action <> AONPLAYER) then + begin + MedColObj.items[i].action := ANOTHING; + sizediff := sizediff + MedColObj.items[i].size; + end; + i := MedColObj.GetNext; + end; + until i < 0; + end; + update_artist_view; + update_title_view; - tmps := ByteToFmtString(FreeSpaceOnDAP + sizediff, 3, 2); - StatusBar1.Panels[1].Text := 'Device connected '+tmps+' Free'; - End; -End; + tmps := ByteToFmtString(FreeSpaceOnDAP + sizediff, 3, 2); + StatusBar1.Panels[1].Text := 'Device connected ' + tmps + ' Free'; + end; +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ //Open manual/homepage in browser -Procedure TMain.MenuItem43Click(Sender: TObject); -Begin +procedure TMain.MenuItem43Click(Sender: TObject); +begin {$ifdef linux} exec('/usr/bin/firefox', 'http://cactus.hey-you-freaks.de'); - If Dosexitcode<>0 Then exec('/usr/bin/mozilla-firefox', - 'http://cactus.hey-you-freaks.de/index.php?page=manual'); - If Dosexitcode<>0 Then exec('/usr/bin/konqueror', - 'http://cactus.hey-you-freaks.de/index.php?page=manual'); - If Dosexitcode<>0 Then Showmessage('The manual can be found at http://cactus.hey-you-freaks.de'); + if Dosexitcode <> 0 then + exec('/usr/bin/mozilla-firefox', + 'http://cactus.hey-you-freaks.de/index.php?page=manual'); + if Dosexitcode <> 0 then + exec('/usr/bin/konqueror', + 'http://cactus.hey-you-freaks.de/index.php?page=manual'); + if Dosexitcode <> 0 then + ShowMessage('The manual can be found at http://cactus.hey-you-freaks.de'); {$endif} - {$ifdef win32} //TODO: Open manual in Browser on win32 - Showmessage('The manual can be found at http://cactus.hey-you-freaks.de'); + {$ifdef win32}//TODO: Open manual in Browser on win32 + ShowMessage('The manual can be found at http://cactus.hey-you-freaks.de'); {$endif} -End; +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TMain.Panel1Click(Sender: TObject); -Begin +procedure TMain.Panel1Click(Sender: TObject); +begin ArtistSrchField.hide; -End; +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TMain.Panel1Resize(Sender: TObject); -var i: integer; -Begin +procedure TMain.Panel1Resize(Sender: TObject); +var + i: integer; +begin // Splitter1.Left:=oldSplitterWidth; -{$ifdef win32} //TODO: check column autosize on win32 +{$ifdef win32}//TODO: check column autosize on win32 - Playlist.Columns[0].width := Playlist.Width; - Titletree.Columns[5].width := 45; - Titletree.Columns[4].width := 45; - Titletree.Columns[3].width := 110; - i:= TitleTree.Width-45-45-110-140-16-15; - if i>0 then Titletree.Columns[2].width := i; - Titletree.Columns[1].width := 140; - Titletree.Columns[0].width := 16; + Playlist.Columns[0].Width := Playlist.Width; + Titletree.Columns[5].Width := 45; + Titletree.Columns[4].Width := 45; + Titletree.Columns[3].Width := 110; + i := TitleTree.Width - 45 - 45 - 110 - 140 - 16 - 15; + if i > 0 then + Titletree.Columns[2].Width := i; + Titletree.Columns[1].Width := 140; + Titletree.Columns[0].Width := 16; {$endif} -End; +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TMain.Panel4Click(Sender: TObject); -Begin +procedure TMain.Panel4Click(Sender: TObject); +begin ArtistSrchField.hide; -End; +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TMain.ArtistSrchFieldClick(Sender: TObject); -Begin +procedure TMain.ArtistSrchFieldClick(Sender: TObject); +begin ArtistSrchField.hide; -End; +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TMain.PreviousButtonImgClick(Sender: TObject); -Begin - prevClick(Nil); -End; +procedure TMain.PreviousButtonImgClick(Sender: TObject); +begin + prevClick(nil); +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TMain.PreviousButtonImgMouseDown(Sender: TOBject; - Button: TMouseButton; Shift: TShiftState; X, Y: Integer); -Begin +procedure TMain.PreviousButtonImgMouseDown(Sender: TObject; + Button: TMouseButton; + Shift: TShiftState; X, Y: integer); +begin PreviousButtonImg.Picture.LoadFromFile(SkinData.previous.Clicked); -End; +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TMain.PreviousButtonImgMouseEnter(Sender: TObject); -Begin +procedure TMain.PreviousButtonImgMouseEnter(Sender: TObject); +begin PreviousButtonImg.Picture.LoadFromFile(SkinData.previous.MouseOver); -End; +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TMain.PreviousButtonImgMouseLeave(Sender: TObject); -Begin +procedure TMain.PreviousButtonImgMouseLeave(Sender: TObject); +begin PreviousButtonImg.Picture.LoadFromFile(SkinData.previous.Img); -End; +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TMain.PreviousButtonImgMouseUp(Sender: TOBject; Button: TMouseButton; - Shift: TShiftState; X, Y: Integer); -Begin +procedure TMain.PreviousButtonImgMouseUp(Sender: TObject; Button: TMouseButton; + Shift: TShiftState; X, Y: integer); +begin PreviousButtonImg.Picture.LoadFromFile(SkinData.previous.MouseOver); -End; +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TMain.SettingsItemClick(Sender: TObject); -Begin - Enabled := false; - setupwin := Tsettings.create(Application); +procedure TMain.SettingsItemClick(Sender: TObject); +begin + Enabled := False; + setupwin := Tsettings.Create(Application); setupwin.ShowModal; setupwin.Free; - Enabled := true; -End; + Enabled := True; +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TMain.SimpleIPCServer1Message(Sender: TObject); +procedure TMain.SimpleIPCServer1Message(Sender: TObject); -Var fpath: string; +var + fpath: string; CommandCode: integer; -Begin +begin DebugOutLn(' IPC Message received', 2); - If length(SimpleIPCServer1.StringMessage)>2 Then - Begin - fpath := copy(SimpleIPCServer1.StringMessage, Pos(':', SimpleIPCServer1.StringMessage)+2, - length(SimpleIPCServer1.StringMessage)); - CommandCode := StrToInt(Copy(SimpleIPCServer1.StringMessage,0 , Pos(':', SimpleIPCServer1. - StringMessage)-1 )); - End - Else - Begin - fpath := ''; - CommandCode := StrToInt(SimpleIPCServer1.StringMessage); - End; - Case CommandCode Of - VOLUME_UP: If volumebar.Position>4 Then volumebar.Position := volumebar.Position-5; - VOLUME_DOWN: If volumebar.Position<46 Then volumebar.Position := volumebar.Position+5; + if length(SimpleIPCServer1.StringMessage) > 2 then + begin + fpath := copy(SimpleIPCServer1.StringMessage, + Pos(':', SimpleIPCServer1.StringMessage) + 2, length( + SimpleIPCServer1.StringMessage)); + CommandCode := StrToInt(Copy(SimpleIPCServer1.StringMessage, 0, + Pos(':', SimpleIPCServer1.StringMessage) - 1)); + end + else + begin + fpath := ''; + CommandCode := StrToInt(SimpleIPCServer1.StringMessage); + end; + case CommandCode of + VOLUME_UP: if volumebar.Position > 4 then + volumebar.Position := volumebar.Position - 5; + VOLUME_DOWN: if volumebar.Position < 46 then + volumebar.Position := volumebar.Position + 5; NEXT_TRACK: nextClick(self); STOP_PLAYING: stopClick(self); START_PLAYING: playClick(self); PREV_TRACK: prevClick(self); PAUSE_PLAYING: pauseClick(self); - OPEN_FILE: If FileExists(fpath) Then - Begin - LoadFile(fpath); - Playlist.Selected := Playlist.Items[Playlist.Items.Count-1]; - playClick(self); - End - Else DebugOutLn('--> Filename received from IPC does not exist', 2); - ENQUEU_FILE: If FileExists(fpath) Then - Begin - LoadFile(fpath); - End - Else DebugOutLn('--> Filename received from IPC does not exist', 2); - Else DebugOutLn(' --> Invalid message/filename received via IPC', 2); - End; + OPEN_FILE: if FileExists(fpath) then + begin + LoadFile(fpath); + Playlist.Selected := Playlist.Items[Playlist.Items.Count - 1]; + playClick(self); + end + else + DebugOutLn('--> Filename received from IPC does not exist', 2); + ENQUEU_FILE: if FileExists(fpath) then + begin + LoadFile(fpath); + end + else + DebugOutLn('--> Filename received from IPC does not exist', 2); + else + DebugOutLn(' --> Invalid message/filename received via IPC', 2); + end; Writeln('IPC end'); -End; +end; procedure TMain.skinmenuClick(Sender: TObject); begin @@ -2839,328 +3010,339 @@ end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TMain.SpeedButton1Click(Sender: TObject); -Begin +procedure TMain.SpeedButton1Click(Sender: TObject); +begin ArtistSrchField.hide; -End; +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TMain.Splitter1Moved(Sender: TObject); -Begin - oldSplitterWidth := Panel4.width; -End; +procedure TMain.Splitter1Moved(Sender: TObject); +begin + oldSplitterWidth := Panel4.Width; +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TMain.SrchAlbumItemClick(Sender: TObject); -Begin - SrchAlbumItem.Checked := Not SrchAlbumItem.Checked; -End; +procedure TMain.SrchAlbumItemClick(Sender: TObject); +begin + SrchAlbumItem.Checked := not SrchAlbumItem.Checked; +end; -Procedure TMain.SrchArtItemClick(Sender: TObject); -Begin - SrchArtItem.Checked := Not SrchArtItem.Checked; -End; +procedure TMain.SrchArtItemClick(Sender: TObject); +begin + SrchArtItem.Checked := not SrchArtItem.Checked; +end; -Procedure TMain.SrchFileItemClick(Sender: TObject); -Begin - SrchFileItem.Checked := Not SrchFileItem.Checked; -End; +procedure TMain.SrchFileItemClick(Sender: TObject); +begin + SrchFileItem.Checked := not SrchFileItem.Checked; +end; -Procedure TMain.SrchTitleItemClick(Sender: TObject); -Begin - SrchTitleItem.Checked := Not SrchTitleItem.Checked; -End; +procedure TMain.SrchTitleItemClick(Sender: TObject); +begin + SrchTitleItem.Checked := not SrchTitleItem.Checked; +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TMain.StopButtonImgClick(Sender: TObject); -Begin - stopClick(Nil); -End; +procedure TMain.StopButtonImgClick(Sender: TObject); +begin + stopClick(nil); +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TMain.StopButtonImgMouseDown(Sender: TOBject; Button: TMouseButton; - Shift: TShiftState; X, Y: Integer); -Begin +procedure TMain.StopButtonImgMouseDown(Sender: TObject; Button: TMouseButton; + Shift: TShiftState; X, Y: integer); +begin StopButtonImg.Picture.LoadFromFile(SkinData.stop.Clicked); -End; +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TMain.StopButtonImgMouseEnter(Sender: TObject); -Begin +procedure TMain.StopButtonImgMouseEnter(Sender: TObject); +begin StopButtonImg.Picture.LoadFromFile(SkinData.stop.MouseOver); -End; +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TMain.StopButtonImgMouseLeave(Sender: TObject); -Begin +procedure TMain.StopButtonImgMouseLeave(Sender: TObject); +begin StopButtonImg.Picture.LoadFromFile(SkinData.stop.Img); -End; +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TMain.StopButtonImgMouseUp(Sender: TOBject; Button: TMouseButton; - Shift: TShiftState; X, Y: Integer); -Begin +procedure TMain.StopButtonImgMouseUp(Sender: TObject; Button: TMouseButton; + Shift: TShiftState; X, Y: integer); +begin StopButtonImg.Picture.LoadFromFile(SkinData.stop.MouseOver); -End; +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TMain.TitleTreeClick(Sender: TObject); -Begin +procedure TMain.TitleTreeClick(Sender: TObject); +begin ArtistSrchField.Hide; -End; +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Function NumericCompare(List: TStringList; Index1, Index2: Integer): Integer; +function NumericCompare(List: TStringList; Index1, Index2: integer): integer; -Var i1, i2: integer; -Begin - Try +var + i1, i2: integer; +begin + try i1 := StrToInt(List[Index2]); i2 := StrToInt(List[Index1]); Result := i2 - i1; - Except - result := 0; - End; -End; + except + Result := 0; + end; +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TMain.TitleTreeColumnClick(Sender: TObject; Column: TListColumn); +procedure TMain.TitleTreeColumnClick(Sender: TObject; Column: TListColumn); -Var sl: TstringList; +var + sl: TStringList; //used for sorting counter, ListitemCount, SubItemsColumnCount, IndexOfCurrentColumn, i: integer; -Begin +begin sl := TStringList.Create; - Try + try IndexOfCurrentColumn := column.index; writeln(IndexOfCurrentColumn); - If IndexOfCurrentColumn <> 0 Then - Begin - ListitemCount:=TitleTree.Items.Count; - For counter := 0 To ListitemCount-1 Do - Begin - SubItemsColumnCount := titletree.items[counter].subitems.Count; - sl.AddObject(titletree.items[counter].SubItems[IndexOfCurrentColumn-1], titletree.items[counter]) - End; - // for i:= 0 to sl.Count-1 do writeln(sl[i]); - If IndexOfCurrentColumn<>4 Then sl.sort - Else sl.CustomSort(@NumericCompare); - // TitleTree.BeginUpdate; -// TitleTree.Clear; -// TitleTree.Items. - For counter := 0 To ListitemCount-1 Do - Begin - titletree.items[counter]:=(TListItem(sl.Objects[counter])); - // writeln(sl[counter]); - End; + if IndexOfCurrentColumn <> 0 then + begin + ListitemCount := TitleTree.Items.Count; + for counter := 0 to ListitemCount - 1 do + begin + SubItemsColumnCount := titletree.items[counter].subitems.Count; + sl.AddObject(titletree.items[counter].SubItems[IndexOfCurrentColumn - 1], + titletree.items[counter]); + end; + // for i:= 0 to sl.Count-1 do writeln(sl[i]); + if IndexOfCurrentColumn <> 4 then + sl.sort + else + sl.CustomSort(@NumericCompare); + // TitleTree.BeginUpdate; + // TitleTree.Clear; + // TitleTree.Items. + for counter := 0 to ListitemCount - 1 do + begin + titletree.items[counter] := (TListItem(sl.Objects[counter])); + // writeln(sl[counter]); + end; // TitleTree.EndUpdate; - End; - Finally - sl.free; - End; -End; + end; + finally + sl.Free; + end; +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TMain.TitleTreeDragOver(Sender, Source: TObject; X, Y: Integer; - State: TDragState; Var Accept: Boolean); -Begin +procedure TMain.TitleTreeDragOver(Sender, Source: TObject; X, Y: integer; + State: TDragState; var Accept: boolean); +begin {$ifdef LCLGtk} //Workaround for GTK1.x to reset selected Item while dragging - If title_drag Then - Begin - TitleTree.Selected := Nil; - TitleTree.Items[sourceitem.Index].Selected := true; - End; + if title_drag then + begin + TitleTree.Selected := nil; + TitleTree.Items[sourceitem.Index].Selected := True; + end; {$endif} - Accept := false; -End; + Accept := False; +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TMain.TitleTreeEndDrag(Sender, Target: TObject; X, Y: Integer); -Begin - title_drag := false; -End; +procedure TMain.TitleTreeEndDrag(Sender, Target: TObject; X, Y: integer); +begin + title_drag := False; +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TMain.TitleTreeMouseDown(Sender: TOBject; Button: TMouseButton; - Shift: TShiftState; X, Y: Integer); -Begin +procedure TMain.TitleTreeMouseDown(Sender: TObject; Button: TMouseButton; + Shift: TShiftState; X, Y: integer); +begin // ensure that the popup menu is only opened when an item is selected // the menu is reanabled in TMain.TitleTreeSelectItem - {$ifdef LCLQT} //TODO: QT interface doesn't set selected item - TitleTree.Selected:= TitleTree.GetItemAt(x, y); + {$ifdef LCLQT}//TODO: QT interface doesn't set selected item + TitleTree.Selected := TitleTree.GetItemAt(x, y); {$endif} - {$ifdef LCLGtk2} //TODO: GTK2 interface doe snot selcte item on right click - If (Button = mbRight) then TitleTree.Selected := TitleTree.GetItemAt(x, y); + {$ifdef LCLGtk2}//TODO: GTK2 interface doe snot selcte item on right click + if (Button = mbRight) then + TitleTree.Selected := TitleTree.GetItemAt(x, y); {$endif} //TODO check titlelist popupmenu on win32 {$ifdef win32} - If (Button = mbRight) And (TitleTree.Selected <> Nil) Then - TitleTree.PopupMenu.PopUp(self.Left+Panel1.Left+TitleTree.left+X, self.top+Panel1.Top+TitleTree. - top+Y+50); + if (Button = mbRight) and (TitleTree.Selected <> nil) then + TitleTree.PopupMenu.PopUp(self.Left + Panel1.Left + TitleTree.left + X, + self.top + Panel1.Top + TitleTree.top + Y + 50); {$else} - If (Button = mbRight) And (TitleTree.Selected = Nil) Then - TitleTree.PopupMenu.AutoPopup := false; + if (Button = mbRight) and (TitleTree.Selected = nil) then + TitleTree.PopupMenu.AutoPopup := False; {$endif} //Enable Dragging - If Button = mbLeft Then - Begin { only drag if left button pressed } - sourceitem := Nil; - sourceitem := TitleTree.GetItemAt(x, y); - If sourceitem<>Nil Then TitleTree.BeginDrag(false, 10); - End; -End; + if Button = mbLeft then + begin { only drag if left button pressed } + sourceitem := nil; + sourceitem := TitleTree.GetItemAt(x, y); + if sourceitem <> nil then + TitleTree.BeginDrag(False, 10); + end; +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TMain.TitleTreeSelectItem(Sender: TObject; Item: TListItem; - Selected: Boolean); -Begin +procedure TMain.TitleTreeSelectItem(Sender: TObject; Item: TListItem; + Selected: boolean); +begin // reanable the popupmenu in case ist was disabled in TMain.TitleTreeMouseDown - TitleTree.PopupMenu.AutoPopup := true; - lblPath.Caption:=UTF8Encode(TMediaFileClass(Item.data).Path); -End; + TitleTree.PopupMenu.AutoPopup := True; + lblPath.Caption := UTF8Encode(TMediaFileClass(Item.Data).Path); +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TMain.TitleTreeStartDrag(Sender: TObject; Var DragObject: TDragObject -); -Begin - title_drag := true; +procedure TMain.TitleTreeStartDrag(Sender: TObject; var DragObject: TDragObject); +begin + title_drag := True; //sourceitem:=TitleTree.Selected; -End; +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TMain.TrackInfoClick(Sender: TObject); -Begin - If (PlayerObj.CurrentTrack)>=0 Then - Begin - playlist.selected := playlist.Items[PlayerObj.CurrentTrack]; - MenuItem10Click(Nil); - End; -End; +procedure TMain.TrackInfoClick(Sender: TObject); +begin + if (PlayerObj.CurrentTrack) >= 0 then + begin + playlist.selected := playlist.Items[PlayerObj.CurrentTrack]; + MenuItem10Click(nil); + end; +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TMain.artisttreemenuPopup(Sender: TObject); +procedure TMain.artisttreemenuPopup(Sender: TObject); -Var MedFileObj: TMediaFileClass; -Begin - If ArtistTree.Selected.Level>0 Then - Begin - MedFileObj := TMediaFileClass(ArtistTree.Selected.Data); - If MedFileObj.collection=PlayerCol Then Menuitem30.enabled := false - Else Menuitem30.enabled := true; - If ArtistTree.Selected.Level=1 Then - Begin - If ArtistTree.Selected.ImageIndex=1 Then - Begin - MenuItem37.Enabled := false; - rm_artist_playeritem.Enabled := true; - MenuItem30.Enabled := true; - End; - If ArtistTree.Selected.ImageIndex=-1 Then - Begin - MenuItem37.Enabled := false; - rm_artist_playeritem.Enabled := false; - MenuItem30.Enabled := true; - End; - If ArtistTree.Selected.ImageIndex=2 Then - Begin - MenuItem37.Enabled := true; - rm_artist_playeritem.Enabled := false; - MenuItem30.Enabled := false; - End; - If ArtistTree.Selected.ImageIndex=3 Then - Begin - MenuItem37.Enabled := true; - rm_artist_playeritem.Enabled := false; - MenuItem30.Enabled := false; - End; - End - Else - Begin - MenuItem37.Enabled := true; - rm_artist_playeritem.Enabled := true; - MenuItem30.Enabled := true; - End; - If player_connected=false Then - Begin - MenuItem30.Visible := false; - rm_artist_playeritem.Visible := false; - menuitem37.Visible := false; - space1.Visible := false; - End; - End; -End; +var + MedFileObj: TMediaFileClass; +begin + if ArtistTree.Selected.Level > 0 then + begin + MedFileObj := TMediaFileClass(ArtistTree.Selected.Data); + if MedFileObj.collection = PlayerCol then + Menuitem30.Enabled := False + else + Menuitem30.Enabled := True; + if ArtistTree.Selected.Level = 1 then + begin + if ArtistTree.Selected.ImageIndex = 1 then + begin + MenuItem37.Enabled := False; + rm_artist_playeritem.Enabled := True; + MenuItem30.Enabled := True; + end; + if ArtistTree.Selected.ImageIndex = -1 then + begin + MenuItem37.Enabled := False; + rm_artist_playeritem.Enabled := False; + MenuItem30.Enabled := True; + end; + if ArtistTree.Selected.ImageIndex = 2 then + begin + MenuItem37.Enabled := True; + rm_artist_playeritem.Enabled := False; + MenuItem30.Enabled := False; + end; + if ArtistTree.Selected.ImageIndex = 3 then + begin + MenuItem37.Enabled := True; + rm_artist_playeritem.Enabled := False; + MenuItem30.Enabled := False; + end; + end + else + begin + MenuItem37.Enabled := True; + rm_artist_playeritem.Enabled := True; + MenuItem30.Enabled := True; + end; + if player_connected = False then + begin + MenuItem30.Visible := False; + rm_artist_playeritem.Visible := False; + menuitem37.Visible := False; + space1.Visible := False; + end; + end; +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TMain.checkmobileTimer(Sender: TObject); +procedure TMain.checkmobileTimer(Sender: TObject); -Var +var PlayerScanThread: TScanThread; tmps: string; -Begin - If (player_connected=false) And FileExists(CactusConfig.DAPPath+'cactuslib') Then - Begin - DebugOut('DAP detected...', 2); - If connectDAP=0 Then - Begin - tmps := GetCurrentDir; - // get free memory on player, format string - DebugOut('loaded', 2); - tmps := ByteToFmtString(FreeSpaceOnDAP, 3, 2); - writeln(FreeSpaceOnDAP); - StatusBar1.Panels[1].Text := 'Device connected '+tmps+' free'; - If CactusConfig.background_scan Then - Begin - PlayerScanThread := TScanThread.Create(true); - PlayerScanThread.tmpcollection.Assign(PlayerCol); - PlayerScanThread.PTargetCollection := PlayerCol; - PlayerScanThread.Resume; - End; - End - Else - Begin - checkmobile.Enabled := false; - ShowMessage('Error while opening player device. '+#10+#13+'Try to scan player again...'); - player_connected := true; - End; - End; +begin + if (player_connected = False) and FileExists(CactusConfig.DAPPath + 'cactuslib') then + begin + DebugOut('DAP detected...', 2); + if connectDAP = 0 then + begin + tmps := GetCurrentDir; + // get free memory on player, format string + DebugOut('loaded', 2); + tmps := ByteToFmtString(FreeSpaceOnDAP, 3, 2); + writeln(FreeSpaceOnDAP); + StatusBar1.Panels[1].Text := 'Device connected ' + tmps + ' free'; + if CactusConfig.background_scan then + begin + PlayerScanThread := TScanThread.Create(True); + PlayerScanThread.tmpcollection.Assign(PlayerCol); + PlayerScanThread.PTargetCollection := PlayerCol; + PlayerScanThread.Resume; + end; + end + else + begin + checkmobile.Enabled := False; + ShowMessage('Error while opening player device. ' + #10 + #13 + + 'Try to scan player again...'); + player_connected := True; + end; + end; Application.ProcessMessages; - If (player_connected=true) And (FileExists(CactusConfig.DAPPath+'cactuslib')=false) Then - Begin - disconnectDAP; - StatusBar1.Panels[1].Text := 'Device disconnected'; - End; -End; + if (player_connected = True) and + (FileExists(CactusConfig.DAPPath + 'cactuslib') = False) then + begin + disconnectDAP; + StatusBar1.Panels[1].Text := 'Device disconnected'; + end; +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TMain.clearPlayerItemClick(Sender: TObject); -Begin +procedure TMain.clearPlayerItemClick(Sender: TObject); +begin (*if player_connected then begin res:=MessageDlg('All music files on the player will definitely be removed!!'+#10+#13+' Continue?', mtWarning, mbOKCancel, 0); @@ -3180,502 +3362,535 @@ End; End Else ShowMessage(rsNotConnected);*) -ShowMessage('Not implemented yet!'); -End; + ShowMessage('Not implemented yet!'); +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ procedure TMain.Menuitem10Click(Sender: TObject); -Var MedFileObj: TMediaFileClass; -Begin +var + MedFileObj: TMediaFileClass; +begin + if playlist.Selected <> nil then + begin + MedFileObj := TMediaFileClass(Playlist.Selected.Data); + editid3win.display_window(MedFileObj); + Enabled := False; + EditID3win.ShowModal; + Enabled := True; + end; - If playlist.Selected<>Nil Then - Begin - MedFileObj := TMediaFileClass(Playlist.Selected.Data); - editid3win.display_window(MedFileObj); - enabled := false; - EditID3win.ShowModal; - Enabled:=true; - End; - -End; +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TMain.clear_listClick(Sender: TObject); -Begin - if CactusConfig.StopOnClear then StopButtonImgClick(Sender); +procedure TMain.clear_listClick(Sender: TObject); +begin + if CactusConfig.StopOnClear then + StopButtonImgClick(Sender); Playlist.BeginUpdate; writeln(Playlist.Items.Count); Playlist.Items.Clear; writeln('clear'); playlist.Column[0].Caption := rsPlaylist; - PlayerObj.playlist.clear; + PlayerObj.playlist.Clear; Playlist.EndUpdate; -End; +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TMain.filetypeboxChange(Sender: TObject); -Begin - srch_buttonClick(Nil); -End; +procedure TMain.filetypeboxChange(Sender: TObject); +begin + srch_buttonClick(nil); +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TMain.libinfoClick(Sender: TObject); +procedure TMain.libinfoClick(Sender: TObject); -Var z: int64; +var + z: int64; s, used: string; i: integer; -Begin +begin z := 0; - For i:= 1 To MediaCollection.ItemCount-1 Do - z := z+MediaCollection.items[i].size; + for i := 1 to MediaCollection.ItemCount - 1 do + z := z + MediaCollection.items[i].size; used := ByteToFmtString(z, 3, 2); s := IntToStr(MediaCollection.ItemCount); - ShowMessage(s+' Files in library '+#10+' '+used+' of music files'); -End; + ShowMessage(s + ' Files in library ' + #10 + ' ' + used + ' of music files'); +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TMain.muteClick(Sender: TObject); -var png: TPortableNetworkGraphic; -Begin -if PlayerObj.playing then begin +procedure TMain.muteClick(Sender: TObject); +var + png: TPortableNetworkGraphic; +begin + if PlayerObj.playing then + begin - PlayerObj.mute; + PlayerObj.mute; - png:=TPortableNetworkGraphic.Create; - If PlayerObj.muted Then png.LoadFromFile(SkinData.DefaultPath+DirectorySeparator+ - 'icon'+DirectorySeparator+'mute2.png') - Else png.LoadFromFile(SkinData.DefaultPath+DirectorySeparator+ - 'icon'+DirectorySeparator+'mute1.png'); + png := TPortableNetworkGraphic.Create; + if PlayerObj.muted then + png.LoadFromFile(SkinData.DefaultPath + DirectorySeparator + + 'icon' + + DirectorySeparator + 'mute2.png') + else + png.LoadFromFile(SkinData.DefaultPath + DirectorySeparator + + 'icon' + + DirectorySeparator + 'mute1.png'); - mute.Glyph.assign(png); - png.Free; + mute.Glyph.Assign(png); + png.Free; + end; end; -End; -Procedure TMain.opendirClick(Sender: TObject); +procedure TMain.opendirClick(Sender: TObject); -Var i: integer; -Begin +var + i: integer; +begin SelectDirectoryDialog1.InitialDir := CactusConfig.HomeDir; Selectdirectorydialog1.title := 'Add Directory...'; - If SelectDirectoryDialog1.Execute=true Then - Begin - For i:= 0 To MediaCollection.dirlist.Count-1 Do - Begin - If pos(MediaCollection.dirlist[i], SelectDirectoryDialog1.FileName)=1 Then - Begin - ShowMessage('Directory '+SelectDirectoryDialog1.FileName+ - ' is still part of directorylist'); - exit; - End; - End; - Enabled := false; - Application.ProcessMessages; - MediaCollection.add_directory(SelectDirectoryDialog1.FileName); - DebugOutLn('finished scan of '+Selectdirectorydialog1.Filename, 3); - If MediaCollection.ItemCount>1 Then - Begin - Main.ArtistTree.Selected := Nil; - update_artist_view; - update_title_view; - End; - Enabled := true; - End; -End; + if SelectDirectoryDialog1.Execute = True then + begin + for i := 0 to MediaCollection.dirlist.Count - 1 do + begin + if pos(MediaCollection.dirlist[i], SelectDirectoryDialog1.FileName) = 1 then + begin + ShowMessage('Directory ' + SelectDirectoryDialog1.FileName + + ' is still part of directorylist'); + exit; + end; + end; + Enabled := False; + Application.ProcessMessages; + MediaCollection.add_directory(SelectDirectoryDialog1.FileName); + DebugOutLn('finished scan of ' + Selectdirectorydialog1.Filename, 3); + if MediaCollection.ItemCount > 1 then + begin + Main.ArtistTree.Selected := nil; + update_artist_view; + update_title_view; + end; + Enabled := True; + end; +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TMain.openfileClick(Sender: TObject); +procedure TMain.openfileClick(Sender: TObject); -Var OpenDialog: TOpenDialog; -Begin +var + OpenDialog: TOpenDialog; +begin OpenDialog := TOpenDialog.Create(self); - OpenDialog.Filter := 'All supported audio|*.wav;*.mp3;*.ogg;*.wma;*.flac;*.fla|MP3|*.mp3|OGG|*.ogg|WAV|*.wav|WMA|*.wma|FLAC|*.flac;*.fla'; - if FileOpneDialogPath<>''then + OpenDialog.Filter := + 'All supported audio|*.wav;*.mp3;*.ogg;*.wma;*.flac;*.fla|MP3|*.mp3|OGG|*.ogg|WAV|*.wav|WMA|*.wma|FLAC|*.flac;*.fla'; + if FileOpneDialogPath <> '' then OpenDialog.InitialDir := FileOpneDialogPath - else + else OpenDialog.InitialDir := CactusConfig.HomeDir; OpenDialog.FilterIndex := 1; - If Opendialog.execute=true Then - Begin - LoadFile(Opendialog.Filename); - FileOpneDialogPath:=ExtractFilePath(OpenDialog.FileName); - End; + if Opendialog.Execute = True then + begin + LoadFile(Opendialog.Filename); + FileOpneDialogPath := ExtractFilePath(OpenDialog.FileName); + end; OpenDialog.Free; -End; +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TMain.pauseClick(Sender: TObject); -Begin +procedure TMain.pauseClick(Sender: TObject); +begin PlayerObj.pause; -End; +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TMain.player_libClick(Sender: TObject); -Begin - If playwin.Active Then - Begin - playwin.hide; - main.show; - playermode := false; - End - Else - Begin - playwin.show; - main.hide; - playermode := true; - End; -End; +procedure TMain.player_libClick(Sender: TObject); +begin + if playwin.Active then + begin + playwin.hide; + main.Show; + playermode := False; + end + else + begin + playwin.Show; + main.hide; + playermode := True; + end; +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TMain.playlistClick(Sender: TObject); -Begin +procedure TMain.playlistClick(Sender: TObject); +begin ArtistSrchField.hide; -End; +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TMain.playlistDblClick(Sender: TObject); -Begin - playclick(Nil); -End; +procedure TMain.playlistDblClick(Sender: TObject); +begin + playclick(nil); +end; -Procedure TMain.playlistDragDrop(Sender, Source: TObject; X, Y: Integer); +procedure TMain.playlistDragDrop(Sender, Source: TObject; X, Y: integer); -Var Targetitem, tmpitem : TListItem; +var + Targetitem, tmpitem: TListItem; sourceNode: TTreeNode; ind: integer; MedFileObj: TMediaFileClass; -Begin - If Not NetworkMode Then - Begin - DebugOutLn('ondragdrop', 3); - Targetitem := Nil; +begin + if not NetworkMode then + begin + DebugOutLn('ondragdrop', 3); + Targetitem := nil; - Try - If Playlist.Items.Count>0 Then Targetitem := Playlist.GetItemAt(x, y); - Except - Targetitem := Nil; - End; + try + if Playlist.Items.Count > 0 then + Targetitem := Playlist.GetItemAt(x, y); + except + Targetitem := nil; + end; - If Playlist.Items.Count=0 Then Targetitem := Nil; - If Targetitem<>Nil Then DebugOutLn(Targetitem.Index, 3) - Else DebugOutLn('TARGET NIL', 3); + if Playlist.Items.Count = 0 then + Targetitem := nil; + if Targetitem <> nil then + DebugOutLn(Targetitem.Index, 3) + else + DebugOutLn('TARGET NIL', 3); - If title_drag Then - Begin - title_drag := false; - MedFileObj := TMediaFileClass(sourceitem.Data); - tmpitem := TListItem.Create(Playlist.Items); - If (MedFileObj.Artist<>'') Or (MedFileObj.Title<>'') Then - Begin - tmpitem.Caption := MedFileObj.Artist+' - '+MedFileObj.Title; - End - Else - tmpitem.Caption := ExtractFileName(MedFileObj.Path); - tmpitem.Data := MedFileObj; + if title_drag then + begin + title_drag := False; + MedFileObj := TMediaFileClass(sourceitem.Data); + tmpitem := TListItem.Create(Playlist.Items); + if (MedFileObj.Artist <> '') or (MedFileObj.Title <> '') then + begin + tmpitem.Caption := MedFileObj.Artist + ' - ' + MedFileObj.Title; + end + else + tmpitem.Caption := ExtractFileName(MedFileObj.Path); + tmpitem.Data := MedFileObj; - If (Targetitem<>Nil) And (Targetitem.Index0) Then - Begin - ind := Targetitem.Index; - Playlist.Items.InsertItem(tmpitem, ind+1); - PlayerObj.Playlist.insert(tmpitem.Index+1, MedFileObj); - End - Else - Begin - Playlist.Items.AddItem(tmpitem); - PlayerObj.playlist.add(MedFileObj); - End; - sourceitem := Nil; - If Not PlayerObj.playing And (CactusConfig.AutostartPlay) And (Playlist.Items. - Count=1) Then playClick(self); - End; + if (Targetitem <> nil) and (Targetitem.Index < Playlist.Items.Count - 1) and + (Playlist.Items.Count > 0) then + begin + ind := Targetitem.Index; + Playlist.Items.InsertItem(tmpitem, ind + 1); + PlayerObj.Playlist.insert(tmpitem.Index + 1, MedFileObj); + end + else + begin + Playlist.Items.AddItem(tmpitem); + PlayerObj.playlist.add(MedFileObj); + end; + sourceitem := nil; + if not PlayerObj.playing and (CactusConfig.AutostartPlay) and + (Playlist.Items.Count = 1) then + playClick(self); + end; - If artist_drag Then - Begin - artist_drag := false; - sourceNode := ArtistTree.Selected; - If (Targetitem<>Nil) And (Targetitem.Index0) Then - artist_to_playlist_at(Targetitem.Index+1) - Else artist_to_playlist; - End; + if artist_drag then + begin + artist_drag := False; + sourceNode := ArtistTree.Selected; + if (Targetitem <> nil) and (Targetitem.Index < Playlist.Items.Count - 1) and + (Playlist.Items.Count > 0) then + artist_to_playlist_at(Targetitem.Index + 1) + else + artist_to_playlist; + end; - If playlist_drag Then - Begin - playlist_drag := false; - sourceitem := Playlist.Selected; - DebugOutLn('playlist_Drag', 3); - If (sourceitem<>Nil) And (Targetitem<>sourceitem) Then - Begin - ind := sourceitem.Index; - DebugOutLn('OK', 3); - tmpitem := TListItem.Create(Playlist.Items); - tmpitem.Assign(sourceitem); - If (Targetitem<>Nil) And (Targetitem.Indextmpitem.Index-1 Then PlayerObj.Playlist.move(ind, tmpitem.Index) - Else PlayerObj.Playlist.move(ind, tmpitem.Index); - DebugOutLn('MOVE', 3) - End - Else - Begin - Playlist.Items.AddItem(tmpitem); - sourceitem.Delete; - PlayerObj.Playlist.move(ind, tmpitem.Index); - DebugOutLn('ADD', 3); - End; - End; - End; - End; -End; + if playlist_drag then + begin + playlist_drag := False; + sourceitem := Playlist.Selected; + DebugOutLn('playlist_Drag', 3); + if (sourceitem <> nil) and (Targetitem <> sourceitem) then + begin + ind := sourceitem.Index; + DebugOutLn('OK', 3); + tmpitem := TListItem.Create(Playlist.Items); + tmpitem.Assign(sourceitem); + if (Targetitem <> nil) and (Targetitem.Index < Playlist.Items.Count - 1) then + begin + Playlist.Items.InsertItem(tmpitem, Targetitem.Index + 1); + sourceitem.Delete; + if ind > tmpitem.Index - 1 then + PlayerObj.Playlist.move(ind, tmpitem.Index) + else + PlayerObj.Playlist.move(ind, tmpitem.Index); + DebugOutLn('MOVE', 3); + end + else + begin + Playlist.Items.AddItem(tmpitem); + sourceitem.Delete; + PlayerObj.Playlist.move(ind, tmpitem.Index); + DebugOutLn('ADD', 3); + end; + end; + end; + end; +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TMain.playlistDragOver(Sender, Source: TObject; X, Y: Integer; - State: TDragState; Var Accept: Boolean); -Begin +procedure TMain.playlistDragOver(Sender, Source: TObject; X, Y: integer; + State: TDragState; var Accept: boolean); +begin {$ifdef LCLGtk} //Workaround for GTK1.x to reset selected Item while dragging DebugOutLn('gtk1', 5); - If playlist_drag Then - Begin - playlist.Selected := Nil; - playlist.Items[sourceitem.Index].Selected := true; - End; + if playlist_drag then + begin + playlist.Selected := nil; + playlist.Items[sourceitem.Index].Selected := True; + end; {$endif} - accept := true; -End; + accept := True; +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TMain.playlistEndDrag(Sender, Target: TObject; X, Y: Integer); +procedure TMain.playlistEndDrag(Sender, Target: TObject; X, Y: integer); -Var tmplitem: TListItem; -Begin - playlist_drag := false; -End; +var + tmplitem: TListItem; +begin + playlist_drag := False; +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TMain.playlistKeyDown(Sender: TObject; Var Key: Word; - Shift: TShiftState); +procedure TMain.playlistKeyDown(Sender: TObject; var Key: word; + Shift: TShiftState); -Var tempitem: TListItem; +var + tempitem: TListItem; i: integer; -Begin +begin DebugOutLn('Playlist keypress event: Keycode ', 2); writeln(key); - Case key Of + case key of // Key Ctrl - 17: ctrl_pressed := true; + 17: ctrl_pressed := True; // Key UP - 38: If playlist.Selected.Index>0 Then - Begin - i := playlist.Selected.Index; - DebugOutLn(i, 2); - If ctrl_pressed Then - Begin - tempitem := playlist.selected; - PlayerObj.playlist.move(i, i-1); - playlist.items[i] := playlist.items[i-1]; - playlist.items[i-1] := tempitem; - Playlist.SetFocus; - playlist.items[i].Selected := false; - playlist.items[i-1].Selected := true; - //tempitem.MakeVisible(true); - End; - writeln(playlist.Selected.Index); - End; + 38: if playlist.Selected.Index > 0 then + begin + i := playlist.Selected.Index; + DebugOutLn(i, 2); + if ctrl_pressed then + begin + tempitem := playlist.selected; + PlayerObj.playlist.move(i, i - 1); + playlist.items[i] := playlist.items[i - 1]; + playlist.items[i - 1] := tempitem; + Playlist.SetFocus; + playlist.items[i].Selected := False; + playlist.items[i - 1].Selected := True; + //tempitem.MakeVisible(true); + end; + writeln(playlist.Selected.Index); + end; // Key DOWN - 40: If playlist.Selected.Index Nil) Then - Playlist.PopupMenu.PopUp(self.Left+panel4.Width+Panel3.Left+Playlist.left+X+10, self.top+Panel3. - Top+Playlist.top+Y+50); + if (Button = mbRight) and (Playlist.Selected <> nil) then + Playlist.PopupMenu.PopUp(self.Left + panel4.Width + Panel3.Left + Playlist.left + X + 10, + self.top + Panel3.Top + Playlist.top + Y + 50); {$else} - If (Button = mbRight) And (playlist.Selected = Nil) Then - playlist.PopupMenu.AutoPopup := false; + if (Button = mbRight) and (playlist.Selected = nil) then + playlist.PopupMenu.AutoPopup := False; {$endif} //Enable Dragging - If Button = mbLeft Then - Begin { only drag if left button pressed } - sourceitem := Nil; - sourceitem := Playlist.GetItemAt(x, y); - If sourceitem<>Nil Then Playlist.BeginDrag(false, 10); - End; - -End; - -//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - -Procedure TMain.playlistSelectItem(Sender: TObject; Item: TListItem; - Selected: Boolean); -Begin - // reanable the popupmenu in case ist was disabled in TMain.playlistMouseDown - playlist.PopupMenu.AutoPopup := true; - if (Item.Data<>nil) then begin - lblPath.Caption := UTF8Encode(TMediaFileClass(Item.data).Path); + if Button = mbLeft then + begin { only drag if left button pressed } + sourceitem := nil; + sourceitem := Playlist.GetItemAt(x, y); + if sourceitem <> nil then + Playlist.BeginDrag(False, 10); end; -End; + +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TMain.playlistStartDrag(Sender: TObject; Var DragObject: TDragObject); -Begin - playlist_drag := true; +procedure TMain.playlistSelectItem(Sender: TObject; Item: TListItem; + Selected: boolean); +begin + // reanable the popupmenu in case ist was disabled in TMain.playlistMouseDown + playlist.PopupMenu.AutoPopup := True; + if (Item.Data <> nil) then + begin + lblPath.Caption := UTF8Encode(TMediaFileClass(Item.Data).Path); + end; +end; + +//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +procedure TMain.playlistStartDrag(Sender: TObject; var DragObject: TDragObject); +begin + playlist_drag := True; DebugOutLn('playlist drag', 3); -End; +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TMain.playtimerStartTimer(Sender: TObject); +procedure TMain.playtimerStartTimer(Sender: TObject); -Var MedFileObj: TMediaFileClass; +var + MedFileObj: TMediaFileClass; i: integer; -Begin - If PlayerObj.PlaybackMode=FILE_MODE Then - Begin - CoverFound := false; - LoopCount := 0; - i := PlayerObj.CurrentTrack; - MedFileObj := TMediaFileClass(playlist.Items[PlayerObj.CurrentTrack].Data); - If (MedFileObj.album<>'') Then - Begin - MedFileObj.CoverPath := CactusConfig.GetCoverPath(MedFileObj.GetCoverFile); - If (FileExists(MedFileObj.CoverPath)=false) Then - Begin - CoverImage.Picture.Clear; - If (CactusConfig.CoverDownload) Then - Begin - LastFMAPI := TLastfmAPIObject.Create; - if CactusConfig.CoverSize='large' then LastFMAPI.CoverSize:=ExtralargeImage - else LastFMAPI.CoverSize:=LargeImage; - LastFMAPI.album_downloadCover(MedFileObj.Artist, MedFileObj.Album, MedFileObj.CoverPath); - End; - End - Else - Begin - Try - CoverImage.Picture.LoadFromFile(MedFileObj.CoverPath); - playwin.AlbumCoverImg.Picture.LoadFromFile(MedFileObj.CoverPath); - Except - DebugOutLn('EXCEPTION', 3); - End; - CoverFound := true; - End; - End - Else CoverImage.Picture.Clear; +begin + if PlayerObj.PlaybackMode = FILE_MODE then + begin + CoverFound := False; + LoopCount := 0; + i := PlayerObj.CurrentTrack; + MedFileObj := TMediaFileClass(playlist.Items[PlayerObj.CurrentTrack].Data); + if (MedFileObj.album <> '') then + begin + MedFileObj.CoverPath := CactusConfig.GetCoverPath(MedFileObj.GetCoverFile); + if (FileExists(MedFileObj.CoverPath) = False) then + begin + CoverImage.Picture.Clear; + if (CactusConfig.CoverDownload) then + begin + LastFMAPI := TLastfmAPIObject.Create; + if CactusConfig.CoverSize = 'large' then + LastFMAPI.CoverSize := ExtralargeImage + else + LastFMAPI.CoverSize := LargeImage; + LastFMAPI.album_downloadCover(MedFileObj.Artist, + MedFileObj.Album, MedFileObj.CoverPath); + end; + end + else + begin + try + CoverImage.Picture.LoadFromFile(MedFileObj.CoverPath); + playwin.AlbumCoverImg.Picture.LoadFromFile(MedFileObj.CoverPath); + except + DebugOutLn('EXCEPTION', 3); + end; + CoverFound := True; + end; + end + else + CoverImage.Picture.Clear; - //CoverImage.Picture.LoadFromFile(DataPrefix+'tools'+DirectorySeparator+'cactus-logo-small.png'); - End; -End; + //CoverImage.Picture.LoadFromFile(DataPrefix+'tools'+DirectorySeparator+'cactus-logo-small.png'); + end; +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TMain.ArtistTreeDblClick(Sender: TObject); +procedure TMain.ArtistTreeDblClick(Sender: TObject); -Var StreamInfoObj: TStreamInfoItemClass; -Begin - If LibraryMode Or DeviceMode Then - Begin - If (ArtistTree.Selected<>Nil) And (ArtistTree.Selected.Level>0) Then artist_to_playlist; - End; +var + StreamInfoObj: TStreamInfoItemClass; +begin + if LibraryMode or DeviceMode then + begin + if (ArtistTree.Selected <> nil) and (ArtistTree.Selected.Level > 0) then + artist_to_playlist; + end; - If NetworkMode Then - Begin - If (ArtistTree.Selected<>Nil) And (ArtistTree.Selected.Level>0) Then - Begin - StatusBar1.Panels[0].Text := 'Buffering stream...'; - StreamInfoObj := TStreamInfoItemClass(ArtistTree.Selected.Data); - writeln(PlayerObj.play(StreamInfoObj.URL)); - current_title_edit.Text := 'Playing radio stream...'; - current_title_edit1.Text := StreamInfoObj.Name; - playtimer.Enabled := true; - End; - End; + if NetworkMode then + begin + if (ArtistTree.Selected <> nil) and (ArtistTree.Selected.Level > 0) then + begin + StatusBar1.Panels[0].Text := 'Buffering stream...'; + StreamInfoObj := TStreamInfoItemClass(ArtistTree.Selected.Data); + writeln(PlayerObj.play(StreamInfoObj.URL)); + current_title_edit.Text := 'Playing radio stream...'; + current_title_edit1.Text := StreamInfoObj.Name; + playtimer.Enabled := True; + end; + end; -End; +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TMain.ArtistTreeEndDrag(Sender, Target: TObject; X, Y: Integer); -Begin - artist_drag := false; -End; +procedure TMain.ArtistTreeEndDrag(Sender, Target: TObject; X, Y: integer); +begin + artist_drag := False; +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TMain.ArtistTreeClick(Sender: TObject); -Begin +procedure TMain.ArtistTreeClick(Sender: TObject); +begin ArtistSrchField.Hide; // if ArtistTree.Selected<>nil then update_title_view; -End; +end; procedure TMain.ApplicationProperties1Minimize(Sender: TObject); begin @@ -3684,368 +3899,393 @@ end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TMain.ArtistTreeKeyUp(Sender: TObject; Var Key: Word; - Shift: TShiftState); +procedure TMain.ArtistTreeKeyUp(Sender: TObject; var Key: word; + Shift: TShiftState); -Var b: byte; +var + b: byte; c: char; i: integer; -Begin +begin writeln(key); b := key; c := char(b); - Case key Of - 45: For i:=0 To ArtistTree.Items.Count-1 Do - If ArtistTree.Items[i].Level=0 Then ArtistTree.Items[i].Expanded := false; - 43: For i:=0 To ArtistTree.Items.Count-1 Do - If ArtistTree.Items[i].Level=0 Then ArtistTree.Items[i].Expanded := true; + case key of + 45: for i := 0 to ArtistTree.Items.Count - 1 do + if ArtistTree.Items[i].Level = 0 then + ArtistTree.Items[i].Expanded := False; + 43: for i := 0 to ArtistTree.Items.Count - 1 do + if ArtistTree.Items[i].Level = 0 then + ArtistTree.Items[i].Expanded := True; 27: ArtistSrchField.Hide; 13: ArtistSrchField.Hide; 65..255: - Begin - If Not ArtistSrchField.visible Then - Begin - ArtistSrchField.Top := main.Height-120; - ArtistSrchField.Left := Panel4.Width-155; - ArtistSrchField.Show; - artistsearch.Text := c; - artistsearch.SetFocus; - artistsearch.SelStart := 1; - artistsearch.SelLength:=0; + begin + if not ArtistSrchField.Visible then + begin + ArtistSrchField.Top := main.Height - 120; + ArtistSrchField.Left := Panel4.Width - 155; + ArtistSrchField.Show; + artistsearch.Text := c; + artistsearch.SetFocus; + artistsearch.SelStart := 1; + artistsearch.SelLength := 0; - End; - i := 0; - Repeat - inc(i) - Until ((pos(lowercase(artistsearch.Text), lowercase(ArtistTree.Items[i].Text))=1) And - (ArtistTree.Items[i].Level=1)) Or (i>=ArtistTree.Items.Count-1); - if ArtistTree.Items[i].Level>0 then begin - ArtistTree.Selected := ArtistTree.Items[i]; - if ArtistTree.Selected.AbsoluteIndex1 then - ArtistTree.Items[ArtistTree.Selected.AbsoluteIndex+9].Parent.Expanded:=false; - end - else begin - ArtistTree.Items[ArtistTree.Items.Count-1].MakeVisible; - if ArtistTree.Items[ArtistTree.Items.Count-1].Level>1 then - ArtistTree.Items[ArtistTree.Items.Count-1].Parent.Expanded:=false; - end; - End; - End; - End; -End; + end; + i := 0; + repeat + Inc(i) + until ((pos(lowercase(artistsearch.Text), + lowercase(ArtistTree.Items[i].Text)) = 1) and + (ArtistTree.Items[i].Level = 1)) or (i >= ArtistTree.Items.Count - 1); + if ArtistTree.Items[i].Level > 0 then + begin + ArtistTree.Selected := ArtistTree.Items[i]; + if ArtistTree.Selected.AbsoluteIndex < ArtistTree.Items.Count - 10 then + begin + ArtistTree.Items[ArtistTree.Selected.AbsoluteIndex + + 9].MakeVisible; + if ArtistTree.Items[ArtistTree.Selected.AbsoluteIndex + + 9].Level > 1 then + ArtistTree.Items[ArtistTree.Selected.AbsoluteIndex + + 9].Parent.Expanded := False; + end + else + begin + ArtistTree.Items[ArtistTree.Items.Count - 1].MakeVisible; + if ArtistTree.Items[ArtistTree.Items.Count - 1].Level > 1 then + ArtistTree.Items[ArtistTree.Items.Count - + 1].Parent.Expanded := False; + end; + end; + end; + end; +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TMain.ArtistTreeMouseDown(Sender: TOBject; Button: TMouseButton; - Shift: TShiftState; X, Y: Integer); -Begin +procedure TMain.ArtistTreeMouseDown(Sender: TObject; Button: TMouseButton; + Shift: TShiftState; X, Y: integer); +begin ArtistTree.SetFocus; // ensure that the popup menu is only opened when an item is selected - If Button = mbRight Then - Begin - If NetworkMode Then ArtistTree.PopupMenu := NetworktreePopup - Else ArtistTree.PopupMenu := artisttreemenu; - If (ArtistTree.GetNodeAt(X, Y) = Nil) Then - ArtistTree.PopupMenu.AutoPopup := false - Else - ArtistTree.PopupMenu.AutoPopup := true; - End; -End; + if Button = mbRight then + begin + if NetworkMode then + ArtistTree.PopupMenu := NetworktreePopup + else + ArtistTree.PopupMenu := artisttreemenu; + if (ArtistTree.GetNodeAt(X, Y) = nil) then + ArtistTree.PopupMenu.AutoPopup := False + else + ArtistTree.PopupMenu.AutoPopup := True; + end; +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TMain.MenuItem30Click(Sender: TObject); +procedure TMain.MenuItem30Click(Sender: TObject); -Var MedColObj: TMediaCollectionClass; +var + MedColObj: TMediaCollectionClass; curartist, curalbum, tmps: string; tmpsize: int64; MedFileObj: TMediaFileClass; i: integer; tsnode: TTreeNode; -Begin +begin tsnode := ArtistTree.Selected; tmpsize := 0; - If (tsnode<>Nil) And (tsnode.level>0) And player_connected Then - Begin - MedFileObj := TMediaFileClass(tsnode.data); - MedColObj := MedFileObj.collection; - curartist := lowercase(MedFileObj.Artist); - i := MedColObj.getTracks(MedFileObj.Artist, MedFileObj.index); - If tsnode.level=2 Then //album - Begin - curalbum := lowercase(MedFileObj.album); - Repeat - Begin - If (lowercase(MedColObj.items[i].album)=curalbum) And (MedColObj.items[i].action= - AREMOVE) Then - Begin - MedColObj.items[i].action := AONPLAYER; - sizediff := sizediff - MedColObj.items[i].size; - End; - If (lowercase(MedColObj.items[i].album)=curalbum) And (MedColObj.items[i].action<> - AONPLAYER) Then - Begin - MedColObj.items[i].action := AUPLOAD; - sizediff := sizediff - MedColObj.items[i].size; - End; - i := MedColObj.GetNext; - End; - Until i<0; + if (tsnode <> nil) and (tsnode.level > 0) and player_connected then + begin + MedFileObj := TMediaFileClass(tsnode.Data); + MedColObj := MedFileObj.collection; + curartist := lowercase(MedFileObj.Artist); + i := MedColObj.getTracks(MedFileObj.Artist, MedFileObj.index); + if tsnode.level = 2 then //album + begin + curalbum := lowercase(MedFileObj.album); + repeat + begin + if (lowercase(MedColObj.items[i].album) = curalbum) and + (MedColObj.items[i].action = AREMOVE) then + begin + MedColObj.items[i].action := AONPLAYER; + sizediff := sizediff - MedColObj.items[i].size; + end; + if (lowercase(MedColObj.items[i].album) = curalbum) and + (MedColObj.items[i].action <> AONPLAYER) then + begin + MedColObj.items[i].action := AUPLOAD; + sizediff := sizediff - MedColObj.items[i].size; + end; + i := MedColObj.GetNext; + end; + until i < 0; - End; - If tsnode.level=1 Then //SrchArtItem - Begin - Repeat - Begin - If (MedColObj.items[i].action=AREMOVE) Then - Begin - MedColObj.items[i].action := AONPLAYER; - sizediff := sizediff - MedColObj.items[i].size; - End; - If (MedColObj.items[i].action<>AONPLAYER) Then - Begin - MedColObj.items[i].action := AUPLOAD; - sizediff := sizediff - MedColObj.items[i].size; - End; - i := MedColObj.GetNext; - End; - Until i<0; - End; - update_artist_view; - update_title_view; + end; + if tsnode.level = 1 then //SrchArtItem + begin + repeat + begin + if (MedColObj.items[i].action = AREMOVE) then + begin + MedColObj.items[i].action := AONPLAYER; + sizediff := sizediff - MedColObj.items[i].size; + end; + if (MedColObj.items[i].action <> AONPLAYER) then + begin + MedColObj.items[i].action := AUPLOAD; + sizediff := sizediff - MedColObj.items[i].size; + end; + i := MedColObj.GetNext; + end; + until i < 0; + end; + update_artist_view; + update_title_view; - tmps := ByteToFmtString(FreeSpaceOnDAP + sizediff, 3, 2); - StatusBar1.Panels[1].Text := 'Device connected '+tmps+' Free'; - End; -End; + tmps := ByteToFmtString(FreeSpaceOnDAP + sizediff, 3, 2); + StatusBar1.Panels[1].Text := 'Device connected ' + tmps + ' Free'; + end; +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TMain.MenuItem33Click(Sender: TObject); +procedure TMain.MenuItem33Click(Sender: TObject); -Var MedFileObj: TMediaFileClass; +var + MedFileObj: TMediaFileClass; tsnode: TTreeNode; -Begin - If ArtistTree.Selected<>Nil Then - Begin - tsnode := ArtistTree.Selected; - MedFileObj := TMediaFileClass(tsnode.data); - If tsnode.level= 1 Then - Begin - editid3win.display_window(MedFileObj, ARTIST_MODE); - End; - If tsnode.level= 2 Then - Begin - editid3win.display_window(MedFileObj, ALBUM_MODE); - End; - EditID3win.ShowModal; - End; -End; +begin + if ArtistTree.Selected <> nil then + begin + tsnode := ArtistTree.Selected; + MedFileObj := TMediaFileClass(tsnode.Data); + if tsnode.level = 1 then + begin + editid3win.display_window(MedFileObj, ARTIST_MODE); + end; + if tsnode.level = 2 then + begin + editid3win.display_window(MedFileObj, ALBUM_MODE); + end; + EditID3win.ShowModal; + end; +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TMain.rm_artist_playeritemClick(Sender: TObject); +procedure TMain.rm_artist_playeritemClick(Sender: TObject); -Var MedColObj: TMediaCollectionClass; +var + MedColObj: TMediaCollectionClass; tmps: string; MedFileObj: TMediaFileClass; i, z: integer; tsnode: TTreeNode; -Begin +begin tsnode := ArtistTree.Selected; - If (tsnode<>Nil) And (tsnode.level>0) And player_connected Then - Begin - MedFileObj := TMediaFileClass(tsnode.data); - MedColObj := MedFileObj.collection; - If tsnode.level=2 Then //remove one album - Begin - i := PlayerCol.getTracks(MedFileObj.Artist, MedFileObj.Album); - Repeat - Begin - If PlayerCol.Items[i].Action=AONPLAYER Then - Begin - PlayerCol.items[i].action := AREMOVE; - For z:= 0 To MediaCollection.ItemCount-1 Do - If PlayerCol.items[i].id=MediaCollection.items[z].id Then MediaCollection.items[z].action := AREMOVE; - sizediff := sizediff + PlayerCol.items[i].size; - End; - i := PlayerCol.getNext; - End; - Until (i<0); - End; - If tsnode.level=1 Then //remove the SrchArtItem - Begin - i := PlayerCol.getTracks(MedFileObj.Artist); - Repeat - Begin - If PlayerCol.items[i].action=AONPLAYER Then - Begin - PlayerCol.items[i].action := AREMOVE; - For z:= 0 To MediaCollection.ItemCount-1 Do - If PlayerCol.items[i].id=MediaCollection.items[z].id Then MediaCollection.items[ - z].action := AREMOVE; - sizediff := sizediff + PlayerCol.items[i].size; - End; - i := PlayerCol.getNext; - End; - Until (i<0); - End; - update_artist_view; - update_title_view; - - tmps := ByteToFmtString(FreeSpaceOnDAP + sizediff, 3, 2); - StatusBar1.Panels[1].Text := 'Device connected '+tmps+' Free'; - End; -End; + if (tsnode <> nil) and (tsnode.level > 0) and player_connected then + begin + MedFileObj := TMediaFileClass(tsnode.Data); + MedColObj := MedFileObj.collection; + if tsnode.level = 2 then //remove one album + begin + i := PlayerCol.getTracks(MedFileObj.Artist, MedFileObj.Album); + repeat + begin + if PlayerCol.Items[i].Action = AONPLAYER then + begin + PlayerCol.items[i].action := AREMOVE; + for z := 0 to MediaCollection.ItemCount - 1 do + if PlayerCol.items[i].id = MediaCollection.items[z].id then + MediaCollection.items[z].action := AREMOVE; + sizediff := sizediff + PlayerCol.items[i].size; + end; + i := PlayerCol.getNext; + end; + until (i < 0); + end; + if tsnode.level = 1 then //remove the SrchArtItem + begin + i := PlayerCol.getTracks(MedFileObj.Artist); + repeat + begin + if PlayerCol.items[i].action = AONPLAYER then + begin + PlayerCol.items[i].action := AREMOVE; + for z := 0 to MediaCollection.ItemCount - 1 do + if PlayerCol.items[i].id = MediaCollection.items[z].id then + MediaCollection.items[ + z].action := AREMOVE; + sizediff := sizediff + PlayerCol.items[i].size; + end; + i := PlayerCol.getNext; + end; + until (i < 0); + end; + update_artist_view; + update_title_view; + + tmps := ByteToFmtString(FreeSpaceOnDAP + sizediff, 3, 2); + StatusBar1.Panels[1].Text := 'Device connected ' + tmps + ' Free'; + end; +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TMain.searchstrClick(Sender: TObject); -Begin +procedure TMain.searchstrClick(Sender: TObject); +begin ArtistSrchField.Hide; -End; +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TMain.syncplayeritem(Sender: TObject); +procedure TMain.syncplayeritem(Sender: TObject); -Var +var newfile: string; n: integer; ucount, rcount: integer; bytesneeded: int64; -Begin - If player_connected=false Then - Begin - ShowMessage(rsNotConnected); - exit; - End; +begin + if player_connected = False then + begin + ShowMessage(rsNotConnected); + exit; + end; StatusBar1.Panels[1].Text := 'Calculating...'; rcount := 1; ucount := 1; bytesneeded := 0; //Calculation the disk space that has to be available on player - SyncThread := TSyncThread.Create(true); + SyncThread := TSyncThread.Create(True); SyncThread.Target := PlayerCol.savepath; - Enabled := false; - For n:= 0 To MediaCollection.ItemCount-1 Do - Begin - //search for uploads in mediacollection - If MediaCollection.items[n].action=AUPLOAD Then - Begin - inc(ucount); - bytesneeded := bytesneeded + MediaCollection.items[n].size; - If CactusConfig.mobile_subfolders Then - Begin - If Not DirectoryExists(CactusConfig.DAPPath+lowercase(MediaCollection.items[n].Artist) - ) Then mkdir(CactusConfig.DAPPath+lowercase(MediaCollection.items[n].Artist)); - newfile := CactusConfig.DAPPath+lowercase(MediaCollection.items[n].Artist)+'/'+ - ExtractFileName(MediaCollection.items[n].path); - End - Else - newfile := CactusConfig.DAPPath+ExtractFileName(MediaCollection.items[n].path); - DoDirSeparators(newfile); - SyncThread.copyFile(MediaCollection.items[n].path, newfile); - End; - End; - For n:= 0 To PlayerCol.ItemCount-1 Do - Begin - //find files to be deleted in playercollection - If PlayerCol.items[n].action=AREMOVE Then - Begin - inc(rcount); - bytesneeded := bytesneeded - PlayerCol.items[n].size; - SyncThread.deleteFile(PlayerCol.items[n].path); - DebugOutLn(PlayerCol.items[n].path+' to be deleted', 2); - End; - End; - Enabled := true; + Enabled := False; + for n := 0 to MediaCollection.ItemCount - 1 do + begin + //search for uploads in mediacollection + if MediaCollection.items[n].action = AUPLOAD then + begin + Inc(ucount); + bytesneeded := bytesneeded + MediaCollection.items[n].size; + if CactusConfig.mobile_subfolders then + begin + if not DirectoryExists(CactusConfig.DAPPath + lowercase( + MediaCollection.items[n].Artist)) then + mkdir(CactusConfig.DAPPath + lowercase(MediaCollection.items[n].Artist)); + newfile := CactusConfig.DAPPath + lowercase( + MediaCollection.items[n].Artist) + '/' + ExtractFileName( + MediaCollection.items[n].path); + end + else + newfile := CactusConfig.DAPPath + ExtractFileName( + MediaCollection.items[n].path); + DoDirSeparators(newfile); + SyncThread.copyFile(MediaCollection.items[n].path, newfile); + end; + end; + for n := 0 to PlayerCol.ItemCount - 1 do + begin + //find files to be deleted in playercollection + if PlayerCol.items[n].action = AREMOVE then + begin + Inc(rcount); + bytesneeded := bytesneeded - PlayerCol.items[n].size; + SyncThread.deleteFile(PlayerCol.items[n].path); + DebugOutLn(PlayerCol.items[n].path + ' to be deleted', 2); + end; + end; + Enabled := True; - If FreeSpaceOnDAP < bytesneeded Then - Begin - //Check if there is enough free disk space on player - ShowMessage('ERROR: Not enough free disk space on mobile device!'); - StatusBar1.Panels[1].Text := 'Ready'; - SyncThread.Free; - exit; - //Free thread and exit - End; + if FreeSpaceOnDAP < bytesneeded then + begin + //Check if there is enough free disk space on player + ShowMessage('ERROR: Not enough free disk space on mobile device!'); + StatusBar1.Panels[1].Text := 'Ready'; + SyncThread.Free; + exit; + //Free thread and exit + end; - checkmobile.Enabled := false; + checkmobile.Enabled := False; disconnectDAP; StatusBar1.Panels[1].Text := 'Please Wait...'; SyncThread.Resume; -End; +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TMain.MenuItem3Click(Sender: TObject); +procedure TMain.MenuItem3Click(Sender: TObject); -Var s1, s2: string; +var + s1, s2: string; i: integer; -Begin - If playlist.selected<>Nil Then - Begin - i := playlist.selected.index; - PlayerObj.playlist.remove(i); - Playlist.Selected.delete; - s1 := IntToStr((PlayerObj.Playlist.TotalPlayTime Div 60) Mod 60 ); - s2 := IntToStr((PlayerObj.Playlist.TotalPlayTime Div 60) Div 60 ); - playlist.Column[0].Caption := rsPlaylist+' ('+IntToStr(PlayerObj.Playlist. - ItemCount)+' Files/ '+s2+'h '+s1+'min )'; - If (i>=1) And (i=playlist.items.count) Then dec(i); - playlist.selected := playlist.items[i]; - End; -End; +begin + if playlist.selected <> nil then + begin + i := playlist.selected.index; + PlayerObj.playlist.remove(i); + Playlist.Selected.Delete; + s1 := IntToStr((PlayerObj.Playlist.TotalPlayTime div 60) mod 60); + s2 := IntToStr((PlayerObj.Playlist.TotalPlayTime div 60) div 60); + playlist.Column[0].Caption := + rsPlaylist + ' (' + IntToStr( + PlayerObj.Playlist.ItemCount) + + ' Files/ ' + s2 + 'h ' + s1 + 'min )'; + if (i >= 1) and (i = playlist.items.Count) then + Dec(i); + playlist.selected := playlist.items[i]; + end; +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TMain.MenuItem22aClick(Sender: TObject); -Begin - If PlayerObj.playing Then - artist_to_playlist_at(PlayerObj.CurrentTrack+1) - Else artist_to_playlist; -End; +procedure TMain.MenuItem22aClick(Sender: TObject); +begin + if PlayerObj.playing then + artist_to_playlist_at(PlayerObj.CurrentTrack + 1) + else + artist_to_playlist; +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TMain.RemoveClick(Sender: TObject); -Begin - MediaCollection.clear; +procedure TMain.RemoveClick(Sender: TObject); +begin + MediaCollection.Clear; TitleTree.Items.Clear; ArtistTree.Items.Clear; Playlist.Items.Clear; -End; +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TMain.QuitItemClick(Sender: TObject); -Begin - Main.close; +procedure TMain.QuitItemClick(Sender: TObject); +begin + Main.Close; Application.ProcessMessages; // halt; Application.Terminate; // Application.Free; -End; +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TMain.MoveNode(TargetNode, SourceNode : TTreeNode); +procedure TMain.MoveNode(TargetNode, SourceNode: TTreeNode); -Var - nodeTmp : TTreeNode; -Begin +var + nodeTmp: TTreeNode; +begin { with Selecttree do begin @@ -4055,327 +4295,364 @@ Begin MoveNode(nodeTmp,SourceNode.items[i]); end; end;} -End; +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TMain.titlelistmenuPopup(Sender: TObject); +procedure TMain.titlelistmenuPopup(Sender: TObject); -Var MedFileObj: TMediaFileClass; -Begin +var + MedFileObj: TMediaFileClass; +begin writeln('titletree popupmenu'); - If TitleTree.Selected<>Nil Then - Begin - MedFileObj := TMediaFileClass(TitleTree.Selected.Data); - // Menuitem16.ImageIndex:=1; - If MedFileObj.collection=PlayerCol Then - Begin - Menuitem16.enabled := false; - Menuitem14.enabled := true; - End - Else - Begin - Menuitem16.enabled := false; - //upload - Menuitem14.Enabled := false; - //remove + if TitleTree.Selected <> nil then + begin + MedFileObj := TMediaFileClass(TitleTree.Selected.Data); + // Menuitem16.ImageIndex:=1; + if MedFileObj.collection = PlayerCol then + begin + Menuitem16.Enabled := False; + Menuitem14.Enabled := True; + end + else + begin + Menuitem16.Enabled := False; + //upload + Menuitem14.Enabled := False; + //remove - If MedFileObj.action=-1 Then - Begin - Menuitem16.enabled := true; - End; + if MedFileObj.action = -1 then + begin + Menuitem16.Enabled := True; + end; - If MedFileObj.action=1 Then - Begin - Menuitem14.enabled := true; - End; - End; - If player_connected=false Then - Begin - MenuItem16.Visible := false; - menuitem14.Visible := false; - menuitem20.Visible := false; - menuitem11.Visible := false; - End; - End; -End; + if MedFileObj.action = 1 then + begin + Menuitem14.Enabled := True; + end; + end; + if player_connected = False then + begin + MenuItem16.Visible := False; + menuitem14.Visible := False; + menuitem20.Visible := False; + menuitem11.Visible := False; + end; + end; +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TMain.toggle_playpause(Sender: TObject); -Begin - If PlayerObj.playing Then pauseClick(Nil) - Else playClick(Nil); -End; +procedure TMain.toggle_playpause(Sender: TObject); +begin + if PlayerObj.playing then + pauseClick(nil) + else + playClick(nil); +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TMain.trackbarMouseDown(Sender: TOBject; Button: TMouseButton; - Shift: TShiftState; X, Y: Integer); -Begin - playtimer.enabled := false; -End; +procedure TMain.trackbarMouseDown(Sender: TObject; Button: TMouseButton; + Shift: TShiftState; X, Y: integer); +begin + playtimer.Enabled := False; +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TMain.trackbarMouseUp(Sender: TOBject; Button: TMouseButton; - Shift: TShiftState; X, Y: Integer); +procedure TMain.trackbarMouseUp(Sender: TObject; Button: TMouseButton; + Shift: TShiftState; X, Y: integer); -Var k: real; +var + k: real; i: integer; -Begin - k := (x*100) / trackbar.Width; - i:=round(k); +begin + k := (x * 100) / trackbar.Width; + i := round(k); PlayerObj.set_fileposition(i); trackbar.Position := i; - If PlayerObj.playing Then playtimer.enabled := true; -End; + if PlayerObj.playing then + playtimer.Enabled := True; +end; procedure TMain.TrayIconClick(Sender: TObject); begin - if not Visible then begin + if not Visible then + begin Show; BringToFront; - end else begin + end + else + begin Hide; end; end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TMain.undoSyncItemClick(Sender: TObject); +procedure TMain.undoSyncItemClick(Sender: TObject); -Var tmps: string; +var + tmps: string; i: integer; -Begin - Begin - For i:= 1 To MediaCollection.ItemCount-1 Do - Begin - If MediaCollection.items[i].action=AUPLOAD Then MediaCollection.items[i].action := - ANOTHING - ; - If MediaCollection.items[i].action=AREMOVE Then MediaCollection.items[i].action := - AONPLAYER - ; - End; +begin + begin + for i := 1 to MediaCollection.ItemCount - 1 do + begin + if MediaCollection.items[i].action = AUPLOAD then + MediaCollection.items[i].action := + ANOTHING + ; + if MediaCollection.items[i].action = AREMOVE then + MediaCollection.items[i].action := + AONPLAYER + ; + end; - For i:= 1 To PlayerCol.ItemCount-1 Do - Begin - If PlayerCol.items[i].action=AUPLOAD Then PlayerCol.items[i].action := ANOTHING; - If PlayerCol.items[i].action=AREMOVE Then PlayerCol.items[i].action := AONPLAYER; - End; - update_artist_view; - update_title_view; - sizediff := 0; + for i := 1 to PlayerCol.ItemCount - 1 do + begin + if PlayerCol.items[i].action = AUPLOAD then + PlayerCol.items[i].action := ANOTHING; + if PlayerCol.items[i].action = AREMOVE then + PlayerCol.items[i].action := AONPLAYER; + end; + update_artist_view; + update_title_view; + sizediff := 0; - tmps := ByteToFmtString(FreeSpaceOnDAP, 3, 2); - StatusBar1.Panels[1].Text := 'Device connected '+tmps+' Free'; - End; -End; + tmps := ByteToFmtString(FreeSpaceOnDAP, 3, 2); + StatusBar1.Panels[1].Text := 'Device connected ' + tmps + ' Free'; + end; +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TMain.TitleTreeDblClick(Sender: TObject); -Begin +procedure TMain.TitleTreeDblClick(Sender: TObject); +begin Application.ProcessMessages; title_to_playlist; Application.ProcessMessages; -End; +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure title_to_playlist_at(index: integer); +procedure title_to_playlist_at(index: integer); -Var tsnode: TListitem; +var + tsnode: TListitem; listitem: TListitem; MedFileObj: TMediaFileClass; -Begin +begin tsnode := main.TitleTree.Selected; - If (tsnode<>Nil) And (tsnode.ImageIndex<>4) Then - Begin - If main.Playlist.Items.Count=0 Then - Begin - title_to_playlist; - exit; - End; - MedFileObj := TMediaFileClass(tsnode.data); + if (tsnode <> nil) and (tsnode.ImageIndex <> 4) then + begin + if main.Playlist.Items.Count = 0 then + begin + title_to_playlist; + exit; + end; + MedFileObj := TMediaFileClass(tsnode.Data); - PlayerObj.playlist.Insert(index, MedFileObj); + PlayerObj.playlist.Insert(index, MedFileObj); - ListItem := Main.Playlist.Items.Insert(index); - listitem.data := MedFileObj; - listitem.MakeVisible(false); - If MedFileObj.title<>'' Then ListItem.Caption := MedFileObj.Artist+' - '+MedFileObj.title - Else ListItem.Caption := extractfilename(MedFileObj.path); - End; - main.playlist.Column[0].Caption := rsPlaylist+' ('+IntToStr( - PlayerObj.playlist.ItemCount)+' Files/ '+PlayerObj. - Playlist.TotalPlayTimeStr +')'; -End; + ListItem := Main.Playlist.Items.Insert(index); + listitem.Data := MedFileObj; + listitem.MakeVisible(False); + if MedFileObj.title <> '' then + ListItem.Caption := MedFileObj.Artist + ' - ' + MedFileObj.title + else + ListItem.Caption := extractfilename(MedFileObj.path); + end; + main.playlist.Column[0].Caption := + rsPlaylist + ' (' + IntToStr( + PlayerObj.playlist.ItemCount) + + ' Files/ ' + PlayerObj.Playlist.TotalPlayTimeStr + ')'; +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure title_to_playlist; +procedure title_to_playlist; -Var tsnode: TListitem; +var + tsnode: TListitem; listitem: TListitem; MedFileObj: TMediaFileClass; -Begin +begin tsnode := main.TitleTree.Selected; DebugOutLn('title to playlist', 5); - If (tsnode<>Nil) And (tsnode.ImageIndex<>4) Then - Begin - DebugOutLn('title to playlist2', 5); - MedFileObj := TMediaFileClass(tsnode.data); + if (tsnode <> nil) and (tsnode.ImageIndex <> 4) then + begin + DebugOutLn('title to playlist2', 5); + MedFileObj := TMediaFileClass(tsnode.Data); - PlayerObj.playlist.add(MedFileObj); + PlayerObj.playlist.add(MedFileObj); - ListItem := Main.Playlist.Items.Add; - listitem.data := MedFileObj; - listitem.MakeVisible(false); - // listitem.Focused:=true; - If MedFileObj.title<>'' Then ListItem.Caption := MedFileObj.Artist+' - '+MedFileObj.title - Else ListItem.Caption := extractfilename(MedFileObj.path); - If Not PlayerObj.playing And CactusConfig.AutostartPlay And (main.Playlist.Items.Count - =1) Then - Begin - DebugOutLn('title to playlist3', 5); - main.Playlist.Selected := Main.Playlist.Items[0]; - DebugOutLn(Main.Playlist.Selected.Caption, 3); - Main.playClick(main); - End; - End; - main.playlist.Column[0].Caption := rsPlaylist+' ('+IntToStr( - PlayerObj.playlist.ItemCount)+' Files/ '+PlayerObj. - Playlist.TotalPlayTimeStr +')'; -End; + ListItem := Main.Playlist.Items.Add; + listitem.Data := MedFileObj; + listitem.MakeVisible(False); + // listitem.Focused:=true; + if MedFileObj.title <> '' then + ListItem.Caption := MedFileObj.Artist + ' - ' + MedFileObj.title + else + ListItem.Caption := extractfilename(MedFileObj.path); + if not PlayerObj.playing and CactusConfig.AutostartPlay and + (main.Playlist.Items.Count = 1) then + begin + DebugOutLn('title to playlist3', 5); + main.Playlist.Selected := Main.Playlist.Items[0]; + DebugOutLn(Main.Playlist.Selected.Caption, 3); + Main.playClick(main); + end; + end; + main.playlist.Column[0].Caption := + rsPlaylist + ' (' + IntToStr( + PlayerObj.playlist.ItemCount) + + ' Files/ ' + PlayerObj.Playlist.TotalPlayTimeStr + ')'; +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure artist_to_playlist_at(index: integer); +procedure artist_to_playlist_at(index: integer); -Var tsnode: TTreeNode; +var + tsnode: TTreeNode; curartist, curalbum: string; Listitem: TListitem; album_mode: boolean; MedColObj: TMediaCollectionClass; MedFileObj: TMediaFileClass; z: integer; -Begin +begin tsnode := Main.ArtistTree.Selected; - If main.Playlist.Items.Count=0 Then - Begin - artist_to_playlist; - exit; - End; + if main.Playlist.Items.Count = 0 then + begin + artist_to_playlist; + exit; + end; - If (tsnode<>Nil) And (tsnode.Level>0) Then - Begin - If tsnode.level<2 Then album_mode := false - Else album_mode := true; - MedFileObj := TMediaFileClass(tsnode.data); - MedColObj := MedFileObj.Collection; - curartist := lowercase(MedFileObj.Artist); - curalbum := lowercase(MedFileObj.Album); - z := MedColObj.getTracks(MedFileObj.Artist, MedFileObj.index); - Repeat - Begin - DebugOutLn(MedColObj.items[z].title, 3); - If (album_mode=false) Or ((album_mode=true) And (lowercase(MedColObj.items[z].album)= - curalbum)) Then - Begin - PlayerObj.playlist.insert(index, MedColObj.items[z]); - ListItem := Main.Playlist.Items.Insert(index); - inc(index); - listitem.data := MedColObj.items[z]; - // Listitem.Focused:=true; - If MedColObj.items[z].title<>'' Then ListItem.Caption := MedColObj.items[z].Artist+ - ' - '+MedColObj.items[z]. - title - Else ListItem.Caption := extractfilename(MedColObj.items[z].path); - End; - z := MedColObj.GetNext; - End; - Until z<0; - Listitem.MakeVisible(false); - End; - main.playlist.Column[0].Caption := rsPlaylist+' ('+IntToStr(PlayerObj.playlist. - ItemCount)+' Files/ '+PlayerObj.Playlist. - TotalPlayTimeStr+' )'; -End; + if (tsnode <> nil) and (tsnode.Level > 0) then + begin + if tsnode.level < 2 then + album_mode := False + else + album_mode := True; + MedFileObj := TMediaFileClass(tsnode.Data); + MedColObj := MedFileObj.Collection; + curartist := lowercase(MedFileObj.Artist); + curalbum := lowercase(MedFileObj.Album); + z := MedColObj.getTracks(MedFileObj.Artist, MedFileObj.index); + repeat + begin + DebugOutLn(MedColObj.items[z].title, 3); + if (album_mode = False) or ((album_mode = True) and + (lowercase(MedColObj.items[z].album) = curalbum)) then + begin + PlayerObj.playlist.insert(index, MedColObj.items[z]); + ListItem := Main.Playlist.Items.Insert(index); + Inc(index); + listitem.Data := MedColObj.items[z]; + // Listitem.Focused:=true; + if MedColObj.items[z].title <> '' then + ListItem.Caption := MedColObj.items[z].Artist + + ' - ' + + MedColObj.items[z]. + title + else + ListItem.Caption := extractfilename(MedColObj.items[z].path); + end; + z := MedColObj.GetNext; + end; + until z < 0; + Listitem.MakeVisible(False); + end; + main.playlist.Column[0].Caption := + rsPlaylist + ' (' + IntToStr( + PlayerObj.playlist.ItemCount) + + ' Files/ ' + PlayerObj.Playlist.TotalPlayTimeStr + ' )'; +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure artist_to_playlist; +procedure artist_to_playlist; -Var tsnode: TTreeNode; +var + tsnode: TTreeNode; curartist, curalbum: string; Listitem: TListitem; album_mode: boolean; MedColObj: TMediaCollectionClass; MedFileObj: TMediaFileClass; z, oldcount: integer; -Begin +begin //TODO: add album to playlist sorted by TRACK tsnode := Main.ArtistTree.Selected; - If (tsnode<>Nil) And (tsnode.Level>0) Then - Begin - oldcount := main.Playlist.Items.Count; - If tsnode.level<2 Then album_mode := false - Else album_mode := true; - MedFileObj := TMediaFileClass(tsnode.data); - MedColObj := MedFileObj.Collection; - curartist := lowercase(MedFileObj.Artist); - curalbum := lowercase(MedFileObj.Album); - z := MedColObj.getTracks(MedFileObj.Artist, MedFileObj.index); - Repeat - Begin - DebugOutLn(MedColObj.items[z].title, 3); - If (album_mode=false) Or ((album_mode=true) And (lowercase(MedColObj.items[z].album)= - curalbum)) Then - Begin - PlayerObj.playlist.add(MedColObj.items[z]); - ListItem := Main.Playlist.Items.Add; - listitem.data := MedColObj.items[z]; - // Listitem.Focused:=true; - If MedColObj.items[z].title<>'' Then ListItem.Caption := MedColObj.items[z].Artist+ - ' - '+MedColObj.items[z]. - title - Else ListItem.Caption := extractfilename(MedColObj.items[z].path); - End; - z := MedColObj.GetNext; - End; - Until z<0; - Listitem.MakeVisible(false); - If CactusConfig.AutostartPlay And (oldcount=0) And (main.Playlist.Items.Count>0) Then - Begin - main.Playlist.Selected := Main.Playlist.Items[0]; - Main.playClick(main); - End; - End; - main.playlist.Column[0].Caption := rsplaylist+' ('+IntToStr(PlayerObj.playlist. - ItemCount)+' Files/ '+PlayerObj.Playlist. - TotalPlayTimeStr+' )'; -End; + if (tsnode <> nil) and (tsnode.Level > 0) then + begin + oldcount := main.Playlist.Items.Count; + if tsnode.level < 2 then + album_mode := False + else + album_mode := True; + MedFileObj := TMediaFileClass(tsnode.Data); + MedColObj := MedFileObj.Collection; + curartist := lowercase(MedFileObj.Artist); + curalbum := lowercase(MedFileObj.Album); + z := MedColObj.getTracks(MedFileObj.Artist, MedFileObj.index); + repeat + begin + DebugOutLn(MedColObj.items[z].title, 3); + if (album_mode = False) or ((album_mode = True) and + (lowercase(MedColObj.items[z].album) = curalbum)) then + begin + PlayerObj.playlist.add(MedColObj.items[z]); + ListItem := Main.Playlist.Items.Add; + listitem.Data := MedColObj.items[z]; + // Listitem.Focused:=true; + if MedColObj.items[z].title <> '' then + ListItem.Caption := MedColObj.items[z].Artist + + ' - ' + + MedColObj.items[z]. + title + else + ListItem.Caption := extractfilename(MedColObj.items[z].path); + end; + z := MedColObj.GetNext; + end; + until z < 0; + Listitem.MakeVisible(False); + if CactusConfig.AutostartPlay and (oldcount = 0) and + (main.Playlist.Items.Count > 0) then + begin + main.Playlist.Selected := Main.Playlist.Items[0]; + Main.playClick(main); + end; + end; + main.playlist.Column[0].Caption := + rsplaylist + ' (' + IntToStr( + PlayerObj.playlist.ItemCount) + + ' Files/ ' + PlayerObj.Playlist.TotalPlayTimeStr + ' )'; +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure update_title_view; +procedure update_title_view; -Var tsnode: TTreeNode; +var + tsnode: TTreeNode; curartist, curalbum: string; Listitem: TListItem; album_mode: boolean; MedColObj: TMediaCollectionClass; MedFileObj: TMediaFileClass; i: integer; -Begin +begin tsnode := Main.ArtistTree.Selected; main.StatusBar1.Panels[0].Text := 'Please wait... updating...'; DebugOutLn('', 2); DebugOut('## update title view...', 2); - main.TitleTree.Selected:=nil; + main.TitleTree.Selected := nil; Main.TitleTree.Clear; {$ifndef LCLGtk2} @@ -4383,197 +4660,209 @@ Begin {$endif} {$ifdef LCLGtk2} - DebugOut(' ', 2); + DebugOut(' ', + 2); //TODO: BeginUpdate/EndUpdate disabled in GTK2 due to some bugs in LCL {$endif} DebugOut(' cleared items... ', 2); - If (tsnode<>Nil) And (tsnode.level>0) Then - Begin - If tsnode.level=2 Then album_mode := true - Else album_mode := false; + if (tsnode <> nil) and (tsnode.level > 0) then + begin + if tsnode.level = 2 then + album_mode := True + else + album_mode := False; - MedFileObj := TMediaFileClass(tsnode.data); - MedColObj := MedFileObj.Collection; - curartist := lowercase(MedFileObj.Artist); - curalbum := lowercase(MedFileObj.album); - DebugOut(curartist, 2); + MedFileObj := TMediaFileClass(tsnode.Data); + MedColObj := MedFileObj.Collection; + curartist := lowercase(MedFileObj.Artist); + curalbum := lowercase(MedFileObj.album); + DebugOut(curartist, 2); - i := MedColObj.getTracks(MedFileObj.Artist, 0{MedFileObj.index}); + i := MedColObj.getTracks(MedFileObj.Artist, 0{MedFileObj.index}); - Repeat - Begin - If (album_mode=false) Or ((album_mode) And (curalbum=lowercase(MedColObj.items[i].album))) - Then - Begin - ListItem := Main.Titletree.Items.Add; - MedColObj.items[i].index := i; - listitem.data := MedColObj.items[i]; - Listitem.ImageIndex := MedColObj.items[i].action; - Listitem.caption := ''; + repeat + begin + if (album_mode = False) or ((album_mode) and + (curalbum = lowercase(MedColObj.items[i].album))) then + begin + ListItem := Main.Titletree.Items.Add; + MedColObj.items[i].index := i; + listitem.Data := MedColObj.items[i]; + Listitem.ImageIndex := MedColObj.items[i].action; + Listitem.Caption := ''; - If MedColObj.items[i].title<>'' Then - ListItem.SubItems.Add((MedColObj.items[i].Artist)) - Else ListItem.SubItems.Add(SysToUTF8(extractfilename(MedColObj.items[i].path))); + if MedColObj.items[i].title <> '' then + ListItem.SubItems.Add(MedColObj.items[i].Artist) + else + ListItem.SubItems.Add(SysToUTF8(ExtractFileName(MedColObj.items[i].path))); - ListItem.SubItems.Add((MedColObj.items[i].title)); - ListItem.SubItems.Add((MedColObj.items[i].album)); - ListItem.SubItems.Add(MedColObj.items[i].track); - ListItem.SubItems.Add(ID3Genre[MedColObj.items[i].GenreID]); - ListItem.SubItems.Add(SysToUTF8(ExtractFileName(MedColObj.items[i].Path))); - ListItem.SubItems.Add(MedColObj.items[i].playtime); - - End; - i := MedColObj.GetNext; - End; - Until (i<0); - End; - if CactusConfig.SortAlbumByTrack and album_mode then main.TitleTreeColumnClick(main, main.TitleTree.Column[4]); + ListItem.SubItems.Add((MedColObj.items[i].title)); + ListItem.SubItems.Add((MedColObj.items[i].album)); + ListItem.SubItems.Add(MedColObj.items[i].track); + ListItem.SubItems.Add(ID3Genre[MedColObj.items[i].GenreID]); + ListItem.SubItems.Add(SysToUTF8(ExtractFileName(MedColObj.items[i].Path))); + ListItem.SubItems.Add(MedColObj.items[i].playtime); + end; + i := MedColObj.GetNext; + end; + until (i < 0); + end; + if CactusConfig.SortAlbumByTrack and album_mode then + main.TitleTreeColumnClick(main, main.TitleTree.Column[4]); DebugOutLn(' finished title view ##', 2); {$ifndef LCLGtk2} Main.TitleTree.EndUpdate; {$endif} main.StatusBar1.Panels[0].Text := 'Ready.'; -End; +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TMain.update_playlist; +procedure TMain.update_playlist; -Var +var MedfileObj: TMediaFileClass; i: integer; -Begin +begin - For i:= 0 To PlayerObj.Playlist.ItemCount-1 Do - Begin - MedfileObj := TMediaFileClass(playlist.Items[i].Data); - PlayerObj.Playlist.Items[i].update(MedfileObj); + for i := 0 to PlayerObj.Playlist.ItemCount - 1 do + begin + MedfileObj := TMediaFileClass(playlist.Items[i].Data); + PlayerObj.Playlist.Items[i].update(MedfileObj); - If MedfileObj.title<>'' Then - playlist.Items[i].caption := MedfileObj.Artist+' - '+MedfileObj.title - Else - playlist.Items[i].caption := extractfilename(MedfileObj.path); - End; + if MedfileObj.title <> '' then + playlist.Items[i].Caption := MedfileObj.Artist + ' - ' + MedfileObj.title + else + playlist.Items[i].Caption := extractfilename(MedfileObj.path); + end; update_player_display; -End; +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Procedure TMain.disconnectDAP; +procedure TMain.disconnectDAP; -Var i : integer; -Begin - if player_connected then begin - DebugOutLn('### Disconnect DAP ###', 2); - Enabled := false; - i := 0; - While i < playlist.Items.Count Do - Begin - If TMediaFileClass(playlist.Items[i].Data).collection=PlayerCol Then - Begin - PlayerObj.playlist.remove(i); - If PlayerObj.Playlist.ItemCount<>0 Then Playlist.Items[i].Delete; - dec(i); - End; - inc(i); - End; - FreeAndNil(PlayerCol); - player_connected := false; - For i:= 1 To MediaCollection.ItemCount-1 Do - MediaCollection.items[i].action := -1; - ArtistTree.Selected := Nil; - Enabled := true; - update_artist_view; - update_title_view; - end; -End; +var + i: integer; +begin + if player_connected then + begin + DebugOutLn('### Disconnect DAP ###', 2); + Enabled := False; + i := 0; + while i < playlist.Items.Count do + begin + if TMediaFileClass(playlist.Items[i].Data).collection = PlayerCol then + begin + PlayerObj.playlist.remove(i); + if PlayerObj.Playlist.ItemCount <> 0 then + Playlist.Items[i].Delete; + Dec(i); + end; + Inc(i); + end; + FreeAndNil(PlayerCol); + player_connected := False; + for i := 1 to MediaCollection.ItemCount - 1 do + MediaCollection.items[i].action := -1; + ArtistTree.Selected := nil; + Enabled := True; + update_artist_view; + update_title_view; + end; +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Function TMain.connectDAP: byte; +function TMain.connectDAP: byte; -Var i, z: integer; -Begin +var + i, z: integer; +begin Result := 255; - PlayerCol := TMediaCollectionClass.create; + PlayerCol := TMediaCollectionClass.Create; PlayerCol.PathFmt := FRelative; DebugOutLn('### ConnectDAP ###', 2); - If PlayerCol.LoadFromFile(CactusConfig.DAPPath+'cactuslib')=true Then - Begin + if PlayerCol.LoadFromFile(CactusConfig.DAPPath + 'cactuslib') = True then + begin - sizediff := 0; - For i:= 0 To PlayerCol.ItemCount-1 Do - Begin - z := 0; - PlayerCol.items[i].action := AONPLAYER; - While z < MediaCollection.ItemCount-1 Do - Begin - If MediaCollection.items[z].id=PlayerCol.items[i].id Then - Begin - MediaCollection.items[z].action := AONPLAYER; - z := MediaCollection.ItemCount-1; - End; - inc(z); - End; + sizediff := 0; + for i := 0 to PlayerCol.ItemCount - 1 do + begin + z := 0; + PlayerCol.items[i].action := AONPLAYER; + while z < MediaCollection.ItemCount - 1 do + begin + if MediaCollection.items[z].id = PlayerCol.items[i].id then + begin + MediaCollection.items[z].action := AONPLAYER; + z := MediaCollection.ItemCount - 1; + end; + Inc(z); + end; - End; - player_connected := true; - update_artist_view; - update_title_view; - checkmobile.Enabled := true; - result := 0; - End - Else - freeandnil(PlayerCol); -End; + end; + player_connected := True; + update_artist_view; + update_title_view; + checkmobile.Enabled := True; + Result := 0; + end + else + FreeAndNil(PlayerCol); +end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ procedure TMain.TestPlugin1(Sender: TObject); var - tt :TCJ_Signals; + tt: TCJ_Signals; begin - //TestPluginI :=CJ_Interface.GetMenu.Add(-CJ_MAINMENU_PLUGINS, 'Hello World...', @SayHello); - //TestPluginI :=CJ_Interface.GetMenu.Add(-CJ_MAINMENU_ROOT, 'Hello World...', @SayHello); - TestPluginI :=CJ_Interface.GetMenu.Add(-CJ_TRAYMENU_ROOT, 'Hello World...', @SayHello); - tt :=CJ_Interface.GetSignals; - if tt<>nil then - begin - tt.Connect(@SayMsgHello, 1); - tt.Connect(@SayMsgHello2, 1); - tt.Connect(@SayMsgHello, 1); //Test for no insertion of this.... - end; + //TestPluginI :=CJ_Interface.GetMenu.Add(-CJ_MAINMENU_PLUGINS, 'Hello World...', @SayHello); + //TestPluginI :=CJ_Interface.GetMenu.Add(-CJ_MAINMENU_ROOT, 'Hello World...', @SayHello); + TestPluginI := CJ_Interface.GetMenu.Add(-CJ_TRAYMENU_ROOT, + 'Hello World...', @SayHello); + tt := CJ_Interface.GetSignals; + if tt <> nil then + begin + tt.Connect(@SayMsgHello, 1); + tt.Connect(@SayMsgHello2, 1); + tt.Connect(@SayMsgHello, 1); //Test for no insertion of this.... + end; end; procedure TMain.SayHello(Sender: TCJ_MenuItem); begin - Dialogs.MessageDlg('Plugins', 'Hello World Click', mtInformation, [mbOk], 0); - CJ_Interface.GetMenu.Remove(TestPluginI); + Dialogs.MessageDlg('Plugins', 'Hello World Click', mtInformation, [mbOK], 0); + CJ_Interface.GetMenu.Remove(TestPluginI); end; -function TMain.SayMsgHello(var Message: TMessage): Boolean; +function TMain.SayMsgHello(var Message: TMessage): boolean; begin - Dialogs.MessageDlg('Plugins', 'Hello World From Messages...'+#13#10+IntToStr(Message.WParam)+' '+IntToStr(Message.LParam), mtInformation, [mbOk], 0); - Result :=True; + Dialogs.MessageDlg('Plugins', 'Hello World From Messages...' + + #13#10 + IntToStr(Message.WParam) + ' ' + IntToStr(Message.LParam), mtInformation, [mbOK], 0); + Result := True; end; -function TMain.SayMsgHello2(var Message: TMessage): Boolean; +function TMain.SayMsgHello2(var Message: TMessage): boolean; begin - Dialogs.MessageDlg('Plugins', 'Hello World 2 From Messages...'+#13#10+IntToStr(Message.WParam)+' '+IntToStr(Message.LParam), mtInformation, [mbOk], 0); - Result :=True; + Dialogs.MessageDlg('Plugins', 'Hello World 2 From Messages...' + + #13#10 + IntToStr(Message.WParam) + ' ' + IntToStr(Message.LParam), mtInformation, [mbOK], 0); + Result := True; end; procedure TMain.Button2Click(Sender: TObject); -Var - msgHandled :Boolean; +var + msgHandled: boolean; begin - CJ_Interface.GetSignals.Signal(1, 24, 50, msgHandled); + CJ_Interface.GetSignals.Signal(1, 24, 50, msgHandled); end; -End. +end. + diff --git a/applications/cactusjukebox/source/mp3proj.lpi b/applications/cactusjukebox/source/mp3proj.lpi index 53dac2097..f7e719970 100755 --- a/applications/cactusjukebox/source/mp3proj.lpi +++ b/applications/cactusjukebox/source/mp3proj.lpi @@ -15,7 +15,7 @@ - + diff --git a/applications/cactusjukebox/source/playlist.pas b/applications/cactusjukebox/source/playlist.pas index 27ebc9923..c8265cdfb 100644 --- a/applications/cactusjukebox/source/playlist.pas +++ b/applications/cactusjukebox/source/playlist.pas @@ -10,47 +10,50 @@ uses { TPlaylistitemClass } type -TPlaylistitemClass = class - Artist, Title, Path, Album: string; - LengthMS, id:longint; - Played: boolean; - constructor create; - destructor destroy; - procedure update(MedFileObj: TMediaFileClass); - end; + TPlaylistitemClass = class + Artist, Title, Path, Album: string; + LengthMS, id: longint; + Played: boolean; + constructor Create; + destructor Destroy; + procedure update(MedFileObj: TMediaFileClass); + end; + PPlaylistItemClass = ^TPlaylistitemClass; type -//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -{ TPlaylistClass } + //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + { TPlaylistClass } - TPlaylistClass = class(Tlist) - private - function GetItems(index: integer):TPlaylistitemClass; - public - CurrentTrack: integer; - property Items[index: integer]: TPlaylistitemClass read GetItems; + TPlaylistClass = class(TList) + private + function GetItems(index: integer): TPlaylistitemClass; + public + CurrentTrack: integer; + property Items[index: integer]: TPlaylistitemClass read GetItems; - constructor create; - destructor destroy; - function TotalPlayTime: int64; - function TotalPlayTimeStr: string; - procedure move(dest, target:integer); - procedure remove(index: integer); - procedure clear; override; - function add(filepath:string):integer; //Read track info out of file at path - function add(MedFileObj: TMediaFileClass):integer; //Get track info from FileObj - procedure insert(index:integer; MedFileObj: TMediaFileClass); + constructor Create; + destructor Destroy; + function TotalPlayTime: int64; + function TotalPlayTimeStr: string; + procedure move(dest, target: integer); + procedure remove(index: integer); + procedure Clear; override; + function add(filepath: string): integer; //Read track info out of file at path + function add(MedFileObj: TMediaFileClass): integer; //Get track info from FileObj + procedure insert(index: integer; MedFileObj: TMediaFileClass); - function update(index: integer; filepath:string):integer; //update track info out of file at path - function update(index: integer; MedFileObj: TMediaFileClass):integer; //update track info from FileObj - function RandomIndex:integer; - procedure reset_random; - function ItemCount:integer; - function LoadFromFile(path:string):byte; - function SaveToFile(path:string):byte; - end; + function update(index: integer; filepath: string): integer; + //update track info out of file at path + function update(index: integer; MedFileObj: TMediaFileClass): integer; + //update track info from FileObj + function RandomIndex: integer; + procedure reset_random; + function ItemCount: integer; + function LoadFromFile(path: string): byte; + function SaveToFile(path: string): byte; + end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ @@ -60,14 +63,14 @@ implementation { TPlaylistitemClass } //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -constructor TPlaylistitemClass.create; +constructor TPlaylistitemClass.Create; begin - played:=false; + played := False; end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -destructor TPlaylistitemClass.destroy; +destructor TPlaylistitemClass.Destroy; begin end; @@ -76,12 +79,12 @@ end; procedure TPlaylistitemClass.update(MedFileObj: TMediaFileClass); begin - Artist:=MedFileObj.Artist; - Title:=MedFileObj.Title; - Album:=MedFileObj.Album; + Artist := MedFileObj.Artist; + Title := MedFileObj.Title; + Album := MedFileObj.Album; - ID:=MedFileObj.ID; - LengthMS:=MedFileObj.Playlength; + ID := MedFileObj.ID; + LengthMS := MedFileObj.Playlength; end; @@ -91,89 +94,105 @@ end; function TPlaylistClass.GetItems(index: integer): TPlaylistitemClass; begin - if (index>=0) and (index < Count) then Result := (TPlaylistitemClass(Inherited Items [Index])); + if (index >= 0) and (index < Count) then + Result := (TPlaylistitemClass(inherited Items[Index])); end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -constructor TPlaylistClass.create; +constructor TPlaylistClass.Create; begin - Inherited create; + inherited Create; end; -destructor TPlaylistClass.destroy; +destructor TPlaylistClass.Destroy; begin - clear; + Clear; end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -function TPlaylistClass.TotalPlayTime: int64; // returns total playtime of playlist in milliseconds -var i: integer; - PPlaylistItem: PPlaylistItemClass; +function TPlaylistClass.TotalPlayTime: int64; + // returns total playtime of playlist in milliseconds +var + i: integer; + PPlaylistItem: PPlaylistItemClass; begin - result:=0; - for i:= 0 to Count-1 do begin - result:=result + Items[i].LengthMS; - end; + Result := 0; + for i := 0 to Count - 1 do + begin + Result := Result + Items[i].LengthMS; + end; end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -function TPlaylistClass.TotalPlayTimeStr: string; // returns total playtime of playlist in string - // format. i.e. '2h 20min' -var s1,s2: string; - i: int64; +function TPlaylistClass.TotalPlayTimeStr: string; + // returns total playtime of playlist in string + // format. i.e. '2h 20min' +var + s1, s2: string; + i: int64; begin - i:=TotalPlayTime; - s2:=IntToStr((i div 60) mod 60 ); - s1:=IntToStr((i div 60) div 60 ); - result:=s1+'h '+s2+'min'; + i := TotalPlayTime; + s2 := IntToStr((i div 60) mod 60); + s1 := IntToStr((i div 60) div 60); + Result := s1 + 'h ' + s2 + 'min'; end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ procedure TPlaylistClass.move(dest, target: integer); -var current_track_tmp: integer; +var + current_track_tmp: integer; begin - if (dest < ItemCount) and (target < ItemCount) and (dest >= 0) and (target >= 0 ) then + if (dest < ItemCount) and (target < ItemCount) and (dest >= 0) and (target >= 0) then + begin + inherited Move(dest, target); + current_track_tmp := CurrentTrack; + if (CurrentTrack > dest) and (CurrentTrack <= target + 1) then + Dec(current_track_tmp); + + if (CurrentTrack < dest) and (CurrentTrack >= target) then + Inc(current_track_tmp); + + if (CurrentTrack = dest) then begin - inherited Move(dest, target); - current_track_tmp:= CurrentTrack; - if (CurrentTrack>dest) and (CurrentTrack<=target+1) then dec(current_track_tmp); - - if (CurrentTrack=target) then inc(current_track_tmp); - - if (CurrentTrack=dest) then begin - current_track_tmp:=target; - // if dest=0) and (index < Count) then begin - Items[index].free; - inherited Delete(index); - if CurrentTrack>index then dec(CurrentTrack); - end; + if (index >= 0) and (index < Count) then + begin + Items[index].Free; + inherited Delete(index); + if CurrentTrack > index then + Dec(CurrentTrack); + end; end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -procedure TPlaylistClass.clear; +procedure TPlaylistClass.Clear; begin - while count>0 do remove(0); - CurrentTrack:=-1; + while Count > 0 do + remove(0); + CurrentTrack := -1; end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ @@ -185,37 +204,39 @@ end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ function TPlaylistClass.add(MedFileObj: TMediaFileClass): integer; -var Playlistitem: TPlaylistitemClass; - index: integer; +var + Playlistitem: TPlaylistitemClass; + index: integer; begin - index:=(inherited Add(TPlaylistitemClass.create)); + index := (inherited Add(TPlaylistitemClass.Create)); - Items[index].Path:=MedFileObj.path; - Items[index].Artist:=MedFileObj.Artist; - Items[index].Title:=MedFileObj.Title; - Items[index].Album:=MedFileObj.Album; + Items[index].Path := MedFileObj.path; + Items[index].Artist := MedFileObj.Artist; + Items[index].Title := MedFileObj.Title; + Items[index].Album := MedFileObj.Album; - Items[index].ID:=MedFileObj.ID; - Items[index].LengthMS:=MedFileObj.Playlength; - result:=index; + Items[index].ID := MedFileObj.ID; + Items[index].LengthMS := MedFileObj.Playlength; + Result := index; end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ procedure TPlaylistClass.insert(index: integer; MedFileObj: TMediaFileClass); begin - inherited insert(index, TPlaylistitemClass.create); + inherited insert(index, TPlaylistitemClass.Create); - Items[index].Path:=MedFileObj.path; - Items[index].Artist:=MedFileObj.Artist; - Items[index].Title:=MedFileObj.Title; - Items[index].Album:=MedFileObj.Album; + Items[index].Path := MedFileObj.path; + Items[index].Artist := MedFileObj.Artist; + Items[index].Title := MedFileObj.Title; + Items[index].Album := MedFileObj.Album; - Items[index].ID:=MedFileObj.ID; - Items[index].LengthMS:=MedFileObj.Playlength; - if index=0) and (index= 0) and (index < Count) then + begin - Items[index].update(MedFileObj); + Items[index].update(MedFileObj); end; end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ function TPlaylistClass.RandomIndex: integer; -// Returns a random index of playlist entry that has not been played yet. -1 if all has been played. -// reset_random resets it -var x, i:integer; - s: boolean; + // Returns a random index of playlist entry that has not been played yet. -1 if all has been played. + // reset_random resets it +var + x, i: integer; + s: boolean; begin - s := false; - for i := 0 to Count-1 do if Items[i].played=false then s:= true; + s := False; + for i := 0 to Count - 1 do + if Items[i].played = False then + s := True; randomize; - if s then begin - i:=0; - repeat begin - x:=random(Count-1); - inc(i); - end; - until (Items[x].played=false) or (i > 4096); // i is for timeout to prevent an endless loop + if s then + begin + i := 0; + repeat + begin + x := random(Count - 1); + Inc(i); + end; + until (Items[x].played = False) or (i > 4096); + // i is for timeout to prevent an endless loop - if i>4096 then begin - x:=-1; - repeat inc(x) until Items[x].played=false; - end; + if i > 4096 then + begin + x := -1; + repeat + Inc(x) + until Items[x].played = False; + end; - result:=x; + Result := x; end - else begin - result:=-1; - end; + else + begin + Result := -1; + end; end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ procedure TPlaylistClass.reset_random; -var i: integer; +var + i: integer; begin - for i:= 0 to Count-1 do Items[i].played:=false; + for i := 0 to Count - 1 do + Items[i].played := False; end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ function TPlaylistClass.ItemCount: integer; begin - result:=inherited Count; + Result := inherited Count; end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ function TPlaylistClass.LoadFromFile(path: string): byte; //Load .m3u Playlist -var s, tmps, fpath, fartist, ftitle:string; - pos1,pos2, i, lengthS:integer; - PlaylistItem: TPlaylistItemClass; - fileobj: TMediaFileClass; - filehandle:text; +var + s, tmps, fpath, fartist, ftitle: string; + pos1, pos2, i, lengthS: integer; + PlaylistItem: TPlaylistItemClass; + fileobj: TMediaFileClass; + filehandle: Text; begin - try - system.assign(Filehandle,path); - Reset(filehandle); - readln(filehandle, tmps); - if pos('#EXTM3U',tmps)<>0 then begin - repeat begin - repeat readln(filehandle, tmps) until ((pos('#EXTINF', tmps)<>0) or eof(filehandle)); - pos1:=pos(':', tmps)+1; - pos2:=pos(',', tmps); - s:=copy(tmps,pos1,pos2-pos1); + try + system.Assign(Filehandle, path); + Reset(filehandle); + readln(filehandle, tmps); + if pos('#EXTM3U', tmps) <> 0 then + begin + repeat + begin + repeat + readln(filehandle, tmps) + until ((pos('#EXTINF', tmps) <> 0) or EOF(filehandle)); + pos1 := pos(':', tmps) + 1; + pos2 := pos(',', tmps); + s := copy(tmps, pos1, pos2 - pos1); - val(s,LengthS); + val(s, LengthS); - pos1:=pos2+1; - pos2:=pos(' - ',tmps); + pos1 := pos2 + 1; + pos2 := pos(' - ', tmps); - fartist:=copy(tmps,pos1,pos2-pos1); - pos2:=pos2+3; - ftitle:=copy(tmps,pos2,(length(tmps))-pos2+1); - readln(filehandle, fpath); + fartist := copy(tmps, pos1, pos2 - pos1); + pos2 := pos2 + 3; + ftitle := copy(tmps, pos2, (length(tmps)) - pos2 + 1); + readln(filehandle, fpath); - i:=(inherited Add(TPlaylistitemClass.create)); - Items[i].Title:=ftitle; - Items[i].Artist:=fartist; - Items[i].Path:=fpath; - Items[i].LengthMS:=lengthS*1000; + i := (inherited Add(TPlaylistitemClass.Create)); + Items[i].Title := ftitle; + Items[i].Artist := fartist; + Items[i].Path := fpath; + Items[i].LengthMS := lengthS * 1000; - end; - until eof(filehandle); - end else debugoutln(path+' is not a valid m3u playlist',4); - close(filehandle); - result:=0; - except - result:=1; - end; + end; + until EOF(filehandle); + end + else + debugoutln(path + ' is not a valid m3u playlist', 4); + Close(filehandle); + Result := 0; + except + Result := 1; + end; end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ function TPlaylistClass.SaveToFile(path: string): byte; -var i:integer; - temps: string; - filehandle:text; +var + i: integer; + temps: string; + filehandle: Text; begin - try - system.assign(Filehandle,path); - Rewrite(filehandle); - writeln(Filehandle,'#EXTM3U'); - for i:= 0 to Count-1 do begin - str(Items[i].LengthMS div 1000, temps); - writeln(filehandle,'#EXTINF:'+temps+','+Items[i].artist+' - '+Items[i].title); - writeln(filehandle, Items[i].path); - end; - close(filehandle); - result:=0; + try + system.Assign(Filehandle, path); + Rewrite(filehandle); + writeln(Filehandle, '#EXTM3U'); + for i := 0 to Count - 1 do + begin + str(Items[i].LengthMS div 1000, temps); + writeln(filehandle, '#EXTINF:' + temps + ',' + Items[i].artist + ' - ' + Items[i].title); + writeln(filehandle, Items[i].path); + end; + Close(filehandle); + Result := 0; except - result:=1; + Result := 1; end; end; diff --git a/applications/cactusjukebox/source/tagreader/mp3file.pas b/applications/cactusjukebox/source/tagreader/mp3file.pas index 088fc8a05..20b436869 100644 --- a/applications/cactusjukebox/source/tagreader/mp3file.pas +++ b/applications/cactusjukebox/source/tagreader/mp3file.pas @@ -285,13 +285,27 @@ Begin ftrack := ''; End; // else writeln('no id3v1 tag'); except WriteLn(Filename+' -> exception while reading id3v1 tag... skipped!!'); end; - If ((artistv2<>'')) And (CactusConfig.id3v2_prio Or (artist='')) Then Fartist := artistv2; - If ((titlev2<>'')) And (CactusConfig.id3v2_prio Or (title='')) Then Ftitle := titlev2; - If ((albumv2<>'')) And (CactusConfig.id3v2_prio Or (album='')) Then Falbum := albumv2; - If ((commentv2<>'')) And (CactusConfig.id3v2_prio Or (comment='')) Then Fcomment := commentv2; - If ((yearv2<>'')) And (CactusConfig.id3v2_prio Or (year='')) Then Fyear := yearv2; - If ((trackv2<>'')) And (CactusConfig.id3v2_prio Or (track='')) Then ftrack := trackv2; - fileclose(mp3filehandle); +{ If ((artistv2<>'')) And (CactusConfig.id3v2_prio Or (artist='')) Then Fartist := artistv2; + If ((titlev2<>'')) And (CactusConfig.id3v2_prio Or (title='')) Then Ftitle := titlev2; + If ((albumv2<>'')) And (CactusConfig.id3v2_prio Or (album='')) Then Falbum := albumv2; + If ((commentv2<>'')) And (CactusConfig.id3v2_prio Or (comment='')) Then Fcomment := commentv2; } + {$IFDEF WINDOWS} + if Length(Trim(fartist)) <> 0 then begin + If ((artistv2<>'')) And (CactusConfig.id3v2_prio Or (artist='')) Then Fartist := UTF8Encode(artistv2); + end else Fartist := artistv2; + if Length(Trim(Ftitle)) <> 0 then begin + If ((titlev2<>'')) And (CactusConfig.id3v2_prio Or (title='')) Then Ftitle := UTF8Encode(titlev2); + end else Ftitle := titlev2; + if Length(Trim(Falbum)) <> 0 then begin + If ((albumv2<>'')) And (CactusConfig.id3v2_prio Or (album='')) Then Falbum := UTF8Encode(albumv2); + end else Falbum := albumv2; + if Length(Trim(Fcomment)) <> 0 then begin + If ((commentv2<>'')) And (CactusConfig.id3v2_prio Or (comment='')) Then Fcomment := UTF8Encode(commentv2); + end else Fcomment := commentv2; + {$ENDIF} + If ((yearv2<>'')) And (CactusConfig.id3v2_prio Or (year='')) Then Fyear := yearv2; + If ((trackv2<>'')) And (CactusConfig.id3v2_prio Or (track='')) Then ftrack := trackv2; + fileclose(mp3filehandle); end; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++