-rw-r--r-- | noncore/net/mail/accountview.cpp | 11 | ||||
-rw-r--r-- | noncore/net/mail/accountview.h | 2 | ||||
-rw-r--r-- | noncore/net/mail/defines.h | 2 | ||||
-rw-r--r-- | noncore/net/mail/mainwindow.cpp | 7 | ||||
-rw-r--r-- | noncore/net/mail/mainwindow.h | 4 | ||||
-rw-r--r-- | noncore/net/mail/opiemail.cpp | 13 | ||||
-rw-r--r-- | noncore/net/mail/opiemail.h | 3 | ||||
-rw-r--r-- | noncore/net/mail/settingsdialog.cpp | 4 | ||||
-rw-r--r-- | noncore/net/mail/settingsdialogui.ui | 30 |
9 files changed, 69 insertions, 7 deletions
diff --git a/noncore/net/mail/accountview.cpp b/noncore/net/mail/accountview.cpp index 1183704..0e739e2 100644 --- a/noncore/net/mail/accountview.cpp +++ b/noncore/net/mail/accountview.cpp @@ -1,232 +1,241 @@ #include "accountview.h" #include "accountitem.h" #include "selectstore.h" #include <libmailwrapper/settings.h> #include <libmailwrapper/mailwrapper.h> #include <libmailwrapper/mailtypes.h> #include <libmailwrapper/abstractmail.h> /* OPIE */ #include <opie2/odebug.h> #include <qpe/qpeapplication.h> +#include <qpe/config.h> /* QT */ #include <qmessagebox.h> #include <qpopupmenu.h> using namespace Opie::Core; AccountView::AccountView( QWidget *parent, const char *name, WFlags flags ) : QListView( parent, name, flags ) { setSorting(0); setSelectionMode(Single); m_rightPressed = false; connect( this, SIGNAL( selectionChanged(QListViewItem*) ), SLOT( slotSelectionChanged(QListViewItem*) ) ); connect( this, SIGNAL( mouseButtonPressed(int,QListViewItem*,const QPoint&,int) ),this, SLOT( slotMouseButton(int,QListViewItem*,const QPoint&,int) ) ); connect( this, SIGNAL(clicked(QListViewItem*) ),this, SLOT( slotMouseClicked(QListViewItem*) ) ); m_currentItem = 0; + readSettings(); } AccountView::~AccountView() { imapAccounts.clear(); mhAccounts.clear(); } +void AccountView::readSettings() +{ + Config cfg("mail"); + cfg.setGroup( "Settings" ); + m_clickopens = cfg.readBoolEntry("clickOpensFolder",true); +} + void AccountView::slotSelectionChanged(QListViewItem*item) { if (!item) { emit serverSelected(0); return; } AccountViewItem *view = static_cast<AccountViewItem *>(item); emit serverSelected(view->isServer()); } QMap<int,QString> AccountView::currentServerMenu()const { QMap<int,QString> smap; AccountViewItem *view = static_cast<AccountViewItem *>(currentItem()); if (!view)return smap; smap = view->serverMenu(); return smap; } QMap<int,QString> AccountView::currentFolderMenu()const { QMap<int,QString> fmap; AccountViewItem *view = static_cast<AccountViewItem *>(currentItem()); if (!view)return fmap; fmap = view->folderMenu(); return fmap; } void AccountView::slotContextMenu(int id) { AccountViewItem *view = static_cast<AccountViewItem *>(currentItem()); if (!view) return; bool del = view->contextMenuSelected(id); if (!del && view->isServer()!=2) { emit refreshMenues(view->isServer()); } } void AccountView::slotRightButton(int, QListViewItem * item,const QPoint&,int) { m_rightPressed = true; if (!item) return; AccountViewItem *view = static_cast<AccountViewItem *>(item); QPopupMenu*m = view->getContextMenu(); if (!m) return; connect(m,SIGNAL(activated(int)),this,SLOT(slotContextMenu(int))); m->setFocus(); m->exec( QPoint( QCursor::pos().x(), QCursor::pos().y()) ); delete m; } void AccountView::slotLeftButton(int, QListViewItem *,const QPoint&,int) { m_rightPressed = false; } void AccountView::slotMouseClicked(QListViewItem*item) { if (m_rightPressed) return; - if (!item || m_currentItem == item) return; + if (!item || m_currentItem == item||!m_clickopens) return; /* ### ToDo check settings if on single tab it should open */ m_currentItem = item; refresh(m_currentItem); } void AccountView::slotMouseButton(int button, QListViewItem * item,const QPoint&pos,int column) { if (button==1) { slotLeftButton(button,item,pos,column); } else if (button==2) { slotRightButton(button,item,pos,column); } } void AccountView::populate( QList<Account> list ) { clear(); imapAccounts.clear(); mhAccounts.clear(); mhAccounts.append(new MHviewItem(AbstractMail::defaultLocalfolder(),this)); Account *it; for ( it = list.first(); it; it = list.next() ) { if ( it->getType() == MAILLIB::A_IMAP ) { IMAPaccount *imap = static_cast<IMAPaccount *>(it); odebug << "added IMAP " + imap->getAccountName() << oendl; imapAccounts.append(new IMAPviewItem( imap, this )); } else if ( it->getType() == MAILLIB::A_POP3 ) { POP3account *pop3 = static_cast<POP3account *>(it); odebug << "added POP3 " + pop3->getAccountName() << oendl; /* must not be hold 'cause it isn't required */ (void) new POP3viewItem( pop3, this ); } else if ( it->getType() == MAILLIB::A_NNTP ) { NNTPaccount *nntp = static_cast<NNTPaccount *>(it); odebug << "added NNTP " + nntp->getAccountName() << oendl; /* must not be hold 'cause it isn't required */ (void) new NNTPviewItem( nntp, this ); } else if ( it->getType() == MAILLIB::A_MH ) { } } } void AccountView::refresh(QListViewItem *item) { odebug << "AccountView refresh..." << oendl; if ( item ) { m_currentItem = item; QValueList<RecMailP> headerlist; AccountViewItem *view = static_cast<AccountViewItem *>(item); view->refresh(headerlist); emit refreshMailview(headerlist); } } void AccountView::refreshCurrent() { m_currentItem = currentItem(); if ( !m_currentItem ) return; QValueList<RecMailP> headerlist; AccountViewItem *view = static_cast<AccountViewItem *>(m_currentItem); view->refresh(headerlist); emit refreshMailview(headerlist); } void AccountView::refreshAll() { } RecBodyP AccountView::fetchBody(const RecMailP&aMail) { QListViewItem*item = selectedItem (); if (!item) return new RecBody(); AccountViewItem *view = static_cast<AccountViewItem *>(item); return view->fetchBody(aMail); } void AccountView::setupFolderselect(Selectstore*sels) { QPEApplication::showDialog( sels ); QStringList sFolders; unsigned int i = 0; for (i=0; i < mhAccounts.count();++i) { mhAccounts[i]->refresh(false); sFolders = mhAccounts[i]->subFolders(); sels->addAccounts(mhAccounts[i]->getWrapper(),sFolders); } for (i=0; i < imapAccounts.count();++i) { if (imapAccounts[i]->offline()) continue; imapAccounts[i]->refreshFolders(false); sels->addAccounts(imapAccounts[i]->getWrapper(),imapAccounts[i]->subFolders()); } } void AccountView::downloadMails(const FolderP&fromFolder,AbstractMail*fromWrapper) { AbstractMail*targetMail = 0; QString targetFolder = ""; Selectstore sels; setupFolderselect(&sels); if (!sels.exec()) return; targetMail = sels.currentMail(); targetFolder = sels.currentFolder(); if ( (fromWrapper==targetMail && fromFolder->getName()==targetFolder) || targetFolder.isEmpty()) { return; } if (sels.newFolder() && !targetMail->createMbox(targetFolder)) { QMessageBox::critical(0,tr("Error creating new Folder"), tr("<center>Error while creating<br>new folder - breaking.</center>")); return; } odebug << "Targetfolder: " << targetFolder.latin1() << "" << oendl; odebug << "Fromfolder: " << fromFolder->getName().latin1() << "" << oendl; fromWrapper->mvcpAllMails(fromFolder,targetFolder,targetMail,sels.moveMails()); refreshCurrent(); } bool AccountView::currentisDraft() { AccountViewItem *view = static_cast<AccountViewItem *>(currentItem()); if (!view) return false; return view->isDraftfolder(); } diff --git a/noncore/net/mail/accountview.h b/noncore/net/mail/accountview.h index 5c4b559..418f4f3 100644 --- a/noncore/net/mail/accountview.h +++ b/noncore/net/mail/accountview.h @@ -1,58 +1,60 @@ #ifndef ACCOUNTVIEW_H #define ACCOUNTVIEW_H #include <libmailwrapper/mailtypes.h> #include <opie2/osmartpointer.h> #include <qlistview.h> #include <qlist.h> #include <qmap.h> class Selectstore; class Folder; class AbstractMail; class Account; class IMAPviewItem; class MHviewItem; class AccountView : public QListView { Q_OBJECT public: AccountView( QWidget *parent = 0, const char *name = 0, WFlags flags = 0 ); virtual ~AccountView(); virtual void populate( QList<Account> list ); virtual RecBodyP fetchBody(const Opie::Core::OSmartPointer<RecMail>&aMail); virtual void downloadMails(const Opie::Core::OSmartPointer<Folder>&fromFolder,AbstractMail*fromWrapper); virtual bool currentisDraft(); QMap<int,QString> currentServerMenu()const; QMap<int,QString> currentFolderMenu()const; public slots: virtual void refreshAll(); virtual void refresh(QListViewItem *item); virtual void refreshCurrent(); virtual void slotContextMenu(int id); + virtual void readSettings(); void setupFolderselect(Selectstore*sels); signals: void refreshMailview(const QValueList<RecMailP>& ); void serverSelected(int); void refreshMenues(int); protected: QListViewItem* m_currentItem; QValueList<IMAPviewItem*> imapAccounts; QValueList<MHviewItem*> mhAccounts; bool m_rightPressed:1; + bool m_clickopens:1; protected slots: virtual void slotRightButton(int, QListViewItem *,const QPoint&,int); virtual void slotLeftButton(int, QListViewItem *,const QPoint&,int); virtual void slotMouseButton(int, QListViewItem *,const QPoint&,int); virtual void slotMouseClicked(QListViewItem*); virtual void slotSelectionChanged(QListViewItem*); }; #endif diff --git a/noncore/net/mail/defines.h b/noncore/net/mail/defines.h index 5fcbf0f..50d63dd 100644 --- a/noncore/net/mail/defines.h +++ b/noncore/net/mail/defines.h @@ -1,70 +1,72 @@ #ifndef DEFINE_CONSTANTS_H #define DEFINE_CONSTANTS_H #include <qpe/resource.h> #define USER_AGENT "OpieMail v0.3" #define PIC_COMPOSEMAIL "mail/composemail" #define PIC_SENDQUEUED "mail/sendqueued" #define PIC_SHOWFOLDERS "mail/showfolders" #define PIC_SYNC "mail/sync" #define PIC_IMAPFOLDER "mail/imapfolder" #define PIC_MBOXFOLDER "mail/mboxfolder" #define PIC_POP3FOLDER "mail/pop3folder" #define PIC_INBOXFOLDER "mail/inbox" #define PIC_OUTBOXFOLDER "mail/outbox" #define PIC_LOCALFOLDER "mail/localfolder" #define PIC_OFFLINE "mail/notconnected" +#define PIC_DOCUMENT "DocsIcon" #define ICON_COMPOSEMAIL QIconSet( Resource::loadPixmap( PIC_COMPOSEMAIL ) ) #define ICON_SENDQUEUED QIconSet( Resource::loadPixmap( PIC_SENDQUEUED ) ) #define ICON_SHOWFOLDERS QIconSet( Resource::loadPixmap( PIC_SHOWFOLDERS ) ) #define ICON_SEARCHMAILS QIconSet( Resource::loadPixmap( PIC_SEARCHMAILS ) ) #define ICON_EDITSETTINGS QIconSet( Resource::loadPixmap( PIC_EDITSETTINGS ) ) #define ICON_EDITACCOUNTS QIconSet( Resource::loadPixmap( PIC_EDITACCOUNTS ) ) #define ICON_SYNC QIconSet( Resource::loadPixmap( PIC_SYNC ) ) +#define ICON_READMAIL QIconSet( Resource::loadPixmap( PIC_DOCUMENT)) #define PIXMAP_IMAPFOLDER QPixmap( Resource::loadPixmap( PIC_IMAPFOLDER ) ) #define PIXMAP_POP3FOLDER QPixmap( Resource::loadPixmap( PIC_POP3FOLDER ) ) #define PIXMAP_INBOXFOLDER QPixmap( Resource::loadPixmap( PIC_INBOXFOLDER) ) #define PIXMAP_MBOXFOLDER QPixmap( Resource::loadPixmap( PIC_MBOXFOLDER ) ) #define PIXMAP_OUTBOXFOLDER QPixmap( Resource::loadPixmap( PIC_OUTBOXFOLDER) ) #define PIXMAP_LOCALFOLDER QPixmap( Resource::loadPixmap( PIC_LOCALFOLDER) ) #define PIXMAP_OFFLINE QPixmap( Resource::loadPixmap( PIC_OFFLINE) ) #define IMAP_PORT "143" #define IMAP_SSL_PORT "993" #define SMTP_PORT "25" #define SMTP_SSL_PORT "465" #define POP3_PORT "110" #define POP3_SSL_PORT "995" #define NNTP_PORT "119" #define NNTP_SSL_PORT "563" /* used for decoding imapfoldername */ #define UNDEFINED 64 #define MAXLINE 76 #define UTF16MASK 0x03FFUL #define UTF16SHIFT 10 #define UTF16BASE 0x10000UL #define UTF16HIGHSTART 0xD800UL #define UTF16HIGHEND 0xDBFFUL #define UTF16LOSTART 0xDC00UL #define UTF16LOEND 0xDFFFUL /* used for making menuids transparent */ #define FOLDER_MENU_REFRESH_HEADER 0 #define FOLDER_MENU_DELETE_ALL_MAILS 1 #define FOLDER_MENU_NEW_SUBFOLDER 2 #define FOLDER_MENU_DELETE_FOLDER 3 #define FOLDER_MENU_MOVE_MAILS 4 #define SERVER_MENU_DISCONNECT 5 #define SERVER_MENU_OFFLINE 6 #define SERVER_MENU_REFRESH_FOLDER 7 #define SERVER_MENU_CREATE_FOLDER 8 #define SERVER_MENU_SUBSCRIBE 9 #endif diff --git a/noncore/net/mail/mainwindow.cpp b/noncore/net/mail/mainwindow.cpp index 3689352..b587424 100644 --- a/noncore/net/mail/mainwindow.cpp +++ b/noncore/net/mail/mainwindow.cpp @@ -1,273 +1,280 @@ #include <qlabel.h> #include <qvbox.h> #include <qheader.h> #include <qtimer.h> #include <qlayout.h> #include <opie2/odebug.h> #include <qpe/qpeapplication.h> #include <qpe/qcopenvelope_qws.h> #include "defines.h" #include "mainwindow.h" using namespace Opie::Core; MainWindow::MainWindow( QWidget *parent, const char *name, WFlags flags ) : QMainWindow( parent, name, flags ) { setCaption( tr( "Mail" ) ); setToolBarsMovable( false ); toolBar = new QToolBar( this ); menuBar = new QMenuBar( toolBar ); mailMenu = new QPopupMenu( menuBar ); menuBar->insertItem( tr( "Mail" ), mailMenu ); settingsMenu = new QPopupMenu( menuBar ); menuBar->insertItem( tr( "Settings" ), settingsMenu ); if (QApplication::desktop()->width()<330) { serverMenu = new QPopupMenu( mailMenu ); folderMenu = new QPopupMenu( mailMenu ); m_ServerMenuId = mailMenu->insertItem( tr( "Server" ), serverMenu ); m_FolderMenuId = mailMenu->insertItem( tr( "Folder" ), folderMenu ); } else { serverMenu = new QPopupMenu( menuBar ); folderMenu = new QPopupMenu( menuBar ); m_FolderMenuId = menuBar->insertItem( tr( "Folder" ), folderMenu ); m_ServerMenuId = menuBar->insertItem( tr( "Server" ), serverMenu ); } serverMenu->insertItem(tr("Disconnect"),SERVER_MENU_DISCONNECT); serverMenu->insertItem(tr("Set on/offline"),SERVER_MENU_OFFLINE); serverMenu->insertSeparator(); serverMenu->insertItem(tr("Refresh folder list"),SERVER_MENU_REFRESH_FOLDER); serverMenu->insertItem(tr("Create new folder"),SERVER_MENU_CREATE_FOLDER); serverMenu->insertSeparator(); serverMenu->insertItem(tr("(Un-)Subscribe groups"),SERVER_MENU_SUBSCRIBE); folderMenu->insertItem(tr("Refresh headerlist"),FOLDER_MENU_REFRESH_HEADER); folderMenu->insertItem(tr("Delete all mails"),FOLDER_MENU_DELETE_ALL_MAILS); folderMenu->insertItem(tr("New subfolder"),FOLDER_MENU_NEW_SUBFOLDER); folderMenu->insertItem(tr("Delete folder"),FOLDER_MENU_DELETE_FOLDER); folderMenu->insertItem(tr("Move/Copie all mails"),FOLDER_MENU_MOVE_MAILS); menuBar->setItemEnabled(m_ServerMenuId,false); menuBar->setItemEnabled(m_FolderMenuId,false); addToolBar( toolBar ); toolBar->setHorizontalStretchable( true ); QLabel *spacer = new QLabel( toolBar ); spacer->setBackgroundMode( QWidget::PaletteButton ); toolBar->setStretchableWidget( spacer ); + readMail = new QAction(tr("Read current mail"),ICON_READMAIL,0,0,this); + readMail->addTo(toolBar); + readMail->addTo(mailMenu); + connect(readMail,SIGNAL(activated()),this,SLOT(displayMail())); + composeMail = new QAction( tr( "Compose new mail" ), ICON_COMPOSEMAIL, 0, 0, this ); composeMail->addTo( toolBar ); composeMail->addTo( mailMenu ); + sendQueued = new QAction( tr( "Send queued mails" ), ICON_SENDQUEUED, 0, 0, this ); sendQueued->addTo( toolBar ); sendQueued->addTo( mailMenu ); /* syncFolders = new QAction( tr( "Sync mailfolders" ), ICON_SYNC, 0, 0, this ); syncFolders->addTo( toolBar ); syncFolders->addTo( mailMenu ); */ showFolders = new QAction( tr( "Show/Hide folders" ), ICON_SHOWFOLDERS, 0, 0, this, 0, true ); showFolders->addTo( toolBar ); showFolders->addTo( mailMenu ); showFolders->setOn( true ); connect(showFolders, SIGNAL( toggled(bool) ), SLOT( slotShowFolders(bool) ) ); /* searchMails = new QAction( tr( "Search mails" ), QIconSet( Resource::loadPixmap("find") ), 0, 0, this ); searchMails->addTo( toolBar ); searchMails->addTo( mailMenu ); */ deleteMails = new QAction(tr("Delete Mail"), QIconSet( Resource::loadPixmap("trash")), 0, 0, this); deleteMails->addTo( toolBar ); deleteMails->addTo( mailMenu ); connect( deleteMails, SIGNAL( activated() ), SLOT( slotDeleteMail() ) ); editSettings = new QAction( tr( "Edit settings" ), QIconSet( Resource::loadPixmap("SettingsIcon") ) , 0, 0, this ); editSettings->addTo( settingsMenu ); connect( editSettings, SIGNAL( activated() ), SLOT( slotEditSettings() ) ); editAccounts = new QAction( tr( "Configure accounts" ), QIconSet( Resource::loadPixmap("mail/editaccounts") ) , 0, 0, this ); editAccounts->addTo( settingsMenu ); QWidget *view = new QWidget( this ); setCentralWidget( view ); layout = new QBoxLayout ( view, QBoxLayout::LeftToRight ); folderView = new AccountView( view ); folderView->header()->hide(); folderView->setRootIsDecorated( true ); folderView->addColumn( tr( "Mailbox" ) ); connect(folderView,SIGNAL(serverSelected(int)),this,SLOT(serverSelected(int))); connect(serverMenu,SIGNAL(activated(int)),folderView,SLOT(slotContextMenu(int))); connect(folderMenu,SIGNAL(activated(int)),folderView,SLOT(slotContextMenu(int))); + connect(this,SIGNAL(settingsChanged()),folderView,SLOT(readSettings())); layout->addWidget( folderView ); mailView = new QListView( view ); mailView->addColumn( "" ); mailView->addColumn( tr( "Subject" ),QListView::Manual ); mailView->addColumn( tr( "Sender" ),QListView::Manual ); mailView->addColumn( tr( "Size" ),QListView::Manual); mailView->addColumn( tr( "Date" )); mailView->setAllColumnsShowFocus(true); mailView->setShowSortIndicator(true); mailView->setSorting(4,false); layout->addWidget( mailView ); layout->setStretchFactor( folderView, 1 ); layout->setStretchFactor( mailView, 2 ); m_Rotate = (QApplication::desktop()->width() > QApplication::desktop()->height()?0:90); slotAdjustLayout(); QPEApplication::setStylusOperation( mailView->viewport(),QPEApplication::RightOnHold); QPEApplication::setStylusOperation( folderView->viewport(),QPEApplication::RightOnHold); connect( mailView, SIGNAL( mouseButtonClicked(int,QListViewItem*,const QPoint&,int) ),this, SLOT( mailLeftClicked(int,QListViewItem*,const QPoint&,int) ) ); connect( mailView, SIGNAL( mouseButtonPressed(int,QListViewItem*,const QPoint&,int) ),this, SLOT( mailHold(int,QListViewItem*,const QPoint&,int) ) ); connect(folderView, SIGNAL(refreshMailview(const QValueList<RecMailP>&)), this,SLOT(refreshMailView(const QValueList<RecMailP>&))); connect( composeMail, SIGNAL( activated() ), SLOT( slotComposeMail() ) ); connect( sendQueued, SIGNAL( activated() ), SLOT( slotSendQueued() ) ); // connect( searchMails, SIGNAL( activated() ), SLOT( slotSearchMails() ) ); connect( editAccounts, SIGNAL( activated() ), SLOT( slotEditAccounts() ) ); // Added by Stefan Eilers to allow starting by addressbook.. // copied from old mail2 #if !defined(QT_NO_COP) connect( qApp, SIGNAL( appMessage(const QCString&,const QByteArray&) ), this, SLOT( appMessage(const QCString&,const QByteArray&) ) ); m_sysChannel = new QCopChannel( "QPE/System", this ); connect( m_sysChannel, SIGNAL( received(const QCString&,const QByteArray&) ), this, SLOT( systemMessage(const QCString&,const QByteArray&) ) ); #endif QTimer::singleShot( 10, this, SLOT( slotAdjustColumns() ) ); } MainWindow::~MainWindow() { } void MainWindow::serverSelected(int) { odebug << "slotShowFolders not reached" << oendl; } void MainWindow::systemMessage( const QCString& msg, const QByteArray& data ) { int _newrotation; QDataStream stream( data, IO_ReadOnly ); if ( msg == "setCurrentRotation(int)" ) { stream >> _newrotation; if (m_Rotate != _newrotation) { slotAdjustLayout(); m_Rotate = _newrotation; } } } void MainWindow::appMessage(const QCString &, const QByteArray &) { odebug << "appMessage not reached" << oendl; } void MainWindow::slotAdjustLayout() { QWidget *d = QApplication::desktop(); if ( d->width() < d->height() ) { layout->setDirection( QBoxLayout::TopToBottom ); } else { layout->setDirection( QBoxLayout::LeftToRight ); } } void MainWindow::slotAdjustColumns() { bool hidden = folderView->isHidden(); if ( hidden ) folderView->show(); folderView->setColumnWidth( 0, folderView->visibleWidth() ); if ( hidden ) folderView->hide(); mailView->setColumnWidth( 0, 10 ); mailView->setColumnWidth( 1, mailView->visibleWidth() - 130 ); mailView->setColumnWidth( 2, 80 ); mailView->setColumnWidth( 3, 50 ); mailView->setColumnWidth( 4, 50 ); } void MainWindow::slotEditSettings() { } void MainWindow::slotShowFolders( bool ) { odebug << "slotShowFolders not reached" << oendl; } void MainWindow::refreshMailView(const QValueList<RecMailP>&) { odebug << "refreshMailView not reached" << oendl; } void MainWindow::mailLeftClicked(int, QListViewItem *,const QPoint&,int ) { odebug << "mailLeftClicked not reached" << oendl; } void MainWindow::displayMail() { odebug << "displayMail not reached" << oendl; } void MainWindow::slotDeleteMail() { odebug << "deleteMail not reached" << oendl; } void MainWindow::mailHold(int, QListViewItem *,const QPoint&,int ) { odebug << "mailHold not reached" << oendl; } void MainWindow::slotSendQueued() { } void MainWindow::slotEditAccounts() { } void MainWindow::slotComposeMail() { } diff --git a/noncore/net/mail/mainwindow.h b/noncore/net/mail/mainwindow.h index b781d62..6449ce8 100644 --- a/noncore/net/mail/mainwindow.h +++ b/noncore/net/mail/mainwindow.h @@ -1,61 +1,63 @@ #ifndef MAINWINDOW_H #define MAINWINDOW_H #include "accountview.h" #include <libmailwrapper/mailtypes.h> #include <opie2/osmartpointer.h> #include <qmainwindow.h> #include <qlistview.h> #include <qaction.h> #include <qtoolbar.h> #include <qmenubar.h> #include <qmap.h> class RecMail; class QCopChannel; class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow( QWidget *parent = 0, const char *name = 0, WFlags flags = 0 ); virtual ~MainWindow(); public slots: virtual void slotAdjustColumns(); virtual void appMessage(const QCString &msg, const QByteArray &data); virtual void slotComposeMail(); virtual void systemMessage( const QCString&, const QByteArray& ); protected slots: virtual void slotSendQueued(); virtual void slotEditAccounts(); virtual void slotShowFolders( bool show ); virtual void refreshMailView(const QValueList<RecMailP>&); virtual void displayMail(); virtual void slotDeleteMail(); virtual void mailHold(int, QListViewItem *,const QPoint&,int); virtual void slotAdjustLayout(); virtual void slotEditSettings(); virtual void mailLeftClicked( int, QListViewItem *,const QPoint&,int ); virtual void serverSelected(int); protected: QToolBar *toolBar; QMenuBar *menuBar; QPopupMenu *mailMenu, *settingsMenu,*serverMenu,*folderMenu; QAction *composeMail, *sendQueued, *showFolders, *searchMails, *deleteMails, - *editSettings, *editAccounts, *syncFolders; + *editSettings, *editAccounts, *syncFolders,*readMail; AccountView *folderView; QListView *mailView; QBoxLayout *layout; int m_Rotate; QCopChannel* m_sysChannel; int m_ServerMenuId,m_FolderMenuId; +signals: + void settingsChanged(); }; #endif diff --git a/noncore/net/mail/opiemail.cpp b/noncore/net/mail/opiemail.cpp index 1bc81e4..fb8877a 100644 --- a/noncore/net/mail/opiemail.cpp +++ b/noncore/net/mail/opiemail.cpp @@ -1,429 +1,440 @@ #include "settingsdialog.h" #include "opiemail.h" #include "editaccounts.h" #include "composemail.h" #include "mailistviewitem.h" #include "viewmail.h" #include "selectstore.h" #include "selectsmtp.h" #include <libmailwrapper/smtpwrapper.h> #include <libmailwrapper/mailtypes.h> #include <libmailwrapper/abstractmail.h> /* OPIE */ #include <opie2/odebug.h> #include <qpe/resource.h> #include <qpe/qpeapplication.h> +#include <qpe/config.h> /* QT */ #include <qmap.h> #include <qvaluelist.h> /* UNIX */ #include <signal.h> using namespace Opie::Core; typedef QMapNode<QString,QString> tkeyvalues; typedef QValueList<tkeyvalues> tvaluelist; class ValueExplode { protected: //! what was parsed last tvaluelist m_LastParsed; //! the delemiter to use QString mDelemiter; //! the inner delemiter QString m2Delemiter; //! the real split routine void splitit(); //! the content QString m_Command; //! constructor ValueExplode(){} public: //! constructor /*! * \param aCommand the string to be splitted * \param aDelemiter which sign will be the delemiter character * \param a2Delemiter which sign will delemiter the key-value-pairs between other delemiters */ ValueExplode(const QString&aCommand,const char aDelemiter = '&',const char a2Delemiter='='); //! destructor virtual ~ValueExplode(); //! assigen operator /*! * \return a list of substrings */ operator const tvaluelist& (){return m_LastParsed;} }; ValueExplode::~ValueExplode() { } ValueExplode::ValueExplode(const QString&aCommand,const char aDelemiter,const char a2Delemiter) :m_LastParsed(),m_Command(aCommand) { mDelemiter = aDelemiter; m2Delemiter = a2Delemiter; splitit(); } void ValueExplode::splitit() { QString iLine; m_LastParsed.clear(); if (mDelemiter.isEmpty()||m2Delemiter.isEmpty()) { m_LastParsed.append(tkeyvalues(m_Command,"")); return; } int pos,pos2; unsigned startpos = 0; iLine = m_Command; while ( (pos = iLine.find(mDelemiter,startpos))!=-1) { pos2 = iLine.find(m2Delemiter,startpos); if (pos2==-1||pos2>pos) { m_LastParsed.append(tkeyvalues(iLine.mid(startpos,pos-startpos),"")); } else { m_LastParsed.append(tkeyvalues(iLine.mid(startpos,pos2-startpos),iLine.mid(pos2+1,pos-pos2-1))); } startpos = pos+1; } if (startpos<iLine.length()) { pos2 = iLine.find(m2Delemiter,startpos); if (pos2==-1) { m_LastParsed.append(tkeyvalues(iLine.mid(startpos),"")); } else { m_LastParsed.append(tkeyvalues(iLine.mid(startpos,pos2-startpos),iLine.mid(pos2+1))); } } } OpieMail::OpieMail( QWidget *parent, const char *name, WFlags ) : MainWindow( parent, name, WStyle_ContextHelp ) { setup_signalblocking(); + Config cfg("mail"); + cfg.setGroup( "Settings" ); + m_clickopens = cfg.readBoolEntry("clickOpensMail",true); + settings = new Settings(); folderView->populate( settings->getAccounts() ); connect(folderView,SIGNAL(refreshMenues(int)),this,SLOT(refreshMenu(int))); } OpieMail::~OpieMail() { if (settings) delete settings; } void OpieMail::setup_signalblocking() { /* for networking we must block SIGPIPE and Co. */ struct sigaction blocking_action,temp_action; blocking_action.sa_handler = SIG_IGN; sigemptyset(&(blocking_action.sa_mask)); blocking_action.sa_flags = 0; sigaction(SIGPIPE,&blocking_action,&temp_action); } void OpieMail::appMessage(const QCString &msg, const QByteArray &data) { // copied from old mail2 if (msg == "writeMail(QString,QString)") { QDataStream stream(data,IO_ReadOnly); QString name, email; stream >> name >> email; // removing the whitespaces at beginning and end is needed! slotwriteMail(name.stripWhiteSpace(),email.stripWhiteSpace()); } else if (msg == "newMail()") { slotComposeMail(); } } /** * Konqueror calls us with the mailto:name@address */ void OpieMail::setDocument(const QString& mail) { /* * It looks like a mailto address, lets try it */ if( mail.startsWith(QString::fromLatin1("mailto:")) ) slotwriteMail(QString::null, mail.mid(7)); } void OpieMail::slotwriteMail(const QString&name,const QString&email) { ComposeMail compose( settings, this, 0, true , WStyle_ContextHelp ); if (!email.isEmpty()) { if (!name.isEmpty()) { compose.setTo("\"" + name + "\"" + " " + "<"+ email + ">"); } else { compose.setTo(email); } } compose.slotAdjustColumns(); QPEApplication::execDialog( &compose ); } void OpieMail::slotComposeMail() { odebug << "Compose Mail" << oendl; slotwriteMail(0l,0l); } void OpieMail::slotSendQueued() { odebug << "Send Queued" << oendl; SMTPaccount *smtp = 0; QList<Account> list = settings->getAccounts(); QList<SMTPaccount> smtpList; smtpList.setAutoDelete(false); Account *it; for ( it = list.first(); it; it = list.next() ) { if ( it->getType() == MAILLIB::A_SMTP ) { smtp = static_cast<SMTPaccount *>(it); smtpList.append(smtp); } } if (smtpList.count()==0) { QMessageBox::information(0,tr("Info"),tr("Define a smtp account first")); return; } if (smtpList.count()==1) { smtp = smtpList.at(0); } else { smtp = 0; selectsmtp selsmtp; selsmtp.setSelectionlist(&smtpList); if ( QPEApplication::execDialog( &selsmtp ) == QDialog::Accepted ) { smtp = selsmtp.selected_smtp(); } } if (smtp) { SMTPwrapper * wrap = new SMTPwrapper(smtp); if ( wrap->flushOutbox() ) { QMessageBox::information(0,tr("Info"),tr("Mail queue flushed")); } delete wrap; } } void OpieMail::slotSearchMails() { odebug << "Search Mails" << oendl; } void OpieMail::slotEditSettings() { SettingsDialog settingsDialog( this, 0, true, WStyle_ContextHelp ); - QPEApplication::execDialog( &settingsDialog ); + if (QPEApplication::execDialog( &settingsDialog )) { + Config cfg("mail"); + cfg.setGroup( "Settings" ); + m_clickopens = cfg.readBoolEntry("clickOpensMail",true); + emit settingsChanged(); + } } void OpieMail::slotEditAccounts() { odebug << "Edit Accounts" << oendl; EditAccounts eaDialog( settings, this, 0, true, WStyle_ContextHelp ); eaDialog.slotAdjustColumns(); if (QPEApplication::execDialog( &eaDialog )==QDialog::Rejected);// return; if ( settings ) delete settings; settings = new Settings(); mailView->clear(); folderView->populate( settings->getAccounts() ); } void OpieMail::displayMail() { QListViewItem*item = mailView->currentItem(); if (!item) return; RecMailP mail = ((MailListViewItem*)item)->data(); RecBodyP body = folderView->fetchBody(mail); ViewMail readMail( this,"", Qt::WType_Modal | WStyle_ContextHelp ); readMail.setBody( body ); readMail.setMail( mail ); readMail.showMaximized(); readMail.exec(); if ( readMail.deleted ) { folderView->refreshCurrent(); } else { ( (MailListViewItem*)item )->setPixmap( 0, Resource::loadPixmap( "" ) ); } } void OpieMail::slotDeleteMail() { if (!mailView->currentItem()) return; RecMailP mail = ((MailListViewItem*)mailView->currentItem() )->data(); if ( QMessageBox::warning(this, tr("Delete Mail"), QString( tr("<p>Do you really want to delete this mail? <br><br>" ) + mail->getFrom() + " - " + mail->getSubject() ) , QMessageBox::Yes, QMessageBox::No ) == QMessageBox::Yes ) { mail->Wrapper()->deleteMail( mail ); folderView->refreshCurrent(); } } void OpieMail::mailHold(int button, QListViewItem *item,const QPoint&,int ) { if (!mailView->currentItem()) return; MAILLIB::ATYPE mailtype = ((MailListViewItem*)mailView->currentItem() )->wrapperType(); /* just the RIGHT button - or hold on pda */ if (button!=2) {return;} odebug << "Event right/hold" << oendl; if (!item) return; QPopupMenu *m = new QPopupMenu(0); if (m) { if (mailtype==MAILLIB::A_NNTP) { m->insertItem(tr("Read this posting"),this,SLOT(displayMail())); // m->insertItem(tr("Copy this posting"),this,SLOT(slotMoveCopyMail())); } else { if (folderView->currentisDraft()) { m->insertItem(tr("Edit this mail"),this,SLOT(reEditMail())); } m->insertItem(tr("Read this mail"),this,SLOT(displayMail())); m->insertItem(tr("Delete this mail"),this,SLOT(slotDeleteMail())); m->insertItem(tr("Copy/Move this mail"),this,SLOT(slotMoveCopyMail())); } m->setFocus(); m->exec( QPoint( QCursor::pos().x(), QCursor::pos().y()) ); delete m; } } void OpieMail::slotShowFolders( bool show ) { odebug << "Show Folders" << oendl; if ( show && folderView->isHidden() ) { odebug << "-> showing" << oendl; folderView->show(); } else if ( !show && !folderView->isHidden() ) { odebug << "-> hiding" << oendl; folderView->hide(); } } void OpieMail::refreshMailView(const QValueList<RecMailP>&list) { MailListViewItem*item = 0; mailView->clear(); QValueList<RecMailP>::ConstIterator it; for (it = list.begin(); it != list.end();++it) { item = new MailListViewItem(mailView,item); item->storeData((*it)); item->showEntry(); } } void OpieMail::mailLeftClicked(int button, QListViewItem *item,const QPoint&,int ) { + if (!m_clickopens) return; /* just LEFT button - or tap with stylus on pda */ if (button!=1) return; if (!item) return; if (folderView->currentisDraft()) { reEditMail(); } else { displayMail(); } } void OpieMail::slotMoveCopyMail() { if (!mailView->currentItem()) return; RecMailP mail = ((MailListViewItem*)mailView->currentItem() )->data(); AbstractMail*targetMail = 0; QString targetFolder = ""; Selectstore sels; folderView->setupFolderselect(&sels); if (!sels.exec()) return; targetMail = sels.currentMail(); targetFolder = sels.currentFolder(); if ( (mail->Wrapper()==targetMail && mail->getMbox()==targetFolder) || targetFolder.isEmpty()) { return; } if (sels.newFolder() && !targetMail->createMbox(targetFolder)) { QMessageBox::critical(0,tr("Error creating new Folder"), tr("<center>Error while creating<br>new folder - breaking.</center>")); return; } mail->Wrapper()->mvcpMail(mail,targetFolder,targetMail,sels.moveMails()); folderView->refreshCurrent(); } void OpieMail::reEditMail() { if (!mailView->currentItem()) return; ComposeMail compose( settings, this, 0, true , WStyle_ContextHelp ); compose.reEditMail(((MailListViewItem*)mailView->currentItem() )->data()); compose.slotAdjustColumns(); QPEApplication::execDialog( &compose ); } void OpieMail::refreshMenu(int m_isFolder) { if (QApplication::desktop()->width()<330) { mailMenu->setItemEnabled(m_ServerMenuId,m_isFolder&1); mailMenu->setItemEnabled(m_FolderMenuId,m_isFolder&2); } else { menuBar->setItemEnabled(m_ServerMenuId,m_isFolder&1); menuBar->setItemEnabled(m_FolderMenuId,m_isFolder&2); } QMap<int,QString>::ConstIterator it; QMap<int,QString> server_entries=folderView->currentServerMenu(); QMap<int,QString> folder_entries=folderView->currentFolderMenu(); int id; unsigned int i; for (i=0; i<folderMenu->count();++i) { id = folderMenu->idAt(i); folderMenu->setItemEnabled(id,false); } for (it=folder_entries.begin();it!=folder_entries.end();++it) { folderMenu->changeItem(it.key(),it.data()); folderMenu->setItemEnabled(it.key(),true); } for (i=0; i<serverMenu->count();++i) { id = serverMenu->idAt(i); serverMenu->setItemEnabled(id,false); } for (it=server_entries.begin();it!=server_entries.end();++it) { serverMenu->changeItem(it.key(),it.data()); serverMenu->setItemEnabled(it.key(),true); } } void OpieMail::serverSelected(int m_isFolder) { mailView->clear(); refreshMenu(m_isFolder); } diff --git a/noncore/net/mail/opiemail.h b/noncore/net/mail/opiemail.h index 75a0b2d..327bef7 100644 --- a/noncore/net/mail/opiemail.h +++ b/noncore/net/mail/opiemail.h @@ -1,51 +1,54 @@ #ifndef OPIEMAIL_H #define OPIEMAIL_H #include "mainwindow.h" #include <libmailwrapper/settings.h> #include <libmailwrapper/mailtypes.h> #include <opie2/osmartpointer.h> #include <qmap.h> class OpieMail : public MainWindow { Q_OBJECT public: OpieMail( QWidget *parent = 0, const char *name = 0, WFlags flags = 0 ); virtual ~OpieMail(); static QString appName() { return QString::fromLatin1("opiemail"); } public slots: virtual void slotwriteMail(const QString&name,const QString&email); virtual void slotComposeMail(); virtual void appMessage(const QCString &msg, const QByteArray &data); void setDocument(const QString&); protected slots: virtual void slotSendQueued(); virtual void slotSearchMails(); virtual void slotEditSettings(); virtual void slotEditAccounts(); virtual void displayMail(); virtual void slotDeleteMail(); virtual void mailHold(int, QListViewItem *,const QPoint&,int); virtual void slotShowFolders( bool show ); virtual void refreshMailView(const QValueList<RecMailP>&); virtual void mailLeftClicked( int, QListViewItem *,const QPoint&,int ); virtual void slotMoveCopyMail(); virtual void reEditMail(); virtual void serverSelected(int); virtual void refreshMenu(int); protected: void setup_signalblocking(); + bool m_clickopens:1; + private: Settings *settings; +signals: }; #endif diff --git a/noncore/net/mail/settingsdialog.cpp b/noncore/net/mail/settingsdialog.cpp index 6441948..74b8b12 100644 --- a/noncore/net/mail/settingsdialog.cpp +++ b/noncore/net/mail/settingsdialog.cpp @@ -1,51 +1,55 @@ #include <qcheckbox.h> #include <qspinbox.h> #include <qpe/config.h> #include "settingsdialog.h" SettingsDialog::SettingsDialog( QWidget* parent, const char* name, bool modal, WFlags fl ) : SettingsDialogUI( parent, name, modal, fl ) { readConfig(); } SettingsDialog::~SettingsDialog() { } void SettingsDialog::readConfig() { Config cfg("mail"); cfg.setGroup( "Settings" ); showHtmlButton->setChecked( cfg.readBoolEntry( "showHtml", false ) ); + clickOpenMailButton->setChecked(cfg.readBoolEntry("clickOpensMail",true)); + clickOpenFolderButton->setChecked(cfg.readBoolEntry("clickOpensFolder",true)); cfg.setGroup( "Compose" ); checkBoxLater->setChecked( cfg.readBoolEntry( "sendLater", false ) ); cfg.setGroup( "Applet" ); cbEnableTaskbarApplet->setChecked( cfg.readBoolEntry( "Disabled", false ) ); spCheckOften->setValue( cfg.readNumEntry( "CheckEvery", 5 ) ); cbBlinkLed->setChecked( cfg.readBoolEntry( "BlinkLed", true ) ); cbPlaySound->setChecked( cfg.readBoolEntry( "PlaySound", false ) ); } void SettingsDialog::writeConfig() { Config cfg( "mail" ); cfg.setGroup( "Settings" ); + cfg.writeEntry("clickOpensMail",clickOpenMailButton->isChecked()); + cfg.writeEntry("clickOpensFolder",clickOpenFolderButton->isChecked()); cfg.writeEntry( "showHtml", showHtmlButton->isChecked() ); cfg.setGroup( "Compose" ); cfg.writeEntry( "sendLater", checkBoxLater->isChecked() ); cfg.setGroup( "Applet" ); cfg.writeEntry( "Disabled", cbEnableTaskbarApplet->isChecked() ); int check = spCheckOften->value(); if (check<1)check=1;if (check>99)check=99; cfg.writeEntry( "CheckEvery", check); cfg.writeEntry( "BlinkLed", cbBlinkLed->isChecked() ); cfg.writeEntry( "PlaySound", cbPlaySound->isChecked() ); } void SettingsDialog::accept() { writeConfig(); QDialog::accept(); } diff --git a/noncore/net/mail/settingsdialogui.ui b/noncore/net/mail/settingsdialogui.ui index 4acd84a..0a97da0 100644 --- a/noncore/net/mail/settingsdialogui.ui +++ b/noncore/net/mail/settingsdialogui.ui @@ -1,280 +1,302 @@ <!DOCTYPE UI><UI> <class>SettingsDialogUI</class> <widget> <class>QDialog</class> <property stdset="1"> <name>name</name> <cstring>SettingsDialogUI</cstring> </property> <property stdset="1"> <name>geometry</name> <rect> <x>0</x> <y>0</y> - <width>312</width> - <height>379</height> + <width>304</width> + <height>378</height> </rect> </property> <property stdset="1"> <name>caption</name> <string>Settings Dialog</string> </property> <property> <name>layoutMargin</name> </property> <property> <name>layoutSpacing</name> </property> <vbox> <property stdset="1"> <name>margin</name> <number>3</number> </property> <property stdset="1"> <name>spacing</name> <number>3</number> </property> <widget> <class>QTabWidget</class> <property stdset="1"> <name>name</name> <cstring>TabWidget2</cstring> </property> <property> <name>layoutMargin</name> </property> <property> <name>layoutSpacing</name> </property> <widget> <class>QWidget</class> <property stdset="1"> <name>name</name> <cstring>tab</cstring> </property> <attribute> <name>title</name> <string>View Mail</string> </attribute> <vbox> <property stdset="1"> <name>margin</name> - <number>3</number> + <number>11</number> </property> <property stdset="1"> <name>spacing</name> - <number>3</number> + <number>6</number> </property> <widget> <class>QCheckBox</class> <property stdset="1"> <name>name</name> <cstring>showHtmlButton</cstring> </property> <property stdset="1"> <name>text</name> <string>View mail as Html</string> </property> </widget> + <widget> + <class>QCheckBox</class> + <property stdset="1"> + <name>name</name> + <cstring>clickOpenMailButton</cstring> + </property> + <property stdset="1"> + <name>text</name> + <string>Click opens mail</string> + </property> + </widget> + <widget> + <class>QCheckBox</class> + <property stdset="1"> + <name>name</name> + <cstring>clickOpenFolderButton</cstring> + </property> + <property stdset="1"> + <name>text</name> + <string>Click activate server/folder</string> + </property> + </widget> <spacer> <property> <name>name</name> <cstring>Spacer1</cstring> </property> <property stdset="1"> <name>orientation</name> <enum>Vertical</enum> </property> <property stdset="1"> <name>sizeType</name> <enum>Expanding</enum> </property> <property> <name>sizeHint</name> <size> <width>20</width> <height>20</height> </size> </property> </spacer> </vbox> </widget> <widget> <class>QWidget</class> <property stdset="1"> <name>name</name> <cstring>tab</cstring> </property> <attribute> <name>title</name> <string>Compose Mail</string> </attribute> <vbox> <property stdset="1"> <name>margin</name> <number>3</number> </property> <property stdset="1"> <name>spacing</name> <number>3</number> </property> <widget> <class>QCheckBox</class> <property stdset="1"> <name>name</name> <cstring>checkBoxLater</cstring> </property> <property stdset="1"> <name>text</name> <string>Send mails later ( enqueue in outbox )</string> </property> </widget> <spacer> <property> <name>name</name> <cstring>Spacer2</cstring> </property> <property stdset="1"> <name>orientation</name> <enum>Vertical</enum> </property> <property stdset="1"> <name>sizeType</name> <enum>Expanding</enum> </property> <property> <name>sizeHint</name> <size> <width>20</width> <height>20</height> </size> </property> </spacer> </vbox> </widget> <widget> <class>QWidget</class> <property stdset="1"> <name>name</name> <cstring>tab</cstring> </property> <attribute> <name>title</name> <string>Taskbar Applet</string> </attribute> <vbox> <property stdset="1"> <name>margin</name> <number>3</number> </property> <property stdset="1"> <name>spacing</name> <number>3</number> </property> <widget> <class>QCheckBox</class> <property stdset="1"> <name>name</name> <cstring>cbEnableTaskbarApplet</cstring> </property> <property stdset="1"> <name>text</name> <string>Disable Taskbar Applet</string> </property> </widget> <widget> <class>QLayoutWidget</class> <property stdset="1"> <name>name</name> <cstring>Layout2</cstring> </property> <hbox> <property stdset="1"> <name>margin</name> <number>0</number> </property> <property stdset="1"> <name>spacing</name> <number>6</number> </property> <widget> <class>QSpinBox</class> <property stdset="1"> <name>name</name> <cstring>spCheckOften</cstring> </property> <property stdset="1"> <name>suffix</name> <string> min</string> </property> <property stdset="1"> <name>minValue</name> <number>1</number> </property> <property stdset="1"> <name>value</name> <number>5</number> </property> </widget> <widget> <class>QLabel</class> <property stdset="1"> <name>name</name> <cstring>TextLabel1</cstring> </property> <property stdset="1"> <name>text</name> <string>Check how often</string> </property> </widget> </hbox> </widget> <widget> <class>QCheckBox</class> <property stdset="1"> <name>name</name> <cstring>cbBlinkLed</cstring> </property> <property stdset="1"> <name>text</name> <string>Blink Led when new mails arrive</string> </property> </widget> <widget> <class>QCheckBox</class> <property stdset="1"> <name>name</name> <cstring>cbPlaySound</cstring> </property> <property stdset="1"> <name>text</name> <string>Play Sound when new mails arrive</string> </property> </widget> <spacer> <property> <name>name</name> <cstring>Spacer3</cstring> </property> <property stdset="1"> <name>orientation</name> <enum>Vertical</enum> </property> <property stdset="1"> <name>sizeType</name> <enum>Expanding</enum> </property> <property> <name>sizeHint</name> <size> <width>20</width> <height>20</height> </size> </property> </spacer> </vbox> </widget> </widget> </vbox> </widget> </UI> |