📄 treedir.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 1#define LAST_DISPLAY_LINE 8#define SCROLL_OFFSET 0#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)static simm_id /* struct fl_struct */ top_file; // Same as for the dirsstatic simm_id /* struct fl_struct */ selected_file;static bit dir_selected;/* boolean to tell whether a file or dir is selected */extern data simm_id temp_id;static xdata unsigned char treebuf[TREEBUF_MAX];static xdata unsigned char treebuf_len;static xdata unsigned char treedir_value[PARAM_COUNT];// these 2 appear to be write only variables, never// actually used in the display codestatic xdata unsigned char line_selected_fl;static xdata unsigned char line_selected_dl;dirlist_t * data dl_struct;filelist_t * data fl_struct;// treeview_display displays the list directories on the lcd_display//#pragma NOGCSEvoidtreedir_display(){ xdata unsigned char i; xdata unsigned char j; //xdata unsigned char k; xdata unsigned char current_line; xdata unsigned char *source; xdata unsigned char *dest; simm_id cur_dir; simm_id cur_file; simm_id store[MAX_SUBDIRS]; xdata unsigned char store_level; print("\r\n\r\n\r\nBegin treedir_display\r\n"); if (dir_selected) { store_level=0; cur_dir=top_dir; if (top_dir==0 || cur_dir==0) { return; } // work out basic store level temp_id=top_dir; while(temp_id != 0) { dl_struct=addr6(temp_id); temp_id=dl_struct->parent_dir; store_level++; } store_level--; dl_struct = Addr6(selected_dir); printf("selected_dir: %s\r\n", Addr7(dl_struct->long_name)); dl_struct = Addr6(cur_dir); printf("1st: %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; current_line++) { dl_struct = Addr6(cur_dir); //printf("tree: %s (%d) (%d)\r\n", Addr7(dl_struct->long_name), // store_level, dl_struct->next); // turn off scrolling, clear line, switch to current line, // switch to tree font print("\\A0\\L"); print_char((char)(current_line + 31)); print("\\[\\B "); print_char((char)(current_line + 31)); print("\\C!"); // for each level (character) for(i=0; i<store_level; i++) { temp_id=cur_dir; dl_struct=addr6(temp_id); // get this level dir for(j=i; j<store_level; j++) { temp_id=dl_struct->parent_dir; dl_struct=addr6(temp_id); } if(dl_struct->next==0) print_char(' '); else print("\\!"); } dl_struct = Addr6(cur_dir); // determine tree character if (dl_struct->next==0) print("\\+"); // last entry else print("\\*"); // continuation entry // change font for selection if (cur_dir==selected_dir) print("\\C!"); // bold else print("\\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'; print_str(treebuf); print("\\C \\]"); print_crlf(); // 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==1) { //print("\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(store_level>0 && cur_dir==0) { // restore (simm_id) of next dir store_level--; cur_dir=store[store_level]; //print("\r\ndropping back..."); } //printf("cur_dir=%d\r\n", cur_dir); } } } else { cur_file = top_file; if (top_file==0 || cur_file == 0) return; for (current_line = FIRST_DISPLAY_LINE; (current_line <= LAST_DISPLAY_LINE) && cur_file !=0; current_line++) { fl_struct = Addr6(cur_file); // clear line, turn off scrolling, switch to current line, // switch to tree font print("\\A0\\L"); print_char((char)(current_line + 31)); print("\\[\\B "); print_char((char)(current_line + 31)); print("\\C!"); // determine tree character if (fl_struct->next==0) print("\\+"); // last file else print("\\*"); // continuation // change font if selected and set scroll if (cur_file==selected_file) print("\\C!\\A2"); // bold else print("\\C \\A0"); // normal // print filename source = Addr7(fl_struct->long_name); dest = treebuf; treebuf_len = 0; while(*source!='\0') { treebuf_len++; if(treebuf_len >= TREEBUF_MAX && cur_file!=selected_file) break; else *dest = *source; source++; dest++; } *dest = '\0'; print_str(treebuf); print("\\C \\]"); print_crlf; // change to next file if there are any remaining cur_file=fl_struct->next; } }}unsigned chartreedir_user_action(event_t event){ //xdata unsigned char i; // returns 1 if display needs updating dl_struct = Addr6(selected_dir); //printf("treedir_expand: %hx\r\n", dl_struct->treedir_expand); switch(event) { case E_RIGHT: if(dl_struct->treedir_expand==2){ //Play file selected in filelist fl_struct=Addr6(selected_file); e_play_selected_file = fl_struct->pl_entry; add_new_event(E_PLAY_SELECTED); return 0; break; } if(dl_struct->treedir_expand==1 || dl_struct->subdir_start==0) { // goto filelist if needed //dir_selected=dir_selected?0:1; dir_selected ^= 1; selected_file=dl_struct->filelist_start; top_file=selected_file; line_selected_fl=0; if(dl_struct->subdir_start==0) dl_struct->treedir_expand++; } if(dl_struct->treedir_expand!=2) { // go deeper dl_struct->treedir_expand++; } return 1; break; case E_LEFT: if(dl_struct->treedir_expand!=0) // go shallower dl_struct->treedir_expand--; if(dl_struct->treedir_expand==1) { // change out from filelist if //dir_selected=dir_selected?0:1; // needed dir_selected ^= 1; if(dl_struct->subdir_start==0) dl_struct->treedir_expand--; } return 1; break; case E_DOWN: if(dir_selected) { // look for next heading or expanded param if (dl_struct->treedir_expand==1 && 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 higher-up directories temp_id=selected_dir; while(dl_struct->next==0 && temp_id!=root) { temp_id=dl_struct->parent_dir; dl_struct=addr6(temp_id); } if(temp_id==root) { //print("\r\nback to root\r\n"); return 0; } else { selected_dir=dl_struct->next; //printf("\r\nnext=%s\r\n", Addr7(dl_struct->long_name)); } } // also, pan down if necessary if (line_selected_dl < LAST_DISPLAY_LINE - SCROLL_OFFSET) { line_selected_dl++; //not panning whole display down } else { //panning whole display down dl_struct = Addr6(top_dir); if (dl_struct->treedir_expand==1 && 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 higher-up directories temp_id=top_dir; while(dl_struct->next==0 && temp_id!=root) { temp_id=dl_struct->parent_dir; dl_struct=addr6(temp_id); } if(temp_id==root) { //back to root return 0; } else { top_dir=dl_struct->next; } } } } else { //scroll filelist fl_struct=Addr6(selected_file); //printf("\r\ntop_file: %x, selected_file: %x, line_selected: %hx\r\n", top_file, selected_file, line_selected_fl); //Go to next file if exists if(fl_struct->next) { selected_file=fl_struct->next; //pan down if necessary if(line_selected_fl < LAST_DISPLAY_LINE - SCROLL_OFFSET) line_selected_fl++; else { fl_struct=Addr6(top_file); if(fl_struct->next) top_file=fl_struct->next; } } else return 0; } return 1; break; case E_UP: // find previous item to that selected if(dir_selected){ // scroll dirlist if(dl_struct->prev) { // previous in same directory, trivial if not expanded //print("\r\nprevious in same directory, trivial\r\n"); selected_dir=dl_struct->prev; dl_struct=Addr6(selected_dir); while(dl_struct->treedir_expand==1 && dl_struct->subdir_end) { selected_dir=dl_struct->subdir_end; dl_struct=Addr6(selected_dir); } } else if(dl_struct->parent_dir && selected_dir!=root /*dl_struct->parent_dir!=root*/) { //print("\r\nprevious in parent dir\r\n"); // previous is up a directory selected_dir=dl_struct->parent_dir; dl_struct=Addr6(selected_dir); } else { //print("\r\nno previous!!!\r\n"); return 0; } // now, pan display up if necessary if (line_selected_dl >= FIRST_DISPLAY_LINE + SCROLL_OFFSET) { line_selected_dl--; //print("\r\ndecremented line_selected\r\n"); } else { //print("\r\nset top_dir=selected_dir\r\n"); top_dir=selected_dir; // dir is same at top and selected } } else { // scroll filelist fl_struct=Addr6(selected_file); //printf("\r\ntop_file: %x, selected_file: %x, line_selected: %hx\r\n", top_file, selected_file, line_selected_fl); //Go to next file if not first if(fl_struct->prev) selected_file=fl_struct->prev; else return 0; if(line_selected_fl >= FIRST_DISPLAY_LINE + SCROLL_OFFSET) line_selected_fl--; else top_file=selected_file; } return 1; break; case E_DEC:#if 0 if(!dir_selected) { line_selected_fl=0; for(i=0;i<=MAX_SUBDIRS && ((filelist_t *)Addr6(top_dir))->next;i++) top_file=fl_struct->next; selected_file=top_file; } return 1; break;#endif case E_INC:#if 0 if(!dir_selected) { line_selected_fl=0; for(i=0;i<=MAX_SUBDIRS && ((filelist_t *)Addr6(top_dir))->prev;i++) top_file=fl_struct->prev; selected_file=top_file; } return 1;#endif break; default: printf("Unsupported event %d\r\n", event); break; } return 0;}// TODO: remove thissimm_id treedir_get_selected(void) { fl_struct = addr6(selected_file); return fl_struct->pl_entry;}void treedir_init() { line_selected_dl = FIRST_DISPLAY_LINE; line_selected_fl = FIRST_DISPLAY_LINE; //dl_struct=Addr6(root); //top_dir=dl_struct->subdir_start; top_dir=root; selected_dir=top_dir; top_file=0; selected_file=0; dir_selected=1; //dl_struct=Addr6(top_dir); //printf("Initialized tree directory: root=%x top_dir=%x\r\n", root, top_dir);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -