template<> std::list<QRectF> QConsoleWidget::_cpf<std::list<QRectF>, GetVisibleBlock> (const QConsoleWidget * thisp, int & blockNum ) { std::list<QRectF> ans; const float vwidth = thisp->document()->documentMargin()*2 +(thisp->thisp->isFirstUpdateBImage?100:0) ; const auto size_this = thisp->size(); QTextBlock block_ = thisp->document()->firstBlock(); if (thisp->document()->blockCount() > 10) { int xy = int(0.5 + thisp->document()->documentMargin()); QTextCursor tc = thisp->cursorForPosition(QPoint(xy, xy)); block_ = tc.block(); if (false == block_.isValid()) { return ans; } } blockNum = block_.blockNumber(); QRectF vRect = QRectF( QPointF( block_.layout()->position().x() , thisp->verticalScrollBar()->value()-10 ), QSizeF( size_this.width(), size_this.height()+20 ) ); while ( block_.isValid() ){ auto br = block_.layout()->boundingRect(); br = QRectF( block_.layout()->position(), QSizeF( br.width() + vwidth, br.height() ) ); if (br.intersected(vRect).width()>0) { ans.push_back(br); } else { break; } block_ = block_.next(); } return std::move(ans); }
const CompRegion CompRegion::operator& (const CompRect &r) const { return intersected (r); }
void Menu::paintEvent(QPaintEvent *e) { Painter p(this); auto ms = getms(); auto clip = e->rect(); auto topskip = QRect(0, 0, width(), _st.skip); auto bottomskip = QRect(0, height() - _st.skip, width(), _st.skip); if (clip.intersects(topskip)) p.fillRect(clip.intersected(topskip), _st.itemBg); if (clip.intersects(bottomskip)) p.fillRect(clip.intersected(bottomskip), _st.itemBg); int top = _st.skip; p.translate(0, top); p.setFont(_st.itemFont); for (int i = 0, count = _actions.size(); i != count; ++i) { if (clip.top() + clip.height() <= top) break; auto action = _actions[i]; auto &data = _actionsData[i]; auto actionHeight = action->isSeparator() ? _separatorHeight : _itemHeight; top += actionHeight; if (clip.top() < top) { if (action->isSeparator()) { p.fillRect(0, 0, width(), actionHeight, _st.itemBg); p.fillRect(_st.separatorPadding.left(), _st.separatorPadding.top(), width() - _st.separatorPadding.left() - _st.separatorPadding.right(), _st.separatorWidth, _st.separatorFg); } else { auto enabled = action->isEnabled(); auto selected = ((i == _selected || i == _pressed) && enabled); p.fillRect(0, 0, width(), actionHeight, selected ? _st.itemBgOver : _st.itemBg); if (data.ripple) { data.ripple->paint(p, 0, 0, width(), ms); if (data.ripple->empty()) { data.ripple.reset(); } } if (auto icon = (selected ? data.iconOver : data.icon)) { icon->paint(p, _st.itemIconPosition, width()); } p.setPen(selected ? _st.itemFgOver : (enabled ? _st.itemFg : _st.itemFgDisabled)); p.drawTextLeft(_st.itemPadding.left(), _st.itemPadding.top(), width(), data.text); if (data.hasSubmenu) { const auto left = width() - _st.itemPadding.right() - _st.arrow.width(); const auto top = (_itemHeight - _st.arrow.height()) / 2; if (enabled) { _st.arrow.paint(p, left, top, width()); } else { _st.arrow.paint( p, left, top, width(), _st.itemFgDisabled->c); } } else if (!data.shortcut.isEmpty()) { p.setPen(selected ? _st.itemFgShortcutOver : (enabled ? _st.itemFgShortcut : _st.itemFgShortcutDisabled)); p.drawTextRight(_st.itemPadding.right(), _st.itemPadding.top(), width(), data.shortcut); } else if (data.toggle) { auto toggleSize = data.toggle->getSize(); data.toggle->paint(p, width() - _st.itemPadding.right() - toggleSize.width() + _st.itemToggleShift, (_itemHeight - toggleSize.height()) / 2, width(), ms); } } } p.translate(0, actionHeight); } }
bool CompRegion::intersects (const CompRegion &r) const { return !intersected (r).isEmpty (); }
void operator()(const hypergraph_type& source, hypergraph_type& target) { if (! source.is_valid()) { target.clear(); return; } target = source; edge_set_type outgoing(target.nodes.size()); edge_set_type leaning(target.nodes.size()); hypergraph_type::edge_set_type::const_iterator eiter_end = target.edges.end(); for (hypergraph_type::edge_set_type::const_iterator eiter = target.edges.begin(); eiter != eiter_end; ++ eiter) { const edge_type& edge = *eiter; if (edge.tails.empty()) continue; int tail_pos = 0; rule_type::symbol_set_type::const_iterator riter_end = edge.rule->rhs.end(); for (rule_type::symbol_set_type::const_iterator riter = edge.rule->rhs.begin(); riter != riter_end; ++ riter) if (riter->is_non_terminal()) { const int __non_terminal_index = riter->non_terminal_index(); const int antecedent_index = utils::bithack::branch(__non_terminal_index <= 0, tail_pos, __non_terminal_index - 1); if (antecedent_index == 0) leaning[edge.tails[tail_pos]].push_back(edge.id); outgoing[edge.tails[tail_pos]].push_back(edge.id); ++ tail_pos; } } hypergraph_type::node_set_type::const_reverse_iterator niter_end = target.nodes.rend(); for (hypergraph_type::node_set_type::const_reverse_iterator niter = target.nodes.rbegin(); niter != niter_end; ++ niter) { const hypergraph_type::node_type& node = *niter; // this should not happen, though.. if (node.edges.empty()) continue; if (leaning[node.id].empty()) continue; if (outgoing[node.id].size() == 1) { if (! target.edges[outgoing[node.id].front()].features.empty()) { const feature_set_type intersected(target.edges[outgoing[node.id].front()].features); node_type::edge_set_type::const_iterator eiter_end = node.edges.end(); for (node_type::edge_set_type::const_iterator eiter = node.edges.begin(); eiter != eiter_end; ++ eiter) target.edges[*eiter].features += intersected; edge_list_type::const_iterator oiter_end = outgoing[node.id].end(); for (edge_list_type::const_iterator oiter = outgoing[node.id].begin(); oiter != oiter_end; ++ oiter) target.edges[*oiter].features -= intersected; } } else { feature_set_type intersected(target.edges[outgoing[node.id].front()].features); edge_list_type::const_iterator oiter_end = outgoing[node.id].end(); for (edge_list_type::const_iterator oiter = outgoing[node.id].begin() + 1; oiter != oiter_end; ++ oiter) intersected.intersect(target.edges[*oiter].features); if (! intersected.empty()) { edge_list_type::const_iterator oiter_end = outgoing[node.id].end(); for (edge_list_type::const_iterator oiter = outgoing[node.id].begin(); oiter != oiter_end; ++ oiter) target.edges[*oiter].features -= intersected; node_type::edge_set_type::const_iterator eiter_end = node.edges.end(); for (node_type::edge_set_type::const_iterator eiter = node.edges.begin(); eiter != eiter_end; ++ eiter) target.edges[*eiter].features += intersected; } } } }