summaryrefslogtreecommitdiff
path: root/libopie/big-screen
authorzecke <zecke>2003-08-30 20:28:13 (UTC)
committer zecke <zecke>2003-08-30 20:28:13 (UTC)
commit43bcb5d6caf7bf2e8a31b61b7284a7c9299b6fd7 (patch) (side-by-side diff)
tree020698c057a9193c9547415a65defe004534ab89 /libopie/big-screen
parent2f7bf038add502d20ab4c4e7faadba72e03d68fd (diff)
downloadopie-43bcb5d6caf7bf2e8a31b61b7284a7c9299b6fd7.zip
opie-43bcb5d6caf7bf2e8a31b61b7284a7c9299b6fd7.tar.gz
opie-43bcb5d6caf7bf2e8a31b61b7284a7c9299b6fd7.tar.bz2
Add IDEAS for Opie bigscreen extensions
and the first sketch of the OSplitter please take a look and comment
Diffstat (limited to 'libopie/big-screen') (more/less context) (show whitespace changes)
-rw-r--r--libopie/big-screen/IDEAS81
-rw-r--r--libopie/big-screen/osplitter.cpp213
-rw-r--r--libopie/big-screen/osplitter.h102
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