Esempio n. 1
0
    def testDeleteMultipleCells(self):

        b00 = GafferUI.Button("00")
        b01 = GafferUI.Button("01")
        b11 = GafferUI.Button("11")
        b10 = GafferUI.Button("10")

        g = GafferUI.GridContainer()

        g[0, 0] = b00
        g[0, 1] = b01
        g[1, 1] = b11
        g[1, 0] = b10

        self.assertEqual(g.gridSize(), IECore.V2i(2, 2))

        del g[0:2, 0]

        self.assertEqual(g.gridSize(), IECore.V2i(2, 2))

        self.failUnless(g[0, 0] is None)
        self.failUnless(g[1, 0] is None)
        self.failUnless(g[0, 1] is b01)
        self.failUnless(g[1, 1] is b11)
        self.failUnless(b00.parent() is None)
        self.failUnless(b10.parent() is None)
	def __init__( self, plug, **kw ) :

		grid = GafferUI.GridContainer( spacing = 4 )
		GafferUI.PlugValueWidget.__init__( self, grid, plug, **kw )

		self.__menuButton = GafferUI.MenuButton( menu = GafferUI.Menu( Gaffer.WeakMethod( self.__menuDefinition ) ) )
		grid[0:2,0] = self.__menuButton

		self.__minLabel = GafferUI.Label( "Min" )
		grid.addChild( self.__minLabel, index = ( 0, 1 ), alignment = ( GafferUI.HorizontalAlignment.Right, GafferUI.VerticalAlignment.Center ) )

		self.__minWidget = GafferUI.CompoundNumericPlugValueWidget( plug["displayWindow"]["min"] )
		grid[1,1] = self.__minWidget

		self.__maxLabel = GafferUI.Label( "Max" )
		grid.addChild( self.__maxLabel, index = ( 0, 2 ), alignment = ( GafferUI.HorizontalAlignment.Right, GafferUI.VerticalAlignment.Center ) )

		self.__maxWidget = GafferUI.CompoundNumericPlugValueWidget( plug["displayWindow"]["max"] )
		grid[1,2] = self.__maxWidget

		self.__pixelAspectLabel = GafferUI.Label( "Pixel Aspect" )
		grid.addChild( self.__pixelAspectLabel, index = ( 0, 3 ), alignment = ( GafferUI.HorizontalAlignment.Right, GafferUI.VerticalAlignment.Center ) )

		self.__pixelAspectWidget = GafferUI.NumericPlugValueWidget( plug["pixelAspect"] )
		grid[1,3] = self.__pixelAspectWidget

		# If the plug hasn't got an input, the PlugValueWidget base class assumes we're not
		# sensitive to contex changes and omits calls to _updateFromPlug(). But the default
		# format mechanism uses the context, so we must arrange to do updates ourselves when
		# necessary.
		self.__contextChangedConnection = self.getContext().changedSignal().connect( Gaffer.WeakMethod( self.__contextChanged ) )

		self._addPopupMenu( self.__menuButton )
		self._updateFromPlug()
Esempio n. 3
0
	def __init__( self, parameter ) :

		self.__parameter = parameter

		grid = GafferUI.GridContainer( spacing = 2 )
		GafferUI.Widget.__init__( self, grid )

		self.__inspectors = []

		with grid :

			label = GafferUI.Label(
				## \todo Prettify label text (remove snake case)
				text = "<h5>" + IECore.CamelCase.toSpaced( parameter ) + "</h5>",
				parenting = { "index" : ( slice( 0, 2 ), 0 ) }
			)
			label._qtWidget().setMaximumWidth( 140 )

			self.__editButton = GafferUI.Button( image = "editOff.png", hasFrame = False,
				parenting = {
					"index" : ( 0, 1 ),
					"alignment" : ( GafferUI.HorizontalAlignment.Center, GafferUI.VerticalAlignment.Center )
				}
			)
			self.__editButton.clickedSignal().connect( Gaffer.WeakMethod( self.__editButtonClicked ), scoped = False )

			self.__valueWidget = _ValueWidget( parenting = { "index" : ( 1, 1 ) } )
			self.__valueWidget.buttonReleaseSignal().connect( Gaffer.WeakMethod( self.__valueWidgetClicked ), scoped = False )

		self.update( [] )
