-rw-r--r-- | libopie/big-screen/IDEAS | 81 | ||||
-rw-r--r-- | libopie/big-screen/osplitter.cpp | 213 | ||||
-rw-r--r-- | libopie/big-screen/osplitter.h | 102 |
3 files changed, 396 insertions, 0 deletions
diff --git a/libopie/big-screen/IDEAS b/libopie/big-screen/IDEAS new file mode 100644 index 0000000..27a4d6e --- a/dev/null +++ b/libopie/big-screen/IDEAS @@ -0,0 +1,81 @@ +Now that PDAs get a VGA resolution and Opie runs on Webpads +and could be used as a Kiosk secure environment the design +decision that were right for a 320x240/240x320 doesn't necessary +to be right for bigger screens. + +Remember most desktops a few years ago had only a resolution +of 800x600. +Then also to remember is that a webpad with 640x480 is different to +a PDA with the same resolution. The PDA has a much smaller +physical display. + +With higher resolution the feeling of a desktop comes. + +Problems with current Opie: + -InputMethod use full width but most of the times are not high enough + This actually makes it harder to input and looks stupid. + -ToolBars only feels strange on bigger screens. Maybe do it like WinCE3 does + share the ToolBar with MenuBar if they're too big for the screen allow handles + to either show the left or right side. Note that the handle from Qt looks + bad and should be patched away + -The Escape/Close back to View does not make sense on bigger screens and desktop + on a desktop you might even want to show multiple views and detach from the 'system' + view + -Modality. Dunnow how you get back to the enter dialog without modality in Qt/E fix it? + On bigger screen this is not the problem you can move windows. But you should try + to be less modal in the future. + I've added a small to qpeapplication to iterate over the toplevel widgets 99% + ( click on the taskbar to iterate over the widgets first time nothing is changed ) + , BUT it should be avoided to use modality showMaximized(), exec() + INSTEAD we will use a modal helper where one can register to show a dialog for uid + type and will get a signal once the settings need to be applied, rejected or discarded. + This way you can almost work like with exec(), do not need to care for freeing. + Problems sometimes to have more than one dialog in memory is expensive. Allow queueing + and reusing this widget ( only set the Record new? ) + -Viewing on bigger screens you may want to have a seperate viewer widget ( topLevel ) which + might also get spon off from the normal operation. The (X) close go back does not make + sense on bigger screens and feels strange + -Sizing and Auto sizing of widgets + +Widgets and Classes + + Toolbar/Action and Popups: + While KParts with XMLGUI provide a fantastic technology to change the GUI + on the fly. Parsing these GUI descriptions is not an option for PDAs + specially not on start up. + Instead we will need to use normal object in this case QAction and QPopupMenuss. We + will then group these Actions into groups. Each group can have children and one + parent. Each group has two attributes one for the menubar and one for the toolbar. + Attributes for each might be | together. Always, Never, Auto are the attributes I + can think of tonite. Always will place this group always there, Never yeah never, + Automatic lets the later described Manager decide. Also one could or MightSpinOff + to a group. This way a child group might get spon off if enough place is there. + You cann add QAction and QPopupMenus to the group the Group will not take owner ship + and you might use your QAction in other places as well. + Toplevel groups need to be registered to the manager and this manager will depending + on global settings place and control MenuBar and ToolBar/ToolBar. + This allows to dynamically create toolbar on the fly + + Modality class: + It'll be a template with a QSignal to tell about changes and a method to get to know + which action to be applied. It has three template parameters one for the WIdget used + and one for the type of uid and the last for the editor widget which + at least needs to provide some methods as well. + If you need to edit an widget you simply tell the helper about it. If present it'll + raise the widget or either queue it or create a new editor depending on a policy + one can set manually or get from the system. + + Viewing: + We will provide a special OWidgetStack which either is a real QWidgetStack or a QList + of toplevel widgets to be raised. One has to see how one can use it with todolist + and datebook. specially the switching back and forth need to be handled but with possible + no code reordering ( least intrusive ) + Viewing II: + Example Advanced FM has a tabwidget but on a SIMpad it would make perfect sense to use a + QSplitter or QVBox. We will provide an OSplitter which either provides the one + or the other widget depending on the size + + +These small changes ( replacing Q with O + bit more) should make Opie a better environment for +bigger screens. The additional library memory is a fair trade off and memory can be recovered +by other technics
\ No newline at end of file diff --git a/libopie/big-screen/osplitter.cpp b/libopie/big-screen/osplitter.cpp new file mode 100644 index 0000000..dcb5cc5 --- a/dev/null +++ b/libopie/big-screen/osplitter.cpp @@ -0,0 +1,213 @@ +/* + =. This file is part of the OPIE Project + .=l. Copyright (c) 2002 hOlgAr <zecke@handhelds.org> + .>+-= + _;:, .> :=|. This library is free software; you can +.> <`_, > . <= redistribute it and/or modify it under +:`=1 )Y*s>-.-- : the terms of the GNU Library General Public +.="- .-=="i, .._ License as published by the Free Software + - . .-<_> .<> Foundation; either version 2 of the License, + ._= =} : 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. + +*/ + +#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 ) +{ + m_orient = orient; + m_hbox = 0; + m_tabWidget = 0; + m_size_policy = 330; +} + + +/** + * 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(); +} + +/** + * 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; + cont.widget = wid; + cont.icon =icon; + cont.label = 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. + * 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 ) ) + 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; + } + + +} + + +/** + * 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 ); + +} + +/** + * 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 + * or null because all widgets are visible + */ +QWidget* OSplitter::currentWidget() { + if ( m_hbox ) + return 0l; + else + return m_tabWidget->currentWidget(); +} + + +/** + * @reimplented for internal reasons + * returns the sizeHint of one of its sub widgets + */ +QSize OSplitter::sizeHint()const { +} + +/** + * @reimplemented for internal reasons + */ +void OSplitter::resizeEvent( QResizeEvent* res ) { + +} diff --git a/libopie/big-screen/osplitter.h b/libopie/big-screen/osplitter.h new file mode 100644 index 0000000..05849af --- a/dev/null +++ b/libopie/big-screen/osplitter.h @@ -0,0 +1,102 @@ +/* + =. This file is part of the OPIE Project + .=l. Copyright (c) 2002 hOlgAr <zecke@handhelds.org> + .>+-= + _;:, .> :=|. This library is free software; you can +.> <`_, > . <= redistribute it and/or modify it under +:`=1 )Y*s>-.-- : the terms of the GNU Library General Public +.="- .-=="i, .._ License as published by the Free Software + - . .-<_> .<> Foundation; either version 2 of the License, + ._= =} : 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 <qvaluelist.h> + + +/* forward declarations */ +class OTabWidget; +class QHBox; +struct OSplitterContainer; +template class QValueList<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{ + Q_OBJECT +public: + typedef QValueList<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; + +protected: + void resizeEvent( QResizeEvent* ); + +private: + void relayout(); + void addToTab( const OSplitterContainer& ); + void addToBox( const OSplitterContainer& ); + void removeFromTab( QWidget* ); + void removeFromBox( QWidget* ); + QHBox *m_hbox; + OTabWidget *m_tabWidget; + Orientation m_orient; + int m_size_policy; + + ContainerList m_container; + + struct Private; + Private *d; +}; + + +#endif |