/Source Code/PowerSong/Styles/frmEditStyle.vb
Visual Basic | 477 lines | 314 code | 126 blank | 37 comment | 0 complexity | 22fb1c59eaa0719e8df4117875e48d9a MD5 | raw file
- Imports System.Windows.Forms
- Imports PowerSong.SongDatabase
- Imports PowerSong.SongDatabase.Style.ETextAlignment
- Imports PowerSong.SongDatabase.Style.EBackgroundType
- Imports PowerSong.Projection
-
- Public Class frmEditStyle
-
- Private FStyle As Style = Nothing
- Private FSelectedProjectlet As ProjectletStyle = Nothing
- Private FStyles As Styles = Nothing
- Private FProjector As Projector = Nothing
- Private FIgnoreControlEvents As Boolean = True
-
- Dim ProjectletHolderObject As New Object
-
- Public Sub New(ByVal style As Style, ByVal styles As Styles)
- InitializeComponent()
- FStyles = styles
- FStyle = style
- FSelectedProjectlet = style("Verse")
- End Sub
-
- Private Sub frmEditStyle_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
-
- ' Add items to the alignment drop down combo box
- cboTextAlignment.Items.Clear()
- cboTextAlignment.Items.Add(New ListItem(Of Style.ETextAlignment)("Top left", Style.ETextAlignment.TopLeft))
- cboTextAlignment.Items.Add(New ListItem(Of Style.ETextAlignment)("Top middle", Style.ETextAlignment.TopMiddle))
- cboTextAlignment.Items.Add(New ListItem(Of Style.ETextAlignment)("Top right", Style.ETextAlignment.TopRight))
- cboTextAlignment.Items.Add(New ListItem(Of Style.ETextAlignment)("Center left", Style.ETextAlignment.MiddleLeft))
- cboTextAlignment.Items.Add(New ListItem(Of Style.ETextAlignment)("Center middle", Style.ETextAlignment.MiddleMiddle))
- cboTextAlignment.Items.Add(New ListItem(Of Style.ETextAlignment)("Center right", Style.ETextAlignment.MiddleRight))
- cboTextAlignment.Items.Add(New ListItem(Of Style.ETextAlignment)("Bottom left", Style.ETextAlignment.BottomLeft))
- cboTextAlignment.Items.Add(New ListItem(Of Style.ETextAlignment)("Bottom middle", Style.ETextAlignment.BottomMiddle))
- cboTextAlignment.Items.Add(New ListItem(Of Style.ETextAlignment)("Bottom right", Style.ETextAlignment.BottomRight))
-
- ' Add items to the available projectlets drop down combo box
- cboSelectedProjectlet.Items.Clear()
- cboSelectedProjectlet.Items.Add(New ListItem(Of String)("Main Verse Text", "Verse"))
- cboSelectedProjectlet.Items.Add(New ListItem(Of String)("Song Title", "Title"))
- cboSelectedProjectlet.Items.Add(New ListItem(Of String)("Copyright Line", "Copyright"))
-
- ' Add items to the display option drop down combo box
- cboDisplayOption.Items.Clear()
- cboDisplayOption.Items.Add(New ListItem(Of Style.EDisplayOption)("Always", Style.EDisplayOption.Always))
- cboDisplayOption.Items.Add(New ListItem(Of Style.EDisplayOption)("Never", Style.EDisplayOption.Never))
- cboDisplayOption.Items.Add(New ListItem(Of Style.EDisplayOption)("First verse", Style.EDisplayOption.FirstVerse))
- cboDisplayOption.Items.Add(New ListItem(Of Style.EDisplayOption)("Second verse", Style.EDisplayOption.SecondVerse))
- cboDisplayOption.Items.Add(New ListItem(Of Style.EDisplayOption)("Last verse", Style.EDisplayOption.LastVerse))
- cboDisplayOption.Items.Add(New ListItem(Of Style.EDisplayOption)("First verse (once)", Style.EDisplayOption.FirstVerseOnce))
- cboDisplayOption.Items.Add(New ListItem(Of Style.EDisplayOption)("Second verse (once)", Style.EDisplayOption.SecondVerseOnce))
- cboDisplayOption.Items.Add(New ListItem(Of Style.EDisplayOption)("Last verse (once)", Style.EDisplayOption.LastVerseOnce))
-
- ' Add items to the font effect drop down combo box
- cboFontEffect.Items.Clear()
- cboFontEffect.Items.Add(New ListItem(Of Style.ETextEffect)("None", Style.ETextEffect.None))
- cboFontEffect.Items.Add(New ListItem(Of Style.ETextEffect)("Inner outline", Style.ETextEffect.InnerOutline))
- cboFontEffect.Items.Add(New ListItem(Of Style.ETextEffect)("Outline", Style.ETextEffect.Outline))
- cboFontEffect.Items.Add(New ListItem(Of Style.ETextEffect)("Shadow", Style.ETextEffect.Shadow))
- cboFontEffect.Items.Add(New ListItem(Of Style.ETextEffect)("Outlined box", Style.ETextEffect.OutlineBox))
- cboFontEffect.Items.Add(New ListItem(Of Style.ETextEffect)("Filled box", Style.ETextEffect.FilledBox))
-
- ' Set up projectlet area control
- pnlProjectlet.Clear()
- Dim Widget As New Widget(ProjectletHolderObject, New RectangleF(0, 0, 1, 0))
- AddHandler Widget.Draw, AddressOf HandleDrawWidget
- AddHandler Widget.AreaChanged, AddressOf HandleWidgetMovement
- pnlProjectlet.AddWidget(Widget)
-
- ' Set up preview projection
- InitializeProjector()
- SetControlsToReflectStyle(FStyle)
- FIgnoreControlEvents = False
- cboSelectedProjectlet.SelectedIndex = 0
-
- End Sub
-
- Private Sub OK_Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles OK_Button.Click
-
- ' Save the changed style
- UpdateStyle(FStyle, FSelectedProjectlet)
- FStyles.EditStyle(FStyle.StyleID, FStyle)
-
- ' Close the form
- Me.DialogResult = System.Windows.Forms.DialogResult.OK
- Me.Close()
-
- End Sub
-
- Private Sub Cancel_Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Cancel_Button.Click
- Me.DialogResult = System.Windows.Forms.DialogResult.Cancel
- Me.Close()
- End Sub
-
- Private Sub btnSetBackgroundImage_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSetBackgroundImage.Click
-
- If dlgOpenImage.ShowDialog = Windows.Forms.DialogResult.OK Then
- txtBackgroundImage.Text = dlgOpenImage.FileName
- FStyle.DefaultBackgroundImage = dlgOpenImage.FileName
- UpdateAllPreviews()
- End If
-
- End Sub
-
- Private Sub btnSelectSolidColour_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSelectSolidColour.Click, pbSolidColour.Click
-
- If dlgSelectColour.ShowDialog = Windows.Forms.DialogResult.OK Then
- pbSolidColour.BackColor = dlgSelectColour.Color
- lblFontAppearance.BackColor = dlgSelectColour.Color
- FStyle.DefaultBackgroundColour = dlgSelectColour.Color
- UpdateAllPreviews()
- End If
-
- End Sub
-
- Private Sub optUseImage_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles optUseImage.CheckedChanged
-
- If FIgnoreControlEvents Then Exit Sub
-
- If optUseImage.Checked Then
-
- btnSelectSolidColour.Enabled = False
- btnSetBackgroundImage.Enabled = True
- txtBackgroundImage.Enabled = True
- If txtBackgroundImage.Text = "" Then
- ' FStyle is not set until the form is fully loaded, which prevents the button being 'clicked'
- If FStyle IsNot Nothing Then
- If optUseImage.Checked Then FStyle.BackgroundType = Image
- btnSetBackgroundImage_Click(sender, e)
- End If
- End If
-
- ' Update the style, preview projection and placement controls
- UpdateAllPreviews()
-
- End If
-
- End Sub
-
- Private Sub optUseSolidColour_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles optUseSolidColour.CheckedChanged
-
- If FIgnoreControlEvents Then Exit Sub
-
- If optUseSolidColour.Checked Then
-
- btnSelectSolidColour.Enabled = True
- btnSetBackgroundImage.Enabled = False
- txtBackgroundImage.Enabled = False
- If optUseSolidColour.Checked Then FStyle.BackgroundType = SolidColour
-
- ' Update the style, preview projection and placement controls
- UpdateAllPreviews()
-
- End If
-
- End Sub
-
- Private Sub btnSetAppearance_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSetAppearance.Click
-
- ' First set up the style dialog box
- dlgFont.Font = New Font(FSelectedProjectlet.FontName, _
- FSelectedProjectlet.FontSize, _
- FSelectedProjectlet.FontStyle, _
- GraphicsUnit.Point)
- dlgFont.Color = FSelectedProjectlet.FontColour
-
- ' Show the font dialog
- If dlgFont.ShowDialog = Windows.Forms.DialogResult.OK Then
-
- ' Reflect the changes made to the sample text
- lblFontAppearance.Text = dlgFont.Font.Name
- lblFontAppearance.Font = New Font(dlgFont.Font.Name, lblFontAppearance.Font.Size, dlgFont.Font.Style, GraphicsUnit.Pixel)
- lblFontSize.Text = dlgFont.Font.SizeInPoints.ToString
-
- ' Update the style, preview projection and placement controls
- UpdateStyle(FStyle, FSelectedProjectlet)
- UpdateAllPreviews()
-
- End If
-
- End Sub
-
- Private Sub tmrProjection_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tmrProjection.Tick
- FProjector.Update()
- End Sub
-
- Private Sub btnSetEffectColour_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSetEffectColour.Click, pbEffectColour.Click
-
- dlgSelectColour.Color = pbEffectColour.BackColor
- If dlgSelectColour.ShowDialog = Windows.Forms.DialogResult.OK Then
- pbEffectColour.BackColor = dlgSelectColour.Color
- End If
-
- ' Update the style
- UpdateStyle(FStyle, FSelectedProjectlet)
- FProjector.ProjectletByName(FSelectedProjectlet.Category).FontEffectColour = dlgSelectColour.Color
-
- End Sub
-
- Private Sub cboFontEffect_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cboFontEffect.SelectedIndexChanged
-
- If FIgnoreControlEvents Then Exit Sub
-
- UpdateStyle(FStyle, FSelectedProjectlet)
- Dim SelectedEffect As ListItem(Of Style.ETextEffect) = cboFontEffect.SelectedItem
- FProjector.ProjectletByName(FSelectedProjectlet.Category).FontEffect = SelectedEffect.Key
-
- End Sub
-
- Private Sub btnSetFontColour_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSetFontColour.Click, pbFontColour.Click
-
- dlgSelectColour.Color = pbFontColour.BackColor
- If dlgSelectColour.ShowDialog = Windows.Forms.DialogResult.OK Then
- pbFontColour.BackColor = dlgSelectColour.Color
- lblFontAppearance.ForeColor = dlgSelectColour.Color
- End If
-
- ' Update the style
- UpdateStyle(FStyle, FSelectedProjectlet)
- FProjector.ProjectletByName(FSelectedProjectlet.Category).FontColour = dlgSelectColour.Color
-
- End Sub
-
- #Region " Helper Methods "
-
- Private Sub SetControlsToReflectStyle(ByVal style As Style)
-
- ' Update main details
- txtName.Text = style.Name
- pbSolidColour.BackColor = style.DefaultBackgroundColour
- txtBackgroundImage.Text = style.DefaultBackgroundImage
- Select Case style.BackgroundType
- Case Image : optUseImage.Checked = True
- Case SolidColour : optUseSolidColour.Checked = True
- End Select
- lblFontAppearance.BackColor = style.DefaultBackgroundColour
-
- ' Update fading
- cboGeneralFade.SelectedIndex = style.GeneralFade
- cboVerseFade.SelectedIndex = style.VerseFade
- txtGeneralFadeDuration.Text = style.GeneralFadeDuration.ToString
- txtVerseFadeDuration.Text = style.VerseFadeDuration.ToString
-
- End Sub
-
- Private Sub UpdateAllPreviews()
- UpdateProjector()
- UpdatePlacer()
- End Sub
-
- Private Sub UpdateStyle(ByVal style As Style, _
- ByVal projectlet As ProjectletStyle)
-
- ' Update main style details
- style.Name = txtName.Text
- If optUseImage.Checked Then
- style.BackgroundType = Image
- ElseIf optUseSolidColour.Checked Then
- style.BackgroundType = SolidColour
- End If
-
- style.DefaultBackgroundImage = txtBackgroundImage.Text
- style.DefaultBackgroundColour = pbSolidColour.BackColor
-
- ' Update projectlet
- projectlet.Area = pnlProjectlet.GetWidgetContainingObject(ProjectletHolderObject).Area
- projectlet.Alignment = DirectCast(cboTextAlignment.SelectedItem, ListItem(Of Style.ETextAlignment)).Key
- projectlet.FontName = lblFontAppearance.Font.Name
- projectlet.FontStyle = lblFontAppearance.Font.Style
- projectlet.FontColour = pbFontColour.BackColor
- projectlet.FontSize = CInt(lblFontSize.Text)
- projectlet.FontEffect = DirectCast(cboFontEffect.SelectedItem, ListItem(Of Style.ETextEffect)).Key
- projectlet.FontEffectColour = pbEffectColour.BackColor
- projectlet.DisplayOption = DirectCast(cboDisplayOption.SelectedItem, ListItem(Of Style.EDisplayOption)).Key
-
- ' Update fading
- style.GeneralFade = cboGeneralFade.SelectedIndex
- style.VerseFade = cboVerseFade.SelectedIndex
- style.GeneralFadeDuration = CInt(txtGeneralFadeDuration.Text)
- style.VerseFadeDuration = CInt(txtVerseFadeDuration.Text)
-
- End Sub
-
- Private Sub UpdateProjector()
-
- ' Fade out
- FProjector.FadeToBlack(FStyle.GeneralFadeDuration)
-
- ' Configure the projector background
- Select Case FStyle.BackgroundType
- Case SolidColour : FProjector.SetBackgroundColour(pbSolidColour.BackColor)
- Case Image : FProjector.SetBackgroundImage(txtBackgroundImage.Text)
- End Select
-
- ' Configure projectlets
- For Each Item As Projectlet In FProjector.Projectlets
- Dim SubStyle As ProjectletStyle = FStyle.ProjectletsByName(Item.Category)
-
- ' Configure projectlet style on projector
- FProjector.SetProjectletStyle(Item, SubStyle)
-
- ' Set text
- FProjector.SetText(Item, 0, 2, GetSampleText(SubStyle.Category), True)
-
- Next
-
- ' Fade in
- FProjector.FadeToText(FStyle.GeneralFadeDuration)
-
- End Sub
-
- Private Sub UpdatePlacer()
- Dim Widget As Widget = pnlProjectlet.GetWidgetContainingObject(ProjectletHolderObject)
- Widget.Area = FSelectedProjectlet.Area
- pnlProjectlet.Invalidate()
- End Sub
-
- Private Function GetSampleText(ByVal category As String) As String
-
- Dim Result As String = String.Empty
- Select Case category
- Case "Title" : Result = "The Song Title"
- Case "Verse" : Result = "Sample of verse, line 1." + Environment.NewLine + _
- "Sample of verse, line 2." + Environment.NewLine + _
- "Sample of verse, line 3." + Environment.NewLine + _
- "Sample of verse, line 4." + Environment.NewLine + _
- "Sample of verse, line 5." + Environment.NewLine + _
- "Sample of verse, line 6." + Environment.NewLine + _
- "Sample of verse, line 7."
- Case "Copyright" : Result = "© 2010 Copyright Line Sample"
- End Select
- Return Result
-
- End Function
-
- Private Sub InitializeProjector()
-
- FProjector = New Projector(pbPreview)
- FProjector.Projectlets.Add(New Projectlet("Title", ProjectletStyle.TITLE_TAG))
- FProjector.Projectlets.Add(New Projectlet("Verse", ProjectletStyle.VERSE_TAG))
- FProjector.Projectlets.Add(New Projectlet("Copyright", ProjectletStyle.SIMPLE_COPYRIGHT_TAG))
-
- End Sub
-
- #End Region
-
- Private Sub cboSelectedProjectlet_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cboSelectedProjectlet.SelectedIndexChanged
-
- If FIgnoreControlEvents Then Exit Sub
- If cboSelectedProjectlet.SelectedIndex = -1 Then Exit Sub
-
- FIgnoreControlEvents = True
-
- Dim SelectedProjectletName As String = DirectCast(cboSelectedProjectlet.SelectedItem, ListItem(Of String)).Key
- FSelectedProjectlet = FStyle(SelectedProjectletName)
-
- ' Update projectlet font information
- lblFontAppearance.Text = FSelectedProjectlet.FontName
- lblFontAppearance.Font = New Font(FSelectedProjectlet.FontName, lblFontAppearance.Font.Size, FSelectedProjectlet.FontStyle, GraphicsUnit.Pixel)
- lblFontAppearance.ForeColor = FSelectedProjectlet.FontColour
- lblFontSize.Text = FSelectedProjectlet.FontSize
- pbEffectColour.BackColor = FSelectedProjectlet.FontEffectColour
- pbFontColour.BackColor = FSelectedProjectlet.FontColour
-
- ' Update projectlet location
- pnlProjectlet.GetWidgetContainingObject(ProjectletHolderObject).Area = FSelectedProjectlet.Area
-
- ' Update font effect
- For Each Value As ListItem(Of Style.ETextEffect) In cboFontEffect.Items
- If Value.Key = FSelectedProjectlet.FontEffect Then cboFontEffect.SelectedItem = Value
- Next
-
- ' Update projectlet display option
- For Each Value As ListItem(Of Style.EDisplayOption) In cboDisplayOption.Items
- If Value.Key = FSelectedProjectlet.DisplayOption Then cboDisplayOption.SelectedItem = Value
- Next
-
- ' Update projectlet text alignment
- For Each Value As ListItem(Of Style.ETextAlignment) In cboTextAlignment.Items
- If Value.Key = FSelectedProjectlet.Alignment Then cboTextAlignment.SelectedItem = Value
- Next
-
- FIgnoreControlEvents = False
-
- UpdateAllPreviews()
-
- End Sub
-
- Private Sub HandleFontTransparencySelection(ByVal sender As System.Object, ByVal e As System.EventArgs) _
- Handles mnuFTrans0.Click, mnuFTrans1.Click, mnuFTrans2.Click, mnuFTrans3.Click, mnuFTrans4.Click, mnuFTrans5.Click, mnuFTrans6.Click, mnuFTrans7.Click, mnuFTrans8.Click, mnuFTrans9.Click
-
- Dim Value As Integer = DirectCast(sender, ToolStripMenuItem).Tag
- Dim Transparency As Byte = CDbl(255) * (CDbl(Value) / 100)
-
- Dim Colour1 As Color = pbEffectColour.BackColor
- Dim Colour2 As Color = Color.FromArgb(255 - Transparency, Colour1.R, Colour1.G, Colour1.B)
- pbEffectColour.BackColor = Colour2
- FSelectedProjectlet.FontColour = Colour2
- UpdateStyle(FStyle, FSelectedProjectlet)
- UpdateAllPreviews()
-
- End Sub
-
- Private Sub HandleEffectTransparencySelection(ByVal sender As System.Object, ByVal e As System.EventArgs) _
- Handles mnuETrans0.Click, mnuETrans1.Click, mnuETrans2.Click, mnuETrans3.Click, mnuETrans4.Click, mnuETrans5.Click, mnuETrans6.Click, mnuETrans7.Click, mnuETrans8.Click, mnuETrans9.Click
-
- Dim Value As Integer = DirectCast(sender, ToolStripMenuItem).Tag
- Dim Transparency As Byte = CDbl(255) * (CDbl(Value) / 100)
-
- Dim Colour1 As Color = pbFontColour.BackColor
- Dim Colour2 As Color = Color.FromArgb(255 - Transparency, Colour1.R, Colour1.G, Colour1.B)
- pbFontColour.BackColor = Colour2
- FSelectedProjectlet.FontEffectColour = Colour2
- UpdateStyle(FStyle, FSelectedProjectlet)
- UpdateAllPreviews()
-
- End Sub
-
- Private Sub cboTextAlignment_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cboTextAlignment.SelectedIndexChanged
-
- If FIgnoreControlEvents Then Exit Sub
-
- Dim SelectedItem As ListItem(Of Style.ETextAlignment) = cboTextAlignment.SelectedItem
- FProjector.ProjectletByName(FSelectedProjectlet.Category).FontFormat = Projectlet.CreateFontFormat(SelectedItem.Key)
- FSelectedProjectlet.Alignment = SelectedItem.Key
- UpdateStyle(FStyle, FSelectedProjectlet)
-
- pnlProjectlet.Invalidate()
-
- End Sub
-
- Private Sub cboDisplayOption_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cboDisplayOption.SelectedIndexChanged
-
- If FIgnoreControlEvents Then Exit Sub
-
- Dim SelectedItem As ListItem(Of Style.EDisplayOption) = cboDisplayOption.SelectedItem
- FProjector.ProjectletByName(FSelectedProjectlet.Category).DisplayOption = SelectedItem.Key
- FSelectedProjectlet.DisplayOption = SelectedItem.Key
- UpdateStyle(FStyle, FSelectedProjectlet)
-
- pnlProjectlet.Invalidate()
-
- End Sub
-
- Private Sub HandleDrawWidget(ByVal graphics As Graphics, ByVal region As Rectangle)
-
- ' Determine what text to display
- Dim TextToDisplay As String = GetSampleText(FSelectedProjectlet.Category)
-
- ' Determine font to use
- Dim FontSize As Integer = Projector.GetProjectingFontSize(FSelectedProjectlet.FontSize, pnlProjectlet.Width)
- Dim Font As New Font(FSelectedProjectlet.FontName, _
- FontSize, _
- FSelectedProjectlet.FontStyle, _
- GraphicsUnit.Pixel)
-
- ' TODO: LOW: Do this better!
- ' Create a new image
- Dim WidgetImage As New Bitmap(region.Width, region.Height, Imaging.PixelFormat.Format32bppPArgb)
- Dim G As Graphics = graphics.FromImage(WidgetImage)
- G.Clear(Color.White)
- G.DrawString(TextToDisplay, Font, Brushes.Black, New RectangleF(0, 0, region.Width, region.Height), Projectlet.CreateFontFormat(FSelectedProjectlet.Alignment))
- graphics.DrawImageUnscaled(WidgetImage, region.Left, region.Top)
-
- End Sub
-
- Private Sub HandleWidgetMovement(ByVal widget As Widget)
-
- If FIgnoreControlEvents Then Exit Sub
-
- FSelectedProjectlet.Area = widget.Area
- FProjector.ProjectletByName(FSelectedProjectlet.Category).Area = widget.Area
-
- End Sub
-
- End Class