Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Hotfix 0.29.10 #1943

Merged
merged 6 commits into from
Dec 3, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions Changelog
Original file line number Diff line number Diff line change
@@ -1,3 +1,13 @@
0.29.10 (2024-12-03):
* Bug: %GITHUB%/issues/1941 Crash with the navigator open
* Bug: %GITHUB%/issues/1942 Syntax error in pyi stubs
As a bonus, added defaults for Box#enlarge and Box#enlarged (dx, dy)
* Bugfix: Partial mode snapping now is object first, then grid
* Bugfix: Key bindings have not been properly read from the configuration file
The change in the configuration string structure triggered an old bug:
Toolbar buttons had a twofold configuration and only the last one was
considered. Changing the order of the entries could spoil the configuration.

0.29.9 (2024-12-01):
* Bug: %GITHUB%/issues/1907 Locking layouts against modification during recursive iteration of instances and shapes
This prevents crashes in write-white-iterating scenarios
Expand Down
7 changes: 7 additions & 0 deletions Changelog.Debian
Original file line number Diff line number Diff line change
@@ -1,3 +1,10 @@
klayout (0.29.10-1) unstable; urgency=low

* New features and bugfixes
- See changelog

-- Matthias Köfferlein <matthias@koefferlein.de> Mon, 02 Dec 2024 22:23:47 +0100

klayout (0.29.9-1) unstable; urgency=low

* New features and bugfixes
Expand Down
1 change: 1 addition & 0 deletions scripts/regenerate_stubs.sh
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

# clean up
rm -rf build dist
rm -rf python3-venv-make_stubs

