void QIMPenWidget::mouseMoveEvent( QMouseEvent *e ) { if ( !readOnly && mode == Input ) { int dx = QABS( e->pos().x() - lastPoint.x() ); int dy = QABS( e->pos().y() - lastPoint.y() ); if ( dx + dy > 1 ) { if ( inputStroke->addPoint( e->pos() ) ) { QPainter paint( this ); paint.setPen( Qt::black ); paint.setBrush( Qt::black ); const QArray<QIMPenGlyphLink> &chain = inputStroke->chain(); QPoint p( e->pos() ); for ( int i = (int)chain.count()-1; i >= 0; i-- ) { paint.drawRect( p.x()-1, p.y()-1, 2, 2 ); p.rx() -= chain[i].dx; p.ry() -= chain[i].dy; if ( p == lastPoint ) break; } /* ### use this when thick lines work properly on all devices paint.setPen( QPen( Qt::black, 2 ) ); paint.drawLine( lastPoint, e->pos() ); */ } lastPoint = e->pos(); } } }
void KoDecorationTab::setShadow( double shadowDistanceX, double shadowDistanceY, const QColor& shadowColor ) { short int sd = SD_RIGHT_UP; double dist = 0.0; if ( shadowDistanceX > 0 ) // right if ( shadowDistanceY == 0 ) sd = SD_RIGHT; else sd = shadowDistanceY > 0 ? SD_RIGHT_BOTTOM : SD_RIGHT_UP; else if ( shadowDistanceX == 0 ) // top/bottom sd = shadowDistanceY > 0 ? SD_BOTTOM : SD_UP; else // left if ( shadowDistanceY == 0 ) sd = SD_LEFT; else sd = shadowDistanceY > 0 ? SD_LEFT_BOTTOM : SD_LEFT_UP; shadowDirectionButtonGroup->setButton( sd ); dist = QMAX( QABS(shadowDistanceX), QABS(shadowDistanceY) ); shadowDistanceKDoubleNumInput->setValue( dist ); shadowKColorButton->setColor( shadowColor.isValid() ? shadowColor: gray ); }
OPimBackendOccurrence::List ODateBookAccessBackend::filterOccurrences( const OPimBackendOccurrence::List dayList, const QDateTime& dt ) { OPimBackendOccurrence::List tmpList; OPimBackendOccurrence::List::ConstIterator it; for ( it = dayList.begin(); it != dayList.end(); ++it ) { OPimBackendOccurrence occ = *it; /* * Let us find occurrences that are 'now'! * If the dt.date() is on the same day as start or end of the Occurrence * check how near start/end are. * If it is in the middle of a multiday occurrence list it. * * We might want to 'lose' the sixty second offset and list * all Events which are active at that time. */ if ( dt.date() == occ.startDateTime().date() ) { if ( QABS( dt.time().secsTo( occ.startDateTime().time() ) ) < 60 ) tmpList.append( occ ); }else if ( dt.date() == occ.endDateTime().date() ) { if ( QABS( dt.time().secsTo( occ.endDateTime().time() ) ) < 60 ) tmpList.append( occ ); }else if ( dt.date() >= occ.startDateTime().date() && dt.date() >= occ.endDateTime().date() ) tmpList.append( occ ); } return tmpList; }
int KPrGeneralProperty::getGeneralPropertyChange() const { int flags = 0; if ( !m_generalValue.m_name.isNull() && m_generalValue.m_name != m_ui->nameInput->text() ) flags |= Name; if ( m_ui->protect->state() != QButton::NoChange ) { if ( ( m_ui->protect->isOn() ? STATE_ON : STATE_OFF ) != m_generalValue.m_protect ) flags |= Protect; if ( !m_ui->protect->isOn() ) { KoRect rect = getRect(); if ( m_generalValue.m_rect.left() != rect.left() ) flags |= Left; if ( m_generalValue.m_rect.top() != rect.top() ) flags |= Top; // this has to be done as the rect cahnges width/hight if left or top is changed if ( QABS( m_generalValue.m_rect.width() - rect.width() ) > 1e-6 ) flags |= Width; if ( QABS( m_generalValue.m_rect.height() - rect.height() ) > 1e-6 ) flags |= Height; } } if ( m_ui->keepRatio->state() != QButton::NoChange && ( m_ui->keepRatio->isOn() ? STATE_ON : STATE_OFF ) != m_generalValue.m_keepRatio ) { flags |= KeepRatio; } return flags; }
void QRangeControl::setSteps(int lineStep,int pageStep) { if (lineStep != line || pageStep != page) { line = QABS(lineStep); page = QABS(pageStep); stepChange(); } }
QRangeControl::QRangeControl( int minValue, int maxValue, int lineStep, int pageStep, int value ) { minVal = minValue; maxVal = maxValue; line = QABS( lineStep ); page = QABS( pageStep ); prevVal = minVal - 1; val = bound( value ); d = 0; }
bool QwtPlotPicker::end(bool ok) { ok = QwtPicker::end(ok); if ( !ok ) return FALSE; QwtPlot *plot = QwtPlotPicker::plot(); if ( !plot ) return FALSE; const QPointArray &pa = selection(); if ( pa.count() == 0 ) return FALSE; if ( selectionFlags() & PointSelection ) { const QwtDoublePoint pos = invTransform(pa[0]); emit selected(pos); } else if ( (selectionFlags() & RectSelection) && pa.count() >= 2 ) { QPoint p1 = pa[0]; QPoint p2 = pa[int(pa.count() - 1)]; if ( selectionFlags() & CenterToCorner ) { p1.setX(p1.x() - (p2.x() - p1.x())); p1.setY(p1.y() - (p2.y() - p1.y())); } else if ( selectionFlags() & CenterToRadius ) { const int radius = QMAX(QABS(p2.x() - p1.x()), QABS(p2.y() - p1.y())); p2.setX(p1.x() + radius); p2.setY(p1.y() + radius); p1.setX(p1.x() - radius); p1.setY(p1.y() - radius); } emit selected(invTransform(QRect(p1, p2)).normalize()); } else { QwtArray<QwtDoublePoint> dpa(pa.count()); for ( int i = 0; i < int(pa.count()); i++ ) dpa[i] = invTransform(pa[i]); emit selected(dpa); } return TRUE; }
/** * -1 if no time is associated * otherwise the length of the occurrence in hours */ int OPimOccurrence::length()const { if ( m_isAllDay ) return -1; else return ( m_end.hour() * 60 - m_start.hour() * 60 ) + QABS( m_start.minute() - m_end.minute() ); }
void selectThisSize() { int psize=(ptsize<<6)/10; // Assume 72 dpi for now const int dpi=72; FT_Error err; err=FT_Set_Char_Size(myface, psize,psize,dpi,dpi); if (err) { if (FT_IS_SCALABLE(myface) ) { qWarning("Set char size error %x for size %d",err,ptsize); } else { int best=-1; int bdh=99; for (int i=0; i<myface->num_fixed_sizes; i++) { FT_Bitmap_Size& sz=myface->available_sizes[i]; int dh = sz.height - ptsize*dpi/72/10; dh = QABS(dh); if ( dh < bdh ) { bdh=dh; best=i; } } if ( best >= 0 ) err=FT_Set_Pixel_Sizes(myface, myface->available_sizes[best].width, myface->available_sizes[best].height); if ( err ) qWarning("Set char size error %x for size %d",err,ptsize); } } }
void Screen::animate() { if ( step == 0 ) return; int t = t0; int p = pos0; if ( step < 0 ) { t += width() + step; } else { t -= step; p -= step; if ( p < 0 ) p += width(); } for ( int i = 0; i < QABS( step ); i++ ) { int y = (int)((height()-FrameWidth)/2 * sin( 3.1415*(double)t/180.0 )); yval[ p ] = y; ++t; t %= 360; ++p; p %= width(); } t0 -= step; if ( t0 < 0 ) t0 += 360; pos0 = (pos0 - step) % width(); if ( pos0 < 0 ) pos0 += width(); scroll( step, 0, QRect( FrameWidth, FrameWidth, width()-2*FrameWidth, height()-2*FrameWidth )); }
QString Conversion::lineSpacing( const wvWare::Word97::LSPD& lspd ) { QString value( "0" ); if ( lspd.fMultLinespace == 1 ) { // This will be e.g. 1.5 for a 1.5 linespacing. float proportionalLineSpacing = (float)lspd.dyaLine / 240.0; if ( QABS(proportionalLineSpacing - 1.5) <= 0.25 ) // close to 1.5? value = "oneandhalf"; else if ( proportionalLineSpacing > 1.75) // close to 2.0, or more? value = "double"; } else if ( lspd.fMultLinespace == 0 ) { // see sprmPDyaLine in generator_wword8.htm //float value = QABS((float)lspd.dyaLine / 20.0); // twip -> pt // lspd.dyaLine > 0 means "at least", < 0 means "exactly" // "at least" is now possible in kword, but here it's the size of the whole // line, not the spacing between the line (!) // To convert between the two, we'd need to find out the height of the // highest character in the line, and substract it from the value..... Ouch. // Better implement line-height-at-least like OOo has. } else kdWarning(30513) << "Unhandled LSPD::fMultLinespace value: " << lspd.fMultLinespace << endl; return value; }
void QSpinWidget::wheelEvent( QWheelEvent *e ) { e->accept(); static float offset = 0; static QSpinWidget* offset_owner = 0; if ( offset_owner != this ) { offset_owner = this; offset = 0; } offset += -e->delta()/120; if ( QABS( offset ) < 1 ) return; int ioff = int(offset); int i; for( i=0; i < QABS( ioff ); i++ ) offset > 0 ? stepDown() : stepUp(); offset -= ioff; }
void GLControlWidget::drawText() { glPushAttrib(GL_LIGHTING_BIT | GL_TEXTURE_BIT); glDisable(GL_LIGHTING); glDisable(GL_TEXTURE_2D); qglColor(white); QString str("Rendering text in OpenGL is easy with Qt"); QFontMetrics fm(font()); renderText((width() - fm.width(str)) / 2, 15, str); QFont f("courier", 8); QFontMetrics fmc(f); qglColor(QColor("skyblue")); int x, y, z; x = (xRot >= 0) ? (int) xRot % 360 : 359 - (QABS((int) xRot) % 360); y = (yRot >= 0) ? (int) yRot % 360 : 359 - (QABS((int) yRot) % 360); z = (zRot >= 0) ? (int) zRot % 360 : 359 - (QABS((int) zRot) % 360); str.sprintf("Rot X: %03d - Rot Y: %03d - Rot Z: %03d", x, y, z); renderText((width() - fmc.width(str)) / 2, height() - 15, str, f); glPopAttrib(); }
/*!\reimp */ void QSlider::wheelEvent( QWheelEvent * e){ static float offset = 0; static QSlider* offset_owner = 0; if (offset_owner != this){ offset_owner = this; offset = 0; } offset += -e->delta()*QMAX(pageStep(),lineStep())/120; if (QABS(offset)<1) return; setValue( value() + int(offset) ); offset -= int(offset); }
OEffectiveEvent::ValueList ODateBookAccessBackend::effectiveNonRepeatingEvents( const QDateTime& dt ) { OEffectiveEvent::ValueList day = effectiveNonRepeatingEvents( dt.date(), dt.date() ); OEffectiveEvent::ValueList::Iterator it; OEffectiveEvent::ValueList tmpList; QDateTime dtTmp; for ( it = day.begin(); it != day.end(); ++it ) { dtTmp = QDateTime( (*it).date(), (*it).startTime() ); if ( QABS(dt.secsTo(dtTmp) ) < 60 ) tmpList.append( (*it) ); } return tmpList; }
QValueList<EffectiveEvent> DateBookDB::getEffectiveEvents( const QDateTime &dt) { QValueList<EffectiveEvent> day = getEffectiveEvents(dt.date(), dt.date()); QValueListConstIterator<EffectiveEvent> it; QValueList<EffectiveEvent> tmpList; QDateTime dtTmp; for (it = day.begin(); it != day.end(); ++it ) { dtTmp = QDateTime( (*it).date(), (*it).start() ); // at the moment we don't have second granularity, be nice about that.. if ( QABS(dt.secsTo(dtTmp)) < 60 ) tmpList.append( *it ); } return tmpList; }
void QDesignerToolBar::buttonMouseMoveEvent( QMouseEvent *e, QObject *o ) { if ( widgetInserting || ( e->state() & LeftButton ) == 0 ) return; if ( QABS( QPoint( dragStartPos - e->pos() ).manhattanLength() ) < QApplication::startDragDistance() ) return; QMap<QWidget*, QAction*>::Iterator it = actionMap.find( (QWidget*)o ); if ( it == actionMap.end() ) return; QAction *a = *it; if ( !a ) return; int index = actionList.find( a ); RemoveActionFromToolBarCommand *cmd = new RemoveActionFromToolBarCommand( tr( "Delete Action '%1' from Toolbar '%2'" ). arg( a->name() ).arg( caption() ), formWindow, a, this, index ); formWindow->commandHistory()->addCommand( cmd ); cmd->execute(); QApplication::sendPostedEvents(); adjustSize(); QString type = ::qt_cast<QActionGroup*>(a) ? QString( "application/x-designer-actiongroup" ) : ::qt_cast<QSeparatorAction*>(a) ? QString( "application/x-designer-separator" ) : QString( "application/x-designer-actions" ); QStoredDrag *drag = new QStoredDrag( type, this ); QString s = QString::number( (long)a ); // #### huha, that is evil drag->setEncodedData( QCString( s.latin1() ) ); drag->setPixmap( a->iconSet().pixmap() ); if ( ::qt_cast<QDesignerAction*>(a) ) { if ( formWindow->widgets()->find( ( (QDesignerAction*)a )->widget() ) ) formWindow->selectWidget( ( (QDesignerAction*)a )->widget(), FALSE ); } if ( !drag->drag() ) { AddActionToToolBarCommand *cmd = new AddActionToToolBarCommand( tr( "Add Action '%1' to Toolbar '%2'" ). arg( a->name() ).arg( caption() ), formWindow, a, this, index ); formWindow->commandHistory()->addCommand( cmd ); cmd->execute(); } lastIndicatorPos = QPoint( -1, -1 ); indicator->hide(); }
QWMatrix QWMatrix::invert( bool *invertible ) const { double det = _m11*_m22 - _m12*_m21; if ( QABS(det) < 0.000001 ) { // very close to zero if ( invertible ) // (whatever that means...) *invertible = FALSE; // singular matrix QWMatrix defaultMatrix; return defaultMatrix; } else { // invertible matrix if ( invertible ) *invertible = TRUE; double dinv = 1.0/det; QWMatrix imatrix( (float)(_m22*dinv), (float)(-_m12*dinv), (float)(-_m21*dinv), (float)( _m11*dinv), (float)((_m21*_dy - _m22*_dx)*dinv), (float)((_m12*_dx - _m11*_dy)*dinv) ); return imatrix; } }
const KstTimezone *KstTimezones::local() { const KstTimezone *local = 0; // First try the simplest solution of checking for well-formed TZ setting. char *envZone = ::getenv("TZ"); if (envZone) { if (envZone[0] == '\0') { return m_UTC; } else if (envZone[0] == ':') { envZone++; } local = zone(envZone); } if (local) return local; // Try to match /etc/localtime against the list of zoneinfo files. QFile f; f.setName("/etc/localtime"); if (f.open(IO_ReadOnly)) { // Compute the MD5 sum of /etc/localtime. KMD5 context(""); context.reset(); context.update(f); QIODevice::Offset referenceSize = f.size(); QString referenceMd5Sum = context.hexDigest(); f.close(); if (!m_zoneinfoDir.isEmpty()) { // Compare it with each zoneinfo file. for (ZoneMap::Iterator it = m_zones->begin(); it != m_zones->end(); ++it) { KstTimezone *zone = it.data(); f.setName(m_zoneinfoDir + '/' + zone->name()); if (f.open(IO_ReadOnly)) { QIODevice::Offset candidateSize = f.size(); QString candidateMd5Sum; if (candidateSize == referenceSize) { // Only do the heavy lifting for file sizes which match. context.reset(); context.update(f); candidateMd5Sum = context.hexDigest(); } f.close(); if (candidateMd5Sum == referenceMd5Sum) { local = zone; break; } } } } } if (local) return local; // BSD support. QString fileZone; f.setName("/etc/timezone"); if (!f.open(IO_ReadOnly)) { // Solaris support using /etc/default/init. f.setName("/etc/default/init"); if (f.open(IO_ReadOnly)) { QTextStream ts(&f); ts.setEncoding(QTextStream::Latin1); // Read the last line starting "TZ=". while (!ts.atEnd()) { fileZone = ts.readLine(); if (fileZone.startsWith("TZ=")) { fileZone = fileZone.mid(3); local = zone(fileZone); } } f.close(); } } else { QTextStream ts(&f); ts.setEncoding(QTextStream::Latin1); // Read the first line. if (!ts.atEnd()) { fileZone = ts.readLine(); local = zone(fileZone); } f.close(); } if (local) return local; // None of the deterministic stuff above has worked: try a heuristic. We // try to find a pair of matching timezone abbreviations...that way, we'll // likely return a value in the user's own country. if (!m_zoneinfoDir.isEmpty()) { tzset(); AbbreviationsMatch matcher(tzname[0], tzname[1]); int bestOffset = INT_MAX; for (ZoneMap::Iterator it = m_zones->begin(); it != m_zones->end(); ++it) { KstTimezone *zone = it.data(); int candidateOffset = QABS(zone->offset(Qt::LocalTime)); if (zone->parse(matcher) && matcher.test() && (candidateOffset < bestOffset)) { bestOffset = candidateOffset; local = zone; } } } if (local) return local; return m_UTC; }
int OEffectiveEvent::length()const { return (data->end.hour() * 60 - data->start.hour() * 60) + QABS(data->start.minute() - data->end.minute() ); }
/*!\reimp */ void QPlatinumStyle::drawControl( ControlElement element, QPainter *p, const QWidget *widget, const QRect &r, const QColorGroup &cg, SFlags how, const QStyleOption& opt ) const { switch( element ) { case CE_PushButton: { #ifndef QT_NO_PUSHBUTTON QColorGroup myCg( cg ); const QPushButton *btn; int x1, y1, x2, y2; bool useBevelButton; SFlags flags; flags = Style_Default; btn = (const QPushButton*)widget; p->setBrushOrigin( -widget->backgroundOffset().x(), -widget->backgroundOffset().y() ); // take care of the flags based on what we know... if ( btn->isDown() ) flags |= Style_Down; if ( btn->isOn() ) flags |= Style_On; if ( btn->isEnabled() ) flags |= Style_Enabled; if ( btn->isDefault() ) flags |= Style_Default; if (! btn->isFlat() && !(flags & Style_Down)) flags |= Style_Raised; r.coords( &x1, &y1, &x2, &y2 ); p->setPen( cg.foreground() ); p->setBrush( QBrush(cg.button(), NoBrush) ); QBrush fill; if ( btn->isDown() ) { fill = cg.brush( QColorGroup::Dark ); // this could be done differently, but this // makes a down Bezel drawn correctly... myCg.setBrush( QColorGroup::Mid, fill ); } else if ( btn->isOn() ) { fill = QBrush( cg.mid(), Dense4Pattern ); myCg.setBrush( QColorGroup::Mid, fill ); } // to quote the old QPlatinumStlye drawPushButton... // small or square image buttons as well as toggle buttons are // bevel buttons (what a heuristic....) if ( btn->isToggleButton() || ( btn->pixmap() && (btn->width() * btn->height() < 1600 || QABS( btn->width() - btn->height()) < 10 )) ) useBevelButton = TRUE; else useBevelButton = FALSE; int diw = pixelMetric( PM_ButtonDefaultIndicator, widget ); if ( btn->isDefault() ) { x1 += 1; y1 += 1; x2 -= 1; y2 -= 1; QColorGroup cg2( myCg ); SFlags myFlags = flags; // don't draw the default button sunken, unless it's necessary. if ( myFlags & Style_Down ) myFlags ^= Style_Down; if ( myFlags & Style_Sunken ) myFlags ^= Style_Sunken; cg2.setColor( QColorGroup::Button, cg.mid() ); if ( useBevelButton ) { drawPrimitive( PE_ButtonBevel, p, QRect( x1, y1, x2 - x1 + 1, y2 - y1 + 1 ), myCg, myFlags, opt ); } else { drawPrimitive( PE_ButtonCommand, p, QRect( x1, y1, x2 - x1 + 1, y2 - y1 + 1 ), cg2, myFlags, opt ); } } if ( btn->isDefault() || btn->autoDefault() ) { x1 += diw; y1 += diw; x2 -= diw; y2 -= diw; } if ( !btn->isFlat() || btn->isOn() || btn->isDown() ) { if ( useBevelButton ) { // fix for toggle buttons... if ( flags & (Style_Down | Style_On) ) flags |= Style_Sunken; drawPrimitive( PE_ButtonBevel, p, QRect( x1, y1, x2 - x1 + 1, y2 - y1 + 1 ), myCg, flags, opt ); } else { drawPrimitive( PE_ButtonCommand, p, QRect( x1, y1, x2 - x1 + 1, y2 - y1 + 1 ), myCg, flags, opt ); } } if ( p->brush().style() != NoBrush ) p->setBrush( NoBrush ); break; #endif } case CE_PushButtonLabel: { #ifndef QT_NO_PUSHBUTTON const QPushButton *btn; bool on; int x, y, w, h; SFlags flags; flags = Style_Default; btn = (const QPushButton*)widget; on = btn->isDown() || btn->isOn(); r.rect( &x, &y, &w, &h ); if ( btn->isMenuButton() ) { int dx = pixelMetric( PM_MenuButtonIndicator, widget ); QColorGroup g = cg; int xx = x + w - dx - 4; int yy = y - 3; int hh = h + 6; if ( !on ) { p->setPen( g.mid() ); p->drawLine( xx, yy + 2, xx, yy + hh - 3 ); p->setPen( g.button() ); p->drawLine( xx + 1, yy + 1, xx + 1, yy + hh - 2 ); p->setPen( g.light() ); p->drawLine( xx + 2, yy + 2, xx + 2, yy + hh - 2 ); } if ( btn->isEnabled() ) flags |= Style_Enabled; drawPrimitive( PE_ArrowDown, p, QRect(x + w - dx - 1, y + 2, dx, h - 4), g, flags, opt ); w -= dx; } #ifndef QT_NO_ICONSET if ( btn->iconSet() && !btn->iconSet()->isNull() ) { QIconSet::Mode mode = btn->isEnabled() ? QIconSet::Normal : QIconSet::Disabled; if ( mode == QIconSet::Normal && btn->hasFocus() ) mode = QIconSet::Active; QIconSet::State state = QIconSet::Off; if ( btn->isToggleButton() && btn->isOn() ) state = QIconSet::On; QPixmap pixmap = btn->iconSet()->pixmap( QIconSet::Small, mode, state ); int pixw = pixmap.width(); int pixh = pixmap.height(); p->drawPixmap( x + 2, y + h / 2 - pixh / 2, pixmap ); x += pixw + 4; w -= pixw + 4; } #endif drawItem( p, QRect( x, y, w, h ), AlignCenter | ShowPrefix, btn->colorGroup(), btn->isEnabled(), btn->pixmap(), btn->text(), -1, on ? &btn->colorGroup().brightText() : &btn->colorGroup().buttonText() ); if ( btn->hasFocus() ) drawPrimitive( PE_FocusRect, p, subRect(SR_PushButtonFocusRect, widget), cg, flags ); break; #endif } default: QWindowsStyle::drawControl( element, p, widget, r, cg, how, opt ); break; } }
/*!\reimp */ void QPlatinumStyle::drawPrimitive( PrimitiveElement pe, QPainter *p, const QRect &r, const QColorGroup &cg, SFlags flags, const QStyleOption& opt ) const { switch (pe) { case PE_HeaderSection: { // adjust the sunken flag, otherwise headers are drawn // sunken... if ( flags & Style_Sunken ) flags ^= Style_Sunken; drawPrimitive( PE_ButtonBevel, p, r, cg, flags, opt ); break; } case PE_ButtonTool: { // tool buttons don't change color when pushed in platinum, // so we need to make the mid and button color the same QColorGroup myCG = cg; QBrush fill; // quick trick to make sure toolbuttons drawn sunken // when they are activated... if ( flags & Style_On ) flags |= Style_Sunken; fill = myCG.brush( QColorGroup::Button ); myCG.setBrush( QColorGroup::Mid, fill ); drawPrimitive( PE_ButtonBevel, p, r, myCG, flags, opt ); break; } case PE_ButtonBevel: { int x, y, w, h; r.rect( &x, &y, &w, &h ); QPen oldPen = p->pen(); if ( w * h < 1600 || QABS(w - h) > 10 ) { // small buttons if ( !(flags & (Style_Sunken | Style_Down)) ) { p->fillRect( x + 2, y + 2, w - 4, h - 4, cg.brush(QColorGroup::Button) ); // the bright side p->setPen( cg.dark() ); // the bright side p->setPen( cg.dark() ); p->drawLine( x, y, x + w - 1, y ); p->drawLine( x, y, x, y + h - 1 ); p->setPen( cg.light() ); p->drawLine( x + 1, y + 1, x + w - 2, y + 1 ); p->drawLine( x + 1, y + 1, x + 1, y + h - 2 ); // the dark side p->setPen( cg.mid() ); p->drawLine( x + 2, y + h - 2, x + w - 2, y + h - 2 ); p->drawLine( x + w - 2, y + 2, x + w - 2, y + h - 3 ); p->setPen( cg.dark().dark() ); p->drawLine( x + 1, y + h - 1, x + w - 1, y + h - 1 ); p->drawLine( x + w - 1, y + 1, x + w - 1, y + h - 2 ); } else { p->fillRect(x + 2, y + 2, w - 4, h - 4, cg.brush( QColorGroup::Mid )); // the dark side p->setPen( cg.dark().dark() ); p->drawLine( x, y, x + w - 1, y ); p->drawLine( x, y, x, y + h - 1 ); p->setPen( cg.mid().dark()); p->drawLine( x + 1, y + 1, x + w-2, y + 1); p->drawLine( x + 1, y + 1, x + 1, y + h - 2 ); // the bright side! p->setPen(cg.button()); p->drawLine( x + 1, y + h - 2, x + w - 2, y + h - 2 ); p->drawLine( x + w - 2, y + 1, x + w - 2, y + h - 2 ); p->setPen(cg.dark()); p->drawLine(x, y + h - 1, x + w - 1, y + h - 1 ); p->drawLine(x + w - 1, y, x + w - 1, y + h - 1 ); } } else { // big ones if ( !(flags & (Style_Sunken | Style_Down)) ) { p->fillRect( x + 3, y + 3, w - 6, h - 6, cg.brush(QColorGroup::Button) ); // the bright side p->setPen( cg.button().dark() ); p->drawLine( x, y, x + w - 1, y ); p->drawLine( x, y, x, y + h - 1 ); p->setPen( cg.button() ); p->drawLine( x + 1, y + 1, x + w - 2, y + 1 ); p->drawLine( x + 1, y + 1, x + 1, y + h - 2 ); p->setPen( cg.light() ); p->drawLine( x + 2, y + 2, x + 2, y + h - 2 ); p->drawLine( x + 2, y + 2, x + w - 2, y + 2 ); // the dark side! p->setPen( cg.mid() ); p->drawLine( x + 3, y + h - 3, x + w - 3, y + h - 3 ); p->drawLine( x + w - 3, y + 3, x + w - 3, y + h - 3 ); p->setPen( cg.dark() ); p->drawLine( x + 2, y + h - 2, x + w - 2, y + h - 2 ); p->drawLine( x + w - 2, y + 2, x + w - 2, y + h - 2 ); p->setPen( cg.dark().dark() ); p->drawLine( x + 1, y + h - 1, x + w - 1, y + h - 1 ); p->drawLine( x + w - 1, y + 1, x + w - 1, y + h - 1 ); } else { p->fillRect( x + 3, y + 3, w - 6, h - 6, cg.brush( QColorGroup::Mid ) ); // the dark side p->setPen( cg.dark().dark().dark() ); p->drawLine( x, y, x + w - 1, y ); p->drawLine( x, y, x, y + h - 1 ); p->setPen( cg.dark().dark() ); p->drawLine( x + 1, y + 1, x + w - 2, y + 1 ); p->drawLine( x + 1, y + 1, x + 1, y + h - 2 ); p->setPen( cg.mid().dark() ); p->drawLine( x + 2, y + 2, x + 2, y + w - 2 ); p->drawLine( x + 2, y + 2, x + w - 2, y + 2 ); // the bright side! p->setPen( cg.button() ); p->drawLine( x + 2, y + h - 3, x + w - 3, y + h - 3 ); p->drawLine( x + w - 3, y + 3, x + w - 3, y + h - 3 ); p->setPen( cg.midlight() ); p->drawLine( x + 1, y + h - 2, x + w - 2, y + h - 2 ); p->drawLine( x + w - 2, y + 1, x + w - 2, y + h - 2 ); p->setPen( cg.dark() ); p->drawLine( x, y + h - 1, x + w - 1, y + h - 1 ); p->drawLine( x + w - 1, y, x + w - 1, y + h - 1 ); // corners p->setPen( mixedColor(cg.dark().dark().dark(), cg.dark()) ); p->drawPoint( x, y + h - 1 ); p->drawPoint( x + w - 1, y ); p->setPen( mixedColor(cg.dark().dark(), cg.midlight()) ); p->drawPoint( x + 1, y + h - 2 ); p->drawPoint( x + w - 2, y + 1 ); p->setPen( mixedColor(cg.mid().dark(), cg.button() ) ); p->drawPoint( x + 2, y + h - 3 ); p->drawPoint( x + w - 3, y + 2 ); } } p->setPen( oldPen ); break; } case PE_ButtonCommand: { QPen oldPen = p->pen(); int x, y, w, h; r.rect( &x, &y, &w, &h); if ( !(flags & (Style_Down | Style_On)) ) { p->fillRect( x+3, y+3, w-6, h-6, cg.brush( QColorGroup::Button )); // the bright side p->setPen( cg.shadow() ); p->drawLine( x, y, x+w-1, y ); p->drawLine( x, y, x, y + h - 1 ); p->setPen( cg.button() ); p->drawLine( x + 1, y + 1, x + w - 2, y + 1 ); p->drawLine( x + 1, y + 1, x + 1, y + h - 2 ); p->setPen( cg.light() ); p->drawLine( x + 2, y + 2, x + 2, y + h - 2 ); p->drawLine( x + 2, y + 2, x + w - 2, y + 2 ); // the dark side! p->setPen( cg.mid() ); p->drawLine( x + 3, y + h - 3 ,x + w - 3, y + h - 3 ); p->drawLine( x + w - 3, y + 3, x + w - 3, y + h - 3 ); p->setPen( cg.dark() ); p->drawLine( x + 2, y + h - 2, x + w - 2, y + h - 2 ); p->drawLine( x + w - 2, y + 2, x + w - 2, y + h - 2 ); p->setPen( cg.shadow() ); p->drawLine( x + 1, y + h - 1, x + w - 1, y + h - 1 ); p->drawLine( x + w - 1, y, x + w - 1, y + h - 1 ); // top left corner: p->setPen( cg.background() ); p->drawPoint( x, y ); p->drawPoint( x + 1, y ); p->drawPoint( x, y+1 ); p->setPen( cg.shadow() ); p->drawPoint( x + 1, y + 1 ); p->setPen( cg.button() ); p->drawPoint( x + 2, y + 2 ); p->setPen( white ); p->drawPoint( x + 3, y + 3 ); // bottom left corner: p->setPen( cg.background() ); p->drawPoint( x, y + h - 1 ); p->drawPoint( x + 1, y + h - 1 ); p->drawPoint( x, y + h - 2 ); p->setPen( cg.shadow() ); p->drawPoint( x + 1, y + h - 2 ); p->setPen( cg.dark() ); p->drawPoint( x + 2, y + h - 3 ); // top right corner: p->setPen( cg.background() ); p->drawPoint( x + w -1, y ); p->drawPoint( x + w - 2, y ); p->drawPoint( x + w - 1, y + 1 ); p->setPen( cg.shadow() ); p->drawPoint( x + w - 2, y + 1 ); p->setPen( cg.dark() ); p->drawPoint( x + w - 3, y + 2 ); // bottom right corner: p->setPen( cg.background() ); p->drawPoint( x + w - 1, y + h - 1 ); p->drawPoint( x + w - 2, y + h - 1 ); p->drawPoint( x + w - 1, y + h - 2 ); p->setPen( cg.shadow() ); p->drawPoint( x + w - 2, y + h - 2 ); p->setPen( cg.dark() ); p->drawPoint( x + w - 3, y + h - 3 ); p->setPen( cg.mid() ); p->drawPoint( x + w - 4, y + h - 4 ); } else { p->fillRect( x + 2, y + 2, w - 4, h - 4, cg.brush(QColorGroup::Dark) ); // the dark side p->setPen( cg.shadow() ); p->drawLine( x, y, x + w - 1, y ); p->drawLine( x, y, x, y + h - 1 ); p->setPen( cg.dark().dark() ); p->drawLine( x + 1, y + 1, x + w - 2, y + 1 ); p->drawLine( x + 1, y + 1, x + 1, y + h - 2 ); // the bright side! p->setPen( cg.button() ); p->drawLine( x + 1, y + h - 2, x + w - 2, y + h - 2 ); p->drawLine( x + w - 2, y + 1, x + w - 2, y + h - 2 ); p->setPen( cg.dark() ); p->drawLine( x, y + h - 1, x + w - 1, y + h - 1 ); p->drawLine( x + w - 1, y, x + w - 1, y + h - 1 ); // top left corner: p->setPen( cg.background() ); p->drawPoint( x, y ); p->drawPoint( x + 1, y ); p->drawPoint( x, y + 1 ); p->setPen( cg.shadow() ); p->drawPoint( x + 1, y + 1 ); p->setPen( cg.dark().dark() ); p->drawPoint( x + 3, y + 3 ); // bottom left corner: p->setPen( cg.background() ); p->drawPoint( x, y + h - 1 ); p->drawPoint( x + 1, y + h - 1 ); p->drawPoint( x, y + h - 2 ); p->setPen( cg.shadow() ); p->drawPoint( x + 1, y + h - 2 ); // top right corner: p->setPen( cg.background() ); p->drawPoint( x + w - 1, y ); p->drawPoint( x + w - 2, y ); p->drawPoint( x + w - 1, y + 1 ); p->setPen( cg.shadow() ); p->drawPoint( x + w - 2, y + 1 ); // bottom right corner: p->setPen( cg.background() ); p->drawPoint( x + w - 1, y + h - 1 ); p->drawPoint( x + w - 2, y + h - 1 ); p->drawPoint( x + w - 1, y + h - 2 ); p->setPen( cg.shadow() ); p->drawPoint( x + w - 2, y + h - 2 ); p->setPen( cg.dark() ); p->drawPoint( x + w - 3, y + h - 3 ); p->setPen( cg.mid() ); p->drawPoint( x + w - 4, y + h - 4 ); } p->setPen( oldPen ); break; } case PE_Indicator: { drawPrimitive( PE_ButtonBevel, p, QRect(r.x(), r.y(), r.width() - 2, r.height()), cg, flags ); p->fillRect( r.x() + r.width() - 2, r.y(), 2, r.height(), cg.brush( QColorGroup::Background ) ); p->setPen( cg.shadow() ); p->drawRect( r.x(), r.y(), r.width() - 2, r.height() ); static const QCOORD nochange_mark[] = { 3,5, 9,5, 3,6, 9,6 }; static const QCOORD check_mark[] = { 3,5, 5,5, 4,6, 5,6, 5,7, 6,7, 5,8, 6,8, 6,9, 9,9, 6,10, 8,10, 7,11, 8,11, 7,12, 7,12, 8,8, 9,8, 8,7, 10,7, 9,6, 10,6, 9,5, 11,5, 10,4, 11,4, 10,3, 12,3, 11,2, 12,2, 11,1, 13,1, 12,0, 13,0 }; if ( !(flags & Style_Off) ) { QPen oldPen = p->pen(); int x1 = r.x(); int y1 = r.y(); if ( flags & Style_Down ) { x1++; y1++; } QPointArray amark; if ( flags & Style_On ) { amark = QPointArray( sizeof(check_mark)/(sizeof(QCOORD)*2), check_mark ); // ### KLUDGE!! flags ^= Style_On; flags ^= Style_Down; } else if ( flags & Style_NoChange ) { amark = QPointArray( sizeof(nochange_mark) / (sizeof(QCOORD) * 2), nochange_mark ); } amark.translate( x1 + 1, y1 + 1 ); p->setPen( cg.dark() ); p->drawLineSegments( amark ); amark.translate( -1, -1 ); p->setPen( cg.foreground() ); p->drawLineSegments( amark ); p->setPen( oldPen ); } break; } case PE_IndicatorMask: { int x, y, w, h; r.rect( &x, &y, &w, &h ); p->fillRect( x, y, w - 2, h, color1); if ( flags & Style_Off ) { QPen oldPen = p->pen(); p->setPen ( QPen(color1, 2)); p->drawLine( x + 2, y + h / 2 - 1, x + w / 2 - 1, y + h - 4 ); p->drawLine( x + w / 2 - 1, y + h - 4, x + w, 0); p->setPen( oldPen ); } break; } case PE_ExclusiveIndicator: { #define QCOORDARRLEN(x) sizeof(x) / (sizeof(QCOORD) * 2 ) bool down = flags & Style_Down; bool on = flags & Style_On; static const QCOORD pts1[] = { // normal circle 5,0, 8,0, 9,1, 10,1, 11,2, 12,3, 12,4, 13,5, 13,8, 12,9, 12,10, 11,11, 10,12, 9,12, 8,13, 5,13, 4,12, 3,12, 2,11, 1,10, 1,9, 0,8, 0,5, 1,4, 1,3, 2,2, 3,1, 4,1 }; static const QCOORD pts2[] = { // top left shadow 5,1, 8,1, 3,2, 7,2, 2,3, 5,3, 2,4, 4,4, 1,5, 3,5, 1,6, 1,8, 2,6, 2,7 }; static const QCOORD pts3[] = { // bottom right, dark 5,12, 8,12, 7,11, 10,11, 8,10, 11,10, 9,9, 11,9, 10,8, 12,8, 11,7, 11,7, 12,5, 12,7 }; static const QCOORD pts4[] = { // bottom right, light 5,12, 8,12, 7,11, 10,11, 9,10, 11,10, 10,9, 11,9, 11,7, 11,8, 12,5, 12,8 }; static const QCOORD pts5[] = { // check mark 6,4, 8,4, 10,6, 10,8, 8,10, 6,10, 4,8, 4,6 }; static const QCOORD pts6[] = { // check mark extras 4,5, 5,4, 9,4, 10,5, 10,9, 9,10, 5,10, 4,9 }; int x, y; x = r.x(); y = r.y(); p->eraseRect( r ); p->setBrush( (down||on) ? cg.brush( QColorGroup::Dark ) : cg.brush( QColorGroup::Button) ); p->setPen( NoPen ); p->drawEllipse( x, y, 13, 13 ); p->setPen( cg.shadow() ); QPointArray a( QCOORDARRLEN(pts1), pts1 ); a.translate( x, y ); p->drawPolyline( a ); // draw normal circle QColor tc, bc; const QCOORD *bp; int bl; if ( down || on ) { // pressed down or on tc = cg.dark().dark(); bc = cg.light(); bp = pts4; bl = QCOORDARRLEN(pts4); } else { // released tc = cg.light(); bc = cg.dark(); bp = pts3; bl = QCOORDARRLEN(pts3); } p->setPen( tc ); a.setPoints( QCOORDARRLEN(pts2), pts2 ); a.translate( x, y ); p->drawLineSegments( a ); // draw top shadow p->setPen( bc ); a.setPoints( bl, bp ); a.translate( x, y ); p->drawLineSegments( a ); if ( on ) { // draw check mark int x1 = x, y1 = y; p->setBrush( cg.foreground() ); p->setPen( cg.foreground() ); a.setPoints( QCOORDARRLEN(pts5), pts5 ); a.translate( x1, y1 ); p->drawPolygon( a ); p->setBrush( NoBrush ); p->setPen( cg.dark() ); a.setPoints( QCOORDARRLEN(pts6), pts6 ); a.translate( x1, y1 ); p->drawLineSegments( a ); } break; } case PE_ExclusiveIndicatorMask: { static const QCOORD pts1[] = { // normal circle 5,0, 8,0, 9,1, 10,1, 11,2, 12,3, 12,4, 13,5, 13,8, 12,9, 12,10, 11,11, 10,12, 9,12, 8,13, 5,13, 4,12, 3,12, 2,11, 1,10, 1,9, 0,8, 0,5, 1,4, 1,3, 2,2, 3,1, 4,1 }; QPointArray a(QCOORDARRLEN(pts1), pts1); a.translate(r.x(), r.y()); p->setPen(color1); p->setBrush(color1); p->drawPolygon(a); break; } case PE_ScrollBarAddLine: { drawPrimitive( PE_ButtonBevel, p, r, cg, (flags & Style_Enabled) | ((flags & Style_Down) ? Style_Sunken : Style_Raised) ); p->setPen( cg.shadow() ); p->drawRect( r ); drawPrimitive( ((flags & Style_Horizontal) ? PE_ArrowRight : PE_ArrowDown), p, QRect(r.x() + 2, r.y() + 2, r.width() - 4, r.height() - 4), cg, flags ); break; } case PE_ScrollBarSubLine: { drawPrimitive( PE_ButtonBevel, p, r, cg, (flags & Style_Enabled) | ((flags & Style_Down) ? Style_Sunken : Style_Raised) ); p->setPen( cg.shadow() ); p->drawRect( r ); drawPrimitive( ((flags & Style_Horizontal) ? PE_ArrowLeft : PE_ArrowUp ), p, QRect(r.x() + 2, r.y() + 2, r.width() - 4, r.height() - 4), cg, flags ); break; } case PE_ScrollBarAddPage: case PE_ScrollBarSubPage: { QPen oldPen = p->pen(); if ( r.width() < 3 || r.height() < 3 ) { p->fillRect( r, cg.brush(QColorGroup::Mid) ); p->setPen( cg.shadow() ); p->drawRect( r ); p->setPen( oldPen ); } else { int x, y, w, h; r.rect( &x, &y, &w, &h ); if ( flags & Style_Horizontal ) { p->fillRect( x + 2, y + 2, w - 2, h - 4, cg.brush(QColorGroup::Mid) ); // the dark side p->setPen( cg.dark().dark() ); p->drawLine( x, y, x + w - 1, y ); p->setPen( cg.shadow()); p->drawLine( x, y, x, y + h - 1 ); p->setPen( cg.mid().dark()); p->drawLine( x + 1, y + 1, x + w - 1, y + 1 ); p->drawLine( x + 1, y + 1, x + 1, y + h - 2 ); // the bright side! p->setPen( cg.button()); p->drawLine( x + 1, y + h - 2, x + w - 1, y + h - 2 ); p->setPen( cg.shadow()); p->drawLine( x, y + h - 1, x + w - 1, y + h - 1 ); } else { p->fillRect( x + 2, y + 2, w - 4, h - 2, cg.brush(QColorGroup::Mid) ); // the dark side p->setPen( cg.dark().dark() ); p->drawLine( x, y, x + w - 1, y ); p->setPen( cg.shadow() ); p->drawLine( x, y, x, y + h - 1 ); p->setPen( cg.mid().dark() ); p->drawLine( x + 1, y + 1, x + w - 2, y + 1 ); p->drawLine( x + 1, y + 1, x + 1, y + h - 1 ); // the bright side! p->setPen( cg.button() ); p->drawLine( x + w - 2, y + 1, x + w - 2, y + h - 1 ); p->setPen( cg.shadow() ); p->drawLine( x + w - 1, y, x + w - 1, y + h - 1 ); } } p->setPen( oldPen ); break; } case PE_ScrollBarSlider: { QPoint bo = p->brushOrigin(); p->setBrushOrigin( r.topLeft() ); drawPrimitive( PE_ButtonBevel, p, r, cg, Style_Raised ); p->setBrushOrigin( bo ); drawRiffles( p, r.x(), r.y(), r.width(), r.height(), cg, flags & Style_Horizontal ); p->setPen( cg.shadow() ); p->drawRect( r ); if ( flags & Style_HasFocus ) { drawPrimitive( PE_FocusRect, p, QRect(r.x() + 2, r.y() + 2, r.width() - 5, r.height() - 5 ), cg, flags ); } break; } default: QWindowsStyle::drawPrimitive( pe, p, r, cg, flags, opt ); break; } }
void QButtonGroup::moveFocus( int key ) { QWidget * f = qApp->focusWidget(); QButtonItem * i; i = buttons->first(); while( i && i->button != f ) i = buttons->next(); if ( !i || !i->button ) return; QWidget * candidate = 0; int bestScore = -1; QPoint goal( f->mapToGlobal( f->geometry().center() ) ); i = buttons->first(); while( i && i->button ) { if ( i->button != f && i->button->isEnabled() ) { QPoint p(i->button->mapToGlobal(i->button->geometry().center())); int score = (p.y() - goal.y())*(p.y() - goal.y()) + (p.x() - goal.x())*(p.x() - goal.x()); bool betterScore = score < bestScore || !candidate; switch( key ) { case Key_Up: if ( p.y() < goal.y() && betterScore ) { if ( QABS( p.x() - goal.x() ) < QABS( p.y() - goal.y() ) ) { candidate = i->button; bestScore = score; } else if ( i->button->x() == f->x() ) { candidate = i->button; bestScore = score/2; } } break; case Key_Down: if ( p.y() > goal.y() && betterScore ) { if ( QABS( p.x() - goal.x() ) < QABS( p.y() - goal.y() ) ) { candidate = i->button; bestScore = score; } else if ( i->button->x() == f->x() ) { candidate = i->button; bestScore = score/2; } } break; case Key_Left: if ( p.x() < goal.x() && betterScore ) { if ( QABS( p.y() - goal.y() ) < QABS( p.x() - goal.x() ) ) { candidate = i->button; bestScore = score; } else if ( i->button->y() == f->y() ) { candidate = i->button; bestScore = score/2; } } break; case Key_Right: if ( p.x() > goal.x() && betterScore ) { if ( QABS( p.y() - goal.y() ) < QABS( p.x() - goal.x() ) ) { candidate = i->button; bestScore = score; } else if ( i->button->y() == f->y() ) { candidate = i->button; bestScore = score/2; } } break; } } i = buttons->next(); } QButton *buttoncand = ::qt_cast<QButton*>(candidate); if ( buttoncand && ::qt_cast<QButton*>(f) && ((QButton*)f)->isOn() && buttoncand->isToggleButton() && ( isExclusive() || ( ::qt_cast<QRadioButton*>(f) && ::qt_cast<QRadioButton*>(candidate)))) { if ( f->focusPolicy() & TabFocus ) { f->setFocusPolicy( (FocusPolicy)(f->focusPolicy() & ~TabFocus) ); candidate->setFocusPolicy( (FocusPolicy)(candidate->focusPolicy()| TabFocus) ); } buttoncand->setOn( TRUE ); buttoncand->animateClick(); buttoncand->animateTimeout(); // ### crude l&f hack } if ( candidate ) { if (key == Key_Up || key == Key_Left) QFocusEvent::setReason(QFocusEvent::Backtab); else QFocusEvent::setReason(QFocusEvent::Tab); candidate->setFocus(); QFocusEvent::resetReason(); } }
void QWidget::scroll( int dx, int dy, const QRect& r ) { if ( testWState( WState_BlockUpdates ) && !children() ) return; bool valid_rect = r.isValid(); QRect sr = valid_rect?r:rect(); int x1, y1, x2, y2, w=sr.width(), h=sr.height(); if ( dx > 0 ) { x1 = sr.x(); x2 = x1+dx; w -= dx; } else { x2 = sr.x(); x1 = x2-dx; w += dx; } if ( dy > 0 ) { y1 = sr.y(); y2 = y1+dy; h -= dy; } else { y2 = sr.y(); y1 = y2-dy; h += dy; } if ( dx == 0 && dy == 0 ) return; QSize s( qt_screen->width(), qt_screen->height() ); QRegion alloc = valid_rect ? paintableRegion() : allocatedRegion(); QRegion dAlloc = alloc; QPoint td1 = qt_screen->mapToDevice( QPoint(0,0), s ); QPoint td2 = qt_screen->mapToDevice( QPoint(dx,dy), s ); dAlloc.translate( td2.x()-td1.x(), td2.y()-td1.y() ); QRegion scrollRegion( alloc & dAlloc ); if ( w > 0 && h > 0 ) { QGfx * mygfx=graphicsContext( FALSE ); mygfx->setClipDeviceRegion( scrollRegion ); mygfx->scroll(x2,y2,w,h,x1,y1); delete mygfx; } paintable_region_dirty = TRUE; QPoint gpos = mapToGlobal( QPoint() ); if ( !valid_rect && children() ) { // scroll children setChildrenAllocatedDirty(); QPoint pd( dx, dy ); QObjectListIt it(*children()); register QObject *object; while ( it ) { // move all children object = it.current(); if ( object->isWidgetType() ) { QWidget *w = (QWidget *)object; QPoint oldp = w->pos(); QRect r( w->pos() + pd, w->size() ); w->crect = r; w->updateRequestedRegion( gpos + w->pos() ); QMoveEvent e( r.topLeft(), oldp ); QApplication::sendEvent( w, &e ); } ++it; } } QSize ds( qt_screen->deviceWidth(), qt_screen->deviceHeight() ); scrollRegion = qt_screen->mapFromDevice( scrollRegion, ds ); scrollRegion.translate( -gpos.x(), -gpos.y() ); QRegion update( sr ); update -= scrollRegion; if ( dx ) { int x = x2 == sr.x() ? sr.x()+w : sr.x(); update |= QRect( x, sr.y(), QABS(dx), sr.height() ); } if ( dy ) { int y = y2 == sr.y() ? sr.y()+h : sr.y(); update |= QRect( sr.x(), y, sr.width(), QABS(dy) ); } repaint( update, !testWFlags(WRepaintNoErase) ); if ( !valid_rect && children() ) paint_children( this, update, FALSE ); }
void QHeader::mouseMoveEvent( QMouseEvent *m ) { int s = orient == Horizontal ? m->pos().x() : m->pos().y(); if ( state == Idle ) { bool hit = FALSE; int i = 0; while ( i <= (int) count() ) { if ( i && pPos(i) - MINSIZE/2 < s && s < pPos(i) + MINSIZE/2 && data->resize.testBit(i-1) ) { hit = TRUE; if ( orient == Horizontal ) setCursor( *hSplitCur ); else setCursor( *vSplitCur ); break; } i++; } if ( !hit ) setCursor( arrowCursor ); } else { switch ( state ) { case Idle: debug( "QHeader::mouseMoveEvent() (%s) Idle state", name( "unnamed" ) ); break; case Pressed: case Blocked: if ( QABS( s - clickPos ) > 4 && data->move ) { state = Moving; moveToIdx = -1; if ( orient == Horizontal ) setCursor( sizeHorCursor ); else setCursor( sizeVerCursor ); } break; case Sliding: handleColumnResize( handleIdx, s, FALSE ); break; case Moving: { int newPos = findLine( s ); if ( newPos != moveToIdx ) { if ( moveToIdx == handleIdx || moveToIdx == handleIdx + 1 ) repaint( sRect(handleIdx) ); else unMarkLine( moveToIdx ); moveToIdx = newPos; if ( moveToIdx == handleIdx || moveToIdx == handleIdx + 1 ) paintRect( pPos( handleIdx ), pSize( handleIdx ) ); else markLine( moveToIdx ); } break; } default: warning( "QHeader::mouseMoveEvent: (%s) unknown state", name( "unnamed" ) ); break; } } }
void QMainWindow::moveToolBar( QToolBar * t , QMouseEvent * e ) { if ( e->type() == Event_MouseButtonPress ) { //debug( "saw press" ); d->moving = 0; d->offset = e->pos(); d->pos = QCursor::pos(); return; } else if ( e->type() == Event_MouseButtonRelease ) { //debug( "saw release" ); if ( d->moving ) { qApp->removeEventFilter( this ); d->moving = 0; } return; } //debug( "saw move" ); // with that out of the way, let's concentrate on the moves... // first, the threshold QPoint p( QCursor::pos() ); if ( !d->moving && QABS( p.x() - d->pos.x() ) < 3 && QABS( p.y() - d->pos.y() ) < 3 ) return; // okay. it's a real move. // debug( "move event to %d, %d", p.x(), p.y() ); if ( !d->moving ) { d->moving = t; qApp->installEventFilter( this ); } QPoint lp( mapFromGlobal( p ) ); QMainWindowPrivate::ToolBarDock * dock = 0; // five possible cases: in each of the docs, and outside. if ( centralWidget()->geometry().contains( lp ) || !rect().contains( lp ) ) { // not a dock if ( t->parentWidget() ) { t->recreate( 0, 0, QPoint( p.x() - d->offset.x(), p.y() - d->offset.y() ), TRUE ); QApplication::syncX(); dock = d->tornOff; } else { t->move( p.x() - d->offset.x(), p.y() - d->offset.y() ); } } else if ( lp.y() < centralWidget()->y() ) { //top dock dock = d->top; } else if ( lp.y() >= centralWidget()->y() + centralWidget()->height() ) { // bottom dock dock = d->bottom; } else if ( lp.x() < centralWidget()->x() ) { // bottom dock dock = d->left; } else if ( lp.x() >= centralWidget()->x() + centralWidget()->width() ) { // right dock dock = d->right; } else { fatal( "never to happen" ); } if ( !dock ) return; debug( "1" ); // at this point dock points to the new dock QMainWindowPrivate::ToolBar * ct; ct = takeToolBarFromDock( t, d->top ); if ( !ct ) ct = takeToolBarFromDock( t, d->left ); if ( !ct ) ct = takeToolBarFromDock( t, d->right ); if ( !ct ) ct = takeToolBarFromDock( t, d->bottom ); if ( dock != d->tornOff && !ct ) ct = takeToolBarFromDock( t, d->tornOff ); if ( dock == d->tornOff || ct == 0 ) return; debug( "2" ); QMainWindowPrivate::ToolBar * c = dock->first(); QRect inLine; QRect betweenLines; int linestart = 0; while( c && ct ) { debug( "3 %p %p", c, ct ); if ( c->nl ) { if ( dock == d->top ) { betweenLines.setRect( 0, 0, width(), c->t->y() + c->t->height()/4 ); } else if ( dock == d->bottom ) { betweenLines.setRect( 0, c->t->y() + c->t->height()/4, width(), c->t->height()/2 ); } else if ( dock == d->left ) { betweenLines.setRect( 0, 0, c->t->x() + c->t->width()/4, height() ); } else { betweenLines.setRect( c->t->x() + 3*c->t->width()/4, 0, c->t->width()/2, height() ); } linestart = dock->at(); } if ( dock == d->top || dock == d->bottom ) { inLine.setRect( c->t->x()-c->t->height()/4, c->t->y(), c->t->height()/2, c->t->height() ); } else { inLine.setRect( c->t->x(), c->t->y() - c->t->width()/4, c->t->width(), c->t->width()/2 ); } if ( inLine.contains( lp ) ) { // ct goes in just before c, and takes over nl dock->insert( dock->at(), ct ); if ( t->parentWidget() != this ) t->recreate( this, 0, QPoint( 0, -t->height() ), TRUE ); t->setOrientation( (dock == d->top || dock == d->bottom ) ? QToolBar::Horizontal : QToolBar::Vertical ); ct->nl = c->nl; c->nl = FALSE; ct = 0; triggerLayout(); } else { QMainWindowPrivate::ToolBar * c2 = dock->next(); if ( c2 == 0 || c2->nl ) { // about to do the next line, so check whether c // should go in above this line if ( betweenLines.contains( lp ) ) { dock->insert( linestart, ct ); if ( t->parentWidget() != this ) t->recreate( this, 0, QPoint( 0, -t->height() ), TRUE ); t->setOrientation( (dock == d->top || dock == d->bottom ) ? QToolBar::Horizontal : QToolBar::Vertical ); ct->nl = TRUE; ct = 0; triggerLayout(); } else { // perhaps at the end of this line? let's see if ( dock == d->top || dock == d->bottom ) inLine.setRect( c->t->x() + c->t->width(), c->t->y(), width() - c->t->x() - c->t->width(), c->t->height() ); else inLine.setRect( c->t->x(), c->t->y() + c->t->height(), c->t->width(), height() - c->t->y() - c->t->height()); if ( inLine.contains( lp ) ) { dock->insert( dock->at(), ct ); if ( t->parentWidget() != this ) t->recreate( this, 0, QPoint( 0, -t->height() ), TRUE ); t->setOrientation( (dock == d->top || dock == d->bottom ) ? QToolBar::Horizontal : QToolBar::Vertical ); ct->nl = FALSE; ct = 0; triggerLayout(); } } } c = c2; } } debug( "4" ); // okay, is it at the very end? if ( ct ) { debug( "4a" ); dock->append( ct ); if ( t->parentWidget() != this ) t->recreate( this, 0, QPoint( 0, -t->height() ), TRUE ); t->setOrientation( (dock == d->top || dock == d->bottom ) ? QToolBar::Horizontal : QToolBar::Vertical ); ct->nl = TRUE; triggerLayout(); } }
/*! \reimp */ void QHeader::mouseMoveEvent( QMouseEvent *e ) { int section; bool hit; int c = orient == Horizontal ? e->pos().x() : e->pos().y(); c += offset(); switch( state ) { case Idle: hit = FALSE; if ( (section = sectionAt( c )) >= 0 ) { int index = d->s2i[section]; if ( (index > 0 && c < d->positions[index] + GRIPMARGIN) || (c > d->positions[index] + d->sizes[section] - GRIPMARGIN) ) { if ( index > 0 && c < d->positions[index] + GRIPMARGIN ) section = d->i2s[--index]; if ( d->resize.testBit(section) ) { hit = TRUE; #ifndef QT_NO_CURSOR if ( orient == Horizontal ) setCursor( splitHCursor ); else setCursor( splitVCursor ); #endif } } } #ifndef QT_NO_CURSOR if ( !hit ) unsetCursor(); #endif break; case Blocked: break; case Pressed: if ( QABS( c - clickPos ) > 4 && d->move ) { state = Moving; moveToIdx = -1; #ifndef QT_NO_CURSOR if ( orient == Horizontal ) setCursor( sizeHorCursor ); else setCursor( sizeVerCursor ); #endif } break; case Sliding: handleColumnResize( handleIdx, c, FALSE ); break; case Moving: { int newPos = findLine( c ); if ( newPos != moveToIdx ) { if ( moveToIdx == handleIdx || moveToIdx == handleIdx + 1 ) repaint( sRect(handleIdx) ); else unMarkLine( moveToIdx ); moveToIdx = newPos; if ( moveToIdx == handleIdx || moveToIdx == handleIdx + 1 ) paintRect( pPos( handleIdx ), pSize( handleIdx ) ); else markLine( moveToIdx ); } break; } default: qWarning( "QHeader::mouseMoveEvent: (%s) unknown state", name() ); break; } }