Resize method and tests

This commit is contained in:
Matthias Koefferlein 2022-05-07 22:12:36 +02:00
parent 7b85bf7de2
commit 42f0a79dee
8 changed files with 100 additions and 24 deletions

View File

@ -1136,6 +1136,11 @@ Class<lay::LayoutView> decl_LayoutView (QT_EXTERNAL_BASE (QWidget) "lay", "Layou
"Show the layout in full depth down to the deepest level of hierarchy. "
"This method may cause a redraw."
) +
gsi::method ("resize", static_cast<void (lay::LayoutView::*) (unsigned int, unsigned int)> (&lay::LayoutView::resize),
"@brief Resizes the layout view to the given dimension\n"
"\n"
"This method has been made available in all builds in 0.28.\n"
) +
#if defined(HAVE_QT) && defined(HAVE_QTBINDINGS)
gsi::method ("get_screenshot", static_cast<QImage (lay::LayoutView::*) ()> (&lay::LayoutView::get_screenshot),
"@brief Gets a screenshot as a \\QImage\n"

View File

@ -1007,38 +1007,47 @@ LayoutCanvas::screenshot ()
}
#if defined(HAVE_QT)
void
LayoutCanvas::resizeEvent (QResizeEvent *)
{
// clear the image cache
m_image_cache.clear ();
// set the viewport to the new size
m_viewport.set_size (width () * m_dpr, height () * m_dpr);
m_viewport_l.set_size (width () * m_oversampling * m_dpr, height () * m_oversampling * m_dpr);
mouse_event_trans (db::DCplxTrans (1.0 / double (m_dpr)) * m_viewport.trans ());
do_redraw_all (true);
viewport_changed_event ();
do_resize (width (), height ());
}
#else
#endif
void
LayoutCanvas::resize (unsigned int width, unsigned int height)
{
// clear the image cache
m_image_cache.clear ();
// don't wait until the layout system informs us - which may never take place when
// the widget isn't shown.
do_resize (width, height);
// set the viewport to the new size
m_viewport.set_size (width * m_dpr, height * m_dpr);
m_viewport_l.set_size (width * m_oversampling * m_dpr, height * m_oversampling * m_dpr);
mouse_event_trans (db::DCplxTrans (1.0 / double (m_dpr)) * m_viewport.trans ());
do_redraw_all (true);
viewport_changed_event ();
#if defined(HAVE_QT)
QWidget::resize (width, height);
#endif
}
#endif
void
LayoutCanvas::do_resize (unsigned int width, unsigned int height)
{
unsigned int w = width * m_dpr, h = height * m_dpr;
unsigned int wl = width * m_oversampling * m_dpr, hl = height * m_oversampling * m_dpr;
if (m_viewport.width () != w || m_viewport.height () != h ||
m_viewport_l.width () != wl || m_viewport_l.height () != hl) {
// clear the image cache
m_image_cache.clear ();
// set the viewport to the new size
m_viewport.set_size (width * m_dpr, height * m_dpr);
m_viewport_l.set_size (width * m_oversampling * m_dpr, height * m_oversampling * m_dpr);
mouse_event_trans (db::DCplxTrans (1.0 / double (m_dpr)) * m_viewport.trans ());
do_redraw_all (true);
viewport_changed_event ();
}
}
void
LayoutCanvas::update_viewport ()

View File

@ -341,6 +341,11 @@ public:
return m_viewport;
}
/**
* @brief Resizes the canvas object in the Qt-less case
*/
void resize (unsigned int width, unsigned int height);
/**
* @brief An event indicating that the viewport was changed.
* If the viewport (the rectangle that is shown) changes, this event is fired.
@ -361,7 +366,7 @@ private:
lay::LayoutViewBase *mp_view;
lay::PixelBuffer *mp_image;
lay::PixelBuffer *mp_image_bg;
#if defined(HAVE_QT) // @@@
#if defined(HAVE_QT)
QPixmap *mp_pixmap;
#endif
db::DBox m_precious_box;
@ -396,8 +401,6 @@ private:
virtual void paintEvent (QPaintEvent *);
virtual void resizeEvent (QResizeEvent *);
virtual bool event (QEvent *e);
#else
void resize (unsigned int width, unsigned int height);
#endif
virtual void key_event (unsigned int key, unsigned int buttons);
@ -411,6 +414,7 @@ private:
void do_update_image ();
void do_end_of_drawing ();
void do_redraw_all (bool force_redraw = true);
void do_resize (unsigned int width, unsigned int height);
void prepare_drawing ();
};

View File

@ -413,6 +413,14 @@ public:
return mp_editor_options_frame;
}
/**
* @brief Resizes the view to the given width and height in pixels
*/
void resize (unsigned int width, unsigned int height)
{
LayoutViewBase::resize (width, height);
}
/**
* @brief Copies to clipboard
*

View File

@ -485,6 +485,11 @@ LayoutViewBase::~LayoutViewBase ()
mp_canvas = 0;
}
void LayoutViewBase::resize (unsigned int width, unsigned int height)
{
mp_canvas->resize (width, height);
}
void LayoutViewBase::update_event_handlers ()
{
tl::Object::detach_from_all_events ();

View File

@ -1637,6 +1637,11 @@ public:
return mp_canvas->viewport ();
}
/**
* @brief Resizes the view to the given width and height in pixels
*/
void resize (unsigned int width, unsigned int height);
/**
* @brief Background color property
*/

View File

@ -24,6 +24,7 @@
#include "tlUnitTest.h"
#include "tlTimer.h"
#include "tlSleep.h"
#if defined(HAVE_QT)
@ -150,6 +151,28 @@ TEST(3)
}
#endif
TEST(4)
{
lay::LayoutView lv (0, false, 0);
lv.set_drawing_workers (2);
lv.cell_box_color (lay::Color (0, 0, 0));
lv.load_layout (tl::testsrc () + "/testdata/gds/t10.gds", true);
lv.resize (42, 117);
tl::msleep (250);
lay::PixelBuffer img = lv.get_screenshot_pb ();
EXPECT_EQ (img.width (), 42);
EXPECT_EQ (img.height (), 117);
lv.resize (142, 217);
img = lv.get_screenshot_pb ();
EXPECT_EQ (img.width (), 142);
EXPECT_EQ (img.height (), 217);
}
#if defined(HAVE_PNG)
TEST(11)
{

View File

@ -454,6 +454,23 @@ class LAYLayoutView_TestClass < TestBase
end
def test_5
lv = RBA::LayoutView::new
lv.load_layout(File.join($ut_testsrc, "testdata/gds/t10.gds"), true)
lv.resize(42, 117)
img = lv.get_screenshot_pixels
assert_equal(img.width, 42)
assert_equal(img.height, 117)
lv.resize(142, 217)
img = lv.get_screenshot_pixels
assert_equal(img.width, 142)
assert_equal(img.height, 217)
end
end
load("test_epilogue.rb")