Esempio n. 4
0
	def testDeleteMultipleCells( self ) :

		b00 = GafferUI.Button( "00" )
		b01 = GafferUI.Button( "01" )
		b11 = GafferUI.Button( "11" )
		b10 = GafferUI.Button( "10" )

		g = GafferUI.GridContainer()

		g[0,0] = b00
		g[0,1] = b01
		g[1,1] = b11
		g[1,0] = b10

		self.assertEqual( g.gridSize(), imath.V2i( 2, 2 ) )

		del g[0:2,0]

		self.assertEqual( g.gridSize(), imath.V2i( 2, 2 ) )

		self.assertIsNone( g[0,0] )
		self.assertIsNone( g[1,0] )
		self.assertTrue( g[0,1] is b01 )
		self.assertTrue( g[1,1] is b11 )
		self.assertIsNone( b00.parent() )
		self.assertIsNone( b10.parent() )
Esempio n. 5
0
    def testGridSize(self):

        c1 = GafferUI.GridContainer()
        b1 = GafferUI.Button("b1")
        b2 = GafferUI.Button("b2")

        self.assertEqual(c1.gridSize(), IECore.V2i(0, 0))

        c1[0, 0] = b1

        self.assertEqual(c1.gridSize(), IECore.V2i(1, 1))

        c1[1, 0] = b2

        self.assertEqual(c1.gridSize(), IECore.V2i(2, 1))

        del c1[1, 0]

        self.assertEqual(c1.gridSize(), IECore.V2i(1, 1))

        del c1[0, 0]

        self.assertEqual(c1.gridSize(), IECore.V2i(0, 0))

        c1[1, 0] = b2

        self.assertEqual(c1.gridSize(), IECore.V2i(2, 1))

        del c1[1, 0]

        self.assertEqual(c1.gridSize(), IECore.V2i(0, 0))
Esempio n. 6
0
	def testTransferChild( self ) :

		c1 = GafferUI.GridContainer()
		c2 = GafferUI.GridContainer()

		b1 = GafferUI.Button( "b1" )

		c1[0,0] = b1

		self.assertTrue( b1.parent() is c1 )
		self.assertTrue( c1[0,0] is b1 )

		c2[0,0] = b1

		self.assertTrue( b1.parent() is c2 )
		self.assertIsNone( c1[0,0] )
		self.assertTrue( c2[0,0] is b1 )
Esempio n. 7
0
    def testTransferChild(self):

        c1 = GafferUI.GridContainer()
        c2 = GafferUI.GridContainer()

        b1 = GafferUI.Button("b1")

        c1[0, 0] = b1

        self.failUnless(b1.parent() is c1)
        self.failUnless(c1[0, 0] is b1)

        c2[0, 0] = b1

        self.failUnless(b1.parent() is c2)
        self.failUnless(c1[0, 0] is None)
        self.failUnless(c2[0, 0] is b1)
Esempio n. 8
0
    def __init__(self, pathFilter, **kw):

        self.__grid = GafferUI.GridContainer(spacing=4)

        GafferUI.PathFilterWidget.__init__(self, self.__grid, pathFilter, **kw)

        self.__filters = []
        self._updateFromPathFilter()
Esempio n. 9
0
    def testSimpleSetItem(self):

        c = GafferUI.GridContainer()

        b1 = GafferUI.Button("b1")
        b2 = GafferUI.Button("b2")
        b3 = GafferUI.Button("b3")
        b4 = GafferUI.Button("b4")

        self.assertEqual(b1.parent(), None)
        self.assertEqual(b2.parent(), None)
        self.assertEqual(b3.parent(), None)
        self.assertEqual(b4.parent(), None)

        self.assertEqual(c.gridSize(), IECore.V2i(0, 0))

        c[0, 0] = b1

        self.assertEqual(c.gridSize(), IECore.V2i(1, 1))

        self.failUnless(b1.parent() is c)
        self.failUnless(c[0, 0] is b1)

        c[1, 0] = b2

        self.assertEqual(c.gridSize(), IECore.V2i(2, 1))

        self.failUnless(b1.parent() is c)
        self.failUnless(b2.parent() is c)
        self.failUnless(c[0, 0] is b1)
        self.failUnless(c[1, 0] is b2)

        c[0, 1] = b3

        self.assertEqual(c.gridSize(), IECore.V2i(2, 2))

        self.failUnless(b1.parent() is c)
        self.failUnless(b2.parent() is c)
        self.failUnless(b3.parent() is c)
        self.failUnless(c[0, 0] is b1)
        self.failUnless(c[1, 0] is b2)
        self.failUnless(c[0, 1] is b3)

        c[1, 1] = b4

        self.assertEqual(c.gridSize(), IECore.V2i(2, 2))

        self.failUnless(b1.parent() is c)
        self.failUnless(b2.parent() is c)
        self.failUnless(b3.parent() is c)
        self.failUnless(b4.parent() is c)
        self.failUnless(c[0, 0] is b1)
        self.failUnless(c[1, 0] is b2)
        self.failUnless(c[0, 1] is b3)
        self.failUnless(c[1, 1] is b4)
