[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    KDE/kdevplatform/sublime
From:       Vladimir Prus <ghost () cs ! msu ! su>
Date:       2007-12-08 17:55:36
Message-ID: 1197136536.007778.3154.nullmailer () svn ! kde ! org
[Download RAW message or body]

SVN commit 746323 by vprus:

Implement moving of tool view between window sides.

Presently, this is implemented as popup menu on tool's
title. Neither this solution, nor implementation is ideal.
At the very least, we need to be also able to move
by context menu on the button that selects the tool. Ideally,
we should be able to drag-drop tools, and make two or several
tools simultanously present on one side of the screen.
	
	mainwindow_p.h, mainwindow_p.cpp/
	* MainWindowPrivate (toolViewMoved): New slot.	
	area.h, area.cpp/
	* Area (moveToolView): New method.
	ideal.h, ideal.cpp/
	* IdealDockWidgetTitle (IdealDockWidgetTitle): New 
	parameter docking_area. 
	(contextMenuEvent): New.
	* IdealButtonBarWidget (addWidget): 
	Pass docking position to IdealDockWidgetTitle.
	* IdealMainWidget (addView): If view returns
	a parentless widget, set parent explicitly.
	(removeView): New parameter 'nondestructive'.
	Reset view parent if specified.
	(moveView): New.


 M  +9 -0      area.cpp  
 M  +7 -0      area.h  
 M  +2 -0      controller.cpp  
 M  +76 -4     ideal.cpp  
 M  +11 -2     ideal.h  
 M  +1 -0      mainwindow.h  
 M  +9 -0      mainwindow_p.cpp  
 M  +1 -0      mainwindow_p.h  


--- trunk/KDE/kdevplatform/sublime/area.cpp #746322:746323
@@ -188,6 +188,15 @@
     return view;
 }
 
+void Area::moveToolView(View *toolView, Position newPosition)
+{
+    if (!d->toolViews.contains(toolView))
+        return;
+
+    d->toolViewPositions[toolView] = newPosition;
+    emit toolViewMoved(toolView, newPosition);
+}
+
 QList<View*> &Area::toolViews() const
 {
     return d->toolViews;
--- trunk/KDE/kdevplatform/sublime/area.h #746322:746323
@@ -92,8 +92,13 @@
     the proper position for the toolview when necessary. If it has no configuration
     for this view, it will use @p defaultPosition.*/
     void addToolView(View *toolView, Position defaultPosition);
+
     /**Removes the toolview from the area.*/
     View* removeToolView(View *toolView);
+
+    /**Moves the toolview to a different position.  */
+    void moveToolView(View *toolView, Position newPosition);
+
     /**Raise tool view.*/
     void raiseToolView(View *toolView);
     /**@return the list of toolviews in the area. No particular sort order is guaranteed.*/
@@ -165,6 +170,8 @@
     void requestToolViewRaise(Sublime::View*);
     /**Emitted when a toolview is going to be removed from the area.*/
     void aboutToRemoveToolView(Sublime::View*, Sublime::Position);
+    /**Emitted when a toolview is moved to a different position.*/
+    void toolViewMoved(Sublime::View*, Sublime::Position);
 
 private:
     template <typename Operator>
--- trunk/KDE/kdevplatform/sublime/controller.cpp #746322:746323
@@ -135,6 +135,8 @@
         mainWindow, SLOT(toolViewAdded(Sublime::View*, Sublime::Position)));
     connect(areaToShow, SIGNAL(aboutToRemoveToolView(Sublime::View*, Sublime::Position)),
         mainWindow, SLOT(aboutToRemoveToolView(Sublime::View*, Sublime::Position)));
+    connect(areaToShow, SIGNAL(toolViewMoved(Sublime::View*, Sublime::Position)),
+        mainWindow, SLOT(toolViewMoved(Sublime::View*, Sublime::Position)));
 }
 
 QList<Area*> &Controller::areas() const
--- trunk/KDE/kdevplatform/sublime/ideal.cpp #746322:746323
@@ -21,12 +21,14 @@
 
 #include "ideal.h"
 
