Enabled headless LayoutView. Works.

This commit is contained in:
Matthias Koefferlein 2022-05-26 01:51:09 +02:00
parent 96f3ce65c1
commit 03761768cf
44 changed files with 779 additions and 630 deletions

View File

@ -205,7 +205,7 @@ PropertiesPage::snap_to_layout_clicked ()
bool snap_p1 = sender () == p1_to_layout;
double snap_range = service->widget ()->mouse_event_trans ().inverted ().ctrans (service->snap_range ());
double snap_range = service->ui ()->mouse_event_trans ().inverted ().ctrans (service->snap_range ());
double max_range = 1000 * snap_range;
while (snap_range < max_range) {
@ -237,7 +237,7 @@ PropertiesPage::snap_to_layout_clicked ()
} else {
double snap_range = service->widget ()->mouse_event_trans ().inverted ().ctrans (service->snap_range ());
double snap_range = service->ui ()->mouse_event_trans ().inverted ().ctrans (service->snap_range ());
snap_range *= 0.5;
lay::TwoPointSnapToObjectResult ee = lay::obj_snap2 (service->view (), p1, p2, g, ac, snap_range, snap_range * 1000.0);

View File

@ -727,7 +727,7 @@ is_selected (const ant::Object &ruler, const db::DBox &box, double /*enl*/)
// -------------------------------------------------------------
View::View (ant::Service *rulers, const ant::Object *ruler, bool selected)
: lay::ViewObject (rulers->widget ()),
: lay::ViewObject (rulers->ui ()),
mp_rulers (rulers), m_selected (selected), mp_ruler (ruler)
{
// .. nothing else ..
@ -828,7 +828,7 @@ Service::configure (const std::string &name, const std::string &value)
// make the color available for the dynamic view objects too.
if (lay::test_and_set (m_color, color)) {
widget ()->touch ();
ui ()->touch ();
}
} else if (name == cfg_ruler_halo) {
@ -838,7 +838,7 @@ Service::configure (const std::string &name, const std::string &value)
// make the color available for the dynamic view objects too.
if (lay::test_and_set (m_halo, halo)) {
widget ()->touch ();
ui ()->touch ();
}
} else if (name == cfg_ruler_grid_micron) {
@ -967,20 +967,20 @@ Service::clear_rulers ()
double
Service::catch_distance ()
{
return double (view ()->search_range ()) / widget ()->mouse_event_trans ().mag ();
return double (view ()->search_range ()) / ui ()->mouse_event_trans ().mag ();
}
double
Service::catch_distance_box ()
{
return double (view ()->search_range_box ()) / widget ()->mouse_event_trans ().mag ();
return double (view ()->search_range_box ()) / ui ()->mouse_event_trans ().mag ();
}
void
Service::drag_cancel ()
{
if (m_drawing) {
widget ()->ungrab_mouse (this);
ui ()->ungrab_mouse (this);
m_drawing = false;
}
@ -1110,7 +1110,7 @@ bool
Service::begin_move (lay::Editable::MoveMode mode, const db::DPoint &p, lay::angle_constraint_type /*ac*/)
{
// cancel any pending move or drag operations, reset mp_active_ruler
widget ()->drag_cancel (); // KLUDGE: every service does this to the same service manager
ui ()->drag_cancel (); // KLUDGE: every service does this to the same service manager
clear_transient_selection ();
@ -1558,7 +1558,7 @@ Service::mouse_click_event (const db::DPoint &p, unsigned int buttons, bool prio
g = db::DVector (m_grid, m_grid);
}
double snap_range = widget ()->mouse_event_trans ().inverted ().ctrans (m_snap_range);
double snap_range = ui ()->mouse_event_trans ().inverted ().ctrans (m_snap_range);
snap_range *= 0.5;
lay::TwoPointSnapToObjectResult ee = lay::obj_snap2 (mp_view, p, g, ac, snap_range, snap_range * 1000.0);
@ -1592,7 +1592,7 @@ Service::mouse_click_event (const db::DPoint &p, unsigned int buttons, bool prio
mp_active_ruler->thaw ();
m_drawing = true;
widget ()->grab_mouse (this, false);
ui ()->grab_mouse (this, false);
}
@ -1627,7 +1627,7 @@ Service::mouse_click_event (const db::DPoint &p, unsigned int buttons, bool prio
ant::Object
Service::create_measure_ruler (const db::DPoint &pt, lay::angle_constraint_type ac)
{
double snap_range = widget ()->mouse_event_trans ().inverted ().ctrans (m_snap_range);
double snap_range = ui ()->mouse_event_trans ().inverted ().ctrans (m_snap_range);
snap_range *= 0.5;
ant::Template tpl;
@ -1687,7 +1687,7 @@ Service::snap1_details (const db::DPoint &p, bool obj_snap)
g = db::DVector (m_grid, m_grid);
}
double snap_range = widget ()->mouse_event_trans ().inverted ().ctrans (m_snap_range);
double snap_range = ui ()->mouse_event_trans ().inverted ().ctrans (m_snap_range);
return lay::obj_snap (obj_snap ? mp_view : 0, p, g, snap_range);
}
@ -1707,7 +1707,7 @@ Service::snap2_details (const db::DPoint &p1, const db::DPoint &p2, const ant::O
g = db::DVector (m_grid, m_grid);
}
double snap_range = widget ()->mouse_event_trans ().inverted ().ctrans (m_snap_range);
double snap_range = ui ()->mouse_event_trans ().inverted ().ctrans (m_snap_range);
lay::angle_constraint_type snap_mode = ac == lay::AC_Global ? (obj->angle_constraint () == lay::AC_Global ? m_snap_mode : obj->angle_constraint ()) : ac;
return lay::obj_snap (m_obj_snap && obj->snap () ? mp_view : 0, p1, p2, g, snap_mode, snap_range);

View File

@ -2158,7 +2158,7 @@ MainService::cm_tap ()
tl_assert (false); // see TODO
#endif
if (! view ()->view_object_widget ()->mouse_in_window ()) {
if (! view ()->canvas ()->widget () || view ()->canvas ()->mouse_in_window ()) {
return;
}
@ -2168,7 +2168,7 @@ MainService::cm_tap ()
finder.set_catch_all (true);
// go through all visible layers of all cellviews
db::DPoint pt = view ()->view_object_widget ()->mouse_position_um ();
db::DPoint pt = view ()->canvas ()->mouse_position_um ();
finder.find (view (), db::DBox (pt, pt));
std::set<std::pair<unsigned int, unsigned int> > layers_in_selection;
@ -2201,8 +2201,8 @@ MainService::cm_tap ()
int icon_size = menu->style ()->pixelMetric (QStyle::PM_ButtonIconSize);
db::DPoint mp_local = view ()->view_object_widget ()->mouse_position ();
QPoint mp = view ()->view_object_widget ()->mapToGlobal (QPoint (mp_local.x (), mp_local.y ()));
db::DPoint mp_local = view ()->canvas ()->mouse_position ();
QPoint mp = view ()->canvas ()->widget ()->mapToGlobal (QPoint (mp_local.x (), mp_local.y ()));
for (std::vector<lay::LayerPropertiesConstIterator>::const_iterator l = tapped_layers.begin (); l != tapped_layers.end (); ++l) {
QAction *a = menu->addAction (lay::LayerTreeModel::icon_for_layer (*l, view (), icon_size, icon_size, 0, true), tl::to_qstring ((*l)->display_string (view (), true, true /*with source*/)));
@ -2216,7 +2216,7 @@ MainService::cm_tap ()
lay::LayerPropertiesConstIterator iter = tapped_layers [index];
view ()->set_current_layer (iter);
edt::Service *es = dynamic_cast<edt::Service *> (view ()->view_object_widget ()->active_service ());
edt::Service *es = dynamic_cast<edt::Service *> (view ()->canvas ()->active_service ());
if (es) {
es->tap (pt);
}

View File

@ -1308,7 +1308,7 @@ const int sr_pixels = 8; // TODO: make variable
lay::PointSnapToObjectResult
PartialService::snap2 (const db::DPoint &p) const
{
double snap_range = widget ()->mouse_event_trans ().inverted ().ctrans (sr_pixels);
double snap_range = ui ()->mouse_event_trans ().inverted ().ctrans (sr_pixels);
return lay::obj_snap (m_snap_to_objects ? view () : 0, p, m_edit_grid == db::DVector () ? m_global_grid : m_edit_grid, snap_range);
}
@ -1526,7 +1526,7 @@ PartialService::edit_cancel ()
mp_box = 0;
}
widget ()->ungrab_mouse (this);
ui ()->ungrab_mouse (this);
selection_to_view ();
}
@ -1654,10 +1654,10 @@ PartialService::mouse_press_event (const db::DPoint &p, unsigned int buttons, bo
m_p1 = p;
m_p2 = p;
mp_box = new lay::RubberBox (widget (), m_color, p, p);
mp_box = new lay::RubberBox (ui (), m_color, p, p);
mp_box->set_stipple (6); // coarse hatched
widget ()->grab_mouse (this, true);
ui ()->grab_mouse (this, true);
} else {
@ -1673,7 +1673,7 @@ PartialService::mouse_press_event (const db::DPoint &p, unsigned int buttons, bo
m_current = m_start = p;
}
widget ()->grab_mouse (this, true);
ui ()->grab_mouse (this, true);
}
@ -1712,7 +1712,7 @@ PartialService::mouse_click_event (const db::DPoint &p, unsigned int buttons, bo
if (m_current != m_start) {
// stop dragging
widget ()->ungrab_mouse (this);
ui ()->ungrab_mouse (this);
manager ()->transaction (tl::to_string (tr ("Partial move")));
@ -1743,7 +1743,7 @@ PartialService::mouse_click_event (const db::DPoint &p, unsigned int buttons, bo
return true;
} else if (widget ()->mouse_event_viewport ().contains (p)) {
} else if (ui ()->mouse_event_viewport ().contains (p)) {
// clear other selection when this mode gets active
// (save the selection so our own selection does not get cleared)
@ -1901,7 +1901,7 @@ PartialService::mouse_double_click_event (const db::DPoint &p, unsigned int butt
m_alt_ac = ac_from_buttons (buttons);
// stop dragging
widget ()->ungrab_mouse (this);
ui ()->ungrab_mouse (this);
m_dragging = false;
partial_select (db::DBox (p, p), lay::Editable::Replace);
@ -2006,12 +2006,12 @@ PartialService::mouse_release_event (const db::DPoint &p, unsigned int buttons,
m_alt_ac = ac_from_buttons (buttons);
widget ()->ungrab_mouse (this);
ui ()->ungrab_mouse (this);
delete mp_box;
mp_box = 0;
if (widget ()->mouse_event_viewport ().contains (p)) {
if (ui ()->mouse_event_viewport ().contains (p)) {
lay::Editable::SelectionMode mode = lay::Editable::Replace;
bool shift = ((m_buttons & lay::ShiftButton) != 0);
@ -2067,7 +2067,7 @@ void
PartialService::del ()
{
// stop dragging
widget ()->ungrab_mouse (this);
ui ()->ungrab_mouse (this);
std::map <std::pair <db::cell_index_type, std::pair <unsigned int, unsigned int> >, std::vector <partial_objects::const_iterator> > shapes_to_delete_by_cell;
@ -2358,13 +2358,13 @@ PartialService::enter_edge (const EdgeWithIndex &e, size_t &nmarker, partial_obj
double
PartialService::catch_distance ()
{
return double (view ()->search_range ()) / widget ()->mouse_event_trans ().mag ();
return double (view ()->search_range ()) / ui ()->mouse_event_trans ().mag ();
}
double
PartialService::catch_distance_box ()
{
return double (view ()->search_range_box ()) / widget ()->mouse_event_trans ().mag ();
return double (view ()->search_range_box ()) / ui ()->mouse_event_trans ().mag ();
}
db::DPoint

View File

@ -179,7 +179,7 @@ const int sr_pixels = 8; // TODO: make variable
lay::PointSnapToObjectResult
Service::snap2_details (const db::DPoint &p) const
{
double snap_range = widget ()->mouse_event_trans ().inverted ().ctrans (sr_pixels);
double snap_range = ui ()->mouse_event_trans ().inverted ().ctrans (sr_pixels);
return lay::obj_snap (m_snap_to_objects ? view () : 0, p, m_edit_grid == db::DVector () ? m_global_grid : m_edit_grid, snap_range);
}
@ -192,7 +192,7 @@ Service::snap2 (const db::DPoint &p) const
db::DPoint
Service::snap2 (const db::DPoint &p, const db::DPoint &plast, bool connect) const
{
double snap_range = widget ()->mouse_event_trans ().inverted ().ctrans (sr_pixels);
double snap_range = ui ()->mouse_event_trans ().inverted ().ctrans (sr_pixels);
return lay::obj_snap (m_snap_to_objects ? view () : 0, plast, p, m_edit_grid == db::DVector () ? m_global_grid : m_edit_grid, connect ? connect_ac () : move_ac (), snap_range).snapped_point;
}
@ -922,13 +922,13 @@ Service::has_transient_selection ()
double
Service::catch_distance ()
{
return double (view ()->search_range ()) / widget ()->mouse_event_trans ().mag ();
return double (view ()->search_range ()) / ui ()->mouse_event_trans ().mag ();
}
double
Service::catch_distance_box ()
{
return double (view ()->search_range_box ()) / widget ()->mouse_event_trans ().mag ();
return double (view ()->search_range_box ()) / ui ()->mouse_event_trans ().mag ();
}
double

View File

@ -40,7 +40,7 @@ public:
* @brief Constructor attaching to a certain object
*/
LandmarkMarker (lay::ViewService *service, const db::DPoint &pos, bool selected)
: lay::ViewObject (service->widget ()),
: lay::ViewObject (service->ui ()),
mp_service (service), m_pos (pos), m_selected (selected), m_position_set (true)
{
// .. nothing yet ..
@ -50,7 +50,7 @@ public:
* @brief Constructor attaching to a certain object
*/
LandmarkMarker (lay::ViewService *service, bool selected)
: lay::ViewObject (service->widget ()),
: lay::ViewObject (service->ui ()),
mp_service (service), m_pos (), m_selected (selected), m_position_set (false)
{
// .. nothing yet ..
@ -146,7 +146,7 @@ class LandmarkEditorService
{
public:
LandmarkEditorService (lay::LayoutViewBase *view, img::Object *img)
: lay::ViewService (view->view_object_widget ()),
: lay::ViewService (view->canvas ()),
mp_image (img), m_selected (-1), m_dragging (false),
m_mode (LandmarksDialog::None)
{
@ -182,7 +182,7 @@ public:
update ();
widget ()->grab_mouse (this, false);
ui ()->grab_mouse (this, false);
m_dragging = true;
} else if (m_mode == LandmarksDialog::Delete) {
@ -227,7 +227,7 @@ public:
update ();
widget ()->grab_mouse (this, false);
ui ()->grab_mouse (this, false);
m_dragging = false;
}
@ -235,7 +235,7 @@ public:
} else {
int search_range = 5; // TODO: make_variable?
double l = double (search_range) / widget ()->mouse_event_trans ().mag ();
double l = double (search_range) / ui ()->mouse_event_trans ().mag ();
db::DBox search_box = db::DBox (p, p).enlarged (db::DVector (l, l));
int li = 0;
@ -307,7 +307,7 @@ public:
} else if (! m_dragging) {
int search_range = 5; // TODO: make_variable?
double l = double (search_range) / widget ()->mouse_event_trans ().mag ();
double l = double (search_range) / ui ()->mouse_event_trans ().mag ();
db::DBox search_box = db::DBox (p, p).enlarged (db::DVector (l, l));
int li = 0;
@ -343,7 +343,7 @@ public:
m_dragging = false;
}
widget ()->ungrab_mouse (this);
ui ()->ungrab_mouse (this);
}
void set_colors (lay::Color /*background*/, lay::Color /*color*/)

View File

@ -94,7 +94,7 @@ Navigator::~Navigator ()
void
Navigator::activate_service (lay::ViewService *service)
{
mp_view->view_object_widget ()->activate (service);
mp_view->canvas ()->activate (service);
}
void

View File

@ -410,7 +410,7 @@ View::render (const lay::Viewport &vp, lay::ViewObjectCanvas &canvas)
// img::Service implementation
Service::Service (db::Manager *manager, lay::LayoutViewBase *view)
: lay::BackgroundViewObject (view->view_object_widget ()),
: lay::BackgroundViewObject (view->canvas ()),
lay::Editable (view),
lay::Plugin (view),
db::Object (manager),

View File

@ -28,6 +28,7 @@
#include "tlException.h"
#include "tlString.h"
#include "tlExceptions.h"
#include "layUtils.h"
namespace lay
{
@ -55,10 +56,14 @@ public:
menu_entries.push_back (lay::menu_item ("clip_tool::show", "clip_tool:edit_mode", "edit_menu.utils_menu.end", tl::to_string (QObject::tr ("Clip Tool"))));
}
virtual lay::Plugin *create_plugin (db::Manager *, lay::Dispatcher *root, lay::LayoutViewBase *view) const
{
return new ClipDialog (root, view);
}
virtual lay::Plugin *create_plugin (db::Manager *, lay::Dispatcher *root, lay::LayoutViewBase *view) const
{
if (lay::has_gui ()) {
return new ClipDialog (root, view);
} else {
return 0;
}
}
};
static tl::RegisteredClass<lay::PluginDeclaration> config_decl (new ClipDialogPluginDeclaration (), 20000, "ClipDialogPlugin");

View File

@ -34,6 +34,7 @@
#include "tlExceptions.h"
#include "layMainWindow.h"
#include "layCellSelectionForm.h"
#include "layUtils.h"
#include "edtService.h"
namespace lay
@ -64,7 +65,11 @@ public:
virtual lay::Plugin *create_plugin (db::Manager *, lay::Dispatcher *root, lay::LayoutViewBase *view) const
{
return new FillDialog (root, view);
if (lay::has_gui ()) {
return new FillDialog (root, view);
} else {
return 0;
}
}
};

View File

@ -50,7 +50,7 @@ public:
};
NavigatorService (LayoutView *view)
: ViewService (view->view_object_widget ()),
: ViewService (view->canvas ()),
mp_view (view), mp_source_view (0),
mp_viewport_marker (0),
m_drag_mode (DM_none),
@ -101,7 +101,7 @@ public:
delete mp_box;
mp_box = 0;
widget ()->ungrab_mouse (this);
ui ()->ungrab_mouse (this);
if (mp_source_view) {
mp_source_view->zoom_box (db::DBox (m_p1, m_p2));
@ -112,7 +112,7 @@ public:
} else if (m_dragging) {
m_dragging = false;
widget ()->ungrab_mouse (this);
ui ()->ungrab_mouse (this);
return true;
} else {
@ -123,7 +123,7 @@ public:
bool mouse_click_event (const db::DPoint &p, unsigned int buttons, bool prio)
{
if (! prio && (buttons & lay::RightButton) != 0) {
db::DBox vp = widget ()->mouse_event_viewport ();
db::DBox vp = ui ()->mouse_event_viewport ();
if (mp_source_view && vp.contains (p)) {
db::DVector d = (vp.p2 () - vp.p1 ()) * 0.5;
mp_source_view->zoom_box (db::DBox (p - d, p + d));
@ -156,7 +156,7 @@ public:
m_dragging = true;
m_p0 = p;
m_b0 = m_box;
widget ()->grab_mouse (this, true);
ui ()->grab_mouse (this, true);
return true;
} else {
@ -389,7 +389,7 @@ public:
delete mp_box;
mp_box = 0;
}
widget ()->ungrab_mouse (this);
ui ()->ungrab_mouse (this);
}
void set_colors (lay::Color /*background*/, lay::Color color)
@ -426,9 +426,9 @@ private:
mp_box = 0;
m_p1 = pos;
m_vp = widget ()->mouse_event_viewport ();
m_vp = ui ()->mouse_event_viewport ();
widget ()->grab_mouse (this, true);
ui ()->grab_mouse (this, true);
}
void begin (const db::DPoint &pos)
@ -439,9 +439,9 @@ private:
m_p1 = pos;
m_p2 = pos;
mp_box = new lay::RubberBox (widget (), m_color, pos, pos);
mp_box = new lay::RubberBox (ui (), m_color, pos, pos);
widget ()->grab_mouse (this, true);
ui ()->grab_mouse (this, true);
}
};
@ -664,7 +664,7 @@ Navigator::attach_view (LayoutView *view)
mp_view->widget ()->show ();
mp_service = new NavigatorService (mp_view);
mp_view->view_object_widget ()->activate (mp_service);
mp_view->canvas ()->activate (mp_service);
mp_source_view->cellviews_changed_event.add (this, &Navigator::content_changed);
mp_source_view->cellview_changed_event.add (this, &Navigator::content_changed_with_int);

View File

@ -26,6 +26,7 @@
#include "layMainWindow.h"
#include "layApplication.h"
#include "layUtils.h"
namespace lay
{
@ -65,7 +66,11 @@ public:
virtual lay::Plugin *create_plugin (db::Manager *, lay::Dispatcher *root, lay::LayoutViewBase *view) const
{
return new SearchReplaceDialog (root, view);
if (lay::has_gui ()) {
return new SearchReplaceDialog (root, view);
} else {
return 0;
}
}
};

View File

@ -360,49 +360,49 @@ get_config_names (lay::LayoutViewBase *view)
static void
send_key_press_event (lay::LayoutViewBase *view, unsigned int key, unsigned int buttons)
{
view->view_object_widget ()->send_key_press_event (key, buttons);
view->canvas ()->send_key_press_event (key, buttons);
}
static void
send_mouse_move_event (lay::LayoutViewBase *view, const db::DPoint &pt, unsigned int buttons)
{
view->view_object_widget ()->send_mouse_move_event (pt, buttons);
view->canvas ()->send_mouse_move_event (pt, buttons);
}
static void
send_leave_event (lay::LayoutViewBase *view)
{
view->view_object_widget ()->send_leave_event ();
view->canvas ()->send_leave_event ();
}
static void
send_enter_event (lay::LayoutViewBase *view)
{
view->view_object_widget ()->send_enter_event ();
view->canvas ()->send_enter_event ();
}
static void
send_mouse_press_event (lay::LayoutViewBase *view, const db::DPoint &pt, unsigned int buttons)
{
view->view_object_widget ()->send_mouse_press_event (pt, buttons);
view->canvas ()->send_mouse_press_event (pt, buttons);
}
static void
send_mouse_double_clicked_event (lay::LayoutViewBase *view, const db::DPoint &pt, unsigned int buttons)
{
view->view_object_widget ()->send_mouse_double_clicked_event (pt, buttons);
view->canvas ()->send_mouse_double_clicked_event (pt, buttons);
}
static void
send_mouse_release_event (lay::LayoutViewBase *view, const db::DPoint &pt, unsigned int buttons)
{
view->view_object_widget ()->send_mouse_release_event (pt, buttons);
view->canvas ()->send_mouse_release_event (pt, buttons);
}
static void
send_wheel_event (lay::LayoutViewBase *view, int delta, bool horizontal, const db::DPoint &pt, unsigned int buttons)
{
view->view_object_widget ()->send_wheel_event (delta, horizontal, pt, buttons);
view->canvas ()->send_wheel_event (delta, horizontal, pt, buttons);
}
namespace {

View File

@ -48,7 +48,7 @@ class PluginBase
{
public:
PluginBase ()
: lay::Plugin (sp_dispatcher), lay::ViewService (sp_view ? sp_view->view_object_widget () : 0)
: lay::Plugin (sp_dispatcher), lay::ViewService (sp_view ? sp_view->canvas () : 0)
{
if (! s_in_create_plugin) {
throw tl::Exception (tl::to_string (tr ("A PluginBase object can only be created in the PluginFactory's create_plugin method")));
@ -57,21 +57,21 @@ public:
void grab_mouse ()
{
if (widget ()) {
widget ()->grab_mouse (this, false);
if (ui ()) {
ui ()->grab_mouse (this, false);
}
}
void ungrab_mouse ()
{
if (widget ()) {
widget ()->ungrab_mouse (this);
if (ui ()) {
ui ()->ungrab_mouse (this);
}
}
void set_cursor (int c)
{
if (widget ()) {
if (ui ()) {
lay::ViewService::set_cursor ((enum lay::Cursor::cursor_shape) c);
}
}

View File

@ -57,7 +57,7 @@ class TrackingCursorBase
: public lay::ViewObject
{
public:
TrackingCursorBase (lay::EditorServiceBase *service, lay::ViewObjectWidget *widget)
TrackingCursorBase (lay::EditorServiceBase *service, lay::ViewObjectUI *widget)
: lay::ViewObject (widget, false), mp_service (service)
{ }
@ -91,7 +91,7 @@ class MouseCursorViewObject
: public TrackingCursorBase
{
public:
MouseCursorViewObject (lay::EditorServiceBase *service, lay::ViewObjectWidget *widget, const db::DPoint &pt, bool solid)
MouseCursorViewObject (lay::EditorServiceBase *service, lay::ViewObjectUI *widget, const db::DPoint &pt, bool solid)
: TrackingCursorBase (service, widget), m_pt (pt), m_solid (solid)
{ }
@ -139,7 +139,7 @@ class EdgeMarkerViewObject
: public TrackingCursorBase
{
public:
EdgeMarkerViewObject (lay::EditorServiceBase *service, lay::ViewObjectWidget *widget, const db::DEdge &edge, bool solid)
EdgeMarkerViewObject (lay::EditorServiceBase *service, lay::ViewObjectUI *widget, const db::DEdge &edge, bool solid)
: TrackingCursorBase (service, widget), m_edge (edge), m_solid (solid)
{ }
@ -207,7 +207,7 @@ private:
// --------------------------------------------------------------------------------------
EditorServiceBase::EditorServiceBase (LayoutViewBase *view)
: lay::ViewService (view->view_object_widget ()),
: lay::ViewService (view->canvas ()),
lay::Editable (view),
lay::Plugin (view),
m_cursor_enabled (true),
@ -226,13 +226,13 @@ EditorServiceBase::add_mouse_cursor (const db::DPoint &pt, bool emphasize)
{
m_has_tracking_position = true;
m_tracking_position = pt;
m_mouse_cursor_markers.push_back (new MouseCursorViewObject (this, widget (), pt, emphasize));
m_mouse_cursor_markers.push_back (new MouseCursorViewObject (this, ui (), pt, emphasize));
}
void
EditorServiceBase::add_edge_marker (const db::DEdge &e, bool emphasize)
{
m_mouse_cursor_markers.push_back (new EdgeMarkerViewObject (this, widget (), e, emphasize));
m_mouse_cursor_markers.push_back (new EdgeMarkerViewObject (this, ui (), e, emphasize));
}
void
@ -307,7 +307,7 @@ EditorServiceBase::show_error (tl::Exception &ex)
{
tl::error << ex.msg ();
#if defined(HAVE_QT)
QMessageBox::critical (widget (), tr ("Error"), tl::to_qstring (ex.msg ()));
QMessageBox::critical (ui ()->widget (), tr ("Error"), tl::to_qstring (ex.msg ()));
#endif
}

View File

@ -275,7 +275,7 @@ invert (unsigned char *data, unsigned int width, unsigned int height)
}
LayoutCanvas::LayoutCanvas (lay::LayoutViewBase *view)
: lay::ViewObjectWidget (),
: lay::ViewObjectUI (),
mp_view (view),
mp_image (0), mp_image_bg (0),
mp_image_fg (0),
@ -291,11 +291,25 @@ LayoutCanvas::LayoutCanvas (lay::LayoutViewBase *view)
m_do_end_of_drawing_dm (this, &LayoutCanvas::do_end_of_drawing),
m_image_cache_size (1)
{
lay::Color bg (0xffffffff), fg (0xff000000), active (0xffc0c0c0);
#if defined(HAVE_QT)
if (widget ()) {
#if QT_VERSION > 0x050000
m_dpr = devicePixelRatio ();
m_dpr = widget ()->devicePixelRatio ();
#endif
setObjectName (QString::fromUtf8 ("canvas"));
widget ()->setObjectName (QString::fromUtf8 ("canvas"));
widget ()->setBackgroundRole (QPalette::NoRole);
bg = lay::Color (widget ()->palette ().color (QPalette::Normal, QPalette::Window).rgb ());
fg = lay::Color (widget ()->palette ().color (QPalette::Normal, QPalette::Text).rgb ());
active = lay::Color (widget ()->palette ().color (QPalette::Normal, QPalette::Mid).rgb ());
widget ()->setAttribute (Qt::WA_NoSystemBackground);
}
#endif
// The gamma value used for subsampling: something between 1.8 and 2.2.
@ -307,15 +321,7 @@ LayoutCanvas::LayoutCanvas (lay::LayoutViewBase *view)
mp_redraw_thread = new lay::RedrawThread (this, view);
#if defined(HAVE_QT)
setBackgroundRole (QPalette::NoRole);
set_colors (lay::Color (palette ().color (QPalette::Normal, QPalette::Window).rgb ()),
lay::Color (palette ().color (QPalette::Normal, QPalette::Text).rgb ()),
lay::Color (palette ().color (QPalette::Normal, QPalette::Mid).rgb ()));
setAttribute (Qt::WA_NoSystemBackground);
#else
set_colors (0xffffffff, 0xff000000, 0xffc0c0c0);
#endif
set_colors (bg, fg, active);
}
LayoutCanvas::~LayoutCanvas ()
@ -560,7 +566,7 @@ LayoutCanvas::free_resources ()
#if defined(HAVE_QT)
void
LayoutCanvas::paintEvent (QPaintEvent *)
LayoutCanvas::paint_event ()
{
// this is the update image request
tl::SelfTimer timer_info (tl::verbosity () >= 41, tl::to_string (QObject::tr ("PaintEvent")));
@ -655,7 +661,7 @@ LayoutCanvas::paintEvent (QPaintEvent *)
do_render (m_viewport_l, *this, false);
// produce the pixmap first and then overdraw with dynamic content.
QPainter painter (this);
QPainter painter (widget ());
QImage img = mp_image_fg->to_image ();
#if QT_VERSION > 0x050000
img.setDevicePixelRatio (double (m_dpr));
@ -978,27 +984,8 @@ LayoutCanvas::screenshot ()
return img;
}
#if defined(HAVE_QT)
void
LayoutCanvas::resizeEvent (QResizeEvent *)
{
do_resize (width (), height ());
}
#endif
void
LayoutCanvas::resize (unsigned int width, unsigned int height)
{
// pass down to the basic view object canvas
lay::ViewObjectWidget::resize (width, height);
// don't wait until the layout system informs us - which may never take place when
// the widget isn't shown.
do_resize (width, height);
}
void
LayoutCanvas::do_resize (unsigned int width, unsigned int height)
LayoutCanvas::resize_event (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;
@ -1099,22 +1086,11 @@ LayoutCanvas::do_update_image ()
}
#if defined(HAVE_QT)
bool
LayoutCanvas::event (QEvent *e)
void
LayoutCanvas::gtf_probe ()
{
if (e->type () == QEvent::MaxUser) {
// GTF probe event
// record the contents (the screenshot) as ASCII text
if (gtf::Recorder::instance () && gtf::Recorder::instance ()->recording ()) {
gtf::Recorder::instance ()->probe (this, gtf::image_to_variant (screenshot ().to_image_copy ()));
}
e->accept ();
return true;
} else {
return QWidget::event (e);
if (gtf::Recorder::instance () && gtf::Recorder::instance ()->recording ()) {
gtf::Recorder::instance ()->probe (widget (), gtf::image_to_variant (screenshot ().to_image_copy ()));
}
}
#endif

View File

@ -134,15 +134,11 @@ private:
*/
class LAYBASIC_PUBLIC LayoutCanvas
: public lay::ViewObjectWidget,
: public lay::ViewObjectUI,
public lay::BitmapViewObjectCanvas,
public lay::BitmapRedrawThreadCanvas,
public lay::Drawings
{
#if defined(HAVE_QT)
Q_OBJECT
#endif
public:
LayoutCanvas (lay::LayoutViewBase *view);
~LayoutCanvas ();
@ -339,11 +335,6 @@ public:
return m_viewport;
}
/**
* @brief Resizes the canvas object in the Qt-less case
*/
void resize (unsigned int width, unsigned int height);
/**
* @brief Gets (and resets) a flag indicating that drawing has finished
*/
@ -399,13 +390,12 @@ private:
tl::Mutex m_mutex;
#if defined(HAVE_QT)
virtual void paintEvent (QPaintEvent *);
virtual void resizeEvent (QResizeEvent *);
virtual bool event (QEvent *e);
#endif
virtual void key_event (unsigned int key, unsigned int buttons);
virtual void resize_event (unsigned int width, unsigned int height);
#if defined(HAVE_QT)
virtual void gtf_probe ();
virtual void paint_event ();
#endif
// implementation of the lay::Drawings interface
void update_drawings ();
@ -416,7 +406,6 @@ 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

@ -1637,13 +1637,13 @@ public:
void absolute_coordinates (bool f);
/**
* @brief Get the view object widget (the canvas where the layout is drawn and view objects are placed)
* @brief Gets the canvas object (where the layout is drawn and view objects are placed)
*
* This method intentionally delivers the ViewObjectWidget, not the
* LayoutCanvas to emphasize that the LayoutCanvas object shall not
* be modified.
*/
lay::ViewObjectWidget *view_object_widget ()
lay::LayoutCanvas *canvas ()
{
return mp_canvas;
}
@ -2825,11 +2825,6 @@ protected:
virtual LayoutView *get_ui ();
lay::LayoutCanvas *canvas ()
{
return mp_canvas;
}
bool configure (const std::string &name, const std::string &value);
void config_finalize ();

View File

@ -189,7 +189,7 @@ void render_cell_inst (const db::Layout &layout, const db::CellInstArray &inst,
// ------------------------------------------------------------------------
MarkerBase::MarkerBase (lay::LayoutViewBase *view)
: lay::ViewObject (view->view_object_widget ()),
: lay::ViewObject (view->canvas ()),
m_line_width (-1), m_vertex_size (-1), m_halo (-1), m_text_enabled (true), m_vertex_shape (lay::ViewOp::Rect), m_line_style (-1), m_dither_pattern (-1), m_frame_pattern (0), mp_view (view)
{
// .. nothing yet ..

View File

@ -29,9 +29,9 @@ namespace lay
{
MouseTracker::MouseTracker (lay::LayoutViewBase *view)
: lay::ViewService (view->view_object_widget ()), mp_view (view)
: lay::ViewService (view->canvas ()), mp_view (view)
{
widget ()->grab_mouse (this, false);
ui ()->grab_mouse (this, false);
}
bool
@ -42,7 +42,7 @@ MouseTracker::mouse_move_event (const db::DPoint &p, unsigned int /*buttons*/, b
// NOTE: because the tracker grabs first and grabbers are registered first gets served last, the
// tracker will receive the event after all other mouse grabbers have been served and had their
// chance to set the tracking position.
lay::ViewService *vs = mp_view->view_object_widget ()->active_service ();
lay::ViewService *vs = mp_view->canvas ()->active_service ();
db::DPoint tp = p;
if (vs && vs->enabled () && vs->has_tracking_position ()) {
tp = vs->tracking_position ();

View File

@ -35,7 +35,7 @@ namespace lay
// MoveService implementation
MoveService::MoveService (lay::LayoutViewBase *view)
: lay::ViewService (view->view_object_widget ()),
: lay::ViewService (view->canvas ()),
m_dragging (false),
m_dragging_transient (false),
mp_editables (view),
@ -102,7 +102,7 @@ MoveService::key_event (unsigned int key, unsigned int /*buttons*/)
if (! m_dragging && fabs (dx + dy) > 0.0 && mp_editables->has_selection ()) {
// determine a shift distance which is 2, 5 or 10 times the grid and is more than 5 pixels
double dmin = double (5 /*pixels min shift*/) / widget ()->mouse_event_trans ().mag ();
double dmin = double (5 /*pixels min shift*/) / ui ()->mouse_event_trans ().mag ();
double d = m_global_grid;
while (d < dmin) {
d *= 2.0;
@ -302,7 +302,7 @@ MoveService::handle_click (const db::DPoint &p, unsigned int buttons, bool drag_
m_dragging = true;
m_dragging_transient = drag_transient;
widget ()->grab_mouse (this, false);
ui ()->grab_mouse (this, false);
m_shift = db::DPoint ();
@ -314,7 +314,7 @@ MoveService::handle_click (const db::DPoint &p, unsigned int buttons, bool drag_
m_dragging = false;
widget ()->ungrab_mouse (this);
ui ()->ungrab_mouse (this);
mp_editables->end_move (p, ac_from_buttons (buttons), mp_transaction.release ());
if (m_dragging_transient) {
@ -334,7 +334,7 @@ MoveService::drag_cancel ()
if (m_dragging) {
mp_editables->edit_cancel ();
widget ()->ungrab_mouse (this);
ui ()->ungrab_mouse (this);
m_dragging = false;

View File

@ -32,7 +32,7 @@ namespace lay
// -------------------------------------------------------------
// RubberBox implementation
RubberBox::RubberBox (lay::ViewObjectWidget *widget, unsigned int color, const db::DPoint &p1, const db::DPoint &p2)
RubberBox::RubberBox (lay::ViewObjectUI *widget, unsigned int color, const db::DPoint &p1, const db::DPoint &p2)
: lay::ViewObject (widget, false /*not static*/),
m_p1 (p1), m_p2 (p2), m_color (color), m_stipple (0)
{ }

View File

@ -34,7 +34,7 @@ class LAYBASIC_PUBLIC RubberBox
: public lay::ViewObject
{
public:
RubberBox (lay::ViewObjectWidget *canvas, unsigned int color, const db::DPoint &p1, const db::DPoint &p2);
RubberBox (lay::ViewObjectUI *canvas, unsigned int color, const db::DPoint &p1, const db::DPoint &p2);
void set_color (unsigned int color);
void set_stipple (unsigned int s);

View File

@ -43,7 +43,7 @@ SelectionService::SelectionService (lay::LayoutViewBase *view) :
#if defined(HAVE_QT)
QObject (),
#endif
lay::ViewService (view->view_object_widget ()),
lay::ViewService (view->canvas ()),
mp_view (view),
mp_box (0),
m_color (0),
@ -114,7 +114,7 @@ SelectionService::reset_box ()
{
if (mp_box) {
widget ()->ungrab_mouse (this);
ui ()->ungrab_mouse (this);
delete mp_box;
mp_box = 0;
@ -223,7 +223,7 @@ SelectionService::mouse_click_event (const db::DPoint &p, unsigned int buttons,
reset_box ();
}
if (prio && mp_view && widget ()->mouse_event_viewport ().contains (p) && (buttons & lay::LeftButton) != 0) {
if (prio && mp_view && ui ()->mouse_event_viewport ().contains (p) && (buttons & lay::LeftButton) != 0) {
lay::Editable::SelectionMode mode = lay::Editable::Replace;
bool shift = ((buttons & lay::ShiftButton) != 0);
@ -314,10 +314,10 @@ SelectionService::begin (const db::DPoint &pos)
m_p1 = pos;
m_p2 = pos;
mp_box = new lay::RubberBox (widget (), m_color, pos, pos);
mp_box = new lay::RubberBox (ui (), m_color, pos, pos);
mp_box->set_stipple (6); // coarse hatched
widget ()->grab_mouse (this, true);
ui ()->grab_mouse (this, true);
}
}

View File

@ -0,0 +1,45 @@
/*
KLayout Layout Viewer
Copyright (C) 2006-2022 Matthias Koefferlein
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include "layUtils.h"
#if defined(HAVE_QT)
# include <QApplication>
#endif
namespace lay {
bool
has_gui ()
{
#if defined(HAVE_QT)
#if QT_VERSION < 0x50000
return (QApplication::type () != Qt::Tty);
#else
return (dynamic_cast<QGuiApplication *> (QCoreApplication::instance ()) != 0);
#endif
#else
return false;
#endif
}
}

View File

@ -0,0 +1,38 @@
/*
KLayout Layout Viewer
Copyright (C) 2006-2022 Matthias Koefferlein
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#ifndef HDR_layUtils
#define HDR_layUtils
#include "laybasicCommon.h"
namespace lay {
/**
* @brief Returns true, if GUI is enabled
*/
LAYBASIC_PUBLIC bool has_gui ();
}
#endif

View File

@ -25,7 +25,8 @@
# include <QWheelEvent>
# include <QKeyEvent>
# include <QMimeData>
# include <QCoreApplication>
# include <QApplication>
# include <QWidget>
#endif
#include "layViewObject.h"
@ -34,6 +35,7 @@
#if defined(HAVE_QT)
# include "layDragDropData.h"
#endif
#include "layUtils.h"
#include "tlException.h"
#include "tlAlgorithm.h"
#include "tlExceptions.h"
@ -72,7 +74,7 @@ qt_to_buttons (Qt::MouseButtons b, Qt::KeyboardModifiers m)
// ---------------------------------------------------------------
// BackgroundViewObject implementation
BackgroundViewObject::BackgroundViewObject (ViewObjectWidget *widget)
BackgroundViewObject::BackgroundViewObject (ViewObjectUI *widget)
: mp_widget (widget), m_visible (true), m_z_order (0)
{
if (widget) {
@ -115,7 +117,7 @@ BackgroundViewObject::z_order (int z)
// ---------------------------------------------------------------
// ViewObject implementation
ViewObject::ViewObject (ViewObjectWidget *widget, bool _static)
ViewObject::ViewObject (ViewObjectUI *widget, bool _static)
: mp_widget (widget), m_static (_static), m_visible (true), m_dismissable (false)
{
if (widget) {
@ -178,7 +180,7 @@ ViewObject::freeze ()
// ---------------------------------------------------------------
// ViewService implementation
ViewService::ViewService (ViewObjectWidget *widget)
ViewService::ViewService (ViewObjectUI *widget)
: mp_widget (widget), m_abs_grab (false), m_enabled (true)
{
if (widget) {
@ -206,14 +208,287 @@ ViewService::set_cursor (lay::Cursor::cursor_shape cursor)
mp_widget->set_cursor (cursor);
}
// ---------------------------------------------------------------
// ViewObjectQWidget implementation
#if defined(HAVE_QT)
class ViewObjectQWidget : public QWidget
{
public:
ViewObjectQWidget (ViewObjectUI *view)
: QWidget (), mp_view (view)
{
// .. nothing yet ..
}
void resizeEvent (QResizeEvent *)
{
mp_view->resize_event (width (), height ());
}
bool focusNextPrevChild (bool /*next*/)
{
return false;
}
void keyPressEvent (QKeyEvent *e)
{
BEGIN_PROTECTED
unsigned int buttons = qt_to_buttons (Qt::MouseButtons (), e->modifiers ());
mp_view->send_key_press_event ((unsigned int) e->key (), buttons);
END_PROTECTED
}
DragDropDataBase *get_drag_drop_data (const QMimeData *data)
{
if (! data || ! data->hasFormat (QString::fromUtf8 (drag_drop_mime_type ()))) {
return 0;
}
QByteArray ba = data->data (QString::fromUtf8 (drag_drop_mime_type ()));
// TODO: provide some global mechanism to register drag & drop classes
std::unique_ptr<DragDropDataBase> cd (new CellDragDropData ());
if (cd->deserialize (ba)) {
return cd.release ();
}
// TODO: more ...
return 0;
}
void dragEnterEvent (QDragEnterEvent *event)
{
BEGIN_PROTECTED
const DragDropDataBase *dd = get_drag_drop_data (event->mimeData ());
if (dd) {
db::DPoint p = mp_view->pixel_to_um (db::Point (event->pos ().x (), event->pos ().y ()));
bool done = mp_view->drag_enter_event (p, dd);
ViewObjectUI::service_iterator svc = mp_view->begin_services ();
while (svc != mp_view->end_services () && !done) {
ViewObjectUI::service_iterator next = svc;
++next;
done = (*svc)->drag_enter_event (p, dd);
svc = next;
}
if (done) {
event->acceptProposedAction ();
}
}
END_PROTECTED
}
void dragLeaveEvent (QDragLeaveEvent * /*event*/)
{
BEGIN_PROTECTED
mp_view->drag_leave_event ();
ViewObjectUI::service_iterator svc = mp_view->begin_services ();
while (svc != mp_view->end_services ()) {
ViewObjectUI::service_iterator next = svc;
++next;
(*svc)->drag_leave_event ();
svc = next;
}
END_PROTECTED
}
void dragMoveEvent (QDragMoveEvent *event)
{
BEGIN_PROTECTED
const DragDropDataBase *dd = get_drag_drop_data (event->mimeData ());
if (dd) {
db::DPoint p = mp_view->pixel_to_um (db::Point (event->pos ().x (), event->pos ().y ()));
bool done = mp_view->drag_move_event (p, dd);
ViewObjectUI::service_iterator svc = mp_view->begin_services ();
while (svc != mp_view->end_services () && !done) {
ViewObjectUI::service_iterator next = svc;
++next;
done = (*svc)->drag_move_event (p, dd);
svc = next;
}
}
END_PROTECTED
}
void dropEvent (QDropEvent *event)
{
BEGIN_PROTECTED
const DragDropDataBase *dd = get_drag_drop_data (event->mimeData ());
if (dd) {
db::DPoint p = mp_view->pixel_to_um (db::Point (event->pos ().x (), event->pos ().y ()));
bool done = mp_view->drop_event (p, dd);
ViewObjectUI::service_iterator svc = mp_view->begin_services ();
while (svc != mp_view->end_services () && !done) {
ViewObjectUI::service_iterator next = svc;
++next;
done = (*svc)->drop_event (p, dd);
svc = next;
}
}
END_PROTECTED
}
void mouseMoveEvent (QMouseEvent *e)
{
BEGIN_PROTECTED
db::DPoint p;
#if QT_VERSION < 0x60000
p = db::DPoint (e->pos ().x (), e->pos ().y ());
#else
p = db::DPoint (e->position ().x (), e->position ().y ());
#endif
mp_view->send_mouse_move_event (p, qt_to_buttons (e->buttons (), e->modifiers ()));
END_PROTECTED
}
void mouseDoubleClickEvent (QMouseEvent *e)
{
BEGIN_PROTECTED
db::DPoint p;
#if QT_VERSION < 0x60000
p = db::DPoint (e->pos ().x (), e->pos ().y ());
#else
p = db::DPoint (e->position ().x (), e->position ().y ());
#endif
mp_view->send_mouse_double_clicked_event (p, qt_to_buttons (e->buttons (), e->modifiers ()));
END_PROTECTED
}
void
#if QT_VERSION >= 0x60000
enterEvent (QEnterEvent * /*event*/)
#else
enterEvent (QEvent * /*event*/)
#endif
{
BEGIN_PROTECTED
mp_view->send_enter_event ();
END_PROTECTED
}
void leaveEvent (QEvent * /*event*/)
{
BEGIN_PROTECTED
mp_view->send_leave_event ();
END_PROTECTED
}
void wheelEvent (QWheelEvent *e)
{
BEGIN_PROTECTED
db::DPoint p;
#if QT_VERSION < 0x60000
int delta = e->delta ();
p = db::DPoint (e->pos ().x (), e->pos ().y ());
bool horizontal = (e->orientation () == Qt::Horizontal);
#else
int delta = e->angleDelta ().y ();
p = db::DPoint (e->position ().x (), e->position ().y ());
bool horizontal = false;
#endif
e->ignore ();
mp_view->send_wheel_event (delta, horizontal, p, qt_to_buttons (e->buttons (), e->modifiers ()));
END_PROTECTED
}
void mousePressEvent (QMouseEvent *e)
{
BEGIN_PROTECTED
db::DPoint p;
#if QT_VERSION < 0x60000
p = db::DPoint (e->pos ().x (), e->pos ().y ());
#else
p = db::DPoint (e->position ().x (), e->position ().y ());
#endif
mp_view->send_mouse_press_event (p, qt_to_buttons (e->buttons (), e->modifiers ()));
END_PROTECTED
}
void mouseReleaseEvent (QMouseEvent *e)
{
BEGIN_PROTECTED
db::DPoint p;
#if QT_VERSION < 0x60000
p = db::DPoint (e->pos ().x (), e->pos ().y ());
#else
p = db::DPoint (e->position ().x (), e->position ().y ());
#endif
mp_view->send_mouse_release_event (p, qt_to_buttons (e->buttons (), e->modifiers ()));
END_PROTECTED
}
void paintEvent (QPaintEvent *)
{
BEGIN_PROTECTED
mp_view->paint_event ();
END_PROTECTED
}
#if defined(HAVE_QT)
bool event (QEvent *e)
{
if (e->type () == QEvent::MaxUser) {
// GTF probe event
// record the contents (the screenshot) as ASCII text
mp_view->gtf_probe ();
e->accept ();
return true;
} else {
return QWidget::event (e);
}
}
#endif
private:
ViewObjectUI *mp_view;
};
#endif
// ---------------------------------------------------------------
// ViewObjectWidget implementation
ViewObjectWidget::ViewObjectWidget ()
#if defined(HAVE_QT)
: QWidget (),
#endif
m_view_objects_dismissed (false),
ViewObjectUI::ViewObjectUI ()
: m_view_objects_dismissed (false),
m_needs_update_static (false),
m_needs_update_bg (false),
mp_active_service (0),
@ -228,14 +503,19 @@ ViewObjectWidget::ViewObjectWidget ()
m_image_updated (false)
{
#if defined(HAVE_QT)
setMouseTracking (true);
setAcceptDrops (true);
if (lay::has_gui ()) {
mp_widget = new ViewObjectQWidget (this);
mp_widget->setMouseTracking (true);
mp_widget->setAcceptDrops (true);
} else {
mp_widget = 0;
}
#endif
m_objects.changed ().add (this, &ViewObjectWidget::objects_changed);
m_objects.changed ().add (this, &ViewObjectUI::objects_changed);
}
ViewObjectWidget::~ViewObjectWidget ()
ViewObjectUI::~ViewObjectUI ()
{
// release any mouse grabs now
while (m_grabbed.begin () != m_grabbed.end ()) {
@ -248,13 +528,13 @@ ViewObjectWidget::~ViewObjectWidget ()
}
void
ViewObjectWidget::register_service (lay::ViewService *svc)
ViewObjectUI::register_service (lay::ViewService *svc)
{
m_services.push_back (svc);
}
void
ViewObjectWidget::unregister_service (lay::ViewService *svc)
ViewObjectUI::unregister_service (lay::ViewService *svc)
{
if (mp_active_service == svc) {
mp_active_service = 0;
@ -272,7 +552,7 @@ ViewObjectWidget::unregister_service (lay::ViewService *svc)
}
void
ViewObjectWidget::activate (lay::ViewService *service)
ViewObjectUI::activate (lay::ViewService *service)
{
if (mp_active_service != service) {
if (mp_active_service) {
@ -296,22 +576,22 @@ END_PROTECTED
}
void
ViewObjectWidget::set_cursor (lay::Cursor::cursor_shape cursor)
ViewObjectUI::set_cursor (lay::Cursor::cursor_shape cursor)
{
m_cursor = cursor;
}
void
ViewObjectWidget::set_default_cursor (lay::Cursor::cursor_shape cursor)
ViewObjectUI::set_default_cursor (lay::Cursor::cursor_shape cursor)
{
if (cursor != m_default_cursor) {
m_default_cursor = cursor;
#if defined(HAVE_QT)
if (m_cursor == lay::Cursor::none) {
if (m_cursor == lay::Cursor::none && mp_widget) {
if (m_default_cursor == lay::Cursor::none) {
unsetCursor ();
mp_widget->unsetCursor ();
} else {
setCursor (lay::Cursor::qcursor (m_default_cursor));
mp_widget->setCursor (lay::Cursor::qcursor (m_default_cursor));
}
}
#endif
@ -319,7 +599,7 @@ ViewObjectWidget::set_default_cursor (lay::Cursor::cursor_shape cursor)
}
void
ViewObjectWidget::ensure_entered ()
ViewObjectUI::ensure_entered ()
{
if (! m_mouse_inside) {
send_enter_event ();
@ -327,29 +607,31 @@ ViewObjectWidget::ensure_entered ()
}
void
ViewObjectWidget::begin_mouse_event (lay::Cursor::cursor_shape cursor)
ViewObjectUI::begin_mouse_event (lay::Cursor::cursor_shape cursor)
{
m_cursor = cursor;
}
void
ViewObjectWidget::end_mouse_event ()
ViewObjectUI::end_mouse_event ()
{
#if defined(HAVE_QT)
if (m_cursor == lay::Cursor::none) {
if (m_default_cursor == lay::Cursor::none) {
unsetCursor ();
} else {
setCursor (lay::Cursor::qcursor (m_default_cursor));
if (mp_widget) {
if (m_cursor == lay::Cursor::none) {
if (m_default_cursor == lay::Cursor::none) {
mp_widget->unsetCursor ();
} else {
mp_widget->setCursor (lay::Cursor::qcursor (m_default_cursor));
}
} else if (m_cursor != lay::Cursor::keep) {
mp_widget->setCursor (lay::Cursor::qcursor (m_cursor));
}
} else if (m_cursor != lay::Cursor::keep) {
setCursor (lay::Cursor::qcursor (m_cursor));
}
#endif
}
void
ViewObjectWidget::send_key_press_event (unsigned int key, unsigned int buttons)
ViewObjectUI::send_key_press_event (unsigned int key, unsigned int buttons)
{
bool done = false;
if (mp_active_service) {
@ -362,7 +644,7 @@ ViewObjectWidget::send_key_press_event (unsigned int key, unsigned int buttons)
}
void
ViewObjectWidget::do_mouse_move ()
ViewObjectUI::do_mouse_move ()
{
m_in_mouse_move = true;
@ -443,7 +725,7 @@ ViewObjectWidget::do_mouse_move ()
}
void
ViewObjectWidget::send_mouse_move_event (const db::DPoint &pt, unsigned int buttons)
ViewObjectUI::send_mouse_move_event (const db::DPoint &pt, unsigned int buttons)
{
ensure_entered ();
m_mouse_pos = pt;
@ -452,7 +734,7 @@ ViewObjectWidget::send_mouse_move_event (const db::DPoint &pt, unsigned int butt
}
void
ViewObjectWidget::send_leave_event ()
ViewObjectUI::send_leave_event ()
{
try {
@ -492,7 +774,7 @@ ViewObjectWidget::send_leave_event ()
}
void
ViewObjectWidget::send_enter_event ()
ViewObjectUI::send_enter_event ()
{
m_mouse_inside = true;
@ -527,11 +809,13 @@ ViewObjectWidget::send_enter_event ()
}
void
ViewObjectWidget::send_mouse_press_event (const db::DPoint &pt, unsigned int buttons)
ViewObjectUI::send_mouse_press_event (const db::DPoint &pt, unsigned int buttons)
{
ensure_entered ();
#if defined(HAVE_QT)
setFocus ();
if (mp_widget) {
mp_widget->setFocus ();
}
#endif
m_mouse_pos = pt;
@ -543,13 +827,15 @@ ViewObjectWidget::send_mouse_press_event (const db::DPoint &pt, unsigned int but
}
void
ViewObjectWidget::send_mouse_double_clicked_event (const db::DPoint &pt, unsigned int buttons)
ViewObjectUI::send_mouse_double_clicked_event (const db::DPoint &pt, unsigned int buttons)
{
ensure_entered ();
begin_mouse_event (lay::Cursor::none);
#if defined(HAVE_QT)
setFocus ();
if (mp_widget) {
mp_widget->setFocus ();
}
#endif
bool done = false;
@ -587,7 +873,7 @@ ViewObjectWidget::send_mouse_double_clicked_event (const db::DPoint &pt, unsigne
}
void
ViewObjectWidget::send_mouse_release_event (const db::DPoint &pt, unsigned int /*buttons*/)
ViewObjectUI::send_mouse_release_event (const db::DPoint &pt, unsigned int /*buttons*/)
{
try {
@ -651,7 +937,7 @@ ViewObjectWidget::send_mouse_release_event (const db::DPoint &pt, unsigned int /
}
void
ViewObjectWidget::send_wheel_event (int delta, bool horizontal, const db::DPoint &pt, unsigned int buttons)
ViewObjectUI::send_wheel_event (int delta, bool horizontal, const db::DPoint &pt, unsigned int buttons)
{
ensure_entered ();
begin_mouse_event ();
@ -687,291 +973,57 @@ ViewObjectWidget::send_wheel_event (int delta, bool horizontal, const db::DPoint
}
#if defined(HAVE_QT)
bool
ViewObjectWidget::focusNextPrevChild (bool /*next*/)
{
return false;
}
void
ViewObjectWidget::keyPressEvent (QKeyEvent *e)
{
BEGIN_PROTECTED
unsigned int buttons = qt_to_buttons (Qt::MouseButtons (), e->modifiers ());
send_key_press_event ((unsigned int) e->key (), buttons);
END_PROTECTED
}
DragDropDataBase *get_drag_drop_data (const QMimeData *data)
{
if (! data || ! data->hasFormat (QString::fromUtf8 (drag_drop_mime_type ()))) {
return 0;
}
QByteArray ba = data->data (QString::fromUtf8 (drag_drop_mime_type ()));
// TODO: provide some global mechanism to register drag & drop classes
std::unique_ptr<DragDropDataBase> cd (new CellDragDropData ());
if (cd->deserialize (ba)) {
return cd.release ();
}
// TODO: more ...
return 0;
}
void
ViewObjectWidget::dragEnterEvent (QDragEnterEvent *event)
{
BEGIN_PROTECTED
const DragDropDataBase *dd = get_drag_drop_data (event->mimeData ());
if (dd) {
db::DPoint p = pixel_to_um (db::Point (event->pos ().x (), event->pos ().y ()));
bool done = drag_enter_event (p, dd);
service_iterator svc = begin_services ();
while (svc != end_services () && !done) {
service_iterator next = svc;
++next;
done = (*svc)->drag_enter_event (p, dd);
svc = next;
}
if (done) {
event->acceptProposedAction ();
}
}
END_PROTECTED
}
void
ViewObjectWidget::dragLeaveEvent (QDragLeaveEvent * /*event*/)
{
BEGIN_PROTECTED
drag_leave_event ();
service_iterator svc = begin_services ();
while (svc != end_services ()) {
service_iterator next = svc;
++next;
(*svc)->drag_leave_event ();
svc = next;
}
END_PROTECTED
}
void
ViewObjectWidget::dragMoveEvent (QDragMoveEvent *event)
{
BEGIN_PROTECTED
const DragDropDataBase *dd = get_drag_drop_data (event->mimeData ());
if (dd) {
db::DPoint p = pixel_to_um (db::Point (event->pos ().x (), event->pos ().y ()));
bool done = drag_move_event (p, dd);
service_iterator svc = begin_services ();
while (svc != end_services () && !done) {
service_iterator next = svc;
++next;
done = (*svc)->drag_move_event (p, dd);
svc = next;
}
}
END_PROTECTED
}
void
ViewObjectWidget::dropEvent (QDropEvent *event)
{
BEGIN_PROTECTED
const DragDropDataBase *dd = get_drag_drop_data (event->mimeData ());
if (dd) {
db::DPoint p = pixel_to_um (db::Point (event->pos ().x (), event->pos ().y ()));
bool done = drop_event (p, dd);
service_iterator svc = begin_services ();
while (svc != end_services () && !done) {
service_iterator next = svc;
++next;
done = (*svc)->drop_event (p, dd);
svc = next;
}
}
END_PROTECTED
}
void
ViewObjectWidget::mouseMoveEvent (QMouseEvent *e)
{
BEGIN_PROTECTED
db::DPoint p;
#if QT_VERSION < 0x60000
p = db::DPoint (e->pos ().x (), e->pos ().y ());
#else
p = db::DPoint (e->position ().x (), e->position ().y ());
#endif
send_mouse_move_event (p, qt_to_buttons (e->buttons (), e->modifiers ()));
END_PROTECTED
}
void
ViewObjectWidget::mouseDoubleClickEvent (QMouseEvent *e)
{
BEGIN_PROTECTED
db::DPoint p;
#if QT_VERSION < 0x60000
p = db::DPoint (e->pos ().x (), e->pos ().y ());
#else
p = db::DPoint (e->position ().x (), e->position ().y ());
#endif
send_mouse_double_clicked_event (p, qt_to_buttons (e->buttons (), e->modifiers ()));
END_PROTECTED
}
void
#if QT_VERSION >= 0x60000
ViewObjectWidget::enterEvent (QEnterEvent * /*event*/)
#else
ViewObjectWidget::enterEvent (QEvent * /*event*/)
#endif
{
BEGIN_PROTECTED
send_enter_event ();
END_PROTECTED
}
void
ViewObjectWidget::leaveEvent (QEvent * /*event*/)
{
BEGIN_PROTECTED
send_leave_event ();
END_PROTECTED
}
void
ViewObjectWidget::wheelEvent (QWheelEvent *e)
{
BEGIN_PROTECTED
db::DPoint p;
#if QT_VERSION < 0x60000
int delta = e->delta ();
p = db::DPoint (e->pos ().x (), e->pos ().y ());
bool horizontal = (e->orientation () == Qt::Horizontal);
#else
int delta = e->angleDelta ().y ();
p = db::DPoint (e->position ().x (), e->position ().y ());
bool horizontal = false;
#endif
e->ignore ();
send_wheel_event (delta, horizontal, p, qt_to_buttons (e->buttons (), e->modifiers ()));
END_PROTECTED
}
void
ViewObjectWidget::mousePressEvent (QMouseEvent *e)
{
BEGIN_PROTECTED
db::DPoint p;
#if QT_VERSION < 0x60000
p = db::DPoint (e->pos ().x (), e->pos ().y ());
#else
p = db::DPoint (e->position ().x (), e->position ().y ());
#endif
send_mouse_press_event (p, qt_to_buttons (e->buttons (), e->modifiers ()));
END_PROTECTED
}
void
ViewObjectWidget::mouseReleaseEvent (QMouseEvent *e)
{
BEGIN_PROTECTED
db::DPoint p;
#if QT_VERSION < 0x60000
p = db::DPoint (e->pos ().x (), e->pos ().y ());
#else
p = db::DPoint (e->position ().x (), e->position ().y ());
#endif
send_mouse_release_event (p, qt_to_buttons (e->buttons (), e->modifiers ()));
END_PROTECTED
}
#endif
void
ViewObjectWidget::resize (unsigned int w, unsigned int h)
ViewObjectUI::resize (unsigned int w, unsigned int h)
{
m_widget_width = w;
m_widget_height = h;
#if defined(HAVE_QT)
QWidget::resize (w, h);
if (mp_widget) {
mp_widget->resize (w, h);
}
// don't wait until the layout system informs us - which may never take place when
// the widget isn't shown.
resize_event (w, h);
#endif
}
int
ViewObjectWidget::widget_height () const
ViewObjectUI::widget_height () const
{
#if defined(HAVE_QT)
return height ();
return mp_widget ? mp_widget->height () : m_widget_height;
#else
return m_widget_height;
#endif
}
int
ViewObjectWidget::widget_width () const
ViewObjectUI::widget_width () const
{
#if defined(HAVE_QT)
return width ();
return mp_widget ? mp_widget->width () : m_widget_width;
#else
return m_widget_width;
#endif
}
db::DPoint
ViewObjectWidget::pixel_to_um (const db::Point &pt) const
ViewObjectUI::pixel_to_um (const db::Point &pt) const
{
return m_trans.inverted () * db::DPoint (pt.x (), widget_height () - 1 - pt.y ());
}
db::DPoint
ViewObjectWidget::pixel_to_um (const db::DPoint &pt) const
ViewObjectUI::pixel_to_um (const db::DPoint &pt) const
{
return m_trans.inverted () * db::DPoint (pt.x (), widget_height () - 1 - pt.y ());
}
void
ViewObjectWidget::mouse_event_trans (const db::DCplxTrans &trans)
ViewObjectUI::mouse_event_trans (const db::DCplxTrans &trans)
{
if (trans != m_trans) {
m_trans = trans;
@ -984,7 +1036,7 @@ ViewObjectWidget::mouse_event_trans (const db::DCplxTrans &trans)
}
void
ViewObjectWidget::drag_cancel ()
ViewObjectUI::drag_cancel ()
{
for (service_iterator svc = begin_services (); svc != end_services (); ++svc) {
(*svc)->drag_cancel ();
@ -1005,7 +1057,7 @@ namespace
}
void
ViewObjectWidget::do_render_bg (const lay::Viewport &vp, lay::ViewObjectCanvas &canvas)
ViewObjectUI::do_render_bg (const lay::Viewport &vp, lay::ViewObjectCanvas &canvas)
{
m_needs_update_bg = false;
@ -1028,7 +1080,7 @@ ViewObjectWidget::do_render_bg (const lay::Viewport &vp, lay::ViewObjectCanvas &
}
void
ViewObjectWidget::do_render (const lay::Viewport &vp, lay::ViewObjectCanvas &canvas, bool st)
ViewObjectUI::do_render (const lay::Viewport &vp, lay::ViewObjectCanvas &canvas, bool st)
{
if (st) {
m_needs_update_static = false;
@ -1046,7 +1098,7 @@ ViewObjectWidget::do_render (const lay::Viewport &vp, lay::ViewObjectCanvas &can
}
void
ViewObjectWidget::grab_mouse (ViewService *obj, bool a)
ViewObjectUI::grab_mouse (ViewService *obj, bool a)
{
obj->m_abs_grab = a; // not used currently
@ -1061,7 +1113,7 @@ ViewObjectWidget::grab_mouse (ViewService *obj, bool a)
}
void
ViewObjectWidget::ungrab_mouse (ViewService *obj)
ViewObjectUI::ungrab_mouse (ViewService *obj)
{
std::list<ViewService *>::iterator g;
for (g = m_grabbed.begin (); g != m_grabbed.end () && *g != obj; ++g) {
@ -1073,7 +1125,7 @@ ViewObjectWidget::ungrab_mouse (ViewService *obj)
}
void
ViewObjectWidget::freeze (ViewObject *obj)
ViewObjectUI::freeze (ViewObject *obj)
{
if (! obj->m_static) {
obj->m_static = true;
@ -1083,7 +1135,7 @@ ViewObjectWidget::freeze (ViewObject *obj)
}
void
ViewObjectWidget::thaw (ViewObject *obj)
ViewObjectUI::thaw (ViewObject *obj)
{
if (obj->m_static) {
obj->m_static = false;
@ -1107,10 +1159,36 @@ ViewObjectWidget::image_updated ()
m_image_updated = false;
return f;
}
#else
void
ViewObjectUI::update ()
{
if (mp_widget) {
mp_widget->update ();
}
}
#endif
void
ViewObjectWidget::touch ()
ViewObjectUI::resize_event (unsigned int /*w*/, unsigned int /*h*/)
{
// .. nothing yet ..
}
void
ViewObjectUI::paint_event ()
{
// .. nothing yet ..
}
void
ViewObjectUI::gtf_probe ()
{
// .. nothing yet ..
}
void
ViewObjectUI::touch ()
{
if (! m_needs_update_static) {
m_needs_update_static = true;
@ -1119,7 +1197,7 @@ ViewObjectWidget::touch ()
}
void
ViewObjectWidget::touch_bg ()
ViewObjectUI::touch_bg ()
{
if (! m_needs_update_bg) {
m_needs_update_bg = true;
@ -1128,7 +1206,7 @@ ViewObjectWidget::touch_bg ()
}
void
ViewObjectWidget::set_dismiss_view_objects (bool dismiss)
ViewObjectUI::set_dismiss_view_objects (bool dismiss)
{
if (dismiss != m_view_objects_dismissed) {
m_view_objects_dismissed = dismiss;
@ -1138,14 +1216,14 @@ ViewObjectWidget::set_dismiss_view_objects (bool dismiss)
}
void
ViewObjectWidget::objects_changed ()
ViewObjectUI::objects_changed ()
{
touch ();
update ();
}
db::DBox
ViewObjectWidget::mouse_event_viewport () const
ViewObjectUI::mouse_event_viewport () const
{
db::DPoint p1 = m_trans.inverted () * db::DPoint (0, 0);
db::DPoint p2 = m_trans.inverted () * db::DPoint (widget_width (), widget_height ());

View File

@ -36,7 +36,6 @@
# include <QPoint>
# include <QByteArray>
# include <QColor>
# include <QWidget>
#endif
#include "tlObjectCollection.h"
@ -48,6 +47,7 @@
#include "layBitmapRenderer.h"
#if defined(HAVE_QT)
class QWidget;
class QMouseEvent;
class QImage;
class QDragEnterEvent;
@ -66,7 +66,7 @@ namespace db
namespace lay {
class Viewport;
class ViewObjectWidget;
class ViewObjectUI;
class ViewObjectCanvas;
class CanvasPlane;
class Bitmap;
@ -77,6 +77,8 @@ class BitmapBuffer;
class DragDropDataBase;
#endif
class ViewObjectQWidget;
/**
* @brief A view service
*
@ -96,7 +98,7 @@ public:
/**
* @brief Constructor
*/
ViewService (ViewObjectWidget *widget = 0);
ViewService (ViewObjectUI *widget = 0);
/**
* @brief Destructor
@ -238,7 +240,7 @@ public:
/**
* @brief Accessor to the widget pointer
*/
ViewObjectWidget *widget () const
ViewObjectUI *ui () const
{
return mp_widget;
}
@ -289,9 +291,9 @@ public:
}
private:
friend class ViewObjectWidget;
friend class ViewObjectUI;
ViewObjectWidget *mp_widget;
ViewObjectUI *mp_widget;
bool m_abs_grab;
bool m_enabled;
};
@ -315,7 +317,7 @@ public:
* @param widget The widget object that the object is shown on.
* @param _static True, if the object is in frozen mode initially
*/
BackgroundViewObject (ViewObjectWidget *widget = 0);
BackgroundViewObject (ViewObjectUI *widget = 0);
/**
* @brief The destructor
@ -333,9 +335,9 @@ public:
/**
* @brief Accessor to the widget object pointer
*/
ViewObjectWidget *widget () const
ViewObjectUI *widget () const
{
return const_cast<ViewObjectWidget *> (mp_widget.get());
return const_cast<ViewObjectUI *> (mp_widget.get());
}
/**
@ -381,12 +383,12 @@ public:
void z_order (int z);
private:
friend class ViewObjectWidget;
friend class ViewObjectUI;
BackgroundViewObject (const BackgroundViewObject &d);
BackgroundViewObject &operator= (const BackgroundViewObject &d);
tl::weak_ptr<ViewObjectWidget> mp_widget;
tl::weak_ptr<ViewObjectUI> mp_widget;
bool m_visible;
int m_z_order;
};
@ -415,7 +417,7 @@ public:
* @param widget The widget object that the object is shown on.
* @param _static True, if the object is in frozen mode initially
*/
ViewObject (ViewObjectWidget *widget = 0, bool _static = true);
ViewObject (ViewObjectUI *widget = 0, bool _static = true);
/**
* @brief The destructor
@ -434,9 +436,9 @@ public:
/**
* @brief Accessor to the widget object pointer
*/
ViewObjectWidget *widget () const
ViewObjectUI *widget () const
{
return const_cast<ViewObjectWidget *> (mp_widget.get());
return const_cast<ViewObjectUI *> (mp_widget.get());
}
/**
@ -496,12 +498,12 @@ public:
void freeze ();
private:
friend class ViewObjectWidget;
friend class ViewObjectUI;
ViewObject (const ViewObject &d);
ViewObject &operator= (const ViewObject &d);
tl::weak_ptr<ViewObjectWidget> mp_widget;
tl::weak_ptr<ViewObjectUI> mp_widget;
bool m_static;
bool m_visible;
bool m_dismissable;
@ -568,10 +570,7 @@ enum KeyCodes {
* painting.
*/
class LAYBASIC_PUBLIC ViewObjectWidget :
#if defined(HAVE_QT)
public QWidget,
#endif
class LAYBASIC_PUBLIC ViewObjectUI :
public tl::Object
{
public:
@ -583,12 +582,12 @@ public:
/**
* @brief ctor
*/
ViewObjectWidget ();
ViewObjectUI ();
/**
* @brief dtor
*/
~ViewObjectWidget ();
~ViewObjectUI ();
/**
* @brief Cancel all drag operations
@ -952,6 +951,16 @@ public:
bool image_updated ();
#endif
#if defined(HAVE_QT)
/**
* @brief Gets the QWidget representing this canvas visually in Qt
*/
QWidget *widget ()
{
return mp_widget;
}
#endif
/**
* @brief External entry point for key press event generation
*/
@ -992,79 +1001,14 @@ public:
*/
void send_wheel_event (int delta, bool horizontal, const db::DPoint &pt, unsigned int buttons);
/**
* @brief Resizes the widget
*/
void resize (unsigned int w, unsigned int h);
protected:
#if defined(HAVE_QT)
/**
* @brief Qt focus event handler
*/
bool focusNextPrevChild (bool next);
friend class ViewObjectQWidget;
/**
* @brief Qt keyboard event handler
*/
void keyPressEvent (QKeyEvent *e);
/**
* @brief Qt mouse move event handler
*/
void mouseMoveEvent (QMouseEvent *e);
/**
* @brief Qt mouse leave event handler
*/
void leaveEvent (QEvent *e);
/**
* @brief Qt mouse enter event handler
*/
#if QT_VERSION >= 0x60000
void enterEvent (QEnterEvent *e);
#else
void enterEvent (QEvent *e);
#endif
/**
* @brief Qt mouse button press event handler
*/
void mousePressEvent (QMouseEvent *e);
/**
* @brief Qt mouse button double-click event handler
*/
void mouseDoubleClickEvent (QMouseEvent *e);
/**
* @brief Qt mouse button release event handler
*/
void mouseReleaseEvent (QMouseEvent *e);
/**
* @brief Qt drag enter event handler
*/
void dragEnterEvent (QDragEnterEvent *event);
/**
* @brief Qt drag leave event handler
*/
void dragLeaveEvent (QDragLeaveEvent *event);
/**
* @brief Qt drag enter event handler
*/
void dragMoveEvent (QDragMoveEvent *event);
/**
* @brief Qt drop event handler
*/
void dropEvent (QDropEvent *event);
/**
* @brief Qt mouse wheel event handler
*/
void wheelEvent (QWheelEvent *e);
#endif
#if !defined(HAVE_QT)
/**
* @brief Emulates the update() method in the non-Qt case
*
@ -1072,7 +1016,6 @@ protected:
* update needed flag.
*/
void update ();
#endif
/**
* @brief Set the transformation for mouse events
@ -1080,15 +1023,28 @@ protected:
void mouse_event_trans (const db::DCplxTrans &trans);
/**
* @brief Resizes the widget
* @brief Gets called when the view is resized
*/
void resize (unsigned int w, unsigned int h);
virtual void resize_event (unsigned int w, unsigned int h);
/**
* @brief Receives the paint event from Qt
*/
virtual void paint_event ();
/**
* @brief GTF probe event
*/
virtual void gtf_probe ();
private:
friend class lay::ViewObject;
friend class lay::ViewService;
friend class lay::BackgroundViewObject;
#if defined(HAVE_QT)
QWidget *mp_widget;
#endif
tl::weak_collection<lay::ViewObject> m_objects;
tl::weak_collection<lay::BackgroundViewObject> m_background_objects;
std::list<lay::ViewService *> m_services;

View File

@ -32,7 +32,7 @@ namespace lay
// ZoomService implementation
ZoomService::ZoomService (lay::LayoutViewBase *view)
: lay::ViewService (view->view_object_widget ()),
: lay::ViewService (view->canvas ()),
mp_view (view),
mp_box (0),
m_color (0)
@ -50,7 +50,7 @@ ZoomService::drag_cancel ()
delete mp_box;
mp_box = 0;
}
widget ()->ungrab_mouse (this);
ui ()->ungrab_mouse (this);
}
void
@ -118,7 +118,7 @@ bool
ZoomService::mouse_click_event (const db::DPoint &p, unsigned int buttons, bool prio)
{
if (! prio && (buttons & lay::RightButton) != 0) {
db::DBox vp = widget ()->mouse_event_viewport ();
db::DBox vp = ui ()->mouse_event_viewport ();
if (mp_view && vp.contains (p)) {
db::DVector d = (vp.p2 () - vp.p1 ()) * 0.5;
mp_view->zoom_box (db::DBox (p - d, p + d));
@ -132,21 +132,21 @@ ZoomService::mouse_release_event (const db::DPoint & /*p*/, unsigned int /*butto
{
if (prio) {
widget ()->ungrab_mouse (this);
ui ()->ungrab_mouse (this);
if (mp_box) {
delete mp_box;
mp_box = 0;
db::DBox vp = widget ()->mouse_event_viewport ();
db::DBox vp = ui ()->mouse_event_viewport ();
db::DVector d = (vp.p2 () - vp.p1 ()) * 0.5;
if (mp_view) {
// we need to use the original screen coordinate to find the move direction
db::DPoint p1s = widget ()->mouse_event_trans ().trans (m_p1);
db::DPoint p2s = widget ()->mouse_event_trans ().trans (m_p2);
db::DPoint p1s = ui ()->mouse_event_trans ().trans (m_p1);
db::DPoint p2s = ui ()->mouse_event_trans ().trans (m_p2);
if (p2s.x () > p1s.x () && p1s.y () < p2s.y ()) {
@ -185,7 +185,7 @@ ZoomService::wheel_event (int delta, bool /*horizontal*/, const db::DPoint &p, u
// Only act without the mouse being grabbed.
if (! prio) {
db::DBox vp = widget ()->mouse_event_viewport ();
db::DBox vp = ui ()->mouse_event_viewport ();
if (mp_view && vp.contains (p) && vp.width () > 0 && vp.height () > 0) {
enum { horizontal, vertical, zoom } direction = zoom;
@ -260,12 +260,12 @@ ZoomService::begin_pan (const db::DPoint &pos)
mp_box = 0;
m_p1 = pos;
m_vp = widget ()->mouse_event_viewport ();
m_vp = ui ()->mouse_event_viewport ();
// store one state which we are going to update
mp_view->zoom_box (m_vp);
widget ()->grab_mouse (this, true);
ui ()->grab_mouse (this, true);
}
void
@ -277,9 +277,9 @@ ZoomService::begin (const db::DPoint &pos)
m_p1 = pos;
m_p2 = pos;
mp_box = new lay::RubberBox (widget (), m_color, pos, pos);
mp_box = new lay::RubberBox (ui (), m_color, pos, pos);
widget ()->grab_mouse (this, true);
ui ()->grab_mouse (this, true);
}
}

View File

@ -85,6 +85,7 @@ SOURCES += \
layViewOp.cc \
layViewport.cc \
layZoomBox.cc \
layUtils.cc \
HEADERS += \
laybasicConfig.h \
@ -136,6 +137,7 @@ HEADERS += \
layViewOp.h \
layViewport.h \
layZoomBox.h \
layUtils.h \
laybasicCommon.h \

View File

@ -38,6 +38,7 @@
#include "tlAlgorithm.h"
#include "layMarker.h"
#include "layQtTools.h"
#include "layUtils.h"
#include "tlExceptions.h"
namespace lay
@ -82,7 +83,11 @@ public:
virtual lay::Plugin *create_plugin (db::Manager *, lay::Dispatcher *root, lay::LayoutViewBase *view) const
{
return new BrowseInstancesForm (root, view);
if (lay::has_gui ()) {
return new BrowseInstancesForm (root, view);
} else {
return 0;
}
}
};

View File

@ -37,6 +37,7 @@
#include "tlAlgorithm.h"
#include "layQtTools.h"
#include "layMarker.h"
#include "layUtils.h"
namespace lay
@ -74,17 +75,21 @@ public:
return new BrowseShapesConfigPage (parent);
}
virtual void get_menu_entries (std::vector<lay::MenuEntry> &menu_entries) const
{
lay::PluginDeclaration::get_menu_entries (menu_entries);
menu_entries.push_back (lay::separator ("browser_group", "tools_menu.end"));
menu_entries.push_back (lay::menu_item ("browse_shapes::show", "browse_shapes", "tools_menu.end", tl::to_string (QObject::tr ("Browse Shapes"))));
}
virtual void get_menu_entries (std::vector<lay::MenuEntry> &menu_entries) const
{
lay::PluginDeclaration::get_menu_entries (menu_entries);
menu_entries.push_back (lay::separator ("browser_group", "tools_menu.end"));
menu_entries.push_back (lay::menu_item ("browse_shapes::show", "browse_shapes", "tools_menu.end", tl::to_string (QObject::tr ("Browse Shapes"))));
}
virtual lay::Plugin *create_plugin (db::Manager *, lay::Dispatcher *root, lay::LayoutViewBase *view) const
{
return new BrowseShapesForm (root, view);
}
virtual lay::Plugin *create_plugin (db::Manager *, lay::Dispatcher *root, lay::LayoutViewBase *view) const
{
if (lay::has_gui ()) {
return new BrowseShapesForm (root, view);
} else {
return 0;
}
}
};
static tl::RegisteredClass<lay::PluginDeclaration> config_decl (new BrowseShapesPluginDeclaration (), 10000, "BrowseShapesPlugin");

View File

@ -890,7 +890,7 @@ HierarchyControlPanel::do_update_content (int cv_index)
header->setVisible (split_mode);
cl_ly->addWidget (header);
HCPCellTreeWidget *cell_list = new HCPCellTreeWidget (cl_frame, "tree", mp_view->view_object_widget ());
HCPCellTreeWidget *cell_list = new HCPCellTreeWidget (cl_frame, "tree", mp_view->canvas ()->widget ());
cl_ly->addWidget (cell_list);
cell_list->setModel (new CellTreeModel (cell_list, mp_view, cv_index, m_flat ? CellTreeModel::Flat : 0, 0, m_sorting));
cell_list->setUniformRowHeights (true);

View File

@ -632,7 +632,7 @@ LibrariesView::do_update_content (int lib_index)
header->setVisible (split_mode);
cl_ly->addWidget (header);
LibraryTreeWidget *cell_list = new LibraryTreeWidget (cl_frame, "tree", mp_view->view_object_widget ());
LibraryTreeWidget *cell_list = new LibraryTreeWidget (cl_frame, "tree", mp_view->canvas ()->widget ());
cl_ly->addWidget (cell_list);
cell_list->setModel (new CellTreeModel (cell_list, m_libraries [i].get (), CellTreeModel::Flat | CellTreeModel::TopCells | CellTreeModel::BasicCells | CellTreeModel::WithVariants | CellTreeModel::WithIcons, 0));
cell_list->setUniformRowHeights (true);

View File

@ -26,6 +26,7 @@
#include "layNetlistBrowserDialog.h"
#include "layConverters.h"
#include "layDispatcher.h"
#include "layUtils.h"
#include "ui_NetlistBrowserConfigPage.h"
#include "ui_NetlistBrowserConfigPage2.h"
@ -384,7 +385,11 @@ public:
virtual lay::Plugin *create_plugin (db::Manager *, lay::Dispatcher *root, lay::LayoutViewBase *view) const
{
return new lay::NetlistBrowserDialog (root, view);
if (has_gui ()) {
return new lay::NetlistBrowserDialog (root, view);
} else {
return 0;
}
}
};

View File

@ -61,7 +61,7 @@ extern const std::string cfg_l2ndb_window_state;
NetlistBrowserDialog::NetlistBrowserDialog (lay::Dispatcher *root, LayoutViewBase *vw)
: lay::Browser (root, vw),
lay::ViewService (vw->view_object_widget ()),
lay::ViewService (vw->canvas ()),
m_window (lay::NetlistBrowserConfig::FitNet),
m_window_dim (0.0),
m_max_shape_count (0),
@ -225,7 +225,7 @@ void
NetlistBrowserDialog::probe_net (const db::DPoint &p, bool trace_path)
{
// prepare for the net tracing
double l = double (view ()->search_range ()) / widget ()->mouse_event_trans ().mag ();
double l = double (view ()->search_range ()) / ui ()->mouse_event_trans ().mag ();
db::DBox start_search_box = db::DBox (p, p).enlarged (db::DVector (l, l));
@ -348,7 +348,7 @@ NetlistBrowserDialog::release_mouse ()
{
m_mouse_state = 0;
view ()->message ();
widget ()->ungrab_mouse (this);
ui ()->ungrab_mouse (this);
}
lay::ViewService *
@ -365,7 +365,7 @@ BEGIN_PROTECTED
m_mouse_state = 1;
view ()->message (tl::to_string (QObject::tr ("Click on a point in the net")));
widget ()->grab_mouse (this, false);
ui ()->grab_mouse (this, false);
END_PROTECTED
}

View File

@ -27,6 +27,7 @@
#include "dbLayout.h"
#include "layConverters.h"
#include "layDispatcher.h"
#include "layUtils.h"
#include "ui_MarkerBrowserConfigPage.h"
#include "ui_MarkerBrowserConfigPage2.h"
@ -309,7 +310,11 @@ public:
virtual lay::Plugin *create_plugin (db::Manager *, lay::Dispatcher *root, lay::LayoutViewBase *view) const
{
return new rdb::MarkerBrowserDialog (root, view);
if (lay::has_gui ()) {
return new rdb::MarkerBrowserDialog (root, view);
} else {
return 0;
}
}
};

View File

@ -118,7 +118,7 @@ static tl::RegisteredClass<lay::PluginDeclaration> config_decl (new GridNetPlugi
// Implementation of the GridNet object
GridNet::GridNet (LayoutViewBase *view)
: lay::BackgroundViewObject (view->view_object_widget ()),
: lay::BackgroundViewObject (view->canvas ()),
lay::Plugin (view),
mp_view (view),
m_visible (false), m_show_ruler (true), m_grid (1.0),

View File

@ -72,6 +72,7 @@
#include "layBookmarksView.h"
#include "layEditorOptionsFrame.h"
#include "layEditorOptionsPages.h"
#include "layUtils.h"
#include "dbClipboard.h"
#include "dbLayout.h"
#include "dbLayoutUtils.h"
@ -263,12 +264,6 @@ LayoutView::init_menu ()
void
LayoutView::init_ui (QWidget *parent, const char *name)
{
#if QT_VERSION < 0x50000
bool has_gui = (QApplication::type () != Qt::Tty);
#else
bool has_gui = (qGuiApp != 0);
#endif
m_activated = true;
m_always_show_source = false;
m_always_show_ld = true;
@ -290,18 +285,18 @@ LayoutView::init_ui (QWidget *parent, const char *name)
mp_min_hier_spbx = 0;
mp_max_hier_spbx = 0;
if (has_gui) {
if (lay::has_gui ()) {
mp_widget = new LayoutViewFrame (parent, this);
mp_widget->setObjectName (QString::fromUtf8 (name));
view_object_widget ()->setParent (mp_widget);
canvas ()->widget ()->setParent (mp_widget);
mp_connector = new LayoutViewSignalConnector (mp_widget, this);
QVBoxLayout *vbl = new QVBoxLayout (mp_widget);
vbl->setContentsMargins (0, 0, 0, 0);
vbl->setSpacing (0);
vbl->addWidget (view_object_widget ());
vbl->addWidget (canvas ()->widget ());
if ((options () & LV_NoHierarchyPanel) == 0 && (options () & LV_Naked) == 0) {
@ -997,33 +992,53 @@ LayoutView::cut ()
int
LayoutView::active_cellview_index () const
{
return mp_hierarchy_panel->active ();
if (mp_hierarchy_panel) {
return mp_hierarchy_panel->active ();
} else {
return LayoutViewBase::active_cellview_index ();
}
}
void
LayoutView::set_active_cellview_index (int index)
{
if (index >= 0 && index < int (cellviews ())) {
mp_hierarchy_panel->select_active (index);
if (mp_hierarchy_panel) {
mp_hierarchy_panel->select_active (index);
} else {
LayoutViewBase::set_active_cellview_index (index);
}
}
}
void
LayoutView::selected_cells_paths (int cv_index, std::vector<cell_path_type> &paths) const
{
mp_hierarchy_panel->selected_cells (cv_index, paths);
if (mp_hierarchy_panel) {
mp_hierarchy_panel->selected_cells (cv_index, paths);
} else {
LayoutViewBase::selected_cells_paths (cv_index, paths);
}
}
void
LayoutView::current_cell_path (int cv_index, cell_path_type &path) const
{
mp_hierarchy_panel->current_cell (cv_index, path);
if (mp_hierarchy_panel) {
mp_hierarchy_panel->current_cell (cv_index, path);
} else {
LayoutViewBase::current_cell_path (cv_index, path);
}
}
void
LayoutView::set_current_cell_path (int cv_index, const cell_path_type &path)
{
mp_hierarchy_panel->set_current_cell (cv_index, path);
if (mp_hierarchy_panel) {
mp_hierarchy_panel->set_current_cell (cv_index, path);
} else {
LayoutViewBase::set_current_cell_path (cv_index, path);
}
}
void

View File

@ -25,6 +25,7 @@
#include "layPlugin.h"
#include "layLayoutViewBase.h"
#include "layUtils.h"
namespace lay
{
@ -36,7 +37,11 @@ public:
DiffPlugin (Plugin *parent, lay::LayoutViewBase *view)
: lay::Plugin (parent), mp_view (view)
{
mp_dialog = new lay::DiffToolDialog (0);
if (lay::has_gui ()) {
mp_dialog = new lay::DiffToolDialog (0);
} else {
mp_dialog = 0;
}
}
~DiffPlugin ()
@ -49,7 +54,7 @@ public:
{
if (symbol == "lay::diff_tool") {
if (mp_dialog->exec_dialog (mp_view)) {
if (mp_dialog && mp_dialog->exec_dialog (mp_view)) {
// ... implementation is in layDiffToolDialog.cc ...

View File

@ -55,7 +55,7 @@ namespace lay
NetTracerDialog::NetTracerDialog (lay::Dispatcher *root, LayoutViewBase *view)
: lay::Browser (root, view, "net_tracer_dialog"),
lay::ViewService (view->view_object_widget ()),
lay::ViewService (view->canvas ()),
m_cv_index (0),
m_net_index (1),
m_window (lay::NTFitNet),
@ -170,7 +170,7 @@ NetTracerDialog::mouse_click_event (const db::DPoint &p, unsigned int buttons, b
// prepare for the net tracing
clear_markers ();
double l = double (view ()->search_range ()) / widget ()->mouse_event_trans ().mag ();
double l = double (view ()->search_range ()) / ui ()->mouse_event_trans ().mag ();
db::DBox start_search_box = db::DBox (p, p).enlarged (db::DVector (l, l));
@ -1125,7 +1125,7 @@ BEGIN_PROTECTED
net_list->setCurrentItem (0);
m_mouse_state = 2;
view ()->message (tl::to_string (QObject::tr ("Click on the first point in the net")));
widget ()->grab_mouse (this, false);
ui ()->grab_mouse (this, false);
END_PROTECTED
}
@ -1137,7 +1137,7 @@ BEGIN_PROTECTED
net_list->setCurrentItem (0);
m_mouse_state = 1;
view ()->message (tl::to_string (QObject::tr ("Click on a point in the net")));
widget ()->grab_mouse (this, false);
ui ()->grab_mouse (this, false);
END_PROTECTED
}
@ -1160,7 +1160,7 @@ NetTracerDialog::release_mouse ()
add2_pb->setChecked (false);
m_mouse_state = 0;
view ()->message ();
widget ()->ungrab_mouse (this);
ui ()->ungrab_mouse (this);
}
void

View File

@ -29,6 +29,7 @@
#include "layConverters.h"
#include "layCellView.h"
#include "layLayoutView.h"
#include "layUtils.h"
#include "gsiDecl.h"
@ -78,7 +79,11 @@ public:
virtual lay::Plugin *create_plugin (db::Manager * /*manager*/, lay::Dispatcher *root, lay::LayoutViewBase *view) const
{
return new NetTracerDialog (root, view);
if (lay::has_gui ()) {
return new NetTracerDialog (root, view);
} else {
return 0;
}
}
};

View File

@ -26,6 +26,7 @@
#include "layDispatcher.h"
#include "layPlugin.h"
#include "layUtils.h"
#include <QSurfaceFormat>
@ -69,7 +70,11 @@ public:
lay::Plugin *create_plugin (db::Manager *, lay::Dispatcher *root, lay::LayoutViewBase *view) const
{
return new D25View (root, view);
if (lay::has_gui ()) {
return new D25View (root, view);
} else {
return 0;
}
}
};

View File

@ -27,6 +27,7 @@
#include "layPlugin.h"
#include "layLayoutView.h"
#include "layUtils.h"
namespace lay
{
@ -38,7 +39,11 @@ public:
XORPlugin (Plugin *parent, lay::LayoutViewBase *view)
: lay::Plugin (parent), mp_view (view)
{
mp_dialog = new lay::XORToolDialog (0);
if (lay::has_gui ()) {
mp_dialog = new lay::XORToolDialog (0);
} else {
mp_dialog = 0;
}
}
~XORPlugin ()
@ -51,7 +56,7 @@ public:
{
if (symbol == "lay::xor_tool") {
if (mp_dialog->exec_dialog (mp_view)) {
if (mp_dialog && mp_dialog->exec_dialog (mp_view)) {
// ... implementation is in layXORToolDialog.cc ...