/************************************************************************** Popup (or raise) the spaceship dialog for the given player. **************************************************************************/ void popup_spaceship_dialog(struct player *pPlayer) { struct SMALL_DLG *pSpaceShp; if(!(pSpaceShp = get_spaceship_dialog(pPlayer))) { struct widget *pBuf, *pWindow; SDL_String16 *pStr; char cBuf[128]; SDL_Rect area; pSpaceShp = fc_calloc(1, sizeof(struct SMALL_DLG)); fc_snprintf(cBuf, sizeof(cBuf), _("The %s Spaceship"), nation_adjective_for_player(pPlayer)); pStr = create_str16_from_char(cBuf, adj_font(12)); pStr->style |= TTF_STYLE_BOLD; pWindow = create_window_skeleton(NULL, pStr, 0); pWindow->action = space_dialog_window_callback; set_wstate(pWindow, FC_WS_NORMAL); pWindow->data.player = pPlayer; pWindow->private_data.small_dlg = pSpaceShp; add_to_gui_list(ID_WINDOW, pWindow); pSpaceShp->pEndWidgetList = pWindow; area = pWindow->area; /* ---------- */ /* create exit button */ pBuf = create_themeicon(pTheme->Small_CANCEL_Icon, pWindow->dst, WF_WIDGET_HAS_INFO_LABEL | WF_RESTORE_BACKGROUND); pBuf->info_label = create_str16_from_char(_("Close Dialog (Esc)"), adj_font(12)); pBuf->data.player = pPlayer; pBuf->action = exit_space_dialog_callback; set_wstate(pBuf, FC_WS_NORMAL); pBuf->key = SDLK_ESCAPE; area.w = MAX(area.w, (pBuf->size.w + adj_size(10))); add_to_gui_list(ID_BUTTON, pBuf); pBuf = create_themeicon_button_from_chars(pTheme->OK_Icon, pWindow->dst, _("Launch"), adj_font(12), 0); pBuf->action = launch_spaceship_callback; area.w = MAX(area.w, pBuf->size.w); area.h += pBuf->size.h + adj_size(20); add_to_gui_list(ID_BUTTON, pBuf); pStr = create_str16_from_char(get_spaceship_descr(NULL), adj_font(12)); pStr->bgcol = (SDL_Color) { 0, 0, 0, 0 }; pBuf = create_iconlabel(NULL, pWindow->dst, pStr, WF_RESTORE_BACKGROUND); area.w = MAX(area.w, pBuf->size.w); area.h += pBuf->size.h + adj_size(20); add_to_gui_list(ID_LABEL, pBuf); pSpaceShp->pBeginWidgetList = pBuf; /* -------------------------------------------------------- */ area.w = MAX(area.w, adj_size(300) - (pWindow->size.w - pWindow->area.w)); resize_window(pWindow, NULL, NULL, (pWindow->size.w - pWindow->area.w) + area.w, (pWindow->size.h - pWindow->area.h) + area.h); area = pWindow->area; widget_set_position(pWindow, (main_window_width() - pWindow->size.w) / 2, (main_window_height() - pWindow->size.h) / 2); /* exit button */ pBuf = pWindow->prev; pBuf->size.x = area.x + area.w - pBuf->size.w - 1; pBuf->size.y = pWindow->size.y + adj_size(2); /* launch button */ pBuf = pBuf->prev; pBuf->size.x = area.x + (area.w - pBuf->size.w) / 2; pBuf->size.y = area.y + area.h - pBuf->size.h - adj_size(7); /* info label */ pBuf = pBuf->prev; pBuf->size.x = area.x + (area.w - pBuf->size.w) / 2; pBuf->size.y = area.y + adj_size(7); dialog_list_prepend(dialog_list, pSpaceShp); refresh_spaceship_dialog(pPlayer); } else { if (sellect_window_group_dialog(pSpaceShp->pBeginWidgetList, pSpaceShp->pEndWidgetList)) { widget_flush(pSpaceShp->pEndWidgetList); } } }
/***************************************************************************** Create citizens dialog *****************************************************************************/ static struct citizens_dialog *citizens_dialog_create(const struct city *pcity) { GtkWidget *frame, *sw; struct citizens_dialog *pdialog = fc_malloc(sizeof(struct citizens_dialog)); int i; pdialog->pcity = pcity; pdialog->store = citizens_dialog_store_new(); pdialog->sort = gtk_tree_model_sort_new_with_model(GTK_TREE_MODEL(pdialog->store)); g_object_unref(pdialog->store); gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(pdialog->sort), citizens_dialog_default_sort_column(), GTK_SORT_DESCENDING); pdialog->list = gtk_tree_view_new_with_model(GTK_TREE_MODEL(pdialog->sort)); gtk_widget_set_halign(pdialog->list, GTK_ALIGN_CENTER); g_object_unref(pdialog->sort); for (i = 0; i < num_citizens_cols; i++) { struct citizens_column *pcol; GtkCellRenderer *renderer; GtkTreeViewColumn *col; pcol = &citizens_cols[i]; col = NULL; switch (pcol->type) { case COL_FLAG: renderer = gtk_cell_renderer_pixbuf_new(); col = gtk_tree_view_column_new_with_attributes(_(pcol->title), renderer, "pixbuf", i, NULL); break; case COL_TEXT: renderer = gtk_cell_renderer_text_new(); g_object_set(renderer, "style-set", TRUE, "weight-set", TRUE, NULL); col = gtk_tree_view_column_new_with_attributes(_(pcol->title), renderer, "text", i, "style", CITIZENS_DLG_COL_STYLE, "weight", CITIZENS_DLG_COL_WEIGHT, NULL); gtk_tree_view_column_set_sort_column_id(col, i); break; case COL_RIGHT_TEXT: renderer = gtk_cell_renderer_text_new(); g_object_set(renderer, "style-set", TRUE, "weight-set", TRUE, NULL); col = gtk_tree_view_column_new_with_attributes(_(pcol->title), renderer, "text", i, "style", CITIZENS_DLG_COL_STYLE, "weight", CITIZENS_DLG_COL_WEIGHT, NULL); gtk_tree_view_column_set_sort_column_id(col, i); g_object_set(renderer, "xalign", 1.0, NULL); gtk_tree_view_column_set_alignment(col, 1.0); break; case COL_COLOR: case COL_BOOLEAN: /* These are not used. */ fc_assert(pcol->type != COL_COLOR && pcol->type != COL_BOOLEAN); continue; } if (col) { gtk_tree_view_append_column(GTK_TREE_VIEW(pdialog->list), col); } } gtk_widget_set_hexpand(GTK_WIDGET(pdialog->list), TRUE); gtk_widget_set_vexpand(GTK_WIDGET(pdialog->list), TRUE); sw = gtk_scrolled_window_new(NULL, NULL); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(sw), GTK_SHADOW_NONE); gtk_container_add(GTK_CONTAINER(sw), pdialog->list); frame = gtk_frame_new(_("Citizens")); gtk_container_add(GTK_CONTAINER(frame), sw); pdialog->shell = frame; dialog_list_prepend(dialog_list, pdialog); citizens_dialog_refresh(pcity); return pdialog; }