diff --git a/src/frontends/qt4/ChangeLog b/src/frontends/qt4/ChangeLog index 21c120dd3d..7e7ad244f5 100644 --- a/src/frontends/qt4/ChangeLog +++ b/src/frontends/qt4/ChangeLog @@ -1,3 +1,19 @@ +2006-03-01 Jürgen Spitzmüller + + * QLMenubar.h: compile fix for gcc-4.1. + +2006-03-01 Abdelrazak Younes + + * QWorkArea.[Ch] cleanup: + - Added private members workWidth_ and workHeight_ in order to + make sure QWorkArea is always able to draw (link to + workArea::WorkAreaResize). + - deleted superfluous debugging stuff + - deleted superfluous commented out code. + - placed all specific stuff (Qt-immodule, X11 and Mac OSX) in a + separate place at the end of QWorkArea.C. + - initial support for Wheel mouse (still does not work). + 2006-03-12 Lars Gullik Bjønnes * ui/pch.h: new file @@ -11,6 +27,39 @@ * add svn:ignore +2006-03-01 Abdelrazak Younes + + Initial Port to Qt4. + * UI files: they have all been ported to Qt4 format. + - With Qt4, uic generates a header only class that is not a Q_OBJECT. + => No more need to compile anything in the ui directory. + => No more need to moc the header + - Signal/slot connection to external method is no more supported. I have + transfered all the connections to the corresponding Dialog classes. + - xxxBase and xxxModule renamed to xxxUi + - Remaining issue: there's still an error with BulletsUI.ui + + * Dialogs. + All the dialogs have been ported but there still some Q3xxx objects. + Remaining issues: + - qttableview use replaced with QTableWidget: Dragging the define the + table with the mouse is not implemented. + - QTocDialog ported to QTreeWidget but not yet fully functional. + - BulletModule not fully been ported and not functional. + - Wheel mouse support not functional + - Toolbars are always positioned at the top. + + * Important rewrites: + - QContentPane merged with QWorkArea which derives from QAbstractScrollArea. + - QLPainter now use QPainter + - QLPopupmenu ported to QMenu. + - QtView ported to QMainWindow + - QLToolbar, QToc, QTocDialog, QPrefsDialog, QDocumentDialog... + - As Qt4 UI files do not define external signal/slot, I had to copy and + paste the code generated by former 'uic' in the *.C files into + corresponding Dialog classes. I think I have covered all connections but + this has to be verified. + 2005-12-14 Hartmut Haase * ui/QPrefLatexModule.ui: make the papersize choices in diff --git a/src/frontends/qt4/QLMenubar.h b/src/frontends/qt4/QLMenubar.h index 5c978aff0f..7c846a8d4e 100644 --- a/src/frontends/qt4/QLMenubar.h +++ b/src/frontends/qt4/QLMenubar.h @@ -59,7 +59,7 @@ public slots: private: /// Initialize specific MACOS X menubar - void QLMenubar::macxMenuBarInit(); + void macxMenuBarInit(); /// owning view QtView * owner_; diff --git a/src/frontends/qt4/QWorkArea.C b/src/frontends/qt4/QWorkArea.C index ded221a92b..74dc2bd84e 100644 --- a/src/frontends/qt4/QWorkArea.C +++ b/src/frontends/qt4/QWorkArea.C @@ -11,6 +11,8 @@ #include +#include + #include "QWorkArea.h" #include "QLPainter.h" #include "QLyXKeySym.h" @@ -35,25 +37,29 @@ #include +/////////////////////////////////////////////////////////////// +// Specific stuff #ifdef Q_WS_X11 #include #endif -#ifdef Q_WS_MACX +#ifdef Q_OS_MACX #include -#endif - -#ifdef Q_OS_MAC #include - using lyx::support::subst; #endif + +// You can find other qt-immodule, X11 and MACX specific stuff +// at the end of this file... +/////////////////////////////////////////////////////////////// + using std::endl; using std::string; namespace os = lyx::support::os; namespace { + QWorkArea const * wa_ptr = 0; /// return the LyX key state from Qt's @@ -114,16 +120,8 @@ SyntheticMouseEvent::SyntheticMouseEvent() {} - -Painter & QWorkArea::getPainter() { return painter_; } - -// QLPainter & QWorkArea::getQLPainter() { return painter_; } - -/// get the content pane widget -QWidget * QWorkArea::getContent() const { return viewport(); } - QWorkArea::QWorkArea(LyXView &, int w, int h) - : WorkArea(), QAbstractScrollArea(qApp->mainWidget()), painter_(this) + : QAbstractScrollArea(qApp->mainWidget()), WorkArea(), painter_(this) { setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn); setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); @@ -134,57 +132,31 @@ QWorkArea::QWorkArea(LyXView &, int w, int h) setMinimumSize(100, 70); -// setBackgroundRole(lcolorcache.get(LColor::background)); -// viewport()->setBackgroundRole(QPalette::Window); viewport()->setAutoFillBackground(false); viewport()->setAttribute(Qt::WA_OpaquePaintEvent); viewport()->setFocusPolicy(Qt::WheelFocus); viewport()->setFocus(); -// viewport()->grabKeyboard(); setFocusPolicy(Qt::WheelFocus); - setFocusProxy(viewport()); + viewport()->setCursor(Qt::IBeamCursor); resize(w, h); show(); - - scrolled_with_mouse_=false; - scrolled_with_keyboard_ = false; + workWidth_ = w; + workHeight_ = h; synthetic_mouse_event_.timeout.timeout.connect( boost::bind(&QWorkArea::generateSyntheticMouseEvent, this)); -/* - if ( !QObject::connect(&step_timer_, SIGNAL(timeout()), - this, SLOT(keyeventTimeout())) ) - lyxerr[Debug::GUI] << "ERROR: keyeventTimeout cannot connect!" << endl; -*/ - - if ( !QObject::connect(verticalScrollBar(), SIGNAL(actionTriggered(int)), - this, SLOT(adjustViewWithScrollBar(int))) ) - lyxerr[Debug::GUI] << "ERROR: adjustViewWithScrollBar cannot connect!" << endl; -#if USE_INPUT_METHODS - // to make qt-immodule work - setInputMethodEnabled(true); -#endif -#ifdef Q_WS_X11 - // doubleClickInterval() is 400 ms on X11 witch is just too long. - // On Windows and Mac OS X, the operating system's value is used. - // On Microsoft Windows, calling this function sets the double - // click interval for all applications. So we don't! - QApplication::setDoubleClickInterval(300); -#endif + // Initialize the vertical Scroll Bar + QObject::connect(verticalScrollBar(), SIGNAL(actionTriggered(int)), + this, SLOT(adjustViewWithScrollBar(int))); - // Start the timer, one-shot. - step_timer_.start(50, true); + // PageStep only depends on the viewport height. + verticalScrollBar()->setPageStep(workHeight_); - //viewport()->resize(w, h); - pixmap_.reset(new QPixmap(viewport()->width(), viewport()->height())); - - this->workAreaResize(); - lyxerr[Debug::GUI] << BOOST_CURRENT_FUNCTION << "\n Area width\t" << width() << "\n Area height\t" << height() @@ -192,9 +164,36 @@ QWorkArea::QWorkArea(LyXView &, int w, int h) << "\n viewport height\t" << viewport()->height() << endl; -// this->QWidget::resize(w,h); +/* + // This is the keyboard buffering stuff... + // I don't see any need for this under windows. The keyboard is reactive + // enough... -#ifdef Q_WS_MACX + if ( !QObject::connect(&step_timer_, SIGNAL(timeout()), + this, SLOT(keyeventTimeout())) ) + lyxerr[Debug::GUI] << "ERROR: keyeventTimeout cannot connect!" << endl; + + // Start the timer, one-shot. + step_timer_.start(50, true); +*/ + + /////////////////////////////////////////////////////////////////////// + // Specific stuff goes here... + +#if USE_INPUT_METHODS + // to make qt-immodule work + setInputMethodEnabled(true); +#endif + +#ifdef Q_OS_X11 + // doubleClickInterval() is 400 ms on X11 witch is just too long. + // On Windows and Mac OS X, the operating system's value is used. + // On Microsoft Windows, calling this function sets the double + // click interval for all applications. So we don't! + QApplication::setDoubleClickInterval(300); +#endif + +#ifdef Q_OS_MACX wa_ptr = this; #endif } @@ -205,32 +204,13 @@ QWorkArea::~QWorkArea() void QWorkArea::setScrollbarParams(int h, int scroll_pos, int scroll_line_step) { - /* - if (scrolled_with_mouse_) - { - scrolled_with_mouse_=false; - return; - } - */ - - //if (scroll_pos_ == scroll_pos) - //{ - // verticalScrollBar()->triggerAction(QAbstractSlider::SliderMove); - int scroll_pos_ = scroll_pos; - //} - int scroll_line_step_ = scroll_line_step; - int scroll_page_step_ = viewport()->height(); - // do what cursor movement does (some grey) h += height() / 4; int scroll_max_ = std::max(0, h - height()); - //scrolled_with_keyboard_=true; - verticalScrollBar()->setRange(0, scroll_max_); - verticalScrollBar()->setSliderPosition(scroll_pos_); - verticalScrollBar()->setLineStep(scroll_line_step_); - verticalScrollBar()->setPageStep(scroll_page_step_); + verticalScrollBar()->setSliderPosition(scroll_pos); + verticalScrollBar()->setLineStep(scroll_line_step); } void QWorkArea::adjustViewWithScrollBar(int action) @@ -245,10 +225,331 @@ void QWorkArea::adjustViewWithScrollBar(int action) << endl; this->scrollDocView(verticalScrollBar()->sliderPosition()); - -// scrolled_with_mouse_ = true; } + +void QWorkArea::haveSelection(bool own) const +{ + wa_ptr = this; + + if (!QApplication::clipboard()->supportsSelection()) + return; + + if (own) { + QApplication::clipboard()->setText(QString(), QClipboard::Selection); + } + // We don't need to do anything if own = false, as this case is + // handled by QT. +} + + +string const QWorkArea::getClipboard() const +{ + QString str = QApplication::clipboard()->text(QClipboard::Selection); + lyxerr[Debug::ACTION] << "getClipboard: " << (const char*) str << endl; + if (str.isNull()) + return string(); +#ifdef Q_OS_MACX + // The MAC clipboard uses \r for lineendings, and we use \n + return subst(fromqstr(str), '\r', '\n'); +#else + return fromqstr(str); +#endif +} + + +void QWorkArea::putClipboard(string const & str) const +{ +#ifdef Q_OS_MACX + // The MAC clipboard uses \r for lineendings, and we use \n + QApplication::clipboard()->setText(toqstr(subst(str, '\n', '\r')), + QClipboard::Selection); +#else + QApplication::clipboard()->setText(toqstr(str), QClipboard::Selection); +#endif + lyxerr[Debug::ACTION] << "putClipboard: " << str << endl; +} + + +void QWorkArea::dragEnterEvent(QDragEnterEvent * event) +{ + event->accept(Q3UriDrag::canDecode(event)); + + /// \todo Ask lyx-devel is this is enough: + /// if (event->mimeData()->hasFormat("text/plain")) + /// event->acceptProposedAction(); + +} + + +void QWorkArea::dropEvent(QDropEvent* event) +{ + QStringList files; + + if (Q3UriDrag::decodeLocalFiles(event, files)) { + lyxerr[Debug::GUI] << "QWorkArea::dropEvent: got URIs!" + << endl; + for (QStringList::Iterator i = files.begin(); + i!=files.end(); ++i) { + string const file = os::internal_path(fromqstr(*i)); + dispatch(FuncRequest(LFUN_FILE_OPEN, file)); + } + } +} + + +void QWorkArea::mousePressEvent(QMouseEvent * e) +{ + if (dc_event_.active && dc_event_ == *e) { + dc_event_.active = false; + FuncRequest cmd(LFUN_MOUSE_TRIPLE, + dc_event_.x, dc_event_.y, + q_button_state(dc_event_.state)); + this->dispatch(cmd); + return; + } + + FuncRequest const cmd(LFUN_MOUSE_PRESS, e->x(), e->y(), + q_button_state(e->button())); + this->dispatch(cmd); +} + + +void QWorkArea::mouseReleaseEvent(QMouseEvent * e) +{ + if (synthetic_mouse_event_.timeout.running()) + synthetic_mouse_event_.timeout.stop(); + + FuncRequest const cmd(LFUN_MOUSE_RELEASE, e->x(), e->y(), + q_button_state(e->button())); + this->dispatch(cmd); +} + + +void QWorkArea::mouseMoveEvent(QMouseEvent * e) +{ + FuncRequest cmd(LFUN_MOUSE_MOTION, e->x(), e->y(), + q_motion_state(e->state())); + + // If we're above or below the work area... + if (e->y() <= 20 || e->y() >= viewport()->height() - 20) { + // Make sure only a synthetic event can cause a page scroll, + // so they come at a steady rate: + if (e->y() <= 20) + // _Force_ a scroll up: + cmd.y = -40; + else + cmd.y = viewport()->height(); + // Store the event, to be handled when the timeout expires. + synthetic_mouse_event_.cmd = cmd; + + if (synthetic_mouse_event_.timeout.running()) + // Discard the event. Note that it _may_ be handled + // when the timeout expires if + // synthetic_mouse_event_.cmd has not been overwritten. + // Ie, when the timeout expires, we handle the + // most recent event but discard all others that + // occurred after the one used to start the timeout + // in the first place. + return; + else { + synthetic_mouse_event_.restart_timeout = true; + synthetic_mouse_event_.timeout.start(); + // Fall through to handle this event... + } + + } else if (synthetic_mouse_event_.timeout.running()) { + // Store the event, to be possibly handled when the timeout + // expires. + // Once the timeout has expired, normal control is returned + // to mouseMoveEvent (restart_timeout = false). + // This results in a much smoother 'feel' when moving the + // mouse back into the work area. + synthetic_mouse_event_.cmd = cmd; + synthetic_mouse_event_.restart_timeout = false; + return; + } + + // Has anything changed on-screen since the last QMouseEvent + // was received? + double const scrollbar_value = verticalScrollBar()->value(); + if (e->x() != synthetic_mouse_event_.x_old || + e->y() != synthetic_mouse_event_.y_old || + scrollbar_value != synthetic_mouse_event_.scrollbar_value_old) { + // Yes it has. Store the params used to check this. + synthetic_mouse_event_.x_old = e->x(); + synthetic_mouse_event_.y_old = e->y(); + synthetic_mouse_event_.scrollbar_value_old = scrollbar_value; + + // ... and dispatch the event to the LyX core. + this->dispatch(cmd); + } +} + + +void QWorkArea::wheelEvent(QWheelEvent * e) +{ + verticalScrollBar()->setValue(verticalScrollBar()->value() - e->delta()); +} + +void QWorkArea::generateSyntheticMouseEvent() +{ + // Set things off to generate the _next_ 'pseudo' event. + if (synthetic_mouse_event_.restart_timeout) + synthetic_mouse_event_.timeout.start(); + + // Has anything changed on-screen since the last timeout signal + // was received? + double const scrollbar_value = verticalScrollBar()->value(); + if (scrollbar_value != synthetic_mouse_event_.scrollbar_value_old) { + // Yes it has. Store the params used to check this. + synthetic_mouse_event_.scrollbar_value_old = scrollbar_value; + + // ... and dispatch the event to the LyX core. + this->dispatch(synthetic_mouse_event_.cmd); + } +} + +void QWorkArea::keyPressEvent(QKeyEvent * e) +{ + lyxerr[Debug::KEY] << BOOST_CURRENT_FUNCTION + << " count=" << e->count() + << " text=" << (const char *) e->text() + << " isAutoRepeat=" << e->isAutoRepeat() + << " key=" << e->key() + << endl; + +// keyeventQueue_.push(boost::shared_ptr(new QKeyEvent(*e))); + + boost::shared_ptr sym(new QLyXKeySym); + sym->set(e); + this->workAreaKeyPress(sym, q_key_state(e->state())); + +} + +// This is not used for now... +void QWorkArea::keyeventTimeout() +{ + bool handle_autos = true; + + while (!keyeventQueue_.empty()) { + boost::shared_ptr ev = keyeventQueue_.front(); + + // We never handle more than one auto repeated + // char in a list of queued up events. + if (!handle_autos && ev->isAutoRepeat()) { + keyeventQueue_.pop(); + continue; + } + + boost::shared_ptr sym(new QLyXKeySym); + sym->set(ev.get()); + + lyxerr[Debug::GUI] << BOOST_CURRENT_FUNCTION + << " count=" << ev->count() + << " text=" << (const char *) ev->text() + << " isAutoRepeat=" << ev->isAutoRepeat() + << " key=" << ev->key() + << endl; + + this->workAreaKeyPress(sym, q_key_state(ev->state())); + keyeventQueue_.pop(); + + handle_autos = false; + } + + // Restart the timer. + step_timer_.start(25, true); +} + + +void QWorkArea::mouseDoubleClickEvent(QMouseEvent * e) +{ + dc_event_ = double_click(e); + + if (!dc_event_.active) + return; + + dc_event_.active = false; + + FuncRequest cmd(LFUN_MOUSE_DOUBLE, + dc_event_.x, dc_event_.y, + q_button_state(dc_event_.state)); + this->dispatch(cmd); +} + + +void QWorkArea::resizeEvent(QResizeEvent * resizeEvent) +{ + workWidth_ = viewport()->width(); + workHeight_ = viewport()->height(); + + verticalScrollBar()->setPageStep(viewport()->height()); + + pixmap_.reset(new QPixmap(viewport()->width(), viewport()->height())); + + this->workAreaResize(); + + lyxerr[Debug::GUI] << BOOST_CURRENT_FUNCTION + << "\n QWidget width\t" << this->QWidget::width() + << "\n QWidget height\t" << this->QWidget::height() + << "\n viewport width\t" << viewport()->width() + << "\n viewport height\t" << viewport()->height() + << "\n QResizeEvent rect left\t" << rect().left() + << "\n QResizeEvent rect right\t" << rect().right() + << endl; +} + +void QWorkArea::paintEvent(QPaintEvent * e) +{ + lyxerr[Debug::GUI] << BOOST_CURRENT_FUNCTION + << "\n QWidget width\t" << this->width() + << "\n QWidget height\t" << this->height() + << "\n viewport width\t" << viewport()->width() + << "\n viewport height\t" << viewport()->height() + << "\n pixmap width\t" << pixmap_->width() + << "\n pixmap height\t" << pixmap_->height() + << "\n QPaintEvent x\t" << e->rect().x() + << "\n QPaintEvent y\t" << e->rect().y() + << "\n QPaintEvent w\t" << e->rect().width() + << "\n QPaintEvent h\t" << e->rect().height() + << endl; + + QPainter q(viewport()); + q.drawPixmap(e->rect(), *pixmap_.get(), e->rect()); +} + + +/////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////// +// Specific stuff + +//////////////////////////////////////////////////////////////////////// +// qt-immodule specific stuff goes here... + +#if USE_INPUT_METHODS +// to make qt-immodule work + +void QWorkArea::inputMethodEvent(QInputMethodEvent * e) +{ + QString const text = e->text(); + if (!text.isEmpty()) { + int key = 0; + // needed to make math superscript work on some systems + // ideally, such special coding should not be necessary + if (text == "^") + key = Qt::Key_AsciiCircum; + QKeyEvent ev(QEvent::KeyPress, key, *text.ascii(), 0, text); + keyPressEvent(&ev); + } + e->accept(); +} +#endif + + +//////////////////////////////////////////////////////////////////////// +// X11 specific stuff goes here... + #ifdef Q_WS_X11 bool lyxX11EventFilter(XEvent * xev) { @@ -268,7 +569,11 @@ bool lyxX11EventFilter(XEvent * xev) } #endif -#ifdef Q_WS_MACX + +//////////////////////////////////////////////////////////////////////// +// Mac OSX specific stuff goes here... + +#ifdef Q_OS_MACX namespace{ OSErr checkAppleEventForMissingParams(const AppleEvent& theAppleEvent) { @@ -332,334 +637,4 @@ pascal OSErr handleOpenDocuments(const AppleEvent* inEvent, AEDisposeDesc(&documentList); return err; } -#endif // Q_WS_MACX - -void QWorkArea::haveSelection(bool own) const -{ - wa_ptr = this; - - if (!QApplication::clipboard()->supportsSelection()) - return; - - if (own) { - QApplication::clipboard()->setText(QString(), QClipboard::Selection); - } - // We don't need to do anything if own = false, as this case is - // handled by QT. -} - - -string const QWorkArea::getClipboard() const -{ - QString str = QApplication::clipboard()->text(QClipboard::Selection); - lyxerr[Debug::ACTION] << "getClipboard: " << (const char*) str << endl; - if (str.isNull()) - return string(); -#ifdef Q_OS_MAC - // The MAC clipboard uses \r for lineendings, and we use \n - return subst(fromqstr(str), '\r', '\n'); -#else - return fromqstr(str); -#endif -} - - -void QWorkArea::putClipboard(string const & str) const -{ -#ifdef Q_OS_MAC - // The MAC clipboard uses \r for lineendings, and we use \n - QApplication::clipboard()->setText(toqstr(subst(str, '\n', '\r')), - QClipboard::Selection); -#else - QApplication::clipboard()->setText(toqstr(str), QClipboard::Selection); -#endif - lyxerr[Debug::ACTION] << "putClipboard: " << str << endl; -} - - -void QWorkArea::dragEnterEvent(QDragEnterEvent * event) -{ - event->accept(Q3UriDrag::canDecode(event)); - - /// \todo Ask lyx-devel is this is enough: - /// if (event->mimeData()->hasFormat("text/plain")) - /// event->acceptProposedAction(); - -} - - -void QWorkArea::dropEvent(QDropEvent* event) -{ - QStringList files; - - if (Q3UriDrag::decodeLocalFiles(event, files)) { - lyxerr[Debug::GUI] << "QWorkArea::dropEvent: got URIs!" - << endl; - for (QStringList::Iterator i = files.begin(); - i!=files.end(); ++i) { - string const file = os::internal_path(fromqstr(*i)); - dispatch(FuncRequest(LFUN_FILE_OPEN, file)); - } - } -} -/* -void QWorkArea::scrollContentsBy(int dx, int dy) -{ - lyxerr[Debug::GUI] << BOOST_CURRENT_FUNCTION - << " scroll by dx=" << dx - << " dy=" << dy - << " verticalScrollBar val=" << verticalScrollBar()->value() - << " min=" << verticalScrollBar()->minimum() - << " max=" << verticalScrollBar()->maximum() - << " pagestep=" << verticalScrollBar()->pageStep() - << " linestep=" << verticalScrollBar()->lineStep() - << endl; - - if (scrolled_with_keyboard_) - { - scrolled_with_keyboard_=false; - return; - } - - this->scrollDocView(verticalScrollBar()->value()); - scrolled_with_mouse_ = true; -} -*/ - -#if USE_INPUT_METHODS -// to make qt-immodule work - -void QWorkArea::inputMethodEvent(QInputMethodEvent * e) -{ - QString const text = e->text(); - if (!text.isEmpty()) { - int key = 0; - // needed to make math superscript work on some systems - // ideally, such special coding should not be necessary - if (text == "^") - key = Qt::Key_AsciiCircum; - QKeyEvent ev(QEvent::KeyPress, key, *text.ascii(), 0, text); - keyPressEvent(&ev); - } - e->accept(); -} -#endif - -void QWorkArea::mousePressEvent(QMouseEvent * e) -{ - if (dc_event_.active && dc_event_ == *e) { - dc_event_.active = false; - FuncRequest cmd(LFUN_MOUSE_TRIPLE, - dc_event_.x, dc_event_.y, - q_button_state(dc_event_.state)); - this->dispatch(cmd); - return; - } - - FuncRequest const cmd(LFUN_MOUSE_PRESS, e->x(), e->y(), - q_button_state(e->button())); - this->dispatch(cmd); -} - - -void QWorkArea::mouseReleaseEvent(QMouseEvent * e) -{ - if (synthetic_mouse_event_.timeout.running()) - synthetic_mouse_event_.timeout.stop(); - - FuncRequest const cmd(LFUN_MOUSE_RELEASE, e->x(), e->y(), - q_button_state(e->button())); - this->dispatch(cmd); -} - - -void QWorkArea::mouseMoveEvent(QMouseEvent * e) -{ - FuncRequest cmd(LFUN_MOUSE_MOTION, e->x(), e->y(), - q_motion_state(e->state())); - - // If we're above or below the work area... - if (e->y() <= 20 || e->y() >= viewport()->QWidget::height() - 20) { - // Make sure only a synthetic event can cause a page scroll, - // so they come at a steady rate: - if (e->y() <= 20) - // _Force_ a scroll up: - cmd.y = -40; - else - cmd.y = viewport()->QWidget::height(); - // Store the event, to be handled when the timeout expires. - synthetic_mouse_event_.cmd = cmd; - - if (synthetic_mouse_event_.timeout.running()) - // Discard the event. Note that it _may_ be handled - // when the timeout expires if - // synthetic_mouse_event_.cmd has not been overwritten. - // Ie, when the timeout expires, we handle the - // most recent event but discard all others that - // occurred after the one used to start the timeout - // in the first place. - return; - else { - synthetic_mouse_event_.restart_timeout = true; - synthetic_mouse_event_.timeout.start(); - // Fall through to handle this event... - } - - } else if (synthetic_mouse_event_.timeout.running()) { - // Store the event, to be possibly handled when the timeout - // expires. - // Once the timeout has expired, normal control is returned - // to mouseMoveEvent (restart_timeout = false). - // This results in a much smoother 'feel' when moving the - // mouse back into the work area. - synthetic_mouse_event_.cmd = cmd; - synthetic_mouse_event_.restart_timeout = false; - return; - } - - // Has anything changed on-screen since the last QMouseEvent - // was received? - double const scrollbar_value = verticalScrollBar()->value(); - if (e->x() != synthetic_mouse_event_.x_old || - e->y() != synthetic_mouse_event_.y_old || - scrollbar_value != synthetic_mouse_event_.scrollbar_value_old) { - // Yes it has. Store the params used to check this. - synthetic_mouse_event_.x_old = e->x(); - synthetic_mouse_event_.y_old = e->y(); - synthetic_mouse_event_.scrollbar_value_old = scrollbar_value; - - // ... and dispatch the event to the LyX core. - this->dispatch(cmd); - } -} - - -void QWorkArea::wheelEvent(QWheelEvent * e) -{ -// verticalScrollBar()->setValue(verticalScrollBar()->value() - e->delta()); -} - - -void QWorkArea::keyPressEvent(QKeyEvent * e) -{ - lyxerr[Debug::KEY] << BOOST_CURRENT_FUNCTION - << " count=" << e->count() - << " text=" << (const char *) e->text() - << " isAutoRepeat=" << e->isAutoRepeat() - << " key=" << e->key() - << endl; - - //viewport()->grabKeyboard(); -// keyeventQueue_.push(boost::shared_ptr(new QKeyEvent(*e))); - - boost::shared_ptr sym(new QLyXKeySym); - sym->set(e); - this->workAreaKeyPress(sym, q_key_state(e->state())); - -} - -void QWorkArea::generateSyntheticMouseEvent() -{ - // Set things off to generate the _next_ 'pseudo' event. - if (synthetic_mouse_event_.restart_timeout) - synthetic_mouse_event_.timeout.start(); - - // Has anything changed on-screen since the last timeout signal - // was received? - double const scrollbar_value = verticalScrollBar()->value(); - if (scrollbar_value != synthetic_mouse_event_.scrollbar_value_old) { - // Yes it has. Store the params used to check this. - synthetic_mouse_event_.scrollbar_value_old = scrollbar_value; - - // ... and dispatch the event to the LyX core. - this->dispatch(synthetic_mouse_event_.cmd); - } -} - - -void QWorkArea::keyeventTimeout() -{ - bool handle_autos = true; - - while (!keyeventQueue_.empty()) { - boost::shared_ptr ev = keyeventQueue_.front(); - - // We never handle more than one auto repeated - // char in a list of queued up events. - if (!handle_autos && ev->isAutoRepeat()) { - keyeventQueue_.pop(); - continue; - } - - boost::shared_ptr sym(new QLyXKeySym); - sym->set(ev.get()); - - lyxerr[Debug::GUI] << BOOST_CURRENT_FUNCTION - << " count=" << ev->count() - << " text=" << (const char *) ev->text() - << " isAutoRepeat=" << ev->isAutoRepeat() - << " key=" << ev->key() - << endl; - - this->workAreaKeyPress(sym, q_key_state(ev->state())); - keyeventQueue_.pop(); - - handle_autos = false; - } - - // Restart the timer. - step_timer_.start(25, true); -} - - -void QWorkArea::mouseDoubleClickEvent(QMouseEvent * e) -{ - dc_event_ = double_click(e); - - if (!dc_event_.active) - return; - - dc_event_.active = false; - - FuncRequest cmd(LFUN_MOUSE_DOUBLE, - dc_event_.x, dc_event_.y, - q_button_state(dc_event_.state)); - this->dispatch(cmd); -} - - -void QWorkArea::resizeEvent(QResizeEvent * resizeEvent) -{ - pixmap_.reset(new QPixmap(viewport()->width(), viewport()->height())); - - scrolled_with_mouse_=false; - scrolled_with_keyboard_=false; - - this->workAreaResize(); - - lyxerr[Debug::GUI] << BOOST_CURRENT_FUNCTION - << "\n QWidget width\t" << viewport()->width() - << "\n QWidget height\t" << viewport()->height() - << "\n QResizeEvent rect left\t" << rect().left() - << "\n QResizeEvent rect right\t" << rect().right() - << endl; -} - -void QWorkArea::paintEvent(QPaintEvent * e) -{ -/* - lyxerr[Debug::GUI] << BOOST_CURRENT_FUNCTION - << "\n QWidget width\t" << viewport()->width() - << "\n QWidget height\t" << viewport()->height() - << "\n QPaintEvent x\t" << e->rect().x() - << "\n QPaintEvent y\t" << e->rect().x() - << "\n QPaintEvent w\t" << e->rect().width() - << "\n QPaintEvent h\t" << e->rect().height() - << endl; -*/ - QPainter q(viewport()); - q.drawPixmap(e->rect(), *pixmap_.get(), e->rect()); - -// q.drawPixmap(QPoint(r.x(), r.y()), -// *pixmap_.get(), r); -} +#endif // Q_OS_MACX diff --git a/src/frontends/qt4/QWorkArea.h b/src/frontends/qt4/QWorkArea.h index e1575e9006..0e650ec7b8 100644 --- a/src/frontends/qt4/QWorkArea.h +++ b/src/frontends/qt4/QWorkArea.h @@ -94,10 +94,7 @@ public: /** * Qt-specific implementation of the work area * (buffer view GUI) - * - * It consists of a content pane widget, and a scrollbar. - * Hopefully soon we can just use QScrollView ... - */ +*/ class QWorkArea : public QAbstractScrollArea, public WorkArea { Q_OBJECT @@ -108,48 +105,49 @@ public: virtual ~QWorkArea(); /// return the width of the content pane - virtual int workWidth() const { return viewport()->width(); } + virtual int workWidth() const { return workWidth_; } + /// return the height of the content pane - virtual int workHeight() const { return viewport()->height(); } + virtual int workHeight() const { return workHeight_; } /// virtual void setScrollbarParams(int height, int pos, int line_height); /// a selection exists virtual void haveSelection(bool) const; + /// virtual std::string const getClipboard() const; + /// virtual void putClipboard(std::string const &) const; + /// virtual void dragEnterEvent(QDragEnterEvent * event); + /// virtual void dropEvent(QDropEvent* event); /// return the widget's painter - virtual Painter & getPainter(); + virtual Painter & getPainter() { return (Painter &) painter_; } + /// //virtual QPaintDevice & paintDevice() { return content_->pixmap(); } + /// return the backing pixmap QPixmap * pixmap() const { return pixmap_.get(); } /// return the widget's painter -// virtual QLPainter & getQLPainter(); + //virtual QLPainter & getQLPainter() const { return painter_; } /// get the content pane widget - QWidget * getContent() const; - - + QWidget * getContent() const { return viewport(); } protected: - -// void scrollContentsBy(int dx, int dy); /// repaint part of the widget void paintEvent(QPaintEvent * e); - /// widget has been resized void resizeEvent(QResizeEvent * e); - /// mouse button press void mousePressEvent(QMouseEvent * e); /// mouse button release @@ -164,6 +162,7 @@ protected: void keyPressEvent(QKeyEvent * e); #if USE_INPUT_METHODS +protected: /// IM events void QWorkArea::inputMethodEvent(QInputMethodEvent * e) #endif @@ -173,11 +172,13 @@ public slots: void keyeventTimeout(); void adjustViewWithScrollBar(int action); -protected: - - private: + /// + int workWidth_; + /// + int workHeight_; + /// our painter QLPainter painter_;