Many years ago, the first GUI application I wrote (in X with Motif) was a little orrery-cum-clock thing, with the clock face doubling as a view of the sky, showing the classical planets. Some time in the intermediate past, I thought about doing this as a Java applet, but it never got anywhere, because out on the web, it would have to be settable to the user's geographic location, and I never figured a good way to persist that data between page visits.
Having done the basic tinkering with IronPython and Silverlight to get the two working together, I thought about resurrecting the project. And the first thing to solve is the settings persistence.
But now, I have an easy API to get at the current URL and such via System.Windows.Browser.HtmlPage.Document
-- so I can read the values from its query string; and set the values in a hyperlink for bookmarking purposes, thus (app.py):
from System.Windows import Application from System.Windows.Controls import Canvas import System import System.Windows.Browser xaml = Application.Current.LoadRootVisual(Canvas(), "astroclock.xaml") xaml.hyperlink.NavigateUri = System.Windows.Browser.HtmlPage.Document.DocumentUri thisPage = System.Windows.Browser.HtmlPage.Document.DocumentUri.GetComponents( System.UriComponents.SchemeAndServer | System.UriComponents.Path, System.UriFormat.SafeUnescaped) query = System.Windows.Browser.HtmlPage.Document.QueryString try: xaml.slider1.Value = float(query['lat']) except: pass try: xaml.slider2.Value = float(query['long']) except: pass def latValueChanged(s, e): v = xaml.slider1.Value if v > 0: xaml.label1.Text = "Latitude %.2fN" % (v) elif v < 0: xaml.label1.Text = "Latitude %.2fS" % (-v) else: xaml.label1.Text = "Latitude 0" xaml.hyperlink.NavigateUri = System.Uri("%s?lat=%f&long=%f" % (thisPage, v, xaml.slider2.Value)) xaml.slider1.ValueChanged += latValueChanged latValueChanged(None, None) def longValueChanged(s, e): v = xaml.slider2.Value if v > 0: xaml.label2.Text = "Longitude %.2fE" % (v) elif v < 0: xaml.label2.Text = "Longitude %.2fW" % (-v) else: xaml.label2.Text = "Longitude 0" xaml.hyperlink.NavigateUri = System.Uri("%s?lat=%f&long=%f" % (thisPage, xaml.slider1.Value, v)) xaml.slider2.ValueChanged += longValueChanged longValueChanged(None, None)
driving some UI described by (astroclock.xaml)
<Canvas x:Class="System.Windows.Controls.Canvas" xmlns="http://schemas.microsoft.com/client/2007" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" x:Name="parentCanvas"> <Grid> <Canvas Name="canvas1" Margin="0,0,0,129" Background="Black" Width="480" Height="240"/> <Slider Height="22" Margin="128,0,0,93" Name="slider1" VerticalAlignment="Bottom" Maximum="90" Minimum="-90" Value="52" LargeChange="10" SmallChange="1" Width="360"/> <TextBlock Height="28" Margin="0,0,0,87" Name="label1" VerticalAlignment="Bottom" HorizontalAlignment="Left" Width="120">Latitude</TextBlock> <TextBlock Height="28" HorizontalAlignment="Left" Margin="0,0,0,62" Name="label2" VerticalAlignment="Bottom" Width="120">Longitude</TextBlock> <Slider Height="22" Margin="128,0,0,65" Name="slider2" VerticalAlignment="Bottom" Maximum="180" Minimum="-180" LargeChange="10" SmallChange="1" Width="360"/> <HyperlinkButton Height="28" HorizontalAlignment="Left" Margin="0,0,0,17" Name="hyperlink" VerticalAlignment="Bottom" Width="87" NavigateUri="astroclock.html" Content="Permalink" /> </Grid> </Canvas>
No comments:
Post a Comment