Esempio n. 10
0
	def __init__( self, scope, **kw ) :

		GafferUI.Dialogue.__init__( self, "", sizeMode = self.SizeMode.Automatic, **kw )

		with GafferUI.GridContainer( spacing = 4 ) as grid :

			# criteria row

			GafferUI.Label(
				"Find",
				parenting = {
					"index" : ( 0, 0 ),
					"alignment" : ( GafferUI.HorizontalAlignment.Right, GafferUI.VerticalAlignment.Center ),
				}
			)

			self.__matchString = GafferUI.MultiSelectionMenu(
				allowMultipleSelection = False,
				allowEmptySelection = False,
				parenting = { "index" : ( 1, 0 ) }
			)

			# match text row

			GafferUI.Label(
				"Matching",
				parenting = {
					"index" : ( 0, 2 ),
					"alignment" : ( GafferUI.HorizontalAlignment.Right, GafferUI.VerticalAlignment.Center ),
				}
			)

			self.__matchPattern =  GafferUI.TextWidget( parenting = { "index" : ( 1, 2 ) } )
			self.__matchPattern.setToolTip( "Use * to match any text and ? to match any single character.\nDrag a node here to get the text for selecting similar nodes." )

			self.__dragEnterConnection = self.__matchPattern.dragEnterSignal().connect( Gaffer.WeakMethod( self.__dragEnter ) )
			self.__dragLeaveConnection = self.__matchPattern.dragLeaveSignal().connect( Gaffer.WeakMethod( self.__dragLeave ) )
			self.__dropConnection = self.__matchPattern.dropSignal().connect( Gaffer.WeakMethod( self.__drop ) )

		self._setWidget( grid )

		self.__cancelButton = self._addButton( "Cancel" )
		self.__selectNextButton = self._addButton( "Select Next" )
		self.__selectAllButton = self._addButton( "Select All" )

		self.__activatedConnection = self.__matchPattern.activatedSignal().connect( Gaffer.WeakMethod( self.__activated ) )

		self.__cancelButtonClickedSignal = self.__cancelButton.clickedSignal().connect( Gaffer.WeakMethod( self.__buttonClicked ) )
		self.__selectNextButtonClickedSignal = self.__selectNextButton.clickedSignal().connect( Gaffer.WeakMethod( self.__buttonClicked ) )
		self.__selectAllButtonClickedSignal = self.__selectAllButton.clickedSignal().connect( Gaffer.WeakMethod( self.__buttonClicked ) )

		self.__visibilityChangedConnection = self.visibilityChangedSignal().connect( Gaffer.WeakMethod( self.__visibilityChanged ) )

		self.__scope = None
		self.setScope( scope )
Esempio n. 11
0
    def testAutomaticParenting(self):

        with GafferUI.GridContainer() as g:

            b = GafferUI.Button("hi", parenting={"index": (1, 2)})
            t = GafferUI.TextWidget("hi", parenting={"index": (0, 0)})

        self.failUnless(b.parent() is g)
        self.failUnless(t.parent() is g)

        self.failUnless(g[1, 2] is b)
        self.failUnless(g[0, 0] is t)
Esempio n. 12
0
    def __init__(self, plug, **kw):

        self.__grid = GafferUI.GridContainer(spacing=4)

        GafferUI.PlugValueWidget.__init__(self, self.__grid, plug, **kw)

        with self.__grid:
            for x in range(0, 10):
                for y in range(0, 3):
                    GafferUI.ColorSwatch(parenting={"index": (x, y)})

        self._updateFromPlug()
