All pastes #360701 Raw Edit

Unnamed

public text v1 · immutable
#360701 ·published 2007-02-17 17:54 UTC
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;
}