File r879230.diff of Package kdepim4

Subject: kalarm: UI fixes
From: wstephenson@suse.de
Bug: 
Patch-upstream: 879230
--- kalarm/dialogscroll.h	(revision 879229)
+++ kalarm/dialogscroll.h	(revision 879230)
@@ -45,6 +45,7 @@ class DialogScroll : public QScrollArea
 		static void   setSized()        { mSized = true; }
 		static bool   sized()           { return mSized; }
 	private:
+		static QSize  maxMinimumSizeHint();
 		static QList<DialogScroll<T>*> mTabs;
 		static int    mMinHeight;
 		static int    mHeightReduction;
@@ -82,28 +83,30 @@ DialogScroll<T>::~DialogScroll()
 	mTabs.removeAll(this);
 }
 
+/******************************************************************************
+* Return the minimum size for the tab, adjusted if necessary to a height that
+* fits the screen.
+* In order to make the QStackedWidget containing the tabs take the correct
+* size, the value returned is actually the minimum size of the largest tab.
+* Otherwise, only the currently visible tab would be taken into account with
+* the result that the dialog would initially be displayed too small.
+*/
 template <class T>
 QSize DialogScroll<T>::minimumSizeHint() const
 {
-	if (!widget())
-		return QSize();
-	QSize s = widget()->minimumSizeHint();
+	QSize s = maxMinimumSizeHint();
 	if (mMinHeight > 0  &&  mMinHeight < s.height())
 		return QSize(s.width() + style()->pixelMetric(QStyle::PM_ScrollBarExtent), mMinHeight);
 	return s;
 }
 
 /******************************************************************************
-* Return the minimum size for the dialog.
-* If the minimum size would be too high to fit the desktop, the tab contents
-* are made scrollable.
+* Return the maximum minimum size for any instance.
 */
 template <class T>
-QSize DialogScroll<T>::initMinimumHeight(T* dlg)
+QSize DialogScroll<T>::maxMinimumSizeHint()
 {
-	if (mSized)
-		return QSize();
-	int maxHeight = 0;
+	QSize sz;
 	for (int i = 0, end = mTabs.count();  i < end;  ++i)
 	{
 		if (!mTabs[i]->widget())
@@ -111,9 +114,25 @@ QSize DialogScroll<T>::initMinimumHeight
 		QSize s = mTabs[i]->widget()->minimumSizeHint();
 		if (!s.isValid())
 			return QSize();
-		if (s.height() > maxHeight)
-			maxHeight = s.height();
+		sz = sz.expandedTo(s);
 	}
+	return sz;
+}
+
+/******************************************************************************
+* Return the minimum size for the dialog.
+* If the minimum size would be too high to fit the desktop, the tab contents
+* are made scrollable.
+*/
+template <class T>
+QSize DialogScroll<T>::initMinimumHeight(T* dlg)
+{
+	if (mSized)
+		return QSize();
+	QSize s = maxMinimumSizeHint();
+	if (s.isEmpty())
+		return QSize();
+	int maxHeight = s.height();
 	int decoration = dlg->frameGeometry().height() - dlg->geometry().height();
 	if (!decoration)
 	{
@@ -125,12 +144,13 @@ QSize DialogScroll<T>::initMinimumHeight
 	// There is no stored size, or the deferral group is visible.
 	// Allow the tab contents to be scrolled vertically if that is necessary
 	// to avoid the dialog exceeding the screen height.
-	QSize s = dlg->KDialog::minimumSizeHint();
+	s = dlg->KDialog::minimumSizeHint();
 	int y = s.height() + decoration - desk;
 	if (y > 0)
 	{
 		mHeightReduction = y;
 		mMinHeight = maxHeight - y;
+		kDebug() << "Scrolling: min height=" << mMinHeight << ", reduction=" << mHeightReduction;
 		if (mMinHeight > 0)
 		{
 			for (int i = 0, end = mTabs.count();  i < end;  ++i)
--- kalarm/prefdlg.h	(revision 879229)
+++ kalarm/prefdlg.h	(revision 879230)
@@ -58,7 +58,8 @@ class KAlarmPrefDlg : public KPageDialog
 		KPageWidgetItem*   mFontColourPageItem;
 
 	protected:
-		virtual void  resizeEvent(QResizeEvent*);
+		virtual void resizeEvent(QResizeEvent*);
+		virtual void showEvent(QShowEvent*);
 
 	protected slots:
 		virtual void slotOk();
@@ -72,6 +73,7 @@ class KAlarmPrefDlg : public KPageDialog
 		void         restore(bool defaults);
 
 		static KAlarmPrefDlg* mInstance;
+		bool         mShown;    // dialog has already been shown
 		bool         mValid;
 };
 
--- kalarm/prefdlg.cpp	(revision 879229)
+++ kalarm/prefdlg.cpp	(revision 879230)
@@ -138,7 +138,8 @@ void KAlarmPrefDlg::display()
 }
 
 KAlarmPrefDlg::KAlarmPrefDlg()
-	: KPageDialog()
+	: KPageDialog(),
+	  mShown(false)
 {
 	setAttribute(Qt::WA_DeleteOnClose);
 	setObjectName("PrefDlg");    // used by LikeBack
@@ -303,6 +304,21 @@ QSize KAlarmPrefDlg::minimumSizeHint() c
 }
 
 /******************************************************************************
+* Called when the dialog is displayed.
+* The first time through, sets the tabs to be scrollable if the dialog is too
+* high to fit the screen.
+*/
+void KAlarmPrefDlg::showEvent(QShowEvent* e)
+{
+	KPageDialog::showEvent(e);
+	if (!mShown)
+	{
+		DialogScroll<KAlarmPrefDlg>::initMinimumHeight(this);
+		mShown = true;
+	}
+}
+
+/******************************************************************************
 *  Called when the dialog's size has changed.
 *  Records the new size in the config file.
 */
Index: kalarm/dialogscroll.h
===================================================================
Index: kalarm/prefdlg.h
===================================================================
Index: kalarm/prefdlg.cpp
===================================================================
openSUSE Build Service is sponsored by