diff --git a/build.sbt b/build.sbt index 029b482..397b850 100644 --- a/build.sbt +++ b/build.sbt @@ -16,6 +16,8 @@ lazy val root = project.in(file(".")) lazy val brain = ProjectRef(file("lib/ocelot-brain"), "ocelot-brain") +libraryDependencies += "org.scala-lang" % "scala-reflect" % scalaVersion.value + libraryDependencies += "org.apache.logging.log4j" % "log4j-core" % "2.20.0" libraryDependencies += "org.apache.logging.log4j" % "log4j-api" % "2.20.0" libraryDependencies += "org.apache.logging.log4j" % "log4j-slf4j-impl" % "2.20.0" @@ -41,4 +43,4 @@ assembly / assemblyMergeStrategy := { case _ => MergeStrategy.first } -assembly / assemblyJarName := s"ocelot-desktop.jar" +assembly / assemblyJarName := "ocelot-desktop.jar" diff --git a/src/main/scala/ocelot/desktop/util/SettingsData.scala b/src/main/scala/ocelot/desktop/util/SettingsData.scala index 8e74ef9..f256e43 100644 --- a/src/main/scala/ocelot/desktop/util/SettingsData.scala +++ b/src/main/scala/ocelot/desktop/util/SettingsData.scala @@ -1,8 +1,15 @@ package ocelot.desktop.util import ocelot.desktop.Settings.Int2D +import ocelot.desktop.util.SettingsData.Fields + +import scala.reflect.runtime.{universe => ru} class SettingsData { + // implementation notes: + // this class relies on reflection to implement updateWith + // it's assumed all fields that should be copied are declared as **public var** + def this(data: SettingsData) { this() updateWith(data) @@ -25,22 +32,24 @@ class SettingsData { var saveOnExit: Boolean = true var openLastWorkspace: Boolean = true + private val mirror = scala.reflect.runtime.universe.runtimeMirror(getClass.getClassLoader).reflect(this) + def updateWith(data: SettingsData): Unit = { - // TODO: maybe apply some automated mapping solution - // TODO: please do that ☝ - this.volumeMaster = data.volumeMaster - this.volumeBeep = data.volumeBeep - this.volumeEnvironment = data.volumeEnvironment - this.volumeInterface = data.volumeInterface - this.scaleFactor = data.scaleFactor - - this.windowPosition = data.windowPosition - this.windowValidatePosition = data.windowValidatePosition - this.windowSize = data.windowSize - this.windowFullscreen = data.windowFullscreen - - this.stickyWindows = data.stickyWindows - this.saveOnExit = data.saveOnExit - this.openLastWorkspace = data.openLastWorkspace + for (fieldSym <- Fields) { + val value = data.mirror.reflectMethod(fieldSym.getter.asMethod)() + mirror.reflectMethod(fieldSym.setter.asMethod)(value) + } } } + +object SettingsData { + private val Fields = + ru.typeOf[SettingsData] + .decls + .filter(_.isTerm) + .map(_.asTerm) + .filter(_.isVar) + // the var itself is private: check setter and getter + .filter(v => v.setter.isPublic && v.getter.isPublic) + .toList +}