+#include <Qt>
 #include <KIcon>
 #include <kdebug.h>
 #include <klocale.h>
 #include <KActionCollection>
 #include <KActionMenu>
 #include <KAcceleratorManager>
+#include <KMenu>
 
 #include "area.h"
 #include "view.h"
@@ -123,7 +125,7 @@
         IdealDockWidgetTitle* title = 
             new IdealDockWidgetTitle(
                 orientation() == Qt::Horizontal ? Qt::Vertical : Qt::Horizontal, 
-                dock, area, view);
+                dock, area, view, _area);
         dock->setTitleBarWidget(title);
         connect(title, SIGNAL(anchor(bool)), SLOT(anchor(bool)));
         connect(title, SIGNAL(maximize(bool)), SLOT(maximize(bool)));
@@ -247,11 +249,13 @@
 
 IdealDockWidgetTitle::IdealDockWidgetTitle(Qt::Orientation orientation, 
                                            QDockWidget * parent, 
-                                           Area *area, View *view)
+                                           Area *area, View *view,
+                                           Qt::DockWidgetArea docking_area)
     : QWidget(parent)
     , m_orientation(orientation)
     , m_area(area)
     , m_view(view)
+    , m_docking_area(docking_area)
 {
     QBoxLayout* layout = 0;
     switch (m_orientation) {
@@ -355,6 +359,57 @@
     m_area->removeToolView(m_view);
 }
 
+void IdealDockWidgetTitle::contextMenuEvent(QContextMenuEvent *event)
+{
+    KMenu menu;
+
+    menu.addTitle(i18n("Position"));
+
+    QActionGroup *g = new QActionGroup(this);
+
+    QAction *left = new QAction(i18n("Left"), g);
+    QAction *bottom = new QAction(i18n("Bottom"), g);
+    QAction *right = new QAction(i18n("Right"), g);
+    QAction *top = new QAction(i18n("Top"), g);
+
+    QAction* actions[] = {left, bottom, right, top};
+    for (int i = 0; i < 4; ++i)
+    {
+        menu.addAction(actions[i]);
+        actions[i]->setCheckable(true);
+    }
+    if (m_docking_area == Qt::TopDockWidgetArea)
+        top->setChecked(true);
+    else if (m_docking_area == Qt::BottomDockWidgetArea)
+        bottom->setChecked(true);
+    else if (m_docking_area == Qt::LeftDockWidgetArea)
+        left->setChecked(true);
+    else 
+        right->setChecked(true);
+
+    QAction* triggered = menu.exec(event->globalPos());
+
+    if (triggered)
+    {
+        Sublime::Position pos;
+        if (triggered == left)
+            pos = Sublime::Left;
+        else if (triggered == bottom)
+            pos = Sublime::Bottom;
+        else if (triggered == right)
+            pos = Sublime::Right;
+        else
+            pos = Sublime::Top;
+
+        Area *area = m_area;
+        View *view = m_view;
+        /* This call will delete *this, so we no longer
+           can access member variables. */
+        m_area->moveToolView(m_view, pos);
+        area->raiseToolView(view);
+    }
+}
+
 IdealMainWidget::IdealMainWidget(MainWindow* parent, KActionCollection* ac)
     : QWidget(parent)
 {
@@ -454,7 +509,15 @@
 
     KAcceleratorManager::setNoAccel(dock);
 
-    dock->setWidget(view->widget(dock));
+    QWidget *w = view->widget(dock);
+    if (w->parent() == 0)
+    {
+        /* Could happen when we're moving the widget from
+           one QDockWidget to another.  See moveView below.
+           In this case, we need to reparent the widget. */
+        w->setParent(dock);
+    }
+    dock->setWidget(w);
     dock->setWindowTitle(view->widget()->windowTitle());
     dock->setAutoFillBackground(true);
     dock->setFocusProxy(dock->widget());
@@ -509,7 +572,7 @@
     action->setChecked(true);
 }
 
-void IdealMainWidget::removeView(View* view)
+void IdealMainWidget::removeView(View* view, bool nondestructive)
 {
     Q_ASSERT(m_view_to_action.contains(view));
 
@@ -530,9 +593,18 @@
     m_view_to_action.remove(view);
     m_dockwidget_to_action.remove(dock);
 
+    if (nondestructive)
+        view->widget()->setParent(0);
+
     delete dock;
 }
 
+void IdealMainWidget::moveView(View *view, Qt::DockWidgetArea area)
+{
+    removeView(view);
+    addView(area, view);
+}
+
 void IdealMainWidget::setCentralWidget(QWidget * widget)
 {
     m_mainLayout->addWidget(widget, IdealMainLayout::Central);
--- trunk/KDE/kdevplatform/sublime/ideal.h #746322:746323
@@ -117,7 +117,8 @@
 
 public:
     IdealDockWidgetTitle(Qt::Orientation orientation, QDockWidget* parent, 
-                         Area* area, View *view);
+                         Area* area, View *view, 
+                         Qt::DockWidgetArea docking_area);
     virtual ~IdealDockWidgetTitle();
 
     bool isAnchored() const;
@@ -126,6 +127,9 @@
     bool isMaximized() const;
     void setMaximized(bool maximized);
 
+protected: // QWidget overrides
+    virtual void contextMenuEvent(QContextMenuEvent *);
+
 Q_SIGNALS:
     void anchor(bool anchor);
     void maximize(bool maximize);
@@ -142,6 +146,7 @@
     QToolButton* m_maximize;
     Area *m_area;
     View *m_view;
+    Qt::DockWidgetArea m_docking_area;
 };
 
 class IdealCentralWidget : public QWidget
