mirror of https://github.com/KLayout/klayout.git
Improved the image pixel value display: favors selected image, faster
This commit is contained in:
parent
8fa97d7fcc
commit
8eaf5638f8
|
|
@ -412,6 +412,7 @@ View::render (const lay::Viewport &vp, lay::ViewObjectCanvas &canvas)
|
||||||
|
|
||||||
Service::Service (db::Manager *manager, lay::LayoutViewBase *view)
|
Service::Service (db::Manager *manager, lay::LayoutViewBase *view)
|
||||||
: lay::BackgroundViewObject (view->canvas ()),
|
: lay::BackgroundViewObject (view->canvas ()),
|
||||||
|
lay::ViewService (view->canvas ()),
|
||||||
lay::Editable (view),
|
lay::Editable (view),
|
||||||
lay::Plugin (view),
|
lay::Plugin (view),
|
||||||
db::Object (manager),
|
db::Object (manager),
|
||||||
|
|
@ -424,6 +425,9 @@ Service::Service (db::Manager *manager, lay::LayoutViewBase *view)
|
||||||
m_images_visible (true),
|
m_images_visible (true),
|
||||||
m_visibility_cache_valid (false)
|
m_visibility_cache_valid (false)
|
||||||
{
|
{
|
||||||
|
// for receiving mouse_move events to get the pixel value
|
||||||
|
ui ()->grab_mouse (this, false);
|
||||||
|
|
||||||
// place images behind the grid
|
// place images behind the grid
|
||||||
z_order (-1);
|
z_order (-1);
|
||||||
|
|
||||||
|
|
@ -599,9 +603,52 @@ dragging_what (const img::Object *iobj, const db::DBox &search_dbox, img::Servic
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
Service::mouse_move_event (const db::DPoint & /*p*/, unsigned int /*buttons*/, bool /*prio*/)
|
Service::mouse_move_event (const db::DPoint &pos, unsigned int /*buttons*/, bool prio)
|
||||||
{
|
{
|
||||||
// .. nothing yet ..
|
if (! prio && (m_selected_image_views.size () == size_t (1) || (mp_transient_view && ! editables ()->has_selection ()))) {
|
||||||
|
|
||||||
|
const img::Object *image = 0;
|
||||||
|
bool is_transient = false;
|
||||||
|
if (! m_selected_image_views.empty ()) {
|
||||||
|
image = m_selected_image_views.front ()->image_object ();
|
||||||
|
} else if (mp_transient_view) {
|
||||||
|
image = mp_transient_view->image_object ();
|
||||||
|
is_transient = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (image) {
|
||||||
|
|
||||||
|
std::string data_string;
|
||||||
|
|
||||||
|
db::DPoint pixel = image->matrix ().inverted ().trans (pos);
|
||||||
|
if (pixel.x () > image->width () * -0.5 - 0.5 + db::epsilon && pixel.x () < image->width () * 0.5 + 0.5 - db::epsilon &&
|
||||||
|
pixel.y () > image->height () * -0.5 - 0.5 + db::epsilon && pixel.y () < image->height () * 0.5 + 0.5 - db::epsilon) {
|
||||||
|
|
||||||
|
db::Point pixel_index = db::Point (pixel + db::DVector (image->width () * 0.5 - 0.5, image->height () * 0.5 - 0.5));
|
||||||
|
|
||||||
|
// check once again to account to rounding issues
|
||||||
|
if (pixel_index.x () >= 0 && pixel_index.x () < image->width () &&
|
||||||
|
pixel_index.y () >= 0 && pixel_index.y () < image->height ()) {
|
||||||
|
|
||||||
|
if (image->is_color ()) {
|
||||||
|
data_string = tl::sprintf ("RGB: %.5g,%.5g,%.5g",
|
||||||
|
image->pixel (pixel_index.x (), pixel_index.y (), 0),
|
||||||
|
image->pixel (pixel_index.x (), pixel_index.y (), 1),
|
||||||
|
image->pixel (pixel_index.x (), pixel_index.y (), 2));
|
||||||
|
} else {
|
||||||
|
data_string = tl::sprintf ("%.5g", image->pixel (pixel_index.x (), pixel_index.y ()));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
display_status (is_transient, data_string);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1312,7 +1359,6 @@ Service::transient_select (const db::DPoint &pos)
|
||||||
clear_transient_selection ();
|
clear_transient_selection ();
|
||||||
|
|
||||||
bool any_selected = false;
|
bool any_selected = false;
|
||||||
std::string data_string;
|
|
||||||
|
|
||||||
// compute search box
|
// compute search box
|
||||||
double l = catch_distance ();
|
double l = catch_distance ();
|
||||||
|
|
@ -1340,41 +1386,12 @@ Service::transient_select (const db::DPoint &pos)
|
||||||
mp_transient_view = new img::View (this, imin, img::View::mode_transient);
|
mp_transient_view = new img::View (this, imin, img::View::mode_transient);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mp_transient_view->image_object ()) {
|
|
||||||
|
|
||||||
const img::Object *image = mp_transient_view->image_object ();
|
|
||||||
|
|
||||||
db::DPoint pixel = image->matrix ().inverted ().trans (pos);
|
|
||||||
if (pixel.x () > image->width () * -0.5 - 0.5 + db::epsilon && pixel.x () < image->width () * 0.5 + 0.5 - db::epsilon &&
|
|
||||||
pixel.y () > image->height () * -0.5 - 0.5 + db::epsilon && pixel.y () < image->height () * 0.5 + 0.5 - db::epsilon) {
|
|
||||||
|
|
||||||
db::Point pixel_index = db::Point (pixel + db::DVector (image->width () * 0.5 - 0.5, image->height () * 0.5 - 0.5));
|
|
||||||
|
|
||||||
// check once again to account to rounding issues
|
|
||||||
if (pixel_index.x () >= 0 && pixel_index.x () < image->width () &&
|
|
||||||
pixel_index.y () >= 0 && pixel_index.y () < image->height ()) {
|
|
||||||
|
|
||||||
if (image->is_color ()) {
|
|
||||||
data_string = tl::sprintf ("RGB: %.5g,%.5g,%.5g",
|
|
||||||
image->pixel (pixel_index.x (), pixel_index.y (), 0),
|
|
||||||
image->pixel (pixel_index.x (), pixel_index.y (), 1),
|
|
||||||
image->pixel (pixel_index.x (), pixel_index.y (), 2));
|
|
||||||
} else {
|
|
||||||
data_string = tl::sprintf ("%.5g", image->pixel (pixel_index.x (), pixel_index.y ()));
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
any_selected = true;
|
any_selected = true;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (any_selected && ! editables ()->has_selection ()) {
|
if (any_selected && ! editables ()->has_selection ()) {
|
||||||
display_status (true, data_string);
|
display_status (true);
|
||||||
}
|
}
|
||||||
|
|
||||||
return any_selected;
|
return any_selected;
|
||||||
|
|
@ -1477,6 +1494,7 @@ Service::select (const db::DBox &box, lay::Editable::SelectionMode mode)
|
||||||
select (mp_view->annotation_shapes ().iterator_from_pointer (robj), mode);
|
select (mp_view->annotation_shapes ().iterator_from_pointer (robj), mode);
|
||||||
m_previous_selection.insert (mp_view->annotation_shapes ().iterator_from_pointer (robj));
|
m_previous_selection.insert (mp_view->annotation_shapes ().iterator_from_pointer (robj));
|
||||||
needs_update = true;
|
needs_update = true;
|
||||||
|
any_selected = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -195,6 +195,7 @@ private:
|
||||||
|
|
||||||
class IMG_PUBLIC Service
|
class IMG_PUBLIC Service
|
||||||
: public lay::BackgroundViewObject,
|
: public lay::BackgroundViewObject,
|
||||||
|
public lay::ViewService,
|
||||||
public lay::Editable,
|
public lay::Editable,
|
||||||
public lay::Plugin,
|
public lay::Plugin,
|
||||||
public db::Object
|
public db::Object
|
||||||
|
|
@ -436,7 +437,15 @@ public:
|
||||||
/**
|
/**
|
||||||
* @brief Obtain the lay::Editable interface
|
* @brief Obtain the lay::Editable interface
|
||||||
*/
|
*/
|
||||||
lay::Editable *editable_interface ()
|
virtual lay::Editable *editable_interface ()
|
||||||
|
{
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Obtain the lay::ViewService interface
|
||||||
|
*/
|
||||||
|
virtual lay::ViewService *view_service_interface ()
|
||||||
{
|
{
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue