diff options
author | Caolán McNamara <caolanm@redhat.com> | 2014-06-12 13:02:05 +0100 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2014-06-12 13:54:14 +0100 |
commit | 0cab72b8191dc8ee5941fc5900d0c3b2c48fd0f3 (patch) | |
tree | e25417ba13612f68149aba0dae0a35d0c63447ea /extensions | |
parent | 99b1b4d4751081cee70d4ccb1d459a3776ed2250 (diff) |
extract gamma grid drawing to standalone widget
so the dialog stops scribbling on itself, and instead
uses a real widget for that
This has to be one of our weirdest dialogs, why expend so much effort to create
this dialog for the most obscure of issues.
Change-Id: Ia25e6c67fb278528c6c68a1d6db74de59915fd34
Diffstat (limited to 'extensions')
-rw-r--r-- | extensions/source/scanner/grid.cxx | 347 | ||||
-rw-r--r-- | extensions/source/scanner/grid.hxx | 122 | ||||
-rw-r--r-- | extensions/source/scanner/sanedlg.cxx | 2 | ||||
-rw-r--r-- | extensions/uiconfig/scanner/ui/griddialog.ui | 31 |
4 files changed, 279 insertions, 223 deletions
diff --git a/extensions/source/scanner/grid.cxx b/extensions/source/scanner/grid.cxx index 898f834ecb11..ae3695494d71 100644 --- a/extensions/source/scanner/grid.cxx +++ b/extensions/source/scanner/grid.cxx @@ -29,6 +29,116 @@ #include <algorithm> #include <boost/scoped_array.hpp> +class GridWindow : public Window +{ + // helper class for handles + struct impHandle + { + Point maPos; + sal_uInt16 mnOffX; + sal_uInt16 mnOffY; + + impHandle(const Point& rPos, sal_uInt16 nX, sal_uInt16 nY) + : maPos(rPos), mnOffX(nX), mnOffY(nY) + { + } + + bool operator<(const impHandle& rComp) const + { + return (maPos.X() < rComp.maPos.X()); + } + + void draw(Window& rWin, const BitmapEx& rBitmapEx) + { + const Point aOffset(rWin.PixelToLogic(Point(mnOffX, mnOffY))); + rWin.DrawBitmapEx(maPos - aOffset, rBitmapEx); + } + + bool isHit(Window& rWin, const Point& rPos) + { + const Point aOffset(rWin.PixelToLogic(Point(mnOffX, mnOffY))); + const Rectangle aTarget(maPos - aOffset, maPos + aOffset); + return aTarget.IsInside(rPos); + } + }; + + Rectangle m_aGridArea; + + double m_fMinX; + double m_fMinY; + double m_fMaxX; + double m_fMaxY; + + double m_fChunkX; + double m_fMinChunkX; + double m_fChunkY; + double m_fMinChunkY; + + double* m_pXValues; + double* m_pOrigYValues; + int m_nValues; + double* m_pNewYValues; + + sal_uInt16 m_BmOffX; + sal_uInt16 m_BmOffY; + + bool m_bCutValues; + + // stuff for handles + std::vector< impHandle > m_aHandles; + sal_uInt32 m_nDragIndex; + + BitmapEx m_aMarkerBitmap; + + Point transform( double x, double y ); + void transform( const Point& rOriginal, double& x, double& y ); + + double findMinX(); + double findMinY(); + double findMaxX(); + double findMaxY(); + + void updateRectSize(); + + void drawGrid(); + void drawOriginal(); + void drawNew(); + void drawHandles(); + + void computeExtremes(); + void computeChunk( double fMin, double fMax, double& fChunkOut, double& fMinChunkOut ); + void computeNew(); + double interpolate( double x, double* pNodeX, double* pNodeY, int nNodes ); + + virtual void MouseMove( const MouseEvent& ) SAL_OVERRIDE; + virtual void MouseButtonDown( const MouseEvent& ) SAL_OVERRIDE; + virtual void MouseButtonUp( const MouseEvent& ) SAL_OVERRIDE; + void onResize(); + virtual void Resize() SAL_OVERRIDE; + virtual Size GetOptimalSize() const SAL_OVERRIDE; + void drawLine( double x1, double y1, double x2, double y2 ); +public: + GridWindow(Window* pParent); + void Init(double* pXValues, double* pYValues, int nValues, bool bCutValues); + virtual ~GridWindow(); + + void setBoundings( double fMinX, double fMinY, double fMaxX, double fMaxY ); + double getMinX() { return m_fMinX; } + double getMinY() { return m_fMinY; } + double getMaxX() { return m_fMaxX; } + double getMaxY() { return m_fMaxY; } + + int countValues() { return m_nValues; } + double* getXValues() { return m_pXValues; } + double* getOrigYValues() { return m_pOrigYValues; } + double* getNewYValues() { return m_pNewYValues; } + + void ChangeMode(int nType); + + virtual void Paint( const Rectangle& rRect ) SAL_OVERRIDE; +}; + + namespace { ResId SaneResId( sal_uInt32 nID ) @@ -39,41 +149,32 @@ ResId SaneResId( sal_uInt32 nID ) } -/*********************************************************************** - * - * GridWindow - * - ***********************************************************************/ - - - -GridWindow::GridWindow(double* pXValues, double* pYValues, int nValues, Window* pParent, bool bCutValues ) -: ModalDialog( pParent, "GridDialog", "modules/scanner/ui/griddialog.ui" ), - m_aGridArea( 50, 15, 100, 100 ), - m_pXValues( pXValues ), - m_pOrigYValues( pYValues ), - m_nValues( nValues ), - m_pNewYValues( NULL ), - m_bCutValues( bCutValues ), - m_aHandles(), - m_nDragIndex( 0xffffffff ), - m_aMarkerBitmap( FixedImage::loadThemeImage("extensions/source/scanner/handle.png").GetBitmapEx() ) +GridWindow::GridWindow(Window* pParent) + : Window(pParent, 0) + , m_aGridArea(50, 15, 100, 100) + , m_pXValues(NULL) + , m_pOrigYValues(NULL) + , m_nValues(0) + , m_pNewYValues(NULL) + , m_bCutValues(false) + , m_aHandles() + , m_nDragIndex(0xffffffff) + , m_aMarkerBitmap( FixedImage::loadThemeImage("extensions/source/scanner/handle.png").GetBitmapEx() ) { - get(m_pOKButton, "ok"); - get(m_pResetTypeBox, "resetTypeCombobox"); - get(m_pResetButton, "resetButton"); - - m_pResetTypeBox->SelectEntryPos( 0 ); + SetMapMode(MapMode(MAP_PIXEL)); +} - m_pResetButton->SetClickHdl( LINK( this, GridWindow, ClickButtonHdl ) ); +void GridWindow::Init(double* pXValues, double* pYValues, int nValues, bool bCutValues) +{ + m_pXValues = pXValues; + m_pOrigYValues = pYValues; + m_nValues = nValues; + m_bCutValues = bCutValues; - SetMapMode( MapMode( MAP_PIXEL ) ); - Size aSize = GetOutputSizePixel(); - Size aBtnSize = m_pOKButton->GetOutputSizePixel(); - m_aGridArea.setWidth( aSize.Width() - aBtnSize.Width() - 80 ); - m_aGridArea.setHeight( aSize.Height() - 40 ); + SetSizePixel(GetOptimalSize()); + onResize(); - if( m_pOrigYValues && m_nValues ) + if (m_pOrigYValues && m_nValues) { m_pNewYValues = new double[ m_nValues ]; memcpy( m_pNewYValues, m_pOrigYValues, sizeof( double ) * m_nValues ); @@ -89,6 +190,37 @@ GridWindow::GridWindow(double* pXValues, double* pYValues, int nValues, Window* m_aHandles.push_back(impHandle(transform(findMaxX(), findMaxY()), m_BmOffX, m_BmOffY)); } +void GridWindow::Resize() +{ + onResize(); +} + +void GridWindow::onResize() +{ + Size aSize = GetSizePixel(); + m_aGridArea.setWidth( aSize.Width() - 80 ); + m_aGridArea.setHeight( aSize.Height() - 40 ); +} + +Size GridWindow::GetOptimalSize() const +{ + return LogicToPixel(Size(240, 200), MAP_APPFONT); +} + +GridDialog::GridDialog(double* pXValues, double* pYValues, int nValues, Window* pParent, bool bCutValues ) + : ModalDialog(pParent, "GridDialog", "modules/scanner/ui/griddialog.ui") +{ + get(m_pOKButton, "ok"); + get(m_pResetTypeBox, "resetTypeCombobox"); + get(m_pResetButton, "resetButton"); + get(m_pGridWindow, "gridwindow"); + m_pGridWindow->Init(pXValues, pYValues, nValues, bCutValues); + + m_pResetTypeBox->SelectEntryPos( 0 ); + + m_pResetButton->SetClickHdl( LINK( this, GridDialog, ClickButtonHdl ) ); +} + GridWindow::~GridWindow() { delete [] m_pNewYValues; @@ -105,8 +237,6 @@ double GridWindow::findMinX() return fMin; } - - double GridWindow::findMinY() { if( ! m_pNewYValues ) @@ -183,23 +313,17 @@ Point GridWindow::transform( double x, double y ) return aRet; } - - void GridWindow::transform( const Point& rOriginal, double& x, double& y ) { x = ( rOriginal.X() - m_aGridArea.Left() ) * (m_fMaxX - m_fMinX) / (double)m_aGridArea.GetWidth() + m_fMinX; y = ( m_aGridArea.Bottom() - rOriginal.Y() ) * (m_fMaxY - m_fMinY) / (double)m_aGridArea.GetHeight() + m_fMinY; } - - void GridWindow::drawLine( double x1, double y1, double x2, double y2 ) { DrawLine( transform( x1, y1 ), transform( x2, y2 ) ); } - - void GridWindow::computeChunk( double fMin, double fMax, double& fChunkOut, double& fMinChunkOut ) { // get a nice chunk size like 10, 100, 25 or such @@ -298,9 +422,12 @@ double GridWindow::interpolate( return ret; } +void GridDialog::setBoundings(double fMinX, double fMinY, double fMaxX, double fMaxY) +{ + m_pGridWindow->setBoundings(fMinX, fMinY, fMaxX, fMaxY); +} - -void GridWindow::setBoundings( double fMinX, double fMinY, double fMaxX, double fMaxY ) +void GridWindow::setBoundings(double fMinX, double fMinY, double fMaxX, double fMaxY) { m_fMinX = fMinX; m_fMinY = fMinY; @@ -311,8 +438,6 @@ void GridWindow::setBoundings( double fMinX, double fMinY, double fMaxX, double computeChunk( m_fMinY, m_fMaxY, m_fChunkY, m_fMinChunkY ); } - - void GridWindow::drawGrid() { char pBuf[256]; @@ -351,8 +476,6 @@ void GridWindow::drawGrid() drawLine( m_fMaxX, m_fMinY, m_fMaxX, m_fMaxY ); } - - void GridWindow::drawOriginal() { if( m_nValues && m_pXValues && m_pOrigYValues ) @@ -366,8 +489,6 @@ void GridWindow::drawOriginal() } } - - void GridWindow::drawNew() { if( m_nValues && m_pXValues && m_pNewYValues ) @@ -383,8 +504,6 @@ void GridWindow::drawNew() } } - - void GridWindow::drawHandles() { for(sal_uInt32 i(0L); i < m_aHandles.size(); i++) @@ -393,19 +512,15 @@ void GridWindow::drawHandles() } } - - void GridWindow::Paint( const Rectangle& rRect ) { - ModalDialog::Paint( rRect ); + Window::Paint(rRect); drawGrid(); drawOriginal(); drawNew(); drawHandles(); } - - void GridWindow::MouseMove( const MouseEvent& rEvt ) { if( rEvt.GetButtons() == MOUSE_LEFT && m_nDragIndex != 0xffffffff ) @@ -436,7 +551,7 @@ void GridWindow::MouseMove( const MouseEvent& rEvt ) } } - ModalDialog::MouseMove( rEvt ); + Window::MouseMove( rEvt ); } void GridWindow::MouseButtonUp( const MouseEvent& rEvt ) @@ -452,7 +567,7 @@ void GridWindow::MouseButtonUp( const MouseEvent& rEvt ) } } - ModalDialog::MouseButtonUp( rEvt ); + Window::MouseButtonUp( rEvt ); } void GridWindow::MouseButtonDown( const MouseEvent& rEvt ) @@ -502,81 +617,95 @@ void GridWindow::MouseButtonDown( const MouseEvent& rEvt ) Paint( m_aGridArea ); } - ModalDialog::MouseButtonDown( rEvt ); + Window::MouseButtonDown( rEvt ); } -IMPL_LINK( GridWindow, ClickButtonHdl, Button*, pButton ) +void GridWindow::ChangeMode(int nType) { - if( pButton == m_pResetButton ) + switch( nType ) { - int nType = m_pResetTypeBox->GetSelectEntryPos(); - switch( nType ) + case LINEAR_ASCENDING: { - case LINEAR_ASCENDING: + for( int i = 0; i < m_nValues; i++ ) { - for( int i = 0; i < m_nValues; i++ ) - { - m_pNewYValues[ i ] = m_fMinY + (m_fMaxY-m_fMinY)/(m_fMaxX-m_fMinX)*(m_pXValues[i]-m_fMinX); - } + m_pNewYValues[ i ] = m_fMinY + (m_fMaxY-m_fMinY)/(m_fMaxX-m_fMinX)*(m_pXValues[i]-m_fMinX); } - break; - case LINEAR_DESCENDING: - { - for( int i = 0; i < m_nValues; i++ ) - { - m_pNewYValues[ i ] = m_fMaxY - (m_fMaxY-m_fMinY)/(m_fMaxX-m_fMinX)*(m_pXValues[i]-m_fMinX); - } - } - break; - case RESET: + } + break; + case LINEAR_DESCENDING: + { + for( int i = 0; i < m_nValues; i++ ) { - if( m_pOrigYValues && m_pNewYValues && m_nValues ) - memcpy( m_pNewYValues, m_pOrigYValues, m_nValues*sizeof(double) ); + m_pNewYValues[ i ] = m_fMaxY - (m_fMaxY-m_fMinY)/(m_fMaxX-m_fMinX)*(m_pXValues[i]-m_fMinX); } - break; - case EXPONENTIAL: + } + break; + case RESET: + { + if( m_pOrigYValues && m_pNewYValues && m_nValues ) + memcpy( m_pNewYValues, m_pOrigYValues, m_nValues*sizeof(double) ); + } + break; + case EXPONENTIAL: + { + for( int i = 0; i < m_nValues; i++ ) { - for( int i = 0; i < m_nValues; i++ ) - { - m_pNewYValues[ i ] = m_fMinY + (m_fMaxY-m_fMinY)*(std::exp((m_pXValues[i]-m_fMinX)/(m_fMaxX-m_fMinX))-1.0)/(M_E-1.0); - } + m_pNewYValues[ i ] = m_fMinY + (m_fMaxY-m_fMinY)*(std::exp((m_pXValues[i]-m_fMinX)/(m_fMaxX-m_fMinX))-1.0)/(M_E-1.0); } - break; - - default: - break; } + break; - if (m_pNewYValues) + default: + break; + } + + if (m_pNewYValues) + { + for(sal_uInt32 i(0L); i < m_aHandles.size(); i++) { - for(sal_uInt32 i(0L); i < m_aHandles.size(); i++) + // find nearest xvalue + double x, y; + transform( m_aHandles[i].maPos, x, y ); + int nIndex = 0; + double delta = std::fabs( x-m_pXValues[0] ); + for( int n = 1; n < m_nValues; n++ ) { - // find nearest xvalue - double x, y; - transform( m_aHandles[i].maPos, x, y ); - int nIndex = 0; - double delta = std::fabs( x-m_pXValues[0] ); - for( int n = 1; n < m_nValues; n++ ) + if( delta > std::fabs( x - m_pXValues[ n ] ) ) { - if( delta > std::fabs( x - m_pXValues[ n ] ) ) - { - delta = std::fabs( x - m_pXValues[ n ] ); - nIndex = n; - } + delta = std::fabs( x - m_pXValues[ n ] ); + nIndex = n; } - if( 0 == i ) - m_aHandles[i].maPos = transform( m_fMinX, m_pNewYValues[ nIndex ] ); - else if( m_aHandles.size() - 1L == i ) - m_aHandles[i].maPos = transform( m_fMaxX, m_pNewYValues[ nIndex ] ); - else - m_aHandles[i].maPos = transform( m_pXValues[ nIndex ], m_pNewYValues[ nIndex ] ); } + if( 0 == i ) + m_aHandles[i].maPos = transform( m_fMinX, m_pNewYValues[ nIndex ] ); + else if( m_aHandles.size() - 1L == i ) + m_aHandles[i].maPos = transform( m_fMaxX, m_pNewYValues[ nIndex ] ); + else + m_aHandles[i].maPos = transform( m_pXValues[ nIndex ], m_pNewYValues[ nIndex ] ); } + } - Invalidate( m_aGridArea ); - Paint(Rectangle()); + Invalidate(); +} + +IMPL_LINK( GridDialog, ClickButtonHdl, Button*, pButton ) +{ + if (pButton == m_pResetButton) + { + int nType = m_pResetTypeBox->GetSelectEntryPos(); + m_pGridWindow->ChangeMode(nType); } return 0; } +double* GridDialog::getNewYValues() +{ + return m_pGridWindow->getNewYValues(); +} + +extern "C" SAL_DLLPUBLIC_EXPORT Window* SAL_CALL makeGridWindow(Window *pParent, VclBuilder::stringmap &) +{ + return new GridWindow(pParent); +} + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/extensions/source/scanner/grid.hxx b/extensions/source/scanner/grid.hxx index da59d6560610..7416c6abcfe4 100644 --- a/extensions/source/scanner/grid.hxx +++ b/extensions/source/scanner/grid.hxx @@ -25,125 +25,33 @@ #include <vcl/dialog.hxx> #include <vcl/fixed.hxx> -class GridWindow : public ModalDialog -{ - // helper class for handles - struct impHandle - { - Point maPos; - sal_uInt16 mnOffX; - sal_uInt16 mnOffY; - - impHandle(const Point& rPos, sal_uInt16 nX, sal_uInt16 nY) - : maPos(rPos), mnOffX(nX), mnOffY(nY) - { - } - - bool operator<(const impHandle& rComp) const - { - return (maPos.X() < rComp.maPos.X()); - } - - void draw(Window& rWin, const BitmapEx& rBitmapEx) - { - const Point aOffset(rWin.PixelToLogic(Point(mnOffX, mnOffY))); - rWin.DrawBitmapEx(maPos - aOffset, rBitmapEx); - } - - bool isHit(Window& rWin, const Point& rPos) - { - const Point aOffset(rWin.PixelToLogic(Point(mnOffX, mnOffY))); - const Rectangle aTarget(maPos - aOffset, maPos + aOffset); - return aTarget.IsInside(rPos); - } - }; - - enum resetType - { - LINEAR_ASCENDING = 0, - LINEAR_DESCENDING = 1, - RESET = 2, - EXPONENTIAL = 3 - }; - - Rectangle m_aGridArea; - - double m_fMinX; - double m_fMinY; - double m_fMaxX; - double m_fMaxY; - - double m_fChunkX; - double m_fMinChunkX; - double m_fChunkY; - double m_fMinChunkY; - - double* m_pXValues; - double* m_pOrigYValues; - int m_nValues; - double* m_pNewYValues; - - sal_uInt16 m_BmOffX; - sal_uInt16 m_BmOffY; - - bool m_bCutValues; +class GridWindow; - // stuff for handles - std::vector< impHandle > m_aHandles; - sal_uInt32 m_nDragIndex; - - BitmapEx m_aMarkerBitmap; +enum resetType +{ + LINEAR_ASCENDING = 0, + LINEAR_DESCENDING = 1, + RESET = 2, + EXPONENTIAL = 3 +}; +class GridDialog : public ModalDialog +{ OKButton* m_pOKButton; ListBox* m_pResetTypeBox; PushButton* m_pResetButton; - - Point transform( double x, double y ); - void transform( const Point& rOriginal, double& x, double& y ); - - double findMinX(); - double findMinY(); - double findMaxX(); - double findMaxY(); - - void updateRectSize(); - - void drawGrid(); - void drawOriginal(); - void drawNew(); - void drawHandles(); - - void computeExtremes(); - void computeChunk( double fMin, double fMax, double& fChunkOut, double& fMinChunkOut ); - void computeNew(); - double interpolate( double x, double* pNodeX, double* pNodeY, int nNodes ); + GridWindow* m_pGridWindow; DECL_LINK( ClickButtonHdl, Button* ); - virtual void MouseMove( const MouseEvent& ) SAL_OVERRIDE; - virtual void MouseButtonDown( const MouseEvent& ) SAL_OVERRIDE; - virtual void MouseButtonUp( const MouseEvent& ) SAL_OVERRIDE; public: - GridWindow( double* pXValues, double* pYValues, int nValues, - Window* pParent, bool bCutValues = true ); - virtual ~GridWindow(); - - void setBoundings( double fMinX, double fMinY, double fMaxX, double fMaxY ); - double getMinX() { return m_fMinX; } - double getMinY() { return m_fMinY; } - double getMaxX() { return m_fMaxX; } - double getMaxY() { return m_fMaxY; } - - int countValues() { return m_nValues; } - double* getXValues() { return m_pXValues; } - double* getOrigYValues() { return m_pOrigYValues; } - double* getNewYValues() { return m_pNewYValues; } - - void drawLine( double x1, double y1, double x2, double y2 ); + GridDialog(double* pXValues, double* pYValues, int nValues, + Window* pParent, bool bCutValues = true); - virtual void Paint( const Rectangle& rRect ) SAL_OVERRIDE; + void setBoundings(double fMinX, double fMinY, double fMaxX, double fMaxY); + double* getNewYValues(); }; #endif // INCLUDED_EXTENSIONS_SOURCE_SCANNER_GRID_HXX diff --git a/extensions/source/scanner/sanedlg.cxx b/extensions/source/scanner/sanedlg.cxx index ebae9fec9ed6..6e431bd78520 100644 --- a/extensions/source/scanner/sanedlg.cxx +++ b/extensions/source/scanner/sanedlg.cxx @@ -559,7 +559,7 @@ IMPL_LINK( SaneDlg, ClickBtnHdl, Button*, pButton ) x[ i ] = (double)i; mrSane.GetOptionValue( mnCurrentOption, y.get() ); - GridWindow aGrid( x.get(), y.get(), nElements, this ); + GridDialog aGrid( x.get(), y.get(), nElements, this ); aGrid.SetText( mrSane.GetOptionName( mnCurrentOption ) ); aGrid.setBoundings( 0, mfMin, nElements, mfMax ); if( aGrid.Execute() && aGrid.getNewYValues() ) diff --git a/extensions/uiconfig/scanner/ui/griddialog.ui b/extensions/uiconfig/scanner/ui/griddialog.ui index 1d95b3cd917b..25638a5e43d1 100644 --- a/extensions/uiconfig/scanner/ui/griddialog.ui +++ b/extensions/uiconfig/scanner/ui/griddialog.ui @@ -1,6 +1,8 @@ <?xml version="1.0" encoding="UTF-8"?> +<!-- Generated with glade 3.16.1 --> <interface> - <!-- interface-requires gtk+ 3.0 --> + <!-- interface-requires LibreOffice 1.0 --> + <requires lib="gtk+" version="3.0"/> <object class="GtkDialog" id="GridDialog"> <property name="can_focus">False</property> <property name="border_width">6</property> @@ -20,8 +22,9 @@ <property name="use_action_appearance">False</property> <property name="visible">True</property> <property name="can_focus">True</property> + <property name="can_default">True</property> + <property name="has_default">True</property> <property name="receives_default">True</property> - <property name="use_action_appearance">False</property> <property name="use_stock">True</property> </object> <packing> @@ -37,7 +40,6 @@ <property name="visible">True</property> <property name="can_focus">True</property> <property name="receives_default">True</property> - <property name="use_action_appearance">False</property> <property name="use_stock">True</property> </object> <packing> @@ -47,9 +49,15 @@ </packing> </child> <child> - <object class="GtkComboBox" id="resetTypeCombobox"> + <object class="GtkComboBoxText" id="resetTypeCombobox"> <property name="visible">True</property> <property name="can_focus">False</property> + <items> + <item translatable="yes">Linear ascending</item> + <item translatable="yes">Linear descending</item> + <item translatable="yes">Original values</item> + <item translatable="yes">Exponential increasing</item> + </items> </object> <packing> <property name="expand">False</property> @@ -64,7 +72,6 @@ <property name="visible">True</property> <property name="can_focus">True</property> <property name="receives_default">True</property> - <property name="use_action_appearance">False</property> <property name="use_underline">True</property> </object> <packing> @@ -82,7 +89,19 @@ </packing> </child> <child> - <placeholder/> + <object class="scnlo-GridWindow" id="gridwindow"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">center</property> + <property name="valign">start</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> </child> </object> </child> |