Esempio n. 13
0
    def testRemoveChild(self):

        c1 = GafferUI.GridContainer()
        b1 = GafferUI.Button("b1")

        c1[0, 0] = b1

        self.failUnless(b1.parent() is c1)
        self.failUnless(c1[0, 0] is b1)

        c1.removeChild(b1)

        self.failUnless(b1.parent() is None)
        self.failUnless(c1[0, 0] is None)
Esempio n. 14
0
	def testRemoveRowContainingMultiCellChild( self ) :

		g = GafferUI.GridContainer()

		b1 = GafferUI.Button()

		g[0:2,0:2] = b1

		self.assertEqual( g.gridSize(), imath.V2i( 2, 2 ) )

		g.removeRow( 0 )

		self.assertIsNone( b1.parent() )
		self.assertEqual( g.gridSize(), imath.V2i( 0, 0 ) )
Esempio n. 15
0
	def testDelItem( self ) :

		c1 = GafferUI.GridContainer()
		b1 = GafferUI.Button( "b1" )

		c1[0,0] = b1

		self.assertTrue( b1.parent() is c1 )
		self.assertTrue( c1[0,0] is b1 )

		del c1[0,0]

		self.assertIsNone( b1.parent() )
		self.assertIsNone( c1[0,0] )
Esempio n. 16
0
	def testRemoveChild( self ) :

		c1 = GafferUI.GridContainer()
		b1 = GafferUI.Button( "b1" )

		c1[0,0] = b1

		self.assertTrue( b1.parent() is c1 )
		self.assertTrue( c1[0,0] is b1 )

		c1.removeChild( b1 )

		self.assertIsNone( b1.parent() )
		self.assertIsNone( c1[0,0] )
Esempio n. 17
0
    def testDelItem(self):

        c1 = GafferUI.GridContainer()
        b1 = GafferUI.Button("b1")

        c1[0, 0] = b1

        self.failUnless(b1.parent() is c1)
        self.failUnless(c1[0, 0] is b1)

        del c1[0, 0]

        self.failUnless(b1.parent() is None)
        self.failUnless(c1[0, 0] is None)
Esempio n. 18
0
    def testRemoveColumnContainingMultiCellChild(self):

        g = GafferUI.GridContainer()

        b1 = GafferUI.Button()

        g[0:2, 0:2] = b1

        self.assertEqual(g.gridSize(), IECore.V2i(2, 2))

        g.removeColumn(0)

        self.failUnless(b1.parent() is None)
        self.assertEqual(g.gridSize(), IECore.V2i(0, 0))
Esempio n. 19
0
	def __init__( self, previewWidget, node, **kw ) :

		self.__grid = GafferUI.GridContainer( spacing = 4 )

		GafferUI.Widget.__init__( self, self.__grid, **kw )

		self.__grid[0,0] =  GafferUI.Spacer(
			IECore.V2i( GafferUI.PlugWidget.labelWidth(), 1 ),
			IECore.V2i( GafferUI.PlugWidget.labelWidth(), 1 ),
		)
		self.__grid[1,0] = previewWidget

		previewWidget.setToolTip( "The values generated by the wedge" )

		self.__node = node
		self.__plugDirtiedConnection = node.plugDirtiedSignal().connect( Gaffer.WeakMethod( self.__plugDirtied ) )
Esempio n. 20
0
	def __init__( self, **kw ) :
	
		self.__grid = GafferUI.GridContainer()
		GafferUI.Widget.__init__( self, self.__grid, **kw )

		with self.__grid :
			for i in range( 0, 2 ) :
				frame = GafferUI.Frame(
					borderWidth = 4,
					borderStyle = GafferUI.Frame.BorderStyle.None,
					parenting = { "index" : ( 0, i ) }
				)
				## \todo Should we provide frame types via methods on the
				# Frame class? Are DiffA/DiffB types for a frame a bit too
				# specialised?
				frame._qtWidget().setObjectName( "gafferDiffA" if i == 0 else "gafferDiffB" )
Esempio n. 21
0
	def testOverlayWidgetAt( self ) :

		w = GafferUI.Window()
		g = GafferUI.GLWidget()
		c = GafferUI.GridContainer()
		b = GafferUI.Button()

		w.setChild( g )
		g.addOverlay( c )
		c.addChild( b, alignment = ( GafferUI.HorizontalAlignment.None_, GafferUI.VerticalAlignment.Top ) )

		w.setVisible( True )

		self.waitForIdle( 10000 )

		self.assertTrue( GafferUI.Widget.widgetAt( w.bound().min() + imath.V2i( 4 ) ) is b )
