OSDN Git Service

draw local image if exists.
authorOlyutorskii <olyutorskii@users.osdn.me>
Wed, 1 Apr 2020 14:21:30 +0000 (23:21 +0900)
committerOlyutorskii <olyutorskii@users.osdn.me>
Wed, 1 Apr 2020 14:21:30 +0000 (23:21 +0900)
src/main/java/jp/sfjp/jindolf/Controller.java
src/main/java/jp/sfjp/jindolf/config/AppSetting.java
src/main/java/jp/sfjp/jindolf/view/AvatarPics.java

index da98bef..c75e091 100644 (file)
@@ -78,6 +78,7 @@ import jp.sfjp.jindolf.util.GUIUtils;
 import jp.sfjp.jindolf.util.StringUtils;
 import jp.sfjp.jindolf.view.AccountPanel;
 import jp.sfjp.jindolf.view.ActionManager;
+import jp.sfjp.jindolf.view.AvatarPics;
 import jp.sfjp.jindolf.view.FilterPanel;
 import jp.sfjp.jindolf.view.FindPanel;
 import jp.sfjp.jindolf.view.HelpFrame;
@@ -1224,8 +1225,11 @@ public class Controller
                 System.out.println(e);
                 return;
             }
+            village.setLocalArchive(true);
+            AvatarPics avatarPics = village.getAvatarPics();
+            this.appSetting.applyLocalImage(avatarPics);
+            avatarPics.preload();
             EventQueue.invokeLater(() -> {
-                village.setLocalArchive(true);
                 selectedVillage(village);
             });
         }, "XML読み込み中", "XML読み込み完了");
index 61eb9d1..181a56c 100644 (file)
@@ -19,10 +19,12 @@ import java.util.List;
 import java.util.Map;
 import java.util.logging.Logger;
 import javax.imageio.ImageIO;
+import jp.sfjp.jindolf.data.Avatar;
 import jp.sfjp.jindolf.data.DialogPref;
 import jp.sfjp.jindolf.glyph.Font2Json;
 import jp.sfjp.jindolf.glyph.FontInfo;
 import jp.sfjp.jindolf.net.ProxyInfo;
+import jp.sfjp.jindolf.view.AvatarPics;
 import jp.sourceforge.jovsonz.JsBoolean;
 import jp.sourceforge.jovsonz.JsObject;
 import jp.sourceforge.jovsonz.JsPair;
