rendered paste body#include <string.h>
#include <unistd.h>
#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;
}