<URL: http://bugs.freeciv.org/Ticket/Display.html?id=39667 >

> [dmarks - Do 18. Okt 2007, 01:05:45]:
> 
> This is good news!
> 
> Found some issues testing it:
> 
> -The client crashes when there are no savegames in any datapath.

fixed in the attached patch.

> -I doesn't seem to be able to load saves from .freeciv/saves/ (which
> is the standard save dir on this system) - they show up in the dialog
> fine, but you try to load them the server says that it cannot find the
> file. If I move the file to my home dir, it works fine.

okay, found out that the full path needs to be given to the /load
command for savegames in this directory. But now with the full path
sent, all load requests are "disallowed for security reasons". For some
reason the SDL client seems to be recognized only as "restricted
caller". Will investigate further.

Index: client/gui-sdl/chatline.c
===================================================================
--- client/gui-sdl/chatline.c	(revision 13780)
+++ client/gui-sdl/chatline.c	(working copy)
@@ -27,6 +27,7 @@
 
 /* utility */
 #include "fcintl.h"
+#include "log.h"
 
 /* common */
 #include "game.h"
@@ -46,6 +47,7 @@
 #include "gui_tilespec.h"
 #include "mapview.h"
 #include "messagewin.h"
+#include "pages.h"
 #include "themespec.h"
 #include "unistring.h"
 #include "widget.h"
@@ -545,7 +547,9 @@
   pBuf->size.y = pStartGameButton->size.y;
 
   pBuf->action = select_nation_callback;
-  set_wstate(pBuf, FC_WS_NORMAL);
+  if (get_client_page() != PAGE_LOAD) {
+    set_wstate(pBuf, FC_WS_NORMAL);
+  }
   add_to_gui_list(ID_BUTTON, pBuf);
   pSelectNationButton = pBuf;
   
