From b67ae87b5464ed8cab82cfa0a2bbc25deb766e01 Mon Sep 17 00:00:00 2001 From: Teletha Date: Mon, 4 Dec 2023 08:00:21 +0900 Subject: [PATCH] progress --- .../java/viewtify/model/NamedPreferences.java | 15 ++- src/main/java/viewtify/model/Preferences.java | 36 ++++++ .../java/viewtify/model/PreferencesList.java | 114 ++++++++++++++++++ .../ui/calendar/CalendarSettingView.java | 2 +- 4 files changed, 165 insertions(+), 2 deletions(-) create mode 100644 src/main/java/viewtify/model/PreferencesList.java diff --git a/src/main/java/viewtify/model/NamedPreferences.java b/src/main/java/viewtify/model/NamedPreferences.java index a585df4b9..b37311516 100644 --- a/src/main/java/viewtify/model/NamedPreferences.java +++ b/src/main/java/viewtify/model/NamedPreferences.java @@ -10,10 +10,23 @@ package viewtify.model; import kiss.Managed; +import kiss.Storable; @Managed -public abstract class NamedPreferences extends Preferences { +public class NamedPreferences extends Preferences { /** The user defined name. */ public final Preference name = initialize(""); + + Storable container; + + /** + * {@inheritDoc} + */ + @Override + public Preferences store() { + container.store(); + System.out.println("Store " + this); + return this; + } } diff --git a/src/main/java/viewtify/model/Preferences.java b/src/main/java/viewtify/model/Preferences.java index e08966de0..5d32ad978 100644 --- a/src/main/java/viewtify/model/Preferences.java +++ b/src/main/java/viewtify/model/Preferences.java @@ -121,6 +121,20 @@ void sync() { auto(); } + /** + * Synchronize data from/to source. + */ + void sync2() { + Viewtify.UserPreference.observing().to(x -> { + // Not all property values are preserved in the restore source, so they must always be + // reset before restoring. If not reset, some properties may continue to apply the + // previous user's values to the new user. + reset(); + restore(); + }); + auto(); + } + /** * Observe the value change events. * @@ -203,6 +217,28 @@ public static

P of(Class

type, String key) { }); } + private static final Map CACHE = new ConcurrentHashMap(); + + public static

P by(Class

type, String key) { + PreferencesList

list = list(type); + for (P preferences : list) { + if (preferences.name.is(key)) { + return preferences; + } + } + + P named = I.make(type); + named.name.set(key); + named.container = list; + list.add(named); + + return named; + } + + public static

PreferencesList

list(Class

type) { + return CACHE.computeIfAbsent(type, PreferencesList::new); + } + /** * Preference value. */ diff --git a/src/main/java/viewtify/model/PreferencesList.java b/src/main/java/viewtify/model/PreferencesList.java new file mode 100644 index 000000000..5c24f062b --- /dev/null +++ b/src/main/java/viewtify/model/PreferencesList.java @@ -0,0 +1,114 @@ +/* + * Copyright (C) 2023 The VIEWTIFY Development Team + * + * Licensed under the MIT License (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://opensource.org/licenses/MIT + */ +package viewtify.model; + +import java.util.ArrayList; + +import javafx.collections.ModifiableObservableListBase; + +import kiss.Managed; +import kiss.Storable; +import viewtify.Viewtify; + +final class PreferencesList extends ModifiableObservableListBase implements Storable> { + + /** The model id. */ + private final String id; + + /** The actual container. */ + private final ArrayList list = new ArrayList(); + + /** + * Hide constructor. + */ + PreferencesList(Class type) { + Managed annotation = type.getAnnotation(Managed.class); + if (annotation == null) { + id = type.getName(); + } else { + String name = annotation.name(); + if (name == null || name.isBlank()) { + id = type.getName(); + } else { + id = name; + } + } + + sync(); + } + + /** + * Synchronize data from/to source. + */ + protected final void sync() { + Viewtify.UserPreference.observing().to(x -> { + // Not all property values are preserved in the restore source, so they must always be + // reset before restoring. If not reset, some properties may continue to apply the + // previous user's values to the new user. + clear(); + restore(); + }); + } + + /** + * {@inheritDoc} + */ + @Override + public E get(int index) { + return list.get(index); + } + + /** + * {@inheritDoc} + */ + @Override + public int size() { + return list.size(); + } + + /** + * {@inheritDoc} + */ + @Override + protected void doAdd(int index, E model) { + if (model != null) { + System.out.println("Add " + model); + model.sync2(); + list.add(index, model); + } + } + + /** + * {@inheritDoc} + */ + @Override + protected E doSet(int index, E model) { + System.out.println("Set " + model); + model.sync2(); + + return list.set(index, model); + } + + /** + * {@inheritDoc} + */ + @Override + protected E doRemove(int model) { + return list.remove(model); + } + + /** + * {@inheritDoc} + */ + @Override + public final String locate() { + return Viewtify.UserPreference.exact().file(id + ".json").path(); + } +} \ No newline at end of file diff --git a/src/main/java/viewtify/ui/calendar/CalendarSettingView.java b/src/main/java/viewtify/ui/calendar/CalendarSettingView.java index bd02688c1..3c4839308 100644 --- a/src/main/java/viewtify/ui/calendar/CalendarSettingView.java +++ b/src/main/java/viewtify/ui/calendar/CalendarSettingView.java @@ -122,7 +122,7 @@ protected ViewDSL declareUI() { */ @Override protected void initialize() { - TimeEventSourceSetting setting = Preferences.of(TimeEventSourceSetting.class, source.name()); + TimeEventSourceSetting setting = Preferences.by(TimeEventSourceSetting.class, source.name()); enable.text(source.name()).sync(setting.enable); color.disableWhen(enable.isNotSelected()).sync(setting.color, FXUtils::color, FXUtils::color);