Skip to content

Commit

Permalink
Merge pull request #1943 from KLayout/hotfix-0.29.10
Browse files Browse the repository at this point in the history
Hotfix 0.29.10
  • Loading branch information
klayoutmatthias authored Dec 3, 2024
2 parents e51a89b + d9957be commit 9441024
Show file tree
Hide file tree
Showing 15 changed files with 169 additions and 97 deletions.
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

0 comments on commit 9441024

Please sign in to comment.