-rw-r--r-- | korganizer/koagenda.cpp | 195 | ||||
-rw-r--r-- | korganizer/koagenda.h | 6 | ||||
-rw-r--r-- | korganizer/koagendaitem.cpp | 2 | ||||
-rw-r--r-- | korganizer/koagendaview.cpp | 14 | ||||
-rw-r--r-- | korganizer/koagendaview.h | 1 | ||||
-rw-r--r-- | korganizer/kolistview.cpp | 55 | ||||
-rw-r--r-- | korganizer/kolistview.h | 7 |
7 files changed, 259 insertions, 21 deletions
diff --git a/korganizer/koagenda.cpp b/korganizer/koagenda.cpp index 66ad4ec..14f52b8 100644 --- a/korganizer/koagenda.cpp +++ b/korganizer/koagenda.cpp @@ -67,13 +67,12 @@ MarcusBains::MarcusBains(KOAgenda *_agenda,const char *name) setLineWidth(0); setMargin(0); setBackgroundColor(Qt::red); minutes = new QTimer(this); connect(minutes, SIGNAL(timeout()), this, SLOT(updateLoc())); minutes->start(0, true); - mTimeBox = new QLabel(this); mTimeBox->setAlignment(Qt::AlignRight | Qt::AlignBottom); QPalette pal = mTimeBox->palette(); pal.setColor(QColorGroup::Foreground, Qt::red); mTimeBox->setPalette(pal); //mTimeBox->setAutoMask(true); @@ -172,13 +171,13 @@ KOAgenda::KOAgenda(int columns,int rows,int rowSize,QWidget *parent, mColumns = columns; mRows = rows; mGridSpacingY = rowSize; mAllDayMode = false; #ifndef DESKTOP_VERSION - QPEApplication::setStylusOperation( viewport(), QPEApplication::RightOnHold ); + //QPEApplication::setStylusOperation( viewport(), QPEApplication::RightOnHold ); #endif mHolidayMask = 0; init(); } /* @@ -192,13 +191,13 @@ KOAgenda::KOAgenda(int columns,QWidget *parent,const char *name,WFlags f) : mColumns = columns; mRows = 1; //qDebug("aaaaaaaaaaaaaaaaaaldays %d ", KOPrefs::instance()->mAllDaySize); mGridSpacingY = KOPrefs::instance()->mAllDaySize; mAllDayMode = true; #ifndef DESKTOP_VERSION - QPEApplication::setStylusOperation( viewport(), QPEApplication::RightOnHold ); + //QPEApplication::setStylusOperation( viewport(), QPEApplication::RightOnHold ); #endif mHolidayMask = 0; init(); } @@ -219,12 +218,15 @@ QDate KOAgenda::selectedIncidenceDate() const return (mSelectedItem ? mSelectedItem->itemDate() : QDate()); } void KOAgenda::init() { + mPopupTimer = new QTimer(this); + connect(mPopupTimer , SIGNAL(timeout()), this, SLOT(popupMenu())); + mNewItemPopup = new QPopupMenu( this ); connect ( mNewItemPopup, SIGNAL (activated ( int ) ), this, SLOT ( newItem(int)) ); QString pathString = ""; if ( !KOPrefs::instance()->mToolBarMiniIcons ) { if ( QApplication::desktop()->width() < 480 ) pathString += "icons16/"; @@ -308,13 +310,15 @@ void KOAgenda::init() // Create the Marcus Bains line. if(mAllDayMode) mMarcusBains = 0; else { mMarcusBains = new MarcusBains(this); addChild(mMarcusBains); - } + } + mPopupKind = 0; + mPopupItem = 0; } void KOAgenda::clear() { KOAgendaItem *item; for ( item=mItems.first(); item != 0; item=mItems.next() ) { @@ -379,16 +383,196 @@ bool KOAgenda::eventFilter ( QObject *object, QEvent *event ) return true; default: return QScrollView::eventFilter(object,event); } } - +void KOAgenda::popupMenu() +{ + mPopupTimer->stop(); + if ( mPopupKind == 1 ) { + if (mActionItem ) { + endItemAction(); + } + mLeftMouseDown = false; // no more leftMouse computation + if (mPopupItem) { + selectItem(mPopupItem); + emit showIncidencePopupSignal(mPopupItem->incidence()); + + } + } else if ( mPopupKind == 2 ) { + if ( mLeftMouseDown ) { // we have a simulated right click - clear left mouse action + endSelectAction( false ); // do not emit new event signal + mLeftMouseDown = false; // no more leftMouse computation + } + mNewItemPopup->popup( mPopupPos); + } + mLeftMouseDown = false; + mPopupItem = 0; + mPopupKind = 0; +} bool KOAgenda::eventFilter_mouse(QObject *object, QMouseEvent *me) { + //qDebug("KOAgenda::eventFilter_mous "); + QPoint viewportPos; + if (object != viewport()) { + viewportPos = ((QWidget *)object)->mapToParent(me->pos()); + } else { + viewportPos = me->pos(); + } + static int startX = 0; + static int startY = 0; + static int blockmoveDist = ( QApplication::desktop()->width() < 480 ? 15 : 20 ); + static bool blockMoving = true; + switch (me->type()) { + case QEvent::MouseButtonPress: + if (me->button() == LeftButton) { + mPopupTimer->start( 600 ); + mLeftMouseDown = true; + } + blockMoving = true; + startX = viewportPos.x(); + startY = viewportPos.y(); + if (object != viewport()) { + mPopupItem = (KOAgendaItem *)object; + mPopupKind = 1; + if (me->button() == RightButton) { + popupMenu(); + } else if (me->button() == LeftButton) { + mActionItem = (KOAgendaItem *)object; + if (mActionItem) { + if ( mSelectionHeight > 0 ) { + int selectionCellX = mSelectionCellX * mGridSpacingX; + int selectionYTop = mSelectionYTop; + int gridSpacingX = mGridSpacingX; + int selectionHeight = mSelectionHeight; + clearSelection(); + repaintContents( selectionCellX, selectionYTop, + gridSpacingX, selectionHeight,false ); + } + selectItem(mActionItem); + Incidence *incidence = mActionItem->incidence(); + if ( incidence->isReadOnly() /*|| incidence->recurrence()->doesRecur() */) { + mActionItem = 0; + } else { + startItemAction(viewportPos); + } + } + } + } else { // ---------- viewport() + mPopupItem = 0; + mPopupKind = 2; + selectItem(0); + mActionItem = 0; + mPopupPos = viewport()->mapToGlobal( me->pos() ); + if (me->button() == RightButton) { + popupMenu(); + } else if (me->button() == LeftButton) { + setCursor(arrowCursor); + startSelectAction(viewportPos); + } + } + break; + + case QEvent::MouseButtonRelease: + if (me->button() == LeftButton ) { + mPopupTimer->stop(); + } + if (object != viewport()) { + if (me->button() == LeftButton && mLeftMouseDown) { + if (mActionItem) { + QPoint clipperPos = clipper()->mapFromGlobal(viewport()->mapToGlobal(viewportPos)); + //qDebug(" %d %d %d ",clipperPos.y(),visibleHeight() , 9 ); + if ( mActionType == MOVE && (clipperPos.y() > visibleHeight()-2 ||clipperPos.y() < 0 ) ) { + mScrollUpTimer.stop(); + mScrollDownTimer.stop(); + mActionItem->resetMove(); + placeSubCells( mActionItem ); + // emit startDragSignal( mActionItem->incidence() ); + setCursor( arrowCursor ); + mActionItem = 0; + mActionType = NOP; + mItemMoved = 0; + mLeftMouseDown = false; + return true; + } + endItemAction(); + } + } + + } else { // ---------- viewport() + if (me->button() == LeftButton && mLeftMouseDown ) { //left click + endSelectAction( true ); // emit new event signal + } + } + if (me->button() == LeftButton) + mLeftMouseDown = false; + + break; + + case QEvent::MouseMove: + if ( !mLeftMouseDown ) + return true; + if ( blockMoving ) { + int dX, dY; + dX = startX - viewportPos.x(); + if ( dX < 0 ) + dX = -dX; + dY = viewportPos.y() - startY; + if ( dY < 0 ) + dY = -dY; + //qDebug("%d %d %d ", dX, dY , blockmoveDist ); + if ( dX > blockmoveDist || dY > blockmoveDist ) { + blockMoving = false; + } + } + if ( ! blockMoving ) + mPopupTimer->stop(); + if (object != viewport()) { + KOAgendaItem *moveItem = (KOAgendaItem *)object; + if (!moveItem->incidence()->isReadOnly() ) { + if (!mActionItem) + setNoActionCursor(moveItem,viewportPos); + else { + if ( !blockMoving ) + performItemAction(viewportPos); + } + } + } else { // ---------- viewport() + mPopupPos = viewport()->mapToGlobal( me->pos() ); + if ( mActionType == SELECT ) { + performSelectAction( viewportPos ); + } + } + break; + + case QEvent::MouseButtonDblClick: + mPopupTimer->stop(); + if (object == viewport()) { + selectItem(0); + int x,y; + viewportToContents(viewportPos.x(),viewportPos.y(),x,y); + int gx,gy; + contentsToGrid(x,y,gx,gy); + emit newEventSignal(gx,gy); + } else { + KOAgendaItem *doubleClickedItem = (KOAgendaItem *)object; + selectItem(doubleClickedItem); + if ( KOPrefs::instance()->mEditOnDoubleClick ) + emit editIncidenceSignal(doubleClickedItem->incidence()); + else + emit showIncidenceSignal(doubleClickedItem->incidence()); + } + break; + + default: + break; + } + return true; +#if 0 //qDebug("KOAgenda::eventFilter_mous "); QPoint viewportPos; if (object != viewport()) { viewportPos = ((QWidget *)object)->mapToParent(me->pos()); } else { viewportPos = me->pos(); @@ -556,12 +740,13 @@ bool KOAgenda::eventFilter_mouse(QObject *object, QMouseEvent *me) break; default: break; } return true; +#endif } void KOAgenda::newItem( int item ) { if ( item == 1 ) { //new event newEventSignal(mStartCellX ,mStartCellY ); diff --git a/korganizer/koagenda.h b/korganizer/koagenda.h index f3f1772..3d33ae5 100644 --- a/korganizer/koagenda.h +++ b/korganizer/koagenda.h @@ -123,12 +123,13 @@ class KOAgenda : public QScrollView void printSelection(); void storePosition(); void restorePosition(); public slots: + void popupMenu(); void newItem( int ); void moveChild( QWidget *, int, int ); void scrollUp(); void scrollDown(); void updateTodo( Todo * t, int , bool ); void popupAlarm(); @@ -211,12 +212,17 @@ class KOAgenda : public QScrollView private: void init(); void marcus_bains(); bool mAllDayMode; bool blockResize; + bool mLeftMouseDown; + KOAgendaItem *mPopupItem; + QTimer* mPopupTimer; + int mPopupKind; + QPoint mPopupPos; QTimer mResizeTimer; double mContentPosition; // Width and height of agenda cells int mGridSpacingX; int mGridSpacingY; diff --git a/korganizer/koagendaitem.cpp b/korganizer/koagendaitem.cpp index 905c1bf..b30ad75 100644 --- a/korganizer/koagendaitem.cpp +++ b/korganizer/koagendaitem.cpp @@ -72,13 +72,13 @@ private: KOAgendaItem::KOAgendaItem(Incidence *incidence, QDate qd, QWidget *parent,bool allday, const char *name,WFlags) : QWidget(parent, name), mIncidence(incidence), mDate(qd) { #ifndef DESKTOP_VERSION - QPEApplication::setStylusOperation( this, QPEApplication::RightOnHold ); + //QPEApplication::setStylusOperation( this, QPEApplication::RightOnHold ); #endif mKOAgendaItemWhatsThis = new KOAgendaItemWhatsThis(this); int wflags = getWFlags() |WRepaintNoErase;// WResizeNoErase setWFlags ( wflags); mAllDay = allday; init ( incidence, qd ); diff --git a/korganizer/koagendaview.cpp b/korganizer/koagendaview.cpp index 957ac52..b9c7dec 100644 --- a/korganizer/koagendaview.cpp +++ b/korganizer/koagendaview.cpp @@ -126,13 +126,13 @@ void TimeLabels::drawContents(QPainter *p,int cx, int cy, int cw, int ch) QString hour; QString suffix; QString fullTime; int tW = fm.width("24:00i"); int timeHeight = fm.height(); timeHeight -= (timeHeight/4-2); - int borderWidth = 5; + int borderWidth = 2; QFont nFont = p->font(); QFont sFont = nFont; sFont.setPointSize( sFont.pointSize()/2+2 ); if (!KGlobal::locale()->use12Clock()) suffix = "00"; QFontMetrics fmS( sFont ); @@ -176,31 +176,23 @@ void TimeLabels::drawContents(QPainter *p,int cx, int cy, int cw, int ch) /** Calculates the minimum width. */ int TimeLabels::minimumWidth() const { - QFontMetrics fm = fontMetrics(); - - //TODO: calculate this value - int borderWidth = 4; - - // the maximum width possible - int width = fm.width("88:88x") + borderWidth; - - return width; + return mMiniWidth; } /** updates widget's internal state */ void TimeLabels::updateConfig() { // set the font // config->setGroup("Fonts"); // QFont font = config->readFontEntry("TimeBar Font"); setFont(KOPrefs::instance()->mTimeBarFont); - + mMiniWidth = fontMetrics().width("88:88") + 2 ; // update geometry restrictions based on new settings setFixedWidth(minimumWidth()); // update HourSize mCellHeight = KOPrefs::instance()->mHourSize*4; resizeContents(50,mRows * mCellHeight); diff --git a/korganizer/koagendaview.h b/korganizer/koagendaview.h index 8b8bac0..0cb9310 100644 --- a/korganizer/koagendaview.h +++ b/korganizer/koagendaview.h @@ -98,12 +98,13 @@ class TimeLabels : public QScrollView { signals: void scaleChanged(); protected: void drawContents(QPainter *p,int cx, int cy, int cw, int ch); private: + int mMiniWidth; int mMouseDownY; QString mOrgCap; int mRows; int mCellHeight; /** */ diff --git a/korganizer/kolistview.cpp b/korganizer/kolistview.cpp index 6b63d7f..09d70f1 100644 --- a/korganizer/kolistview.cpp +++ b/korganizer/kolistview.cpp @@ -1151,16 +1151,18 @@ void KOListViewListView::keyPressEvent ( QKeyEvent *e) break; default: e->ignore(); } } KOListViewListView::KOListViewListView(KOListView * lv ) - : KListView( lv ) -{ + : KListView( lv, "kolistlistview", false ) +{ + mPopupTimer = new QTimer(this); + connect(mPopupTimer , SIGNAL(timeout()), this, SLOT(popupMenu())); #ifndef DESKTOP_VERSION - QPEApplication::setStylusOperation(viewport(), QPEApplication::RightOnHold ); + //QPEApplication::setStylusOperation(viewport(), QPEApplication::RightOnHold ); #endif setSelectionMode( QListView::Multi ); setMultiSelection( true); } void KOListViewListView::contentsMouseDoubleClickEvent(QMouseEvent *e) { @@ -1170,13 +1172,13 @@ void KOListViewListView::contentsMouseDoubleClickEvent(QMouseEvent *e) if (!item) { emit newEvent(); return; } KListView::contentsMouseDoubleClickEvent(e); } - +#if 0 void KOListViewListView::contentsMousePressEvent(QMouseEvent *e) { //qDebug("contentsMousePressEvent++++ "); KListView::contentsMousePressEvent( e ); if ( e->button() == RightButton ) { QListViewItem* ci = currentItem(); @@ -1190,6 +1192,51 @@ void KOListViewListView::contentsMouseReleaseEvent(QMouseEvent *e) KListView::contentsMouseReleaseEvent(e); } void KOListViewListView::contentsMouseMoveEvent(QMouseEvent *e) { KListView::contentsMouseMoveEvent(e); } +#endif +void KOListViewListView::popupMenu() +{ + mPopupTimer->stop(); + //qDebug("HUUUUUUUUUUUUUUUUUUUU "); + QMouseEvent* e = new QMouseEvent( QEvent::MouseButtonPress, mEventPos ,mEventGlobalPos, RightButton , RightButton ); + QApplication::postEvent( this->viewport(), e ); +} +void KOListViewListView::contentsMousePressEvent(QMouseEvent *e) +{ + //qDebug("contentsMousePressEvent++++ "); + mYMousePos = mapToGlobal( (e->pos())).y(); + if ( e->button() == LeftButton ) { + mPopupTimer->start( 600 ); + mEventPos = e->pos(); + mEventGlobalPos = e->globalPos(); + } + KListView::contentsMousePressEvent( e ); + if ( e->button() == RightButton ) { + QListViewItem* ci = currentItem(); + clearSelection(); + if ( ci ) + ci->setSelected( true ); + } +} +void KOListViewListView::contentsMouseReleaseEvent(QMouseEvent *e) +{ + mPopupTimer->stop(); + KListView::contentsMouseReleaseEvent(e); +} +void KOListViewListView::contentsMouseMoveEvent(QMouseEvent *e) +{ + // qDebug("contentsMouseMoveEv....... "); + // qDebug("start: %d current %d ",mYMousePos , mapToGlobal( (e->pos())).y() ); + int diff = mYMousePos - mapToGlobal( (e->pos())).y(); + if ( diff < 0 ) diff = -diff; + if ( diff > 15 ) + mPopupTimer->stop(); + else { + mEventPos = e->pos(); + mEventGlobalPos = e->globalPos(); + } + KListView::contentsMouseMoveEvent(e); +} + diff --git a/korganizer/kolistview.h b/korganizer/kolistview.h index eca71e2..bb0e23e 100644 --- a/korganizer/kolistview.h +++ b/korganizer/kolistview.h @@ -44,12 +44,13 @@ using namespace KCal; #include <qpushbutton.h> #include <qlayout.h> #include <qdialog.h> +#include <qtimer.h> #include <qcombobox.h> #include <qspinbox.h> #include <qtooltip.h> #include <qcheckbox.h> #include <qhbox.h> #include <qlabel.h> @@ -214,13 +215,19 @@ class KOListViewListView : public KListView Q_OBJECT public: KOListViewListView(KOListView * lv ); signals: void newEvent(); void showIncidence( Incidence* ); + public slots: + void popupMenu(); private: + QPoint mEventPos; + QPoint mEventGlobalPos; + QTimer* mPopupTimer; + int mYMousePos; void keyPressEvent ( QKeyEvent * ) ; void contentsMouseDoubleClickEvent(QMouseEvent *e); void contentsMousePressEvent(QMouseEvent *e); void contentsMouseReleaseEvent(QMouseEvent *e); void contentsMouseMoveEvent(QMouseEvent *e); bool mMouseDown; |