@@ -172,7 +177,11 @@
     QAction* actionForView(View* view) const;
     void addView(Qt::DockWidgetArea area, View* View);
     void raiseView(View* view);
-    void removeView(View* view);
+    /** Remove view.  If nondestructive true, view->widget()
+        is not deleted, as is left with NULL parent.
+        Otherwise, it's deleted.  */
+    void removeView(View* view, bool nondestructive = false);
+    void moveView(View *view, Qt::DockWidgetArea area);
 
     // Internal api
 
--- trunk/KDE/kdevplatform/sublime/mainwindow.h #746322:746323
@@ -98,6 +98,7 @@
     Q_PRIVATE_SLOT(d, void toolViewAdded(Sublime::View*, Sublime::Position))
     Q_PRIVATE_SLOT(d, void raiseToolView(Sublime::View*))
     Q_PRIVATE_SLOT(d, void aboutToRemoveToolView(Sublime::View*, Sublime::Position))
+    Q_PRIVATE_SLOT(d, void toolViewMoved(Sublime::View*, Sublime::Position))
 
     //Inherit MainWindowOperator to access four methods below
     /**Sets the area of main window and fills it with views.*/
--- trunk/KDE/kdevplatform/sublime/mainwindow_p.cpp #746322:746323
@@ -257,6 +257,15 @@
     docks.removeAll(toolView);
 }
 
+void MainWindowPrivate::toolViewMoved(
+    Sublime::View *toolView, Sublime::Position position)
+{
+    if (!docks.contains(toolView))
+        return;
+
+    idealMainWidget->moveView(toolView, positionToDockArea(position));
+}
+
 Qt::DockWidgetArea MainWindowPrivate::positionToDockArea(Position position)
 {
     switch (position)
--- trunk/KDE/kdevplatform/sublime/mainwindow_p.h #746322:746323
@@ -93,6 +93,7 @@
     void aboutToRemoveView(Sublime::AreaIndex *index, Sublime::View *view);
     void toolViewAdded(Sublime::View *toolView, Sublime::Position position);
     void aboutToRemoveToolView(Sublime::View *toolView, Sublime::Position position);
+    void toolViewMoved(Sublime::View *toolView, Sublime::Position position);
 
 private slots:
     void switchToArea(QAction *action);
[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic