⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 treedir.c

📁 A MP3 Player Source Code, Enjoy it!
💻 C
字号:
#include "as31glue.h"#include "main.h"#include "printf.h"#include "sta013.h"#include "display.h"#include "dirlist.h"#include "treedir.h"#include "paulmon2.h"#define TREEVIEW_NAME_LEN 16#define TREEVIEW_VALUE_LEN 5#define FIRST_DISPLAY_LINE 2#define LAST_DISPLAY_LINE  8#define SCROLL_OFFSET      1#define TREEBUF_MAX 24#define MAX_SUBDIRS (LAST_DISPLAY_LINE-FIRST_DISPLAY_LINE)static simm_id /* struct dl_struct */ top_dir; // (first dir on screen)static simm_id /* struct dl_struct */ selected_dir; // (selected dir)xdata unsigned char treebuf[TREEBUF_MAX];xdata unsigned char treebuf_len;xdata unsigned char treedir_value[PARAM_COUNT];static xdata unsigned char line_selected;static dirlist_t * data dl_struct;// treeview_display displays the list directories on the lcd_displayvoid treedir_display() {#ifdef TREEDIR_CODE  xdata unsigned char i;  xdata unsigned char current_line;  xdata unsigned char *source;  xdata unsigned char *dest;  simm_id cur_dir;  simm_id store[MAX_SUBDIRS];  char store_level;  store_level=0;  cur_dir=top_dir;  if(top_dir==0 || cur_dir==0) {    printf("going no further in treedir\r\n");    return;  }  dl_struct = addr6(cur_dir);  printf("\r\n1st: %s\r\n", addr7(dl_struct->long_name));  // work through all the dirs displaying (where being displayed)  for(current_line = FIRST_DISPLAY_LINE;      (current_line <= LAST_DISPLAY_LINE) && cur_dir !=0;) {    dl_struct = addr6(cur_dir);    printf("tree: %s (%d) (%d)\r\n", addr7(dl_struct->long_name),       store_level, dl_struct->next);    // clear line, switch to current line, switch to tree font    printf("\\L%c\\[\\B %c\\C!",	   (char)(current_line + 31),	   (char)(current_line + 31));        for(i=0; i<store_level; i++)      printf("\\!"); // *** need to figure out when not to print this    // determine tree character    if (dl_struct->next==0)      print("\\+"); // last entry    else      print("\\*"); // continuation entry    // change font for selection    if (cur_dir==selected_dir)      printf("\\C!"); // bold        else      printf("\\C "); // normal    // print heading    source = addr7(dl_struct->long_name);    dest = treebuf;    treebuf_len = 0;    while(*source != '\0') {      treebuf_len++;      if(treebuf_len >= TREEBUF_MAX-store_level)	break;      else	*dest = *source;      source++;      dest++;    }    *dest = '\0';        printf("%s\\C \\]\r\n", treebuf);        current_line++; // increment when actually printed a line    // drop down a level, or continue on this level, or drop back?    if((dl_struct->subdir_start)!=0 &&       store_level<MAX_SUBDIRS && // expand this subdir?       dl_struct->treedir_expand) {      printf("\r\nexpanding subdir\r\n");      // store (simm_id) of next subdir in the list      // note: can't use parent_dir later and avoid this      //       because we need to know position in linked list      store[store_level]=dl_struct->next;      store_level++;      // change subdir to one below      cur_dir=dl_struct->subdir_start;    } else {      cur_dir = dl_struct->next;      while(cur_dir==0 && store_level>0) {	// restore (simm_id) of next dir	store_level--;	cur_dir=store[store_level];	printf("\r\ndropping back...");      }      printf("cur_dir=%d\r\n", cur_dir);    }  }#endif}unsigned char treedir_user_action(event_t event) {#ifdef TREEDIR_CODE  // returns 1 if display needs updating  dl_struct = addr6(selected_dir);  switch(event) {  case E_DOWN:    // look for next heading or expanded param    if (dl_struct->treedir_expand && dl_struct->subdir_start) {      // drop to next dir down      selected_dir=dl_struct->subdir_start;    } else if(dl_struct->next) {      selected_dir=dl_struct->next;    } else {      // need to try all previous directories      while(dl_struct->next==0 && dl_struct->parent_dir!=root) {	dl_struct=addr6(dl_struct->parent_dir);	printf("loop..");      }      if(dl_struct->parent_dir!=root) {	selected_dir=dl_struct->next;	printf("\r\nnext=%s\r\n", addr7(dl_struct->long_name));      } else {	return 0;      }    }        // also, pan down if necessary    if (line_selected < LAST_DISPLAY_LINE - SCROLL_OFFSET) {      line_selected++;      printf("\r\nnot panning whole display down\r\n");    } else {      printf("\r\npanning whole display down\r\n");      dl_struct = addr6(top_dir);      if (dl_struct->treedir_expand && dl_struct->subdir_start) {	top_dir=dl_struct->subdir_start;      } else if(dl_struct->next) {	top_dir=dl_struct->next;      } else {	// need to try all previous directories	while(dl_struct->prev==0 && dl_struct->parent_dir!=root) {	  dl_struct=addr6(dl_struct->parent_dir);	  printf("loop2..");	}	top_dir=dl_struct->prev;      }    }          return 1;    break;  case E_UP:    // find previous item to that selected    if(dl_struct->prev) {      // previous in same directory, trivial      printf("\r\nprevious in same directory, trivial\r\n");      selected_dir=dl_struct->prev;    } else if(dl_struct->parent_dir &&	      dl_struct->parent_dir!=root) {      printf("\r\nprevious in parent dir\r\n");      // previous is up a directory      dl_struct=addr6(dl_struct->parent_dir);      // assume parent dir has subdirs (i.e. don't check this)      selected_dir=dl_struct->subdir_end;      // need to find    } else {      printf("\r\nno previous!!!\r\n");      return 0;    }        // now, pan display up if necessary    if (line_selected > FIRST_DISPLAY_LINE + SCROLL_OFFSET) {      line_selected--;      printf("\r\ndecremented line_selected\r\n");    } else {      printf("\r\nset top_dir=selected_dir\r\n");      top_dir=selected_dir; // dir is same at top and selected    }        return 1;    break;  case E_LEFT:  case E_RIGHT:  case E_INC:    // invert show/not properties of selected item    dl_struct->treedir_expand=dl_struct->treedir_expand?0:1;    return 1;    break;  case E_DEC:    treedir_init();    return 1;    break;  default:    printf("Unsupported event %d\r\n", event);    break;  }    return 0;#endif}void treedir_init() {#ifdef TREEDIR_CODE  line_selected = FIRST_DISPLAY_LINE;  dl_struct=addr6(root);  top_dir=dl_struct->subdir_start;  selected_dir=top_dir;  dl_struct=addr6(top_dir);  printf("Initialized tree directory: root=%x top_dir=%x\r\n", root, top_dir);#endif}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -