style button is smaller now
[quassel.git] / src / uisupport / graphicalui.cpp
index db52686..40921cf 100644 (file)
 
 #include "graphicalui.h"
 
+#include "actioncollection.h"
 #include "contextmenuactionprovider.h"
 
+#ifdef Q_WS_X11
+#  include <QX11Info>
+#endif
+#ifdef HAVE_KDE
+#  include <KWindowInfo>
+#  include <KWindowSystem>
+#endif
+
+QWidget *GraphicalUi::_mainWidget = 0;
+QHash<QString, ActionCollection *> GraphicalUi::_actionCollections;
 ContextMenuActionProvider *GraphicalUi::_contextMenuActionProvider = 0;
+ToolBarActionProvider *GraphicalUi::_toolBarActionProvider = 0;
+UiStyle *GraphicalUi::_uiStyle = 0;
+bool GraphicalUi::_onAllDesktops = false;
+
+GraphicalUi::GraphicalUi(QObject *parent) : AbstractUi(parent)
+{
+
+}
 
-GraphicalUi::GraphicalUi(QObject *parent) : AbstractUi(parent) {
+ActionCollection *GraphicalUi::actionCollection(const QString &category) {
+  if(_actionCollections.contains(category))
+    return _actionCollections.value(category);
+  ActionCollection *coll = new ActionCollection(_mainWidget);
+  if(_mainWidget)
+    coll->addAssociatedWidget(_mainWidget);
+  _actionCollections.insert(category, coll);
+  return coll;
+}
 
+void GraphicalUi::setMainWidget(QWidget *widget) {
+  _mainWidget = widget;
 }
 
 void GraphicalUi::setContextMenuActionProvider(ContextMenuActionProvider *provider) {
   _contextMenuActionProvider = provider;
 }
+
+void GraphicalUi::setToolBarActionProvider(ToolBarActionProvider *provider) {
+  _toolBarActionProvider = provider;
+}
+
+void GraphicalUi::setUiStyle(UiStyle *style) {
+  _uiStyle = style;
+}
+
+void GraphicalUi::activateMainWidget() {
+#ifdef HAVE_KDE
+#  ifdef Q_WS_X11
+    KWindowInfo info = KWindowSystem::windowInfo(mainWidget()->winId(), NET::WMDesktop | NET::WMFrameExtents);
+    if(_onAllDesktops) {
+      KWindowSystem::setOnAllDesktops(mainWidget()->winId(), true);
+    } else {
+      KWindowSystem::setCurrentDesktop(info.desktop());
+    }
+
+    mainWidget()->move(info.frameGeometry().topLeft()); // avoid placement policies
+    mainWidget()->show();
+    mainWidget()->raise();
+    KWindowSystem::raiseWindow(mainWidget()->winId());
+    KWindowSystem::activateWindow(mainWidget()->winId());
+#  else
+    mainWidget()->show();
+    KWindowSystem::raiseWindow(mainWidget()->winId());
+    KWindowSystem::forceActiveWindow(mainWidget()->winId());
+#  endif
+
+#else /* HAVE_KDE */
+
+#ifdef Q_WS_X11
+  // Bypass focus stealing prevention
+  QX11Info::setAppUserTime(QX11Info::appTime());
+#endif
+
+  if(mainWidget()->windowState() & Qt::WindowMinimized) {
+    // restore
+    mainWidget()->setWindowState((mainWidget()->windowState() & ~Qt::WindowMinimized) | Qt::WindowActive);
+  }
+
+  // this does not actually work on all platforms... and causes more evil than good
+  // mainWidget()->move(mainWidget()->frameGeometry().topLeft()); // avoid placement policies
+  mainWidget()->show();
+  mainWidget()->raise();
+  mainWidget()->activateWindow();
+
+#endif /* HAVE_KDE */
+}
+
+void GraphicalUi::hideMainWidget() {
+
+#if defined(HAVE_KDE) && defined(Q_WS_X11)
+  KWindowInfo info = KWindowSystem::windowInfo(mainWidget()->winId(), NET::WMDesktop | NET::WMFrameExtents);
+  _onAllDesktops = info.onAllDesktops();
+#endif
+
+  mainWidget()->hide();
+}