commit 7f98da51dab57badd3fa101785ddf2f849ea339a Author: Evgenii Alekseev Date: Thu Oct 9 14:37:45 2025 +0300 initial commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e660fd9 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +bin/ diff --git a/manifest.xml b/manifest.xml new file mode 100644 index 0000000..940e53d --- /dev/null +++ b/manifest.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/monkey.jungle b/monkey.jungle new file mode 100755 index 0000000..87796c7 --- /dev/null +++ b/monkey.jungle @@ -0,0 +1 @@ +project.manifest = manifest.xml diff --git a/resources/drawables/drawables.xml b/resources/drawables/drawables.xml new file mode 100755 index 0000000..6302154 --- /dev/null +++ b/resources/drawables/drawables.xml @@ -0,0 +1,3 @@ + + + diff --git a/resources/drawables/launcher_icon.svg b/resources/drawables/launcher_icon.svg new file mode 100755 index 0000000..e80aa20 --- /dev/null +++ b/resources/drawables/launcher_icon.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/resources/layouts/layout.xml b/resources/layouts/layout.xml new file mode 100755 index 0000000..a1dea68 --- /dev/null +++ b/resources/layouts/layout.xml @@ -0,0 +1,4 @@ + + + \ No newline at end of file diff --git a/resources/settings/properties.xml b/resources/settings/properties.xml new file mode 100755 index 0000000..ca0d9ef --- /dev/null +++ b/resources/settings/properties.xml @@ -0,0 +1,7 @@ + + + 0x000000 + 0xFF0000 + false + + diff --git a/resources/settings/settings.xml b/resources/settings/settings.xml new file mode 100755 index 0000000..47f6c80 --- /dev/null +++ b/resources/settings/settings.xml @@ -0,0 +1,25 @@ + + + + + @Strings.ColorBlack + @Strings.ColorDarkGray + @Strings.ColorLightGray + @Strings.ColorWhite + + + + + + @Strings.ColorBlack + @Strings.ColorBlue + @Strings.ColorRed + @Strings.ColorWhite + + + + + + + + diff --git a/resources/strings/strings.xml b/resources/strings/strings.xml new file mode 100644 index 0000000..1754403 --- /dev/null +++ b/resources/strings/strings.xml @@ -0,0 +1,16 @@ + + + wf + + Background Color + Foreground Color + Military Format for 24 Hour Time + + Black + Dark Gray + Light Gray + White + Blue + Red + + diff --git a/source/Hands/IHands.mc b/source/Hands/IHands.mc new file mode 100644 index 0000000..9ab2549 --- /dev/null +++ b/source/Hands/IHands.mc @@ -0,0 +1,51 @@ + import Toybox.Graphics; + import Toybox.Lang; + import Toybox.System; + import Toybox.WatchUi; + + class IHands extends Drawable { + + private var mHoursLength = 1.0; + private var mMinutesLength = 1.0; + private var mSecondsLength = 1.0; + + public enum HandType { + HOURS, + MINUTES, + SECONDS, + } + + function initialize(options) { + WatchUi.Drawable.initialize(options); + } + + function draw(dc as Dc) as Void { + var now = System.getClockTime(); + + var mid = getCenter(dc); + var length = min(mid[0], mid[1]); + System.println(mid); + System.println(length); + + var hourAngle = (now.hour % 12 + now.min / 60.0) * 30.0; + drawHand(dc, mid[0], mid[1], hourAngle, length * mHoursLength, HOURS); + + var minutesAngle = now.min * 6.0; + drawHand(dc, mid[0], mid[1], minutesAngle, length * mMinutesLength, MINUTES); + + var secondsAngle = now.sec * 6.0; + drawHand(dc, mid[0], mid[1], secondsAngle, length * mSecondsLength, SECONDS); + } + + function drawHand( + dc as Graphics.Dc, + x as Float, + y as Float, + angle as Float, + length as Float, + handType as HandType) {} + + function getCenter(dc as Dc) as [Float, Float] { + return [dc.getWidth() / 2.0, dc.getHeight() / 2.0]; + } + } \ No newline at end of file diff --git a/source/Hands/SimpleHands.mc b/source/Hands/SimpleHands.mc new file mode 100644 index 0000000..d1dbbde --- /dev/null +++ b/source/Hands/SimpleHands.mc @@ -0,0 +1,22 @@ +import Toybox.Graphics; +import Toybox.Lang; + +class SimpleHands extends IHands { + + function initialize(options) { + IHands.initialize(options); + } + + function drawHand( + dc as Dc, + x as Float, + y as Float, + angle as Float, + length as Float, + handType as IHands.HandType) { + var rad = (angle - 90) * Math.PI / 180.0; + + dc.setColor(Graphics.COLOR_WHITE, Graphics.COLOR_WHITE); + dc.drawLine(x, y, x + length * Math.cos(rad), y + length * Math.sin(rad)); + } +} \ No newline at end of file diff --git a/source/Utils.mc b/source/Utils.mc new file mode 100644 index 0000000..3eb7291 --- /dev/null +++ b/source/Utils.mc @@ -0,0 +1,11 @@ +import Toybox.Lang; + +typedef Numeric as Number or Float or Long or Double; + +function min(left as Numeric, right as Numeric) as Numeric { + if (left < right) { + return left; + } else { + return right; + } +} \ No newline at end of file diff --git a/source/wfApp.mc b/source/wfApp.mc new file mode 100644 index 0000000..eacfada --- /dev/null +++ b/source/wfApp.mc @@ -0,0 +1,33 @@ +import Toybox.Application; +import Toybox.Lang; +import Toybox.WatchUi; + +class wfApp extends Application.AppBase { + + function initialize() { + AppBase.initialize(); + } + + // onStart() is called on application start up + function onStart(state as Dictionary?) as Void { + } + + // onStop() is called when your application is exiting + function onStop(state as Dictionary?) as Void { + } + + // Return the initial view of your application here + function getInitialView() as [Views] or [Views, InputDelegates] { + return [ new wfView() ]; + } + + // New app settings have been received so trigger a UI update + function onSettingsChanged() as Void { + WatchUi.requestUpdate(); + } + +} + +function getApp() as wfApp { + return Application.getApp() as wfApp; +} \ No newline at end of file diff --git a/source/wfBackground.mc b/source/wfBackground.mc new file mode 100644 index 0000000..a620072 --- /dev/null +++ b/source/wfBackground.mc @@ -0,0 +1,22 @@ +import Toybox.Application; +import Toybox.Graphics; +import Toybox.Lang; +import Toybox.WatchUi; + +class Background extends WatchUi.Drawable { + + function initialize() { + var dictionary = { + :identifier => "Background" + }; + + Drawable.initialize(dictionary); + } + + function draw(dc as Dc) as Void { + // Set the background color then call to clear the screen + dc.setColor(Graphics.COLOR_TRANSPARENT, getApp().getProperty("BackgroundColor") as Number); + dc.clear(); + } + +} diff --git a/source/wfView.mc b/source/wfView.mc new file mode 100644 index 0000000..9a22865 --- /dev/null +++ b/source/wfView.mc @@ -0,0 +1,73 @@ +import Toybox.Application; +import Toybox.Graphics; +import Toybox.Lang; +import Toybox.System; +import Toybox.WatchUi; + +class wfView extends WatchUi.WatchFace { + + private var hands as IHands?; + + function initialize() { + WatchFace.initialize(); + hands = new SimpleHands({}); + } + + // Load your resources here + function onLayout(dc as Dc) as Void { + setLayout(Rez.Layouts.WatchFace(dc)); + } + + // Called when this View is brought to the foreground. Restore + // the state of this View and prepare it to be shown. This includes + // loading resources into memory. + function onShow() as Void { + } + + // Update the view + // function onUpdate(dc as Dc) as Void { + // // Get the current time and format it correctly + // var timeFormat = "$1$:$2$"; + // var clockTime = System.getClockTime(); + // var hours = clockTime.hour; + // if (!System.getDeviceSettings().is24Hour) { + // if (hours > 12) { + // hours = hours - 12; + // } + // } else { + // if (Application.Properties.getValue("UseMilitaryFormat")) { + // timeFormat = "$1$$2$"; + // hours = hours.format("%02d"); + // } + // } + // var timeString = Lang.format(timeFormat, [hours, clockTime.min.format("%02d")]); + + // // Update the view + // var view = View.findDrawableById("TimeLabel") as Text; + // view.setColor(Application.Properties.getValue("ForegroundColor") as Number); + // view.setText(timeString); + + // // Call the parent onUpdate function to redraw the layout + // View.onUpdate(dc); + // } + function onUpdate(dc as Dc) as Void { + dc.clear(); + dc.setColor(Graphics.COLOR_BLACK, Graphics.COLOR_BLACK); + hands.draw(dc); + } + + // Called when this View is removed from the screen. Save the + // state of this View here. This includes freeing resources from + // memory. + function onHide() as Void { + } + + // The user has just looked at their watch. Timers and animations may be started here. + function onExitSleep() as Void { + } + + // Terminate any active timers and prepare for slow updates. + function onEnterSleep() as Void { + } + +}