Esempio n. 22
0
	def testSetChildOnTopOfMultiCellChild( self ) :

		g = GafferUI.GridContainer()

		b1 = GafferUI.Button()
		b2 = GafferUI.Button()

		g[0:2,0:2] = b1

		self.assertTrue( b1.parent() is g )

		self.assertEqual( g.gridSize(), imath.V2i( 2, 2 ) )

		g[0,0] = b2

		self.assertIsNone( b1.parent() )
		self.assertTrue( b2.parent() is g )
		self.assertEqual( g.gridSize(), imath.V2i( 1, 1 ) )
Esempio n. 23
0
    def testSetChildOnTopOfMultiCellChild(self):

        g = GafferUI.GridContainer()

        b1 = GafferUI.Button()
        b2 = GafferUI.Button()

        g[0:2, 0:2] = b1

        self.failUnless(b1.parent() is g)

        self.assertEqual(g.gridSize(), IECore.V2i(2, 2))

        g[0, 0] = b2

        self.failUnless(b1.parent() is None)
        self.failUnless(b2.parent() is g)
        self.assertEqual(g.gridSize(), IECore.V2i(1, 1))
Esempio n. 24
0
	def testReplaceItem( self ) :

		c = GafferUI.GridContainer()

		b1 = GafferUI.Button()
		b2 = GafferUI.Button()

		self.assertIsNone( b1.parent() )
		self.assertIsNone( b2.parent() )

		c[0,0] = b1

		self.assertTrue( b1.parent() is c )
		self.assertIsNone( b2.parent() )

		c[0,0] = b2

		self.assertIsNone( b1.parent() )
		self.assertTrue( b2.parent() is c )
Esempio n. 25
0
    def testReplaceItem(self):

        c = GafferUI.GridContainer()

        b1 = GafferUI.Button()
        b2 = GafferUI.Button()

        self.failUnless(b1.parent() is None)
        self.failUnless(b2.parent() is None)

        c[0, 0] = b1

        self.failUnless(b1.parent() is c)
        self.failUnless(b2.parent() is None)

        c[0, 0] = b2

        self.failUnless(b1.parent() is None)
        self.failUnless(b2.parent() is c)
Esempio n. 26
0
	def testMultiCellChild( self ) :

		g = GafferUI.GridContainer()

		b1 = GafferUI.Button()

		g[0:2,0:2] = b1

		self.assertTrue( b1.parent() is g )

		self.assertEqual( g.gridSize(), imath.V2i( 2, 2 ) )

		self.assertTrue( g[0,0] is b1 )
		self.assertTrue( g[0,1] is b1 )
		self.assertTrue( g[1,0] is b1 )
		self.assertTrue( g[1,1] is b1 )

		del g[0,0]

		self.assertIsNone( b1.parent() )
		self.assertEqual( g.gridSize(), imath.V2i( 0, 0 ) )
Esempio n. 27
0
    def testMultiCellChild(self):

        g = GafferUI.GridContainer()

        b1 = GafferUI.Button()

        g[0:2, 0:2] = b1

        self.failUnless(b1.parent() is g)

        self.assertEqual(g.gridSize(), IECore.V2i(2, 2))

        self.failUnless(g[0, 0] is b1)
        self.failUnless(g[0, 1] is b1)
        self.failUnless(g[1, 0] is b1)
        self.failUnless(g[1, 1] is b1)

        del g[0, 0]

        self.failUnless(b1.parent() is None)
        self.assertEqual(g.gridSize(), IECore.V2i(0, 0))
Esempio n. 28
0
	def testRemoveRow( self ) :

		b00 = GafferUI.Button( "00" )
		b01 = GafferUI.Button( "01" )
		b11 = GafferUI.Button( "11" )
		b10 = GafferUI.Button( "10" )

		g = GafferUI.GridContainer()

		g[0,0] = b00
		g[0,1] = b01
		g[1,1] = b11
		g[1,0] = b10

		self.assertEqual( g.gridSize(), imath.V2i( 2, 2 ) )

		g.removeRow( 0 )

		self.assertEqual( g.gridSize(), imath.V2i( 2, 1 ) )

		self.assertTrue( g[0,0] is b01 )
		self.assertTrue( g[1,0] is b11 )
