void Container::drawSelectionRect(QMouseEvent *mev) { //finish drawing unclipped selection rectangle: clear the surface if(m_form->formWidget()) m_form->formWidget()->clearForm(); int topx = (m_insertBegin.x() < mev->x()) ? m_insertBegin.x() : mev->x(); int topy = (m_insertBegin.y() < mev->y()) ? m_insertBegin.y() : mev->y(); int botx = (m_insertBegin.x() > mev->x()) ? m_insertBegin.x() : mev->x(); int boty = (m_insertBegin.y() > mev->y()) ? m_insertBegin.y() : mev->y(); QRect r = QRect(QPoint(topx, topy), QPoint(botx, boty)); setSelectedWidget(m_container, false); QWidget *widgetToSelect = 0; // We check which widgets are in the rect and select them for(ObjectTreeItem *item = m_tree->children()->first(); item; item = m_tree->children()->next()) { QWidget *w = item->widget(); if(!w) continue; if(w->geometry().intersects(r) && w != m_container) { if (widgetToSelect) setSelectedWidget(widgetToSelect, true/*add*/, false/*raise*/, true/*moreWillBeSelected*/); widgetToSelect = w; //select later } } if (widgetToSelect) //the last one left setSelectedWidget(widgetToSelect, true/*add*/, false/*raise*/, false/*!moreWillBeSelected*/); m_insertRect = QRect(); m_state = DoingNothing; m_container->repaint(); }
void UAVObjectBrowserWidget::onTreeItemExpanded(QModelIndex currentProxyIndex) { QModelIndex currentIndex = proxyModel->mapToSource(currentProxyIndex); TreeItem *item = static_cast<TreeItem*>(currentIndex.internalPointer()); TopTreeItem *top = dynamic_cast<TopTreeItem*>(item->parent()); //Check if current tree index is the child of the top tree item if (top) { ObjectTreeItem *objItem = dynamic_cast<ObjectTreeItem*>(item); //If the cast succeeds, then this is a UAVO if (objItem) { UAVObject *obj = objItem->object(); // Check for multiple instance UAVO if(!obj){ objItem = dynamic_cast<ObjectTreeItem*>(item->getChild(0)); obj = objItem->object(); } Q_ASSERT(obj); UAVObject::Metadata mdata = obj->getMetadata(); // Determine fastest update quint16 tmpUpdatePeriod = MAXIMUM_UPDATE_PERIOD; int accessType = UAVObject::GetGcsTelemetryUpdateMode(mdata); if (accessType != UAVObject::UPDATEMODE_MANUAL){ switch(accessType){ case UAVObject::UPDATEMODE_ONCHANGE: tmpUpdatePeriod = 0; break; case UAVObject::UPDATEMODE_PERIODIC: case UAVObject::UPDATEMODE_THROTTLED: tmpUpdatePeriod = std::min(mdata.gcsTelemetryUpdatePeriod, tmpUpdatePeriod); break; } } accessType = UAVObject::GetFlightTelemetryUpdateMode(mdata); if (accessType != UAVObject::UPDATEMODE_MANUAL){ switch(accessType){ case UAVObject::UPDATEMODE_ONCHANGE: tmpUpdatePeriod = 0; break; case UAVObject::UPDATEMODE_PERIODIC: case UAVObject::UPDATEMODE_THROTTLED: tmpUpdatePeriod = std::min(mdata.flightTelemetryUpdatePeriod, tmpUpdatePeriod); break; } } expandedUavoItems.insert(obj->getName(), tmpUpdatePeriod); if (tmpUpdatePeriod < updatePeriod){ updatePeriod = tmpUpdatePeriod; treeView->updateTimerPeriod(updatePeriod); } } } }
void UAVObjectBrowserWidget::requestUpdate() { ObjectTreeItem *objItem = findCurrentObjectTreeItem(); Q_ASSERT(objItem); UAVObject *obj = objItem->object(); Q_ASSERT(obj); obj->requestUpdate(); }
void UAVObjectBrowserWidget::eraseObject() { ObjectTreeItem *objItem = findCurrentObjectTreeItem(); Q_ASSERT(objItem); UAVObject *obj = objItem->object(); Q_ASSERT(obj); updateObjectPersistance(ObjectPersistence::OPERATION_DELETE, obj); }
void UAVObjectBrowserWidget::sendUpdate() { ObjectTreeItem *objItem = findCurrentObjectTreeItem(); Q_ASSERT(objItem); objItem->apply(); UAVObject *obj = objItem->object(); Q_ASSERT(obj); obj->updated(); }
void UAVObjectBrowserWidget::loadObject() { // Load object ObjectTreeItem *objItem = findCurrentObjectTreeItem(); Q_ASSERT(objItem); UAVObject *obj = objItem->object(); Q_ASSERT(obj); updateObjectPersistance(ObjectPersistence::OPERATION_LOAD, obj); // Retrieve object so that latest value is displayed requestUpdate(); }
void UAVObjectBrowserWidget::saveObject() { // Send update so that the latest value is saved sendUpdate(); // Save object ObjectTreeItem *objItem = findCurrentObjectTreeItem(); Q_ASSERT(objItem); UAVObject *obj = objItem->object(); Q_ASSERT(obj); updateObjectPersistance(ObjectPersistence::OPERATION_SAVE, obj); }
void UAVObjectBrowserWidget::currentChanged(const QModelIndex ¤t, const QModelIndex &previous) { TreeItem *item = static_cast<TreeItem*>(current.internalPointer()); bool enable = true; if (current == QModelIndex()) enable = false; TopTreeItem *top = dynamic_cast<TopTreeItem*>(item); ObjectTreeItem *data = dynamic_cast<ObjectTreeItem*>(item); if (top || (data && !data->object())) enable = false; enableSendRequest(enable); }
void Container::createBoxLayout(WidgetList *list) { QBoxLayout *layout = static_cast<QBoxLayout*>(m_layout); for(ObjectTreeItem *tree = m_tree->children()->first(); tree; tree = m_tree->children()->next()) list->append( tree->widget()); list->sort(); for(QWidget *obj = list->first(); obj; obj = list->next()) layout->addWidget(obj); delete list; }
void KexiImagePropertyEdit::selectPixmap() { QString fileName(KoProperty::PixmapEdit::selectPixmapFileName()); if (fileName.isEmpty()) return; KexiBLOBBuffer::Handle h(KexiBLOBBuffer::self()->insertPixmap(KUrl(fileName))); setValue((uint)/*! @todo unsafe*/h.id()); #if 0 //will be reenabled for new image collection if (!m_manager->activeForm() || !property()) return; ObjectTreeItem *item = m_manager->activeForm()->objectTree()->lookup(m_manager->activeForm()->selectedWidget()->name()); QString name = item ? item->pixmapName(property()->name()) : ""; PixmapCollectionChooser dialog(m_manager->activeForm()->pixmapCollection(), name, topLevelWidget()); if (dialog.exec() == QDialog::Accepted) { setValue(dialog.pixmap(), true); item->setPixmapName(property()->name(), dialog.pixmapName()); } #endif }
void UAVObjectBrowserWidget::onTreeItemCollapsed(QModelIndex currentProxyIndex) { QModelIndex currentIndex = proxyModel->mapToSource(currentProxyIndex); TreeItem *item = static_cast<TreeItem*>(currentIndex.internalPointer()); TopTreeItem *top = dynamic_cast<TopTreeItem*>(item->parent()); //Check if current tree index is the child of the top tree item if (top) { ObjectTreeItem *objItem = dynamic_cast<ObjectTreeItem*>(item); //If the cast succeeds, then this is a UAVO if (objItem) { UAVObject *obj = objItem->object(); // Check for multiple instance UAVO if(!obj){ objItem = dynamic_cast<ObjectTreeItem*>(item->getChild(0)); obj = objItem->object(); } Q_ASSERT(obj); //Remove the UAVO, getting its stored value first. quint16 tmpUpdatePeriod = expandedUavoItems.value(obj->getName()); expandedUavoItems.take(obj->getName()); // Check if this was the fastest UAVO if (tmpUpdatePeriod == updatePeriod){ // If so, search for the new fastest UAVO updatePeriod = MAXIMUM_UPDATE_PERIOD; foreach(tmpUpdatePeriod, expandedUavoItems) { if (tmpUpdatePeriod < updatePeriod) updatePeriod = tmpUpdatePeriod; } treeView->updateTimerPeriod(updatePeriod); } } }
void WidgetTreeWidgetItem::initTextAndIcon(int forcedTabPageIndex, const QString& forcedTabPageName) { QString itemName; QString itemClass; QString itemIconName; Qt::ItemFlags itemFlags = flags(); WidgetTreeWidget *widgetTreeWidget = qobject_cast<WidgetTreeWidget*>(treeWidget()); ObjectTreeItem* selectable = widgetTreeWidget ? widgetTreeWidget->selectableItem(d->data) : d->data; if (selectable != d->data) { kDebug() << "****" << (d->loadTreeFlags & LoadTreeForAddedTabPage) << selectable->widget(); if (qobject_cast<QTabWidget*>(selectable->widget())) { // tab widget's page const QTabWidget* tabWidget = qobject_cast<QTabWidget*>(selectable->widget()); int tabIndex = tabWidget->indexOf(d->data->widget()); if (tabIndex == -1 && (d->loadTreeFlags & LoadTreeForAddedTabPage)) { // tab appended if (forcedTabPageIndex >= 0) tabIndex = forcedTabPageIndex; else tabIndex = tabWidget->count(); } kDebug() << tabIndex; if (tabIndex >= 0) { if (forcedTabPageName.isEmpty()) { itemName = tabWidget->tabText(tabIndex); if (itemName.isEmpty()) { itemName = forcedTabPageName; if (itemName.isEmpty()) itemName = i18n("Page %1", tabIndex + 1); } else { itemName.remove('&'); } } else itemName = forcedTabPageName; itemClass = i18nc("Tab widget's page", "Tab Page"); d->customSortingKey = QString("tab%1").arg(tabIndex); kDebug() << "d->customSortingKey" << d->customSortingKey; itemFlags |= Qt::ItemIsSelectable; itemFlags ^= Qt::ItemIsSelectable; itemIconName = koIconName("tabwidget_tab"); } } } // defaults: if (itemName.isEmpty()) { itemName = d->data->name(); } if (itemClass.isEmpty()) { itemClass = d->data->className(); } if (itemIconName.isEmpty()) { if (widgetTreeWidget) { itemIconName = widgetTreeWidget->iconNameForClass(d->data->widget()->metaObject()->className()); } } // set: if (itemFlags != flags()) { setFlags(itemFlags); } setText(0, itemName); setText(1, itemClass); if (!itemIconName.isEmpty()) { QPixmap icon(SmallIcon(itemIconName)); if (!(itemFlags & Qt::ItemIsSelectable)) { KIconEffect::semiTransparent(icon); } setIcon(0, icon); } if (!(itemFlags & Qt::ItemIsSelectable)) { setForeground(0, treeWidget()->palette().color(QPalette::Disabled, QPalette::Text)); setForeground(1, treeWidget()->palette().color(QPalette::Disabled, QPalette::Text)); } }
void Container::createGridLayout(bool testOnly) { //Those lists sort widgets by y and x VerWidgetList *vlist = new VerWidgetList(m_form->toplevelContainer()->widget()); HorWidgetList *hlist = new HorWidgetList(m_form->toplevelContainer()->widget()); // The vector are used to store the x (or y) beginning of each column (or row) QValueVector<int> cols; QValueVector<int> rows; int end=-1000; bool same = false; for(ObjectTreeItem *tree = m_tree->children()->first(); tree; tree = m_tree->children()->next()) vlist->append( tree->widget()); vlist->sort(); for(ObjectTreeItem *tree = m_tree->children()->first(); tree; tree = m_tree->children()->next()) hlist->append( tree->widget()); hlist->sort(); // First we need to make sure that two widgets won't be in the same row, // ie that no widget overlap another one if(!testOnly) { for(WidgetListIterator it(*vlist); it.current() != 0; ++it) { QWidget *w = it.current(); WidgetListIterator it2 = it; for(; it2.current() != 0; ++it2) { QWidget *nextw = it2.current(); if((w->y() >= nextw->y()) || (nextw->y() >= w->geometry().bottom())) break; if(!w->geometry().intersects(nextw->geometry())) break; // If the geometries of the two widgets intersect each other, // we move one of the widget to the rght or bottom of the other if((nextw->y() - w->y()) > abs(nextw->x() - w->x())) nextw->move(nextw->x(), w->geometry().bottom()+1); else if(nextw->x() >= w->x()) nextw->move(w->geometry().right()+1, nextw->y()); else w->move(nextw->geometry().right()+1, nextw->y()); } } } // Then we count the number of rows in the layout, and set their beginnings for(WidgetListIterator it(*vlist); it.current() != 0; ++it) { QWidget *w = it.current(); WidgetListIterator it2 = it; if(!same) { // this widget will make a new row end = w->geometry().bottom(); rows.append(w->y()); } // If same == true, it means we are in the same row as prev widget // (so no need to create a new column) ++it2; if(!it2.current()) break; QWidget *nextw = it2.current(); if(nextw->y() >= end) same = false; else { same = !(same && (nextw->y() >= w->geometry().bottom())); if(!same) end = w->geometry().bottom(); } } kdDebug() << "the new grid will have n rows: n == " << rows.size() << endl; end = -10000; same = false; // We do the same thing for the columns for(WidgetListIterator it(*hlist); it.current() != 0; ++it) { QWidget *w = it.current(); WidgetListIterator it2 = it; if(!same) { end = w->geometry().right(); cols.append(w->x()); } ++it2; if(!it2.current()) break; QWidget *nextw = it2.current(); if(nextw->x() >= end) same = false; else { same = !(same && (nextw->x() >= w->geometry().right())); if(!same) end = w->geometry().right(); } } kdDebug() << "the new grid will have n columns: n == " << cols.size() << endl; // We create the layout .. QGridLayout *layout=0; if(!testOnly) { layout = new QGridLayout(m_container, rows.size(), cols.size(), m_margin, m_spacing, "grid"); m_layout = (QLayout*)layout; } // .. and we fill it with widgets for(WidgetListIterator it(*vlist); it.current() != 0; ++it) { QWidget *w = it.current(); QRect r = w->geometry(); uint wcol=0, wrow=0, endrow=0, endcol=0; uint i = 0; // We look for widget row(s) .. while(r.y() >= rows[i]) { if(rows.size() <= i+1) // we are the last row { wrow = i; break; } if(r.y() < rows[i+1]) { wrow = i; // the widget will be in this row uint j = i + 1; // Then we check if the widget needs to span multiple rows while(rows.size() >= j+1 && r.bottom() > rows[j]) { endrow = j; j++; } break; } i++; } //kdDebug() << "the widget " << w->name() << " wil be in the row " << wrow << //" and will go to the row " << endrow << endl; // .. and column(s) i = 0; while(r.x() >= cols[i]) { if(cols.size() <= i+1) // last column { wcol = i; break; } if(r.x() < cols[i+1]) { wcol = i; uint j = i + 1; // Then we check if the widget needs to span multiple columns while(cols.size() >= j+1 && r.right() > cols[j]) { endcol = j; j++; } break; } i++; } //kdDebug() << "the widget " << w->name() << " wil be in the col " << wcol << // " and will go to the col " << endcol << endl; ObjectTreeItem *item = m_form->objectTree()->lookup(w->name()); if(!endrow && !endcol) { if(!testOnly) layout->addWidget(w, wrow, wcol); item->setGridPos(wrow, wcol, 0, 0); } else { if(!endcol) endcol = wcol; if(!endrow) endrow = wrow; if(!testOnly) layout->addMultiCellWidget(w, wrow, endrow, wcol, endcol); item->setGridPos(wrow, wcol, endrow-wrow+1, endcol-wcol+1); } } }
void Container::createFlowLayout() { KexiFlowLayout *flow = dynamic_cast<KexiFlowLayout*>(m_layout); if(!flow || m_tree->children()->isEmpty()) return; const int offset = 15; WidgetList *list=0, *list2=0; if(flow->orientation() == Horizontal) { list = new VerWidgetList(m_form->toplevelContainer()->widget()); list2 = new HorWidgetList(m_form->toplevelContainer()->widget()); } else { list = new HorWidgetList(m_form->toplevelContainer()->widget()); list2 = new VerWidgetList(m_form->toplevelContainer()->widget()); } // fill the list for(ObjectTreeItem *tree = m_tree->children()->first(); tree; tree = m_tree->children()->next()) list->append( tree->widget()); list->sort(); if(flow->orientation() == Horizontal) { int y = list->first()->y(); for(QWidget *w = list->first(); w; w = list->next()) { if( (w->y() > y +offset)) { // start a new line list2->sort(); for(QWidget *obj = list2->first(); obj; obj = list2->next()) flow->add(obj); list2->clear(); y = w->y(); } list2->append(w); } list2->sort(); // don't forget the last line for(QWidget *obj = list2->first(); obj; obj = list2->next()) flow->add(obj); } else { int x = list->first()->x(); for(QWidget *w = list->first(); w; w = list->next()) { if( (w->x() > x +offset)) { // start a new column list2->sort(); for(QWidget *obj = list2->first(); obj; obj = list2->next()) flow->add(obj); list2->clear(); x = w->x(); } list2->append(w); } list2->sort(); // don't forget the last column for(QWidget *obj = list2->first(); obj; obj = list2->next()) flow->add(obj); } delete list; delete list2; }
bool Container::eventFilter(QObject *s, QEvent *e) { // kdDebug() << e->type() << endl; switch(e->type()) { case QEvent::MouseButtonPress: { m_insertBegin = QPoint(-1, -1); m_mousePressEventReceived = true; kdDebug() << "QEvent::MouseButtonPress sender object = " << s->name() << "of type " << s->className() << endl; kdDebug() << "QEvent::MouseButtonPress this = " << name() << endl; m_moving = static_cast<QWidget*>(s); QMouseEvent *mev = static_cast<QMouseEvent*>(e); m_grab = QPoint(mev->x(), mev->y()); // we are drawing a connection if(FormManager::self()->isCreatingConnection()) { drawConnection(mev); return true; } if(((mev->state() == ControlButton) || (mev->state() == ShiftButton)) && (!FormManager::self()->isInserting())) // multiple selection mode { if(m_form->selectedWidgets()->findRef(m_moving) != -1) // widget is already selected { if(m_form->selectedWidgets()->count() > 1) // we remove it from selection unSelectWidget(m_moving); else // the widget is the only selected, so it means we want to copy it { //m_copyRect = m_moving->geometry(); m_state = CopyingWidget; if(m_form->formWidget()) m_form->formWidget()->initBuffer(); } } else // the widget is not yet selected, we add it setSelectedWidget(m_moving, true, (mev->button() == RightButton)); } else if((m_form->selectedWidgets()->count() > 1))//&& (!m_form->manager()->isInserting())) // more than one widget selected { if(m_form->selectedWidgets()->findRef(m_moving) == -1) // widget is not selected, it becomes the only selected widget setSelectedWidget(m_moving, false, (mev->button() == RightButton)); // If the widget is already selected, we do nothing (to ease widget moving, etc.) } else// if(!m_form->manager()->isInserting()) setSelectedWidget(m_moving, false, (mev->button() == RightButton)); // we are inserting a widget or drawing a selection rect in the form if((/*s == m_container &&*/ FormManager::self()->isInserting()) || ((s == m_container) && !m_toplevel)) { int tmpx,tmpy; if(!FormManager::self()->snapWidgetsToGrid() || (mev->state() == (LeftButton|ControlButton|AltButton))) { tmpx = mev->x(); tmpy = mev->y(); } else { int gridX = m_form->gridSize(); int gridY = m_form->gridSize(); tmpx = int( (float)mev->x() / ((float)gridX) + 0.5 ); // snap to grid tmpx *= gridX; tmpy = int( (float)mev->y() / ((float)gridY) + 0.5 ); tmpy *= gridX; } m_insertBegin = (static_cast<QWidget*>(s))->mapTo(m_container, QPoint(tmpx, tmpy)); if(m_form->formWidget()) m_form->formWidget()->initBuffer(); if(!FormManager::self()->isInserting()) m_state = DrawingSelectionRect; } else { if(s->inherits("QTabWidget")) // to allow changing page by clicking tab return false; } if (m_objectForMouseReleaseEvent) { const bool res = handleMouseReleaseEvent(m_objectForMouseReleaseEvent, &m_mouseReleaseEvent); m_objectForMouseReleaseEvent = 0; return res; } return true; } case QEvent::MouseButtonRelease: { QMouseEvent *mev = static_cast<QMouseEvent*>(e); if (!m_mousePressEventReceived) { m_mouseReleaseEvent = *mev; m_objectForMouseReleaseEvent = s; return true; } m_mousePressEventReceived = false; m_objectForMouseReleaseEvent = 0; return handleMouseReleaseEvent(s, mev); } case QEvent::MouseMove: { QMouseEvent *mev = static_cast<QMouseEvent*>(e); if(m_insertBegin!=QPoint(-1,-1) && FormManager::self()->isInserting() && ((mev->state() == LeftButton) || (mev->state() == (LeftButton|ControlButton)) || (mev->state() == (LeftButton|ControlButton|AltButton)) || (mev->state() == (LeftButton|ShiftButton)) ) ) // draw the insert rect { drawInsertRect(mev, s); return true; } // Creating a connection, we highlight sender and receiver, and we draw a link between them else if(FormManager::self()->isCreatingConnection() && !FormManager::self()->createdConnection()->sender().isNull()) { ObjectTreeItem *tree = m_form->objectTree()->lookup(FormManager::self()->createdConnection()->sender()); if(!tree || !tree->widget()) return true; if(m_form->formWidget() && (tree->widget() != s)) m_form->formWidget()->highlightWidgets(tree->widget(), static_cast<QWidget*>(s)); } else if(m_insertBegin!=QPoint(-1,-1) && s == m_container && !m_toplevel && (mev->state() != ControlButton) && !FormManager::self()->isCreatingConnection()) // draw the selection rect { if((mev->state() != LeftButton) || /*m_inlineEditing*/ m_state == InlineEditing) return true; int topx = (m_insertBegin.x() < mev->x()) ? m_insertBegin.x() : mev->x(); int topy = (m_insertBegin.y() < mev->y()) ? m_insertBegin.y() : mev->y(); int botx = (m_insertBegin.x() > mev->x()) ? m_insertBegin.x() : mev->x(); int boty = (m_insertBegin.y() > mev->y()) ? m_insertBegin.y() : mev->y(); QRect r = QRect(QPoint(topx, topy), QPoint(botx, boty)); m_insertRect = r; if(m_form->formWidget()) m_form->formWidget()->drawRect(r, 1); m_state = DoingNothing; return true; } else if(mev->state() == (LeftButton|ControlButton)) // draw the insert rect for the copied widget { if(s == m_container)// || (m_form->selectedWidgets()->count() > 1)) return true; drawCopiedWidgetRect(mev); return true; } else if( ( (mev->state() == Qt::LeftButton) || (mev->state() == (LeftButton|ControlButton|AltButton)) ) && !FormManager::self()->isInserting() && (m_state != CopyingWidget)) // we are dragging the widget(s) to move it { if(!m_toplevel && m_moving == m_container) // no effect for form return false; if((!m_moving) || (!m_moving->parentWidget()))// || (m_moving->parentWidget()->inherits("QWidgetStack"))) return true; moveSelectedWidgetsBy(mev->x() - m_grab.x(), mev->y() - m_grab.y()); m_state = MovingWidget; } return true; // eat } case QEvent::Paint: // Draw the dotted background { if(s != m_container) return false; int gridX = m_form->gridSize(); int gridY = m_form->gridSize(); QPainter p(m_container); p.setPen(QPen(white, 2)); p.setRasterOp(XorROP); int cols = m_container->width() / gridX; int rows = m_container->height() / gridY; for(int rowcursor = 1; rowcursor <= rows; ++rowcursor) { for(int colcursor = 1; colcursor <= cols; ++colcursor) { p.drawPoint(-1 + colcursor *gridX, -1 + rowcursor *gridY); } } return false; } case QEvent::Resize: // we are resizing a widget, so we set m_move to true -> the layout will be reloaded when releasing mouse { if(m_form->interactiveMode()) m_state = MovingWidget; break; } //case QEvent::AccelOverride: case QEvent::KeyPress: { QKeyEvent *kev = static_cast<QKeyEvent*>(e); if(kev->key() == Key_F2) // pressing F2 == double-clicking { m_state = InlineEditing; QWidget *w; // try to find the widget which was clicked last and should be edited if(m_form->selectedWidgets()->count() == 1) w = m_form->selectedWidgets()->first(); else if(m_form->selectedWidgets()->findRef(m_moving) != -1) w = m_moving; else w = m_form->selectedWidgets()->last(); m_form->library()->startEditing(w->className(), w, this); } else if(kev->key() == Key_Escape) { if(FormManager::self()->isCreatingConnection()) FormManager::self()->stopCreatingConnection(); else if(FormManager::self()->isInserting()) FormManager::self()->stopInsert(); return true; } else if((kev->key() == Key_Control) && (m_state == MovingWidget)) { if(!m_moving) return true; // we simulate a mouse move event to update screen QMouseEvent *mev = new QMouseEvent(QEvent::MouseMove, m_moving->mapFromGlobal(QCursor::pos()), NoButton, LeftButton|ControlButton ); eventFilter(m_moving, mev); delete mev; } else if(kev->key() == FormManager::self()->contextMenuKey()) { FormManager::self()->createContextMenu(static_cast<QWidget*>(s), this, false); return true; } else if (kev->key() == Key_Delete) { FormManager::self()->deleteWidget(); return true; } // directional buttons move the widget else if(kev->key() == Key_Left){ // move the widget of gridX to the left moveSelectedWidgetsBy(-form()->gridSize(), 0); return true; } else if(kev->key() == Key_Right){ // move the widget of gridX to the right moveSelectedWidgetsBy(form()->gridSize(), 0); return true; } else if(kev->key() == Key_Up){ // move the widget of gridY to the top moveSelectedWidgetsBy(0, - form()->gridSize()); return true; } else if(kev->key() == Key_Down){ // move the widget of gridX to the bottom moveSelectedWidgetsBy(0, form()->gridSize()); return true; } else if((kev->key() == Key_Tab) || (kev->key() == Key_BackTab)){ ObjectTreeItem *item = form()->objectTree()->lookup(form()->selectedWidgets()->first()->name()); if(!item || !item->parent()) return true; ObjectTreeList *list = item->parent()->children(); if(list->count() == 1) return true; int index = list->findRef(item); if(kev->key() == Key_BackTab){ if(index == 0) // go back to the last item index = list->count() - 1; else index = index - 1; } else { if(index == int(list->count() - 1)) // go back to the first item index = 0; else index = index + 1; } ObjectTreeItem *nextItem = list->at(index); if(nextItem && nextItem->widget()) form()->setSelectedWidget(nextItem->widget(), false); } return true; } case QEvent::KeyRelease: { QKeyEvent *kev = static_cast<QKeyEvent*>(e); if((kev->key() == Key_Control) && (m_state == CopyingWidget)) { // cancel copying //m_copyRect = QRect(); if(m_form->formWidget()) m_form->formWidget()->clearForm(); } return true; } case QEvent::MouseButtonDblClick: // editing { kdDebug() << "Container: Mouse dbl click for widget " << s->name() << endl; QWidget *w = static_cast<QWidget*>(s); if(!w) return false; //m_inlineEditing = true; m_state = InlineEditing; m_form->library()->startEditing(w->className(), w, this); return true; } case QEvent::ContextMenu: case QEvent::Enter: case QEvent::Leave: case QEvent::FocusIn: case QEvent::FocusOut: // case QEvent::DragEnter: // case QEvent::DragMove: // case QEvent::DragLeave: return true; // eat them default: return false; // let the widget do the rest ... } return false; }