summaryrefslogtreecommitdiff
Side-by-side diff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--libopie/big-screen/example/osplitter_example.cpp28
-rw-r--r--libopie/big-screen/example/osplitter_example.h20
-rw-r--r--libopie/big-screen/example/osplitter_example.obin0 -> 17276 bytes
-rw-r--r--libopie/big-screen/example/osplitter_example.pro13
-rw-r--r--libopie/big-screen/obigscreen_p.h20
-rw-r--r--libopie/big-screen/osplitter.cpp165
-rw-r--r--libopie/big-screen/osplitter.h22
7 files changed, 228 insertions, 40 deletions
diff --git a/libopie/big-screen/example/osplitter_example.cpp b/libopie/big-screen/example/osplitter_example.cpp
new file mode 100644
index 0000000..e337379
--- a/dev/null
+++ b/libopie/big-screen/example/osplitter_example.cpp
@@ -0,0 +1,28 @@
+#include <qdir.h>
+#include <qlayout.h>
+
+#include "../osplitter.h"
+
+#include <qpe/qpeapplication.h>
+#include <opie/oapplicationfactory.h>
+
+#include "osplitter_example.h"
+
+OPIE_EXPORT_APP( OApplicationFactory<OSplitterExample> )
+
+OSplitterExample::OSplitterExample( QWidget *w,const char* n,WFlags f )
+ : QWidget( w, n, f ){
+ QVBoxLayout * lay = new QVBoxLayout(this);
+ OSplitter * splitter = new OSplitter( Horizontal, this );
+ lay->addWidget( splitter );
+
+ OFileSelector *selector = new OFileSelector( splitter, OFileSelector::FileSelector,
+ OFileSelector::Normal, QDir::homeDirPath(),
+ QString::null );
+ splitter->addWidget( selector, "zoom", tr("Selector 1") );
+
+ selector = new OFileSelector( splitter, OFileSelector::FileSelector, OFileSelector::Normal,
+ QDir::homeDirPath(), QString::null );
+ splitter->addWidget( selector, "zoom", tr("Selector 2") );
+
+}
diff --git a/libopie/big-screen/example/osplitter_example.h b/libopie/big-screen/example/osplitter_example.h
new file mode 100644
index 0000000..ae8f120
--- a/dev/null
+++ b/libopie/big-screen/example/osplitter_example.h
@@ -0,0 +1,20 @@
+/*
+ * May be used, copied and modified wihtout any limitation
+ */
+
+#ifndef OSPlitter_EXAMPLE_H
+#define OSPlitter_EXAMPLE_H
+
+#include <qvbox.h>
+#include <opie/ofileselector.h>
+
+class OSplitterExample : public QWidget {
+ Q_OBJECT
+public:
+ static QString appName() { return QString::fromLatin1("osplitter_example"); }
+ OSplitterExample( QWidget *parent, const char* name, WFlags fl );
+
+};
+
+
+#endif
diff --git a/libopie/big-screen/example/osplitter_example.o b/libopie/big-screen/example/osplitter_example.o
new file mode 100644
index 0000000..e52d5d9
--- a/dev/null
+++ b/libopie/big-screen/example/osplitter_example.o
Binary files differ
diff --git a/libopie/big-screen/example/osplitter_example.pro b/libopie/big-screen/example/osplitter_example.pro
new file mode 100644
index 0000000..b12bf17
--- a/dev/null
+++ b/libopie/big-screen/example/osplitter_example.pro
@@ -0,0 +1,13 @@
+CONFIG = qt warn_on
+TEMPLATE = app
+TARGET = osplitter_example
+
+HEADERS = osplitter_example.h ../osplitter.h
+SOURCES = osplitter_example.cpp ../osplitter.cpp
+
+INCLUDEPATH += $(OPIEDIR)/include ../
+DEPENDSPATH += $(OPIEDIR)/include
+
+LIBS += -lqpe -lopie
+
+include ( $(OPIEDIR)/include.pro ) \ No newline at end of file
diff --git a/libopie/big-screen/obigscreen_p.h b/libopie/big-screen/obigscreen_p.h
new file mode 100644
index 0000000..ed256d9
--- a/dev/null
+++ b/libopie/big-screen/obigscreen_p.h
@@ -0,0 +1,20 @@
+#ifndef OPIE_BIG_SCREEN_PRIVATE
+#define OPIE_BIG_SCREEN_PRIVATE
+
+namespace Opie {
+
+struct OSplitterContainer {
+ bool operator==( const OSplitterContainer& o)const {
+ if (widget != o.widget ) return false;
+ if (icon != o.icon ) return false;
+ if (name != o.name ) return false;
+ return true;
+ }
+ QWidget* widget;
+ QString icon;
+ QString name;
+};
+
+}
+
+#endif
diff --git a/libopie/big-screen/osplitter.cpp b/libopie/big-screen/osplitter.cpp
index dcb5cc5..ce53ee1 100644
--- a/libopie/big-screen/osplitter.cpp
+++ b/libopie/big-screen/osplitter.cpp
@@ -13,201 +13,306 @@
     +  .  -:.       = it will be useful, but WITHOUT ANY WARRANTY;
    : ..    .:,     . . . without even the implied warranty of
    =_        +     =;=|` MERCHANTABILITY or FITNESS FOR A
  _.=:.       :    :=>`: PARTICULAR PURPOSE. See the GNU