Index: client/gui-sdl/pages.c
===================================================================
--- client/gui-sdl/pages.c	(revision 13780)
+++ client/gui-sdl/pages.c	(working copy)
@@ -44,6 +44,244 @@
 static enum client_pages old_page = PAGE_MAIN;
 
 /**************************************************************************
+                                  LOAD PAGE
+**************************************************************************/
+
+struct ADVANCED_DLG *pLoadDialog;
+
+static int move_load_dialog_callback(struct widget *pWindow)
+{
+  if (Main.event.button.button == SDL_BUTTON_LEFT) {
+    move_window_group(pLoadDialog->pBeginWidgetList, pWindow);
+  }
+  return -1;
+}
+
+static void close_load_page(void)
+{
+    popdown_window_group_dialog(pLoadDialog->pBeginWidgetList, pLoadDialog->pEndWidgetList);
+    flush_dirty();
+}
+
+static int exit_load_dlg_callback(struct widget *pWidget)
+{
+  if (Main.event.button.button == SDL_BUTTON_LEFT) {
+    set_client_page(PAGE_MAIN);
+  }
+  return -1;
+}
+
+static int load_selected_game_callback(struct widget *pWidget)
+{
+  if (Main.event.button.button == SDL_BUTTON_LEFT) {
+    char *filename = (char*)pWidget->data.ptr;
+
+    if (is_server_running() || client_start_server()) {
+      char message[MAX_LEN_MSG];
+
+      my_snprintf(message, sizeof(message), "/load %s", filename);
+      send_chat(message);
+    } else {
+      set_client_page(PAGE_MAIN);
+    }
+  }
+  return -1;
+}
+
+static void show_load_page(void)
+{
+  struct widget *pWindow;
+  struct widget *pCloseButton;
+  struct widget *pFilenameLabel = NULL;
+  struct widget *pFirstLabel = NULL;
+  struct widget *pLastLabel = NULL;
+  struct widget *pNextLabel = NULL; 
+  SDL_String16 *pTitle, *pFilename;
+  SDL_Rect area;
+  struct datafile_list *files;
+  int count = 0;
+  int scrollbar_width = 0;
+  int max_label_width = 0;
+  
+  pLoadDialog = fc_calloc(1, sizeof(struct ADVANCED_DLG));
+
+  pTitle = create_str16_from_char(_("Choose Saved Game to Load"), adj_font(12));
+  pTitle->style |= TTF_STYLE_BOLD;
+  
+  pWindow = create_window_skeleton(NULL, pTitle, 0);
+  pWindow->action = move_load_dialog_callback; 
+  set_wstate(pWindow, FC_WS_NORMAL);
+  
+  add_to_gui_list(ID_WINDOW, pWindow);
+
+  pLoadDialog->pEndWidgetList = pWindow;
+
+  area = pWindow->area;
+  
+  /* close button */
+  pCloseButton = create_themeicon(pTheme->Small_CANCEL_Icon, pWindow->dst,
+                                  WF_WIDGET_HAS_INFO_LABEL | WF_RESTORE_BACKGROUND);
+  pCloseButton->string16 = create_str16_from_char(_("Close Dialog (Esc)"), adj_font(12));
+  pCloseButton->action = exit_load_dlg_callback;
+  set_wstate(pCloseButton, FC_WS_NORMAL);
+  pCloseButton->key = SDLK_ESCAPE;
+  
+  add_to_gui_list(ID_BUTTON, pCloseButton);
+
+  area.w += pCloseButton->size.w;
+
+  pLoadDialog->pBeginWidgetList = pCloseButton;
+
+  /* create scrollbar */
+  scrollbar_width = create_vertical_scrollbar(pLoadDialog, 1, 20, TRUE, TRUE);
+  hide_scrollbar(pLoadDialog->pScroll);
+
+  /* search for user saved games. */
+  files = datafilelist_infix("saves", ".sav", FALSE);
+  datafile_list_iterate(files, pfile) {
+    
+    count++;
+    
+    pFilename = create_str16_from_char(pfile->name, adj_font(13));
+    pFilename->style |= SF_CENTER;
+    pFilenameLabel = create_iconlabel(NULL, pWindow->dst, pFilename,
+      (WF_FREE_DATA | WF_SELLECT_WITHOUT_BAR | WF_RESTORE_BACKGROUND));
+     
+    /* store filename */
+    pFilenameLabel->data.ptr = fc_calloc(1, strlen(pfile->fullname) + 1);
+    mystrlcpy((char*)pFilenameLabel->data.ptr, pfile->fullname, strlen(pfile->fullname) + 1);
+    
+    pFilenameLabel->action = load_selected_game_callback;
+     
+    set_wstate(pFilenameLabel, FC_WS_NORMAL);
+    
+    /* FIXME: this was supposed to be add_widget_to_vertical_scroll_widget_list(), but
+     * add_widget_to_vertical_scroll_widget_list() needs the scrollbar area to be defined
+     * for updating the scrollbar position, but the area is not known yet (depends on
+     * maximum label width) */ 
+    add_to_gui_list(ID_LABEL, pFilenameLabel);
+
+    if (count == 1) {
+      pFirstLabel = pFilenameLabel;
+    }
+
+    max_label_width = MAX(max_label_width, pFilenameLabel->size.w);
+        
+    free(pfile->name);
+    free(pfile->fullname);
+    free(pfile);
+  } datafile_list_iterate_end;
+
+  datafile_list_unlink_all(files);
+  datafile_list_free(files);
+
+  files = datafilelist_infix(NULL, ".sav", FALSE);
+  datafile_list_iterate(files, pfile) {
+    
+    count++;
+    
+    pFilename = create_str16_from_char(pfile->name, adj_font(13));
+    pFilename->style |= SF_CENTER;
+    pFilenameLabel = create_iconlabel(NULL, pWindow->dst, pFilename,
+      (WF_FREE_DATA | WF_SELLECT_WITHOUT_BAR | WF_RESTORE_BACKGROUND));
+     
+    /* store filename */
+    pFilenameLabel->data.ptr = fc_calloc(1, strlen(pfile->fullname) + 1);
+    mystrlcpy((char*)pFilenameLabel->data.ptr, pfile->fullname, strlen(pfile->fullname) + 1);
+    
+    pFilenameLabel->action = load_selected_game_callback;
+     
+    set_wstate(pFilenameLabel, FC_WS_NORMAL);
+    
+    /* FIXME: this was supposed to be add_widget_to_vertical_scroll_widget_list(), but
+     * add_widget_to_vertical_scroll_widget_list() needs the scrollbar area to be defined
+     * for updating the scrollbar position, but the area is not known yet (depends on
+     * maximum label width) */ 
+    add_to_gui_list(ID_LABEL, pFilenameLabel);
+
+    if (count == 1) {
+      pFirstLabel = pFilenameLabel;
+    }
+
+    max_label_width = MAX(max_label_width, pFilenameLabel->size.w);
+        
+    free(pfile->name);
+    free(pfile->fullname);
+    free(pfile);
+  } datafile_list_iterate_end;
+
+  datafile_list_unlink_all(files);
+  datafile_list_free(files);
+
+  pLastLabel = pFilenameLabel;
+
+  area.w = MAX(area.w, max_label_width + scrollbar_width + 1);
+  
+  if (count > 0) {
+    area.h = (pLoadDialog->pScroll->active * pFilenameLabel->size.h) + adj_size(5);
+  }
+
+  resize_window(pWindow, theme_get_background(theme, BACKGROUND_LOADGAMEDLG),
+                NULL,
+                (pWindow->size.w - pWindow->area.w) + area.w,
+                (pWindow->size.h - pWindow->area.h) + area.h);
+      
+  area = pWindow->area;
+      
+  setup_vertical_scrollbar_area(pLoadDialog->pScroll,
+    area.x + area.w - 1,
+    area.y + 1,
+    area.h - adj_size(2), TRUE);
+
+  /* add filename labels to list */
+  pFilenameLabel = pFirstLabel;
+  while (pFilenameLabel) {
+    pFilenameLabel->size.w = area.w - scrollbar_width - 3;
+
+    pNextLabel = pFilenameLabel->prev;
+
+    del_widget_pointer_from_gui_list(pFilenameLabel);
+    if (pFilenameLabel == pFirstLabel) {
+      add_widget_to_vertical_scroll_widget_list(pLoadDialog,
+          pFilenameLabel, pCloseButton,
+          FALSE,
+          area.x + 1,
+          area.y + adj_size(2));
+    } else {
+      add_widget_to_vertical_scroll_widget_list(pLoadDialog,
+          pFilenameLabel,
+          pLoadDialog->pBeginActiveWidgetList,
+          FALSE,
+          area.x + 1,
+          area.y + adj_size(2));
+    }
+    
+    if (pFilenameLabel == pLastLabel) {
+      break;
+    }
+         
+    pFilenameLabel = pNextLabel;
+  }
+
+  widget_set_position(pWindow,
+                      (Main.screen->w - pWindow->size.w) / 2,
+                      (Main.screen->h - pWindow->size.h) / 2);
+
+  widget_set_position(pCloseButton,
+                      area.x + area.w - pCloseButton->size.w - 1,
+                      pWindow->size.y + adj_size(2));
+
+  /* FIXME: the scrollbar already got a background saved in
+   * add_widget_to_vertical_scroll_widget_list(), but the window
+   * is not drawn yet, so this saved background is wrong.
+   * Deleting it here as a workaround. */
+  FREESURFACE(pLoadDialog->pScroll->pScrollBar->gfx);
+
+  redraw_group(pLoadDialog->pBeginWidgetList, pWindow, 0);
+  widget_flush(pWindow);
+}
+
+/**************************************************************************
                                   MAIN PAGE
 **************************************************************************/
 static struct SMALL_DLG *pStartMenu = NULL;
@@ -72,6 +310,17 @@
 /**************************************************************************
   ...
 **************************************************************************/
+static int load_game_callback(struct widget *pWidget)
+{
+  if (Main.event.button.button == SDL_BUTTON_LEFT) {
+    set_client_page(PAGE_LOAD);
+  }
+  return -1;
+}
+
+/**************************************************************************
+  ...
+**************************************************************************/
 static int join_game_callback(struct widget *pWidget)
 {
   if (Main.event.button.button == SDL_BUTTON_LEFT) {
@@ -173,9 +422,9 @@
   pWidget = create_iconlabel_from_chars(NULL, pWindow->dst, _("Load Game"),
             adj_font(14),
 	    (WF_SELLECT_WITHOUT_BAR|WF_RESTORE_BACKGROUND));
-  /*pWidget->action = popup_load_game_callback;*/
+  pWidget->action = load_game_callback;
   pWidget->string16->style |= SF_CENTER;
-  pWidget->string16->fgcol = *get_game_colorRGB(COLOR_THEME_WIDGET_DISABLED_TEXT);
+  set_wstate(pWidget, FC_WS_NORMAL);
   
   add_to_gui_list(ID_LOAD_GAME, pWidget);
   
@@ -312,6 +561,7 @@
     popdown_window_group_dialog(pStartMenu->pBeginWidgetList,
                                 pStartMenu->pEndWidgetList);
     FC_FREE(pStartMenu);
+    flush_dirty();
   }
 }
 
@@ -329,6 +579,9 @@
     case PAGE_MAIN:
       popdown_start_menu();
       break;
+    case PAGE_LOAD:
+      close_load_page();
+      break;
     case PAGE_NETWORK:
       close_connection_dialog();
       break;
@@ -341,11 +594,14 @@
     default: 
       break;
   }
-  
+
   switch (page) {
     case PAGE_MAIN:
       show_main_page();
       break;
+    case PAGE_LOAD:
+      show_load_page();
+      break;
     case PAGE_NETWORK:
       popup_join_game_dialog();
       break;
Index: client/gui-sdl/themebackgrounds.c
===================================================================
--- client/gui-sdl/themebackgrounds.c	(revision 13780)
+++ client/gui-sdl/themebackgrounds.c	(working copy)
@@ -41,6 +41,7 @@
   "economydlg",
   "hlpdlg",
   "joingamedlg",
+  "loadgamedlg",
   "mainpage",
   "messagewin",
   "nationdlg",
Index: client/gui-sdl/themebackgrounds.h
===================================================================
--- client/gui-sdl/themebackgrounds.h	(revision 13780)
+++ client/gui-sdl/themebackgrounds.h	(working copy)
@@ -29,6 +29,7 @@
   BACKGROUND_ECONOMYDLG,
   BACKGROUND_HELPDLG,
   BACKGROUND_JOINGAMEDLG,
+  BACKGROUND_LOADGAMEDLG,
   BACKGROUND_MAINPAGE,
   BACKGROUND_MESSAGEWIN,
   BACKGROUND_NATIONDLG,
Index: data/themes/gui-sdl/human/backgrounds.themespec
===================================================================
--- data/themes/gui-sdl/human/backgrounds.themespec	(revision 13780)
+++ data/themes/gui-sdl/human/backgrounds.themespec	(working copy)
@@ -22,6 +22,7 @@
 economydlg          = "themes/gui-sdl/human/bg"
 hlpdlg              = "themes/gui-sdl/human/bg"
 joingamedlg         = "themes/gui-sdl/human/bg"
+loadgamedlg         = "themes/gui-sdl/human/bg"
 mainpage            = "misc/intro"
 messagewin	    = "themes/gui-sdl/human/bg2"
 nationdlg           = "themes/gui-sdl/human/bg"
_______________________________________________
Freeciv-dev mailing list
Freeciv-dev@gna.org
https://mail.gna.org/listinfo/freeciv-dev

Reply via email to