📄 todo.c
字号:
}static void insertItem(Todo *todo, int row) { list = g_list_insert(list, todo, row); printf("newtablerow = %d\n", newTableRow()); update_table();}static void newBtnHandler(int id, void *data) { Todo *todo; int position; todo = g_new0(Todo, 1); if (selected) { todo->dueDate = selected->dueDate; todo->priority = selected->priority; position = ++current_row; } else { todo->dueDate = NO_DUE_DATE; todo->priority = 1; position = 0; } selected = todo; todo->title = g_strdup(""); todo->completed = FALSE; todo->new = TRUE; insertItem(todo, position); emtk_table_set_focus(table_id, position); }static void appendItem(Todo *todo) { ListWidgets *widgets; char *priorityStr, *dateStr; GDate *now, *dueDate; now = g_date_new(); dueDate = g_date_new(); g_date_set_time(now, time(NULL)); widgets = g_new0(ListWidgets, 1); widgets->cbid = emtk_table_append_checkbox_new(table_id, FONT1, "box_checked.png", "box_blank.png", "", 0, checkboxHandler, NULL, 0); emtk_checkbox_set_state(widgets->cbid, todo->completed); priorityStr = g_strdup_printf("%d", todo->priority); widgets->pbid = emtk_table_append_button_new(table_id, 20, 18, FONT2, priorityStr, 0, priorityButtonHandler, NULL, 1); emtk_button_set_border_width(widgets->pbid, 0); free(priorityStr); widgets->eid = emtk_entry_new(t_window, 0, 12, 0, KEY_TYPE_ANY, APP_WINDOW_W - 108, 50, FONT1, FONT1, NULL); emtk_entry_set_value(widgets->eid, todo->title, strlen(todo->title)); emtk_entry_set_value_change_callback(widgets->eid, entryValChanged, NULL); emtk_table_append_entry(table_id, widgets->eid, 2); if (todo->dueDate > 0) { g_date_set_time(dueDate, todo->dueDate); dateStr = g_new0(char, DATE_STR_BUFFER_LEN); if (g_date_compare(now, dueDate) > 0) { g_date_strftime(dateStr, DATE_STR_BUFFER_LEN, DATE_FORMAT_OVERDUE, dueDate); widgets->dbid = emtk_table_append_button_new(table_id, 50, 20, FONT2, dateStr, 0, dueDateBtnHandler, NULL, 3); emtk_button_set_foreground_color(widgets->dbid, DATE_DUE_COLOR); } else { g_date_strftime(dateStr, DATE_STR_BUFFER_LEN, DATE_FORMAT, dueDate); widgets->dbid = emtk_table_append_button_new(table_id, 50, 20, FONT2, dateStr, 0, dueDateBtnHandler, NULL, 3); } } else { dateStr = g_strdup("--"); widgets->dbid = emtk_table_append_button_new(table_id, 50, 20, FONT2, dateStr, 0, dueDateBtnHandler, NULL, 3); } table_widgets = g_list_append(table_widgets, widgets); g_free(dateStr); g_date_free(now); g_date_free(dueDate);}static int addEntry(int key, char *data) { Todo *todo; deserialize(&todo, data); list = g_list_append(list, todo); return TRUE;}static void drawListWnd(int window, WindowRect *clientRect) { GList *item; Todo *todo; t_window = window; emtk_window_add_object(window, emtk_button_new(window, 0, clientRect->h - 20, 60, 19, FONT1, _("New"), 0, newBtnHandler, NULL)); emtk_window_add_object(window, emtk_button_new(window, 65, clientRect->h - 20, 60, 19, FONT1, _("Delete..."), 0, deleteBtnHandler, NULL)); table_id = emtk_table_new(window, 0, 0, clientRect->w - 13, APP_LIST_HEIGHT , 4, APP_LIST_SIZE, 0); emtk_table_set_one_click_activate(table_id, TRUE); emtk_table_set_selection_callback(table_id, tableSelectionHandler, NULL); emtk_table_add_column_new(table_id, 20); emtk_table_set_column_margin(table_id, 0, 1); emtk_table_add_column_new(table_id, 25); emtk_table_set_column_margin(table_id, 1, 0); emtk_table_add_column_new(table_id, clientRect->w - 108); emtk_table_set_column_margin(table_id, 2, 0); emtk_table_add_column_new(table_id, 50); emtk_table_set_column_margin(table_id, 3, 0); emtk_table_set_highlight_color(table_id, emtk_app_get_hl_color()); emtk_window_add_object(window, table_id); emtk_table_add_vscrollbar_new(table_id, 13, VSCROLLBAR_ALIGN_RIGHT | VSCROLLBAR_ALWAYS_SHOWN); priority_menu = emtk_menu_new(window, 50, ((APP_WINDOW_H-90) >> 1), 30, 18, 5, 0, FONT1, FONT2, NULL, 0, prioritySelectionHandler, NULL); emtk_menu_set_one_click_activate(priority_menu, TRUE); emtk_menu_set_highlight_color(priority_menu, emtk_app_get_hl_color()); emtk_menu_append_item(priority_menu, "1"); emtk_menu_append_item(priority_menu, "2"); emtk_menu_append_item(priority_menu, "3"); emtk_menu_append_item(priority_menu, "4"); emtk_menu_append_item(priority_menu, "5");#if 0 due_date_menu = emtk_menu_new(window, 100, 50, 100, 18, 5, 0, FONT1, FONT2, NULL, 0, dueDateSelectionHandler, NULL);#endif due_date_menu = emtk_menu_new(window, ((APP_WINDOW_W-100) >> 1), ((APP_WINDOW_H-90) >> 1), 100, 18, 5, 0, FONT1, FONT2, NULL, 0, dueDateSelectionHandler, NULL); emtk_menu_set_one_click_activate(due_date_menu, TRUE); emtk_menu_set_highlight_color(due_date_menu, emtk_app_get_hl_color()); emtk_menu_append_item(due_date_menu, _("Today")); emtk_menu_append_item(due_date_menu, _("Tomorrow")); emtk_menu_append_item(due_date_menu, _("One week later")); emtk_menu_append_item(due_date_menu, _("No Date")); emtk_menu_append_item(due_date_menu, _("Choose date...")); list = NULL; db_iterate(db, addEntry); list = g_list_sort_stable(list, todoListSortPriority); for (item = list; item != NULL; item = g_list_next(item)) { todo = TODO(item->data); appendItem(todo); }#ifdef LAUNCHER_SUPPORT todo_ime_activate (TRUE);#endif }static void purgeCompletedItems() { int i, num_items = 0; Todo *todo; ListWidgets *widgets; int *table_widget_index; int records; records = g_list_length(list); table_widget_index = g_new0(int, records); for (i = records; i > 0; i--) { todo = TODO(g_list_nth_data(list, i - 1)); if (todo && todo->completed) { table_widget_index[num_items++] = i - 1; } } for (i = 0; i < num_items; i++) { todo = TODO(g_list_nth_data(list, table_widget_index[i])); list = g_list_remove(list, todo); todo_record_delete(db, todo); g_free(todo->title); g_free(todo); widgets = (ListWidgets *) g_list_nth_data(table_widgets, table_widget_index[i]); table_widgets = g_list_remove(table_widgets, widgets); g_free(widgets); emtk_table_remove_row(table_id, table_widget_index[i], TRUE); } if (g_list_length(list) > 0) { selected = TODO(list->data); } else { selected = NULL; } current_row = 0; emtk_table_set_focus(table_id, 0);}static void confirmPurgeHandler(int dialog, int action) { //int action = (int) data; switch(action) { case EMTK_DIALOG_OK: purgeCompletedItems(); case EMTK_DIALOG_CANCEL: //do nothing break; } emtk_app_close_window(purge_dialog);}static void drawConfirmPurgeDialog(int window, WindowRect *clientRect) { emtk_window_add_object(window, emtk_label_new(window, 20, 20, FONT1, FALSE, _("Delete all Completed items?")));}static void pulldownHandler(int mid, void *action_id) { int action = (int) action_id;#if !defined(UI_LAYOUT_SCHEME) || (UI_LAYOUT_SCHEME == 320240) WindowRect dimension = {0, 140, APP_WINDOW_W, 100};#elif (UI_LAYOUT_SCHEME == 240160) WindowRect dimension = {0, APP_WINDOW_H-100, APP_WINDOW_W, 100}; #endif switch(action) { case ACTION_DELETE_ITEM: if (selected) deleteBtnHandler(0, NULL); break; case ACTION_PURGE_ITEM: if (emtk_table_get_num_rows(table_id) > 0) purge_dialog = emtk_app_dialog_new(_("Purge"), lookupFont("en_US", MEDIUM_FONT), lookupFont("en_US", SMALL_FONT), drawConfirmPurgeDialog, EMTK_DIALOG_OK | EMTK_DIALOG_CANCEL, &dimension, confirmPurgeHandler, NULL); break; }}static void ime_message(int code) { DESKTOP_CHANNEL channel; MSG msg; int msgLen; msgLen = msg_command_input(code, &msg); desktop_channel_connect(&channel); desktop_channel_send(&channel, &msg, msgLen); desktop_channel_disconnect(&channel);}static void toolbar_handler(int id, int action, void *data) { switch(action) { case SHORTCUT_BUTTON_ENGLISH: if((ime_state & INPUT_LANG_MASK) == INPUT_ENGLISH) { ime_state = 0; last_ime = 0; } else { if (last_ime) emtk_app_set_shortcut_button_toggle_state(last_ime, FALSE); last_ime = id; ime_state = INPUT_ENGLISH | KEYBOARD | LAYOUT2; } break; case SHORTCUT_BUTTON_CHINESE: return; case SHORTCUT_BUTTON_THAI: if((ime_state & INPUT_LANG_MASK) == INPUT_THAI) { ime_state = 0; last_ime = 0; } else { if (last_ime) emtk_app_set_shortcut_button_toggle_state(last_ime, FALSE); last_ime = id; ime_state = INPUT_THAI | KEYBOARD | LAYOUT2; } break; case SHORTCUT_BUTTON_KEYBOARD: return; case SHORTCUT_BUTTON_HANDWRITE: return; } ime_message(ime_state);}static void init() { int mid; WindowRect rect = { APP_WINDOW_W - 90, 0, 70, 18 }; todo_window = emtk_app_window_new("Todo", lookupFont("en_US", MEDIUM_FONT), drawListWnd, closeHandler, pulldownHandler); mid = emtk_app_window_menu_add(todo_window, _("Record"), 0); emtk_app_window_menu_item_add(mid, _("Delete Item..."), ACTION_DELETE_ITEM); emtk_app_window_menu_item_add(mid, _("Purge..."), ACTION_PURGE_ITEM); toolbar_id = emtk_app_window_add_shortcut_bar(todo_window, &rect, toolbar_handler, SHORTCUT_BAR_HORIZONTAL); ime_keyboard = emtk_app_append_shortcut_button(toolbar_id, SHORTCUT_BUTTON_TOGGLE, "key02.jpg", "key01.jpg", 25, 18, 0, SHORTCUT_BUTTON_KEYBOARD, NULL); ime_thai = emtk_app_append_shortcut_button(toolbar_id, SHORTCUT_BUTTON_TOGGLE, "thaikbd_on.png", "thaikbd.png", 18, 18, 0, SHORTCUT_BUTTON_THAI, NULL); ime_english = emtk_app_append_shortcut_button(toolbar_id, SHORTCUT_BUTTON_TOGGLE, "engkbd_on.png", "engkbd.png", 18, 18, 0, SHORTCUT_BUTTON_ENGLISH, NULL);}#ifdef LAUNCHER_SUPPORTstatic void todo_desktop_msg(MSG *msg, gpointer user_data) { g_return_if_fail(msg != NULL); if (msg->type == MSG_TYPE_COMMAND && msg->subtype == MSG_COMMAND_CLOSE) { emtk_app_close_window(todo_window); }}#endif /* LAUNCHER_SUPPORT */int main(int argc, char **argv) {#ifdef LAUNCHER_SUPPORT DESKTOP_CHANNEL channel; if (!desktop_channel_listen_connect(&channel, todo_desktop_msg, NULL)) { printf("Failed opening channel for listening\n"); return 1; }#endif /* LAUNCHER_SUPPORT */ i18n_init(); init_font_table (NULL); db = todo_record_db_open(); if (!db) { fprintf(stderr, "Error opening memopad database, exiting\n"); exit(1); } emtk_app_init(&argc, &argv); emtk_app_root(APP_WINDOW_X, APP_WINDOW_Y, APP_WINDOW_W, APP_WINDOW_H); init(); emtk_app_run(); todo_record_db_close(db); #ifdef LAUNCHER_SUPPORT desktop_channel_listen_disconnect(&channel);#endif /* LAUNCHER_SUPPORT */ unload_font_table(); return 0; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -