📄 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 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 + -