From b9daa01a7dab10bf81410e171efe31bdd57da43b Mon Sep 17 00:00:00 2001 From: Timothy Pearson Date: Thu, 13 Sep 2012 19:35:58 -0500 Subject: [PATCH] Add widget cache and fix checkboxes and pushbuttons --- lib/tdeqt4converter.cpp | 2 +- lib/tdeqt4converter.h | 1 + plugin/simplestyle.cpp | 416 ++++++++++++++++++++++++++-------------- plugin/simplestyle.h | 31 +-- 4 files changed, 296 insertions(+), 154 deletions(-) diff --git a/lib/tdeqt4converter.cpp b/lib/tdeqt4converter.cpp index e65dca2..3c5675d 100644 --- a/lib/tdeqt4converter.cpp +++ b/lib/tdeqt4converter.cpp @@ -666,7 +666,7 @@ TQStyle::SFlags convertQt4ToTQt3SFlags(QStyle::State qt4stateflags, TQt3WidgetTy // sflags = sflags | TQStyle::; // } if (qt4stateflags & QStyle::State_Sunken) { - if ((wt == TQT3WT_TQPopupMenu) || (wt == TQT3WT_TQMenuBar) || (wt == TQT3WT_TQToolButton)) { + if ((wt == TQT3WT_TQPopupMenu) || (wt == TQT3WT_TQMenuBar) || (wt == TQT3WT_TQToolButton) || (wt == TQT3WT_TQRadioButton) || (wt == TQT3WT_TQCheckBox) || (wt == TQT3WT_TQPushButton)) { sflags = sflags | TQStyle::Style_Down; } sflags = sflags | TQStyle::Style_Sunken; diff --git a/lib/tdeqt4converter.h b/lib/tdeqt4converter.h index bea9035..13739e9 100644 --- a/lib/tdeqt4converter.h +++ b/lib/tdeqt4converter.h @@ -52,6 +52,7 @@ enum TQt3WidgetType { TQT3WT_TQTabBar, TQT3WT_TQRadioButton, TQT3WT_TQCheckBox, + TQT3WT_TQPushButton, TQT3WT_TQPopupMenu, TQT3WT_TQComboBox, TQT3WT_TQSlider, diff --git a/plugin/simplestyle.cpp b/plugin/simplestyle.cpp index 18cf536..6161d26 100644 --- a/plugin/simplestyle.cpp +++ b/plugin/simplestyle.cpp @@ -26,6 +26,7 @@ #include #include #include +#include #include #include #include @@ -135,9 +136,6 @@ static QString TDEFileDialogSelectDirectory(QWidget *parent, const QString &capt Qt4TDEStyle::Qt4TDEStyle() { - m_previousQt4InterfaceWidget = 0; - m_previousTQt3InterfaceWidget = 0; - enable_debug_warnings = (getenv("DEBUG_TDEQT4_THEME_ENGINE") != NULL); #ifdef INTEGRATE_WITH_TDE @@ -230,21 +228,7 @@ Qt4TDEStyle::Qt4TDEStyle() m_tqt3parent_widget = new TQWidget(); m_tqt3generic_widget = new TQWidget(m_tqt3parent_widget); - m_tqt3progressbar_widget = new TQProgressBar(m_tqt3parent_widget); - m_tqt3tabbar_widget = new TQTabBar(m_tqt3parent_widget); - m_tqt3radiobutton_widget = new TQRadioButton(m_tqt3parent_widget); - m_tqt3checkbox_widget = new TQCheckBox(m_tqt3parent_widget); - m_tqt3popupmenu_widget = new TQPopupMenu(m_tqt3parent_widget); - m_tqt3combobox_widget = new TQComboBox(m_tqt3parent_widget); - m_tqt3slider_widget = new TQSlider(m_tqt3parent_widget); - m_tqt3scrollbar_widget = new TQScrollBar(m_tqt3parent_widget); - m_tqt3spinbox_widget = new TQSpinBox(m_tqt3parent_widget); - m_tqt3spinwidget_widget = new TQSpinWidget(m_tqt3parent_widget); m_tqt3window_widget = new TQWidget(m_tqt3parent_widget); - m_tqt3titlebar_widget = new TQTitleBar(m_tqt3window_widget, m_tqt3parent_widget); - m_tqt3menubar_widget = new TQMenuBar(m_tqt3parent_widget); - m_tqt3toolbox_widget = new TQToolBox(m_tqt3parent_widget); - m_tqt3toolbutton_widget = new TQToolButton(m_tqt3parent_widget); #ifdef INTEGRATE_WITH_TDE qt_filedialog_open_filename_hook = &TDEFileDialogOpenName; @@ -287,6 +271,7 @@ Qt4TDEStyle::~Qt4TDEStyle() // Verify I'm not leaking memory like a sieve when this is commented out!!! // delete m_tqt3parent_widget; + m_internalTQt3WidgetCache->setAutoDelete(false); delete m_internalTQt3WidgetCache; delete m_internalTQt3PixmapCache; @@ -356,8 +341,9 @@ bool Qt4TDEStyle::eventFilter(QObject *obj, QEvent *ev) // repaint = false; // hoverTab = tab; - if (repaint) + if (repaint) { tabbar->repaint(); + } } } // } @@ -1113,7 +1099,8 @@ QSize Qt4TDEStyle::sizeFromContents(ContentsType type, const QStyleOption *opt, && (qt4menuactions.at(i)->text() == qt4menuitemoptions->text) && (qt4menuactions.at(i)->isChecked() == qt4menuitemoptions->checked) ) { - drawingItem = m_tqt3popupmenu_widget->findItem(m_tqt3popupmenu_widget->idAt(i)); + TQPopupMenu* popupMenuWidget = dynamic_cast(interfaceWidget); + drawingItem = popupMenuWidget->findItem(popupMenuWidget->idAt(i)); break; } } @@ -1149,7 +1136,7 @@ QSize Qt4TDEStyle::sizeFromContents(ContentsType type, const QStyleOption *opt, return retval; } -int Qt4TDEStyle::pixelMetric(PixelMetric metric, const QStyleOption *opt, const QWidget *w ) const +int Qt4TDEStyle::pixelMetric(PixelMetric metric, const QStyleOption *opt, const QWidget *w) const { int retval = 0; TQWidget* interfaceWidget = 0; @@ -1559,6 +1546,7 @@ TQWidget* Qt4TDEStyle::initializeInterfaceWidget(TQt3WidgetType wt, const QWidge const QTabBar* qt4tabbar_widget = 0; const QRadioButton* qt4radiobutton_widget = 0; const QCheckBox* qt4checkbox_widget = 0; + const QPushButton* qt4pushbutton_widget = 0; const QMenu* qt4menu_widget = 0; const QProgressBar* qt4progressbar_widget = 0; const QComboBox* qt4combobox_widget = 0; @@ -1578,51 +1566,102 @@ TQWidget* Qt4TDEStyle::initializeInterfaceWidget(TQt3WidgetType wt, const QWidge TQColor bgcolor; + TQWidget* cacheResult = 0; + const QObject* qt4objectptr = dynamic_cast(w); + if (qt4objectptr) { + cacheResult = m_internalTQt3WidgetCache->find((long)qt4objectptr); + } + else { + return NULL; + } + if (forceReload == false) { // NOTE // Enabling this for every widget breaks sliders and all other dynamically updated widgets // Disabling it for every widget makes the style engine run too slowly to be of much use // Much of the slowdown appears to be from Qt4TDEStyle::pixelMetric calling this method - if (/*(wt == TQT3WT_TQProgressBar)*/ - /*||*/ (wt == TQT3WT_TQTabBar) - || (wt == TQT3WT_TQRadioButton) - || (wt == TQT3WT_TQCheckBox) - || (wt == TQT3WT_TQPopupMenu) - || (wt == TQT3WT_TQComboBox) - //|| (wt == TQT3WT_TQSlider) - //|| (wt == TQT3WT_TQScrollBar) - //|| (wt == TQT3WT_TQSpinBox) - //|| (wt == TQT3WT_TQSpinWidget) - || (wt == TQT3WT_TQTitleBar) - || (wt == TQT3WT_TQMenuBar) - || (wt == TQT3WT_TQToolBox) - || (wt == TQT3WT_TQToolButton)) { - // If the interface widget was already initialized for this widget then do nothing - // This is a very simplistic algorithm that should probably be replaced with a full hashtable lookup scheme - if (m_previousQt4InterfaceWidget == w) { - return m_previousTQt3InterfaceWidget; - } - m_previousQt4InterfaceWidget = w; + if (cacheResult) { + if (/*(wt == TQT3WT_TQProgressBar)*/ + /*||*/ (wt == TQT3WT_TQTabBar) + || (wt == TQT3WT_TQRadioButton) + || (wt == TQT3WT_TQCheckBox) + || (wt == TQT3WT_TQPopupMenu) + || (wt == TQT3WT_TQComboBox) + //|| (wt == TQT3WT_TQSlider) + //|| (wt == TQT3WT_TQScrollBar) + //|| (wt == TQT3WT_TQSpinBox) + //|| (wt == TQT3WT_TQSpinWidget) + || (wt == TQT3WT_TQTitleBar) + || (wt == TQT3WT_TQMenuBar) + || (wt == TQT3WT_TQToolBox) + || (wt == TQT3WT_TQToolButton)) { + return cacheResult; + } } } + TQTabBar* m_tqt3tabbar_widget = 0; + TQRadioButton* m_tqt3radiobutton_widget = 0; + TQCheckBox* m_tqt3checkbox_widget = 0; + TQPushButton* m_tqt3pushbutton_widget = 0; + TQProgressBar* m_tqt3progressbar_widget = 0; + TQPopupMenu* m_tqt3popupmenu_widget = 0; + TQComboBox* m_tqt3combobox_widget = 0; + TQSlider* m_tqt3slider_widget = 0; + TQScrollBar* m_tqt3scrollbar_widget = 0; + TQSpinBox* m_tqt3spinbox_widget = 0; + TQSpinWidget* m_tqt3spinwidget_widget = 0; + TQTitleBar* m_tqt3titlebar_widget = 0; + TQMenuBar* m_tqt3menubar_widget = 0; + TQToolBox* m_tqt3toolbox_widget = 0; + TQToolButton* m_tqt3toolbutton_widget = 0; + + if (cacheResult) { + // Set pointer + m_tqt3tabbar_widget = dynamic_cast(cacheResult); + m_tqt3radiobutton_widget = dynamic_cast(cacheResult); + m_tqt3checkbox_widget = dynamic_cast(cacheResult); + m_tqt3pushbutton_widget = dynamic_cast(cacheResult); + m_tqt3progressbar_widget = dynamic_cast(cacheResult); + m_tqt3popupmenu_widget = dynamic_cast(cacheResult); + m_tqt3combobox_widget = dynamic_cast(cacheResult); + m_tqt3slider_widget = dynamic_cast(cacheResult); + m_tqt3scrollbar_widget = dynamic_cast(cacheResult); + m_tqt3spinbox_widget = dynamic_cast(cacheResult); + m_tqt3spinwidget_widget = dynamic_cast(cacheResult); + m_tqt3titlebar_widget = dynamic_cast(cacheResult); + m_tqt3menubar_widget = dynamic_cast(cacheResult); + m_tqt3toolbox_widget = dynamic_cast(cacheResult); + m_tqt3toolbutton_widget = dynamic_cast(cacheResult); + } + switch (wt) { case TQT3WT_TQProgressBar: + if (!m_tqt3progressbar_widget) m_tqt3progressbar_widget = new TQProgressBar(m_tqt3parent_widget); interfaceWidget = m_tqt3progressbar_widget; // Copy over all widget attributes qt4progressbar_widget = dynamic_cast(w); - m_tqt3progressbar_widget->setGeometry(0, 0, qt4progressbar_widget->width(), qt4progressbar_widget->height()); - m_tqt3progressbar_widget->setEnabled(qt4progressbar_widget->isEnabled()); - m_tqt3progressbar_widget->setProgress(qt4progressbar_widget->value()-qt4progressbar_widget->minimum(),qt4progressbar_widget->maximum()-qt4progressbar_widget->minimum()); - if (qt4progressbar_widget->orientation() != Qt::Horizontal) { - // Qt3 cannot draw vertical progress bars + if (qt4progressbar_widget) { + m_tqt3progressbar_widget->setGeometry(0, 0, qt4progressbar_widget->width(), qt4progressbar_widget->height()); + m_tqt3progressbar_widget->setEnabled(qt4progressbar_widget->isEnabled()); + m_tqt3progressbar_widget->setProgress(qt4progressbar_widget->value()-qt4progressbar_widget->minimum(),qt4progressbar_widget->maximum()-qt4progressbar_widget->minimum()); + if (qt4progressbar_widget->orientation() != Qt::Horizontal) { + // Qt3 cannot draw vertical progress bars + if (enable_debug_warnings) { + printf("No rules to draw vertical Qt4 progress bar\n\r"); fflush(stdout); + } + interfaceWidget = 0; + } + } + else { if (enable_debug_warnings) { - printf("No rules to draw vertical Qt4 progress bar\n\r"); fflush(stdout); + printf("Unable to draw Qt4 progress bar with no Qt4 object available\n\r"); fflush(stdout); } interfaceWidget = 0; } break; case TQT3WT_TQTabBar: + if (!m_tqt3tabbar_widget) m_tqt3tabbar_widget = new TQTabBar(m_tqt3parent_widget); interfaceWidget = m_tqt3tabbar_widget; // Copy over all widget attributes qt4tabbar_widget = dynamic_cast(w); @@ -1677,118 +1716,182 @@ TQWidget* Qt4TDEStyle::initializeInterfaceWidget(TQt3WidgetType wt, const QWidge } break; case TQT3WT_TQRadioButton: + if (!m_tqt3radiobutton_widget) m_tqt3radiobutton_widget = new TQRadioButton(m_tqt3parent_widget); interfaceWidget = m_tqt3radiobutton_widget; // Copy over all widget attributes qt4radiobutton_widget = dynamic_cast(w); - m_tqt3radiobutton_widget->setGeometry(0, 0, qt4radiobutton_widget->width(), qt4radiobutton_widget->height()); - m_tqt3radiobutton_widget->setEnabled(qt4radiobutton_widget->isEnabled()); - m_tqt3radiobutton_widget->setText(convertQt4ToTQt3String(qt4radiobutton_widget->text())); - m_tqt3radiobutton_widget->setDown(qt4radiobutton_widget->isDown()); + if (qt4radiobutton_widget) { + m_tqt3radiobutton_widget->setGeometry(0, 0, qt4radiobutton_widget->width(), qt4radiobutton_widget->height()); + m_tqt3radiobutton_widget->setEnabled(qt4radiobutton_widget->isEnabled()); + m_tqt3radiobutton_widget->setText(convertQt4ToTQt3String(qt4radiobutton_widget->text())); + m_tqt3radiobutton_widget->setDown(qt4radiobutton_widget->isDown()); + } + else { + if (enable_debug_warnings) { + printf("Unable to draw Qt4 radio button with no Qt4 object available\n\r"); fflush(stdout); + } + interfaceWidget = 0; + } break; case TQT3WT_TQCheckBox: + if (!m_tqt3checkbox_widget) m_tqt3checkbox_widget = new TQCheckBox(m_tqt3parent_widget); interfaceWidget = m_tqt3checkbox_widget; // Copy over all widget attributes qt4checkbox_widget = dynamic_cast(w); - m_tqt3checkbox_widget->setGeometry(0, 0, qt4checkbox_widget->width(), qt4checkbox_widget->height()); - m_tqt3checkbox_widget->setEnabled(qt4checkbox_widget->isEnabled()); - m_tqt3checkbox_widget->setText(convertQt4ToTQt3String(qt4checkbox_widget->text())); - m_tqt3checkbox_widget->setDown(qt4checkbox_widget->isDown()); + if (qt4checkbox_widget) { + m_tqt3checkbox_widget->setGeometry(0, 0, qt4checkbox_widget->width(), qt4checkbox_widget->height()); + m_tqt3checkbox_widget->setEnabled(qt4checkbox_widget->isEnabled()); + m_tqt3checkbox_widget->setText(convertQt4ToTQt3String(qt4checkbox_widget->text())); + m_tqt3checkbox_widget->setDown(qt4checkbox_widget->isDown()); + } + else { + if (enable_debug_warnings) { + printf("Unable to draw Qt4 checkbox with no Qt4 object available\n\r"); fflush(stdout); + } + interfaceWidget = 0; + } + break; + case TQT3WT_TQPushButton: + if (!m_tqt3pushbutton_widget) m_tqt3pushbutton_widget = new TQPushButton(m_tqt3parent_widget); + interfaceWidget = m_tqt3pushbutton_widget; + // Copy over all widget attributes + qt4pushbutton_widget = dynamic_cast(w); + if (qt4pushbutton_widget) { + m_tqt3pushbutton_widget->setGeometry(0, 0, qt4pushbutton_widget->width(), qt4pushbutton_widget->height()); + m_tqt3pushbutton_widget->setEnabled(qt4pushbutton_widget->isEnabled()); + m_tqt3pushbutton_widget->setText(convertQt4ToTQt3String(qt4pushbutton_widget->text())); + m_tqt3pushbutton_widget->setDown(qt4pushbutton_widget->isDown()); + } + else { + if (enable_debug_warnings) { + printf("Unable to draw Qt4 pushbutton with no Qt4 object available\n\r"); fflush(stdout); + } + interfaceWidget = 0; + } break; case TQT3WT_TQComboBox: + if (!m_tqt3combobox_widget) m_tqt3combobox_widget = new TQComboBox(m_tqt3parent_widget); interfaceWidget = m_tqt3combobox_widget; // Copy over all widget attributes qt4combobox_widget = dynamic_cast(w); - m_tqt3combobox_widget->setGeometry(0, 0, qt4combobox_widget->width(), qt4combobox_widget->height()); - m_tqt3combobox_widget->setEnabled(qt4combobox_widget->isEnabled()); - // Clear out all combobox items - m_tqt3combobox_widget->clear(); - - for (i=0;icount();i++) { - if (qt4combobox_widget->itemIcon(i).isNull()) { - m_tqt3combobox_widget->insertItem(convertQt4ToTQt3String(qt4combobox_widget->itemText(i)), i); + if (qt4combobox_widget) { + m_tqt3combobox_widget->setGeometry(0, 0, qt4combobox_widget->width(), qt4combobox_widget->height()); + m_tqt3combobox_widget->setEnabled(qt4combobox_widget->isEnabled()); + // Clear out all combobox items + m_tqt3combobox_widget->clear(); + + for (i=0;icount();i++) { + if (qt4combobox_widget->itemIcon(i).isNull()) { + m_tqt3combobox_widget->insertItem(convertQt4ToTQt3String(qt4combobox_widget->itemText(i)), i); + } + else { + m_tqt3combobox_widget->insertItem(convertQt4IconToTQt3Pixmap(qt4combobox_widget->itemIcon(i), m_tqt3IconSize_Small, m_internalTQt3PixmapCache), convertQt4ToTQt3String(qt4combobox_widget->itemText(i)), i); + } } - else { - m_tqt3combobox_widget->insertItem(convertQt4IconToTQt3Pixmap(qt4combobox_widget->itemIcon(i), m_tqt3IconSize_Small, m_internalTQt3PixmapCache), convertQt4ToTQt3String(qt4combobox_widget->itemText(i)), i); + m_tqt3combobox_widget->setEditable(qt4combobox_widget->isEditable()); + } + else { + if (enable_debug_warnings) { + printf("Unable to draw Qt4 combobox with no Qt4 object available\n\r"); fflush(stdout); } + interfaceWidget = 0; } - m_tqt3combobox_widget->setEditable(qt4combobox_widget->isEditable()); break; case TQT3WT_TQPopupMenu: + if (!m_tqt3popupmenu_widget) m_tqt3popupmenu_widget = new TQPopupMenu(m_tqt3parent_widget); interfaceWidget = m_tqt3popupmenu_widget; // Copy over all widget attributes qt4menu_widget = dynamic_cast(w); - m_tqt3popupmenu_widget->setGeometry(0, 0, qt4menu_widget->width(), qt4menu_widget->height()); - m_tqt3popupmenu_widget->setEnabled(qt4menu_widget->isEnabled()); - // Clear out menu - m_tqt3popupmenu_widget->clear(); - m_tqt3popupmenu_widget->setCheckable(false); - // Copy over all menu items - qt4menuactions = qt4menu_widget->actions(); - currentAction = 0; - for (i=0; iisSeparator()) { - m_tqt3popupmenu_widget->insertSeparator(i); - } - else { - if (currentAction->icon().isNull()) { - m_tqt3popupmenu_widget->insertItem(convertQt4ToTQt3String(currentAction->text()), i, i); + if (qt4menu_widget) { + m_tqt3popupmenu_widget->setGeometry(0, 0, qt4menu_widget->width(), qt4menu_widget->height()); + m_tqt3popupmenu_widget->setEnabled(qt4menu_widget->isEnabled()); + // Clear out menu + m_tqt3popupmenu_widget->clear(); + m_tqt3popupmenu_widget->setCheckable(false); + // Copy over all menu items + qt4menuactions = qt4menu_widget->actions(); + currentAction = 0; + for (i=0; iisSeparator()) { + m_tqt3popupmenu_widget->insertSeparator(i); } else { - m_tqt3popupmenu_widget->insertItem(convertQt4ToTQt3IconSet(currentAction->icon(), m_tqt3IconSize_Small, m_tqt3IconSize_Large, m_internalTQt3PixmapCache), convertQt4ToTQt3String(currentAction->text()), i, i); + if (currentAction->icon().isNull()) { + m_tqt3popupmenu_widget->insertItem(convertQt4ToTQt3String(currentAction->text()), i, i); + } + else { + m_tqt3popupmenu_widget->insertItem(convertQt4ToTQt3IconSet(currentAction->icon(), m_tqt3IconSize_Small, m_tqt3IconSize_Large, m_internalTQt3PixmapCache), convertQt4ToTQt3String(currentAction->text()), i, i); + } + // FIXME + // Handle pixmaps, etc. } + m_tqt3popupmenu_widget->setItemEnabled(i, currentAction->isEnabled()); + m_tqt3popupmenu_widget->setItemChecked(i, currentAction->isChecked()); + m_tqt3popupmenu_widget->setItemVisible(i, currentAction->isVisible()); + // FIXME - // Handle pixmaps, etc. + // It seems that all menus under TQt3 are checkable + // VERIFY THIS + m_tqt3popupmenu_widget->setCheckable(true); +// if (currentAction->isCheckable()) { +// m_tqt3popupmenu_widget->setCheckable(true); +// } } - m_tqt3popupmenu_widget->setItemEnabled(i, currentAction->isEnabled()); - m_tqt3popupmenu_widget->setItemChecked(i, currentAction->isChecked()); - m_tqt3popupmenu_widget->setItemVisible(i, currentAction->isVisible()); - - // FIXME - // It seems that all menus under TQt3 are checkable - // VERIFY THIS - m_tqt3popupmenu_widget->setCheckable(true); -// if (currentAction->isCheckable()) { -// m_tqt3popupmenu_widget->setCheckable(true); -// } } } + else { + if (enable_debug_warnings) { + printf("Unable to draw Qt4 popup menu with no Qt4 object available\n\r"); fflush(stdout); + } + interfaceWidget = 0; + } break; case TQT3WT_TQMenuBar: + if (!m_tqt3menubar_widget) m_tqt3menubar_widget = new TQMenuBar(m_tqt3parent_widget); interfaceWidget = m_tqt3menubar_widget; // Copy over all widget attributes qt4menubar_widget = dynamic_cast(w); - m_tqt3menubar_widget->setGeometry(0, 0, qt4menubar_widget->width(), qt4menubar_widget->height()); - m_tqt3menubar_widget->setEnabled(qt4menubar_widget->isEnabled()); - // Clear out menu - m_tqt3menubar_widget->clear(); - // Copy over all menu items - qt4menuactions = qt4menubar_widget->actions(); - currentAction = 0; - for (i=0; iisSeparator()) { - m_tqt3menubar_widget->insertSeparator(i); - } - else { - if (currentAction->icon().isNull()) { - m_tqt3menubar_widget->insertItem(convertQt4ToTQt3String(currentAction->text()), i, i); + if (qt4menubar_widget) { + m_tqt3menubar_widget->setGeometry(0, 0, qt4menubar_widget->width(), qt4menubar_widget->height()); + m_tqt3menubar_widget->setEnabled(qt4menubar_widget->isEnabled()); + // Clear out menu + m_tqt3menubar_widget->clear(); + // Copy over all menu items + qt4menuactions = qt4menubar_widget->actions(); + currentAction = 0; + for (i=0; iisSeparator()) { + m_tqt3menubar_widget->insertSeparator(i); } else { - m_tqt3menubar_widget->insertItem(convertQt4ToTQt3IconSet(currentAction->icon(), m_tqt3IconSize_Small, m_tqt3IconSize_Large, m_internalTQt3PixmapCache), convertQt4ToTQt3String(currentAction->text()), i, i); + if (currentAction->icon().isNull()) { + m_tqt3menubar_widget->insertItem(convertQt4ToTQt3String(currentAction->text()), i, i); + } + else { + m_tqt3menubar_widget->insertItem(convertQt4ToTQt3IconSet(currentAction->icon(), m_tqt3IconSize_Small, m_tqt3IconSize_Large, m_internalTQt3PixmapCache), convertQt4ToTQt3String(currentAction->text()), i, i); + } + // FIXME + // Handle pixmaps, etc. } - // FIXME - // Handle pixmaps, etc. + m_tqt3menubar_widget->setItemEnabled(i, currentAction->isEnabled()); + m_tqt3menubar_widget->setItemChecked(i, currentAction->isChecked()); + m_tqt3menubar_widget->setItemVisible(i, currentAction->isVisible()); } - m_tqt3menubar_widget->setItemEnabled(i, currentAction->isEnabled()); - m_tqt3menubar_widget->setItemChecked(i, currentAction->isChecked()); - m_tqt3menubar_widget->setItemVisible(i, currentAction->isVisible()); } } + else { + if (enable_debug_warnings) { + printf("Unable to draw Qt4 menu bar with no Qt4 object available\n\r"); fflush(stdout); + } + interfaceWidget = 0; + } break; case TQT3WT_TQSlider: + if (!m_tqt3slider_widget) m_tqt3slider_widget = new TQSlider(m_tqt3parent_widget); interfaceWidget = m_tqt3slider_widget; // Copy over all widget attributes qt4slider_widget = dynamic_cast(w); @@ -1814,6 +1917,7 @@ TQWidget* Qt4TDEStyle::initializeInterfaceWidget(TQt3WidgetType wt, const QWidge } break; case TQT3WT_TQScrollBar: + if (!m_tqt3scrollbar_widget) m_tqt3scrollbar_widget = new TQScrollBar(m_tqt3parent_widget); interfaceWidget = m_tqt3scrollbar_widget; // Copy over all widget attributes qt4scrollbar_widget = dynamic_cast(w); @@ -1837,6 +1941,7 @@ TQWidget* Qt4TDEStyle::initializeInterfaceWidget(TQt3WidgetType wt, const QWidge break; #if 0 case TQT3WT_TQSpinBox: + if (!m_tqt3spinbox_widget) m_tqt3spinbox_widget = new TQSpinBox(m_tqt3parent_widget); interfaceWidget = m_tqt3spinbox_widget; // Copy over all widget attributes qt4spinbox_widget = dynamic_cast(w); @@ -1857,6 +1962,7 @@ TQWidget* Qt4TDEStyle::initializeInterfaceWidget(TQt3WidgetType wt, const QWidge break; #endif case TQT3WT_TQSpinWidget: + if (!m_tqt3spinwidget_widget) m_tqt3spinwidget_widget = new TQSpinWidget(m_tqt3parent_widget); interfaceWidget = m_tqt3spinwidget_widget; // Copy over all widget attributes qt4spinbox_widget = dynamic_cast(w); @@ -1874,6 +1980,7 @@ TQWidget* Qt4TDEStyle::initializeInterfaceWidget(TQt3WidgetType wt, const QWidge } break; case TQT3WT_TQTitleBar: + if (!m_tqt3titlebar_widget) m_tqt3titlebar_widget = new TQTitleBar(m_tqt3window_widget, m_tqt3parent_widget); interfaceWidget = m_tqt3titlebar_widget; qt4titlebar_options = static_cast(qt4styleoptions); // Construct an internal TQTitleBar widget from the options and widget provided by Qt4 @@ -1893,6 +2000,7 @@ TQWidget* Qt4TDEStyle::initializeInterfaceWidget(TQt3WidgetType wt, const QWidge m_tqt3titlebar_widget->setIcon(convertQt4IconToTQt3Pixmap(qt4titlebar_options->icon, m_tqt3IconSize_Small, m_internalTQt3PixmapCache, false, &bgcolor)); break; case TQT3WT_TQToolBox: + if (!m_tqt3toolbox_widget) m_tqt3toolbox_widget = new TQToolBox(m_tqt3parent_widget); interfaceWidget = m_tqt3toolbox_widget; // Copy over all widget attributes qt4toolbox_widget = dynamic_cast(w); @@ -1917,6 +2025,7 @@ TQWidget* Qt4TDEStyle::initializeInterfaceWidget(TQt3WidgetType wt, const QWidge break; case TQT3WT_TQToolButton: // FIXME + if (!m_tqt3toolbutton_widget) m_tqt3toolbutton_widget = new TQToolButton(m_tqt3parent_widget); interfaceWidget = m_tqt3toolbutton_widget; // Copy over all widget attributes qt4toolbutton_widget = dynamic_cast(w); @@ -1943,10 +2052,23 @@ TQWidget* Qt4TDEStyle::initializeInterfaceWidget(TQt3WidgetType wt, const QWidge break; } - m_previousTQt3InterfaceWidget = interfaceWidget; + if ((qt4objectptr) && (!cacheResult) && (interfaceWidget)) { + connect(qt4objectptr, SIGNAL(destroyed(QObject*)), this, SLOT(handleQt4ObjectDestroyed(QObject*))); + m_internalTQt3WidgetCache->insert((long)qt4objectptr, interfaceWidget); + } + +#ifdef DEBUG_SPEW + if (enable_debug_warnings) { + printf("Widget cache: %d items now present in cache\n\r", m_internalTQt3WidgetCache->count()); + } +#endif // DEBUG_SPEW return interfaceWidget; } +void Qt4TDEStyle::handleQt4ObjectDestroyed(QObject* obj) { + m_internalTQt3WidgetCache->remove((long)obj); +} + QRect Qt4TDEStyle::subElementRect(SubElement element, const QStyleOption *opt, const QWidget *w) const { TQStyle::SFlags sflags = 0; @@ -2167,12 +2289,13 @@ void Qt4TDEStyle::drawComplexControl(ComplexControl control, const QStyleOptionC } subControlActive = 0; - if (sbopt->activeSubControls & QStyle::SC_SpinBoxUp) { + if ((sbopt->activeSubControls & QStyle::SC_SpinBoxUp) && (sbopt->state & State_Sunken)) { subControlActive = subControlActive | TQStyle::SC_SpinWidgetUp; } - if (sbopt->activeSubControls & QStyle::SC_SpinBoxDown) { + if ((sbopt->activeSubControls & QStyle::SC_SpinBoxDown) && (sbopt->state & State_Sunken)) { subControlActive = subControlActive | TQStyle::SC_SpinWidgetDown; } + break; case CC_TitleBar: tqtCC = TQStyle::CC_TitleBar; @@ -2436,7 +2559,7 @@ void Qt4TDEStyle::drawControl(ControlElement element, const QStyleOption *opt, Q draw_third_element = true; tqtCE_element3 = TQStyle::CE_ProgressBarLabel; sflags = convertQt4ToTQt3SFlags(opt->state, TQT3WT_TQProgressBar); - interfaceWidget = initializeInterfaceWidget(TQT3WT_TQProgressBar, w); + interfaceWidget = initializeInterfaceWidget(TQT3WT_TQProgressBar, w, NULL, TRUE); if (interfaceWidget == 0) { can_override = false; } @@ -2444,7 +2567,7 @@ void Qt4TDEStyle::drawControl(ControlElement element, const QStyleOption *opt, Q case QStyle::CE_ProgressBarContents: tqtCE = TQStyle::CE_ProgressBarContents; sflags = convertQt4ToTQt3SFlags(opt->state, TQT3WT_TQProgressBar); - interfaceWidget = initializeInterfaceWidget(TQT3WT_TQProgressBar, w); + interfaceWidget = initializeInterfaceWidget(TQT3WT_TQProgressBar, w, NULL, TRUE); if (interfaceWidget == 0) { can_override = false; } @@ -2455,7 +2578,7 @@ void Qt4TDEStyle::drawControl(ControlElement element, const QStyleOption *opt, Q draw_second_element = true; tqtCE_element2 = TQStyle::CE_TabBarLabel; sflags = convertQt4ToTQt3SFlags(opt->state, TQT3WT_TQTabBar); - interfaceWidget = initializeInterfaceWidget(TQT3WT_TQTabBar, w); + interfaceWidget = initializeInterfaceWidget(TQT3WT_TQTabBar, w, NULL, TRUE); if (interfaceWidget == 0) { can_override = false; } @@ -2466,7 +2589,8 @@ void Qt4TDEStyle::drawControl(ControlElement element, const QStyleOption *opt, Q // I have to guess based on the Qt4 position of the tab in the tab bar, which may or may not work 100% in all cases drawingTab = 0; estimated_tab_index = dynamic_cast(w)->tabAt(QPoint(opt->rect.x(), opt->rect.y())); - drawingTab = m_tqt3tabbar_widget->tabAt(estimated_tab_index); + TQTabBar* tabBarWidget = dynamic_cast(interfaceWidget); + drawingTab = tabBarWidget->tabAt(estimated_tab_index); if (drawingTab) { tqt3opt = TQStyleOption(drawingTab); @@ -2485,7 +2609,7 @@ void Qt4TDEStyle::drawControl(ControlElement element, const QStyleOption *opt, Q tqt3elementrect = TQRect(tqt3elementrect.x()-tqt3tabwidth, tqt3elementrect.y(), tqt3elementrect.width()+(tqt3tabwidth*1), tqt3elementrect.height()); } if (drawingTab) { - if (drawingTab->identifier() == (TQApplication::reverseLayout() ? (m_tqt3tabbar_widget->count()-1) : 0)) { + if (drawingTab->identifier() == (TQApplication::reverseLayout() ? (tabBarWidget->count()-1) : 0)) { // This is the first tab in the tab bar // We will end up clipping on the left edge if the rectangle is not adjusted tqt3elementrect = TQRect(tqt3elementrect.x()+tqt3tabwidth, tqt3elementrect.y(), tqt3elementrect.width()-(tqt3tabwidth*1), tqt3elementrect.height()); @@ -2502,7 +2626,7 @@ void Qt4TDEStyle::drawControl(ControlElement element, const QStyleOption *opt, Q tqtCE_element2 = TQStyle::CE_RadioButtonLabel; sflags = convertQt4ToTQt3SFlags(opt->state, TQT3WT_TQRadioButton); - interfaceWidget = initializeInterfaceWidget(TQT3WT_TQRadioButton, w); + interfaceWidget = initializeInterfaceWidget(TQT3WT_TQRadioButton, w, NULL, TRUE); if (interfaceWidget == 0) { can_override = false; } @@ -2514,6 +2638,7 @@ void Qt4TDEStyle::drawControl(ControlElement element, const QStyleOption *opt, Q // [FIXME 001] // Figure out why this is needed! Without it the text shows up lower than the indicator does... // Potential subRect() mismatch between Qt4 and TQt3? See TQt3 qcommonstyle.cpp lines 1307 and 1315 + // Strange that this hack is not needed for the CheckBox and PushButton cases... tqt3element2rect.setHeight(tqt3elementrect.height()); } break; @@ -2526,25 +2651,36 @@ void Qt4TDEStyle::drawControl(ControlElement element, const QStyleOption *opt, Q tqtCE_element2 = TQStyle::CE_CheckBoxLabel; sflags = convertQt4ToTQt3SFlags(opt->state, TQT3WT_TQCheckBox); - interfaceWidget = initializeInterfaceWidget(TQT3WT_TQCheckBox, w); + interfaceWidget = initializeInterfaceWidget(TQT3WT_TQCheckBox, w, NULL, TRUE); if (interfaceWidget == 0) { can_override = false; } else { tqt3elementrect = tqApp->style().visualRect( tqApp->style().subRect(TQStyle::SR_CheckBoxIndicator, interfaceWidget), interfaceWidget); tqt3element2rect = tqApp->style().visualRect( tqApp->style().subRect(TQStyle::SR_CheckBoxContents, interfaceWidget), interfaceWidget); - // HACK - // Lock text area height to indicator height - // [FIXME 001] - // Figure out why this is needed! Without it the text shows up lower than the indicator does... - // Potential subRect() mismatch between Qt4 and TQt3? See TQt3 qcommonstyle.cpp lines 1307 and 1315 - tqt3element2rect.setHeight(tqt3elementrect.height()); + } + break; + case CE_PushButton: + // Unlike Qt3, QStyle::CE_PushButton draws the button, the label, and the focus rectangle + // FIXME + // Handle the focus rectangle + tqtCE = TQStyle::CE_PushButton; + draw_second_element = true; + tqtCE_element2 = TQStyle::CE_PushButtonLabel; + + sflags = convertQt4ToTQt3SFlags(opt->state, TQT3WT_TQPushButton); + interfaceWidget = initializeInterfaceWidget(TQT3WT_TQPushButton, w, NULL, TRUE); + if (interfaceWidget == 0) { + can_override = false; + } + else { + tqt3element2rect = tqApp->style().visualRect( tqApp->style().subRect(TQStyle::SR_PushButtonContents, interfaceWidget), interfaceWidget); } break; case CE_MenuItem: tqtCE = TQStyle::CE_PopupMenuItem; sflags = convertQt4ToTQt3SFlags(opt->state, TQT3WT_TQPopupMenu); - interfaceWidget = initializeInterfaceWidget(TQT3WT_TQPopupMenu, w); + interfaceWidget = initializeInterfaceWidget(TQT3WT_TQPopupMenu, w, NULL, TRUE); if (interfaceWidget == 0) { can_override = false; } @@ -2558,7 +2694,8 @@ void Qt4TDEStyle::drawControl(ControlElement element, const QStyleOption *opt, Q qt4menuactions = dynamic_cast(w)->actions(); for (i=0; ifindItem(m_tqt3popupmenu_widget->idAt(i)); + TQPopupMenu* popupMenuWidget = dynamic_cast(interfaceWidget); + drawingItem = popupMenuWidget->findItem(popupMenuWidget->idAt(i)); } } @@ -2572,7 +2709,7 @@ void Qt4TDEStyle::drawControl(ControlElement element, const QStyleOption *opt, Q case QStyle::CE_MenuBarItem: tqtCE = TQStyle::CE_MenuBarItem; sflags = convertQt4ToTQt3SFlags(opt->state, TQT3WT_TQMenuBar); - interfaceWidget = initializeInterfaceWidget(TQT3WT_TQMenuBar, w); + interfaceWidget = initializeInterfaceWidget(TQT3WT_TQMenuBar, w, NULL, TRUE); if (interfaceWidget == 0) { can_override = false; } @@ -2584,9 +2721,10 @@ void Qt4TDEStyle::drawControl(ControlElement element, const QStyleOption *opt, Q drawingItem = 0; drawingAction = dynamic_cast(w)->actionAt(QPoint(opt->rect.x(), opt->rect.y())); qt4menuactions = dynamic_cast(w)->actions(); + TQMenuBar* menuBarWidget = dynamic_cast(interfaceWidget); for (i=0; ifindItem(m_tqt3menubar_widget->idAt(i)); + drawingItem = menuBarWidget->findItem(menuBarWidget->idAt(i)); } } @@ -2610,7 +2748,7 @@ void Qt4TDEStyle::drawControl(ControlElement element, const QStyleOption *opt, Q // See below for Qt4 drawing calls tqtCE = TQStyle::CE_ToolBoxTab; sflags = convertQt4ToTQt3SFlags(opt->state, TQT3WT_TQToolBox); - interfaceWidget = initializeInterfaceWidget(TQT3WT_TQToolBox, w); + interfaceWidget = initializeInterfaceWidget(TQT3WT_TQToolBox, w, NULL, TRUE); if (interfaceWidget == 0) { can_override = false; } @@ -2618,7 +2756,7 @@ void Qt4TDEStyle::drawControl(ControlElement element, const QStyleOption *opt, Q case QStyle::CE_MenuBarEmptyArea: tqtCE = TQStyle::CE_MenuBarEmptyArea; sflags = convertQt4ToTQt3SFlags(opt->state, TQT3WT_TQMenuBar); - interfaceWidget = initializeInterfaceWidget(TQT3WT_TQMenuBar, w); + interfaceWidget = initializeInterfaceWidget(TQT3WT_TQMenuBar, w, NULL, TRUE); if (interfaceWidget == 0) { can_override = false; } diff --git a/plugin/simplestyle.h b/plugin/simplestyle.h index 28f5726..7ce2092 100644 --- a/plugin/simplestyle.h +++ b/plugin/simplestyle.h @@ -76,26 +76,29 @@ public: public slots: QIcon standardIconImplementation(StandardPixmap standardIcon, const QStyleOption * option = 0, const QWidget * widget = 0) const; +private slots: + void handleQt4ObjectDestroyed(QObject*); + private: TQWidget* initializeInterfaceWidget(TQt3WidgetType wt, const QWidget * widget, const QStyleOption* qt4styleoptions = 0, bool forceReload = false) const; TQWidget* m_tqt3parent_widget; TQWidget* m_tqt3generic_widget; - TQTabBar* m_tqt3tabbar_widget; - TQRadioButton* m_tqt3radiobutton_widget; - TQCheckBox* m_tqt3checkbox_widget; - TQProgressBar* m_tqt3progressbar_widget; - TQPopupMenu* m_tqt3popupmenu_widget; - TQComboBox* m_tqt3combobox_widget; - TQSlider* m_tqt3slider_widget; - TQScrollBar* m_tqt3scrollbar_widget; - TQSpinBox* m_tqt3spinbox_widget; - TQSpinWidget* m_tqt3spinwidget_widget; +// mutable TQTabBar* m_tqt3tabbar_widget; +// mutable TQRadioButton* m_tqt3radiobutton_widget; +// mutable TQCheckBox* m_tqt3checkbox_widget; +// mutable TQProgressBar* m_tqt3progressbar_widget; +// mutable TQPopupMenu* m_tqt3popupmenu_widget; +// mutable TQComboBox* m_tqt3combobox_widget; +// mutable TQSlider* m_tqt3slider_widget; +// mutable TQScrollBar* m_tqt3scrollbar_widget; +// mutable TQSpinBox* m_tqt3spinbox_widget; +// mutable TQSpinWidget* m_tqt3spinwidget_widget; TQWidget* m_tqt3window_widget; - TQTitleBar* m_tqt3titlebar_widget; - TQMenuBar* m_tqt3menubar_widget; - TQToolBox* m_tqt3toolbox_widget; - TQToolButton* m_tqt3toolbutton_widget; +// mutable TQTitleBar* m_tqt3titlebar_widget; +// mutable TQMenuBar* m_tqt3menubar_widget; +// mutable TQToolBox* m_tqt3toolbox_widget; +// mutable TQToolButton* m_tqt3toolbutton_widget; int m_tqt3IconSize_NoGroup; int m_tqt3IconSize_Desktop;