mirror of https://github.com/KLayout/klayout.git
More enhancements to support LayoutView as widget
This commit is contained in:
parent
a9ef337c3b
commit
8dd002bd0f
|
|
@ -68,20 +68,29 @@ void ControlWidgetStack::add_widget(QWidget *w)
|
|||
resize (minimumWidth (), height ());
|
||||
}
|
||||
|
||||
update_geometry ();
|
||||
}
|
||||
|
||||
void ControlWidgetStack::update_geometry ()
|
||||
{
|
||||
if (m_size_follows_content) {
|
||||
updateGeometry ();
|
||||
|
||||
int h = sizeHint ().height ();
|
||||
if (h > 0) {
|
||||
setMinimumHeight (h);
|
||||
setMaximumHeight (h);
|
||||
} else {
|
||||
setMinimumHeight (0);
|
||||
setMaximumHeight (QWIDGETSIZE_MAX);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
bool ControlWidgetStack::event(QEvent *e)
|
||||
{
|
||||
if (e->type () == QEvent::LayoutRequest) {
|
||||
if (m_size_follows_content) {
|
||||
int h = sizeHint ().height ();
|
||||
setMinimumHeight (h);
|
||||
setMaximumHeight (h);
|
||||
updateGeometry ();
|
||||
}
|
||||
update_geometry ();
|
||||
}
|
||||
return QWidget::event (e);
|
||||
}
|
||||
|
|
@ -115,9 +124,7 @@ void ControlWidgetStack::remove_widget(size_t index)
|
|||
mp_bglabel->show ();
|
||||
}
|
||||
|
||||
if (m_size_follows_content) {
|
||||
updateGeometry ();
|
||||
}
|
||||
update_geometry ();
|
||||
}
|
||||
|
||||
void ControlWidgetStack::raise_widget(size_t index)
|
||||
|
|
@ -142,9 +149,7 @@ void ControlWidgetStack::raise_widget(size_t index)
|
|||
mp_bglabel->hide ();
|
||||
}
|
||||
|
||||
if (m_size_follows_content) {
|
||||
updateGeometry ();
|
||||
}
|
||||
update_geometry ();
|
||||
}
|
||||
|
||||
QWidget *ControlWidgetStack::widget(size_t index)
|
||||
|
|
|
|||
|
|
@ -66,9 +66,11 @@ protected:
|
|||
}
|
||||
|
||||
void resize_children ();
|
||||
void update_geometry ();
|
||||
|
||||
bool event (QEvent *e);
|
||||
|
||||
|
||||
std::vector <QWidget *> m_widgets;
|
||||
QWidget *mp_current_widget;
|
||||
QLabel *mp_bglabel;
|
||||
|
|
|
|||
|
|
@ -534,6 +534,12 @@ LAYBASIC_PUBLIC Class<lay::LayoutViewBase> decl_LayoutViewBase ("lay", "LayoutVi
|
|||
"\n"
|
||||
"This constant has been introduced in version 0.27.\n"
|
||||
) +
|
||||
gsi::constant ("LV_NoPropertiesPopup", (unsigned int) lay::LayoutViewBase::LV_NoPropertiesPopup,
|
||||
"@brief This option disables the properties popup on double click\n"
|
||||
"Use this value with the constructor's 'options' argument.\n"
|
||||
"\n"
|
||||
"This constant has been introduced in version 0.28.\n"
|
||||
) +
|
||||
gsi::constant ("LV_NoServices", (unsigned int) lay::LayoutViewBase::LV_NoServices,
|
||||
"@brief This option disables all services except the ones for pure viewing\n"
|
||||
"Use this value with the constructor's 'options' argument.\n"
|
||||
|
|
|
|||
|
|
@ -25,10 +25,6 @@
|
|||
#include "dbClipboard.h"
|
||||
#include "tlAssert.h"
|
||||
|
||||
#if defined(HAVE_QT)
|
||||
# include "layPropertiesDialog.h"
|
||||
#endif
|
||||
|
||||
#include <algorithm>
|
||||
#include <memory>
|
||||
|
||||
|
|
@ -76,21 +72,11 @@ Editable::~Editable ()
|
|||
Editables::Editables (db::Manager *manager)
|
||||
: db::Object (manager), m_move_selection (false), m_any_move_operation (false)
|
||||
{
|
||||
#if defined(HAVE_QT)
|
||||
mp_properties_dialog = 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
Editables::~Editables ()
|
||||
{
|
||||
cancel_edits ();
|
||||
|
||||
#if defined(HAVE_QT)
|
||||
if (mp_properties_dialog) {
|
||||
delete mp_properties_dialog;
|
||||
mp_properties_dialog = 0;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
void
|
||||
|
|
@ -674,36 +660,17 @@ Editables::edit_cancel ()
|
|||
void
|
||||
Editables::cancel_edits ()
|
||||
{
|
||||
#if defined(HAVE_QT)
|
||||
// close the property dialog
|
||||
if (mp_properties_dialog) {
|
||||
mp_properties_dialog->hide ();
|
||||
}
|
||||
#endif
|
||||
|
||||
// cancel any edit operations
|
||||
for (iterator e = begin (); e != end (); ++e) {
|
||||
e->edit_cancel ();
|
||||
}
|
||||
}
|
||||
|
||||
#if defined(HAVE_QT)
|
||||
void
|
||||
Editables::show_properties (QWidget *parent)
|
||||
Editables::show_properties ()
|
||||
{
|
||||
if (! has_selection ()) {
|
||||
// try to use the transient selection for the real one
|
||||
transient_to_selection ();
|
||||
}
|
||||
|
||||
// re-create a new properties dialog
|
||||
if (mp_properties_dialog) {
|
||||
delete mp_properties_dialog;
|
||||
}
|
||||
mp_properties_dialog = new lay::PropertiesDialog (parent, manager (), this);
|
||||
mp_properties_dialog->show ();
|
||||
// The default implementation does nothing
|
||||
}
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -47,7 +47,6 @@ namespace lay
|
|||
class Editables;
|
||||
#if defined(HAVE_QT)
|
||||
class PropertiesPage;
|
||||
class PropertiesDialog;
|
||||
#endif
|
||||
|
||||
/**
|
||||
|
|
@ -590,12 +589,10 @@ public:
|
|||
return m_editables.end ();
|
||||
}
|
||||
|
||||
#if defined(HAVE_QT)
|
||||
/**
|
||||
* @brief The "show properties" operation
|
||||
*/
|
||||
void show_properties (QWidget *parent);
|
||||
#endif
|
||||
virtual void show_properties ();
|
||||
|
||||
/**
|
||||
* @brief An event triggered if the selection changed
|
||||
|
|
@ -651,9 +648,6 @@ private:
|
|||
|
||||
tl::shared_collection<lay::Editable> m_editables;
|
||||
std::set<lay::Editable *> m_enabled;
|
||||
#if defined(HAVE_QT)
|
||||
lay::PropertiesDialog *mp_properties_dialog;
|
||||
#endif
|
||||
bool m_move_selection;
|
||||
bool m_any_move_operation;
|
||||
db::DBox m_last_selected_point;
|
||||
|
|
|
|||
|
|
@ -179,6 +179,7 @@ public:
|
|||
LV_NoTracker = 512,
|
||||
LV_NoSelection = 1024,
|
||||
LV_NoPlugins = 2048,
|
||||
LV_NoPropertiesPopup = 4096,
|
||||
LV_NoServices = LV_NoMove + LV_NoTracker + LV_NoSelection + LV_NoPlugins
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -30,7 +30,6 @@
|
|||
|
||||
#if defined(HAVE_QT)
|
||||
# include <QMessageBox>
|
||||
# include <QApplication>
|
||||
#endif
|
||||
|
||||
namespace lay
|
||||
|
|
@ -185,12 +184,10 @@ SelectionService::mouse_double_click_event (const db::DPoint & /*p*/, unsigned i
|
|||
reset_box ();
|
||||
}
|
||||
|
||||
#if defined(HAVE_QT)
|
||||
if (prio && (buttons & lay::LeftButton) != 0) {
|
||||
mp_view->show_properties (QApplication::activeWindow ());
|
||||
mp_view->show_properties ();
|
||||
return true;
|
||||
}
|
||||
#endif
|
||||
|
||||
return false;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -9,12 +9,10 @@ DEFINES += MAKE_LAYBASIC_LIBRARY
|
|||
!equals(HAVE_QT, 0) {
|
||||
|
||||
FORMS = \
|
||||
PropertiesDialog.ui \
|
||||
|
||||
SOURCES = \
|
||||
gtf.cc \
|
||||
layPluginConfigPage.cc \
|
||||
layPropertiesDialog.cc \
|
||||
layProperties.cc \
|
||||
layDragDropData.cc \
|
||||
layCursor.cc \
|
||||
|
|
@ -22,7 +20,6 @@ DEFINES += MAKE_LAYBASIC_LIBRARY
|
|||
HEADERS = \
|
||||
gtf.h \
|
||||
layPluginConfigPage.h \
|
||||
layPropertiesDialog.h \
|
||||
layProperties.h \
|
||||
layDragDropData.h \
|
||||
layCursor.h \
|
||||
|
|
|
|||
|
|
@ -50,19 +50,9 @@ namespace lay
|
|||
/**
|
||||
* @brief Gets a suitable parent widget for the modal dialogs used in this module
|
||||
*/
|
||||
static QWidget *parent ()
|
||||
static QWidget *parent_widget ()
|
||||
{
|
||||
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;
|
||||
return QApplication::activeWindow ();
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
@ -133,7 +123,7 @@ LayoutViewFunctions::menu_activated (const std::string &symbol)
|
|||
|
||||
if (symbol == "cm_show_properties") {
|
||||
|
||||
view ()->show_properties (parent ());
|
||||
view ()->show_properties ();
|
||||
|
||||
} else if (symbol == "cm_delete") {
|
||||
|
||||
|
|
@ -326,10 +316,10 @@ LayoutViewFunctions::menu_activated (const std::string &symbol)
|
|||
cm_new_layer ();
|
||||
}
|
||||
} else if (symbol == "cm_layout_props") {
|
||||
lay::LayoutPropertiesForm lp_form (parent (), view (), "layout_props_form");
|
||||
lay::LayoutPropertiesForm lp_form (parent_widget (), view (), "layout_props_form");
|
||||
lp_form.exec ();
|
||||
} else if (symbol == "cm_layout_stats") {
|
||||
lay::LayoutStatisticsForm lp_form (parent (), view (), "layout_props_form");
|
||||
lay::LayoutStatisticsForm lp_form (parent_widget (), view (), "layout_props_form");
|
||||
lp_form.exec ();
|
||||
} else if (symbol == "cm_reload") {
|
||||
cm_reload ();
|
||||
|
|
@ -449,7 +439,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 (parent ());
|
||||
lay::UserPropertiesForm props_form (parent_widget ());
|
||||
if (props_form.show (view (), cv_index, prop_id)) {
|
||||
|
||||
view ()->transaction (tl::to_string (tr ("Edit cell's user properties")));
|
||||
|
|
@ -484,7 +474,7 @@ LayoutViewFunctions::cm_cell_replace ()
|
|||
}
|
||||
|
||||
|
||||
lay::ReplaceCellOptionsDialog mode_dialog (parent ());
|
||||
lay::ReplaceCellOptionsDialog mode_dialog (parent_widget ());
|
||||
|
||||
db::cell_index_type with_cell = paths.front ().back ();
|
||||
int mode = needs_to_ask ? m_del_cell_mode : 0;
|
||||
|
|
@ -672,7 +662,7 @@ LayoutViewFunctions::cm_cell_delete ()
|
|||
mode = 0;
|
||||
}
|
||||
|
||||
lay::DeleteCellModeDialog mode_dialog (parent ());
|
||||
lay::DeleteCellModeDialog mode_dialog (parent_widget ());
|
||||
if (! needs_to_ask || mode_dialog.exec_dialog (mode)) {
|
||||
|
||||
if (needs_to_ask) {
|
||||
|
|
@ -795,7 +785,7 @@ LayoutViewFunctions::cm_cell_flatten ()
|
|||
}
|
||||
}
|
||||
|
||||
FlattenInstOptionsDialog options_dialog (parent ());
|
||||
FlattenInstOptionsDialog options_dialog (parent_widget ());
|
||||
|
||||
int flatten_insts_levels = -1;
|
||||
bool prune = true;
|
||||
|
|
@ -877,7 +867,7 @@ LayoutViewFunctions::cm_cell_rename ()
|
|||
|
||||
if (cv_index >= 0 && path.size () > 0) {
|
||||
|
||||
lay::RenameCellDialog name_dialog (parent ());
|
||||
lay::RenameCellDialog name_dialog (parent_widget ());
|
||||
|
||||
db::Layout &layout = view ()->cellview (cv_index)->layout ();
|
||||
std::string name (layout.cell_name (path.back ()));
|
||||
|
|
@ -1227,7 +1217,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 (parent ());
|
||||
NewCellPropertiesDialog cell_prop_dia (parent_widget ());
|
||||
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 ());
|
||||
|
|
@ -1290,7 +1280,7 @@ LayoutViewFunctions::cm_reload ()
|
|||
bool can_reload = true;
|
||||
if (dirty_layouts != 0) {
|
||||
|
||||
QMessageBox mbox (parent ());
|
||||
QMessageBox mbox (parent_widget ());
|
||||
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);
|
||||
|
|
@ -1343,7 +1333,7 @@ LayoutViewFunctions::transform_layout (const db::DCplxTrans &tr_mic)
|
|||
}
|
||||
|
||||
if (has_proxy &&
|
||||
QMessageBox::question (parent (),
|
||||
QMessageBox::question (parent_widget (),
|
||||
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"
|
||||
|
|
@ -1430,7 +1420,7 @@ LayoutViewFunctions::cm_lay_scale ()
|
|||
void
|
||||
LayoutViewFunctions::cm_lay_move ()
|
||||
{
|
||||
lay::MoveOptionsDialog options (parent ());
|
||||
lay::MoveOptionsDialog options (parent_widget ());
|
||||
if (options.exec_dialog (m_move_dist)) {
|
||||
transform_layout (db::DCplxTrans (m_move_dist));
|
||||
}
|
||||
|
|
@ -1550,7 +1540,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 (parent ());
|
||||
lay::MoveToOptionsDialog options (parent_widget ());
|
||||
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);
|
||||
|
|
@ -1564,7 +1554,7 @@ LayoutViewFunctions::cm_sel_move_to ()
|
|||
void
|
||||
LayoutViewFunctions::cm_sel_move ()
|
||||
{
|
||||
lay::MoveOptionsDialog options (parent ());
|
||||
lay::MoveOptionsDialog options (parent_widget ());
|
||||
if (options.exec_dialog (m_move_dist)) {
|
||||
do_transform (db::DCplxTrans (m_move_dist));
|
||||
}
|
||||
|
|
@ -1598,7 +1588,7 @@ LayoutViewFunctions::cm_copy_layer ()
|
|||
|
||||
}
|
||||
|
||||
lay::DuplicateLayerDialog dialog (parent ());
|
||||
lay::DuplicateLayerDialog dialog (parent_widget ());
|
||||
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;
|
||||
|
|
@ -1758,7 +1748,7 @@ LayoutViewFunctions::cm_new_layer ()
|
|||
|
||||
const lay::CellView &cv = view ()->cellview (index);
|
||||
|
||||
lay::NewLayerPropertiesDialog prop_dia (parent ());
|
||||
lay::NewLayerPropertiesDialog prop_dia (parent_widget ());
|
||||
if (prop_dia.exec_dialog (cv, m_new_layer_props)) {
|
||||
|
||||
for (unsigned int l = 0; l < cv->layout ().layers (); ++l) {
|
||||
|
|
@ -1796,7 +1786,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 (parent ());
|
||||
lay::AlignCellOptionsDialog dialog (parent_widget ());
|
||||
if (dialog.exec_dialog (m_align_cell_options)) {
|
||||
|
||||
view ()->clear_selection ();
|
||||
|
|
@ -1897,7 +1887,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 (parent ());
|
||||
lay::NewLayerPropertiesDialog prop_dia (parent_widget ());
|
||||
if (prop_dia.exec_dialog (cv, layer_props)) {
|
||||
|
||||
for (unsigned int l = 0; l < layout.layers (); ++l) {
|
||||
|
|
@ -2040,7 +2030,7 @@ LayoutViewFunctions::cm_clear_layer ()
|
|||
throw tl::Exception (tl::to_string (tr ("No layer selected for clearing")));
|
||||
}
|
||||
|
||||
lay::ClearLayerModeDialog mode_dialog (parent ());
|
||||
lay::ClearLayerModeDialog mode_dialog (parent_widget ());
|
||||
if (mode_dialog.exec_dialog (m_layer_hier_mode)) {
|
||||
|
||||
view ()->cancel_edits ();
|
||||
|
|
|
|||
|
|
@ -29,6 +29,8 @@
|
|||
#include "layProperties.h"
|
||||
#include "tlExceptions.h"
|
||||
|
||||
#include "ui_PropertiesDialog.h"
|
||||
|
||||
#include <QStackedLayout>
|
||||
|
||||
namespace lay
|
||||
|
|
@ -38,16 +40,17 @@ PropertiesDialog::PropertiesDialog (QWidget * /*parent*/, db::Manager *manager,
|
|||
: QDialog (0 /*parent*/),
|
||||
mp_manager (manager), mp_editables (editables), m_index (-1), m_auto_applied (false), m_transaction_id (0)
|
||||
{
|
||||
mp_editables->enable_edits (false);
|
||||
mp_ui = new Ui::PropertiesDialog ();
|
||||
|
||||
setObjectName (QString::fromUtf8 ("properties_dialog"));
|
||||
mp_ui->setupUi (this);
|
||||
|
||||
Ui::PropertiesDialog::setupUi (this);
|
||||
mp_editables->enable_edits (false);
|
||||
|
||||
mp_stack = new QStackedLayout;
|
||||
|
||||
for (lay::Editables::iterator e = mp_editables->begin (); e != mp_editables->end (); ++e) {
|
||||
mp_properties_pages.push_back (e->properties_page (mp_manager, content_frame));
|
||||
mp_properties_pages.push_back (e->properties_page (mp_manager, mp_ui->content_frame));
|
||||
if (mp_properties_pages.back ()) {
|
||||
mp_stack->addWidget (mp_properties_pages.back ());
|
||||
connect (mp_properties_pages.back (), SIGNAL (edited ()), this, SLOT (apply ()));
|
||||
|
|
@ -58,19 +61,19 @@ PropertiesDialog::PropertiesDialog (QWidget * /*parent*/, db::Manager *manager,
|
|||
std::reverse (mp_properties_pages.begin (), mp_properties_pages.end ());
|
||||
|
||||
// Add a label as a dummy
|
||||
QLabel *dummy = new QLabel (QObject::tr ("No object with properties to display"), content_frame);
|
||||
QLabel *dummy = new QLabel (QObject::tr ("No object with properties to display"), mp_ui->content_frame);
|
||||
dummy->setAlignment (Qt::AlignHCenter | Qt::AlignVCenter);
|
||||
mp_stack->addWidget (dummy);
|
||||
|
||||
content_frame->setLayout (mp_stack);
|
||||
mp_ui->content_frame->setLayout (mp_stack);
|
||||
|
||||
// disable the apply button for first ..
|
||||
apply_to_all_cbx->setEnabled (false);
|
||||
relative_cbx->setEnabled (false);
|
||||
ok_button->setEnabled (false);
|
||||
mp_ui->apply_to_all_cbx->setEnabled (false);
|
||||
mp_ui->relative_cbx->setEnabled (false);
|
||||
mp_ui->ok_button->setEnabled (false);
|
||||
|
||||
// as a proposal, the start button can be enabled in most cases
|
||||
prev_button->setEnabled (true);
|
||||
mp_ui->prev_button->setEnabled (true);
|
||||
|
||||
// count the total number of objects
|
||||
m_objects = mp_editables->selection_size ();
|
||||
|
|
@ -84,40 +87,43 @@ PropertiesDialog::PropertiesDialog (QWidget * /*parent*/, db::Manager *manager,
|
|||
++m_index;
|
||||
}
|
||||
|
||||
prev_button->setEnabled (false);
|
||||
mp_ui->prev_button->setEnabled (false);
|
||||
|
||||
// if at end disable the "Next" button and return (this may only happen at the first call)
|
||||
if (m_index >= int (mp_properties_pages.size ())) {
|
||||
|
||||
next_button->setEnabled (false);
|
||||
mp_ui->next_button->setEnabled (false);
|
||||
mp_stack->setCurrentWidget (dummy);
|
||||
apply_to_all_cbx->setEnabled (false);
|
||||
apply_to_all_cbx->setChecked (false);
|
||||
relative_cbx->setEnabled (false);
|
||||
relative_cbx->setChecked (false);
|
||||
ok_button->setEnabled (false);
|
||||
mp_ui->apply_to_all_cbx->setEnabled (false);
|
||||
mp_ui->apply_to_all_cbx->setChecked (false);
|
||||
mp_ui->relative_cbx->setEnabled (false);
|
||||
mp_ui->relative_cbx->setChecked (false);
|
||||
mp_ui->ok_button->setEnabled (false);
|
||||
|
||||
} else {
|
||||
|
||||
next_button->setEnabled (any_next ());
|
||||
mp_ui->next_button->setEnabled (any_next ());
|
||||
mp_properties_pages [m_index]->update ();
|
||||
mp_stack->setCurrentWidget (mp_properties_pages [m_index]);
|
||||
apply_to_all_cbx->setEnabled (! mp_properties_pages [m_index]->readonly () && mp_properties_pages [m_index]->can_apply_to_all ());
|
||||
apply_to_all_cbx->setChecked (false);
|
||||
relative_cbx->setEnabled (apply_to_all_cbx->isEnabled () && apply_to_all_cbx->isChecked ());
|
||||
relative_cbx->setChecked (true);
|
||||
ok_button->setEnabled (! mp_properties_pages [m_index]->readonly ());
|
||||
mp_ui->apply_to_all_cbx->setEnabled (! mp_properties_pages [m_index]->readonly () && mp_properties_pages [m_index]->can_apply_to_all ());
|
||||
mp_ui->apply_to_all_cbx->setChecked (false);
|
||||
mp_ui->relative_cbx->setEnabled (mp_ui->apply_to_all_cbx->isEnabled () && mp_ui->apply_to_all_cbx->isChecked ());
|
||||
mp_ui->relative_cbx->setChecked (true);
|
||||
mp_ui->ok_button->setEnabled (! mp_properties_pages [m_index]->readonly ());
|
||||
|
||||
}
|
||||
|
||||
connect (ok_button, SIGNAL (clicked ()), this, SLOT (ok_pressed ()));
|
||||
connect (cancel_button, SIGNAL (clicked ()), this, SLOT (cancel_pressed ()));
|
||||
connect (prev_button, SIGNAL (clicked ()), this, SLOT (prev_pressed ()));
|
||||
connect (next_button, SIGNAL (clicked ()), this, SLOT (next_pressed ()));
|
||||
connect (mp_ui->ok_button, SIGNAL (clicked ()), this, SLOT (ok_pressed ()));
|
||||
connect (mp_ui->cancel_button, SIGNAL (clicked ()), this, SLOT (cancel_pressed ()));
|
||||
connect (mp_ui->prev_button, SIGNAL (clicked ()), this, SLOT (prev_pressed ()));
|
||||
connect (mp_ui->next_button, SIGNAL (clicked ()), this, SLOT (next_pressed ()));
|
||||
}
|
||||
|
||||
PropertiesDialog::~PropertiesDialog ()
|
||||
{
|
||||
delete mp_ui;
|
||||
mp_ui = 0;
|
||||
|
||||
disconnect ();
|
||||
}
|
||||
|
||||
|
|
@ -166,11 +172,11 @@ BEGIN_PROTECTED
|
|||
++m_current_object;
|
||||
update_title ();
|
||||
|
||||
prev_button->setEnabled (true);
|
||||
next_button->setEnabled (any_next ());
|
||||
apply_to_all_cbx->setEnabled (! mp_properties_pages [m_index]->readonly () && mp_properties_pages [m_index]->can_apply_to_all ());
|
||||
relative_cbx->setEnabled (apply_to_all_cbx->isEnabled () && apply_to_all_cbx->isChecked ());
|
||||
ok_button->setEnabled (! mp_properties_pages [m_index]->readonly ());
|
||||
mp_ui->prev_button->setEnabled (true);
|
||||
mp_ui->next_button->setEnabled (any_next ());
|
||||
mp_ui->apply_to_all_cbx->setEnabled (! mp_properties_pages [m_index]->readonly () && mp_properties_pages [m_index]->can_apply_to_all ());
|
||||
mp_ui->relative_cbx->setEnabled (mp_ui->apply_to_all_cbx->isEnabled () && mp_ui->apply_to_all_cbx->isChecked ());
|
||||
mp_ui->ok_button->setEnabled (! mp_properties_pages [m_index]->readonly ());
|
||||
mp_properties_pages [m_index]->update ();
|
||||
|
||||
END_PROTECTED
|
||||
|
|
@ -212,11 +218,11 @@ BEGIN_PROTECTED
|
|||
--m_current_object;
|
||||
update_title ();
|
||||
|
||||
next_button->setEnabled (true);
|
||||
prev_button->setEnabled (any_prev ());
|
||||
apply_to_all_cbx->setEnabled (! mp_properties_pages [m_index]->readonly () && mp_properties_pages [m_index]->can_apply_to_all ());
|
||||
relative_cbx->setEnabled (apply_to_all_cbx->isEnabled () && apply_to_all_cbx->isChecked ());
|
||||
ok_button->setEnabled (! mp_properties_pages [m_index]->readonly ());
|
||||
mp_ui->next_button->setEnabled (true);
|
||||
mp_ui->prev_button->setEnabled (any_prev ());
|
||||
mp_ui->apply_to_all_cbx->setEnabled (! mp_properties_pages [m_index]->readonly () && mp_properties_pages [m_index]->can_apply_to_all ());
|
||||
mp_ui->relative_cbx->setEnabled (mp_ui->apply_to_all_cbx->isEnabled () && mp_ui->apply_to_all_cbx->isChecked ());
|
||||
mp_ui->ok_button->setEnabled (! mp_properties_pages [m_index]->readonly ());
|
||||
mp_properties_pages [m_index]->update ();
|
||||
|
||||
END_PROTECTED
|
||||
|
|
@ -274,8 +280,8 @@ BEGIN_PROTECTED
|
|||
|
||||
try {
|
||||
|
||||
if (apply_to_all_cbx->isChecked () && mp_properties_pages [m_index]->can_apply_to_all ()) {
|
||||
mp_properties_pages [m_index]->apply_to_all (relative_cbx->isChecked ());
|
||||
if (mp_ui->apply_to_all_cbx->isChecked () && mp_properties_pages [m_index]->can_apply_to_all ()) {
|
||||
mp_properties_pages [m_index]->apply_to_all (mp_ui->relative_cbx->isChecked ());
|
||||
} else {
|
||||
mp_properties_pages [m_index]->apply ();
|
||||
}
|
||||
|
|
@ -25,6 +25,8 @@
|
|||
#ifndef HDR_layPropertiesDialog
|
||||
#define HDR_layPropertiesDialog
|
||||
|
||||
#include "layuiCommon.h"
|
||||
|
||||
#include <vector>
|
||||
|
||||
#include <QMutex>
|
||||
|
|
@ -35,12 +37,15 @@
|
|||
|
||||
#include <dbManager.h>
|
||||
|
||||
#include "ui_PropertiesDialog.h"
|
||||
|
||||
#include <memory>
|
||||
|
||||
class QStackedLayout;
|
||||
|
||||
namespace Ui
|
||||
{
|
||||
class PropertiesDialog;
|
||||
}
|
||||
|
||||
namespace lay
|
||||
{
|
||||
|
||||
|
|
@ -57,8 +62,8 @@ class MainWindow;
|
|||
* objects from a set of editables.
|
||||
*/
|
||||
|
||||
class PropertiesDialog
|
||||
: public QDialog, private Ui::PropertiesDialog
|
||||
class LAYUI_PUBLIC PropertiesDialog
|
||||
: public QDialog
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
|
|
@ -98,6 +103,9 @@ public slots:
|
|||
|
||||
protected:
|
||||
void reject ();
|
||||
|
||||
private:
|
||||
Ui::PropertiesDialog *mp_ui;
|
||||
};
|
||||
|
||||
}
|
||||
|
|
@ -53,6 +53,7 @@ FORMS = \
|
|||
NewLayerPropertiesDialog.ui \
|
||||
NewLayoutPropertiesDialog.ui \
|
||||
OpenLayoutModeDialog.ui \
|
||||
PropertiesDialog.ui \
|
||||
RenameCellDialog.ui \
|
||||
ReplaceCellOptionsDialog.ui \
|
||||
SaveLayoutOptionsDialog.ui \
|
||||
|
|
@ -127,6 +128,7 @@ SOURCES = \
|
|||
layNetlistBrowserTreeModel.cc \
|
||||
layNetlistCrossReferenceModel.cc \
|
||||
layNetlistLogModel.cc \
|
||||
layPropertiesDialog.cc \
|
||||
layQtTools.cc \
|
||||
laySaveLayoutOptionsDialog.cc \
|
||||
laySelectCellViewForm.cc \
|
||||
|
|
@ -186,6 +188,7 @@ HEADERS = \
|
|||
layNetlistBrowserTreeModel.h \
|
||||
layNetlistCrossReferenceModel.h \
|
||||
layNetlistLogModel.h \
|
||||
layPropertiesDialog.h \
|
||||
layQtTools.h \
|
||||
laySaveLayoutOptionsDialog.h \
|
||||
laySelectCellViewForm.h \
|
||||
|
|
|
|||
|
|
@ -92,7 +92,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 from \\LayoutView\n"
|
||||
"@param options A combination of the values in the LV_... constants from \\LayoutViewBase\n"
|
||||
"\n"
|
||||
"This constructor has been introduced in version 0.25.\n"
|
||||
"It has been enhanced with the arguments in version 0.27.\n"
|
||||
|
|
@ -161,7 +161,7 @@ Class<lay::LayoutView> decl_LayoutView (decl_LayoutViewBase, "lay", "LayoutView"
|
|||
"\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 \\LayoutViewBase\n"
|
||||
"\n"
|
||||
"This constructor has been introduced in version 0.25.\n"
|
||||
"It has been enhanced with the arguments in version 0.27.\n"
|
||||
|
|
|
|||
|
|
@ -75,6 +75,7 @@
|
|||
#include "layEditorOptionsFrame.h"
|
||||
#include "layEditorOptionsPages.h"
|
||||
#include "layUtils.h"
|
||||
#include "layPropertiesDialog.h"
|
||||
#include "dbClipboard.h"
|
||||
#include "dbLayout.h"
|
||||
#include "dbLayoutUtils.h"
|
||||
|
|
@ -568,6 +569,32 @@ LayoutView::finish ()
|
|||
}
|
||||
}
|
||||
|
||||
void
|
||||
LayoutView::show_properties ()
|
||||
{
|
||||
if ((options () & lay::LayoutViewBase::LV_NoPropertiesPopup) != 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (! has_selection ()) {
|
||||
// try to use the transient selection for the real one
|
||||
transient_to_selection ();
|
||||
}
|
||||
|
||||
// re-create a new properties dialog
|
||||
if (mp_properties_dialog) {
|
||||
delete mp_properties_dialog.data ();
|
||||
}
|
||||
mp_properties_dialog = new lay::PropertiesDialog (widget (), manager (), this);
|
||||
|
||||
// if launched from a dialog, do not use "show" as this blocks user interaction
|
||||
if (QApplication::activeModalWidget ()) {
|
||||
mp_properties_dialog->exec ();
|
||||
} else {
|
||||
mp_properties_dialog->show ();
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
LayoutView::do_change_active_cellview ()
|
||||
{
|
||||
|
|
@ -1243,6 +1270,17 @@ LayoutView::set_current_cell_path (int cv_index, const cell_path_type &path)
|
|||
}
|
||||
}
|
||||
|
||||
void
|
||||
LayoutView::cancel_edits ()
|
||||
{
|
||||
// close the property dialog
|
||||
if (mp_properties_dialog) {
|
||||
mp_properties_dialog->hide ();
|
||||
}
|
||||
|
||||
LayoutViewBase::cancel_edits ();
|
||||
}
|
||||
|
||||
void
|
||||
LayoutView::activate ()
|
||||
{
|
||||
|
|
|
|||
|
|
@ -56,6 +56,7 @@
|
|||
#include <memory>
|
||||
|
||||
#include <QImage>
|
||||
#include <QPointer>
|
||||
|
||||
class QSpinBox;
|
||||
|
||||
|
|
@ -87,6 +88,7 @@ class Browser;
|
|||
class ColorButton;
|
||||
class ConfigureAction;
|
||||
class EditorOptionsPages;
|
||||
class PropertiesDialog;
|
||||
|
||||
/**
|
||||
* @brief An object connecting child widget signals with methods from LayoutView
|
||||
|
|
@ -454,10 +456,7 @@ public:
|
|||
/**
|
||||
* @brief Cancels all edit operations but maintains selection
|
||||
*/
|
||||
void cancel_edits ()
|
||||
{
|
||||
LayoutViewBase::cancel_edits ();
|
||||
}
|
||||
void cancel_edits ();
|
||||
|
||||
/**
|
||||
* @brief Select all levels of hierarchy available
|
||||
|
|
@ -611,6 +610,7 @@ private:
|
|||
lay::EditorOptionsFrame *mp_editor_options_frame;
|
||||
QSpinBox *mp_min_hier_spbx;
|
||||
QSpinBox *mp_max_hier_spbx;
|
||||
QPointer<lay::PropertiesDialog> mp_properties_dialog;
|
||||
bool m_always_show_source;
|
||||
bool m_always_show_ld;
|
||||
bool m_always_show_layout_index;
|
||||
|
|
@ -669,6 +669,7 @@ protected:
|
|||
virtual void do_change_active_cellview ();
|
||||
virtual bool is_activated () const;
|
||||
virtual void bookmarks_changed ();
|
||||
virtual void show_properties ();
|
||||
|
||||
// overrides Editables method to display a message
|
||||
void signal_selection_changed ();
|
||||
|
|
|
|||
|
|
@ -38,7 +38,7 @@ namespace lay
|
|||
|
||||
static QWidget *parent_widget ()
|
||||
{
|
||||
return lay::MainWindow::instance ();
|
||||
return QApplication::activeWindow ();
|
||||
}
|
||||
|
||||
class BooleanOperationsPlugin
|
||||
|
|
|
|||
Loading…
Reference in New Issue