--- a/src/hbcore/gui/hbcssinspector_p.cpp Thu Sep 02 20:44:51 2010 +0300
+++ b/src/hbcore/gui/hbcssinspector_p.cpp Fri Sep 17 08:32:10 2010 +0300
@@ -33,12 +33,15 @@
#include <hbevent.h>
#include <hbframedrawer.h>
#include <hbframeitem.h>
+#include <hbgraphicsscene_p.h>
#include <hbiconitem.h>
#include <hbinstance.h>
#include <hblayeredstyleloader_p.h>
#include <hbmainwindow_p.h>
#include <hbmarqueeitem.h>
#include <hbnamespace_p.h>
+#include <hbpopupmanager_p.h>
+#include <hbpopupmanager_p_p.h>
#include <hbscreen_p.h>
#include <hbtextitem.h>
#include <hbwidgetloadersyntax_p.h>
@@ -104,6 +107,7 @@
const qreal SIZE_PREF_LINE_WIDTH = 1.0;
const qreal SIZE_PREF_ALLOWED_OVERLAP = 2.0;
const qreal SIZE_PREF_BOX_SIZE = 0.4 * SIZE_PREF_DRAW_SIZE;
+const QString ROOT_TREE_ELEMENT("HbScreen");
static QString itemClass(const QGraphicsItem *item)
{
@@ -781,9 +785,45 @@
}
+/******************************************************************************************/
+ModelItemWrapper::ModelItemWrapper(QGraphicsItem *item)
+ : mGraphicsItem(item), mWindow(0), mPopupMgr(0)
+{
+}
+
+ModelItemWrapper::ModelItemWrapper(HbMainWindow *win)
+ : mGraphicsItem(0), mWindow(win), mPopupMgr(0)
+{
+}
+
+ModelItemWrapper::ModelItemWrapper(HbPopupManager *mgr)
+ : mGraphicsItem(0), mWindow(0), mPopupMgr(mgr)
+{
+}
+
+ModelItemWrapper::ModelItemWrapper()
+ : mGraphicsItem(0), mWindow(0), mPopupMgr(0)
+{
+}
+
+QGraphicsItem* ModelItemWrapper::graphicsItem() const
+{
+ return mGraphicsItem;
+}
+
+HbMainWindow* ModelItemWrapper::window() const
+{
+ return mWindow;
+}
+
+HbPopupManager* ModelItemWrapper::popupManager() const
+{
+ return mPopupMgr;
+}
+
/******************************************************************************************/
-CssInspectorModelItem::CssInspectorModelItem(QGraphicsItem *item, int row, CssInspectorModelItem *parent)
+CssInspectorModelItem::CssInspectorModelItem(ModelItemWrapper *item, int row, CssInspectorModelItem *parent)
: mItem(item), mParent(parent), mRow(row)
{
}
@@ -793,6 +833,7 @@
QHash<int, CssInspectorModelItem*>::iterator it;
for (it = mChildren.begin(); it!= mChildren.end(); ++it)
delete it.value();
+ delete mItem;
}
CssInspectorModelItem* CssInspectorModelItem::child(int i)
@@ -800,12 +841,41 @@
if (mChildren.contains(i))
return mChildren[i];
- if (i>=0 && i < mItem->childItems().count()) {
- QGraphicsItem *child = mItem->childItems().at(i);
- CssInspectorModelItem *childItem = new CssInspectorModelItem(child, i, this);
+ if (i < 0)
+ return 0;
+
+ ModelItemWrapper *wrapper = 0;
+ if (mItem->graphicsItem() && i < mItem->graphicsItem()->childItems().count()) {
+ QGraphicsItem *child = mItem->graphicsItem()->childItems().at(i);
+ wrapper = new ModelItemWrapper(child);
+ } else if (mItem->popupManager() && i < mItem->popupManager()->d->popupList.count()) {
+ HbPopup *popup = mItem->popupManager()->d->popupList.at(i);
+ wrapper = new ModelItemWrapper(popup);
+ } else if (mItem->window()) {
+ HbMainWindowPrivate *winPriv = HbMainWindowPrivate::d_ptr(mItem->window());
+ QGraphicsItem *screen = winPriv->element(HbMainWindowPrivate::ViewportItem);
+ if (i < screen->childItems().count()) {
+ wrapper = new ModelItemWrapper(screen->childItems().at(i));
+ } else if (i == screen->childItems().count()) {
+ // Out of bounds due to zero index, return popup manager (this is a special case)
+ HbGraphicsScenePrivate *scenePriv = HbGraphicsScenePrivate::d_ptr(winPriv->mScene);
+ HbPopupManager *mgr = scenePriv->popupManager();
+ wrapper = new ModelItemWrapper(mgr);
+ }
+ } else {
+ // Root node, return from all main windows
+ if (i < hbInstance->allMainWindows().count()) {
+ HbMainWindow *win = hbInstance->allMainWindows().at(i);
+ wrapper = new ModelItemWrapper(win);
+ }
+ }
+
+ if (wrapper) {
+ CssInspectorModelItem *childItem = new CssInspectorModelItem(wrapper, i, this);
mChildren[i] = childItem;
return childItem;
}
+
return 0;
}
@@ -814,7 +884,7 @@
return mParent;
}
-QGraphicsItem* CssInspectorModelItem::data()
+ModelItemWrapper* CssInspectorModelItem::data()
{
return mItem;
}
@@ -825,11 +895,10 @@
}
/******************************************************************************************/
-CssInspectorModel::CssInspectorModel(HbMainWindow *win, QObject *parent)
- : QAbstractItemModel(parent), mWin(win), mRootItem(0)
+CssInspectorModel::CssInspectorModel(QObject *parent)
+ : QAbstractItemModel(parent), mRootItem(0)
{
- QGraphicsItem *screen = HbMainWindowPrivate::d_ptr(win)->mClippingItem;
- mRootItem = new CssInspectorModelItem(screen, 0);
+ mRootItem = new CssInspectorModelItem(new ModelItemWrapper, 0);
}
CssInspectorModel::~CssInspectorModel()
@@ -843,14 +912,26 @@
return QVariant();
CssInspectorModelItem *item = static_cast<CssInspectorModelItem*>(index.internalPointer());
- QGraphicsItem *graphicsItem = item->data();
+ QGraphicsItem *graphicsItem = item->data()->graphicsItem();
- switch (index.column()) {
- case 0: return itemClass(graphicsItem);
- case 1: return objName(graphicsItem);
- case 2: return HbStyle::itemName(graphicsItem);
- case 3: return itemValue(graphicsItem);
- case 4: return itemInParentLayout(graphicsItem);
+ if (graphicsItem) {
+ switch (index.column()) {
+ case 0: return itemClass(graphicsItem);
+ case 1: return objName(graphicsItem);
+ case 2: return HbStyle::itemName(graphicsItem);
+ case 3: return itemValue(graphicsItem);
+ case 4: return itemInParentLayout(graphicsItem);
+ default: return QVariant();
+ }
+ } else {
+ if (index.column() == 0) {
+ // Return correct item name
+ if (item->data()->popupManager()) {
+ return "HbPopupManager";
+ } else if (item->data()->window()) {
+ return "HbScreen";
+ }
+ }
}
return QVariant();
}
@@ -913,7 +994,18 @@
else
parentItem = static_cast<CssInspectorModelItem*>(parent.internalPointer());
- return parentItem->data()->childItems().count();
+ ModelItemWrapper *wrapper = parentItem->data();
+ if (wrapper->graphicsItem()) {
+ return wrapper->graphicsItem()->childItems().count();
+ } else if (wrapper->popupManager()) {
+ return wrapper->popupManager()->d->popupList.count();
+ } else if (wrapper->window()) {
+ HbMainWindowPrivate *winPriv = HbMainWindowPrivate::d_ptr(wrapper->window());
+ QGraphicsItem *screen = winPriv->element(HbMainWindowPrivate::ViewportItem);
+ return screen->childItems().count() + 1; // Special case to add PopupManager
+ } else {
+ return hbInstance->allMainWindows().count();
+ }
}
int CssInspectorModel::columnCount(const QModelIndex &parent) const
@@ -941,7 +1033,7 @@
if (index.column() == ITEMNAME_COLUMN) {
if (index.data().toString() == "") {
CssInspectorModelItem *modelItem = static_cast<CssInspectorModelItem*>(index.internalPointer());
- QGraphicsItem *item = modelItem->data();
+ QGraphicsItem *item = modelItem->data()->graphicsItem();
if (parentHasAnchorLayout(item)) {
painter->fillRect(option.rect, Qt::red);
}
@@ -955,15 +1047,20 @@
}
/******************************************************************************************/
+static QPointer<HbCssInspectorWindow> cssWindow = 0;
+
HbCssInspectorWindow *HbCssInspectorWindow::instance()
{
- static QPointer<HbCssInspectorWindow> window = 0;
- if (!window) {
- window = new HbCssInspectorWindow;
+ if (!cssWindow) {
+ cssWindow = new HbCssInspectorWindow;
}
- return window;
+ return cssWindow;
}
+bool HbCssInspectorWindow::exists()
+{
+ return !cssWindow.isNull();
+}
void HbCssInspectorWindow::refresh()
{
@@ -984,7 +1081,7 @@
void HbCssInspectorWindow::updateFromTreeView(const QModelIndex &index)
{
CssInspectorModelItem *modelItem = static_cast<CssInspectorModelItem*>(index.internalPointer());
- QGraphicsItem *item = modelItem->data();
+ QGraphicsItem *item = modelItem->data()->graphicsItem();
updateFocusItem(item);
foreach (HoveredWidgetFilter *filter, mInstalledFilters) {
filter->mCssInfoDrawer->updateFocusItem(item);
@@ -1000,9 +1097,9 @@
void HbCssInspectorWindow::addFilters()
{
- foreach (HbMainWindow *window, hbInstance->allMainWindows()) {
- mTreeView->setModel(new CssInspectorModel(window));
+ mTreeView->setModel(new CssInspectorModel);
+ foreach (const HbMainWindow *window, hbInstance->allMainWindows()) {
HoveredWidgetFilter *filter = new HoveredWidgetFilter(window->scene());
window->scene()->installEventFilter(filter);
mInstalledFilters.append(filter);
@@ -1127,6 +1224,7 @@
treeContainer->setLayout(treeLayout);
mTreeView = new QTreeView(this);
mTreeView->setItemDelegate(new ItemColorDelegate);
+ mTreeView->setAttribute(Qt::WA_InputMethodEnabled, false);
QLabel *treeLabel = new QLabel(tr("Item tree"));
treeLayout->addWidget(treeLabel);
treeLayout->addWidget(mTreeView);
@@ -1252,38 +1350,63 @@
ancestorItems << ancestor;
ancestor = ancestor->parentItem();
}
- bool foundRoot = false;
- QModelIndex index;
- for (int i=ancestorItems.count() -1; i>=0; i--) {
- const QGraphicsItem *thisItem = ancestorItems.at(i);
- if (!foundRoot) {
- const QGraphicsWidget *wid = static_cast<const QGraphicsWidget*>(thisItem);
- if (wid) {
- QString name = wid->metaObject()->className();
- if (name == "HbScreen") {
- foundRoot = true;
- }
+
+ CssInspectorModel *model = static_cast<CssInspectorModel*>(mTreeView->model());
+ // Find root element
+ int rootItemIndex = 0; // This is used later (outside for loop)
+ bool rootIsInScreen = false;
+
+ // Iterating forwards in a reverse containment-order list
+ for (; rootItemIndex < ancestorItems.count(); ++rootItemIndex) {
+ const QGraphicsItem *thisItem = ancestorItems.at(rootItemIndex);
+ const QGraphicsWidget *widget = static_cast<const QGraphicsWidget*>(thisItem);
+ if (widget) {
+ if (widget->metaObject()->className() == ROOT_TREE_ELEMENT) {
+ rootIsInScreen = true;
+ break;
}
- } else {
- // Find and open tree node for item
- CssInspectorModel *model = static_cast<CssInspectorModel*>(mTreeView->model());
- if (model) {
- int rowCount = model->rowCount(index);
- for (int row=0; row<rowCount; row++) {
- QModelIndex idx = model->index(row, 0, index);
- CssInspectorModelItem *modelItem = static_cast<CssInspectorModelItem*>(idx.internalPointer());
- QGraphicsItem *graphicsItem = modelItem->data();
- if (graphicsItem == thisItem) {
- index = idx;
- break;
- }
+ }
+ }
+ // Get the correct window
+ QModelIndex parentIndex;
+ bool foundWindow = false;
+ int winCount = model->rowCount(QModelIndex());
+ const HbWidget *hbWidget = static_cast<const HbWidget*>(item);
+ if (hbWidget) {
+ for (int idx=0; idx<winCount; idx++) {
+ parentIndex = model->index(idx, 0, QModelIndex());
+ CssInspectorModelItem *modelItem = static_cast<CssInspectorModelItem*>(parentIndex.internalPointer());
+ if (modelItem->data()->window() == hbWidget->mainWindow()) {
+ foundWindow = true;
+ break;
+ }
+ }
+ }
+
+ if (foundWindow) {
+ if (!rootIsInScreen) {
+ // Need to set parentIndex to popupmgr
+ parentIndex = model->index(model->rowCount(parentIndex)-1, 0, parentIndex);
+ rootItemIndex--;
+ }
+ // Now descend containment heirarchy getting index
+ for (int itemIdx=rootItemIndex; itemIdx>=0; itemIdx--) {
+ const QGraphicsItem *thisItem = ancestorItems.at(itemIdx);
+ int rowCount = model->rowCount(parentIndex);
+ for (int row=0; row<rowCount; row++) {
+ QModelIndex thisIndex = model->index(row, 0, parentIndex);
+ CssInspectorModelItem *modelItem = static_cast<CssInspectorModelItem*>(thisIndex.internalPointer());
+ QGraphicsItem *gItem = modelItem->data()->graphicsItem();
+ if (gItem == thisItem) {
+ parentIndex = thisIndex;
+ break;
}
}
}
}
mTreeView->collapseAll();
- mTreeView->scrollTo(index, QAbstractItemView::EnsureVisible);
- mTreeView->expand(index);
+ mTreeView->scrollTo(parentIndex, QAbstractItemView::EnsureVisible);
+ mTreeView->expand(parentIndex);
} else {
mWidgetMLBox->setText("");
@@ -1293,6 +1416,7 @@
mSizeHintLabel->setText("");
mSizePolicyHoriz->setText("");
mSizePolicyVert->setText("");
+ mTreeView->collapseAll();
}
}