From: Marco Gittler Date: Mon, 10 Mar 2008 19:22:00 +0000 (+0000) Subject: abstract class for clipitem (many func's from clipitem must move to abstractclipitem) X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;h=7cff3e32568a5b8b715b69c162170e7db8dd0c21;p=kdenlive abstract class for clipitem (many func's from clipitem must move to abstractclipitem) transitions are now abstractclipitem svn path=/branches/KDE4/; revision=2040 --- diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index d9f526bc..0efc4b97 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -85,6 +85,7 @@ set(kdenlive_SRCS transition.cpp renderjob.cpp renderwidget.cpp + abstractclipitem.cpp ) kde4_add_kcfg_files(kdenlive_SRCS GENERATE_MOC kdenlivesettings.kcfgc ) diff --git a/src/abstractclipitem.cpp b/src/abstractclipitem.cpp new file mode 100644 index 00000000..6c35effc --- /dev/null +++ b/src/abstractclipitem.cpp @@ -0,0 +1,97 @@ +#include "abstractclipitem.h" +#include + +AbstractClipItem::AbstractClipItem(const QRectF& rect): QGraphicsRectItem(rect), m_startFade(0), m_endFade(0) { + setFlags(QGraphicsItem::ItemClipsToShape | QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable); +} +void AbstractClipItem::moveTo(int x, double scale, double offset, int newTrack) { + double origX = rect().x(); + double origY = rect().y(); + bool success = true; + if (x < 0) return; + setRect(x * scale, origY + offset, rect().width(), rect().height()); + QList collisionList = collidingItems(Qt::IntersectsItemBoundingRect); + if (collisionList.size() == 0) m_track = newTrack; + for (int i = 0; i < collisionList.size(); ++i) { + QGraphicsItem *item = collisionList.at(i); + if (item->type() == 70000 || item->type() == 70001) { + if (offset == 0) { + QRectF other = ((QGraphicsRectItem *)item)->rect(); + if (x < m_startPos.frames(m_fps)) { + kDebug() << "COLLISION, MOVING TO------"; + m_startPos = ((AbstractClipItem *)item)->endPos() + GenTime(1, m_fps); + origX = m_startPos.frames(m_fps) * scale; + } else { + kDebug() << "COLLISION, MOVING TO+++"; + m_startPos = ((AbstractClipItem *)item)->startPos() - m_cropDuration; + origX = m_startPos.frames(m_fps) * scale; + } + } + setRect(origX, origY, rect().width(), rect().height()); + offset = 0; + origX = rect().x(); + success = false; + break; + } + } + if (success) { + m_track = newTrack; + m_startPos = GenTime(x, m_fps); + } + /* QList childrenList = QGraphicsItem::children(); + for (int i = 0; i < childrenList.size(); ++i) { + childrenList.at(i)->moveBy(rect().x() - origX , offset); + }*/ +} + +GenTime AbstractClipItem::endPos() const { + return m_startPos + m_cropDuration; +} + +int AbstractClipItem::track() const { + return m_track; +} + +GenTime AbstractClipItem::cropStart() const { + return m_cropStart; +} + +void AbstractClipItem::resizeStart(int posx, double scale) { + +} + +void AbstractClipItem::resizeEnd(int posx, double scale) { + +} + +void AbstractClipItem::setFadeOut(int pos, double scale) { + +} + +void AbstractClipItem::setFadeIn(int pos, double scale) { + +} + +GenTime AbstractClipItem::duration() const { + return m_cropDuration; +} + +GenTime AbstractClipItem::startPos() const { + return m_startPos; +} + +void AbstractClipItem::setTrack(int track) { + m_track = track; +} + +double AbstractClipItem::fps() const { + return m_fps; +} + +int AbstractClipItem::fadeIn() const { + return m_startFade; +} + +int AbstractClipItem::fadeOut() const { + return m_endFade; +} diff --git a/src/abstractclipitem.h b/src/abstractclipitem.h new file mode 100644 index 00000000..c727ca2a --- /dev/null +++ b/src/abstractclipitem.h @@ -0,0 +1,38 @@ +#ifndef ABSTRACTCLIPITEM +#define ABSTRACTCLIPITEM + +#include +#include "definitions.h" +#include "gentime.h" + +class AbstractClipItem : public QObject , public QGraphicsRectItem { + Q_OBJECT +public: + AbstractClipItem(const QRectF& rect); + virtual OPERATIONTYPE operationMode(QPointF pos, double scale) = 0; + virtual GenTime startPos() const ; + virtual void setTrack(int track); + virtual GenTime endPos() const ; + virtual int track() const ; + virtual void moveTo(int x, double scale, double offset, int newTrack); + virtual GenTime cropStart() const ; + virtual void resizeStart(int posx, double scale); + virtual void resizeEnd(int posx, double scale); + virtual void setFadeOut(int pos, double scale); + virtual void setFadeIn(int pos, double scale); + virtual GenTime duration() const; + virtual double fps() const; + virtual int fadeIn() const; + virtual int fadeOut() const; +protected: + int m_track; + GenTime m_cropStart; + GenTime m_cropDuration; + GenTime m_startPos; + double m_fps; + uint m_startFade; + uint m_endFade; + +}; + +#endif diff --git a/src/clipitem.cpp b/src/clipitem.cpp index f9c4b5f3..2d113f90 100644 --- a/src/clipitem.cpp +++ b/src/clipitem.cpp @@ -39,9 +39,12 @@ #include "kdenlivesettings.h" ClipItem::ClipItem(DocClipBase *clip, int track, GenTime startpos, const QRectF & rect, GenTime duration, double fps) - : QGraphicsRectItem(rect), m_clip(clip), m_resizeMode(NONE), m_grabPoint(0), m_maxTrack(0), m_track(track), m_startPos(startpos), m_hasThumbs(false), startThumbTimer(NULL), endThumbTimer(NULL), m_startFade(0), m_endFade(0), m_effectsCounter(1), audioThumbWasDrawn(false), m_opacity(1.0), m_timeLine(0), m_thumbsRequested(0), m_fps(fps), m_hover(false) { + : AbstractClipItem(rect), m_clip(clip), m_resizeMode(NONE), m_grabPoint(0), m_maxTrack(0), m_hasThumbs(false), startThumbTimer(NULL), endThumbTimer(NULL), m_effectsCounter(1), audioThumbWasDrawn(false), m_opacity(1.0), m_timeLine(0), m_thumbsRequested(0), m_hover(false) { //setToolTip(name); // kDebug() << "******* CREATING NEW TML CLIP, DUR: " << duration; + m_fps = fps; + m_startPos = startpos; + m_track = track; m_xml = clip->toXML(); m_clipName = clip->name(); m_producer = clip->getId(); @@ -155,26 +158,10 @@ GenTime ClipItem::maxDuration() const { return m_maxDuration; } -GenTime ClipItem::duration() const { - return m_cropDuration; -} - -GenTime ClipItem::startPos() const { - return m_startPos; -} - GenTime ClipItem::cropStart() const { return m_cropStart; } -GenTime ClipItem::endPos() const { - return m_startPos + m_cropDuration; -} - -double ClipItem::fps() const { - return m_fps; -} - void ClipItem::flashClip() { if (m_timeLine == 0) { m_timeLine = new QTimeLine(750, this); @@ -245,23 +232,6 @@ void ClipItem::paint(QPainter *painter, right_lower = 40; } - // draw transitions - QList transitionPath; - foreach(Transition transition, m_transitionsList) { - QPainterPath t; - //t.addRect(br_startx,br.y()+br.height()/2,br.x() + /*t->transitionDuration().frames(m_fps) *pixelForOneFrame*/5 ,br.y()+br.height()*2); - int twidth = br_startx + transition.transitionDuration().frames(m_fps) * scale; - t.moveTo(twidth , br_endy); - t.lineTo(twidth , br_halfy + roundingY); - - t.arcTo(twidth - roundingX , br_halfy , roundingX, roundingY, 0.0, 90.0); - t.lineTo(br_startx + roundingX , br_halfy); - t.arcTo(br_startx , br_halfy, roundingX , roundingY, 90.0, 90.0); - t.lineTo(br_startx , br_endy); - //t.closeSubpath(); - transitionPath.append(t); - } - // build path around clip roundRectPathUpper.moveTo(br_endx - right_upper , br_halfy); roundRectPathUpper.arcTo(br_endx - roundingX - right_upper , br_starty , roundingX, roundingY, 0.0, 90.0); @@ -276,9 +246,7 @@ void ClipItem::paint(QPainter *painter, roundRectPathLower.lineTo(br_endx - right_lower , br_halfy); QPainterPath resultClipPath = roundRectPathUpper.united(roundRectPathLower); - foreach(QPainterPath p, transitionPath) { - resultClipPath = resultClipPath.united(p); - } + painter->setClipPath(resultClipPath.intersected(clippath), Qt::IntersectClip); //painter->fillPath(roundRectPath, brush()); //, QBrush(QColor(Qt::red))); painter->fillRect(br.intersected(rectInView), paintColor); @@ -397,11 +365,6 @@ void ClipItem::paint(QPainter *painter, if (isSelected()) painter->setPen(pen); painter->setClipRect(option->exposedRect); painter->drawPath(resultClipPath.intersected(clippath)); - foreach(QPainterPath p, transitionPath) { - - painter->fillPath(p, QBrush(QColor(255, 255, 0, 100))); - painter->drawPath(p); - } //painter->fillRect(startpixel,0,startpixel+endpixel,(int)br.height(), QBrush(QColor(255,255,255,150))); //painter->fillRect(QRect(br.x(), br.y(), roundingX, roundingY), QBrush(QColor(Qt::green))); @@ -438,6 +401,7 @@ OPERATIONTYPE ClipItem::operationMode(QPointF pos, double scale) { else if (abs((int)(pos.x() - (rect().x() + rect().width()))) < 6) return RESIZEEND; else if (abs((int)(pos.x() - (rect().x() + 10))) < 6 && abs((int)(pos.y() - (rect().y() + rect().height() / 2 - 5))) < 6) return TRANSITIONSTART; else if (abs((int)(pos.x() - (rect().x() + rect().width() - 20))) < 6 && abs((int)(pos.y() - (rect().y() + rect().height() / 2 - 5))) < 6) return TRANSITIONEND; + return MOVE; } @@ -521,13 +485,7 @@ void ClipItem::slotPrepareAudioThumb(double pixelForOneFrame, QPainterPath path, //} } -int ClipItem::fadeIn() const { - return m_startFade; -} -int ClipItem::fadeOut() const { - return m_endFade; -} void ClipItem::setFadeIn(int pos, double scale) { int oldIn = m_startFade; @@ -673,14 +631,6 @@ void ClipItem::resizeEnd(int posx, double scale) { void ClipItem::mouseMoveEvent(QGraphicsSceneMouseEvent * event) { } -int ClipItem::track() const { - return m_track; -} - -void ClipItem::setTrack(int track) { - m_track = track; -} - int ClipItem::effectsCounter() { return m_effectsCounter++; } @@ -770,11 +720,6 @@ void ClipItem::deleteEffect(QString index) { update(boundingRect()); } -void ClipItem::addTransition(Transition tr) { - m_transitionsList.append(tr); - update(); -} - //virtual void ClipItem::dropEvent(QGraphicsSceneDragDropEvent * event) { QString effects = QString(event->mimeData()->data("kdenlive/effectslist")); diff --git a/src/clipitem.h b/src/clipitem.h index 15d91d89..ef11d0da 100644 --- a/src/clipitem.h +++ b/src/clipitem.h @@ -32,9 +32,9 @@ #include "docclipbase.h" #include "kthumb.h" #include "transition.h" +#include "abstractclipitem.h" - -class ClipItem : public QObject, public QGraphicsRectItem { +class ClipItem : public AbstractClipItem { Q_OBJECT public: @@ -53,16 +53,9 @@ public: DocClipBase *baseClip(); QString clipName(); GenTime maxDuration() const; - int track() const; - void setTrack(int track); - GenTime startPos() const; GenTime cropStart() const; - GenTime endPos() const; - GenTime duration() const; - double fps() const; QDomElement xml() const; - int fadeIn() const; - int fadeOut() const; + void setFadeOut(int pos, double scale); void setFadeIn(int pos, double scale); /** Give a string list of the clip's effect names */ @@ -82,7 +75,6 @@ public: /** Replace effect at pos ix with given value */ void setEffectAt(int ix, QDomElement effect); void flashClip(); - void addTransition(Transition tr); protected: virtual void mouseMoveEvent(QGraphicsSceneMouseEvent * event); @@ -103,24 +95,21 @@ private: CLIPTYPE m_clipType; QString m_clipName; GenTime m_maxDuration; - GenTime m_cropStart; - GenTime m_cropDuration; + int m_maxTrack; - int m_track; - GenTime m_startPos; + + QPixmap m_startPix; QPixmap m_endPix; bool m_hasThumbs; QTimer *startThumbTimer; QTimer *endThumbTimer; - uint m_startFade; - uint m_endFade; + /** counter used to provide a unique id to each effect */ int m_effectsCounter; double m_opacity; QTimeLine *m_timeLine; uint m_thumbsRequested; - double m_fps; bool m_hover; EffectsList m_effectList; diff --git a/src/customtrackview.cpp b/src/customtrackview.cpp index 626c7e37..aa418b45 100644 --- a/src/customtrackview.cpp +++ b/src/customtrackview.cpp @@ -98,7 +98,7 @@ void CustomTrackView::mouseMoveEvent(QMouseEvent * event) { // a button was pressed, delete visual tips if (m_operationMode == MOVE) { double snappedPos = getSnapPointForPos(mapToScene(event->pos()).x() - m_clickPoint); - //kDebug()<<"/////// MOVE CLIP, EVENT Y: "<scenePos().y()<<", SCENE HEIGHT: "<sceneRect().height(); + kDebug() << "/////// MOVE CLIP, EVENT Y: ";//<scenePos().y()<<", SCENE HEIGHT: "<sceneRect().height(); int moveTrack = (int) mapToScene(event->pos()).y() / 50; int currentTrack = m_dragItem->track(); @@ -132,17 +132,18 @@ void CustomTrackView::mouseMoveEvent(QMouseEvent * event) { QList itemList = items(event->pos()); int i = 0; - QGraphicsItem *item = NULL; + QGraphicsRectItem *item = NULL; for (int i = 0; i < itemList.count(); i++) { - if (itemList.at(i)->type() == 70000) { - item = itemList.at(i); + if (itemList.at(i)->type() == 70000 || itemList.at(i)->type() == 70001) { + item = (QGraphicsRectItem*) itemList.at(i); break; } } if (item && event->buttons() == Qt::NoButton) { - ClipItem *clip = (ClipItem*) item; + AbstractClipItem *clip = (AbstractClipItem*) item; + OPERATIONTYPE opMode = opMode = clip->operationMode(mapToScene(event->pos()), m_scale); double size = 8; - OPERATIONTYPE opMode = clip->operationMode(mapToScene(event->pos()), m_scale); + if (opMode == m_moveOpMode) { QGraphicsView::mouseMoveEvent(event); return; @@ -324,7 +325,7 @@ void CustomTrackView::mousePressEvent(QMouseEvent * event) { QList collisionList = items(event->pos()); for (int i = 0; i < collisionList.size(); ++i) { QGraphicsItem *item = collisionList.at(i); - if (item->type() == 70000) { + if (item->type() == 70000 || item->type() == 70001) { // select item if (!item->isSelected()) { QList itemList = items(); @@ -333,8 +334,11 @@ void CustomTrackView::mousePressEvent(QMouseEvent * event) { item->setSelected(true); update(); } - m_dragItem = (ClipItem *) item; - emit clipItemSelected(m_dragItem); + + m_dragItem = (AbstractClipItem *) item; + if (item->type() == 70000) { + emit clipItemSelected((ClipItem*) m_dragItem); + } m_clickPoint = mapToScene(event->pos()).x() - m_dragItem->startPos().frames(m_document->fps()) * m_scale; m_operationMode = m_dragItem->operationMode(item->mapFromScene(mapToScene(event->pos())), m_scale); if (m_operationMode == MOVE) setCursor(Qt::ClosedHandCursor); @@ -343,9 +347,11 @@ void CustomTrackView::mousePressEvent(QMouseEvent * event) { else if (m_operationMode == RESIZEEND) m_startPos = QPointF(m_dragItem->endPos().frames(m_document->fps()), m_dragItem->track()); else if (m_operationMode == TRANSITIONSTART) { - Transition tra(m_dragItem, LUMA_TRANSITION, m_dragItem->startPos(), m_dragItem->startPos() + GenTime(2.5)); - m_dragItem->addTransition(tra); + Transition *tr = new Transition(QRect(10 , 10, 20, 20), (ClipItem*)m_dragItem, LUMA_TRANSITION, m_dragItem->startPos(), m_dragItem->startPos() + GenTime(2.5), m_document->fps()); + scene()->addItem(tr); + //m_dragItem->addTransition(tra); } + kDebug() << "//////// ITEM CLICKED: " << m_startPos; collision = true; break; @@ -681,7 +687,7 @@ double CustomTrackView::getSnapPointForPos(double pos) { return pos; } -void CustomTrackView::updateSnapPoints(ClipItem *selected) { +void CustomTrackView::updateSnapPoints(AbstractClipItem *selected) { m_snapPoints.clear(); GenTime offset; if (selected) offset = selected->duration(); diff --git a/src/customtrackview.h b/src/customtrackview.h index f8ddb105..6140b048 100644 --- a/src/customtrackview.h +++ b/src/customtrackview.h @@ -85,7 +85,7 @@ private: QPointF m_startPos; OPERATIONTYPE m_operationMode; OPERATIONTYPE m_moveOpMode; - ClipItem *m_dragItem; + AbstractClipItem *m_dragItem; KUndoStack *m_commandStack; QGraphicsItem *m_visualTip; QGraphicsItemAnimation *m_animation; @@ -95,7 +95,7 @@ private: double m_scale; int m_clickPoint; QList m_snapPoints; - void updateSnapPoints(ClipItem *selected); + void updateSnapPoints(AbstractClipItem *selected); double getSnapPointForPos(double pos); ClipItem *getClipItemAt(int pos, int track); ClipItem *getClipItemAt(GenTime pos, int track); diff --git a/src/kthumb.cpp b/src/kthumb.cpp index e13c2d2e..ec137979 100644 --- a/src/kthumb.cpp +++ b/src/kthumb.cpp @@ -141,7 +141,7 @@ KThumb::KThumb(ClipManager *clipManager, KUrl url, int width, int height, QObjec m_profile = new Mlt::Profile((char*) KdenliveSettings::current_profile().data()); QCryptographicHash context(QCryptographicHash::Sha1); context.addData((KFileItem(m_url, "text/plain", S_IFREG).timeString() + m_url.fileName()).toAscii().data()); - m_thumbFile = KGlobal::dirs()->saveLocation("tmp" , "kdenlive" ) + context.result().toHex() + ".thumb"; + m_thumbFile = KGlobal::dirs()->saveLocation("tmp" , "kdenlive") + context.result().toHex() + ".thumb"; kDebug() << "thumbfile=" << m_thumbFile; } diff --git a/src/transition.cpp b/src/transition.cpp index 2bcc5b80..1fca5cb9 100644 --- a/src/transition.cpp +++ b/src/transition.cpp @@ -17,6 +17,7 @@ #include #include +#include #include #include @@ -27,14 +28,14 @@ #include "kdenlivesettings.h" -Transition::Transition(ClipItem * clipa, const TRANSITIONTYPE & type, const GenTime &startTime, const GenTime &endTime, bool inverted) { +Transition::Transition(const QRectF& rect , ClipItem * clipa, const TRANSITIONTYPE & type, const GenTime &startTime, const GenTime &endTime, double fps, bool inverted) : AbstractClipItem(rect) { m_invertTransition = inverted; m_singleClip = true; m_transitionTrack = 0; m_secondClip = NULL; m_transitionType = type; m_transitionName = getTransitionName(m_transitionType); - + m_fps = fps; GenTime duration = endTime - startTime; // Default duration = 2.5 seconds @@ -49,10 +50,11 @@ Transition::Transition(ClipItem * clipa, const TRANSITIONTYPE & type, const GenT m_transitionDuration = m_referenceClip->duration() - m_transitionStart; else m_transitionDuration = duration; m_secondClip = 0; + setFlags(QGraphicsItem::ItemClipsToShape | QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable); } // create a transition from XML -Transition::Transition(ClipItem * clip, QDomElement transitionElement, GenTime offset) { +Transition::Transition(const QRectF& rect , ClipItem * clip, QDomElement transitionElement, double fps, GenTime offset) : AbstractClipItem(rect) { if (offset == GenTime()) offset = clip->startPos(); m_referenceClip = clip; m_singleClip = true; @@ -83,6 +85,7 @@ Transition::Transition(ClipItem * clip, QDomElement transitionElement, GenTime o // Check if transition is valid (not outside of clip) if (m_transitionStart > clip->duration()) m_transitionDuration = GenTime(); + } Transition::~Transition() { @@ -212,8 +215,18 @@ GenTime Transition::transitionEndTime() const { return m_referenceClip->startPos() + m_transitionStart + m_transitionDuration; } } +void Transition::paint(QPainter *painter, + const QStyleOptionGraphicsItem *option, + QWidget *widget) { + painter->fillRect(rect(), QBrush(Qt::green)); +} - +int Transition::type() const { + return 70001; +} +OPERATIONTYPE Transition::operationMode(QPointF pos, double scale) { + return MOVE; +} void Transition::resizeTransitionStart(GenTime time) { if (!m_singleClip) return; //cannot resize automatic transitions if (time < m_referenceClip->startPos()) time = m_referenceClip->startPos(); @@ -251,7 +264,7 @@ bool Transition::belongsToClip(const ClipItem * clip) const { } Transition *Transition::clone() { - return new Transition::Transition(m_referenceClip, this->toXML()); + return new Transition::Transition(rect(), m_referenceClip, this->toXML() , m_fps); /*if (m_singleClip || m_secondClip == 0) return new Transition::Transition(m_referenceClip); else @@ -261,7 +274,7 @@ Transition *Transition::clone() { } Transition *Transition::reparent(ClipItem * clip) { - return new Transition::Transition(clip, this->toXML(), m_referenceClip->startPos()); + return new Transition::Transition(rect(), clip, this->toXML(), m_fps, m_referenceClip->startPos()); } bool Transition::isValid() const { @@ -297,3 +310,18 @@ QDomElement Transition::toXML() { return effect; } +GenTime Transition::startPos() const { + return GenTime(); +} + +GenTime Transition::endPos() const { + return GenTime(); +} + +int Transition::track() const { + return 0; +} + +GenTime Transition::duration() const { + return GenTime(); +} diff --git a/src/transition.h b/src/transition.h index 3678fd35..19ee87a5 100644 --- a/src/transition.h +++ b/src/transition.h @@ -20,13 +20,13 @@ #include #include -#include +#include #include -#include +#include #include "gentime.h" #include "definitions.h" - +#include "abstractclipitem.h" /**Describes a Transition, with a name, parameters keyframes, etc. *@author Jean-Baptiste Mardelle @@ -34,13 +34,17 @@ class ClipItem; -class Transition { +class Transition : public AbstractClipItem { + Q_OBJECT public: - Transition(ClipItem * clipa, const TRANSITIONTYPE & type, const GenTime &startTime, const GenTime &endTime, bool inverted = false); - Transition(ClipItem * clip, QDomElement transitionElement, GenTime offset = GenTime()); - ~Transition(); - + Transition(const QRectF&, ClipItem * clipa, const TRANSITIONTYPE & type, const GenTime &startTime, const GenTime &endTime, double fps, bool inverted = false); + Transition(const QRectF&, ClipItem * clip, QDomElement transitionElement, double fps, GenTime offset = GenTime()); + virtual ~Transition(); + virtual void paint(QPainter *painter, + const QStyleOptionGraphicsItem *option, + QWidget *widget); + virtual int type() const; /** Returns an XML representation of this transition. */ QDomElement toXML(); @@ -57,6 +61,7 @@ public: void moveTransition(GenTime time); bool invertTransition() const; TRANSITIONTYPE transitionType() const; + OPERATIONTYPE operationMode(QPointF pos, double scale); QString transitionTag() const; QString transitionName() const; void setTransitionType(TRANSITIONTYPE newType); @@ -70,7 +75,10 @@ public: bool isValid() const; GenTime transitionDuration() const; const ClipItem *referencedClip() const; - + GenTime startPos() const; + GenTime endPos() const; + int track() const; + GenTime duration() const; private: GenTime m_transitionStart;