<outputDirectory>.</outputDirectory>\r
<includes>\r
<include>*.exe</include>\r
- <include>*.jar</include>\r
</includes>\r
</fileSet>\r
<fileSet>\r
<outputDirectory>.</outputDirectory>\r
<includes>\r
<include>*.exe</include>\r
- <include>*.jar</include>\r
</includes>\r
</fileSet>\r
<fileSet>\r
import charactermanaj.graphics.filters.ColorConvertParameter;\r
import charactermanaj.graphics.io.ImageResource;\r
import charactermanaj.model.Layer;\r
+import charactermanaj.model.LayerOrderMapper;\r
import charactermanaj.model.PartsIdentifier;\r
import charactermanaj.model.PartsSet;\r
import charactermanaj.model.PartsSpecResolver;\r
import charactermanaj.model.io.PartsImageCollectionParser;\r
-import charactermanaj.model.io.PartsImageCollectionParser.LayerOrderMapper;\r
\r
/**\r
* 非同期に複合画像を生成するイメージビルダに引き渡すジョブを生成するためのアダプタクラス.<br>\r
package charactermanaj.model;\r
\r
import java.util.Collections;\r
+import java.util.Comparator;\r
import java.util.HashMap;\r
import java.util.Map;\r
\r
return true;\r
}\r
\r
+ /**\r
+ * 表示名によるソート順\r
+ */\r
+ public static final Comparator<CustomLayerOrderKey> COMPARATOR = new Comparator<CustomLayerOrderKey>() {\r
+ @Override\r
+ public int compare(CustomLayerOrderKey o1, CustomLayerOrderKey o2) {\r
+ // 表示名でソートする\r
+ // ※ ソート順でマップ化した場合、表示名が異なるがIDが同一のものができうるため\r
+ // ツリーマップ化などを使う場合はロジックでID重複を防ぐ必要がある。\r
+ int ret = o1.displayName.compareTo(o2.displayName);\r
+ if (ret == 0) {\r
+ ret = o1.id.compareTo(o2.id);\r
+ }\r
+ return ret;\r
+ }\r
+ };\r
+\r
@Override\r
public int compareTo(CustomLayerOrderKey o) {\r
- int ret = displayName.compareTo(o.displayName);\r
- if (ret == 0) {\r
- ret = id.compareTo(o.id);\r
- }\r
- return ret;\r
+ return COMPARATOR.compare(this, o);\r
}\r
\r
@Override\r
--- /dev/null
+package charactermanaj.model;\r
+\r
+import java.util.Collection;\r
+import java.util.HashMap;\r
+import java.util.Map;\r
+\r
+/**\r
+ * カスタムレイヤー順の定義リストからレイヤーに対する順序を索引できるようにする。\r
+ */\r
+public class CustomLayerOrderMapper implements LayerOrderMapper {\r
+\r
+ private Map<Layer, Float> layerOrderMap;\r
+\r
+ public CustomLayerOrderMapper() {\r
+ this(null);\r
+ }\r
+\r
+ public CustomLayerOrderMapper(Collection<CustomLayerOrder> orders) {\r
+ initMapping(orders);\r
+ }\r
+\r
+ public final void initMapping(Collection<CustomLayerOrder> orders) {\r
+ this.layerOrderMap = createLayerOrderMap(orders);\r
+ }\r
+\r
+ private static Map<Layer, Float> createLayerOrderMap(Collection<CustomLayerOrder> orders) {\r
+ Map<Layer, Float> layerOrderMap = new HashMap<Layer, Float>();\r
+ if (orders != null) {\r
+ for (CustomLayerOrder layerOrder : orders) {\r
+ Layer layer = layerOrder.getLayer();\r
+ float order = layerOrder.getLayerOrder();\r
+ layerOrderMap.put(layer, order);\r
+ }\r
+ }\r
+ return layerOrderMap;\r
+ }\r
+\r
+ @Override\r
+ public float getLayerOrder(Layer layer) {\r
+ Float order = layerOrderMap.get(layer);\r
+ if (order == null) {\r
+ order = (float) layer.getOrder();\r
+ }\r
+ return order;\r
+ }\r
+}\r
--- /dev/null
+package charactermanaj.model;\r
+\r
+/**\r
+ * レイヤーの補正済み順序を取得する\r
+ */\r
+public interface LayerOrderMapper {\r
+\r
+ float getLayerOrder(Layer layer);\r
+}
\ No newline at end of file
import charactermanaj.graphics.io.ImageResource;\r
import charactermanaj.model.ColorInfo;\r
import charactermanaj.model.Layer;\r
+import charactermanaj.model.LayerOrderMapper;\r
import charactermanaj.model.PartsColorInfo;\r
import charactermanaj.model.PartsFiles;\r
import charactermanaj.model.PartsIdentifier;\r
}\r
\r
/**\r
- * レイヤーの補正済み順序を取得する\r
- */\r
- public interface LayerOrderMapper {\r
-\r
- float getLayerOrder(Layer layer);\r
- }\r
-\r
- /**\r
* パーツ設定を解決するためのインターフェイス\r
*/\r
protected PartsSpecResolver partsSpecResolver;\r
import charactermanaj.graphics.io.PNGFileImageHeaderReader;\r
import charactermanaj.model.AppConfig;\r
import charactermanaj.model.Layer;\r
+import charactermanaj.model.LayerOrderMapper;\r
import charactermanaj.model.PartsIdentifier;\r
import charactermanaj.model.PartsSet;\r
import charactermanaj.model.PartsSpecResolver;\r
import charactermanaj.model.io.PartsImageCollectionParser;\r
-import charactermanaj.model.io.PartsImageCollectionParser.LayerOrderMapper;\r
import charactermanaj.model.io.PartsImageCollectionParser.PartsImageCollectionHandler;\r
import charactermanaj.ui.model.AbstractTableModelWithComboBoxModel;\r
import charactermanaj.util.DesktopUtilities;\r
import charactermanaj.model.ColorGroup;\r
import charactermanaj.model.CustomLayerOrder;\r
import charactermanaj.model.CustomLayerOrderKey;\r
+import charactermanaj.model.LayerOrderMapper;\r
import charactermanaj.model.PartsCategory;\r
import charactermanaj.model.PartsColorInfo;\r
import charactermanaj.model.PartsColorManager;\r
import charactermanaj.model.io.CharacterDataPersistent;\r
import charactermanaj.model.io.CustomLayerOrderPersist;\r
import charactermanaj.model.io.CustomLayerOrderPersist.CustomLayerOrderPersistListener;\r
-import charactermanaj.model.io.PartsImageCollectionParser.LayerOrderMapper;\r
import charactermanaj.model.io.PartsImageDirectoryWatchAgent;\r
import charactermanaj.model.io.PartsImageDirectoryWatchAgentFactory;\r
import charactermanaj.model.io.PartsImageDirectoryWatchEvent;\r
import charactermanaj.ui.ManageFavoriteDialog.FavoriteManageCallback;\r
import charactermanaj.ui.PreviewPanel.PreviewPanelEvent;\r
import charactermanaj.ui.PreviewPanel.PreviewPanelListener;\r
+import charactermanaj.ui.model.ActiveCustomLayerPatternMgr;\r
import charactermanaj.ui.model.ColorChangeEvent;\r
import charactermanaj.ui.model.ColorChangeListener;\r
import charactermanaj.ui.model.ColorGroupCoordinator;\r
-import charactermanaj.ui.model.CustomLayerPatternMgr;\r
import charactermanaj.ui.model.FavoritesChangeEvent;\r
import charactermanaj.ui.model.FavoritesChangeListener;\r
import charactermanaj.ui.model.FavoritesChangeObserver;\r
/**\r
* カスタムレイヤーパターンのリストを管理する\r
*/\r
- private final CustomLayerPatternMgr customLayerPatternMgr = new CustomLayerPatternMgr();\r
+ private final ActiveCustomLayerPatternMgr customLayerPatternMgr = new ActiveCustomLayerPatternMgr();\r
\r
/**\r
* アクティブなメインフレームを設定する.\r
// それ以上大きい画像の場合は増えた分だけフレームを大きくしておく.\r
setSize(imageWidth - 300 + 600, imageHeight - 400 + 550);\r
\r
- // 次回表示時にプラットフォーム固有位置に表示するように予約\r
- setLocationByPlatform(true);\r
+ // 現在表示されていなければ、次回表示時にプラットフォーム固有位置に表示するように予約\r
+ if (!isShowing()) {\r
+ setLocationByPlatform(true);\r
+ }\r
}\r
\r
/**\r
protected void onSelectedCustomLayerMenu(JMenu menu) {\r
// メニューの再構築\r
ArrayList<JMenuItem> menuItems = new ArrayList<JMenuItem>();\r
- for (Map.Entry<CustomLayerOrderKey, List<CustomLayerOrder>> entry :\r
- customLayerPatternMgr.getMap().entrySet()) {\r
+ for (Map.Entry<CustomLayerOrderKey, List<CustomLayerOrder>> entry : customLayerPatternMgr.getOrderedEntries()) {\r
final CustomLayerOrderKey patternKey = entry.getKey();\r
final String displayName = patternKey.getDisplayName();\r
final JCheckBoxMenuItem menuItem = new JCheckBoxMenuItem(displayName);\r
private PartsSet requestPartsSet;\r
\r
/**\r
+ * 適用されているカスタムレイヤー順序\r
+ */\r
+ private LayerOrderMapper layerOrderMapper;\r
+\r
+ /**\r
* 非同期のイメージ構築要求の番号.<br>\r
*/\r
private long ticket;\r
previewPane.setPreviewImage(img);\r
previewPane.setLoadingComplete(ticket);\r
showPresetName(requestPartsSet);\r
+\r
+ // 表示対象のパーツセットの情報で更新する (情報ダイアログが開いていれば)\r
+ if (informationDialog != null) {\r
+ informationDialog.showPartsInformation(requestPartsSet, layerOrderMapper);\r
+ }\r
}\r
};\r
if (SwingUtilities.isEventDispatchThread()) {\r
@Override\r
protected PartsSet getPartsSet() {\r
// 合成できる状態になった時点でイメージビルダから呼び出される.\r
- final PartsSet[] result = new PartsSet[1];\r
Runnable collectPartsSetJob = new Runnable() {\r
public void run() {\r
- PartsSet partsSet = partsSelectionManager.createPartsSet();\r
- result[0] = partsSet;\r
+ requestPartsSet = partsSelectionManager.createPartsSet();\r
\r
- // 表示対象のパーツセットの情報で更新する (情報ダイアログが開いていれば)\r
- if (informationDialog != null) {\r
- informationDialog.showPartsInformation(partsSet, customLayerPatternMgr);\r
- }\r
+ // getPartsSetで得られるパーツセットで保持しているカスタムレイヤーパターン名ではなく、\r
+ // 現在画面に適用している作業中のカスタムレイヤーのマッパーを取得する。\r
+ // ※ カスタムレイヤー編集ダイアログの動的なレイヤー変更によるプレビューに対応するため\r
+ layerOrderMapper = customLayerPatternMgr.getLayerOrderMapper();\r
}\r
};\r
if (SwingUtilities.isEventDispatchThread()) {\r
}\r
}\r
if (logger.isLoggable(Level.FINE)) {\r
- logger.log(Level.FINE, "preview: " + result[0]);\r
+ logger.log(Level.FINE, "preview: " + requestPartsSet);\r
}\r
- requestPartsSet = result[0];\r
return requestPartsSet;\r
}\r
@Override\r
protected LayerOrderMapper getLayerOrderMapper() {\r
- return customLayerPatternMgr;\r
+ return layerOrderMapper;\r
}\r
});\r
}\r
}\r
\r
PartsSet partsSet = partsSelectionManager.createPartsSet();\r
+ LayerOrderMapper layerOrderMapper = customLayerPatternMgr.getLayerOrderMapper();\r
+\r
if (informationDialog == null) {\r
informationDialog = new InformationDialog(this, characterData, new Runnable() {\r
@Override\r
}\r
});\r
}\r
- informationDialog.showPartsInformation(partsSet, customLayerPatternMgr);\r
+\r
+ informationDialog.showPartsInformation(partsSet, layerOrderMapper);\r
informationDialog.setVisible(true);\r
}\r
\r
@Override\r
public void onChange(charactermanaj.ui.LayerOrderCustomizeDialog.LayerOrderCustomizeListener.Change e) {\r
// レイヤーパターンの編集がされた場合、プレビューする\r
- customLayerPatternMgr.applyCustomLayerOrder(layerOrderCustomDlg.getEdittingCustomLayerOrderList());\r
+ customLayerPatternMgr.initCustomLayerOrderMap(layerOrderCustomDlg.getEdittingCustomLayerOrderList());\r
requestPreview();\r
}\r
});\r
\r
// 現在保持しているレイヤーパターンの一覧を取得する\r
final LayerOrderCustomizeDialogModel layerOrderCustomDialogModel = new LayerOrderCustomizeDialogModel();\r
- for (Map.Entry<CustomLayerOrderKey, List<CustomLayerOrder>> entry :\r
- customLayerPatternMgr.getMap().entrySet()) {\r
+ // レイヤーパターン名を表示順に並べてからモデルに登録する。\r
+ for (Map.Entry<CustomLayerOrderKey, List<CustomLayerOrder>> entry : customLayerPatternMgr.getOrderedEntries()) {\r
CustomLayerOrderKey orderKey = entry.getKey();\r
List<CustomLayerOrder> customLayerOrderList = entry.getValue();\r
layerOrderCustomDialogModel.put(orderKey, customLayerOrderList);\r
}\r
\r
// 現在選択しているアクティブなレイヤーパターンを取得する\r
- List<CustomLayerOrder> currentList = customLayerPatternMgr.getMergedCustomLayerOrderList();\r
+ List<CustomLayerOrder> currentList = customLayerPatternMgr.getActiveCustomLayerOrderList();\r
layerOrderCustomDialogModel.setCurrentList(currentList);\r
\r
layerOrderCustomDlg.setModel(layerOrderCustomDialogModel);\r
customLayerPatternMgr.setSelected(lastPatternName, true);\r
}\r
\r
+ // プレビューのために設定していたレイヤー順序を本来のアクティブカスタムレイヤーのものに戻す\r
+ customLayerPatternMgr.initActiveCustomLayerOrderMap();\r
+\r
requestPreview();\r
}\r
\r
}\r
}),\r
}),\r
+ new MenuDataFactory("menu.customlayer", new MenuDataFactory[] {\r
+ new MenuDataFactory("customlayer.manage", new ActionListener() {\r
+ public void actionPerformed(ActionEvent e) {\r
+ onManageCustomLayer();\r
+ }\r
+ }),\r
+ null,\r
+ }),\r
new MenuDataFactory("menu.favorite", new MenuDataFactory[] {\r
new MenuDataFactory("favorite.register", new ActionListener() {\r
public void actionPerformed(ActionEvent e) {\r
}),\r
null,\r
}),\r
- new MenuDataFactory("menu.customlayer", new MenuDataFactory[] {\r
- new MenuDataFactory("customlayer.manage", new ActionListener() {\r
- public void actionPerformed(ActionEvent e) {\r
- onManageCustomLayer();\r
- }\r
- }),\r
- null,\r
- }),\r
new MenuDataFactory("menu.tool",\r
new MenuDataFactory[]{new MenuDataFactory(\r
"tool.random", new ActionListener() {\r
package charactermanaj.ui.model;\r
\r
import java.util.ArrayList;\r
+import java.util.Collections;\r
+import java.util.Comparator;\r
import java.util.HashMap;\r
import java.util.HashSet;\r
import java.util.List;\r
import java.util.Map;\r
+import java.util.Map.Entry;\r
import java.util.Set;\r
-import java.util.TreeMap;\r
-import java.util.TreeSet;\r
\r
import charactermanaj.model.CustomLayerOrder;\r
import charactermanaj.model.CustomLayerOrderKey;\r
+import charactermanaj.model.CustomLayerOrderMapper;\r
import charactermanaj.model.Layer;\r
-import charactermanaj.model.io.PartsImageCollectionParser.LayerOrderMapper;\r
+import charactermanaj.model.LayerOrderMapper;\r
\r
/**\r
- * カスタムレイヤーパターンのリストを管理する。\r
+ * ã\82¢ã\82¯ã\83\86ã\82£ã\83\96ã\81ªã\82«ã\82¹ã\82¿ã\83 ã\83¬ã\82¤ã\83¤ã\83¼ã\83\91ã\82¿ã\83¼ã\83³ã\81®ã\83ªã\82¹ã\83\88ã\82\92管ç\90\86ã\81\99ã\82\8bã\80\82\r
*/\r
-public class CustomLayerPatternMgr implements LayerOrderMapper {\r
+public class ActiveCustomLayerPatternMgr {\r
\r
/**\r
- * カスタムレイヤーパターンを保持する\r
+ * 認識している、すべてのカスタムレイヤーパターンを保持する\r
*/\r
private final Map<CustomLayerOrderKey, List<CustomLayerOrder>> customLayerPatternMap =\r
- new TreeMap<CustomLayerOrderKey, List<CustomLayerOrder>>();\r
+ new HashMap<CustomLayerOrderKey, List<CustomLayerOrder>>();\r
\r
/**\r
* 現在有効にしているカスタムレイヤーパターン名を保持する\r
* カスタムレイヤーパターンと有効にしているパターン名から現在有効なレイヤーマッピングを導出する。\r
* まだ導出されていないかリセットされた場合はnull\r
*/\r
- private Map<Layer, Float> customLayerOrderMap;\r
-\r
- /**\r
- * 現在有功にしているカスタムレイヤーの順序をマッピングする\r
- */\r
- private void initCustomLayerOrder() {\r
- customLayerOrderMap = new HashMap<Layer, Float>();\r
- for (CustomLayerOrderKey patternKey : activeCustomLayers) {\r
- initCustomLayerOrder(customLayerPatternMap.get(patternKey));\r
- }\r
- }\r
-\r
- private void initCustomLayerOrder(List<CustomLayerOrder> customLayerOrderList) {\r
- if (customLayerOrderList != null) {\r
- for (CustomLayerOrder customLayerOrder : customLayerOrderList) {\r
- Layer layer = customLayerOrder.getLayer();\r
- float layerOrder = customLayerOrder.getLayerOrder();\r
- customLayerOrderMap.put(layer, layerOrder);\r
- }\r
- }\r
- }\r
-\r
- public void applyCustomLayerOrder(List<CustomLayerOrder> customLayerOrderList) {\r
- customLayerOrderMap = new HashMap<Layer, Float>();\r
- initCustomLayerOrder(customLayerOrderList);\r
- }\r
-\r
- @Override\r
- public float getLayerOrder(Layer layer) {\r
- if (customLayerOrderMap == null) {\r
- initCustomLayerOrder();\r
- }\r
- Float layerOrder = customLayerOrderMap.get(layer);\r
- if (layerOrder == null) {\r
- layerOrder = (float) layer.getOrder();\r
- }\r
- return layerOrder;\r
- }\r
+ private transient CustomLayerOrderMapper customLayerOrderMapper;\r
\r
/**\r
* レイヤーパターンの一覧を取得する。\r
customLayerPatternMap.clear();\r
customLayerPatternMap.putAll(map);\r
activeCustomLayers.retainAll(customLayerPatternMap.keySet()); // 現在存在するパターン名に絞り込む\r
- initCustomLayerOrder();\r
+ customLayerOrderMapper = null; // レイヤー順マッピングは再構築する必要がある。\r
+ }\r
+\r
+ /**\r
+ * すべてのレイヤーパターンのキーとレイヤー順リストについて、パターンの表示名順にソートしたエントリリストとして返す。\r
+ * @return ソートされたエントリーリスト\r
+ */\r
+ public List<Map.Entry<CustomLayerOrderKey, List<CustomLayerOrder>>> getOrderedEntries() {\r
+ List<Map.Entry<CustomLayerOrderKey, List<CustomLayerOrder>>> entries =\r
+ new ArrayList<Map.Entry<CustomLayerOrderKey, List<CustomLayerOrder>>>(customLayerPatternMap.entrySet());\r
+ Collections.sort(entries, new Comparator<Map.Entry<CustomLayerOrderKey, List<CustomLayerOrder>>>() {\r
+ @Override\r
+ public int compare(Entry<CustomLayerOrderKey, List<CustomLayerOrder>> o1,\r
+ Entry<CustomLayerOrderKey, List<CustomLayerOrder>> o2) {\r
+ CustomLayerOrderKey k1 = o1.getKey();\r
+ CustomLayerOrderKey k2 = o2.getKey();\r
+ return CustomLayerOrderKey.COMPARATOR.compare(k1, k2);\r
+ }\r
+ });\r
+ return entries;\r
+ }\r
+\r
+\r
+ /**\r
+ * アクティブなカスタムレイヤー順定義でカスタムレイヤー順序索引を行うようにする。\r
+ */\r
+ public void initActiveCustomLayerOrderMap() {\r
+ initCustomLayerOrderMap(getActiveCustomLayerOrderList());\r
+ }\r
+\r
+ /**\r
+ * リストで指定したカスタムレイヤー順定義でカスタムレイヤー順序索引を行うようにする。\r
+ * @param orderList カスタムレイヤー順定義、nullの場合はすべてレイヤーの規定値となる。\r
+ */\r
+ public void initCustomLayerOrderMap(List<CustomLayerOrder> orderList) {\r
+ customLayerOrderMapper = new CustomLayerOrderMapper(orderList);\r
+ }\r
+\r
+ /**\r
+ * 現在設定されているカスタムレイヤー順序索引を取得する。\r
+ * @see {@link #initCustomLayerOrderMap(List)}\r
+ * @return\r
+ */\r
+ public LayerOrderMapper getLayerOrderMapper() {\r
+ if (customLayerOrderMapper == null) {\r
+ initActiveCustomLayerOrderMap();\r
+ }\r
+ return customLayerOrderMapper;\r
+ }\r
+\r
+ /**\r
+ * 現在有効なカスタムレイヤーパターン名の一覧のコピーを取得する。\r
+ * (返される順序は不定です。)\r
+ * @return\r
+ */\r
+ public Set<CustomLayerOrderKey> getActivePatternNames() {\r
+ return new HashSet<CustomLayerOrderKey>(activeCustomLayers);\r
+ }\r
+\r
+ /**\r
+ * 現在有効なカスタムレイヤー定義リストを取得する\r
+ * @return\r
+ */\r
+ public List<CustomLayerOrder> getActiveCustomLayerOrderList() {\r
+ List<CustomLayerOrder> mergedList = new ArrayList<CustomLayerOrder>();\r
+ for (CustomLayerOrderKey patternName : activeCustomLayers) {\r
+ List<CustomLayerOrder> list = customLayerPatternMap.get(patternName);\r
+ if (list != null) {\r
+ for (CustomLayerOrder layerOrder : list) {\r
+ if (layerOrder != null && !mergedList.contains(layerOrder)) {\r
+ mergedList.add(layerOrder);\r
+ }\r
+ }\r
+ }\r
+ }\r
+ return mergedList;\r
}\r
\r
+\r
/**\r
* レイヤーパターンの選択状態を取得する\r
* @param name\r
} else {\r
activeCustomLayers.remove(name);\r
}\r
- initCustomLayerOrder();\r
+ customLayerOrderMapper = null; // レイヤー順マッピングは再構築する必要がある。\r
}\r
}\r
\r
/**\r
- * 現在アクティブなレイヤーパターン名の一覧のコピーを取得する。\r
- * @return\r
- */\r
- public Set<CustomLayerOrderKey> getActivePatternNames() {\r
- return new TreeSet<CustomLayerOrderKey>(activeCustomLayers);\r
- }\r
-\r
- /**\r
* 現在のアクティブなレイヤーパターンの一覧を一括更新する。\r
* @param patternNames\r
*/\r
activeCustomLayers.add(name);\r
}\r
}\r
- initCustomLayerOrder();\r
+ customLayerOrderMapper = null; // レイヤー順マッピングは再構築する必要がある。\r
}\r
\r
/**\r
// 衝突のあるパターン名を現在の選択から除外する\r
activeCustomLayers.removeAll(conflictPatterns);\r
}\r
-\r
- /**\r
- * 現在有効なすべてのレイヤーパターンのレイヤーマッピングを重ねたリストを取得する。\r
- * (順序は不定である。)\r
- * @return\r
- */\r
- public List<CustomLayerOrder> getMergedCustomLayerOrderList() {\r
- List<CustomLayerOrder> mergedList = new ArrayList<CustomLayerOrder>();\r
- for (CustomLayerOrderKey patternName : activeCustomLayers) {\r
- List<CustomLayerOrder> list = customLayerPatternMap.get(patternName);\r
- if (list != null) {\r
- for (CustomLayerOrder layerOrder : list) {\r
- if (!mergedList.contains(layerOrder)) {\r
- mergedList.add(layerOrder);\r
- }\r
- }\r
- }\r
- }\r
- return mergedList;\r
- }\r
}
\ No newline at end of file