WIP: recent options for paths - now update on layer style change, some bug fixes, change of current layer will immediately change the drawing layer.

This commit is contained in:
Matthias Koefferlein 2020-08-18 21:09:05 +02:00
parent 59d66676b0
commit 77ef3e049b
9 changed files with 143 additions and 26 deletions

View File

@ -462,7 +462,9 @@ commit_recent (lay::LayoutView *view)
} }
for (std::vector<edt::EditorOptionsPage *>::const_iterator op = eo_pages->pages ().begin (); op != eo_pages->pages ().end (); ++op) { for (std::vector<edt::EditorOptionsPage *>::const_iterator op = eo_pages->pages ().begin (); op != eo_pages->pages ().end (); ++op) {
(*op)->commit_recent (view); if ((*op)->active ()) {
(*op)->commit_recent (view);
}
} }
} }

View File

@ -55,6 +55,7 @@ RecentConfigurationPage::init ()
ly->addWidget (mp_tree_widget); ly->addWidget (mp_tree_widget);
connect (mp_tree_widget, SIGNAL (itemClicked (QTreeWidgetItem *, int)), this, SLOT (item_clicked (QTreeWidgetItem *))); connect (mp_tree_widget, SIGNAL (itemClicked (QTreeWidgetItem *, int)), this, SLOT (item_clicked (QTreeWidgetItem *)));
mp_view->layer_list_changed_event.add (this, &RecentConfigurationPage::layers_changed);
mp_tree_widget->setColumnCount (int (m_cfg.size ())); mp_tree_widget->setColumnCount (int (m_cfg.size ()));
@ -165,23 +166,32 @@ RecentConfigurationPage::render_to (QTreeWidgetItem *item, int column, const std
case RecentConfigurationPage::Layer: case RecentConfigurationPage::Layer:
{ {
// @@@ TODO: icons should be updated if style changes?
int icon_size = mp_view->style ()->pixelMetric (QStyle::PM_ButtonIconSize); int icon_size = mp_view->style ()->pixelMetric (QStyle::PM_ButtonIconSize);
lay::LayerPropertiesConstIterator l = lp_iter_from_string (mp_view, values [column]); lay::LayerPropertiesConstIterator l = lp_iter_from_string (mp_view, values [column]);
if (! l.at_end ()) { if (! l.is_null () && ! l.at_end ()) {
item->setIcon (column, lay::LayerTreeModel::icon_for_layer (l, mp_view, icon_size, icon_size, 0, true)); item->setIcon (column, lay::LayerTreeModel::icon_for_layer (l, mp_view, icon_size, icon_size, 0, true));
item->setText (column, tl::to_qstring (values [column]));
} else {
item->setIcon (column, QIcon ());
item->setText (column, tl::to_qstring ("(" + values [column] + ")"));
} }
item->setText (column, tl::to_qstring (values [column]));
} }
break; break;
case RecentConfigurationPage::Int: case RecentConfigurationPage::Int:
case RecentConfigurationPage::Double: case RecentConfigurationPage::Double:
case RecentConfigurationPage::Text: case RecentConfigurationPage::Text:
case RecentConfigurationPage::CellLibraryName:
item->setText (column, tl::to_qstring (values [column])); item->setText (column, tl::to_qstring (values [column]));
break; break;
case RecentConfigurationPage::CellLibraryName:
if (values [column].empty ()) {
item->setText (column, tr ("(local)"));
} else {
item->setText (column, tl::to_qstring (values [column]));
}
break;
case RecentConfigurationPage::IntIfArray: case RecentConfigurationPage::IntIfArray:
case RecentConfigurationPage::DoubleIfArray: case RecentConfigurationPage::DoubleIfArray:
{ {
@ -262,6 +272,12 @@ RecentConfigurationPage::render_to (QTreeWidgetItem *item, int column, const std
} }
void
RecentConfigurationPage::layers_changed (int)
{
update_list (get_stored_values ());
}
void void
RecentConfigurationPage::update_list (const std::list<std::vector<std::string> > &stored_values) RecentConfigurationPage::update_list (const std::list<std::vector<std::string> > &stored_values)
{ {
@ -333,7 +349,7 @@ RecentConfigurationPage::commit_recent (lay::Dispatcher *root)
std::string s; std::string s;
if (mp_view->current_layer ()->is_visual ()) { if (!(mp_view->current_layer ().is_null () || mp_view->current_layer ().at_end ()) && mp_view->current_layer ()->is_visual ()) {
int cv_index = mp_view->current_layer ()->cellview_index (); int cv_index = mp_view->current_layer ()->cellview_index ();
const lay::CellView &cv = mp_view->cellview (cv_index); const lay::CellView &cv = mp_view->cellview (cv_index);

View File

@ -25,6 +25,7 @@
#define HDR_edtRecentConfigurationPage #define HDR_edtRecentConfigurationPage
#include "edtEditorOptionsPage.h" #include "edtEditorOptionsPage.h"
#include "tlObject.h"
#include <list> #include <list>
#include <QTreeWidget> #include <QTreeWidget>
@ -45,7 +46,7 @@ class EditorOptionsPages;
* @brief The base class for a object properties page * @brief The base class for a object properties page
*/ */
class RecentConfigurationPage class RecentConfigurationPage
: public EditorOptionsPage : public EditorOptionsPage, public tl::Object
{ {
Q_OBJECT Q_OBJECT
@ -104,6 +105,7 @@ private:
std::list<std::vector<std::string> > get_stored_values () const; std::list<std::vector<std::string> > get_stored_values () const;
void set_stored_values (const std::list<std::vector<std::string> > &values) const; void set_stored_values (const std::list<std::vector<std::string> > &values) const;
void render_to (QTreeWidgetItem *item, int column, const std::vector<std::string> &values, RecentConfigurationPage::ConfigurationRendering rendering); void render_to (QTreeWidgetItem *item, int column, const std::vector<std::string> &values, RecentConfigurationPage::ConfigurationRendering rendering);
void layers_changed (int);
}; };
} }

View File

@ -51,7 +51,7 @@ ShapeEditService::ShapeEditService (db::Manager *manager, lay::LayoutView *view,
: edt::Service (manager, view, shape_types), : edt::Service (manager, view, shape_types),
m_layer (0), m_cv_index (0), mp_cell (0), mp_layout (0), m_combine_mode (CM_Add) m_layer (0), m_cv_index (0), mp_cell (0), mp_layout (0), m_combine_mode (CM_Add)
{ {
// .. nothing yet .. view->current_layer_changed_event.add (this, &ShapeEditService::update_edit_layer);
} }
bool bool
@ -74,13 +74,6 @@ ShapeEditService::get_edit_layer ()
throw tl::Exception (tl::to_string (QObject::tr ("Please select a layer first"))); throw tl::Exception (tl::to_string (QObject::tr ("Please select a layer first")));
} }
if (! cl->visible (true)) {
lay::TipDialog td (QApplication::activeWindow (),
tl::to_string (QObject::tr ("You are about to draw on a hidden layer. The result won't be visible.")),
"drawing-on-invisible-layer");
td.exec_dialog ();
}
int cv_index = cl->cellview_index (); int cv_index = cl->cellview_index ();
const lay::CellView &cv = view ()->cellview (cv_index); const lay::CellView &cv = view ()->cellview (cv_index);
int layer = cl->layer_index (); int layer = cl->layer_index ();
@ -89,6 +82,13 @@ ShapeEditService::get_edit_layer ()
throw tl::Exception (tl::to_string (QObject::tr ("Please select a cell first"))); throw tl::Exception (tl::to_string (QObject::tr ("Please select a cell first")));
} }
if (! cl->visible (true)) {
lay::TipDialog td (QApplication::activeWindow (),
tl::to_string (QObject::tr ("You are about to draw on a hidden layer. The result won't be visible.")),
"drawing-on-invisible-layer");
td.exec_dialog ();
}
if (layer < 0 || ! cv->layout ().is_valid_layer ((unsigned int) layer)) { if (layer < 0 || ! cv->layout ().is_valid_layer ((unsigned int) layer)) {
if (cl->has_children ()) { if (cl->has_children ()) {
@ -129,6 +129,69 @@ ShapeEditService::get_edit_layer ()
} }
} }
void
ShapeEditService::update_edit_layer (const lay::LayerPropertiesConstIterator &cl)
{
if (! editing ()) {
return;
}
if (cl.is_null () || cl->has_children ()) {
return;
}
int cv_index = cl->cellview_index ();
const lay::CellView &cv = view ()->cellview (cv_index);
int layer = cl->layer_index ();
if (cv_index < 0 || ! cv.is_valid ()) {
return;
}
if (cv->layout ().cell (cv.cell_index ()).is_proxy ()) {
return;
}
if (! cl->visible (true)) {
lay::TipDialog td (QApplication::activeWindow (),
tl::to_string (QObject::tr ("You are now drawing on a hidden layer. The result won't be visible.")),
"drawing-on-invisible-layer");
td.exec_dialog ();
}
if (layer < 0 || ! cv->layout ().is_valid_layer ((unsigned int) layer)) {
// create this layer now
const lay::ParsedLayerSource &source = cl->source (true /*real*/);
db::LayerProperties db_lp;
if (source.has_name ()) {
db_lp.name = source.name ();
}
db_lp.layer = source.layer ();
db_lp.datatype = source.datatype ();
cv->layout ().insert_layer (db_lp);
// update the layer index inside the layer view
cl->realize_source ();
// Hint: we could have taken the new index from insert_layer, but this
// is a nice test:
layer = cl->layer_index ();
tl_assert (layer >= 0);
}
m_layer = (unsigned int) layer;
m_cv_index = (unsigned int) cv_index;
m_trans = (cl->trans ().front () * db::CplxTrans (cv->layout ().dbu ()) * cv.context_trans ()).inverted ();
mp_layout = &(cv->layout ());
mp_cell = &(mp_layout->cell (cv.cell_index ()));
current_layer_changed ();
}
void void
ShapeEditService::tap (const db::DPoint &initial) ShapeEditService::tap (const db::DPoint &initial)
{ {

View File

@ -66,6 +66,7 @@ protected:
void deliver_shape (const db::Polygon &poly); void deliver_shape (const db::Polygon &poly);
void deliver_shape (const db::Path &path); void deliver_shape (const db::Path &path);
void deliver_shape (const db::Box &box); void deliver_shape (const db::Box &box);
virtual void current_layer_changed () { }
private: private:
db::VCplxTrans m_trans; db::VCplxTrans m_trans;
@ -74,6 +75,8 @@ private:
db::Cell *mp_cell; db::Cell *mp_cell;
db::Layout *mp_layout; db::Layout *mp_layout;
combine_mode_type m_combine_mode; combine_mode_type m_combine_mode;
void update_edit_layer (const lay::LayerPropertiesConstIterator &iter);
}; };
/** /**

View File

@ -299,17 +299,12 @@ LayerControlPanel::LayerControlPanel (lay::LayoutView *view, db::Manager *manage
mp_model->set_font (mp_layer_list->font ()); mp_model->set_font (mp_layer_list->font ());
mp_layer_list->setIconSize (mp_model->icon_size ()); mp_layer_list->setIconSize (mp_model->icon_size ());
/*
* At least with Qt 4.2.x setting uniform row heights has a strange side effect:
* If a range is selected and the first selection is scrolled out of view, the
* range does not include the first element after having clicked at the second.
mp_layer_list->setUniformRowHeights (true);
*/
l->addWidget (mp_layer_list); l->addWidget (mp_layer_list);
connect (mp_layer_list, SIGNAL (double_clicked (const QModelIndex &, Qt::KeyboardModifiers)), this, SLOT (double_clicked (const QModelIndex &, Qt::KeyboardModifiers))); connect (mp_layer_list, SIGNAL (double_clicked (const QModelIndex &, Qt::KeyboardModifiers)), this, SLOT (double_clicked (const QModelIndex &, Qt::KeyboardModifiers)));
connect (mp_layer_list, SIGNAL (collapsed (const QModelIndex &)), this, SLOT (group_collapsed (const QModelIndex &))); connect (mp_layer_list, SIGNAL (collapsed (const QModelIndex &)), this, SLOT (group_collapsed (const QModelIndex &)));
connect (mp_layer_list, SIGNAL (expanded (const QModelIndex &)), this, SLOT (group_expanded (const QModelIndex &))); connect (mp_layer_list, SIGNAL (expanded (const QModelIndex &)), this, SLOT (group_expanded (const QModelIndex &)));
connect (mp_layer_list, SIGNAL (search_triggered (const QString &)), this, SLOT (search_triggered (const QString &))); connect (mp_layer_list, SIGNAL (search_triggered (const QString &)), this, SLOT (search_triggered (const QString &)));
connect (mp_layer_list->selectionModel (), SIGNAL (currentChanged (const QModelIndex &, const QModelIndex &)), this, SLOT (current_index_changed (const QModelIndex &)));
mp_layer_list->setContextMenuPolicy (Qt::CustomContextMenu); mp_layer_list->setContextMenuPolicy (Qt::CustomContextMenu);
connect (mp_layer_list, SIGNAL(customContextMenuRequested (const QPoint &)), this, SLOT (context_menu (const QPoint &))); connect (mp_layer_list, SIGNAL(customContextMenuRequested (const QPoint &)), this, SLOT (context_menu (const QPoint &)));
mp_layer_list->header ()->hide (); mp_layer_list->header ()->hide ();
@ -2041,6 +2036,17 @@ LayerControlPanel::update_required (int f)
m_do_update_content_dm (); m_do_update_content_dm ();
} }
void
LayerControlPanel::current_index_changed (const QModelIndex &index)
{
lay::LayerPropertiesConstIterator iter = mp_model->iterator (index);
if (! iter.is_null () && ! iter.at_end ()) {
emit current_layer_changed (iter);
} else {
emit current_layer_changed (lay::LayerPropertiesConstIterator ());
}
}
void void
LayerControlPanel::group_collapsed (const QModelIndex &index) LayerControlPanel::group_collapsed (const QModelIndex &index)
{ {

View File

@ -284,6 +284,7 @@ public:
signals: signals:
void order_changed (); void order_changed ();
void tab_changed (); void tab_changed ();
void current_layer_changed (const lay::LayerPropertiesConstIterator &iter);
public slots: public slots:
void cm_new_tab (); void cm_new_tab ();
@ -321,6 +322,7 @@ public slots:
void tab_context_menu (const QPoint &pt); void tab_context_menu (const QPoint &pt);
void group_collapsed (const QModelIndex &index); void group_collapsed (const QModelIndex &index);
void group_expanded (const QModelIndex &index); void group_expanded (const QModelIndex &index);
void current_index_changed (const QModelIndex &index);
void up_clicked (); void up_clicked ();
void upup_clicked (); void upup_clicked ();
void down_clicked (); void down_clicked ();

View File

@ -595,6 +595,7 @@ LayoutView::init (db::Manager *mgr, QWidget * /*parent*/)
connect (mp_control_frame, SIGNAL (destroyed ()), this, SLOT (side_panel_destroyed ())); connect (mp_control_frame, SIGNAL (destroyed ()), this, SLOT (side_panel_destroyed ()));
connect (mp_control_panel, SIGNAL (tab_changed ()), this, SLOT (layer_tab_changed ())); connect (mp_control_panel, SIGNAL (tab_changed ()), this, SLOT (layer_tab_changed ()));
connect (mp_control_panel, SIGNAL (order_changed ()), this, SLOT (layer_order_changed ())); connect (mp_control_panel, SIGNAL (order_changed ()), this, SLOT (layer_order_changed ()));
connect (mp_control_panel, SIGNAL (current_layer_changed (const lay::LayerPropertiesConstIterator &)), this, SLOT (current_layer_changed_slot (const lay::LayerPropertiesConstIterator &)));
/* /*
connect (mp_control_panel, SIGNAL (marked_changed ()), this, SLOT (prop_changed ())); connect (mp_control_panel, SIGNAL (marked_changed ()), this, SLOT (prop_changed ()));
connect (mp_control_panel, SIGNAL (width_changed ()), this, SLOT (prop_changed ())); connect (mp_control_panel, SIGNAL (width_changed ()), this, SLOT (prop_changed ()));
@ -5324,6 +5325,12 @@ LayoutView::layer_snapshot () const
return state; return state;
} }
void
LayoutView::current_layer_changed_slot (const lay::LayerPropertiesConstIterator &iter)
{
current_layer_changed_event (iter);
}
void void
LayoutView::add_new_layers (const LayerState &state) LayoutView::add_new_layers (const LayerState &state)
{ {

View File

@ -744,6 +744,12 @@ public:
*/ */
tl::event<int> current_layer_list_changed_event; tl::event<int> current_layer_list_changed_event;
/**
* @brief An event signalling that the current layer has changed
*/
tl::event<const lay::LayerPropertiesConstIterator &> current_layer_changed_event;
/** /**
* @brief An event signalling that the visibility of some cells has changed * @brief An event signalling that the visibility of some cells has changed
*/ */
@ -2538,6 +2544,14 @@ public:
*/ */
void create_plugins (const lay::PluginDeclaration *except_this = 0); void create_plugins (const lay::PluginDeclaration *except_this = 0);
/**
* @brief Gets the full field box
*
* This is the box to which the view will zoom on zoom_fit().
* This box is supposed to cover everything inside the view.
*/
db::DBox full_box () const;
public slots: public slots:
/** /**
* @brief Store the current state on the "previous states" stack * @brief Store the current state on the "previous states" stack
@ -2593,12 +2607,9 @@ public slots:
void select_cell_dispatch (const cell_path_type &path, int cellview_index); void select_cell_dispatch (const cell_path_type &path, int cellview_index);
/** /**
* @brief Gets the full field box * @brief Called when the current layer changed
*
* This is the box to which the view will zoom on zoom_fit().
* This box is supposed to cover everything inside the view.
*/ */
db::DBox full_box () const; void current_layer_changed_slot (const lay::LayerPropertiesConstIterator &iter);
// zoom slots // zoom slots
void zoom_fit (); void zoom_fit ();
@ -2685,6 +2696,11 @@ signals:
*/ */
void mode_change (int m); void mode_change (int m);
/**
* @brief The current layer changed
*/
void current_layer_changed (const lay::LayerPropertiesConstIterator &l);
protected: protected:
/** /**
* @brief Establish the view operations * @brief Establish the view operations