Some more refactoring - further abstracting layout view from container widget

This commit is contained in:
Matthias Koefferlein 2022-09-02 22:46:44 +02:00
parent ec9f91b3d4
commit f788818d12
28 changed files with 424 additions and 373 deletions

View File

@ -26,7 +26,7 @@
#include "dbLibrary.h"
#include "dbLibraryManager.h"
#include "tlExceptions.h"
#include "layLayoutViewBase.h"
#include "layLayoutView.h"
#include "laySelector.h"
#include "layFinder.h"
#include "layLayerProperties.h"
@ -100,7 +100,7 @@ edt::RoundCornerOptionsDialog *
MainService::round_corners_dialog ()
{
if (! mp_round_corners_dialog) {
mp_round_corners_dialog = new edt::RoundCornerOptionsDialog (view ()->widget ());
mp_round_corners_dialog = new edt::RoundCornerOptionsDialog (lay::widget_from_view (view ()));
}
return mp_round_corners_dialog;
}
@ -109,7 +109,7 @@ edt::AlignOptionsDialog *
MainService::align_options_dialog ()
{
if (! mp_align_options_dialog) {
mp_align_options_dialog = new edt::AlignOptionsDialog (view ()->widget ());
mp_align_options_dialog = new edt::AlignOptionsDialog (lay::widget_from_view (view ()));
}
return mp_align_options_dialog;
}
@ -118,7 +118,7 @@ edt::DistributeOptionsDialog *
MainService::distribute_options_dialog ()
{
if (! mp_distribute_options_dialog) {
mp_distribute_options_dialog = new edt::DistributeOptionsDialog (view ()->widget ());
mp_distribute_options_dialog = new edt::DistributeOptionsDialog (lay::widget_from_view (view ()));
}
return mp_distribute_options_dialog;
}
@ -127,7 +127,7 @@ lay::FlattenInstOptionsDialog *
MainService::flatten_inst_options_dialog ()
{
if (! mp_flatten_inst_options_dialog) {
mp_flatten_inst_options_dialog = new lay::FlattenInstOptionsDialog (view ()->widget (), false /*don't allow pruning*/);
mp_flatten_inst_options_dialog = new lay::FlattenInstOptionsDialog (lay::widget_from_view (view ()), false /*don't allow pruning*/);
}
return mp_flatten_inst_options_dialog;
}
@ -136,7 +136,7 @@ edt::MakeCellOptionsDialog *
MainService::make_cell_options_dialog ()
{
if (! mp_make_cell_options_dialog) {
mp_make_cell_options_dialog = new edt::MakeCellOptionsDialog (view ()->widget ());
mp_make_cell_options_dialog = new edt::MakeCellOptionsDialog (lay::widget_from_view (view ()));
}
return mp_make_cell_options_dialog;
}
@ -145,7 +145,7 @@ edt::MakeArrayOptionsDialog *
MainService::make_array_options_dialog ()
{
if (! mp_make_array_options_dialog) {
mp_make_array_options_dialog = new edt::MakeArrayOptionsDialog (view ()->widget ());
mp_make_array_options_dialog = new edt::MakeArrayOptionsDialog (lay::widget_from_view (view ()));
}
return mp_make_array_options_dialog;
}
@ -1228,7 +1228,7 @@ MainService::cm_convert_to_pcell ()
}
bool ok = false;
QString item = QInputDialog::getItem (view ()->widget (),
QString item = QInputDialog::getItem (lay::widget_from_view (view ()),
tr ("Select Target PCell"),
tr ("Select the PCell the shape should be converted into"),
items, 0, false, &ok);
@ -1333,7 +1333,7 @@ MainService::cm_convert_to_pcell ()
if (any_non_converted) {
tl::warn << tl::to_string (tr ("Some of the shapes could not be converted to the desired PCell"));
#if defined(HAVE_QT)
QMessageBox::warning (view ()->widget (), tr ("Warning"), tr ("Some of the shapes could not be converted to the desired PCell"));
QMessageBox::warning (lay::widget_from_view (view ()), tr ("Warning"), tr ("Some of the shapes could not be converted to the desired PCell"));
#endif
}
@ -1565,7 +1565,7 @@ MainService::cm_size ()
#if defined(HAVE_QT)
// TODO: keep the value persistent so we can set it externally in the Qt-less case
bool ok = false;
QString s = QInputDialog::getText (view ()->widget (),
QString s = QInputDialog::getText (lay::widget_from_view (view ()),
tr ("Sizing"),
tr ("Sizing (in micron, positive or negative). Two values (dx, dy) for anisotropic sizing."),
QLineEdit::Normal, QString::fromUtf8 ("0.0"),
@ -2159,7 +2159,8 @@ MainService::cm_tap ()
#endif
#if defined(HAVE_QT)
if (! view ()->canvas ()->widget ()) {
QWidget *view_widget = lay::widget_from_view (view ());
if (! view_widget) {
return;
}
#endif
@ -2202,7 +2203,8 @@ MainService::cm_tap ()
#if defined(HAVE_QT)
// TODO: what to do here in Qt-less case? Store results in configuration so they can be retrieved externally?
std::unique_ptr<QMenu> menu (new QMenu (view ()->widget ()));
std::unique_ptr<QMenu> menu (new QMenu (view_widget));
menu->show ();
int icon_size = menu->style ()->pixelMetric (QStyle::PM_ButtonIconSize);

View File

@ -182,7 +182,7 @@ RecentConfigurationPage::render_to (QTreeWidgetItem *item, int column, const std
case RecentConfigurationPage::Layer:
{
int icon_size = view ()->widget ()->style ()->pixelMetric (QStyle::PM_ButtonIconSize);
int icon_size = item->treeWidget ()->style ()->pixelMetric (QStyle::PM_ButtonIconSize);
lay::LayerPropertiesConstIterator l;
try {
l = lp_iter_from_string (view (), values [column]);
@ -348,7 +348,7 @@ RecentConfigurationPage::update_list (const std::list<std::vector<std::string> >
}
static bool
set_or_request_current_layer (lay::LayoutViewBase *view, unsigned int cv_index, const db::LayerProperties &lp)
set_or_request_current_layer (QWidget *parent, lay::LayoutViewBase *view, unsigned int cv_index, const db::LayerProperties &lp)
{
bool ok = view->set_current_layer (cv_index, lp);
if (ok) {
@ -364,7 +364,7 @@ set_or_request_current_layer (lay::LayoutViewBase *view, unsigned int cv_index,
return false;
}
if (QMessageBox::question (view->widget (), tr ("Create Layer"), tr ("Layer %1 does not exist yet. Create it now?").arg (tl::to_qstring (lp.to_string ()))) == QMessageBox::Yes) {
if (QMessageBox::question (parent, tr ("Create Layer"), tr ("Layer %1 does not exist yet. Create it now?").arg (tl::to_qstring (lp.to_string ()))) == QMessageBox::Yes) {
lay::LayerPropertiesNode lpn;
lpn.set_source (lay::ParsedLayerSource (lp, cv_index));
@ -400,7 +400,7 @@ RecentConfigurationPage::item_clicked (QTreeWidgetItem *item)
ex.read (cv_index);
}
set_or_request_current_layer (view (), cv_index, lp);
set_or_request_current_layer (item->treeWidget (), view (), cv_index, lp);
} else {
dispatcher ()->config_set (c->cfg_name, v);

View File

@ -31,7 +31,7 @@
# include "edtDialogs.h"
#endif
#include "layFinder.h"
#include "layLayoutViewBase.h"
#include "layLayoutView.h"
#include "laySnap.h"
#include "tlProgress.h"
#include "tlTimer.h"
@ -315,7 +315,7 @@ void
Service::copy_selected ()
{
#if defined(HAVE_QT)
edt::CopyModeDialog mode_dialog (view ()->widget ());
edt::CopyModeDialog mode_dialog (lay::widget_from_view (view ()));
bool need_to_ask_for_copy_mode = false;
unsigned int inst_mode = 0;

View File

@ -52,26 +52,25 @@ img::Object *
Navigator::setup (lay::Dispatcher *root, img::Object *img)
{
mp_view = new lay::LayoutViewWidget (0, false, root, this, lay::LayoutView::LV_Naked + lay::LayoutView::LV_NoZoom + lay::LayoutView::LV_NoServices + lay::LayoutView::LV_NoGrid);
tl_assert (mp_view->widget ());
mp_view->widget ()->setSizePolicy (QSizePolicy::Expanding, QSizePolicy::Expanding);
mp_view->widget ()->setMinimumWidth (100);
mp_view->widget ()->setMinimumHeight (100);
mp_view->setSizePolicy (QSizePolicy::Expanding, QSizePolicy::Expanding);
mp_view->setMinimumWidth (100);
mp_view->setMinimumHeight (100);
QVBoxLayout *layout = new QVBoxLayout (this);
layout->addWidget (mp_view->widget ());
layout->setStretchFactor (mp_view->widget (), 1);
layout->addWidget (mp_view);
layout->setStretchFactor (mp_view, 1);
layout->setContentsMargins (0, 0, 0, 0);
layout->setSpacing (0);
setLayout (layout);
mp_zoom_service = new lay::ZoomService (mp_view);
mp_zoom_service = new lay::ZoomService (view ());
img::Service *img_target = mp_view->get_plugin<img::Service> ();
img::Service *img_target = view ()->get_plugin<img::Service> ();
if (img_target) {
img_target->clear_images ();
img::Object *img_object = img_target->insert_image (*img);
img_object->set_matrix (db::Matrix3d (1.0));
mp_view->zoom_fit ();
view ()->zoom_fit ();
return img_object;
} else {
return 0;
@ -91,10 +90,15 @@ Navigator::~Navigator ()
}
}
lay::LayoutView *Navigator::view ()
{
return mp_view->view ();
}
void
Navigator::activate_service (lay::ViewService *service)
{
mp_view->canvas ()->activate (service);
view ()->canvas ()->activate (service);
}
void

View File

@ -30,6 +30,7 @@
namespace lay
{
class Dispatcher;
class LayoutViewWidget;
class LayoutView;
class ZoomService;
class ViewService;
@ -55,15 +56,12 @@ public:
void background_color (QColor c);
img::Object *setup (lay::Dispatcher *root, img::Object *img);
lay::LayoutView *view ()
{
return mp_view;
}
lay::LayoutView *view ();
void activate_service (lay::ViewService *service);
private:
lay::LayoutView *mp_view;
lay::LayoutViewWidget *mp_view;
lay::ZoomService *mp_zoom_service;
};

View File

@ -63,14 +63,14 @@ public:
menu_entries.push_back (lay::menu_item ("fill_tool::show", "fill_tool:edit_mode", "edit_menu.utils_menu.end", tl::to_string (QObject::tr ("Fill Tool"))));
}
virtual lay::Plugin *create_plugin (db::Manager *, lay::LayoutViewBase *view) const
{
if (lay::has_gui ()) {
return new FillDialog (view);
} else {
return 0;
}
}
virtual lay::Plugin *create_plugin (db::Manager *, lay::Dispatcher *, lay::LayoutViewBase *view) const
{
if (lay::has_gui ()) {
return new FillDialog (lay::MainWindow::instance (), view);
} else {
return 0;
}
}
};
static tl::RegisteredClass<lay::PluginDeclaration> config_decl (new FillDialogPluginDeclaration (), 20000, "FillDialogPlugin");
@ -78,8 +78,8 @@ static tl::RegisteredClass<lay::PluginDeclaration> config_decl (new FillDialogPl
// ------------------------------------------------------------
FillDialog::FillDialog (LayoutViewBase *view)
: QDialog (view->widget ()),
FillDialog::FillDialog (QWidget *parent, LayoutViewBase *view)
: QDialog (parent),
lay::Plugin (view),
Ui::FillDialog (),
mp_view (view)

View File

@ -76,7 +76,7 @@ class LAY_PUBLIC FillDialog
Q_OBJECT
public:
FillDialog (lay::LayoutViewBase *view);
FillDialog (QWidget *parent, lay::LayoutViewBase *view);
~FillDialog ();
public slots:

View File

@ -594,18 +594,18 @@ BEGIN_PROTECTED
m_file_changed_timer.blockSignals (false);
std::map<QString, std::pair<lay::LayoutView *, int> > views_per_file;
std::map<QString, std::pair<lay::LayoutViewWidget *, int> > views_per_file;
for (std::vector<lay::LayoutView *>::iterator v = mp_views.begin (); v != mp_views.end (); ++v) {
for (int cv = 0; cv < int ((*v)->cellviews ()); ++cv) {
views_per_file [tl::to_qstring ((*v)->cellview (cv)->filename ())] = std::make_pair (*v, cv);
for (std::vector<lay::LayoutViewWidget *>::iterator v = mp_views.begin (); v != mp_views.end (); ++v) {
for (int cv = 0; cv < int ((*v)->view ()->cellviews ()); ++cv) {
views_per_file [tl::to_qstring ((*v)->view ()->cellview (cv)->filename ())] = std::make_pair (*v, cv);
}
}
for (std::vector<QString>::const_iterator f = changed_files.begin (); f != changed_files.end (); ++f) {
std::map<QString, std::pair<lay::LayoutView *, int> >::const_iterator v = views_per_file.find (*f);
std::map<QString, std::pair<lay::LayoutViewWidget *, int> >::const_iterator v = views_per_file.find (*f);
if (v != views_per_file.end ()) {
v->second.first->reload_layout (v->second.second);
v->second.first->view ()->reload_layout (v->second.second);
reloaded_files.insert (*f);
}
}
@ -675,7 +675,7 @@ MainWindow::close_all ()
current_view_changed ();
for (unsigned int i = 0; i < mp_views.size (); ++i) {
mp_views [i]->stop ();
mp_views [i]->view ()->stop ();
}
m_manager.clear ();
@ -695,7 +695,7 @@ MainWindow::close_all ()
view_closed_event (int (mp_views.size () - 1));
lay::LayoutView *view = mp_views.back ();
lay::LayoutViewWidget *view = mp_views.back ();
mp_views.pop_back ();
mp_lp_stack->remove_widget (mp_views.size ());
mp_hp_stack->remove_widget (mp_views.size ());
@ -1333,9 +1333,9 @@ MainWindow::libraries_changed ()
{
// if the libraries have changed, remove all selections and cancel any operations to avoid
// that the view refers to an invalid instance or shape
for (std::vector <lay::LayoutView *>::iterator vp = mp_views.begin (); vp != mp_views.end (); ++vp) {
(*vp)->clear_selection ();
(*vp)->cancel ();
for (std::vector <lay::LayoutViewWidget *>::iterator vp = mp_views.begin (); vp != mp_views.end (); ++vp) {
(*vp)->view ()->clear_selection ();
(*vp)->view ()->cancel ();
}
}
@ -1650,7 +1650,7 @@ lay::LayoutView *
MainWindow::view (int index)
{
if (index >= 0 && index < int (mp_views.size ())) {
return mp_views [index];
return mp_views [index]->view ();
} else {
return 0;
}
@ -1660,7 +1660,7 @@ const lay::LayoutView *
MainWindow::view (int index) const
{
if (index >= 0 && index < int (mp_views.size ())) {
return mp_views [index];
return mp_views [index]->view ();
} else {
return 0;
}
@ -1670,7 +1670,7 @@ int
MainWindow::index_of (const lay::LayoutView *view) const
{
for (int i = 0; i < int (mp_views.size ()); ++i) {
if (mp_views [i] == view) {
if (mp_views [i]->view () == view) {
return i;
}
}
@ -1696,8 +1696,8 @@ MainWindow::select_mode (int m)
if (m_mode != m) {
m_mode = m;
for (std::vector <lay::LayoutView *>::iterator vp = mp_views.begin (); vp != mp_views.end (); ++vp) {
(*vp)->mode (m);
for (std::vector <lay::LayoutViewWidget *>::iterator vp = mp_views.begin (); vp != mp_views.end (); ++vp) {
(*vp)->view ()->mode (m);
}
// Update the actions by checking the one that is selected programmatically. Use the toolbar menu for reference.
@ -1753,9 +1753,9 @@ void
MainWindow::cm_undo ()
{
if (current_view () && m_manager.available_undo ().first) {
for (std::vector <lay::LayoutView *>::iterator vp = mp_views.begin (); vp != mp_views.end (); ++vp) {
(*vp)->clear_selection ();
(*vp)->cancel ();
for (std::vector <lay::LayoutViewWidget *>::iterator vp = mp_views.begin (); vp != mp_views.end (); ++vp) {
(*vp)->view ()->clear_selection ();
(*vp)->view ()->cancel ();
}
m_manager.undo ();
}
@ -1765,9 +1765,9 @@ void
MainWindow::cm_redo ()
{
if (current_view () && m_manager.available_redo ().first) {
for (std::vector <lay::LayoutView *>::iterator vp = mp_views.begin (); vp != mp_views.end (); ++vp) {
(*vp)->clear_selection ();
(*vp)->cancel ();
for (std::vector <lay::LayoutViewWidget *>::iterator vp = mp_views.begin (); vp != mp_views.end (); ++vp) {
(*vp)->view ()->clear_selection ();
(*vp)->view ()->cancel ();
}
m_manager.redo ();
}
@ -1964,8 +1964,8 @@ MainWindow::cancel ()
m_manager.commit ();
}
for (std::vector <lay::LayoutView *>::iterator vp = mp_views.begin (); vp != mp_views.end (); ++vp) {
(*vp)->cancel ();
for (std::vector <lay::LayoutViewWidget *>::iterator vp = mp_views.begin (); vp != mp_views.end (); ++vp) {
(*vp)->view ()->cancel ();
}
select_mode (lay::LayoutView::default_mode ());
@ -1975,8 +1975,8 @@ void
MainWindow::load_layer_properties (const std::string &fn, bool all_views, bool add_default)
{
if (all_views) {
for (std::vector <lay::LayoutView *>::iterator vp = mp_views.begin (); vp != mp_views.end (); ++vp) {
(*vp)->load_layer_props (fn, add_default);
for (std::vector <lay::LayoutViewWidget *>::iterator vp = mp_views.begin (); vp != mp_views.end (); ++vp) {
(*vp)->view ()->load_layer_props (fn, add_default);
}
} else if (current_view ()) {
current_view ()->load_layer_props (fn, add_default);
@ -1987,8 +1987,8 @@ void
MainWindow::load_layer_properties (const std::string &fn, int cv_index, bool all_views, bool add_default)
{
if (all_views) {
for (std::vector <lay::LayoutView *>::iterator vp = mp_views.begin (); vp != mp_views.end (); ++vp) {
(*vp)->load_layer_props (fn, cv_index, add_default);
for (std::vector <lay::LayoutViewWidget *>::iterator vp = mp_views.begin (); vp != mp_views.end (); ++vp) {
(*vp)->view ()->load_layer_props (fn, cv_index, add_default);
}
} else if (current_view ()) {
current_view ()->load_layer_props (fn, cv_index, add_default);
@ -2571,15 +2571,17 @@ MainWindow::cm_clone ()
void
MainWindow::clone_current_view ()
{
lay::LayoutView *view = 0;
lay::LayoutViewWidget *view_widget = 0;
lay::LayoutView *curr = current_view ();
if (! curr) {
throw tl::Exception (tl::to_string (QObject::tr ("No view open to clone")));
}
// create a new view
view = new lay::LayoutViewWidget (current_view (), &m_manager, lay::ApplicationBase::instance ()->is_editable (), dispatcher (), mp_view_stack);
add_view (view);
view_widget = new lay::LayoutViewWidget (current_view (), &m_manager, lay::ApplicationBase::instance ()->is_editable (), dispatcher (), mp_view_stack);
add_view (view_widget);
lay::LayoutView *view = view_widget->view ();
// set initial attributes
view->set_hier_levels (curr->get_hier_levels ());
@ -2598,16 +2600,16 @@ MainWindow::clone_current_view ()
view->update_content ();
mp_views.back ()->set_current ();
mp_views.back ()->view ()->set_current ();
mp_layer_toolbox->set_view (current_view ());
mp_view_stack->add_widget (view);
mp_lp_stack->add_widget (view->layer_control_frame ());
mp_hp_stack->add_widget (view->hierarchy_control_frame ());
mp_libs_stack->add_widget (view->libraries_frame ());
mp_eo_stack->add_widget (view->editor_options_frame ());
mp_bm_stack->add_widget (view->bookmarks_frame ());
mp_view_stack->add_widget (view_widget);
mp_lp_stack->add_widget (view_widget->layer_control_frame ());
mp_hp_stack->add_widget (view_widget->hierarchy_control_frame ());
mp_libs_stack->add_widget (view_widget->libraries_frame ());
mp_eo_stack->add_widget (view_widget->editor_options_frame ());
mp_bm_stack->add_widget (view_widget->bookmarks_frame ());
bool f = m_disable_tab_selected;
m_disable_tab_selected = true;
@ -2752,9 +2754,9 @@ MainWindow::interactive_close_view (int index, bool all_cellviews)
int count = 0;
for (std::vector <lay::LayoutView *>::const_iterator v = mp_views.begin (); v != mp_views.end (); ++v) {
for (unsigned int cvi = 0; cvi < (*v)->cellviews (); ++cvi) {
if ((*v)->cellview (cvi)->name () == name) {
for (std::vector <lay::LayoutViewWidget *>::const_iterator v = mp_views.begin (); v != mp_views.end (); ++v) {
for (unsigned int cvi = 0; cvi < (*v)->view ()->cellviews (); ++cvi) {
if ((*v)->view ()->cellview (cvi)->name () == name) {
++count;
}
}
@ -2863,7 +2865,7 @@ MainWindow::close_view (int index)
view_closed_event (int (index));
// delete the view later as it may still be needed by event handlers or similar
std::unique_ptr<lay::LayoutView> old_view (view (index));
std::unique_ptr<lay::LayoutViewWidget> old_view (mp_views [index]);
mp_views.erase (mp_views.begin () + index, mp_views.begin () + index + 1);
@ -3364,33 +3366,33 @@ MainWindow::create_layout (const std::string &technology, int mode)
}
void
MainWindow::add_view (lay::LayoutView *view)
MainWindow::add_view (lay::LayoutViewWidget *view)
{
tl_assert (view->widget ());
connect (view->widget (), SIGNAL (title_changed (lay::LayoutView *)), this, SLOT (view_title_changed (lay::LayoutView *)));
connect (view->widget (), SIGNAL (dirty_changed (lay::LayoutView *)), this, SLOT (view_title_changed (lay::LayoutView *)));
connect (view->widget (), SIGNAL (edits_enabled_changed ()), this, SLOT (edits_enabled_changed ()));
connect (view->widget (), SIGNAL (menu_needs_update ()), this, SLOT (menu_needs_update ()));
connect (view->widget (), SIGNAL (show_message (const std::string &, int)), this, SLOT (message (const std::string &, int)));
connect (view->widget (), SIGNAL (current_pos_changed (double, double, bool)), this, SLOT (current_pos (double, double, bool)));
connect (view->widget (), SIGNAL (clear_current_pos ()), this, SLOT (clear_current_pos ()));
connect (view->widget (), SIGNAL (mode_change (int)), this, SLOT (select_mode (int)));
connect (view, SIGNAL (title_changed (lay::LayoutView *)), this, SLOT (view_title_changed (lay::LayoutView *)));
connect (view, SIGNAL (dirty_changed (lay::LayoutView *)), this, SLOT (view_title_changed (lay::LayoutView *)));
connect (view, SIGNAL (edits_enabled_changed ()), this, SLOT (edits_enabled_changed ()));
connect (view, SIGNAL (menu_needs_update ()), this, SLOT (menu_needs_update ()));
connect (view, SIGNAL (show_message (const std::string &, int)), this, SLOT (message (const std::string &, int)));
connect (view, SIGNAL (current_pos_changed (double, double, bool)), this, SLOT (current_pos (double, double, bool)));
connect (view, SIGNAL (clear_current_pos ()), this, SLOT (clear_current_pos ()));
connect (view, SIGNAL (mode_change (int)), this, SLOT (select_mode (int)));
mp_views.push_back (view);
// we must resize the widget here to set the geometry properly.
// This is required to make zoom_fit work.
view->widget ()->setGeometry (0, 0, mp_view_stack->width (), mp_view_stack->height ());
view->widget ()->show ();
view->setGeometry (0, 0, mp_view_stack->width (), mp_view_stack->height ());
view->show ();
}
int
MainWindow::do_create_view ()
{
// create a new view
lay::LayoutViewWidget *view = new lay::LayoutViewWidget (&m_manager, lay::ApplicationBase::instance ()->is_editable (), dispatcher (), mp_view_stack);
add_view (view);
lay::LayoutViewWidget *view_widget = new lay::LayoutViewWidget (&m_manager, lay::ApplicationBase::instance ()->is_editable (), dispatcher (), mp_view_stack);
add_view (view_widget);
lay::LayoutView *view = view_widget->view ();
// set initial attributes
view->set_synchronous (synchronous ());
@ -3416,7 +3418,7 @@ MainWindow::create_view ()
int view_index = do_create_view ();
// add a new tab and make the new view the current one
mp_views.back ()->set_current ();
mp_views.back ()->view ()->set_current ();
mp_layer_toolbox->set_view (current_view ());
@ -3480,7 +3482,7 @@ MainWindow::create_or_load_layout (const std::string *filename, const db::LoadLa
// make the new view the current one
if (mode == 1) {
mp_views.back ()->set_current ();
mp_views.back ()->view ()->set_current ();
mp_layer_toolbox->set_view (current_view ());
@ -3640,8 +3642,8 @@ void
MainWindow::set_synchronous (bool sync_mode)
{
m_synchronous = sync_mode;
for (std::vector <lay::LayoutView *>::iterator vp = mp_views.begin (); vp != mp_views.end (); ++vp) {
(*vp)->set_synchronous (sync_mode);
for (std::vector <lay::LayoutViewWidget *>::iterator vp = mp_views.begin (); vp != mp_views.end (); ++vp) {
(*vp)->view ()->set_synchronous (sync_mode);
}
}
@ -4187,8 +4189,8 @@ MainWindow::plugin_registered (lay::PluginDeclaration *cls)
cls->init_menu (dispatcher ());
// recreate all plugins
for (std::vector <lay::LayoutView *>::iterator vp = mp_views.begin (); vp != mp_views.end (); ++vp) {
(*vp)->create_plugins ();
for (std::vector <lay::LayoutViewWidget *>::iterator vp = mp_views.begin (); vp != mp_views.end (); ++vp) {
(*vp)->view ()->create_plugins ();
}
}
@ -4198,8 +4200,8 @@ MainWindow::plugin_removed (lay::PluginDeclaration *cls)
cls->remove_menu_items (dispatcher ());
// recreate all plugins except the one that got removed
for (std::vector <lay::LayoutView *>::iterator vp = mp_views.begin (); vp != mp_views.end (); ++vp) {
(*vp)->create_plugins (cls);
for (std::vector <lay::LayoutViewWidget *>::iterator vp = mp_views.begin (); vp != mp_views.end (); ++vp) {
(*vp)->view ()->create_plugins (cls);
}
}

View File

@ -703,7 +703,7 @@ private:
lay::LogViewerDialog *mp_log_viewer_dialog;
int m_mode;
SettingsForm *mp_setup_form;
std::vector <lay::LayoutView *> mp_views;
std::vector <lay::LayoutViewWidget *> mp_views;
int m_open_mode;
int m_keep_backups;
std::vector<std::pair<std::string, std::string> > m_mru;
@ -808,7 +808,7 @@ private:
void current_view_changed ();
void update_window_title ();
void update_tab_title (int i);
void add_view (LayoutView *view);
void add_view (LayoutViewWidget *view);
bool can_close ();
lay::CellViewRef create_or_load_layout (const std::string *filename, const db::LoadLayoutOptions *options, const std::string &tech, const int mode);

View File

@ -630,8 +630,8 @@ Navigator::view_closed (int index)
void
Navigator::resizeEvent (QResizeEvent *)
{
if (mp_view && mp_view->widget ()) {
mp_view->widget ()->setGeometry (mp_placeholder_label->geometry ());
if (mp_view) {
mp_view->setGeometry (mp_placeholder_label->geometry ());
}
}
@ -650,21 +650,20 @@ Navigator::attach_view (LayoutView *view)
delete mp_service;
mp_service = 0;
LayoutView *old_view = mp_view;
LayoutViewWidget *old_view = mp_view;
mp_view = 0;
if (mp_source_view) {
mp_view = new LayoutViewWidget (0, false, mp_source_view, this, LayoutView::LV_Naked + LayoutView::LV_NoZoom + LayoutView::LV_NoServices + LayoutView::LV_NoGrid);
tl_assert (mp_view->widget ());
mp_view->widget ()->setSizePolicy (QSizePolicy::Expanding, QSizePolicy::Expanding);
mp_view->widget ()->setMinimumWidth (100);
mp_view->widget ()->setMinimumHeight (100);
mp_view->widget ()->setGeometry (mp_placeholder_label->geometry ());
mp_view->widget ()->show ();
mp_view->setSizePolicy (QSizePolicy::Expanding, QSizePolicy::Expanding);
mp_view->setMinimumWidth (100);
mp_view->setMinimumHeight (100);
mp_view->setGeometry (mp_placeholder_label->geometry ());
mp_view->show ();
mp_service = new NavigatorService (mp_view);
mp_view->canvas ()->activate (mp_service);
mp_service = new NavigatorService (mp_view->view ());
mp_view->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);
@ -714,7 +713,7 @@ void
Navigator::hier_levels_changed ()
{
if (m_show_all_hier_levels && mp_source_view && m_frozen_list.find (mp_source_view) == m_frozen_list.end ()) {
mp_view->set_hier_levels (mp_source_view->get_hier_levels ());
mp_view->view ()->set_hier_levels (mp_source_view->get_hier_levels ());
}
}
@ -729,19 +728,19 @@ Navigator::update_layers ()
void
Navigator::update ()
{
if (! mp_view || ! mp_source_view) {
if (! mp_view || ! mp_view->view () || ! mp_source_view) {
return;
}
if (m_frozen_list.find (mp_source_view) == m_frozen_list.end ()) {
mp_view->select_cellviews (mp_source_view->cellview_list ());
mp_view->set_properties (mp_source_view->get_properties ());
mp_view->view ()->select_cellviews (mp_source_view->cellview_list ());
mp_view->view ()->set_properties (mp_source_view->get_properties ());
} else {
mp_view->select_cellviews (mp_source_view->cellview_list ());
mp_view->set_properties (m_frozen_list [mp_source_view].layer_properties);
mp_view->view ()->select_cellviews (mp_source_view->cellview_list ());
mp_view->view ()->set_properties (m_frozen_list [mp_source_view].layer_properties);
}
img::Service *img_target = mp_view->get_plugin<img::Service> ();
img::Service *img_target = mp_view->view ()->get_plugin<img::Service> ();
if (img_target) {
img_target->clear_images ();
@ -759,16 +758,16 @@ Navigator::update ()
if (m_show_all_hier_levels && mp_source_view) {
if (m_frozen_list.find (mp_source_view) == m_frozen_list.end ()) {
mp_view->set_hier_levels (mp_source_view->get_hier_levels ());
mp_view->view ()->set_hier_levels (mp_source_view->get_hier_levels ());
} else {
mp_view->set_hier_levels (m_frozen_list [mp_source_view].hierarchy_levels);
mp_view->view ()->set_hier_levels (m_frozen_list [mp_source_view].hierarchy_levels);
}
} else {
mp_view->set_hier_levels (std::make_pair (0, 0));
mp_view->view ()->set_hier_levels (std::make_pair (0, 0));
}
mp_view->zoom_fit ();
mp_view->update_content ();
mp_view->view ()->zoom_fit ();
mp_view->view ()->update_content ();
mp_service->update_marker ();
}

View File

@ -41,6 +41,7 @@ namespace lay
class MainWindow;
class LayoutView;
class LayoutViewWidget;
class AbstractMenu;
class DMarker;
class NavigatorService;
@ -98,7 +99,7 @@ private:
bool m_update_layers_needed;
bool m_update_needed;
MainWindow *mp_main_window;
LayoutView *mp_view;
LayoutViewWidget *mp_view;
QLabel *mp_placeholder_label;
QFrame *mp_menu_bar;
LayoutView *mp_source_view;

View File

@ -40,12 +40,12 @@ ViewWidgetStack::ViewWidgetStack (QWidget *parent, const char *name)
mp_bglabel->show ();
}
void ViewWidgetStack::add_widget (LayoutView *w)
void ViewWidgetStack::add_widget (LayoutViewWidget *w)
{
tl_assert (w->widget ());
tl_assert (w);
m_widgets.push_back (w);
w->widget ()->setParent (this);
w->setParent (this);
resize_children ();
raise_widget (m_widgets.size () - 1);
@ -66,20 +66,20 @@ void ViewWidgetStack::raise_widget (size_t index)
{
if (index < m_widgets.size ()) {
mp_bglabel->hide ();
m_widgets [index]->widget ()->show ();
m_widgets [index]->show ();
} else {
mp_bglabel->show ();
}
size_t i = 0;
for (std::vector <LayoutView *>::iterator child = m_widgets.begin (); child != m_widgets.end (); ++child, ++i) {
for (std::vector <LayoutViewWidget *>::iterator child = m_widgets.begin (); child != m_widgets.end (); ++child, ++i) {
if (i != index) {
(*child)->widget ()->hide ();
(*child)->hide ();
}
}
}
LayoutView *ViewWidgetStack::widget (size_t index)
LayoutViewWidget *ViewWidgetStack::widget (size_t index)
{
if (index < m_widgets.size ()) {
return m_widgets [index];
@ -96,8 +96,8 @@ QWidget *ViewWidgetStack::background_widget ()
void ViewWidgetStack::resize_children ()
{
// set the geometry of all children
for (std::vector <LayoutView *>::iterator child = m_widgets.begin (); child != m_widgets.end (); ++child) {
(*child)->widget ()->setGeometry (0, 0, width (), height ());
for (std::vector <LayoutViewWidget *>::iterator child = m_widgets.begin (); child != m_widgets.end (); ++child) {
(*child)->setGeometry (0, 0, width (), height ());
}
mp_bglabel->setGeometry (0, 0, width (), height ());
}

View File

@ -33,7 +33,7 @@ class QLabel;
namespace lay
{
class LayoutView;
class LayoutViewWidget;
class ViewWidgetStack
: public QWidget
@ -41,10 +41,10 @@ class ViewWidgetStack
public:
ViewWidgetStack (QWidget *parent = 0, const char *name = 0);
void add_widget (LayoutView *w);
void add_widget (lay::LayoutViewWidget *w);
void remove_widget (size_t index);
void raise_widget (size_t index);
LayoutView *widget (size_t index);
LayoutViewWidget *widget (size_t index);
QWidget *background_widget ();
protected:
@ -55,7 +55,7 @@ protected:
void resize_children ();
std::vector <LayoutView *> m_widgets;
std::vector <LayoutViewWidget *> m_widgets;
QLabel *mp_bglabel;
};

View File

@ -413,15 +413,7 @@ LayoutViewBase::finish ()
{
// if we're the root dispatcher initialize the menu and build the context menus. No other menus are built so far.
if (dispatcher () == this) {
#if defined(HAVE_QT)
set_menu_parent_widget (widget ());
init_menu ();
if (widget ()) {
menu ()->build (0, 0);
}
#else
init_menu ();
#endif
}
}
@ -3457,14 +3449,6 @@ LayoutViewBase::box () const
return mp_canvas->viewport ().box ();
}
#if defined(HAVE_QT)
QWidget *
LayoutViewBase::widget ()
{
return 0;
}
#endif
LayoutView *
LayoutViewBase::get_ui ()
{

View File

@ -1662,10 +1662,6 @@ public:
/**
* @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::LayoutCanvas *canvas ()
{
@ -1690,7 +1686,7 @@ public:
}
/**
* @brief Gets the hierarchy panel
* @brief Gets the editor options page
*/
virtual lay::EditorOptionsPages *editor_options_pages ()
{
@ -1863,9 +1859,6 @@ public:
/**
* @brief Get the Drawings interface
*
* Although the Drawings interface is implemented by LayoutCanvas,
* it is a different interface from ViewObjectWidget.
*/
lay::Drawings *drawings ()
{
@ -2647,13 +2640,6 @@ public:
virtual void deactivate_all_browsers ();
#if defined(HAVE_QT)
/**
* @brief Gets the QWidget interface
*/
virtual QWidget *widget ();
#endif
/**
* @brief Gets the LayoutView interface
*/
@ -2866,9 +2852,9 @@ protected:
void free_resources ();
void shutdown ();
void finish ();
void init_menu ();
virtual void finish ();
virtual tl::Color default_background_color ();
virtual void do_set_background_color (tl::Color color, tl::Color contrast);
virtual void do_paste ();

View File

@ -216,8 +216,8 @@ ViewService::set_cursor (lay::Cursor::cursor_shape cursor)
class ViewObjectQWidget : public QWidget
{
public:
ViewObjectQWidget (ViewObjectUI *view)
: QWidget (), mp_view (view)
ViewObjectQWidget (QWidget *parent, ViewObjectUI *view)
: QWidget (parent), mp_view (view)
{
// .. nothing yet ..
}
@ -529,7 +529,7 @@ ViewObjectUI::init_ui (QWidget *parent)
tl_assert (parent != 0);
tl_assert (mp_widget == 0);
mp_widget = new ViewObjectQWidget (this);
mp_widget = new ViewObjectQWidget (parent, this);
mp_widget->setMouseTracking (true);
mp_widget->setAcceptDrops (true);
}

View File

@ -50,8 +50,8 @@ struct CurrentStyleOp
int prev_index, new_index;
};
EditLineStylesForm::EditLineStylesForm (lay::LayoutViewBase *view, const lay::LineStyles &styles)
: QDialog (view->widget ()), db::Object (0),
EditLineStylesForm::EditLineStylesForm (QWidget *parent, lay::LayoutViewBase *view, const lay::LineStyles &styles)
: QDialog (parent), db::Object (0),
m_selected (-1), m_styles (styles), m_manager (true), mp_view (view)
{
m_selection_changed_enabled = false;

View File

@ -48,7 +48,7 @@ class EditLineStylesForm
Q_OBJECT
public:
EditLineStylesForm (lay::LayoutViewBase *view, const lay::LineStyles &styles);
EditLineStylesForm (QWidget *parent, lay::LayoutViewBase *view, const lay::LineStyles &styles);
~EditLineStylesForm ();
// ...

View File

@ -50,8 +50,8 @@ struct CurrentPatternOp
int prev_index, new_index;
};
EditStipplesForm::EditStipplesForm (lay::LayoutViewBase *view, const lay::DitherPattern &pattern)
: QDialog (view->widget ()), db::Object (0),
EditStipplesForm::EditStipplesForm (QWidget *parent, lay::LayoutViewBase *view, const lay::DitherPattern &pattern)
: QDialog (parent), db::Object (0),
m_selected (-1), m_pattern (pattern), m_manager (true), mp_view (view)
{
m_selection_changed_enabled = false;

View File

@ -48,7 +48,7 @@ class EditStipplesForm
Q_OBJECT
public:
EditStipplesForm (lay::LayoutViewBase *view, const lay::DitherPattern &pattern);
EditStipplesForm (QWidget *parent, lay::LayoutViewBase *view, const lay::DitherPattern &pattern);
~EditStipplesForm ();
// ...

View File

@ -258,7 +258,7 @@ LCPDitherPalette::button_clicked (int index)
// edit pattern
lay::DitherPattern pattern (mp_view->dither_pattern ());
lay::EditStipplesForm stipples_form (mp_view, pattern);
lay::EditStipplesForm stipples_form (this, mp_view, pattern);
if (stipples_form.exec () && stipples_form.pattern () != pattern) {
emit pattern_changed (stipples_form.pattern ());
}
@ -686,7 +686,7 @@ LCPStylePalette::button_clicked (int index)
// edit pattern
lay::LineStyles styles (mp_view->line_styles ());
lay::EditLineStylesForm line_styles_form (mp_view, styles);
lay::EditLineStylesForm line_styles_form (this, mp_view, styles);
if (line_styles_form.exec () && line_styles_form.styles () != styles) {
emit line_styles_changed (line_styles_form.styles ());
}

View File

@ -181,7 +181,8 @@ EmptyWithinViewCache::determine_empty_layers (const db::Layout *layout, unsigned
LayerTreeModel::LayerTreeModel (QWidget *parent, lay::LayoutViewBase *view)
: QAbstractItemModel (parent),
mp_view (view), m_filter_mode (false), m_id_start (0), m_id_end (0), m_phase ((unsigned int) -1), m_test_shapes_in_view (false), m_hide_empty_layers (false)
mp_parent (parent), mp_view (view), m_filter_mode (false), m_id_start (0), m_id_end (0),
m_phase ((unsigned int) -1), m_test_shapes_in_view (false), m_hide_empty_layers (false)
{
// .. nothing yet ..
}
@ -849,9 +850,9 @@ LayerTreeModel::data (const QModelIndex &index, int role) const
} else if (role == Qt::BackgroundRole) {
if (m_selected_ids.find (size_t (index.internalPointer ())) != m_selected_ids.end ()) {
if (mp_parent && m_selected_ids.find (size_t (index.internalPointer ())) != m_selected_ids.end ()) {
// for selected items pick a color between Highlight and Base
QPalette pl (mp_view->widget ()->palette ());
QPalette pl (mp_parent->palette ());
QColor c1 = pl.color (QPalette::Highlight);
QColor cb = pl.color (QPalette::Base);
return QVariant (QColor ((c1.red () + cb.red ()) / 2, (c1.green () + cb.green ()) / 2, (c1.blue () + cb.blue ()) / 2));

View File

@ -251,6 +251,7 @@ signals:
void hidden_flags_need_update ();
private:
QWidget *mp_parent;
lay::LayoutViewBase *mp_view;
bool m_filter_mode;
size_t m_id_start, m_id_end;

View File

@ -41,10 +41,30 @@
#include <QMessageBox>
#include <QInputDialog>
#include <QApplication>
#include <QMainWindow>
namespace lay
{
/**
* @brief Gets a suitable parent widget for the modal dialogs used in this module
*/
static QWidget *parent ()
{
QWidgetList tl_widgets;
if (qApp) {
tl_widgets = qApp->topLevelWidgets ();
}
for (auto i = tl_widgets.begin (); i != tl_widgets.end (); ++i) {
QMainWindow *mw = dynamic_cast<QMainWindow *> (*i);
if (mw) {
return mw;
}
}
return 0;
}
static void
collect_cells_to_delete (const db::Layout &layout, const db::Cell &cell, std::set<db::cell_index_type> &called)
{
@ -113,7 +133,7 @@ LayoutViewFunctions::menu_activated (const std::string &symbol)
if (symbol == "cm_show_properties") {
view ()->show_properties (view ()->widget ());
view ()->show_properties (parent ());
} else if (symbol == "cm_delete") {
@ -306,10 +326,10 @@ LayoutViewFunctions::menu_activated (const std::string &symbol)
cm_new_layer ();
}
} else if (symbol == "cm_layout_props") {
lay::LayoutPropertiesForm lp_form (view ()->widget (), view (), "layout_props_form");
lay::LayoutPropertiesForm lp_form (parent (), view (), "layout_props_form");
lp_form.exec ();
} else if (symbol == "cm_layout_stats") {
lay::LayoutStatisticsForm lp_form (view ()->widget (), view (), "layout_props_form");
lay::LayoutStatisticsForm lp_form (parent (), view (), "layout_props_form");
lp_form.exec ();
} else if (symbol == "cm_reload") {
cm_reload ();
@ -429,7 +449,7 @@ LayoutViewFunctions::cm_cell_user_properties ()
db::Cell &cell = layout.cell (path.back ());
db::properties_id_type prop_id = cell.prop_id ();
lay::UserPropertiesForm props_form (view ()->widget ());
lay::UserPropertiesForm props_form (parent ());
if (props_form.show (view (), cv_index, prop_id)) {
view ()->transaction (tl::to_string (tr ("Edit cell's user properties")));
@ -464,7 +484,7 @@ LayoutViewFunctions::cm_cell_replace ()
}
lay::ReplaceCellOptionsDialog mode_dialog (view ()->widget ());
lay::ReplaceCellOptionsDialog mode_dialog (parent ());
db::cell_index_type with_cell = paths.front ().back ();
int mode = needs_to_ask ? m_del_cell_mode : 0;
@ -652,7 +672,7 @@ LayoutViewFunctions::cm_cell_delete ()
mode = 0;
}
lay::DeleteCellModeDialog mode_dialog (view ()->widget ());
lay::DeleteCellModeDialog mode_dialog (parent ());
if (! needs_to_ask || mode_dialog.exec_dialog (mode)) {
if (needs_to_ask) {
@ -775,7 +795,7 @@ LayoutViewFunctions::cm_cell_flatten ()
}
}
FlattenInstOptionsDialog options_dialog (view ()->widget ());
FlattenInstOptionsDialog options_dialog (parent ());
int flatten_insts_levels = -1;
bool prune = true;
@ -857,7 +877,7 @@ LayoutViewFunctions::cm_cell_rename ()
if (cv_index >= 0 && path.size () > 0) {
lay::RenameCellDialog name_dialog (view ()->widget ());
lay::RenameCellDialog name_dialog (parent ());
db::Layout &layout = view ()->cellview (cv_index)->layout ();
std::string name (layout.cell_name (path.back ()));
@ -1207,7 +1227,7 @@ LayoutViewFunctions::cm_new_cell ()
static double s_new_cell_window_size = 2.0;
static std::string s_new_cell_cell_name;
NewCellPropertiesDialog cell_prop_dia (view ()->widget ());
NewCellPropertiesDialog cell_prop_dia (parent ());
if (cell_prop_dia.exec_dialog (& cv->layout (), s_new_cell_cell_name, s_new_cell_window_size)) {
db::cell_index_type new_ci = view ()->new_cell (view ()->active_cellview_index (), s_new_cell_cell_name.c_str ());
@ -1270,7 +1290,7 @@ LayoutViewFunctions::cm_reload ()
bool can_reload = true;
if (dirty_layouts != 0) {
QMessageBox mbox (view ()->widget ());
QMessageBox mbox (parent ());
mbox.setText (tl::to_qstring (tl::to_string (tr ("The following layouts need saving:\n\n")) + dirty_files + "\n\nPress 'Reload Without Saving' to reload anyhow and discard changes."));
mbox.setWindowTitle (tr ("Save Needed"));
mbox.setIcon (QMessageBox::Warning);
@ -1323,7 +1343,7 @@ LayoutViewFunctions::transform_layout (const db::DCplxTrans &tr_mic)
}
if (has_proxy &&
QMessageBox::question (view ()->widget (),
QMessageBox::question (parent (),
tr ("Transforming PCells Or Library Cells"),
tr ("The layout contains PCells or library cells or both.\n"
"Any changes to such cells may be lost when their layout is refreshed later.\n"
@ -1410,7 +1430,7 @@ LayoutViewFunctions::cm_lay_scale ()
void
LayoutViewFunctions::cm_lay_move ()
{
lay::MoveOptionsDialog options (view ()->widget ());
lay::MoveOptionsDialog options (parent ());
if (options.exec_dialog (m_move_dist)) {
transform_layout (db::DCplxTrans (m_move_dist));
}
@ -1530,7 +1550,7 @@ LayoutViewFunctions::cm_sel_move_to ()
double y = sel_bbox.bottom () + (sel_bbox.height () * (1 + m_move_to_origin_mode_y) * 0.5);
db::DPoint move_target (x, y);
lay::MoveToOptionsDialog options (view ()->widget ());
lay::MoveToOptionsDialog options (parent ());
if (options.exec_dialog (m_move_to_origin_mode_x, m_move_to_origin_mode_y, move_target)) {
x = sel_bbox.left () + (sel_bbox.width () * (1 + m_move_to_origin_mode_x) * 0.5);
@ -1544,7 +1564,7 @@ LayoutViewFunctions::cm_sel_move_to ()
void
LayoutViewFunctions::cm_sel_move ()
{
lay::MoveOptionsDialog options (view ()->widget ());
lay::MoveOptionsDialog options (parent ());
if (options.exec_dialog (m_move_dist)) {
do_transform (db::DCplxTrans (m_move_dist));
}
@ -1578,7 +1598,7 @@ LayoutViewFunctions::cm_copy_layer ()
}
lay::DuplicateLayerDialog dialog (view ()->widget ());
lay::DuplicateLayerDialog dialog (parent ());
if (dialog.exec_dialog (view (), m_copy_cva, m_copy_layera, m_copy_cvr, m_copy_layerr, m_duplicate_hier_mode, m_clear_before)) {
bool supports_undo = true;
@ -1738,7 +1758,7 @@ LayoutViewFunctions::cm_new_layer ()
const lay::CellView &cv = view ()->cellview (index);
lay::NewLayerPropertiesDialog prop_dia (view ()->widget ());
lay::NewLayerPropertiesDialog prop_dia (parent ());
if (prop_dia.exec_dialog (cv, m_new_layer_props)) {
for (unsigned int l = 0; l < cv->layout ().layers (); ++l) {
@ -1776,7 +1796,7 @@ LayoutViewFunctions::cm_align_cell_origin ()
throw tl::Exception (tl::to_string (tr ("Cannot use this function on a PCell or library cell")));
}
lay::AlignCellOptionsDialog dialog (view ()->widget ());
lay::AlignCellOptionsDialog dialog (parent ());
if (dialog.exec_dialog (m_align_cell_options)) {
view ()->clear_selection ();
@ -1877,7 +1897,7 @@ LayoutViewFunctions::cm_edit_layer ()
db::LayerProperties layer_props = layout.get_properties ((unsigned int) sel->layer_index ());
db::LayerProperties old_props = layer_props;
lay::NewLayerPropertiesDialog prop_dia (view ()->widget ());
lay::NewLayerPropertiesDialog prop_dia (parent ());
if (prop_dia.exec_dialog (cv, layer_props)) {
for (unsigned int l = 0; l < layout.layers (); ++l) {
@ -2020,7 +2040,7 @@ LayoutViewFunctions::cm_clear_layer ()
throw tl::Exception (tl::to_string (tr ("No layer selected for clearing")));
}
lay::ClearLayerModeDialog mode_dialog (view ()->widget ());
lay::ClearLayerModeDialog mode_dialog (parent ());
if (mode_dialog.exec_dialog (m_layer_hier_mode)) {
view ()->cancel_edits ();

View File

@ -44,6 +44,7 @@ namespace gsi
{
#if defined(HAVE_QTBINDINGS)
static lay::LayoutViewWidget *new_view_widget (QWidget *parent, bool editable, db::Manager *manager, unsigned int options)
{
lay::LayoutViewWidget *lv = new lay::LayoutViewWidget (manager, editable, 0 /*plugin parent*/, parent, options);
@ -56,7 +57,7 @@ static lay::LayoutViewWidget *new_view_widget (QWidget *parent, bool editable, d
static lay::LayoutView *get_view (lay::LayoutViewWidget *lv)
{
return lv;
return lv->view ();
}
static QWidget *layer_control_frame (lay::LayoutViewWidget *lv)
@ -86,7 +87,7 @@ Class<lay::LayoutViewWidget> decl_LayoutViewWidget (QT_EXTERNAL_BASE (QFrame) "l
"@param parent The parent widget in which to embed the view\n"
"@param editable True to make the view editable\n"
"@param manager The \\Manager object to enable undo/redo\n"
"@param options A combination of the values in the LV_... constants\n"
"@param options A combination of the values in the LV_... constants from \\LayoutView\n"
"\n"
"This constructor has been introduced in version 0.25.\n"
"It has been enhanced with the arguments in version 0.27.\n"

View File

@ -93,22 +93,34 @@ namespace lay
{
// -------------------------------------------------------------
// LayoutViewFrame implementation
// LayoutViewWidget implementation
LayoutViewFrame::LayoutViewFrame (QWidget *parent, lay::LayoutView *view)
: QFrame (parent), mp_view (view)
LayoutViewWidget::LayoutViewWidget (db::Manager *mgr, bool editable, lay::Plugin *plugin_parent, QWidget *parent, unsigned int options)
: QFrame (parent)
{
// .. nothing yet ..
mp_view = new LayoutView (mgr, editable, plugin_parent, this, options);
}
LayoutViewWidget::LayoutViewWidget (lay::LayoutView *source, db::Manager *mgr, bool editable, lay::Plugin *plugin_parent, QWidget *parent, unsigned int options)
: QFrame (parent)
{
mp_view = new LayoutView (source, mgr, editable, plugin_parent, this, options);
}
LayoutViewWidget::~LayoutViewWidget ()
{
delete mp_view;
mp_view = 0;
}
QSize
LayoutViewFrame::sizeHint () const
LayoutViewWidget::sizeHint () const
{
return mp_view->size_hint ();
}
bool
LayoutViewFrame::eventFilter(QObject *obj, QEvent *event)
LayoutViewWidget::eventFilter(QObject *obj, QEvent *event)
{
bool taken = false;
bool res = mp_view->event_filter (obj, event, taken);
@ -119,16 +131,41 @@ LayoutViewFrame::eventFilter(QObject *obj, QEvent *event)
}
}
void LayoutViewFrame::showEvent (QShowEvent *)
void LayoutViewWidget::showEvent (QShowEvent *)
{
mp_view->show_event ();
}
void LayoutViewFrame::hideEvent (QHideEvent *)
void LayoutViewWidget::hideEvent (QHideEvent *)
{
mp_view->hide_event ();
}
QWidget *LayoutViewWidget::layer_control_frame ()
{
return view ()->layer_control_frame ();
}
QWidget *LayoutViewWidget::hierarchy_control_frame ()
{
return view ()->hierarchy_control_frame ();
}
QWidget *LayoutViewWidget::libraries_frame ()
{
return view ()->libraries_frame ();
}
QWidget *LayoutViewWidget::bookmarks_frame ()
{
return view ()->bookmarks_frame ();
}
QWidget *LayoutViewWidget::editor_options_frame ()
{
return view ()->editor_options_frame ();
}
// -------------------------------------------------------------
// LayoutViewConnector implementation
@ -224,7 +261,7 @@ LayoutView::LayoutView (lay::LayoutView *source, db::Manager *manager, bool edit
LayoutView::set_active_cellview_index (source->active_cellview_index ());
}
LayoutView::LayoutView (db::Manager *manager, bool editable, lay::Plugin *plugin_parent, LayoutViewFrame *widget, unsigned int options)
LayoutView::LayoutView (db::Manager *manager, bool editable, lay::Plugin *plugin_parent, LayoutViewWidget *widget, unsigned int options)
: LayoutViewBase (this, manager, editable, plugin_parent, options),
mp_widget (widget),
dm_setup_editor_option_pages (this, &LayoutView::do_setup_editor_options_pages)
@ -235,7 +272,7 @@ LayoutView::LayoutView (db::Manager *manager, bool editable, lay::Plugin *plugin
init_ui ();
}
LayoutView::LayoutView (lay::LayoutView *source, db::Manager *manager, bool editable, lay::Plugin *plugin_parent, LayoutViewFrame *widget, unsigned int options)
LayoutView::LayoutView (lay::LayoutView *source, db::Manager *manager, bool editable, lay::Plugin *plugin_parent, LayoutViewWidget *widget, unsigned int options)
: LayoutViewBase (this, source, manager, editable, plugin_parent, options),
mp_widget (widget),
dm_setup_editor_option_pages (this, &LayoutView::do_setup_editor_options_pages)
@ -423,6 +460,11 @@ LayoutView::~LayoutView ()
close ();
}
QWidget *LayoutView::widget ()
{
return mp_widget;
}
void LayoutView::close()
{
close_event ();
@ -465,6 +507,18 @@ void LayoutView::close()
mp_bookmarks_view = 0;
}
void
LayoutView::finish ()
{
if (dispatcher () == this) {
set_menu_parent_widget (mp_widget);
init_menu ();
if (mp_widget) {
menu ()->build (0, 0);
}
}
}
void
LayoutView::do_change_active_cellview ()
{

View File

@ -72,6 +72,7 @@ namespace db {
namespace lay {
class LayoutViewWidget;
class AbstractMenu;
class LayerControlPanel;
class HierarchyControlPanel;
@ -86,88 +87,6 @@ class ColorButton;
class ConfigureAction;
class EditorOptionsPages;
/**
* @brief A custom QFrame that acts as the central widget for the LayoutView
*/
class LAYVIEW_PUBLIC LayoutViewFrame
: public QFrame
{
Q_OBJECT
public:
LayoutViewFrame (QWidget *parent, lay::LayoutView *view);
virtual QSize sizeHint () const;
virtual bool eventFilter(QObject *obj, QEvent *event);
virtual void showEvent (QShowEvent *);
virtual void hideEvent (QHideEvent *);
void emit_title_changed (lay::LayoutView *view) { emit title_changed (view); }
void emit_dirty_changed (lay::LayoutView *view) { emit dirty_changed (view); }
void emit_show_message (const std::string &s, int ms) { emit show_message (s, ms); }
void emit_current_pos_changed (double x, double y, bool dbu_units) { emit current_pos_changed (x, y, dbu_units); }
void emit_clear_current_pos () { emit clear_current_pos (); }
void emit_edits_enabled_changed () { emit edits_enabled_changed (); }
void emit_mode_change (int m) { emit mode_change (m); }
void emit_current_layer_changed (const lay::LayerPropertiesConstIterator &l) { emit current_layer_changed (l); }
void emit_menu_needs_update () { emit menu_needs_update (); }
void emit_layer_order_changed () { emit layer_order_changed (); }
signals:
/**
* @brief This signal is emitted when the title changes
*/
void title_changed (lay::LayoutView *view);
/**
* @brief This signal is emitted when the "dirty" flag changes
*/
void dirty_changed (lay::LayoutView *view);
/**
* @brief This signal is emitted when the view wants to show a message for the given time (of infinitely for ms == 0)
*/
void show_message (const std::string &s, int ms);
/**
* @brief This signal is emitted when the view wants to indicate a mouse position change
*/
void current_pos_changed (double x, double y, bool dbu_units);
/**
* @brief This signal is emitted when the view wants to clear the mouse position
*/
void clear_current_pos ();
/**
* @brief This signal is sent when the "edits_enabled" state has changed
*/
void edits_enabled_changed ();
/**
* @brief This signal is sent when the view wants to update the menu
*/
void menu_needs_update ();
/**
* @brief The view initiated a mode change
*/
void mode_change (int m);
/**
* @brief The current layer changed
*/
void current_layer_changed (const lay::LayerPropertiesConstIterator &l);
/**
* @brief The layer order has changed
*/
void layer_order_changed ();
private:
LayoutView *mp_view;
};
/**
* @brief An object connecting child widget signals with methods from LayoutView
*/
@ -225,6 +144,11 @@ public:
*/
~LayoutView ();
/**
* @brief Gets the widget object that view is embedded in
*/
QWidget *widget ();
/**
* @brief Makes this view the current one
*/
@ -439,14 +363,6 @@ public:
*/
virtual lay::EditorOptionsPages *editor_options_pages ();
/**
* @brief Gets the container with the layer control panel
*/
QWidget *layer_control_frame ()
{
return mp_control_frame;
}
/**
* @brief Gets the layer control panel
*/
@ -455,14 +371,6 @@ public:
return mp_control_panel;
}
/**
* @brief Gets the container with the hierarchy control panel
*/
QWidget *hierarchy_control_frame ()
{
return mp_hierarchy_frame;
}
/**
* @brief Gets the hierarchy panel
*/
@ -471,30 +379,6 @@ public:
return mp_hierarchy_panel;
}
/**
* @brief Gets the container with the libraries view
*/
QWidget *libraries_frame ()
{
return mp_libraries_frame;
}
/**
* @brief Gets the container with the bookmarks view
*/
QWidget *bookmarks_frame ()
{
return mp_bookmarks_frame;
}
/**
* @brief Gets the container with the editor options
*/
QWidget *editor_options_frame ()
{
return mp_editor_options_frame;
}
/**
* @brief Resizes the view to the given width and height in pixels
*/
@ -519,16 +403,6 @@ public:
*/
virtual void cut ();
/**
* @brief Gets the widget object
*
* This pointer may be 0 if the layout view is created in a headless environment.
*/
virtual QWidget *widget ()
{
return mp_widget;
}
/**
* @brief An event signalling that the view is going to close
*/
@ -712,10 +586,10 @@ public:
private:
friend class LayoutViewSignalConnector;
friend class LayoutViewFrame;
friend class LayoutViewWidget;
QTimer *mp_timer;
LayoutViewFrame *mp_widget;
LayoutViewWidget *mp_widget;
LayoutViewSignalConnector *mp_connector;
bool m_activated;
QFrame *mp_left_frame;
@ -748,16 +622,22 @@ private:
void init_ui ();
void do_setup_editor_options_pages ();
QWidget *layer_control_frame () { return mp_control_frame; }
QWidget *hierarchy_control_frame () { return mp_hierarchy_frame; }
QWidget *libraries_frame () { return mp_libraries_frame; }
QWidget *bookmarks_frame () { return mp_bookmarks_frame; }
QWidget *editor_options_frame () { return mp_editor_options_frame; }
protected:
/**
* @brief Constructor with widget
*/
LayoutView (db::Manager *mgr, bool editable, lay::Plugin *plugin_parent, LayoutViewFrame *widget, unsigned int options = (unsigned int) LV_Normal);
LayoutView (db::Manager *mgr, bool editable, lay::Plugin *plugin_parent, LayoutViewWidget *widget, unsigned int options = (unsigned int) LV_Normal);
/**
* @brief Constructor (clone from another view) with widget
*/
LayoutView (lay::LayoutView *source, db::Manager *mgr, bool editable, lay::Plugin *plugin_parent, LayoutViewFrame *widget, unsigned int options = (unsigned int) LV_Normal);
LayoutView (lay::LayoutView *source, db::Manager *mgr, bool editable, lay::Plugin *plugin_parent, LayoutViewWidget *widget, unsigned int options = (unsigned int) LV_Normal);
void activate ();
void deactivate ();
@ -765,6 +645,7 @@ protected:
virtual bool configure (const std::string &name, const std::string &value);
virtual void config_finalize ();
virtual void finish ();
virtual tl::Color default_background_color ();
virtual void do_set_background_color (tl::Color color, tl::Color contrast);
virtual void do_paste ();
@ -797,28 +678,139 @@ private:
* but only created if a QApplication is present.
*/
class LAYVIEW_PUBLIC LayoutViewWidget
: public LayoutViewFrame, public LayoutView
: public QFrame, public gsi::ObjectBase
{
Q_OBJECT
public:
/**
* @brief Constructor
*/
LayoutViewWidget (db::Manager *mgr, bool editable, lay::Plugin *plugin_parent, QWidget *parent = 0, unsigned int options = (unsigned int) LV_Normal)
: LayoutViewFrame (parent, this), LayoutView (mgr, editable, plugin_parent, this, options)
{
// .. nothing yet ..
}
LayoutViewWidget (db::Manager *mgr, bool editable, lay::Plugin *plugin_parent, QWidget *parent = 0, unsigned int options = (unsigned int) LayoutView::LV_Normal);
/**
* @brief Constructor (clone from another view)
*/
LayoutViewWidget (lay::LayoutView *source, db::Manager *mgr, bool editable, lay::Plugin *plugin_parent, QWidget *parent = 0, unsigned int options = (unsigned int) LV_Normal)
: LayoutViewFrame (parent, this), LayoutView (source, mgr, editable, plugin_parent, this, options)
LayoutViewWidget (lay::LayoutView *source, db::Manager *mgr, bool editable, lay::Plugin *plugin_parent, QWidget *parent = 0, unsigned int options = (unsigned int) LayoutView::LV_Normal);
/**
* @brief Destructor
*/
~LayoutViewWidget ();
/**
* @brief Gets the LayoutView embedded into this widget
*/
lay::LayoutView *view ()
{
// .. nothing yet ..
return mp_view;
}
virtual QSize sizeHint () const;
virtual bool eventFilter(QObject *obj, QEvent *event);
virtual void showEvent (QShowEvent *);
virtual void hideEvent (QHideEvent *);
void emit_title_changed (lay::LayoutView *view) { emit title_changed (view); }
void emit_dirty_changed (lay::LayoutView *view) { emit dirty_changed (view); }
void emit_show_message (const std::string &s, int ms) { emit show_message (s, ms); }
void emit_current_pos_changed (double x, double y, bool dbu_units) { emit current_pos_changed (x, y, dbu_units); }
void emit_clear_current_pos () { emit clear_current_pos (); }
void emit_edits_enabled_changed () { emit edits_enabled_changed (); }
void emit_mode_change (int m) { emit mode_change (m); }
void emit_current_layer_changed (const lay::LayerPropertiesConstIterator &l) { emit current_layer_changed (l); }
void emit_menu_needs_update () { emit menu_needs_update (); }
void emit_layer_order_changed () { emit layer_order_changed (); }
/**
* @brief Gets the container with the layer control panel
*/
QWidget *layer_control_frame ();
/**
* @brief Gets the container with the hierarchy control panel
*/
QWidget *hierarchy_control_frame ();
/**
* @brief Gets the container with the libraries view
*/
QWidget *libraries_frame ();
/**
* @brief Gets the container with the bookmarks view
*/
QWidget *bookmarks_frame ();
/**
* @brief Gets the container with the editor options
*/
QWidget *editor_options_frame ();
signals:
/**
* @brief This signal is emitted when the title changes
*/
void title_changed (lay::LayoutView *view);
/**
* @brief This signal is emitted when the "dirty" flag changes
*/
void dirty_changed (lay::LayoutView *view);
/**
* @brief This signal is emitted when the view wants to show a message for the given time (of infinitely for ms == 0)
*/
void show_message (const std::string &s, int ms);
/**
* @brief This signal is emitted when the view wants to indicate a mouse position change
*/
void current_pos_changed (double x, double y, bool dbu_units);
/**
* @brief This signal is emitted when the view wants to clear the mouse position
*/
void clear_current_pos ();
/**
* @brief This signal is sent when the "edits_enabled" state has changed
*/
void edits_enabled_changed ();
/**
* @brief This signal is sent when the view wants to update the menu
*/
void menu_needs_update ();
/**
* @brief The view initiated a mode change
*/
void mode_change (int m);
/**
* @brief The current layer changed
*/
void current_layer_changed (const lay::LayerPropertiesConstIterator &l);
/**
* @brief The layer order has changed
*/
void layer_order_changed ();
private:
LayoutView *mp_view;
};
/**
* @brief Gets the container widget for a LayoutViewBase object
*/
inline QWidget *widget_from_view (lay::LayoutViewBase *view_base)
{
lay::LayoutView *view = dynamic_cast<lay::LayoutView *> (view_base);
return view ? view->widget () : 0;
}
}
#endif

View File

@ -27,6 +27,7 @@
#include "layPlugin.h"
#include "layTipDialog.h"
#include "layLayoutViewBase.h"
#include "layMainWindow.h"
#include "dbShapeProcessor.h"
@ -35,6 +36,11 @@
namespace lay
{
static QWidget *parent_widget ()
{
return lay::MainWindow::instance ();
}
class BooleanOperationsPlugin
: public lay::Plugin
{
@ -100,7 +106,7 @@ public:
}
lay::BooleanOptionsDialog dialog (mp_view->widget ());
lay::BooleanOptionsDialog dialog (parent_widget ());
if (dialog.exec_dialog (mp_view, m_boolean_cva, m_boolean_layera, m_boolean_cvb, m_boolean_layerb, m_boolean_cvr, m_boolean_layerr, m_boolean_mode, m_boolean_hier_mode, m_boolean_mincoh)) {
mp_view->cancel ();
@ -237,7 +243,7 @@ public:
}
lay::MergeOptionsDialog dialog (mp_view->widget ());
lay::MergeOptionsDialog dialog (parent_widget ());
if (dialog.exec_dialog (mp_view, m_boolean_cva, m_boolean_layera, m_boolean_cvr, m_boolean_layerr, m_boolean_minwc, m_boolean_hier_mode, m_boolean_mincoh)) {
mp_view->cancel ();
@ -352,7 +358,7 @@ public:
}
lay::SizingOptionsDialog dialog (mp_view->widget ());
lay::SizingOptionsDialog dialog (parent_widget ());
if (dialog.exec_dialog (mp_view, m_boolean_cva, m_boolean_layera, m_boolean_cvr, m_boolean_layerr, m_boolean_sizex, m_boolean_sizey, m_boolean_size_mode, m_boolean_hier_mode, m_boolean_mincoh)) {
mp_view->cancel ();