python3 setup.py build
python3 setup.py bdist_wheel
Expand Down
6 changes: 3 additions & 3 deletions src/db/db/gsiDeclDbBox.cc
Original file line number Diff line number Diff line change
Expand Up @@ -388,7 +388,7 @@ struct box_defs
"\n"
"@return A reference to this box.\n"
) +
method_ext ("moved", &box_defs<C>::moved, gsi::arg ("dx, 0"), gsi::arg ("dy", 0),
method_ext ("moved", &box_defs<C>::moved, gsi::arg ("dx", 0), gsi::arg ("dy", 0),
"@brief Moves the box by a certain distance\n"
"\n"
"This is a convenience method which takes two values instead of a Point object.\n"
Expand Down Expand Up @@ -419,7 +419,7 @@ struct box_defs
"\n"
"@return The moved box.\n"
) +
method_ext ("enlarge", &box_defs<C>::enlarge, gsi::arg ("dx"), gsi::arg ("dy"),
method_ext ("enlarge", &box_defs<C>::enlarge, gsi::arg ("dx", 0), gsi::arg ("dy", 0),
"@brief Enlarges the box by a certain amount.\n"
"\n"
"\n"
Expand All @@ -436,7 +436,7 @@ struct box_defs
"\n"
"@return A reference to this box.\n"
) +
method_ext ("enlarged", &box_defs<C>::enlarged, gsi::arg ("dx"), gsi::arg ("dy"),
method_ext ("enlarged", &box_defs<C>::enlarged, gsi::arg ("dx", 0), gsi::arg ("dy", 0),
"@brief Enlarges the box by a certain amount.\n"
"\n"
"\n"
Expand Down
29 changes: 28 additions & 1 deletion src/edt/edt/edtPartialService.cc
Original file line number Diff line number Diff line change
Expand Up @@ -1808,11 +1808,38 @@ PartialService::mouse_move_event (const db::DPoint &p, unsigned int buttons, boo
// for a single selected point or edge, m_start is the original position and we snap the target -
// thus, we can bring the point on grid or to an object's edge or vertex
snap_details = snap2 (p);

if (snap_details.object_snap == lay::PointSnapToObjectResult::NoObject) {

m_current = m_start + snap_move (p - m_start);

} else {
m_current = m_start + snap_move (snap_details.snapped_point - m_start);

auto snapped_to_object = snap_details.snapped_point;
m_current = snapped_to_object;

if (snap_details.object_snap != lay::PointSnapToObjectResult::ObjectVertex) {
// snap to grid on longer side of reference edge and to object on shorter
auto snapped_to_object_and_grid = m_start + snap_move (snapped_to_object - m_start);
if (std::abs (snap_details.object_ref.dx ()) > std::abs (snap_details.object_ref.dy ())) {
m_current.set_x (snapped_to_object_and_grid.x ());
// project to edge, so we always hit it
auto cp = snap_details.object_ref.cut_point (db::DEdge (m_current, m_current + db::DVector (0, 1.0)));
if (cp.first) {
m_current.set_y (cp.second.y ());
}
} else if (std::abs (snap_details.object_ref.dy ()) > std::abs (snap_details.object_ref.dx ())) {
m_current.set_y (snapped_to_object_and_grid.y ());
// project to edge, so we always hit it
auto cp = snap_details.object_ref.cut_point (db::DEdge (m_current, m_current + db::DVector (1.0, 0)));
if (cp.first) {
m_current.set_x (cp.second.x ());
}
}
}

mouse_cursor_from_snap_details (snap_details);

}

} else {
Expand Down
23 changes: 3 additions & 20 deletions src/lay/lay/layMacroController.cc
Original file line number Diff line number Diff line change
Expand Up @@ -208,11 +208,6 @@ MacroController::uninitialize (lay::Dispatcher * /*root*/)
bool
MacroController::configure (const std::string &key, const std::string &value)
{
if (key == cfg_key_bindings) {
m_key_bindings = unpack_key_binding (value);
} else if (key == cfg_menu_items_hidden) {
m_menu_items_hidden = unpack_menu_items_hidden (value);
}
return false;
}

Expand Down Expand Up @@ -810,21 +805,9 @@ MacroController::do_update_menu_with_macros ()
add_macro_items_to_menu (m_temp_macros, used_names, groups, tech);
add_macro_items_to_menu (lym::MacroCollection::root (), used_names, groups, tech);

// apply the custom keyboard shortcuts
for (std::vector<std::pair<std::string, std::string> >::const_iterator kb = m_key_bindings.begin (); kb != m_key_bindings.end (); ++kb) {
if (mp_mw->menu ()->is_valid (kb->first)) {
lay::Action *a = mp_mw->menu ()->action (kb->first);
a->set_shortcut (kb->second);
}
}

// apply the custom hidden flags
for (std::vector<std::pair<std::string, bool> >::const_iterator hf = m_menu_items_hidden.begin (); hf != m_menu_items_hidden.end (); ++hf) {
if (mp_mw->menu ()->is_valid (hf->first)) {
lay::Action *a = mp_mw->menu ()->action (hf->first);
a->set_hidden (hf->second);
}
}
// apply the custom keyboard shortcuts and hidden flags
mp_mw->apply_key_bindings ();
mp_mw->apply_hidden ();
}

void
Expand Down
2 changes: 0 additions & 2 deletions src/lay/lay/layMacroController.h
Original file line number Diff line number Diff line change
Expand Up @@ -249,8 +249,6 @@ private slots:
tl::DeferredMethod<MacroController> dm_do_sync_with_external_sources;
tl::DeferredMethod<MacroController> dm_sync_file_watcher;
tl::DeferredMethod<MacroController> dm_sync_files;
std::vector<std::pair<std::string, std::string> > m_key_bindings;
std::vector<std::pair<std::string, bool> > m_menu_items_hidden;

void sync_implicit_macros (bool ask_before_autorun);
void add_macro_items_to_menu (lym::MacroCollection &collection, std::set<std::string> &used_names, std::set<std::string> &groups, const db::Technology *tech);
Expand Down
26 changes: 16 additions & 10 deletions src/lay/lay/layMainWindow.cc
Original file line number Diff line number Diff line change
Expand Up @@ -1192,8 +1192,8 @@ MainWindow::configure (const std::string &name, const std::string &value)

} else if (name == cfg_menu_items_hidden) {

std::vector<std::pair<std::string, bool> > hidden = unpack_menu_items_hidden (value);
apply_hidden (hidden);
m_hidden = unpack_menu_items_hidden (value);
apply_hidden ();
return true;

} else if (name == cfg_initial_technology) {
Expand All @@ -1213,12 +1213,15 @@ MainWindow::configure (const std::string &name, const std::string &value)
}

void
MainWindow::apply_hidden (const std::vector<std::pair<std::string, bool> > &hidden)
MainWindow::apply_hidden ()
{
for (std::vector<std::pair<std::string, bool> >::const_iterator hf = hidden.begin (); hf != hidden.end (); ++hf) {
if (menu ()->is_valid (hf->first)) {
lay::Action *a = menu ()->action (hf->first);
a->set_hidden (hf->second);
for (std::vector<std::pair<std::string, bool> >::const_iterator hf = m_hidden.begin (); hf != m_hidden.end (); ++hf) {
lay::AbstractMenuItem *item = menu ()->find_item_exact (hf->first);
if (item && item->primary ()) {
lay::Action *a = item->action ();
if (a) {
a->set_hidden (hf->second);
}
}
}
}
Expand All @@ -1227,9 +1230,12 @@ void
MainWindow::apply_key_bindings ()
{
for (std::vector<std::pair<std::string, std::string> >::const_iterator kb = m_key_bindings.begin (); kb != m_key_bindings.end (); ++kb) {
if (menu ()->is_valid (kb->first)) {
lay::Action *a = menu ()->action (kb->first);
a->set_shortcut (kb->second);
lay::AbstractMenuItem *item = menu ()->find_item_exact (kb->first);
if (item && item->primary ()) {
lay::Action *a = item->action ();
if (a) {
a->set_shortcut (kb->second);
}
}
}
}
Expand Down
13 changes: 11 additions & 2 deletions src/lay/lay/layMainWindow.h
Original file line number Diff line number Diff line change
Expand Up @@ -534,6 +534,16 @@ Q_OBJECT
*/
static std::vector<std::string> menu_symbols ();

/**
* @brief For internal use: apply current key bindings
*/
void apply_key_bindings ();

/**
* @brief For internal use: apply hidden menu flags
*/
void apply_hidden ();

/**
* @brief Open a new layout in mode 'mode'
*
Expand Down Expand Up @@ -770,6 +780,7 @@ protected slots:
double m_default_grid;
bool m_default_grids_updated;
std::vector<std::pair<std::string, std::string> > m_key_bindings;
std::vector<std::pair<std::string, bool> > m_hidden;
bool m_new_layout_current_panel;
bool m_synchronized_views;
bool m_synchronous;
Expand Down Expand Up @@ -864,8 +875,6 @@ protected slots:
void plugin_removed (lay::PluginDeclaration *cls);

void libraries_changed ();
void apply_key_bindings ();
void apply_hidden (const std::vector<std::pair <std::string, bool> > &hidden);
};

}
Expand Down
28 changes: 17 additions & 11 deletions src/laybasic/laybasic/layAbstractMenu.cc
Original file line number Diff line number Diff line change
Expand Up @@ -220,20 +220,22 @@ parse_menu_title (const std::string &s, std::string &title, std::string &shortcu
// AbstractMenuItem implementation

AbstractMenuItem::AbstractMenuItem (Dispatcher *dispatcher)
: mp_action (new Action ()), mp_dispatcher (dispatcher), m_has_submenu (false), m_remove_on_empty (false)
: mp_action (new Action ()), mp_dispatcher (dispatcher), m_has_submenu (false), m_remove_on_empty (false), m_primary (false)
{
// ... nothing yet ..
}

AbstractMenuItem::AbstractMenuItem (const AbstractMenuItem &item)
: mp_action (new Action ()), mp_dispatcher (item.dispatcher ()), m_has_submenu (false), m_remove_on_empty (false)
: mp_action (new Action ()), mp_dispatcher (item.dispatcher ()), m_has_submenu (false), m_remove_on_empty (false), m_primary (false)
{
// ... nothing yet ..
}

void
AbstractMenuItem::setup_item (const std::string &pn, const std::string &s, Action *a)
AbstractMenuItem::setup_item (const std::string &pn, const std::string &s, Action *a, bool primary)
{
m_primary = primary;

m_basename.clear ();

tl::Extractor ex (s.c_str ());
Expand Down Expand Up @@ -1587,6 +1589,8 @@ AbstractMenu::items (const std::string &path) const
void
AbstractMenu::insert_item (const std::string &p, const std::string &name, Action *action)
{
bool primary = true;

tl::Extractor extr (p.c_str ());
while (! extr.at_end ()) {

Expand All @@ -1601,7 +1605,8 @@ AbstractMenu::insert_item (const std::string &p, const std::string &name, Action
parent->children.insert (iter, AbstractMenuItem (mp_dispatcher));
--iter;

iter->setup_item (parent->name (), name, action);
iter->setup_item (parent->name (), name, action, primary);
primary = false;

// find any items with the same name and remove them
for (std::list<AbstractMenuItem>::iterator existing = parent->children.begin (); existing != parent->children.end (); ) {
Expand Down Expand Up @@ -1635,7 +1640,7 @@ AbstractMenu::insert_separator (const std::string &p, const std::string &name)
--iter;
Action *action = new Action ();
action->set_separator (true);
iter->setup_item (parent->name (), name, action);
iter->setup_item (parent->name (), name, action, true);

}

Expand All @@ -1655,7 +1660,7 @@ AbstractMenu::insert_menu (const std::string &p, const std::string &name, Action

parent->children.insert (iter, AbstractMenuItem (mp_dispatcher));
--iter;
iter->setup_item (parent->name (), name, action);
iter->setup_item (parent->name (), name, action, true);
iter->set_has_submenu ();

// find any items with the same name and remove them
Expand Down Expand Up @@ -1945,7 +1950,7 @@ AbstractMenu::find_item (tl::Extractor &extr)
if (parent) {
parent->children.insert (iter, AbstractMenuItem (mp_dispatcher));
--iter;
iter->setup_item (parent->name (), n, new Action ());
iter->setup_item (parent->name (), n, new Action (), true);
iter->set_has_submenu ();
iter->set_remove_on_empty ();
iter->set_action_title (ndesc.empty () ? n : ndesc);
Expand Down Expand Up @@ -2055,16 +2060,17 @@ AbstractMenu::get_shortcuts (const std::string &root, std::map<std::string, std:
std::vector<std::string> items = this->items (root);
for (std::vector<std::string>::const_iterator i = items.begin (); i != items.end (); ++i) {
if (i->size () > 0) {
if (is_valid (*i) && action (*i)->is_visible ()) {
if (is_menu (*i)) {
const AbstractMenuItem *item = find_item_exact (*i);
if (item && item->action () && item->action ()->is_visible ()) {
if (item->has_submenu ()) {
// a menu must be listed (so it can be hidden), but does not have a shortcut
// but we don't include special menus
if (i->at (0) != '@') {
bindings.insert (std::make_pair (*i, std::string ()));
}
get_shortcuts (*i, bindings, with_defaults);
} else if (! is_separator (*i)) {
bindings.insert (std::make_pair (*i, with_defaults ? action (*i)->get_default_shortcut () : action (*i)->get_effective_shortcut ()));
} else if (! item->action ()->is_separator () && item->primary ()) {
bindings.insert (std::make_pair (*i, with_defaults ? item->action ()->get_default_shortcut () : item->action ()->get_effective_shortcut ()));
}
}
}
Expand Down
20 changes: 17 additions & 3 deletions src/laybasic/laybasic/layAbstractMenu.h
Original file line number Diff line number Diff line change
Expand Up @@ -559,7 +559,7 @@ struct LAYBASIC_PUBLIC AbstractMenuItem
/**
* @brief Internal method used to set up the item
*/
void setup_item (const std::string &pn, const std::string &n, Action *a);
void setup_item (const std::string &pn, const std::string &n, Action *a, bool primary);

Dispatcher *dispatcher () const
{
Expand Down Expand Up @@ -616,13 +616,19 @@ struct LAYBASIC_PUBLIC AbstractMenuItem
return m_remove_on_empty;
}

bool primary () const
{
return m_primary;
}

std::list <AbstractMenuItem> children;

private:
tl::shared_ptr<Action> mp_action;
Dispatcher *mp_dispatcher;
bool m_has_submenu;
bool m_remove_on_empty;
bool m_primary;
std::string m_name;
std::string m_basename;
std::set<std::string> m_groups;
Expand Down Expand Up @@ -906,6 +912,16 @@ Q_OBJECT
return m_root;
}

/**
* @brief For internal use: gets the AbstractMenuItem for a given path or 0 if the path is not valid (const version)
*/
const AbstractMenuItem *find_item_exact (const std::string &path) const;

/**
* @brief For internal use: gets the AbstractMenuItem for a given path or 0 if the path is not valid
*/
AbstractMenuItem *find_item_exact (const std::string &path);

#if defined(HAVE_QT)
signals:
/**
Expand All @@ -918,8 +934,6 @@ Q_OBJECT
friend class Action;

std::vector<std::pair<AbstractMenuItem *, std::list<AbstractMenuItem>::iterator> > find_item (tl::Extractor &extr);
const AbstractMenuItem *find_item_exact (const std::string &path) const;
AbstractMenuItem *find_item_exact (const std::string &path);
const AbstractMenuItem *find_item_for_action (const Action *action, const AbstractMenuItem *from = 0) const;
AbstractMenuItem *find_item_for_action (const Action *action, AbstractMenuItem *from = 0);
#if defined(HAVE_QT)
Expand Down
Loading
Loading