Skip to content
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
8 changes: 4 additions & 4 deletions src/edt/edt/edtPartialService.cc
Original file line number Diff line number Diff line change
Expand Up @@ -762,9 +762,9 @@ PartialShapeFinder::visit_cell (const db::Cell &cell, const db::Box &hit_box, co
{
if (! point_mode ()) {

for (std::vector<int>::const_iterator l = layers ().begin (); l != layers ().end (); ++l) {
for (std::vector<unsigned int>::const_iterator l = layers ().begin (); l != layers ().end (); ++l) {

if (layers ().size () == 1 || (layers ().size () > 1 && cell.bbox ((unsigned int) *l).touches (scan_box))) {
if (layers ().size () == 1 || (layers ().size () > 1 && cell.bbox (*l).touches (scan_box))) {

checkpoint ();

Expand Down Expand Up @@ -897,9 +897,9 @@ PartialShapeFinder::visit_cell (const db::Cell &cell, const db::Box &hit_box, co

} else {

for (std::vector<int>::const_iterator l = layers ().begin (); l != layers ().end (); ++l) {
for (std::vector<unsigned int>::const_iterator l = layers ().begin (); l != layers ().end (); ++l) {

if (layers ().size () == 1 || (layers ().size () > 1 && cell.bbox ((unsigned int) *l).touches (hit_box))) {
if (layers ().size () == 1 || (layers ().size () > 1 && cell.bbox (*l).touches (hit_box))) {

checkpoint ();

Expand Down
31 changes: 29 additions & 2 deletions src/lay/lay/gsiDeclLayMainWindow.cc
Original file line number Diff line number Diff line change
Expand Up @@ -328,6 +328,12 @@ set_menu_items_hidden (lay::MainWindow *mw, const std::map<std::string, bool> &h
mw->dispatcher ()->config_set (lay::cfg_menu_items_hidden, lay::pack_menu_items_hidden (hv));
}

static void
clear_message (lay::MainWindow *mw, int priority)
{
mw->message (std::string (), 0, priority);
}

Class<lay::MainWindow> decl_MainWindow (QT_EXTERNAL_BASE (QMainWindow) "lay", "MainWindow",

// Dispatcher interface and convenience functions
Expand Down Expand Up @@ -475,15 +481,36 @@ Class<lay::MainWindow> decl_MainWindow (QT_EXTERNAL_BASE (QMainWindow) "lay", "M
"\n"
"This method has been added in version 0.24."
) +
gsi::method ("message", &lay::MainWindow::message, gsi::arg ("message"), gsi::arg ("time", -1, "infinite"),
gsi::method_ext ("clear_message", &clear_message, gsi::arg ("priority", -1, "all priorities"),
"@brief Clears the message\n"
"When calling this method with a priority, it will clear the message in the given priority slot, thus "
"unhiding the messages with lower priority. This is equivalent to calling \\message with an empty string.\n"
"\n"
"When calling without a priority, all messages in all priority slots will be cleared.\n"
"\n"
"This method has been added in version 0.30.6."
) +
gsi::method ("message", &lay::MainWindow::message, gsi::arg ("message"), gsi::arg ("time", -1, "infinite"), gsi::arg ("priority", 0),
"@brief Displays a message in the status bar\n"
"\n"
"@param message The message to display\n"
"@param time The time how long to display the message in ms. A negative value means 'infinitely'.\n"
"@param priority The priority of the message. Higher-priority messages have precendence over lower-priority ones.\n"
"\n"
"This given message is shown in the status bar for the given time.\n"
"If a priority is given, higher-priority messages have precedence over lower-priority ones.\n"
"Placing an empty message clears a message with a given priority and unhides messages with lower "
"priority. Standard messages like selection descriptions have priority 0, which is the lowest priority.\n"
"\n"
"Messages generated during modal actions (e.g. 'Click on first point') by convention should have priority 10 "
"and should be tied to the active state of a plugin. This ensures there is only one such message.\n"
"Higher-priority messages must be cleared (set to empty string) explicitly to unhide lower-priority messages "
"when the indicated action is finished.\n"
"\n"
"\\clear_message is a convenience method that will clear messages.\n"
"\n"
"This method has been added in version 0.18. The 'time' parameter was made optional in version 0.28.10."
"This method has been added in version 0.18. The 'time' parameter was made optional in version 0.28.10.\n"
"The 'priority' argument has been added in version 0.30.6."
) +
gsi::method ("resize", (void (lay::MainWindow::*)(int, int)) &lay::MainWindow::resize, gsi::arg ("width"), gsi::arg ("height"),
"@brief Resizes the window\n"
Expand Down
59 changes: 47 additions & 12 deletions src/lay/lay/layMainWindow.cc
Original file line number Diff line number Diff line change
Expand Up @@ -186,6 +186,7 @@ MainWindow::MainWindow (QApplication *app, const char *name, bool undo_enabled)
m_synchronous (false),
m_busy (false),
mp_app (app),
m_message_timer_priority (-1),
m_manager (undo_enabled)
{
setAnimated (false);
Expand Down Expand Up @@ -823,10 +824,15 @@ static int fm_width (const QFontMetrics &fm, const QString &s)
void
MainWindow::format_message ()
{
std::string msg;
if (! m_messages.empty ()) {
msg = (--m_messages.end ())->second;
}

QFontMetrics fm (mp_msg_label->font ());

std::string full_message;
for (const char *c = m_message.c_str (); *c; ++c) {
for (const char *c = msg.c_str (); *c; ++c) {
if (*c == '\\' && (c[1] == '(' || c[1] == ')')) {
++c;
} else {
Expand All @@ -847,7 +853,7 @@ MainWindow::format_message ()

short_message.clear ();

for (const char *c = m_message.c_str (); *c; ++c) {
for (const char *c = msg.c_str (); *c; ++c) {
if (*c == '\\' && c[1] == '(') {
if (nsection++ < ndrop) {
in_drop = true;
Expand Down Expand Up @@ -875,24 +881,53 @@ MainWindow::format_message ()
}

void
MainWindow::message (const std::string &s, int ms)
MainWindow::message (const std::string &s, int ms, int priority)
{
m_message = s;
if (s.empty () && priority < 0) {

m_messages.clear ();

} else if (s.empty ()) {

m_messages.erase (priority);

} else {

// simulate timeout of previous message timer
if (m_message_timer_priority >= 0) {
m_messages.erase (m_message_timer_priority);
}

m_messages[priority] = s;

if (ms >= 0) {
m_message_timer_priority = priority;
m_message_timer.start (ms);
} else {
m_message_timer_priority = -1;
}

}

format_message ();
m_message_timer.start (ms);
}

void
MainWindow::clear_message ()
MainWindow::clear_messages ()
{
m_message.clear ();
m_message_timer.start (0);
m_message_timer.stop ();
m_message_timer_priority = -1;
m_messages.clear ();
format_message ();
}

void
MainWindow::message_timer ()
{
m_message.clear ();
if (m_message_timer_priority >= 0) {
m_messages.erase (m_message_timer_priority);
}
m_message_timer_priority = -1;
format_message ();
}

Expand Down Expand Up @@ -2457,7 +2492,7 @@ MainWindow::select_view (int index)
update_editor_options_dock ();
clear_current_pos ();
edits_enabled_changed ();
clear_message ();
clear_messages ();
menu_needs_update ();

m_disable_tab_selected = dis;
Expand Down Expand Up @@ -2984,7 +3019,7 @@ MainWindow::close_view (int index)
clear_current_pos ();
edits_enabled_changed ();
menu_needs_update ();
clear_message ();
clear_messages ();

update_dock_widget_state ();

Expand Down Expand Up @@ -3469,7 +3504,7 @@ MainWindow::add_view (lay::LayoutViewWidget *view)
connect (view, SIGNAL (dirty_changed (lay::LayoutView *)), this, SLOT (view_title_changed (lay::LayoutView *)));
connect (view, SIGNAL (edits_enabled_changed ()), this, SLOT (edits_enabled_changed ()));
connect (view, SIGNAL (menu_needs_update ()), this, SLOT (menu_needs_update ()));
connect (view, SIGNAL (show_message (const std::string &, int)), this, SLOT (message (const std::string &, int)));
connect (view, SIGNAL (show_message (const std::string &, int, int)), this, SLOT (message (const std::string &, int, int)));
connect (view, SIGNAL (current_pos_changed (double, double, bool)), this, SLOT (current_pos (double, double, bool)));
connect (view, SIGNAL (clear_current_pos ()), this, SLOT (clear_current_pos ()));
connect (view, SIGNAL (mode_change (int)), this, SLOT (select_mode (int)));
Expand Down
7 changes: 4 additions & 3 deletions src/lay/lay/layMainWindow.h
Original file line number Diff line number Diff line change
Expand Up @@ -649,12 +649,12 @@ public slots:
/**
* @brief Displays a status message next to the coordinates
*/
void message (const std::string &s, int ms);
void message (const std::string &s, int ms, int);

/**
* @brief Clears the current message
*/
void clear_message ();
void clear_messages ();

/**
* @brief Selects the given mode
Expand Down Expand Up @@ -789,7 +789,8 @@ protected slots:
QApplication *mp_app;
lay::HelpDialog *mp_assistant;
std::string m_current_session;
std::string m_message;
int m_message_timer_priority;
std::map<int, std::string> m_messages;
std::unique_ptr<QPrinter> mp_printer;
std::vector<QString> m_changed_files;
std::string m_title;
Expand Down
38 changes: 22 additions & 16 deletions src/laybasic/laybasic/layFinder.cc
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@ Finder::closer (double d)
}

void
Finder::start (lay::LayoutViewBase *view, unsigned int cv_index, const std::vector<db::DCplxTrans> &trans, const db::DBox &region, const db::DBox &scan_region, int min_level, int max_level, const std::vector<int> &layers)
Finder::start (lay::LayoutViewBase *view, unsigned int cv_index, const std::vector<db::DCplxTrans> &trans, const db::DBox &region, const db::DBox &scan_region, int min_level, int max_level, const std::vector<unsigned int> &layers)
{
const lay::CellView &cv = view->cellview (cv_index);

Expand All @@ -100,8 +100,8 @@ Finder::start (lay::LayoutViewBase *view, unsigned int cv_index, const std::vect

if (layers.size () == 1) {

m_box_convert = db::box_convert <db::CellInst, false> (*mp_layout, (unsigned int) layers [0]);
m_cell_box_convert = db::box_convert <db::Cell, false> ((unsigned int) layers [0]);
m_box_convert = db::box_convert <db::CellInst, false> (*mp_layout, layers [0]);
m_cell_box_convert = db::box_convert <db::Cell, false> (layers [0]);

} else {

Expand Down Expand Up @@ -202,7 +202,7 @@ Finder::do_find (const db::Cell &cell, int level, const db::DCplxTrans &vp, cons
if (level <= m_max_level /*take level of cell itself*/
&& cell.is_proxy ()
&& m_layers.size () == 1
&& (unsigned int) m_layers [0] == mp_layout->guiding_shape_layer ()) {
&& m_layers [0] == mp_layout->guiding_shape_layer ()) {

// when looking at the guiding shape layer, we can visit this cell as well allowing to find the guiding shapes

Expand Down Expand Up @@ -339,15 +339,18 @@ ShapeFinder::find (LayoutViewBase *view, const db::DBox &region_mu)

std::sort (lprops.begin (), lprops.end (), LPContextCompareOp ());

std::vector<int> layers;
std::vector<unsigned int> layers;
for (std::vector<lay::LayerPropertiesConstIterator>::const_iterator llp = lprops.begin (); llp != lprops.end (); ) {

layers.clear ();

lay::LayerPropertiesConstIterator lp0 = *llp;
LPContextEqualOp eq;
do {
layers.push_back ((*llp)->layer_index ());
int li = (*llp)->layer_index ();
if (li >= 0) {
layers.push_back ((unsigned int) li);
}
++llp;
} while (llp != lprops.end () && eq(lp0, *llp));

Expand Down Expand Up @@ -398,16 +401,19 @@ ShapeFinder::find (lay::LayoutViewBase *view, const lay::LayerProperties &lprops
lay::TextInfo text_info (view);
mp_text_info = (m_flags & db::ShapeIterator::Texts) != 0 ? &text_info : 0;

std::vector<int> layers;
layers.push_back (lprops.layer_index ());
std::vector<unsigned int> layers;
int li = lprops.layer_index ();
if (li >= 0) {
layers.push_back ((unsigned int) li);
}
bool result = find_internal (view, lprops.cellview_index (), &lprops.prop_sel (), lprops.inverse_prop_sel (), lprops.hier_levels (), lprops.trans (), layers, region_mu);

mp_progress = 0;
return result;
}

bool
ShapeFinder::find_internal (lay::LayoutViewBase *view, unsigned int cv_index, const std::set<db::properties_id_type> *prop_sel, bool inv_prop_sel, const lay::HierarchyLevelSelection &hier_sel, const std::vector<db::DCplxTrans> &trans_mu, const std::vector<int> &layers, const db::DBox &region_mu)
bool
ShapeFinder::find_internal (lay::LayoutViewBase *view, unsigned int cv_index, const std::set<db::properties_id_type> *prop_sel, bool inv_prop_sel, const lay::HierarchyLevelSelection &hier_sel, const std::vector<db::DCplxTrans> &trans_mu, const std::vector<unsigned int> &layers, const db::DBox &region_mu)
{
m_cv_index = cv_index;

Expand Down Expand Up @@ -511,13 +517,13 @@ ShapeFinder::visit_cell (const db::Cell &cell, const db::Box &hit_box, const db:

if (! point_mode ()) {

for (std::vector<int>::const_iterator l = layers ().begin (); l != layers ().end (); ++l) {
for (std::vector<unsigned int>::const_iterator l = layers ().begin (); l != layers ().end (); ++l) {

if (layers ().size () == 1 || (layers ().size () > 1 && cell.bbox ((unsigned int) *l).touches (scan_box))) {
if (layers ().size () == 1 || (layers ().size () > 1 && cell.bbox (*l).touches (scan_box))) {

checkpoint ();

const db::Shapes &shapes = cell.shapes ((unsigned int) *l);
const db::Shapes &shapes = cell.shapes (*l);

db::ShapeIterator shape = shapes.begin_touching (scan_box, m_flags, mp_prop_sel, m_inv_prop_sel);
while (! shape.at_end ()) {
Expand Down Expand Up @@ -563,9 +569,9 @@ ShapeFinder::visit_cell (const db::Cell &cell, const db::Box &hit_box, const db:

} else {

for (std::vector<int>::const_iterator l = layers ().begin (); l != layers ().end (); ++l) {
for (std::vector<unsigned int>::const_iterator l = layers ().begin (); l != layers ().end (); ++l) {

if (layers ().size () == 1 || (layers ().size () > 1 && cell.bbox ((unsigned int) *l).touches (scan_box))) {
if (layers ().size () == 1 || (layers ().size () > 1 && cell.bbox (*l).touches (scan_box))) {

checkpoint ();

Expand Down Expand Up @@ -793,7 +799,7 @@ InstFinder::find_internal (LayoutViewBase *view, unsigned int cv_index, const db
try {
std::vector<db::DCplxTrans> tv;
tv.push_back (trans_mu);
start (view, cv_index, tv, region_mu, region_mu, view->get_min_hier_levels (), view->get_max_hier_levels (), std::vector<int> ());
start (view, cv_index, tv, region_mu, region_mu, view->get_min_hier_levels (), view->get_max_hier_levels (), std::vector<unsigned int> ());
} catch (StopException) {
// ..
}
Expand Down
12 changes: 6 additions & 6 deletions src/laybasic/laybasic/layFinder.h
Original file line number Diff line number Diff line change
Expand Up @@ -132,7 +132,7 @@ class LAYBASIC_PUBLIC Finder
}

protected:
const std::vector<int> &layers () const
const std::vector<unsigned int> &layers () const
{
return m_layers;
}
Expand Down Expand Up @@ -183,7 +183,7 @@ class LAYBASIC_PUBLIC Finder
* @param max_level The maximum hierarchy level to check
* @param layers A set of layers to check
*/
void start (LayoutViewBase *view, unsigned int cv_index, const std::vector<db::DCplxTrans> &trans, const db::DBox &region, const db::DBox &scan_region, int min_level, int max_level, const std::vector<int> &layers = std::vector<int> ());
void start (LayoutViewBase *view, unsigned int cv_index, const std::vector<db::DCplxTrans> &trans, const db::DBox &region, const db::DBox &scan_region, int min_level, int max_level, const std::vector<unsigned int> &layers = std::vector<unsigned int> ());

/**
* @brief Provide a basic edge test facility
Expand Down Expand Up @@ -232,7 +232,7 @@ class LAYBASIC_PUBLIC Finder
unsigned int m_cv_index;
db::Box m_region;
db::Box m_scan_region;
std::vector<int> m_layers;
std::vector<unsigned int> m_layers;
double m_distance;
bool m_point_mode;
bool m_catch_all;
Expand Down Expand Up @@ -267,8 +267,8 @@ class LAYBASIC_PUBLIC ShapeFinder
*/
ShapeFinder (bool point_mode, bool top_level_sel, db::ShapeIterator::flags_type flags, const std::set<lay::ObjectInstPath> *excludes = 0, bool capture_all_shapes = false);

bool find (LayoutViewBase *view, const lay::LayerProperties &lprops, const db::DBox &region_mu);
bool find (LayoutViewBase *view, const db::DBox &region_mu);
bool find (lay::LayoutViewBase *view, const lay::LayerProperties &lprops, const db::DBox &region_mu);
bool find (lay::LayoutViewBase *view, const db::DBox &region_mu);

iterator begin () const
{
Expand Down Expand Up @@ -327,7 +327,7 @@ class LAYBASIC_PUBLIC ShapeFinder
bool inv_prop_sel,
const lay::HierarchyLevelSelection &hier_sel,
const std::vector<db::DCplxTrans> &trans_mu,
const std::vector<int> &layers,
const std::vector<unsigned int> &layers,
const db::DBox &region_mu);

const std::set<lay::ObjectInstPath> *mp_excludes;
Expand Down
4 changes: 2 additions & 2 deletions src/laybasic/laybasic/layLayoutViewBase.cc
Original file line number Diff line number Diff line change
Expand Up @@ -693,7 +693,7 @@ LayoutViewBase::set_synchronous (bool s)
}

void
LayoutViewBase::message (const std::string & /*s*/, int /*timeout*/)
LayoutViewBase::message (const std::string & /*s*/, int /*timeout*/, int /*priority*/)
{
// .. nothing yet ..
}
Expand Down Expand Up @@ -4156,7 +4156,7 @@ void
LayoutViewBase::cancel_edits ()
{
// clear any messages
message ();
message (std::string (), 0, -1);

// the move service takes a special role here as it manages the
// transaction for the collective move operation.
Expand Down
Loading
Loading