static int scroll_cb(guiObject_t *parent, u8 pos, s8 direction, void *data) { (void)data; (void)parent; int page = pos + (direction > 0 ? 1 : -1); if (page < 0) { return pos; } else if(page >= GUI_GetScrollbarNumItems(&gui->scrollbar)) { return pos; } int idx = 0; if (page) { for(int i = 0; i < NUM_SYMBOL_COLS * page; i++) { idx = get_next_icon(idx); if (idx < 0) { idx = 0; break; } } } GUI_RemoveHierObjects((guiObject_t *)&gui->symbolicon[0]); FullRedraw = REDRAW_ONLY_DIRTY; GUI_DrawBackground(0, 79, LCD_WIDTH - 16, LCD_HEIGHT - 79); show_icons((long)data, idx); return page; }
static int row_cb(int absrow, int relrow, int y, void *data) { int SelectedIcon = (long)data; struct ImageMap img; int idx = 0; int i; for(i = 0; i < NUM_COLS * absrow; i++) { idx = get_next_icon(idx); if (idx < 0) { return 0; } } for(i = 0; i < NUM_COLS; i++) { img = TGLICO_GetImage(idx); int x = 22 + i * (TOGGLEICON_WIDTH+4); GUI_CreateImageOffset(&gui->symbolicon[relrow * NUM_COLS + i], x, y, TOGGLEICON_WIDTH, TOGGLEICON_HEIGHT, img.x_off, img.y_off, img.file, tglico_select_cb, (void *)((long)(SelectedIcon << 8) | idx)); idx = get_next_icon(idx); if(idx < 0) return i+1; } return i; }
static void show_icons(int SelectedIcon, int idx) { int x, y; struct ImageMap img; u8 cursel = Model.pagecfg2.elem[tp->tglidx].extra[SelectedIcon]; for(int i = 0; i < NUM_SYMBOL_ELEMS; i++) { y = 80 + (i / NUM_SYMBOL_COLS) * 40; x = 8 + (i - (i / NUM_SYMBOL_COLS) * NUM_SYMBOL_COLS) * (TOGGLEICON_WIDTH+8); img = TGLICO_GetImage(idx); //printf("%d(%d): (%d, %d) %s / %d\n", i, idx, x, y, img.file, img.x_off); GUI_CreateImageOffset(&gui->symbolicon[i], x, y, TOGGLEICON_WIDTH, TOGGLEICON_HEIGHT, img.x_off, img.y_off, img.file, tglico_select_cb, (void *)((long)(SelectedIcon << 8) | idx)); if (idx == cursel) GUI_CreateRect(&gui->symbolframe, x-1, y-1, TOGGLEICON_WIDTH+2, TOGGLEICON_HEIGHT+2, &outline); idx = get_next_icon(idx); if(idx < 0) break; } }
void briefing_editor_dlg::update_data(int update) { char buf[MAX_LABEL_LEN], buf2[MAX_ICON_TEXT_LEN], buf3[MAX_BRIEF_LEN]; int i, j, l, lines, count, enable = TRUE, valid = 0, invalid = 0; object *objp; brief_stage *ptr = NULL; if (update) UpdateData(TRUE); // save off current data before we update over it with new briefing stage/team stuff Briefing = save_briefing; Mission_music[SCORE_BRIEFING] = m_briefing_music - 1; strcpy(The_mission.substitute_briefing_music_name, m_substitute_briefing_music); if (m_last_stage >= 0) { ptr = &Briefing->stages[m_last_stage]; deconvert_multiline_string(buf3, m_text, MAX_BRIEF_LEN); if (stricmp(ptr->new_text, buf3)) set_modified(); strcpy(ptr->new_text, buf3); MODIFY(ptr->camera_time, atoi(m_time)); string_copy(ptr->voice, m_voice, MAX_FILENAME_LEN, 1); i = ptr->flags; if (m_cut_prev) i |= BS_BACKWARD_CUT; else i &= ~BS_BACKWARD_CUT; if (m_cut_next) i |= BS_FORWARD_CUT; else i &= ~BS_FORWARD_CUT; MODIFY(ptr->flags, i); ptr->formula = m_tree.save_tree(); switch (m_lines.GetCheck()) { case 1: // add lines between every pair of 2 marked icons if there isn't one already. for (i=0; i<ptr->num_icons - 1; i++) for (j=i+1; j<ptr->num_icons; j++) { if ( icon_marked[i] && icon_marked[j] ) { for (l=0; l<ptr->num_lines; l++) if ( ((ptr->lines[l].start_icon == i) && (ptr->lines[l].end_icon == j)) || ((ptr->lines[l].start_icon == j) && (ptr->lines[l].end_icon == i)) ) break; if ((l == ptr->num_lines) && (l < MAX_BRIEF_STAGE_LINES)) { ptr->lines[l].start_icon = i; ptr->lines[l].end_icon = j; ptr->num_lines++; } } } break; case 0: // remove all existing lines between any 2 marked icons i = ptr->num_lines; while (i--) if ( icon_marked[ptr->lines[i].start_icon] && icon_marked[ptr->lines[i].end_icon] ) { ptr->num_lines--; for (l=i; l<ptr->num_lines; l++) ptr->lines[l] = ptr->lines[l + 1]; } break; } if (m_last_icon >= 0) { valid = (m_id != ptr->icons[m_last_icon].id); if (m_id >= 0) { if (valid && !m_change_local) { for (i=m_last_stage+1; i<Briefing->num_stages; i++) { if (find_icon(m_id, i) >= 0) { char msg[1024]; valid = 0; sprintf(msg, "Icon ID #%d is already used in a later stage. You can only\n" "change to that ID locally. Icon ID has been reset back to %d", m_id, ptr->icons[m_last_icon].id); m_id = ptr->icons[m_last_icon].id; MessageBox(msg); break; } } } for (i=0; i<ptr->num_icons; i++) if ((i != m_last_icon) && (ptr->icons[i].id == m_id)) { char msg[1024]; sprintf(msg, "Icon ID #%d is already used in this stage. Icon ID has been reset back to %d", m_id, ptr->icons[m_last_icon].id); m_id = ptr->icons[m_last_icon].id; MessageBox(msg); break; } if (valid && !m_change_local) { set_modified(); reset_icon_loop(m_last_stage); while (get_next_icon(ptr->icons[m_last_icon].id)) iconp->id = m_id; } } ptr->icons[m_last_icon].id = m_id; string_copy(buf, m_icon_label, MAX_LABEL_LEN); if (stricmp(ptr->icons[m_last_icon].label, buf) && !m_change_local) { set_modified(); reset_icon_loop(m_last_stage); while (get_next_icon(m_id)) strcpy(iconp->label, buf); } strcpy(ptr->icons[m_last_icon].label, buf); if ( m_hilight ) ptr->icons[m_last_icon].flags |= BI_HIGHLIGHT; else ptr->icons[m_last_icon].flags &= ~BI_HIGHLIGHT; if (m_flipicon) ptr->icons[m_last_icon].flags |= BI_MIRROR_ICON; else ptr->icons[m_last_icon].flags &= ~BI_MIRROR_ICON; if ((ptr->icons[m_last_icon].type != m_icon_image) && !m_change_local) { set_modified(); reset_icon_loop(m_last_stage); while (get_next_icon(m_id)) iconp->type = m_icon_image; } ptr->icons[m_last_icon].type = m_icon_image; if ((ptr->icons[m_last_icon].team != m_icon_team) && !m_change_local) { set_modified(); reset_icon_loop(m_last_stage); while (get_next_icon(m_id)) iconp->team = m_icon_team; } ptr->icons[m_last_icon].team = m_icon_team; if ((ptr->icons[m_last_icon].ship_class != m_ship_type) && !m_change_local) { set_modified(); reset_icon_loop(m_last_stage); while (get_next_icon(m_id)) iconp->ship_class = m_ship_type; } MODIFY(ptr->icons[m_last_icon].ship_class, m_ship_type); deconvert_multiline_string(buf2, m_icon_text, MAX_ICON_TEXT_LEN); /* if (stricmp(ptr->icons[m_last_icon].text, buf2) && !m_change_local) { set_modified(); reset_icon_loop(m_last_stage); while (get_next_icon(m_id)) strcpy(iconp->text, buf2); } strcpy(ptr->icons[m_last_icon].text, buf2); */ } } if (!::IsWindow(m_hWnd)) return; // set briefing pointer to correct team Briefing = &Briefings[m_current_briefing]; if ((m_cur_stage >= 0) && (m_cur_stage < Briefing->num_stages)) { ptr = &Briefing->stages[m_cur_stage]; m_stage_title.Format("Stage %d of %d", m_cur_stage + 1, Briefing->num_stages); m_text = convert_multiline_string(ptr->new_text); m_time.Format("%d", ptr->camera_time); m_voice = ptr->voice; m_cut_prev = (ptr->flags & BS_BACKWARD_CUT) ? 1 : 0; m_cut_next = (ptr->flags & BS_FORWARD_CUT) ? 1 : 0; m_tree.load_tree(ptr->formula); } else { m_stage_title = _T("No stages"); m_text = _T(""); m_time = _T(""); m_voice = _T(""); m_cut_prev = m_cut_next = 0; m_tree.clear_tree(); enable = FALSE; m_cur_stage = -1; } if (m_cur_stage == Briefing->num_stages - 1) GetDlgItem(IDC_NEXT) -> EnableWindow(FALSE); else GetDlgItem(IDC_NEXT) -> EnableWindow(enable); if (m_cur_stage) GetDlgItem(IDC_PREV) -> EnableWindow(enable); else GetDlgItem(IDC_PREV) -> EnableWindow(FALSE); if (Briefing->num_stages >= MAX_BRIEF_STAGES) GetDlgItem(IDC_ADD_STAGE) -> EnableWindow(FALSE); else GetDlgItem(IDC_ADD_STAGE) -> EnableWindow(TRUE); if (Briefing->num_stages) { GetDlgItem(IDC_DELETE_STAGE) -> EnableWindow(enable); GetDlgItem(IDC_INSERT_STAGE) -> EnableWindow(enable); } else { GetDlgItem(IDC_DELETE_STAGE) -> EnableWindow(FALSE); GetDlgItem(IDC_INSERT_STAGE) -> EnableWindow(FALSE); } GetDlgItem(IDC_TIME) -> EnableWindow(enable); GetDlgItem(IDC_VOICE) -> EnableWindow(enable); GetDlgItem(IDC_BROWSE) -> EnableWindow(enable); GetDlgItem(IDC_TEXT) -> EnableWindow(enable); GetDlgItem(IDC_SAVE_VIEW) -> EnableWindow(enable); GetDlgItem(IDC_GOTO_VIEW) -> EnableWindow(enable); GetDlgItem(IDC_CUT_PREV) -> EnableWindow(enable); GetDlgItem(IDC_CUT_NEXT) -> EnableWindow(enable); GetDlgItem(IDC_TREE) -> EnableWindow(enable); GetDlgItem(IDC_PLAY) -> EnableWindow(enable); if ((m_cur_stage >= 0) && (m_cur_icon >= 0) && (m_cur_icon < ptr->num_icons)) { m_hilight = (ptr->icons[m_cur_icon].flags & BI_HIGHLIGHT)?1:0; m_flipicon = (ptr->icons[m_cur_icon].flags & BI_MIRROR_ICON)?1:0; m_icon_image = ptr->icons[m_cur_icon].type; m_icon_team = ptr->icons[m_cur_icon].team; m_icon_label = ptr->icons[m_cur_icon].label; m_ship_type = ptr->icons[m_cur_icon].ship_class; // m_icon_text = convert_multiline_string(ptr->icons[m_cur_icon].text); m_id = ptr->icons[m_cur_icon].id; enable = TRUE; } else { m_flipicon = FALSE; m_hilight = FALSE; m_icon_image = -1; m_icon_team = -1; m_ship_type = -1; m_icon_label = _T(""); m_cur_icon = -1; m_id = 0; enable = FALSE; } GetDlgItem(IDC_ICON_TEXT) -> EnableWindow(enable); GetDlgItem(IDC_ICON_LABEL) -> EnableWindow(enable); GetDlgItem(IDC_ICON_IMAGE) -> EnableWindow(enable); GetDlgItem(IDC_SHIP_TYPE) -> EnableWindow(enable); GetDlgItem(IDC_HILIGHT) -> EnableWindow(enable); GetDlgItem(IDC_FLIP_ICON) -> EnableWindow(enable); GetDlgItem(IDC_LOCAL) -> EnableWindow(enable); GetDlgItem(IDC_TEAM) -> EnableWindow(enable); GetDlgItem(IDC_ID) -> EnableWindow(enable); GetDlgItem(IDC_DELETE_ICON) -> EnableWindow(enable); valid = invalid = 0; objp = GET_FIRST(&obj_used_list); while (objp != END_OF_LIST(&obj_used_list)) { if (objp->flags & OF_MARKED) { if ((objp->type == OBJ_SHIP) || (objp->type == OBJ_START) || (objp->type == OBJ_WAYPOINT) || (objp->type == OBJ_JUMP_NODE)) valid = 1; else invalid = 1; } objp = GET_NEXT(objp); } if (m_cur_stage >= 0) ptr = &Briefing->stages[m_cur_stage]; if (valid && !invalid && (m_cur_stage >= 0) && (ptr->num_icons < MAX_STAGE_ICONS)) GetDlgItem(IDC_MAKE_ICON) -> EnableWindow(TRUE); else GetDlgItem(IDC_MAKE_ICON) -> EnableWindow(FALSE); if (m_cur_stage >= 0) for (i=0; i<ptr->num_icons; i++) icon_marked[i] = 0; valid = invalid = 0; objp = GET_FIRST(&obj_used_list); while (objp != END_OF_LIST(&obj_used_list)) { if (objp->flags & OF_MARKED) { if (objp->type == OBJ_POINT) { valid++; icon_marked[objp->instance] = 1; } else invalid++; } objp = GET_NEXT(objp); } if (valid && !invalid && (m_cur_stage >= 0)) GetDlgItem(IDC_PROPAGATE_ICONS) -> EnableWindow(TRUE); else GetDlgItem(IDC_PROPAGATE_ICONS) -> EnableWindow(FALSE); count = 0; lines = 1; // default lines checkbox to checked if (m_cur_stage >= 0) { for (i=0; i<ptr->num_lines; i++) line_marked[i] = 0; // go through and locate all lines between marked icons for (i=0; i<ptr->num_icons - 1; i++) for (j=i+1; j<ptr->num_icons; j++) { if ( icon_marked[i] && icon_marked[j] ) { for (l=0; l<ptr->num_lines; l++) if ( ((ptr->lines[l].start_icon == i) && (ptr->lines[l].end_icon == j)) || ((ptr->lines[l].start_icon == j) && (ptr->lines[l].end_icon == i)) ) { line_marked[l] = 1; count++; // track number of marked lines (lines between 2 icons that are both marked) break; } // at least 1 line missing between 2 marked icons, so use mixed state if (l == ptr->num_lines) lines = 2; } } } // not even 1 line between any 2 marked icons? Set checkbox to unchecked. if (!count) lines = 0; i = 0; if (m_cur_stage >= 0){ i = calc_num_lines_for_icons(valid) + ptr->num_lines - count; } if ((valid > 1) && !invalid && (m_cur_stage >= 0) && (i <= MAX_BRIEF_STAGE_LINES)) GetDlgItem(IDC_LINES) -> EnableWindow(TRUE); else GetDlgItem(IDC_LINES) -> EnableWindow(FALSE); m_lines.SetCheck(lines); UpdateData(FALSE); if ((m_last_stage != m_cur_stage) || (Briefing != save_briefing)) { if (m_last_stage >= 0) { for (i=0; i<save_briefing->stages[m_last_stage].num_icons; i++) { // save positions of all icons, in case they have moved save_briefing->stages[m_last_stage].icons[i].pos = Objects[icon_obj[i]].pos; // release objects being used by last stage obj_delete(icon_obj[i]); } } if (m_cur_stage >= 0) { for (i=0; i<ptr->num_icons; i++) { // create an object for each icon for display/manipulation purposes icon_obj[i] = obj_create(OBJ_POINT, -1, i, NULL, &ptr->icons[i].pos, 0.0f, OF_RENDERS); } obj_merge_created_list(); } m_last_stage = m_cur_stage; } m_last_icon = m_cur_icon; Update_window = 1; save_briefing = Briefing; }