Esempio n. 29
0
    def testRemoveColumn(self):

        b00 = GafferUI.Button("00")
        b01 = GafferUI.Button("01")
        b11 = GafferUI.Button("11")
        b10 = GafferUI.Button("10")

        g = GafferUI.GridContainer()

        g[0, 0] = b00
        g[0, 1] = b01
        g[1, 1] = b11
        g[1, 0] = b10

        self.assertEqual(g.gridSize(), IECore.V2i(2, 2))

        g.removeColumn(0)

        self.assertEqual(g.gridSize(), IECore.V2i(1, 2))

        self.failUnless(g[0, 0] is b10)
        self.failUnless(g[0, 1] is b11)
Esempio n. 30
0
    def __init__(self, scriptNode, **kw):

        self.__gadgetWidget = GafferUI.GadgetWidget(bufferOptions=set(
            (GafferUI.GLWidget.BufferOptions.Depth,
             GafferUI.GLWidget.BufferOptions.Double)), )

        GafferUI.NodeSetEditor.__init__(self, self.__gadgetWidget, scriptNode,
                                        **kw)

        self.__nodeToolbars = []
        self.__viewToolbars = []

        with GafferUI.GridContainer(borderWidth=2, spacing=0) as overlay:

            with GafferUI.ListContainer(
                    orientation=GafferUI.ListContainer.Orientation.Horizontal,
                    parenting={
                        "index": (slice(0, 5), 0),
                        "alignment": (GafferUI.HorizontalAlignment.None,
                                      GafferUI.VerticalAlignment.Top)
                    }):

                self.__toolMenuButton = GafferUI.MenuButton(
                    menu=GafferUI.Menu(
                        Gaffer.WeakMethod(self.__toolMenuDefinition)),
                    hasFrame=False,
                )

                GafferUI.Spacer(IECore.V2i(0), parenting={"expand": True})

                self.__viewToolbars.append(
                    _Toolbar(GafferUI.Edge.Top,
                             parenting={
                                 "verticalAlignment":
                                 GafferUI.VerticalAlignment.Top
                             }))

            self.__nodeToolbars.append(
                _Toolbar(GafferUI.Edge.Top,
                         parenting={
                             "index": (slice(0, 5), 1),
                             "alignment": (GafferUI.HorizontalAlignment.Center,
                                           GafferUI.VerticalAlignment.Top),
                         }))

            self.__viewToolbars.append(
                _Toolbar(GafferUI.Edge.Left,
                         parenting={
                             "index": (0, 2),
                             "alignment": (GafferUI.HorizontalAlignment.Left,
                                           GafferUI.VerticalAlignment.Center),
                         }))

            self.__nodeToolbars.append(
                _Toolbar(GafferUI.Edge.Left,
                         parenting={
                             "index": (1, 2),
                             "alignment": (GafferUI.HorizontalAlignment.Left,
                                           GafferUI.VerticalAlignment.Center),
                         }))

            self.__nodeToolbars.append(
                _Toolbar(GafferUI.Edge.Right,
                         parenting={
                             "index": (3, 2),
                             "alignment": (GafferUI.HorizontalAlignment.Right,
                                           GafferUI.VerticalAlignment.Center),
                         }))

            self.__viewToolbars.append(
                _Toolbar(GafferUI.Edge.Right,
                         parenting={
                             "index": (4, 2),
                             "alignment": (GafferUI.HorizontalAlignment.Right,
                                           GafferUI.VerticalAlignment.Center),
                         }))

            self.__nodeToolbars.append(
                _Toolbar(GafferUI.Edge.Bottom,
                         parenting={
                             "index": (slice(0, 5), 3),
                             "alignment": (GafferUI.HorizontalAlignment.Center,
                                           GafferUI.VerticalAlignment.Bottom),
                         }))

            self.__viewToolbars.append(
                _Toolbar(GafferUI.Edge.Bottom,
                         parenting={
                             "index": (slice(0, 5), 4),
                             "alignment": (GafferUI.HorizontalAlignment.Center,
                                           GafferUI.VerticalAlignment.Bottom),
                         }))