..}^=.=       =       ; Library General Public License for more
++=   -.     .`     .: details.
 :     =  ...= . :.=-
 -.   .:....=;==+<; You should have received a copy of the GNU
  -_. . .   )=.  = Library General Public License along with
    --        :-=` this library; see the file COPYING.LIB.
If not, write to the Free Software Foundation,
Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA.
*/
#include <qvaluelist.h>
#include <qvbox.h>
#include <opie/otabwidget.h>
#include "osplitter.h"
-struct OSplitterContainer {
- QWidget* widget;
- const QString& icon
- const QString& name;
-};
-
-
/**
*
* This is the constructor of OSplitter
* You might want to call setSizeChange to tell
* OSplitter to change its layout when a specefic
* mark was crossed. OSplitter sets a default value.
*
* You cann add widget with addWidget to the OSplitter.
*
* @param orient The orientation wether to layout horizontal or vertical
* @param parent The parent of this widget
* @param name The name passed on to QObject
* @param fl Additional widgets flags passed to QWidget
*
* @short single c'tor of the OSplitter
*/
OSplitter::OSplitter( Orientation orient, QWidget* parent, const char* name, WFlags fl )
- : QWidget( parent, name, fl )
+ : QFrame( parent, name, fl )
{
m_orient = orient;
m_hbox = 0;
- m_tabWidget = 0;
m_size_policy = 330;
+ setFontPropagation( AllChildren );
+ setPalettePropagation( AllChildren );
+
+ m_tabWidget = new OTabWidget(this);
}
/**
* Destructor destructs this object and cleans up. All child
* widgets will be deleted
* @see addWidget
*/
OSplitter::~OSplitter() {
delete m_hbox;
delete m_tabWidget;
}
/**
* This function sets the size change policy of the splitter.
* If this size marked is crossed the splitter will relayout.
* Note that depending on the set Orientation it'll either look
* at the width or height.
*
* @param width_height The mark that will be watched. Interpreted depending on the Orientation of the Splitter.
* @return void
*/
void OSplitter::setSizeChange( int width_height ) {
m_size_policy = width_height;
- relayout();
+ QSize sz(width(), height() );
+ QResizeEvent ev(sz, sz );
+ resizeEvent(&ev);
}
/**
* Adds a widget to the Splitter. The widgets gets inserted
* at the end of either the Box or TabWidget.
* Ownership gets transfered and the widgets gets reparented.
* Note: icon and label is only available on small screensizes
* if size is smaller than the mark
* Warning: No null checking of the widget is done. Only on debug
* a message will be outputtet
*
* @param wid The widget which will be added
* @param icon The icon of the possible Tab
* @param label The label of the possible Tab
*/
void OSplitter::addWidget( QWidget* wid, const QString& icon, const QString& label ) {
#ifdef DEBUG
if (!wid ) {
qWarning("Widget is not valid!");
return;
}
#endif
- OSplitterContainer cont;
+ Opie::OSplitterContainer cont;
cont.widget = wid;
cont.icon =icon;
- cont.label = label;
+ cont.name = label;
m_container.append( cont );
if (m_hbox )
addToBox( cont );
else
addToTab( cont );
}
/**
- * Removes the widget from the tab widgets. OSplitter drops ownership
- * of this widget and the widget will be reparented to 0.
+ * Removes the widget from the tab widgets if necessary.
+ * OSplitter drops ownership of this widget and the widget
+ * will be reparented i tto 0.
* The widget will not be deleted.
*
* @param w The widget to be removed
*/
void OSplitter::removeWidget( QWidget* w) {
- /* if not widget nor parent or parent not any of my master childs return */
- if (!w && w->parent() && ( w->parent() != m_hbox || w->parent() != m_tabWidget ) )
+ ContainerList::Iterator it;
+ for ( it = m_container.begin(); it != m_container.end(); ++it )
+ if ( (*it).widget == w )
+ break;
+
+ if (it == m_container.end() )
return;
+
/* only tab needs to be removed.. box recognizes it */
if ( !m_hbox )
removeFromTab( w );
- /* Find the widget, reparent it and remove it from our list */
- ContainerList::Iterator it;
- for ( it = m_container.begin(); it != m_container.end(); ++it )
- if ( (*it).widget == w ) {
- w.reparent( 0, w.getWFlags );
- it = m_container.remove( it );
- break;
- }
+ /* Find reparent it and remove it from our list */
+ w->reparent( 0, 0, QPoint(0, 0));
+ it = m_container.remove( it );
}
/**
* This method will give focus to the widget. If in a tabwidget
* the tabbar will be changed
*
* @param w The widget which will be set the current one
*/
void OSplitter::setCurrentWidget( QWidget* w) {
if (m_tabWidget )
- m_tabWidget->setCurrentWidget( w );
- else
- m_hbox->setFocus( w );
+ m_tabWidget->setCurrentTab( w );
+// else
+ // m_hbox->setFocus( w );
}
/**
- * This is an overloaded member function and only differs in the argument it takes.
+ * This is an overloaded member function and only differs in the
+ * argument it takes.
* Searches list of widgets for label. It'll pick the first label it finds
*
* @param label Label to look for. First match will be taken
*/
void OSplitter::setCurrentWidget( const QString& label ) {
ContainerList::Iterator it;
for (it = m_container.begin(); it != m_container.end(); ++it ) {
if ( (*it).name == label ) {
setCurrentWidget( (*it).widget );
break;
}
}
}
/**
- * return the currently activated widget if in tab widget moud
+ * return the currently activated widget if in tab widget mode
* or null because all widgets are visible
*/
QWidget* OSplitter::currentWidget() {
if ( m_hbox )
return 0l;
else
return m_tabWidget->currentWidget();
}
-
+#if 0
/**
* @reimplented for internal reasons
* returns the sizeHint of one of its sub widgets
*/
QSize OSplitter::sizeHint()const {
+ if (m_hbox )
+ return m_hbox->sizeHint();
+ else
+ return m_tabWidget->sizeHint();
}
+#endif
/**
* @reimplemented for internal reasons
*/
void OSplitter::resizeEvent( QResizeEvent* res ) {
+ QFrame::resizeEvent( res );
+ /*
+ *
+ */
+// qWarning("Old size was width = %d height = %d", res->oldSize().width(), res->oldSize().height() );
+// qWarning("New size is width = %d height = %d", res->size().width(), res->size().height() );
+ if ( res->size().width() > m_size_policy &&
+ m_orient == Horizontal ) {
+ changeHBox();
+ }else if ( (res->size().width() <= m_size_policy &&
+ m_orient == Horizontal ) ||
+ (res->size().height() <= m_size_policy &&
+ m_orient == Vertical ) ) {
+ changeTab();
+ }else if ( res->size().height() > m_size_policy &&
+ m_size_policy == Vertical ) {
+ changeVBox();
+ }
+}
+
+
+void OSplitter::addToTab( const Opie::OSplitterContainer& con ) {
+ QWidget *wid = con.widget;
+// not needed widgetstack will reparent as well wid.reparent(m_tabWidget, wid->getWFlags(), QPoint(0, 0) );
+ m_tabWidget->addTab( wid, con.icon, con.name );
+}
+
+void OSplitter::addToBox( const Opie::OSplitterContainer& con ) {
+ QWidget* wid = con.widget;
+ wid->reparent(m_hbox, 0, QPoint(0, 0) );
+}
+void OSplitter::removeFromTab( QWidget* wid ) {
+ m_tabWidget->removePage( wid );
+}
+
+void OSplitter::changeTab() {
+ if (m_tabWidget ) {
+ m_tabWidget->setGeometry( frameRect() );
+ return;
+ }
+
+ qWarning(" New Tab Widget ");
+ /*
+ * and add all widgets this will reparent them
+ * delete m_hbox set it to 0
+ *
+ */
+ m_tabWidget = new OTabWidget( this );
+
+ for ( ContainerList::Iterator it = m_container.begin(); it != m_container.end(); ++it ) {
+ qWarning("Widget is %s", (*it).name.latin1() );
+ addToTab( (*it) );
+ }
+
+ delete m_hbox;
+ m_hbox = 0;
+ m_tabWidget->setGeometry( frameRect() );
+ m_tabWidget->show();
+
+}
+
+void OSplitter::changeHBox() {
+ if (m_hbox ) {
+ m_hbox->setGeometry( frameRect() );
+ return;
+ }
+
+ qWarning("new HBox");
+ m_hbox = new QHBox( this );
+ commonChangeBox();
+ delete m_tabWidget;
+ m_tabWidget = 0;
+ m_hbox->setGeometry( frameRect() );
+ m_hbox->show();
+}
+
+void OSplitter::changeVBox() {
+ if (m_hbox ) {
+ m_hbox->setGeometry( frameRect() );
+ return;
+ }
+
+ qWarning("New VBOX");
+ m_hbox = new QVBox( this );
+
+ commonChangeBox();
+ delete m_tabWidget;
+ m_tabWidget = 0;
+ m_hbox->setGeometry( frameRect() );
+ m_hbox->show();
+}
+
+
+void OSplitter::commonChangeBox() {
+ for (ContainerList::Iterator it = m_container.begin(); it != m_container.end(); ++it ) {
+ qWarning("Adding to box %s", (*it).name.latin1() );
+ addToBox( (*it) );
+ }
+ delete m_tabWidget;
+ m_tabWidget = 0;
}
diff --git a/libopie/big-screen/osplitter.h b/libopie/big-screen/osplitter.h
index 05849af..bc4f80b 100644
--- a/libopie/big-screen/osplitter.h
+++ b/libopie/big-screen/osplitter.h
@@ -10,93 +10,95 @@
     ._= =}       : or (at your option) any later version.
    .%`+i>       _;_.
    .i_,=:_.      -<s. This library is distributed in the hope that
     +  .  -:.       = it will be useful, but WITHOUT ANY WARRANTY;
    : ..    .:,     . . . without even the implied warranty of
    =_        +     =;=|` MERCHANTABILITY or FITNESS FOR A
  _.=:.       :    :=>`: PARTICULAR PURPOSE. See the GNU
..}^=.=       =       ; Library General Public License for more
++=   -.     .`     .: details.
 :     =  ...= . :.=-
 -.   .:....=;==+<; You should have received a copy of the GNU
  -_. . .   )=.  = Library General Public License along with
    --        :-=` this library; see the file COPYING.LIB.
If not, write to the Free Software Foundation,
Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA.
*/
#ifndef OPIE_SPLITTER_H
#define OPIE_SPLITTER_H
#include <qstring.h>
-#include <qwidget.h>
+#include <qframe.h>
#include <qvaluelist.h>
+#include "obigscreen_p.h"
/* forward declarations */
class OTabWidget;
class QHBox;
-struct OSplitterContainer;
-template class QValueList<OSplitterContainer>;
+//template class QValueList<Opie::OSplitterContainer>;
/**
*
* If you've widgets that could be placed side by side but you think
* on small resolutions is not enough place but it would really make sense
* on bigger resolutions this class will help you.
* You can add as many widgets you want to it. Set a poliy on which width/height it
* should switch the layout.
* You can either say to place widgets vertical or horizontal.
* This class uses QHBox, QVBox and QTAbWidget internally.
* OSplitter takes ownership of the widgets
*
* @since 1.2
*
* @short a small dynamically changing its layout to store two or more widgets side by side
* @version 0.1
* @author zecke
*/
-class OSplitter : public QWidget{
+class OSplitter : public QFrame{
Q_OBJECT
public:
- typedef QValueList<OSplitterContainer> ContainerList;
+ typedef QValueList<Opie::OSplitterContainer> ContainerList;
OSplitter( Qt::Orientation = Horizontal, QWidget *parent = 0,
const char* name = 0, WFlags fl = 0 );
~OSplitter();
void setSizeChange( int width_height );
void addWidget( QWidget* wid, const QString& icon, const QString& label );
void removeWidget( QWidget* );
void setCurrentWidget( QWidget* );
void setCurrentWidget( const QString& label );
QWidget* currentWidget();
- QSize sizeHint()const;
+// QSize sizeHint()const;
protected:
void resizeEvent( QResizeEvent* );
private:
- void relayout();
- void addToTab( const OSplitterContainer& );
- void addToBox( const OSplitterContainer& );
+ void addToTab( const Opie::OSplitterContainer& );
+ void addToBox( const Opie::OSplitterContainer& );
void removeFromTab( QWidget* );
- void removeFromBox( QWidget* );
+ void changeTab();
+ void changeHBox();
+ void changeVBox();
+ void commonChangeBox();
QHBox *m_hbox;
OTabWidget *m_tabWidget;
Orientation m_orient;
int m_size_policy;
ContainerList m_container;
struct Private;
Private *d;
};
#endif