#include #include #include "Etk.h" #include "Ecore_File.h" #include "client-nms.h" #include "fb.h" #define PACKAGE_DATA_DIR "/usr/local/share/etk" #define VIDEO_DIR "/media" #define KEY_RIGHT "Right" #define KEY_LEFT "Left" #define KEY_PLAY "Space" #define KEY_STOP "Delete" #define KEY_ENTER "Enter" static Etk_Tree *the_tree; static const char *current_path, *parent_path; static const char *stock_back, *stock_dir, *stock_file, *stock_select; static void populate_tree(const char *dir); // ----------------------------------------------- file browsing ---------------------------------------------- static const char* selected_file_get() { int imgtype; char *imgpath, *path; Etk_Tree_Row *sel; sel = etk_tree_selected_row_get(the_tree); if (sel == NULL) return NULL; etk_tree_row_fields_get(sel, etk_tree_nth_col_get(the_tree, 0), &imgpath, &imgtype, &path, NULL); return path; } static void activate_file(const char* file) { char path[PATH_MAX]; if (file == NULL) return; // check for dir up (..) if (strlen(file) == 2 && file[0] == file[1] == '.') { free((char*)current_path); current_path = parent_path; parent_path = ecore_file_get_dir(current_path); populate_tree(current_path); return; } snprintf(path, PATH_MAX, "%s/%s", current_path, file); printf("Activating path [%s]\n", path); if (ecore_file_is_dir(path)) { free((char*)parent_path); parent_path = current_path; current_path = strdup(path); populate_tree(current_path); } else NmsPlay(NPT_FILE, path); } // ----------------------------------------- Tree and tree events handling ------------------------------------------- static void populate_tree(const char *dir) { int i; Etk_Tree_Col *col1, *col2; char path[PATH_MAX]; const char *stock; col1 = etk_tree_nth_col_get(the_tree, 0); col2 = etk_tree_nth_col_get(the_tree, 1); current_path = dir; etk_tree_freeze(the_tree); etk_tree_clear(the_tree); Ecore_List *files; char *file; if (strlen(current_path) != 1 || current_path[0] != '/') etk_tree_row_append(the_tree, NULL, col1, etk_theme_icon_get(), stock_back, "..", col2, NULL, NULL, NULL); printf("Listing dir [%s]\n", dir); files = ecore_file_ls(dir); while ((file = ecore_list_remove_first(files))) { printf("File [%s]\n", file); snprintf(path, PATH_MAX, "%s/%s", dir, file); stock = ecore_file_is_dir(path) ? stock_dir : stock_file; etk_tree_row_append(the_tree, NULL, col1, etk_theme_icon_get(), stock, file, col2, NULL, NULL, NULL); free(file); } ecore_list_destroy(files); etk_tree_thaw(the_tree); } static void _tree_key_down(Etk_Object *object, Etk_Event_Key_Down *event, void *data) { char *file; if (strcmp(event->keyname, KEY_RIGHT) == 0 || strcmp(event->keyname, KEY_ENTER) == 0 || strcmp(event->keyname, KEY_PLAY) == 0) activate_file(selected_file_get()); else if (strcmp(event->keyname, KEY_LEFT) == 0) activate_file(".."); else if (strcmp(event->keyname, KEY_STOP) == 0) NmsStopPlay(); } void _tree_row_unselected_cb(Etk_Object *tree, Etk_Tree_Row *row, void* data) { Etk_Tree_Col *col; if (row == NULL) return; col = (Etk_Tree_Col*)data; etk_tree_row_fields_set(row, ETK_FALSE, col, NULL, NULL, NULL); } void _tree_row_selected_cb(Etk_Object *tree, Etk_Tree_Row *row, void* data) { Etk_Tree_Col *col; if (row == NULL) return; col = (Etk_Tree_Col*)data; etk_tree_row_fields_set(row, ETK_FALSE, col, etk_theme_icon_get(), stock_select, NULL); //PACKAGE_DATA_DIR "/images/3stars.png" } // --------------------------------------- Main window and app startup -------------------------------------------- static void _etk_test_main_quit_cb(void *data) { etk_main_quit(); } static void btn_play_click() { activate_file(selected_file_get()); } static void btn_stop_click() { NmsStopPlay(); } static Etk_Window* main_window_create() { Etk_Widget *win; Etk_Widget *vbox, *hbox; Etk_Widget *button; char *theme_name = "neuroses_etk_theme"; printf("\nTheme is: %s. Changing to: %s\n", etk_theme_widget_get(), theme_name); if (etk_theme_widget_set(theme_name) == ETK_FALSE) printf("Failed to set theme\n"); else printf("Theme successfully changed ?\n"); win = etk_window_new(); etk_window_title_set(ETK_WINDOW(win), "Etk Test Application"); etk_window_resize(ETK_WINDOW(win), 100, 100); etk_window_move(ETK_WINDOW(win), 100, 100); etk_signal_connect("destroyed", ETK_OBJECT(win), ETK_CALLBACK(_etk_test_main_quit_cb), NULL); vbox = etk_vbox_new(ETK_FALSE, 0); etk_container_add(ETK_CONTAINER(win), vbox); // setup the play/stop buttons hbox = etk_hbox_new(ETK_FALSE, 1); etk_container_add(ETK_CONTAINER(vbox), hbox); button = etk_button_new_with_label("Play"); etk_container_add(ETK_CONTAINER(hbox), button); etk_signal_connect("clicked", ETK_OBJECT(button), ETK_CALLBACK(btn_play_click), NULL); button = etk_button_new_with_label("Stop"); etk_container_add(ETK_CONTAINER(hbox), button); etk_signal_connect("clicked", ETK_OBJECT(button), ETK_CALLBACK(btn_stop_click), NULL); // setup the list box (tree) Etk_Tree_Col *col1, *col2; the_tree = ETK_TREE(etk_tree_new()); Etk_Tree* tree = the_tree; etk_widget_size_request_set(ETK_WIDGET(tree), 280, 150); etk_container_add(ETK_CONTAINER(vbox), ETK_WIDGET(tree)); etk_tree_mode_set(tree, ETK_TREE_MODE_LIST); col1 = etk_tree_col_new(tree, "Icon+Text", 90, 0.0); // etk_tree_model_icon_text_new(ETK_TREE_FROM_FILE), 90); col2 = etk_tree_col_new(tree, "Indicator", 90, 0.0); //etk_tree_model_image_new(ETK_TREE(tree), ETK_TREE_FROM_FILE), 90); etk_tree_col_model_add(col1, etk_tree_model_image_new()); etk_tree_col_model_add(col1, etk_tree_model_text_new()); etk_tree_col_model_add(col2, etk_tree_model_image_new()); etk_tree_headers_visible_set(tree, ETK_FALSE); etk_tree_col_expand_set(col1, ETK_TRUE); etk_signal_connect("row_selected", ETK_OBJECT(tree), ETK_CALLBACK(_tree_row_selected_cb), col2); etk_signal_connect("row_unselected", ETK_OBJECT(tree), ETK_CALLBACK(_tree_row_unselected_cb), col2); etk_signal_connect("key_down", ETK_OBJECT(tree), ETK_CALLBACK(_tree_key_down), tree); etk_tree_build(ETK_TREE(tree)); stock_back = etk_stock_key_get(ETK_STOCK_GO_UP, ETK_STOCK_MEDIUM); stock_dir = etk_stock_key_get(ETK_STOCK_FOLDER_OPEN, ETK_STOCK_MEDIUM); stock_file = etk_stock_key_get(ETK_STOCK_MULTIMEDIA_PLAYER, ETK_STOCK_MEDIUM); stock_select = etk_stock_key_get(ETK_STOCK_GO_NEXT, ETK_STOCK_MEDIUM); current_path = strdup(VIDEO_DIR); parent_path = strdup("/"); populate_tree(current_path); //---------------------------------------------------------------------------- button = etk_button_new_with_label("Exit Player"); etk_container_add(ETK_CONTAINER(vbox), button); etk_signal_connect_swapped("clicked", ETK_OBJECT(button), ETK_CALLBACK(_etk_test_main_quit_cb), win); etk_widget_focus(ETK_WIDGET(tree)); etk_tree_row_select(etk_tree_first_row_get(tree)); etk_window_focused_set(ETK_WINDOW(win), ETK_TRUE); etk_widget_show_all(win); return ETK_WINDOW(win); } int main(int argc, char *argv[]) { if (!etk_init(&argc, &argv)) { fprintf(stderr, "Could not init etk. Exiting...\n"); return -1; }; if (NmsConnect() != 0) { printf("NMS initialization failed. Exiting...\n"); return -2; } NmsSetOutputMode(0); SetFrameBufferVDMode(0); SetFrameBufferMode(fmMonitor); main_window_create(); etk_main(); etk_shutdown(); return 0; }