mirror of https://github.com/KLayout/klayout.git
Implemented "cm_grid_increase" and "cm_grid_decrease"
Default key bindings are "G" for finer grid and "Shift+G" for coarser grid. Two more enhancements: * The key binding merge in the config page was improved, so key bindings will appear in the config page before the configuration gets updated. * The current grid is shown in the status bar when the grid is changed.
This commit is contained in:
parent
3c6b342448
commit
68e7b271c3
|
|
@ -27,6 +27,7 @@
|
||||||
#include "layStream.h"
|
#include "layStream.h"
|
||||||
#include "layAbstractMenu.h"
|
#include "layAbstractMenu.h"
|
||||||
#include "layMainWindow.h"
|
#include "layMainWindow.h"
|
||||||
|
#include "tlLog.h"
|
||||||
#include "ui_MainConfigPage.h"
|
#include "ui_MainConfigPage.h"
|
||||||
#include "ui_MainConfigPage2.h"
|
#include "ui_MainConfigPage2.h"
|
||||||
#include "ui_MainConfigPage3.h"
|
#include "ui_MainConfigPage3.h"
|
||||||
|
|
@ -412,15 +413,31 @@ CustomizeMenuConfigPage::apply (const std::vector<std::pair<std::string, std::st
|
||||||
// gets the current bindings and merges with the given ones
|
// gets the current bindings and merges with the given ones
|
||||||
m_current_bindings = mp_dispatcher->menu ()->get_shortcuts (false);
|
m_current_bindings = mp_dispatcher->menu ()->get_shortcuts (false);
|
||||||
|
|
||||||
|
// retained bindings, even if not configured
|
||||||
|
std::vector<std::map<std::string, std::string>::iterator> retained;
|
||||||
|
std::set<std::string> shortcuts;
|
||||||
|
|
||||||
|
// initialize configured bindings, clear others (for now) and remember
|
||||||
std::map<std::string, std::string> b;
|
std::map<std::string, std::string> b;
|
||||||
b.insert (key_bindings.begin (), key_bindings.end ());
|
b.insert (key_bindings.begin (), key_bindings.end ());
|
||||||
for (std::map<std::string, std::string>::iterator kb = m_current_bindings.begin (); kb != m_current_bindings.end (); ++kb) {
|
for (auto kb = m_current_bindings.begin (); kb != m_current_bindings.end (); ++kb) {
|
||||||
std::map<std::string, std::string>::iterator bb = b.find (kb->first);
|
std::map<std::string, std::string>::iterator bb = b.find (kb->first);
|
||||||
if (bb != b.end ()) {
|
if (bb != b.end ()) {
|
||||||
lay::Action *a = mp_dispatcher->menu ()->action (kb->first);
|
lay::Action *a = mp_dispatcher->menu ()->action (kb->first);
|
||||||
kb->second = a->get_effective_shortcut_for (bb->second);
|
kb->second = a->get_effective_shortcut_for (bb->second);
|
||||||
} else {
|
if (! kb->second.empty ()) {
|
||||||
kb->second.clear ();
|
shortcuts.insert (kb->second);
|
||||||
|
}
|
||||||
|
} else if (! kb->second.empty ()) {
|
||||||
|
retained.push_back (kb);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// retain key bindings which don't conflict
|
||||||
|
for (auto i = retained.begin (); i != retained.end (); ++i) {
|
||||||
|
if (shortcuts.find ((*i)->second) != shortcuts.end ()) {
|
||||||
|
tl::warn << tl::sprintf (tl::to_string (tr ("Resetting key binding for '%s' (was '%s') because of conflicts")), (*i)->first, (*i)->second);
|
||||||
|
(*i)->second.clear ();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1970,6 +1970,18 @@ MainWindow::redraw ()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
MainWindow::cm_grid_decrease ()
|
||||||
|
{
|
||||||
|
change_grid (-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
MainWindow::cm_grid_increase ()
|
||||||
|
{
|
||||||
|
change_grid (1);
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
MainWindow::cm_cancel ()
|
MainWindow::cm_cancel ()
|
||||||
{
|
{
|
||||||
|
|
@ -4041,6 +4053,10 @@ MainWindow::menu_activated (const std::string &symbol)
|
||||||
cm_bookmark_view ();
|
cm_bookmark_view ();
|
||||||
} else if (symbol == "cm_cancel") {
|
} else if (symbol == "cm_cancel") {
|
||||||
cm_cancel ();
|
cm_cancel ();
|
||||||
|
} else if (symbol == "cm_grid_decrease") {
|
||||||
|
cm_grid_decrease ();
|
||||||
|
} else if (symbol == "cm_grid_increase") {
|
||||||
|
cm_grid_increase ();
|
||||||
} else if (symbol == "cm_save_layer_props") {
|
} else if (symbol == "cm_save_layer_props") {
|
||||||
cm_save_layer_props ();
|
cm_save_layer_props ();
|
||||||
} else if (symbol == "cm_load_layer_props") {
|
} else if (symbol == "cm_load_layer_props") {
|
||||||
|
|
@ -4137,6 +4153,54 @@ MainWindow::menu_changed ()
|
||||||
dm_do_update_menu ();
|
dm_do_update_menu ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::vector<double>
|
||||||
|
MainWindow::default_grids () const
|
||||||
|
{
|
||||||
|
lay::TechnologyController *tc = lay::TechnologyController::instance ();
|
||||||
|
if (tc && tc->active_technology ()) {
|
||||||
|
std::vector<double> tech_grids = tc->active_technology ()->default_grid_list ();
|
||||||
|
if (! tech_grids.empty ()) {
|
||||||
|
return tech_grids;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return m_default_grids;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
MainWindow::change_grid (int dir)
|
||||||
|
{
|
||||||
|
std::vector<double> grids = default_grids ();
|
||||||
|
if (grids.empty ()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::sort (grids.begin (), grids.end ());
|
||||||
|
|
||||||
|
size_t i = 0;
|
||||||
|
for (std::vector<double>::const_iterator g = grids.begin (); g != grids.end (); ++g, ++i) {
|
||||||
|
if (db::coord_traits<db::DCoord>::equals (*g, m_grid_micron)) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (i == grids.size ()) {
|
||||||
|
i = (dir > 0 ? grids.size () - 1 : 0);
|
||||||
|
} else {
|
||||||
|
if (dir > 0) {
|
||||||
|
if (i + 1 < grids.size ()) {
|
||||||
|
++i;
|
||||||
|
}
|
||||||
|
} else if (dir < 0) {
|
||||||
|
if (i > 0) {
|
||||||
|
--i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
dispatcher ()->config_set (cfg_grid, grids [i]);
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
MainWindow::do_update_grids ()
|
MainWindow::do_update_grids ()
|
||||||
{
|
{
|
||||||
|
|
@ -4176,15 +4240,7 @@ MainWindow::do_update_menu ()
|
||||||
|
|
||||||
m_default_grids_updated = false;
|
m_default_grids_updated = false;
|
||||||
|
|
||||||
const std::vector<double> *grids = &m_default_grids;
|
std::vector<double> grids = default_grids ();
|
||||||
std::vector<double> tech_grids;
|
|
||||||
lay::TechnologyController *tc = lay::TechnologyController::instance ();
|
|
||||||
if (tc && tc->active_technology ()) {
|
|
||||||
tech_grids = tc->active_technology ()->default_grid_list ();
|
|
||||||
if (! tech_grids.empty ()) {
|
|
||||||
grids = &tech_grids;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
std::vector<std::string> group = menu ()->group ("default_grids_group");
|
std::vector<std::string> group = menu ()->group ("default_grids_group");
|
||||||
|
|
||||||
|
|
@ -4196,7 +4252,7 @@ MainWindow::do_update_menu ()
|
||||||
}
|
}
|
||||||
|
|
||||||
int i = 1;
|
int i = 1;
|
||||||
for (std::vector<double>::const_iterator g = grids->begin (); g != grids->end (); ++g, ++i) {
|
for (std::vector<double>::const_iterator g = grids.begin (); g != grids.end (); ++g, ++i) {
|
||||||
|
|
||||||
std::string name = "default_grid_" + tl::to_string (i);
|
std::string name = "default_grid_" + tl::to_string (i);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -277,6 +277,14 @@ public:
|
||||||
*/
|
*/
|
||||||
double grid_micron () const;
|
double grid_micron () const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Gets a list of the default grids
|
||||||
|
*
|
||||||
|
* The default grids are globally defined, but may change depending on the technology
|
||||||
|
* selected in the current view.
|
||||||
|
*/
|
||||||
|
std::vector<double> default_grids () const;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Hierarchy level selection setter
|
* @brief Hierarchy level selection setter
|
||||||
*/
|
*/
|
||||||
|
|
@ -818,6 +826,8 @@ private:
|
||||||
void cm_manage_bookmarks ();
|
void cm_manage_bookmarks ();
|
||||||
void cm_bookmark_view ();
|
void cm_bookmark_view ();
|
||||||
void cm_cancel ();
|
void cm_cancel ();
|
||||||
|
void cm_grid_decrease ();
|
||||||
|
void cm_grid_increase ();
|
||||||
void cm_save_layer_props ();
|
void cm_save_layer_props ();
|
||||||
void cm_load_layer_props ();
|
void cm_load_layer_props ();
|
||||||
void cm_save_session ();
|
void cm_save_session ();
|
||||||
|
|
@ -863,6 +873,8 @@ private:
|
||||||
void update_tab_title (int i);
|
void update_tab_title (int i);
|
||||||
void add_view (LayoutViewWidget *view);
|
void add_view (LayoutViewWidget *view);
|
||||||
|
|
||||||
|
void change_grid (int dir);
|
||||||
|
|
||||||
bool can_close ();
|
bool can_close ();
|
||||||
lay::CellViewRef create_or_load_layout (const std::string *filename, const db::LoadLayoutOptions *options, const std::string &tech, const int mode);
|
lay::CellViewRef create_or_load_layout (const std::string *filename, const db::LoadLayoutOptions *options, const std::string &tech, const int mode);
|
||||||
int do_create_view ();
|
int do_create_view ();
|
||||||
|
|
|
||||||
|
|
@ -2154,6 +2154,8 @@ public:
|
||||||
menu_entries.push_back (lay::menu_item ("cm_sel_move_interactive", "sel_move_interactive:edit", at, tl::to_string (tr ("Move Interactive"))));
|
menu_entries.push_back (lay::menu_item ("cm_sel_move_interactive", "sel_move_interactive:edit", at, tl::to_string (tr ("Move Interactive"))));
|
||||||
menu_entries.push_back (lay::menu_item ("cm_select_next_item", "select_next_item:edit", at, tl::to_string (tr ("Select Next Item(Space)"))));
|
menu_entries.push_back (lay::menu_item ("cm_select_next_item", "select_next_item:edit", at, tl::to_string (tr ("Select Next Item(Space)"))));
|
||||||
menu_entries.push_back (lay::menu_item ("cm_select_next_item_add", "select_next_item_add:edit", at, tl::to_string (tr ("Select Next Item too(Shift+Space)"))));
|
menu_entries.push_back (lay::menu_item ("cm_select_next_item_add", "select_next_item_add:edit", at, tl::to_string (tr ("Select Next Item too(Shift+Space)"))));
|
||||||
|
menu_entries.push_back (lay::menu_item ("cm_grid_decrease", "grid_decrease:edit", at, tl::to_string (tr ("Select Finer Grid(G)"))));
|
||||||
|
menu_entries.push_back (lay::menu_item ("cm_grid_increase", "grid_increase:edit", at, tl::to_string (tr ("Select Coarser Grid(Shift+G)"))));
|
||||||
|
|
||||||
at = "edit_menu.edit_options_group";
|
at = "edit_menu.edit_options_group";
|
||||||
menu_entries.push_back (lay::menu_item ("cm_undo", "undo:edit", at, tl::to_string (tr ("Undo(Ctrl+Z)"))));
|
menu_entries.push_back (lay::menu_item ("cm_undo", "undo:edit", at, tl::to_string (tr ("Undo(Ctrl+Z)"))));
|
||||||
|
|
|
||||||
|
|
@ -216,9 +216,21 @@ GridNet::configure (const std::string &name, const std::string &value)
|
||||||
double g = 0;
|
double g = 0;
|
||||||
tl::from_string (value, g);
|
tl::from_string (value, g);
|
||||||
if (fabs (g - m_grid) > 1e-6) {
|
if (fabs (g - m_grid) > 1e-6) {
|
||||||
|
|
||||||
m_grid = g;
|
m_grid = g;
|
||||||
need_update = true;
|
need_update = true;
|
||||||
|
|
||||||
|
std::string gs;
|
||||||
|
if (m_grid < 0.4) {
|
||||||
|
// pick nm units below 400nm
|
||||||
|
gs = tl::to_string (m_grid * 1000.0) + tl::to_string (QObject::tr (" nm"));
|
||||||
|
} else {
|
||||||
|
gs = tl::to_string (m_grid) + tl::to_string (QObject::tr (" um"));
|
||||||
|
}
|
||||||
|
mp_view->message (tl::sprintf (tl::to_string (tr ("Grid: %s")), gs));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
taken = false; // to let others use the grid too.
|
taken = false; // to let others use the grid too.
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue