From b64d2b1e220845fd88cb2b5d7fa1602f2f04effa Mon Sep 17 00:00:00 2001 From: "Kirill Lipatov (Leency)" Date: Sat, 17 Mar 2018 10:23:03 +0000 Subject: [PATCH] Pixie 2.7: update UI, more hotkeys, fix last_folder open git-svn-id: svn://kolibrios.org@7192 a494cfbc-eb01-0410-851d-a64ba20cac60 --- programs/cmm/lib/keyboard.h | 1 + programs/cmm/pixie2/pixie.c | 47 ++++++++++++++++++++------------- programs/cmm/pixie2/settings.h | 2 +- programs/cmm/pixie2/skin.png | Bin 3926 -> 4204 bytes 4 files changed, 31 insertions(+), 19 deletions(-) diff --git a/programs/cmm/lib/keyboard.h b/programs/cmm/lib/keyboard.h index 7219eda857..93c3174735 100644 --- a/programs/cmm/lib/keyboard.h +++ b/programs/cmm/lib/keyboard.h @@ -48,6 +48,7 @@ #define SCAN_CODE_KEY_O 024 #define SCAN_CODE_KEY_P 025 #define SCAN_CODE_KEY_R 019 +#define SCAN_CODE_KEY_S 031 #define KEY_LSHIFT 00000000001b #define KEY_RSHIFT 00000000010b diff --git a/programs/cmm/pixie2/pixie.c b/programs/cmm/pixie2/pixie.c index 9c0146e558..74ed93c360 100644 --- a/programs/cmm/pixie2/pixie.c +++ b/programs/cmm/pixie2/pixie.c @@ -32,7 +32,7 @@ char default_dir[] = "/rd/1"; od_filter filter2 = { 15, "MP3\0WAV\0XM\0\0" }; -#define ABOUT_MESSAGE "Pixie Player v2.62 +#define ABOUT_MESSAGE "Pixie Player v2.7 A tiny music folder player. Supports MP3, WAV, XM audio file formats. @@ -43,7 +43,9 @@ Play/Stop: Space or P key Start playing selected file: Enter Goto next/previous track: Ctrl + Left/Right Change sound volume: Left/Right key -Mute: M key +Repeat: R +Shuffle: S +Mute: M kolibri-n.org & aspero.pro" @@ -95,6 +97,8 @@ enum { collection music_col; +#define LAST_FOLDER_EXISTS 1 + //===================================================// // // // CODE // @@ -120,9 +124,10 @@ void main() tempstr = abspath("pixie.ini"); strcpy(#pixie_ini_path, tempstr); list.SetFont(8, 16, 13); - if (!param) notify("'Pixie Player\nPress O key to open MP3 file' -St"); LoadLibraries(); LoadIniConfig(); + if (work_folder) param=LAST_FOLDER_EXISTS; + if (!param) notify("'Pixie Player\nPress O key to open MP3/WAV/XM file' -St"); kfont.init(DEFAULT_FONT); SetEventMask(EVM_REDRAW + EVM_KEY + EVM_BUTTON + EVM_MOUSE + EVM_MOUSE_FILTER); loop() @@ -159,7 +164,7 @@ void main() case BUTTON_PLAYBACK_NEXT: EventPlaybackNext(); break; case BUTTON_PLAYBACK_PLAY_PAUSE: EventPlayAndPause(); break; case BUTTON_REPEAT: EventRepeatClick(); break; - case BUTTON_SHUFFLE: EventshuffleClick(); break; + case BUTTON_SHUFFLE: EventShuffleClick(); break; case BUTTON_OPEN_DIALOG: EventFileDialogOpen(); break; case BUTTON_SHOW_VOLUME: RunProgram("/sys/@VOLUME", NULL); break; } @@ -173,6 +178,8 @@ void main() } if (key_scancode==SCAN_CODE_KEY_O) EventFileDialogOpen(); if (key_scancode==SCAN_CODE_KEY_M) RunProgram("/sys/@VOLUME", "m"); + if (key_scancode==SCAN_CODE_KEY_R) EventRepeatClick(); + if (key_scancode==SCAN_CODE_KEY_S) EventShuffleClick(); if (key_scancode==SCAN_CODE_RIGHT) RunProgram("/sys/@VOLUME", "+"); if (key_scancode==SCAN_CODE_LEFT) RunProgram("/sys/@VOLUME", "-"); if (key_scancode==SCAN_CODE_ENTER) EventStartPlayingSelectedItem(); @@ -186,7 +193,8 @@ void main() DefineDragableWindow(win_x_small, win_y_small, WIN_W_SMALL, WIN_H_SMALL); draw_window(); if (param[0]) { - EventOpenFolder(#param); + if (param==LAST_FOLDER_EXISTS) EventOpenFolder(NULL); + else EventOpenFolder(#param); param[0] = NULL; } break; @@ -274,9 +282,9 @@ void DrawTopPanel() if (playback_mode != PLAYBACK_MODE_STOPED) img_draw stdcall(skin.image, 46, button_y, 41, 21, skin.w+1, WIN_H_SMALL+1); if (repeat) - img_draw stdcall(skin.image, Form.width-102, button_y+2, 17,17,skin.w+43, WIN_H_SMALL+1); + img_draw stdcall(skin.image, 177, button_y+2, 17,17,skin.w+43, WIN_H_SMALL+1); if (shuffle) - img_draw stdcall(skin.image, Form.width-83, button_y+2, 17,17, skin.w+62, WIN_H_SMALL+1); + img_draw stdcall(skin.image, 196, button_y+2, 17,17, skin.w+62, WIN_H_SMALL+1); if (!work_folder) DrawPixieTitle("Pixie"); else DrawPixieTitle(#work_folder + strrchr(#work_folder, '/')); @@ -291,11 +299,10 @@ void DrawTopPanel() DefineHiddenButton(Form.width - 55, 1, 26, 15, BUTTON_WINDOW_MINIMIZE); DefineHiddenButton(Form.width - 83, 1, 26, 15, BUTTON_WINDOW_REDUCE); //Other buttons - button_y += 3; - DefineHiddenButton(Form.width - 101,button_y, 17, 16, BUTTON_REPEAT); - DefineHiddenButton(Form.width - 82, button_y, 17, 16, BUTTON_SHUFFLE); - DefineHiddenButton(Form.width - 54, button_y, 23, 23, BUTTON_OPEN_DIALOG); - DefineHiddenButton(Form.width - 27, button_y, 23, 23, BUTTON_SHOW_VOLUME); + DefineHiddenButton(Form.width - 53, button_y, 22, 20, BUTTON_OPEN_DIALOG); + DefineHiddenButton(Form.width - 29, button_y, 22, 20, BUTTON_SHOW_VOLUME); + DefineHiddenButton(178, button_y+3, 17, 16, BUTTON_REPEAT); + DefineHiddenButton(197, button_y+3, 17, 16, BUTTON_SHUFFLE); } else if (window_mode == WINDOW_MODE_SMALL) { @@ -340,7 +347,11 @@ void DrawPixieTitle(dword _title) void EventOpenFolder(dword _open_path) { - if (ESBYTE[_open_path]) + if (!_open_path) + { + OpenDirectory(#work_folder); + } + else { strcpy(#work_folder, _open_path); work_folder[strrchr(#work_folder, '/')-1]='\0'; @@ -362,7 +373,7 @@ void EventOpenFolder(dword _open_path) list.KeyHome(); current_playing_file_n=0; EventStopPlayingMp3(); - EventStartPlayingMp3(); + if (_open_path) EventStartPlayingMp3(); } @@ -492,7 +503,7 @@ void EventRepeatClick() DrawTopPanel(); } -void EventshuffleClick() +void EventShuffleClick() { shuffle ^= 1; DrawTopPanel(); @@ -511,7 +522,7 @@ void EventShowAbout() if (key_scancode == SCAN_CODE_ESC) ExitProcess(); break; case evReDraw: - DefineDragableWindow(150, 200, 363, 300); + DefineDragableWindow(150, 200, 400, 327); GetProcessInfo(#pop_up, SelfInfo); DrawBar(0, 0, pop_up.width, pop_up.height, theme.color_top_panel_bg); DrawRectangle(0, 0, pop_up.width, pop_up.height, theme.color_list_border); @@ -519,8 +530,8 @@ void EventShowAbout() DefineHiddenButton(pop_up.width - 27, 1, 26, 15, BUTTON_WINDOW_CLOSE); img_draw stdcall(skin.image, pop_up.width-28, 0, 28, 18, skin.w - 29, 0); - DrawCaptButton(pop_up.width-10-80, pop_up.height - 30, 80, 20, 11, - theme.color_list_active_bg, theme.color_top_panel_song_name, "Clear"); + DrawCaptButton(pop_up.width-10-80, pop_up.height - 34, 80, 24, 2, + theme.color_list_active_bg, theme.color_top_panel_song_name, "Cool"); } } diff --git a/programs/cmm/pixie2/settings.h b/programs/cmm/pixie2/settings.h index e22b6b75be..79850c3685 100644 --- a/programs/cmm/pixie2/settings.h +++ b/programs/cmm/pixie2/settings.h @@ -23,7 +23,7 @@ void LoadIniConfig() win_y_normal = ini.GetInt("win_y_normal", 90); win_x_small = ini.GetInt("win_x_small", -1); win_y_small = ini.GetInt("win_y_small", -1); - ini.GetString("last_folder", #work_folder, sizeof(work_folder), 0); + ini.GetString("last_folder", #work_folder, sizeof(work_folder), NULL); Libimg_LoadImage(#skin, abspath("skin.png")); skin.w = 322; diff --git a/programs/cmm/pixie2/skin.png b/programs/cmm/pixie2/skin.png index 31f8b1de932d582ca741745515ac6a38e1474cb5..28c868dd049bda6fc73b8523d2a70164348d9352 100644 GIT binary patch literal 4204 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 LY;KerxyAht;MQWn literal 3926 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