//flac //open last folder at start up //do not open multiple threads //edit list manually #define MEMSIZE 0xFFFFF #include "..\lib\kolibri.h" #include "..\lib\mem.h" #include "..\lib\strings.h" #include "..\lib\dll.h" #include "..\lib\file_system.h" #include "..\lib\list_box.h" #include "..\lib\figures.h" #include "..\lib\lib.obj\box_lib.h" #include "..\lib\lib.obj\libio_lib.h" #include "..\lib\lib.obj\libimg_lib.h" #include "..\lib\lib.obj\libini.h" #include "..\lib\patterns\libimg_load_skin.h" scroll_bar scroll1 = { 5,200,398,44,0,2,115,15,0,0xeeeeee,0xBBBbbb,0xeeeeee,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1}; llist list; proc_info Form; libimg_image skin; char pixie_ini_path[4096]; enum { BUTTON_WINDOW_CLOSE = 1, BUTTON_WINDOW_MINIMIZE, BUTTON_WINDOW_REDUCE, BUTTON_PLAYBACK_PLAY_PAUSE = 10, BUTTON_PLAYBACK_PREV, BUTTON_PLAYBACK_NEXT }; int player_run_id, notify_run_id; int current_playing_file_n; word win_x, win_y; byte window_mode; enum { WINDOW_MODE_NORMAL, WINDOW_MODE_SMALL }; byte playback_mode; enum { PLAYBACK_MODE_STOPED, PLAYBACK_MODE_PLAYING }; byte current_theme; enum { THEME_DARK, THEME_LIGHT }; #include "get_files_list.h" #include "settings.h" #include "check_default_player.h" void main() { int id, key, mouse_clicked; mouse m, drag_mouse; mem_Init(); SetEventMask(0x27); if (load_dll2(boxlib, #box_lib_init,0)!=0) notify("'Error: library doesn't exists - box_lib' -E"); if (load_dll2(libio, #libio_init,1)!=0) notify("'Error: library doesn't exists - libio' -E"); if (load_dll2(libimg, #libimg_init,1)!=0) notify("'Error: library doesn't exists - libimg' -E"); if (load_dll2(libini, #lib_init,1)!=0) notify("'Error: library doesn't exists - libini' -E"); id = abspath("pixie.ini"); strcpy(#pixie_ini_path, id); LoadIniConfig(); CheckDefaultForTheFirstStart(); if (param) { strcpy(#work_folder, #param); work_folder[strrchr(#work_folder, '/')-1]='\0'; } if (work_folder) OpenDirectory(#work_folder); StartPlayingMp3(); list.SetSizes(1, skin.h, skin.w-1, 198, 40, 18); if (list.count <= list.visible) { list.h = list.count * list.line_h; list.visible = list.count; } else { list.w -= scroll1.size_x; } loop() { WaitEventTimeout(60); switch(EAX & 0xFF) { case evMouse: if (!CheckActiveProcess(Form.ID)) break; scrollbar_v_mouse (#scroll1); if (list.first <> scroll1.position) { list.first = scroll1.position; DrawPlayList(); break; } m.get(); if (m.vert) if (list.MouseScroll(m.vert)) { DrawPlayList(); } if (mouse_clicked) { if (!m.lkm) && (list.ProcessMouse(m.x, m.y)) StartPlayingMp3(); mouse_clicked=0; } if (m.lkm) && (list.MouseOver(m.x, m.y)) mouse_clicked=1; //drag window - emulate windows header if (window_mode == WINDOW_MODE_SMALL) && (m.lkm) && (m.y < skin.h) && (m.x < 13) { do { drag_mouse.get(); if (drag_mouse.x!=m.x) || (drag_mouse.y!=m.y) { MoveSize(Form.left + drag_mouse.x - m.x, Form.top + drag_mouse.y - m.y, OLD, OLD); DrawWindow(); } pause(2); } while (drag_mouse.lkm); } if (m.pkm) && (m.y > skin.h) notify("'Pixies Player v1.01\nChange sound volume: Left/Right key\nChange skin: F1/F2\nMute: M key' -St\n"); break; case evButton: id=GetButtonID(); switch(id) { case BUTTON_WINDOW_CLOSE: StopPlayingMp3(); SaveIniConfig(); ExitProcess(); break; case BUTTON_WINDOW_MINIMIZE: MinimizeWindow(); break; case BUTTON_WINDOW_REDUCE: if (window_mode == WINDOW_MODE_NORMAL) { window_mode = WINDOW_MODE_SMALL; MoveSize(OLD, OLD, 99, skin.h - 1); MoveSize(OLD, GetClientHeight() - skin.h + 1, OLD, OLD); MoveSize(2000, OLD, OLD, OLD); } else { window_mode = WINDOW_MODE_NORMAL; MoveSize(30,80,skin.w -1 ,skin.h + list.h); } break; case BUTTON_PLAYBACK_PREV: if (list.KeyUp()) StartPlayingMp3(); break; case BUTTON_PLAYBACK_NEXT: if (list.KeyDown()) StartPlayingMp3(); break; case BUTTON_PLAYBACK_PLAY_PAUSE: if (playback_mode == PLAYBACK_MODE_PLAYING) { playback_mode = PLAYBACK_MODE_STOPED; DrawInactivePlayButton(); StopPlayingMp3(); } else { playback_mode = PLAYBACK_MODE_PLAYING; StartPlayingMp3(); } break; } break; case evKey: key = GetKey(); if (key==50) SetColorThemeLight(); if (key==51) SetColorThemeDark(); if (key==ASCII_KEY_LEFT) RunProgram("@VOLUME", "-"); if (key==ASCII_KEY_RIGHT) RunProgram("@VOLUME", "+"); if (key=='m') RunProgram("@VOLUME", "m"); if (key==ASCII_KEY_ENTER) StartPlayingMp3(); if (key=='p') || (key==ASCII_KEY_SPACE) { if (playback_mode == PLAYBACK_MODE_PLAYING) StopPlayingMp3(); else StartPlayingMp3(); } if (list.ProcessKey(key)) DrawPlayList(); break; case evReDraw: if (window_mode == WINDOW_MODE_NORMAL) DefineAndDrawWindow(win_x, win_y, skin.w - 1, skin.h + list.h, 0x01,0,0,0); if (window_mode == WINDOW_MODE_SMALL) DefineAndDrawWindow(win_x, win_y, 99, skin.h - 1, 0x01,0,0,0); DrawWindow(); break; default: if (playback_mode == PLAYBACK_MODE_PLAYING) && (GetProcessSlot(player_run_id)==0) { if (current_playing_file_n < list.count) { //пиздец тут быдлокод пошёл id = list.current; current_playing_file_n++; list.current = current_playing_file_n; StartPlayingMp3(); list.current = id; DrawPlayList(); } else { StopPlayingMp3(); DrawWindow(); } } } } } void DrawPlayList() { int i; int yyy; for (i=0; i47) strcpy(#temp_filename+44, "..."); yyy = i*list.line_h+list.y; //this is selected file if (list.current - list.first == i) { if (i>=list.count) continue; DrawBar(list.x, yyy, list.w, list.line_h, theme.color_list_active_bg); WriteText(12,yyy+list.text_y,0x80, theme.color_list_active_text, #temp_filename); } //this is not selected file else { if (i>=list.count) continue; DrawBar(list.x,yyy,list.w, list.line_h, theme.color_list_bg); WriteText(12,yyy+list.text_y,0x80, theme.color_list_text, #temp_filename); } //this is current playing file if (i + list.first == current_playing_file_n) && (playback_mode == PLAYBACK_MODE_PLAYING) { WriteText(3, yyy+list.text_y,0x80, theme.color_list_active_pointer, "\x10"); WriteText(12,yyy+list.text_y,0x80, theme.color_list_active_text, #temp_filename); } } DrawBar(list.x,list.visible * list.line_h + list.y, list.w, -list.visible * list.line_h + list.h, theme.color_list_bg); DrawScroller(); } void StopPlayingMp3() { if (player_run_id) player_run_id = KillProcess(player_run_id); if (notify_run_id) notify_run_id = KillProcess(notify_run_id); playback_mode = PLAYBACK_MODE_STOPED; } void StartPlayingMp3() { word i; char item_path[4096], notify_message[512]; dword item_path_end_pointer; StopPlayingMp3(); if (list.current > list.count) { list.current = list.count; return; } if (!list.count) { notify_run_id = notify("'Pixie Player\nStopped, no file specified' -St"); return; } current_playing_file_n = list.current; playback_mode = PLAYBACK_MODE_PLAYING; strlcpy(#current_filename, GetCurrentItemName(), sizeof(current_filename)); strcpy(#item_path, "\""); strcat(#item_path, #work_folder); strcat(#item_path, "/"); strcat(#item_path, #current_filename); strcat(#item_path, "\""); DrawPlayList(); DrawTopPanel(); item_path_end_pointer = #item_path+strlen(#item_path); if (strcmpi(item_path_end_pointer-4,".mp3")!=0) player_run_id = RunProgram(abspath("minimp3"), #item_path); strcpy(#notify_message, "'Now playing:\n"); strcat(#notify_message, #current_filename); for (i=2; i=2) return; if (window_mode == WINDOW_MODE_NORMAL) { DrawListBorder(0, skin.h-1, skin.w-1, list.h+1, theme.color_list_border); DrawPlayList(); } } void DrawTopPanel() { char current_playing_title[245]; img_draw stdcall(skin.image, 0, 0, Form.width - 14, skin.h, 0, 0); img_draw stdcall(skin.image, Form.width - 14, 0, 15, skin.h, skin.w - 15, 0); if (playback_mode == PLAYBACK_MODE_STOPED) DrawInactivePlayButton(); //Playing control buttons DefineButton(13, 1, 21, 21, BUTTON_PLAYBACK_PLAY_PAUSE + BT_HIDE, 0); DefineButton(36, 1, 21, 21, BUTTON_PLAYBACK_PREV + BT_HIDE, 0); DefineButton(60, 1, 21, 21, BUTTON_PLAYBACK_NEXT + BT_HIDE, 0); //Window control buttons DefineButton(Form.width - 14, 1, 11, 11, BUTTON_WINDOW_CLOSE + BT_HIDE, 0); DefineButton(Form.width - 14, 12, 12, 11, BUTTON_WINDOW_REDUCE + BT_HIDE, 0); //Mode depended if (window_mode == WINDOW_MODE_NORMAL) { DefineButton(Form.width - 26, 1, 12, 11, BUTTON_WINDOW_MINIMIZE + BT_HIDE, 0); strcpy(#current_playing_title, #current_filename); current_playing_title[strlen(#current_playing_title)-4] = '\0'; if (strlen(#current_playing_title) > 29) strcpy(#current_playing_title + 26, "..."); WriteText(90, 9, 0x80, theme.color_top_panel_text, #current_playing_title); } else { DefineButton(0, 0, 12, skin.h, 99 + BT_HIDE + BT_NOFRAME, 0); } } void DrawScroller() { scroll1.max_area = list.count; scroll1.cur_area = list.visible; scroll1.position = list.first; scroll1.all_redraw = 0; scroll1.start_x = skin.w - scroll1.size_x - 1; scroll1.start_y = list.y-1; scroll1.size_y = list.h+2; if (list.count > list.visible) scrollbar_v_draw(#scroll1); } void DrawListBorder(dword x,y,w,h,color1) { DrawBar(x,y+h,w,1,color1); DrawBar(x,y,1,h,color1); DrawBar(x+w,y,1,h+1,color1); } stop: char menu_stak[4096];