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

List:       kde-core-devel
Subject:    Re: KDockWidget'S
From:       Andreas Zehender <zehender () kde ! org>
Date:       2002-09-10 16:58:45
[Download RAW message or body]

Hi!

On Monday 09 September 2002 12:40, Daniel Molkentin wrote:
> It's quite ok for now. What I would like to have is that reparent gets the
> WStyle_NoBorder hint. While that should be pretty trivial, how complicated
> is it to add further buttons to the self-drawn handle in KDockWidget?

The attached patch adds an undock button to the header and adjusts the size of 
the dock back button.

It adds a new slot and defines a KDockWidgetHeaderPrivate class with one 
member (was only declared forward), what should be binary compatible.

What can be a problem is that the destructor of KDockWidgetHeader is not 
inline any more (it has to delete the d member). Is this binary compatible? 
If yes, will it be called from already linked programs? This patch would 
introduce a memory leak otherwise.

Andreas
-- 
--------------------------------------------------
 Andreas Zehender, Dipl. Ing. (BA)
 Student, 10th semester computer science
 http://www.azweb.de
 az@azweb.de | zehender@kde.org      
--------------------------------------------------

["dockwidget.patch" (text/x-diff)]

? dockwidget.patch
Index: kdockwidget.cpp
===================================================================
RCS file: /home/kde/kdelibs/kdeui/kdockwidget.cpp,v
retrieving revision 1.109
diff -u -r1.109 kdockwidget.cpp
--- kdockwidget.cpp	2002/08/29 14:58:57	1.109
+++ kdockwidget.cpp	2002/09/10 16:40:28
@@ -51,14 +51,25 @@
 #define DOCK_CONFIG_VERSION "0.0.5"
 
 static const char* const dockback_xpm[]={
+"6 6 2 1",
+"# c black",
+". c None",
+"......",
+".#....",
+"..#..#",
+"...#.#",
+"....##",
+"..####"};
+
+static const char* const todesktop_xpm[]={
 "5 5 2 1",
 "# c black",
 ". c None",
-"#....",
-".#...",
-"..#.#",
-"...##",
-"..###"};
+"####.",
+"##...",
+"#.#..",
+"#..#.",
+"....#"};
 
 static const char* const not_close_xpm[]={
 "5 5 2 1",
@@ -196,6 +207,8 @@
 KDockWidgetHeader::KDockWidgetHeader( KDockWidget* parent, const char* name )
 :KDockWidgetAbstractHeader( parent, name )
 {
+  d = new KDockWidgetHeaderPrivate( );
+  
   layout = new QHBoxLayout( this );
   layout->setResizeMode( QLayout::Minimum );
 
@@ -219,16 +232,27 @@
   connect( dockbackButton, SIGNAL(clicked()), parent, SIGNAL(headerDockbackButtonClicked()));
   connect( dockbackButton, SIGNAL(clicked()), parent, SLOT(dockBack()));
 
+  d->toDesktopButton = new KDockButton_Private( this, "ToDesktopButton" );
+  d->toDesktopButton->setPixmap( const_cast< const char** >(todesktop_xpm));
+  d->toDesktopButton->setFixedSize(closeButton->pixmap()->width(),closeButton->pixmap()->height());
+  connect( d->toDesktopButton, SIGNAL(clicked()), parent, SLOT(toDesktop()));
+
   stayButton->hide();
   
   layout->addWidget( drag );
   layout->addWidget( dockbackButton );
+  layout->addWidget( d->toDesktopButton );
   layout->addWidget( stayButton );
   layout->addWidget( closeButton );
   layout->activate();
   drag->setFixedHeight( layout->minimumSize().height() );
 }
 
+KDockWidgetHeader::~KDockWidgetHeader( )
+{
+   delete d;
+}
+
 void KDockWidgetHeader::setTopLevel( bool isTopLevel )
 {
   if ( isTopLevel ){
@@ -241,11 +265,13 @@
     }
     stayButton->hide();
     closeButton->hide();
+    d->toDesktopButton->hide();
     drag->setEnabled( true );
   } else {
     dockbackButton->hide();
     stayButton->hide();
     closeButton->show();
+    d->toDesktopButton->show();
   }
   layout->activate();
   updateGeometry();
@@ -264,6 +290,7 @@
 
   layout->addWidget( drag );
   layout->addWidget( dockbackButton );
+  layout->addWidget( d->toDesktopButton );
   layout->addWidget( stayButton );
   layout->addWidget( closeButton );
   layout->activate();
@@ -873,8 +900,16 @@
 	if (parent()->inherits("KDockSplitter"))
 		static_cast<KDockSplitter*>(parent()->qt_cast("KDockSplitter"))->restoreFromForcedFixedSize(this);	
 }
-
 
+void KDockWidget::toDesktop()
+{
+   QPoint p = mapToGlobal( QPoint( -30, -30 ) );
+   if( p.x( ) < 0 )
+      p.setX( 0 );
+   if( p.y( ) < 0 )
+      p.setY( 0 );
+   manualDock( 0, DockDesktop, 50, p );
+}
 
 void KDockWidget::undock()
 {
Index: kdockwidget.h
===================================================================
RCS file: /home/kde/kdelibs/kdeui/kdockwidget.h,v
retrieving revision 1.67
diff -u -r1.67 kdockwidget.h
--- kdockwidget.h	2002/07/04 21:03:17	1.67
+++ kdockwidget.h	2002/09/10 16:40:28
@@ -247,7 +247,7 @@
   /**
    * Destructs this.
    */
-  virtual ~KDockWidgetHeader(){};
+  virtual ~KDockWidgetHeader();
 
   /**
    * Hides the close button and stay button when switching to toplevel or vice versa shows them.
@@ -651,6 +651,11 @@
    * another dockwidget by mouse (docking).
    */
   void undock();
+
+  /**
+   * Docks the widget to the desktop (as a toplevel widget)
+   */
+  void toDesktop( );
 
 protected:
 
Index: kdockwidget_private.h
===================================================================
RCS file: /home/kde/kdelibs/kdeui/kdockwidget_private.h,v
retrieving revision 1.22
diff -u -r1.22 kdockwidget_private.h
--- kdockwidget_private.h	2002/07/04 21:03:17	1.22
+++ kdockwidget_private.h	2002/09/10 16:40:28
@@ -154,4 +154,11 @@
   QGuardedPtr<QWidget> container;
 };
 
+class KDockWidgetHeader::KDockWidgetHeaderPrivate
+{
+public:
+  KDockWidgetHeaderPrivate( ) { toDesktopButton = 0; }
+  KDockButton_Private* toDesktopButton;
+};
+
 #endif


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

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