@@ -416,6 +418,31 @@ public class AppSetting{
     }
 
     /**
+     * ローカル代替イメージを画像キャッシュに反映させる。
+     *
+     * @param avatarPics 画像キャッシュ
+     */
+    public void applyLocalImage(AvatarPics avatarPics){
+        BufferedImage graveImage     = this.avatarFaceMap.get("tomb");
+        BufferedImage graveBodyImage = this.avatarBodyMap.get("tomb");
+
+        avatarPics.setGraveImage(graveImage);
+        avatarPics.setGraveBodyImage(graveBodyImage);
+
+        for(Avatar avatar : Avatar.getPredefinedAvatarList()){
+            String avatarId = avatar.getIdentifier();
+
+            BufferedImage faceImage = this.avatarFaceMap.get(avatarId);
+            BufferedImage bodyImage = this.avatarBodyMap.get(avatarId);
+
+            avatarPics.setAvatarFaceImage(avatar, faceImage);
+            avatarPics.setAvatarBodyImage(avatar, bodyImage);
+        }
+
+        return;
+    }
+
+    /**
      * ネットワーク設定をセーブする。
      */
     private void saveNetConfig(){
index 12f0565..00c97d9 100644 (file)
@@ -11,6 +11,7 @@ import java.awt.image.BufferedImage;
 import java.text.MessageFormat;
 import java.util.HashMap;
 import java.util.Map;
+import java.util.Objects;
 import jp.sfjp.jindolf.data.Avatar;
 import jp.sfjp.jindolf.data.Land;
 import jp.sfjp.jindolf.util.GUIUtils;
@@ -23,24 +24,34 @@ public class AvatarPics {
 
     private final Land land;
 
-    private final Map<Avatar, BufferedImage> faceImageMap =
-            new HashMap<>();
-    private final Map<Avatar, BufferedImage> bodyImageMap =
-            new HashMap<>();
-    private final Map<Avatar, BufferedImage> faceMonoImageMap =
-            new HashMap<>();
-    private final Map<Avatar, BufferedImage> bodyMonoImageMap =
-            new HashMap<>();
+    private final Map<Avatar, BufferedImage> faceImageMap;
+    private final Map<Avatar, BufferedImage> bodyImageMap;
+    private final Map<Avatar, BufferedImage> faceMonoImageMap;
+    private final Map<Avatar, BufferedImage> bodyMonoImageMap;
+
+    private BufferedImage graveImage;
+    private BufferedImage graveBodyImage;
 
 
     /**
-     * COnstructor.
+     * Constructor.
      *
      * @param land 国
      */
     public AvatarPics(Land land){
         super();
+
+        Objects.nonNull(land);
         this.land = land;
+
+        this.faceImageMap     = new HashMap<>();
+        this.bodyImageMap     = new HashMap<>();
+        this.faceMonoImageMap = new HashMap<>();
+        this.bodyMonoImageMap = new HashMap<>();
+
+        this.graveImage     = null;
+        this.graveBodyImage = null;
+
         return;
     }
 
@@ -68,6 +79,19 @@ public class AvatarPics {
     }
 
     /**
+     * Avatarの顔イメージを設定する。
+     *
+     * @param avatar Avatar
+     * @param image イメージ
+     */
+    public void setAvatarFaceImage(Avatar avatar, BufferedImage image){
+        this.faceImageMap.remove(avatar);
+        this.faceMonoImageMap.remove(avatar);
+        this.faceImageMap.put(avatar, image);
+        return;
+    }
+
+    /**
      * Avatarの全身像イメージを返す。
      *
      * @param avatar Avatar
@@ -90,6 +114,19 @@ public class AvatarPics {
     }
 
     /**
+     * Avatarの全身像イメージを設定する。
+     *
+     * @param avatar Avatar
+     * @param image イメージ
+     */
+    public void setAvatarBodyImage(Avatar avatar, BufferedImage image){
+        this.bodyImageMap.remove(avatar);
+        this.bodyMonoImageMap.remove(avatar);
+        this.bodyImageMap.put(avatar, image);
+        return;
+    }
+
+    /**
      * 各国URLテンプレートと通し番号から
      * イメージをダウンロードする。
      *
@@ -142,23 +179,65 @@ public class AvatarPics {
     }
 
     /**
-     * 国に登録された墓イメージを返す。
+     * 国別の墓イメージを返す。
      *
      * @return 墓イメージ
      */
     public BufferedImage getGraveImage(){
+        if(this.graveImage != null) return this.graveImage;
+
         BufferedImage result = this.land.getGraveIconImage();
+        this.graveImage = result;
+
         return result;
     }
 
     /**
-     * 国に登録された墓イメージ(大)を返す。
+     * 墓イメージを設定する。
+     *
+     * @param image イメージ
+     */
+    public void setGraveImage(BufferedImage image){
+        this.graveImage = image;
+        return;
+    }
+
+    /**
+     * 国別の墓イメージ(大)を返す。
      *
      * @return 墓イメージ(大)
      */
     public BufferedImage getGraveBodyImage(){
+        if(this.graveBodyImage != null) return this.graveBodyImage;
+
         BufferedImage result = this.land.getGraveBodyImage();
+        this.graveBodyImage = result;
+
         return result;
     }
 
+    /**
+     * 墓イメージ(大)を設定する。
+     *
+     * @param image イメージ
+     */
+    public void setGraveBodyImage(BufferedImage image){
+        this.graveBodyImage = image;
+        return;
+    }
+
+    /**
+     * 全画像のキャッシュへの格納を試みる。
+     */
+    public void preload(){
+        for(Avatar avatar : Avatar.getPredefinedAvatarList()){
+            getAvatarFaceImage(avatar);
+            getAvatarBodyImage(avatar);
+            getAvatarFaceMonoImage(avatar);
+            getAvatarBodyMonoImage(avatar);
+            getGraveImage();
+            getGraveBodyImage();
+        }
+    }
+
 }