View Issue Details

IDProjectCategoryView StatusLast Update
0016988ScribusUser Interfacepublic2023-08-01 20:07
Reporternitramr Assigned Tonitramr  
PrioritynormalSeverityfeatureReproducibilityN/A
Status assignedResolutionopen 
PlatformDesktop PCOSUbuntuOS Version23.04 64-bit
Product Version1.7.0.svn 
Target Version1.7.0 
Summary0016988: Implement IndigoUI collapsible section container as UI widget
DescriptionI replaced the ScTreeWidget of property panel and content panel with a new UI widget.

Patch Notes:
- add new UI container widget "SectionContainer"
- add two new icons "action-chevron-up.svg" & "action-chevron-down.svg" for SectionContainer class
- font properties of "propertiespalette_text.cpp" has been moved into separate class "propertywidget_text.cpp"

SectionContainer:
- widget is a layout container that has a collapsible and expandable body section
- widget header supports widget plugins, like buttons and combo boxes
- widget supports application QPalette colors
TagsNo tags attached.
PatchNo

Activities

nitramr

2023-08-01 20:06

developer  

indigouicontainer_23-08-01_01.patch (101,624 bytes)   
Index: resources/iconsets/1_7_0/16/action-chevron-down.svg
===================================================================
Kann nicht anzeigen: Dateityp ist als binär angegeben.
svn:mime-type = image/svg+xml

Property changes on: resources/iconsets/1_7_0/16/action-chevron-down.svg
___________________________________________________________________
Deleted: svn:mime-type
## -1 +0,0 ##
-image/svg+xml
\ No newline at end of property
Index: resources/iconsets/1_7_0/16/action-chevron-up.svg
===================================================================
Kann nicht anzeigen: Dateityp ist als binär angegeben.
svn:mime-type = image/svg+xml

Property changes on: resources/iconsets/1_7_0/16/action-chevron-up.svg
___________________________________________________________________
Deleted: svn:mime-type
## -1 +0,0 ##
-image/svg+xml
\ No newline at end of property
Index: resources/iconsets/1_7_0/1_7_0.xml
===================================================================
--- resources/iconsets/1_7_0/1_7_0.xml	(Revision 25566)
+++ resources/iconsets/1_7_0/1_7_0.xml	(Arbeitskopie)
@@ -139,6 +139,8 @@
 		<icon id="u_group.png" file="16/object-group.svg" /><!-- Outliner -->
 		<icon id="u_undo16.png" file="16/action-undo.svg" /><!-- Barcode -->
 		<icon id="ungroup.png" file="16/object-ungroup.svg" />
+		<icon id="collapse" file="16/action-chevron-down.svg" />
+		<icon id="expand" file="16/action-chevron-up.svg" />
 			
 		<!-- Alerts -->
 		<icon onLight="#E54545" onDark="#FF6666" id="22/dialog-error.png" file="16/alert-error.svg" />
Index: scribus/CMakeLists_Sources.txt
===================================================================
--- scribus/CMakeLists_Sources.txt	(Revision 25566)
+++ scribus/CMakeLists_Sources.txt	(Arbeitskopie)
@@ -445,6 +445,7 @@
 	ui/propertywidget_optmargins.cpp
 	ui/propertywidget_orphans.cpp
 	ui/propertywidget_pathtext.cpp
+	ui/propertywidget_text.cpp
 	ui/propertywidget_textcolor.cpp
 	ui/propertywidget_fontfeatures.cpp
 	ui/propertywidgetbase.cpp
@@ -538,6 +539,7 @@
 	ui/weldedit.cpp
 	ui/docks/dock_centralwidget.cpp
 	ui/docks/dock_panelbase.cpp
+	ui/widgets/section_container.cpp
 	${SCRIBUS_OSG_SRC}
 	${SCRIBUS_GMAGICK_SRC}
 	${SCRIBUS_JPEGXL_SRC}
Index: scribus/ui/propertiespalette.cpp
===================================================================
--- scribus/ui/propertiespalette.cpp	(Revision 25566)
+++ scribus/ui/propertiespalette.cpp	(Arbeitskopie)
@@ -33,6 +33,7 @@
 #include "appmodehelper.h"
 #include "appmodes.h"
 #include "cpalette.h"
+#include "iconmanager.h"
 #include "pageitem_table.h"
 #include "propertiespalette_line.h"
 #include "propertiespalette_shadow.h"
@@ -57,46 +58,76 @@
 	f.setPointSize(f.pointSize()-1);
 	setFont(f);
 
-	TabStack = new ScTreeWidget( this );
-//	Uncomment this line if the new behaviour makes any trouble.
-//	TabStack->setToolBoxMode(true);
+	IconManager &iconManager = IconManager::instance();
 
+	// XZY
 	xyzPal = new PropertiesPalette_XYZ( this );
-	idXYZItem = TabStack->addItem( xyzPal, "X, Y, &Z" );
+	scXYZ = new SectionContainer("X, Y, &Z");
+	scXYZ->addPage(xyzPal);
+	scXYZ->setCollapseIcons(iconManager.loadPixmap("collapse"), iconManager.loadPixmap("expand"));
 
+	// Drop Shadow
 	shadowPal = new PropertiesPalette_Shadow( this );
-	idShadowItem = TabStack->addItem( shadowPal, "Drop Shadow" );
+	scShadow = new SectionContainer("Drop Shadow");
+	scShadow->addPage(shadowPal);
+	scShadow->setCollapseIcons(iconManager.loadPixmap("collapse"), iconManager.loadPixmap("expand"));
+	scShadow->setIsCollapsed(true);
 
+	// Shape
 	shapePal = new PropertiesPalette_Shape( this );
-	idShapeItem = TabStack->addItem( shapePal, "&Shape" );
+	scShape = new SectionContainer("&Shape");
+	scShape->addPage(shapePal);
+	scShape->setCollapseIcons(iconManager.loadPixmap("collapse"), iconManager.loadPixmap("expand"));
+	scShape->setIsCollapsed(true);
 
+	// Line
 	linePal = new PropertiesPalette_Line(this);
-	idLineItem=TabStack->addItem( linePal, "&Line" );
+	scLine = new SectionContainer("&Line");
+	scLine->addPage(linePal);
+	scLine->setCollapseIcons(iconManager.loadPixmap("collapse"), iconManager.loadPixmap("expand"));
+	scLine->setIsCollapsed(true);
 
+	// Color
 	colorPalette = new ColorPalette(this);
-	idColorsItem = TabStack->addItem(colorPalette, "&Colors" );
+	scColor = new SectionContainer("&Colors");
+	scColor->addPage(colorPalette);
+	scColor->setCollapseIcons(iconManager.loadPixmap("collapse"), iconManager.loadPixmap("expand"));
+	scColor->setIsCollapsed(true);
 
+	// Transparency
 	transparencyPalette = new TransparencyPalette(this);
-	idTransparencyItem = TabStack->addItem(transparencyPalette, "&Transparency" );
+	scTransparency = new SectionContainer("&Transparency");
+	scTransparency->addPage(transparencyPalette);
+	scTransparency->setCollapseIcons(iconManager.loadPixmap("collapse"), iconManager.loadPixmap("expand"));
+	scTransparency->setIsCollapsed(true);
 
-	setWidget( TabStack );
+	// Layout stack
+	QVBoxLayout * lyt = new QVBoxLayout();
+	lyt->setContentsMargins(0, 0, 0, 0);
+	lyt->setSpacing(0);
+	lyt->addWidget(scXYZ);
+	lyt->addWidget(scShadow);
+	lyt->addWidget(scShape);
+	lyt->addWidget(scLine);
+	lyt->addWidget(scColor);
+	lyt->addWidget(scTransparency);
+	lyt->addStretch(1);
 
+	QWidget * wdg = new QWidget();
+	wdg->setLayout(lyt);
+	setWidget(wdg);
+
 	languageChange();
+	enablePalettes(false);
 
-	connect(linePal, SIGNAL(lineModeChanged(int)), this, SLOT(NewLineMode(int)));
-	connect(TabStack, SIGNAL(currentChanged2(int)), this, SLOT(SelTab(int)));
-
-	connect(colorPalette, SIGNAL(NewSpecial(double,double,double,double,double,double,double,double,double,double)), this, SLOT(NewSpGradient(double,double,double,double,double,double,double,double,double,double)));
+	connect(linePal, SIGNAL(lineModeChanged(int)), this, SLOT(newLineMode(int)));
+	connect(colorPalette, SIGNAL(NewSpecial(double,double,double,double,double,double,double,double,double,double)), this, SLOT(newSpGradient(double,double,double,double,double,double,double,double,double,double)));
 	connect(colorPalette, SIGNAL(editGradient(int)), this, SLOT(toggleGradientEdit(int)));
-	connect(transparencyPalette, SIGNAL(NewSpecial(double,double,double,double,double,double,double,double,double,double)), this, SLOT(NewSpGradientM(double,double,double,double,double,double,double,double)));
+	connect(transparencyPalette, SIGNAL(NewSpecial(double,double,double,double,double,double,double,double,double,double)), this, SLOT(newSpGradientM(double,double,double,double,double,double,double,double)));
 	connect(transparencyPalette, SIGNAL(editGradient()), this, SLOT(toggleGradientEditM()));
 
 	m_haveItem = false;
-	for (int i = 1; i < 10; ++i)
-		TabStack->setItemEnabled(i, false);
-	TabStack->setCurrentIndex(0);
-	TabStack->widget(0)->setEnabled(false);
-	TabStack->setItemEnabled(0, false);
+
 }
 
 void PropertiesPalette::closeEvent(QCloseEvent *closeEvent)
@@ -136,39 +167,6 @@
 	connect(m_ScMW->appModeHelper, SIGNAL(AppModeChanged(int,int)), this, SLOT(AppModeChanged()));
 }
 
-void PropertiesPalette::SelTab(int t)
-{
-	if (!m_ScMW || m_ScMW->scriptIsRunning())
-		return;
-
-	if (!TabStack->widget(t)->isVisible())
-		return;
-
-	bool focusNowSet = false;
-	foreach (QObject *o, TabStack->widget(t)->children())
-	{
-		// Layouts, boxes etc aren't widgets at all
-		// so let's skip them silently...
-		QWidget *w = qobject_cast<QWidget*>(o);
-		if (!w)
-			continue;
-
-		QWidget *i = TabStack->widget(t);
-		while ((i = i->nextInFocusChain()) != TabStack->widget(t))
-		{
-			if (((i->focusPolicy() & Qt::TabFocus) == Qt::TabFocus) && !i->focusProxy() && i->isEnabled())
-			{
-				focusNowSet = true;
-				i->setFocus();
-				break;
-			}
-		}
-
-		if (focusNowSet)
-			break;
-	}
-}
-
 void PropertiesPalette::setDoc(ScribusDoc *d)
 {
 	if((d == (ScribusDoc*) m_doc) || (m_ScMW && m_ScMW->scriptIsRunning()))
@@ -235,10 +233,7 @@
 	transparencyPalette->setDocument(nullptr);
 
 	m_haveItem = false;
-	for (int ws = 1; ws < 10; ++ws)
-		TabStack->setItemEnabled(ws, false);
-	TabStack->widget(0)->setEnabled(false);
-	TabStack->setItemEnabled(idXYZItem, false);
+	enablePalettes(false);
 }
 
 void PropertiesPalette::unsetItem()
@@ -266,6 +261,16 @@
 	return nullptr;
 }
 
+void PropertiesPalette::enablePalettes(bool enable)
+{
+	scXYZ->setEnabled(enable);
+	scShape->setEnabled(enable);
+	scLine->setEnabled(enable);
+	scColor->setEnabled(enable);
+	scTransparency->setEnabled(enable);
+	scShadow->setEnabled(enable);
+}
+
 void PropertiesPalette::AppModeChanged()
 {
 	if (!m_ScMW || m_ScMW->scriptIsRunning())
@@ -300,13 +305,10 @@
 		return;
 	}
 
-	int oldTabIndex = TabStack->currentIndex();
-
 	if (!m_doc)
 		setDoc(item->doc());
 
-	disconnect(TabStack, SIGNAL(currentChanged2(int)) , this, SLOT(SelTab(int)));
-	disconnect(linePal , SIGNAL(lineModeChanged(int)), this, SLOT(NewLineMode(int)));
+	disconnect(linePal , SIGNAL(lineModeChanged(int)), this, SLOT(newLineMode(int)));
 
 	m_haveItem = false;
 	m_item = item;
@@ -315,7 +317,7 @@
 
 	setTextFlowMode(m_item->textFlowMode());
 
-	connect(linePal , SIGNAL(lineModeChanged(int)), this, SLOT(NewLineMode(int)));
+	connect(linePal , SIGNAL(lineModeChanged(int)), this, SLOT(newLineMode(int)));
 
 //CB replaces old emits from PageItem::emitAllToGUI()
 	setLocked(item->locked());
@@ -322,23 +324,17 @@
 
 	if ((m_item->isGroup()) && (!m_item->isSingleSel))
 	{
-		TabStack->setItemEnabled(idXYZItem, true);
-		TabStack->setItemEnabled(idShadowItem, true);
-		TabStack->setItemEnabled(idShapeItem, true);
-		TabStack->setItemEnabled(idLineItem, false);
-		TabStack->setItemEnabled(idColorsItem, false);
-		TabStack->setItemEnabled(idTransparencyItem, true);
+		scXYZ->setEnabled(true);
+		scShadow->setEnabled(true);
+		scShape->setEnabled(true);
+		scLine->setEnabled(false);
+		scColor->setEnabled(false);
+		scTransparency->setEnabled(true);
+
 	}
 
 	m_haveItem = true;
 
-	if (oldTabIndex != TabStack->currentIndex())
-	{
-		//Must be called only when necessary : cause focus problem
-		//in spinboxes when processing valueChanged() signals
-		SelTab(TabStack->currentIndex());
-	}
-
 	if (!sender() || (m_doc->appMode == modeEditTable))
 	{
 		xyzPal->handleSelectionChanged();
@@ -350,23 +346,22 @@
 
 	if (m_item->isOSGFrame())
 	{
-		TabStack->setItemEnabled(idXYZItem, true);
-		TabStack->setItemEnabled(idShadowItem, true);
-		TabStack->setItemEnabled(idShapeItem, true);
-		TabStack->setItemEnabled(idLineItem, false);
-		TabStack->setItemEnabled(idColorsItem, true);
-		TabStack->setItemEnabled(idTransparencyItem, false);
+		scXYZ->setEnabled(true);
+		scShadow->setEnabled(true);
+		scShape->setEnabled(true);
+		scLine->setEnabled(false);
+		scColor->setEnabled(true);
+		scTransparency->setEnabled(false);
 	}
 	if (m_item->asSymbol())
 	{
-		TabStack->setItemEnabled(idXYZItem, true);
-		TabStack->setItemEnabled(idShadowItem, true);
-		TabStack->setItemEnabled(idShapeItem, false);
-		TabStack->setItemEnabled(idLineItem, false);
-		TabStack->setItemEnabled(idColorsItem, false);
-		TabStack->setItemEnabled(idTransparencyItem, false);
+		scXYZ->setEnabled(true);
+		scShadow->setEnabled(true);
+		scShape->setEnabled(false);
+		scLine->setEnabled(false);
+		scColor->setEnabled(false);
+		scTransparency->setEnabled(false);
 	}
-	connect(TabStack, SIGNAL(currentChanged2(int)), this, SLOT(SelTab(int)));
 }
 
 void PropertiesPalette::handleSelectionChanged()
@@ -373,20 +368,17 @@
 {
 	if (!m_haveDoc || !m_ScMW || m_ScMW->scriptIsRunning())
 		return;
-	int currentTab = TabStack->currentIndex();
-	disconnect(TabStack, SIGNAL(currentChanged2(int)), this, SLOT(SelTab(int)));
 
+	enablePalettes(false);
+
 	PageItem* currItem = currentItemFromSelection();
 	if (m_doc->m_Selection->count() > 1)
 	{
-		for (int ws = 1; ws < 10; ++ws)
-			TabStack->setItemEnabled(ws, false);
-		TabStack->widget(0)->setEnabled(true);
-		TabStack->setItemEnabled(idXYZItem, true);
-		TabStack->setItemEnabled(idShadowItem, true);
-		TabStack->setItemEnabled(idLineItem, true);
-		TabStack->setItemEnabled(idColorsItem, true);
-		TabStack->setItemEnabled(idTransparencyItem, true);
+		scXYZ->setEnabled(true);
+		scShadow->setEnabled(true);
+		scLine->setEnabled(true);
+		scColor->setEnabled(true);
+		scTransparency->setEnabled(true);
 	}
 	else
 	{
@@ -393,19 +385,10 @@
 		int itemType = currItem ? (int) currItem->itemType() : -1;
 		m_haveItem   = (itemType != -1);
 
-//		int visID = TabStack->currentIndex();
-		TabStack->widget(0)->setEnabled(true);
-		TabStack->setItemEnabled(idXYZItem, true);
-		TabStack->setItemEnabled(idColorsItem, true);
-		TabStack->setItemEnabled(idTransparencyItem, true);
 		switch (itemType)
 		{
 		case -1:
 			m_haveItem = false;
-			for (int ws = 1; ws < 10; ++ws)
-				TabStack->setItemEnabled(ws, false);
-			TabStack->widget(0)->setEnabled(false);
-			TabStack->setItemEnabled(idXYZItem, false);
 			colorPalette->showGradient(0);
 			break;
 		case PageItem::ImageFrame:
@@ -413,61 +396,42 @@
 		case PageItem::OSGFrame:
 			if (currItem->isOSGFrame())
 			{
-				TabStack->setItemEnabled(idXYZItem, true);
-				TabStack->setItemEnabled(idShadowItem, true);
-				TabStack->setItemEnabled(idShapeItem, true);
-				TabStack->setItemEnabled(idLineItem, false);
-				TabStack->setItemEnabled(idColorsItem, true);
-				TabStack->setItemEnabled(idTransparencyItem, false);
+				scXYZ->setEnabled(true);
+				scShadow->setEnabled(true);
+				scShape->setEnabled(true);
+				scColor->setEnabled(true);
 			}
 			else
 			{
-				TabStack->setItemEnabled(idXYZItem, true);
-				TabStack->setItemEnabled(idShadowItem, true);
-				TabStack->setItemEnabled(idShapeItem, true);
-				TabStack->setItemEnabled(idLineItem, true);
+				enablePalettes(true);
 			}
 			break;
+		case PageItem::Line:
+			scXYZ->setEnabled(true);
+			scShadow->setEnabled(true);
+			scLine->setEnabled(true);
+			scColor->setEnabled(true);
+			scTransparency->setEnabled(true);
+			break;
 		case PageItem::Group:
 		case PageItem::Symbol:
 		case PageItem::Table:
 		case PageItem::TextFrame:
-			TabStack->setItemEnabled(idShadowItem, true);
-			TabStack->setItemEnabled(idShapeItem, true);
-			TabStack->setItemEnabled(idLineItem, true);
-			break;
-		case PageItem::Line:
-			TabStack->setItemEnabled(idShadowItem, true);
-			TabStack->setItemEnabled(idShapeItem, false);
-			TabStack->setItemEnabled(idLineItem, true);
-			break;
 		case PageItem::ItemType1:
 		case PageItem::ItemType3:
 		case PageItem::Polygon:
 		case PageItem::RegularPolygon:
 		case PageItem::Arc:
-			TabStack->setItemEnabled(idShadowItem, true);
-			TabStack->setItemEnabled(idShapeItem, true);
-			TabStack->setItemEnabled(idLineItem, true);
-			break;
 		case PageItem::PolyLine:
 		case PageItem::Spiral:
-			TabStack->setItemEnabled(idShadowItem, true);
-			TabStack->setItemEnabled(idShapeItem, true);
-			TabStack->setItemEnabled(idLineItem, true);
-			break;
 		case PageItem::PathText:
-			TabStack->setItemEnabled(idShadowItem, true);
-			TabStack->setItemEnabled(idShapeItem, true);
-			TabStack->setItemEnabled(idLineItem, true);
+			enablePalettes(true);
 			break;
 		}
 	}
-	if (TabStack->isItemEnabled(currentTab) && (TabStack->currentIndex() != currentTab))
-		TabStack->setCurrentIndex(currentTab);
+
 	updateGeometry();
 	update();
-	connect(TabStack, SIGNAL(currentChanged2(int)), this, SLOT(SelTab(int)));
 
 	if (currItem)
 	{
@@ -495,7 +459,7 @@
 	m_haveItem = tmp;
 }
 
-void PropertiesPalette::NewLineMode(int mode)
+void PropertiesPalette::newLineMode(int mode)
 {
 	if (!m_ScMW || m_ScMW->scriptIsRunning())
 		return;
@@ -517,7 +481,7 @@
 	}
 }
 
-void PropertiesPalette::NewSpGradient(double x1, double y1, double x2, double y2, double fx, double fy, double sg, double sk, double cx, double cy)
+void PropertiesPalette::newSpGradient(double x1, double y1, double x2, double y2, double fx, double fy, double sg, double sk, double cx, double cy)
 {
 	if (!m_ScMW || m_ScMW->scriptIsRunning())
 		return;
@@ -653,7 +618,7 @@
 	}
 }
 
-void PropertiesPalette::NewSpGradientM(double x1, double y1, double x2, double y2, double fx, double fy, double sg, double sk)
+void PropertiesPalette::newSpGradientM(double x1, double y1, double x2, double y2, double fx, double fy, double sg, double sk)
 {
 	if (!m_ScMW || m_ScMW->scriptIsRunning())
 		return;
@@ -742,12 +708,12 @@
 {
 	setWindowTitle( tr("Properties"));
 
-	TabStack->setItemText(idXYZItem, tr("X, Y, &Z"));
-	TabStack->setItemText(idShadowItem, tr("Drop Shadow"));
-	TabStack->setItemText(idShapeItem, tr("&Shape"));
-	TabStack->setItemText(idLineItem, tr("&Line"));
-	TabStack->setItemText(idColorsItem, tr("&Colors"));
-	TabStack->setItemText(idTransparencyItem, tr("&Transparency"));
+	scXYZ->setText(tr("X, Y, &Z"));
+	scShadow->setText(tr("Drop Shadow"));
+	scShape->setText(tr("&Shape"));
+	scLine->setText(tr("&Line"));
+	scColor->setText(tr("&Colors"));
+	scTransparency->setText(tr("&Transparency"));
 
 	xyzPal->languageChange();
 	shadowPal->languageChange();
Index: scribus/ui/propertiespalette.h
===================================================================
--- scribus/ui/propertiespalette.h	(Revision 25566)
+++ scribus/ui/propertiespalette.h	(Arbeitskopie)
@@ -31,6 +31,7 @@
 #include "stylecombos.h"
 #include "units.h"
 #include "docks/dock_panelbase.h"
+#include "widgets/section_container.h"
 
 class ColorCombo;
 class ColorPalette;
@@ -80,6 +81,7 @@
 
 private:
 	PageItem* currentItemFromSelection();
+	void enablePalettes(bool enable);
 	
 public slots:
 	void setMainWindow(ScribusMainWindow *mw);
@@ -98,20 +100,25 @@
 	void setLocked(bool);
 
 private slots:
-	void SelTab(int t);
 
-	void NewLineMode(int mode);
+	void newLineMode(int mode);
 	void handleGradientChanged();
 	void handleNewShape(int frameType);
-	void NewSpGradient(double x1, double y1, double x2, double y2, double fx, double fy, double sg, double sk, double cx, double cy);
+	void newSpGradient(double x1, double y1, double x2, double y2, double fx, double fy, double sg, double sk, double cx, double cy);
 	void toggleGradientEdit(int);
-	void NewSpGradientM(double x1, double y1, double x2, double y2, double fx, double fy, double sg, double sk);
+	void newSpGradientM(double x1, double y1, double x2, double y2, double fx, double fy, double sg, double sk);
 	void toggleGradientEditM();
 	void handleShapeEdit();
 
 protected:
-	ScTreeWidget* TabStack {nullptr};
 
+	SectionContainer * scXYZ {nullptr};
+	SectionContainer * scShape {nullptr};
+	SectionContainer * scLine {nullptr};
+	SectionContainer * scColor {nullptr};
+	SectionContainer * scTransparency {nullptr};
+	SectionContainer * scShadow {nullptr};
+
 	bool m_haveDoc {false};
 	bool m_haveItem {false};
 	double m_unitRatio {1.0};
@@ -121,15 +128,6 @@
 	UndoManager *undoManager {nullptr};
 	
 	ScGuardedPtr<ScribusDoc> m_doc;
-
-	int idXYZItem {0};
-	int idShapeItem {0};
-	int idTableItem {0};
-	int idLineItem {0};
-	int idColorsItem {0};
-	int idTransparencyItem {0};
-	int idGroupItem {0};
-	int idShadowItem {0};
 };
 
 #endif
Index: scribus/ui/propertiespalette_text.cpp
===================================================================
--- scribus/ui/propertiespalette_text.cpp	(Revision 25566)
+++ scribus/ui/propertiespalette_text.cpp	(Arbeitskopie)
@@ -31,6 +31,7 @@
 #include "propertywidget_orphans.h"
 #include "propertywidget_pareffect.h"
 #include "propertywidget_pathtext.h"
+#include "propertywidget_text.h"
 #include "propertywidget_textcolor.h"
 #include "scribus.h"
 #include "scribusapp.h"
@@ -38,69 +39,104 @@
 #include "stylecombos.h"
 #include "undomanager.h"
 #include "langmgr.h"
+#include "widgets/section_container.h"
 
 //using namespace std;
 
 PropertiesPalette_Text::PropertiesPalette_Text( QWidget* parent) : QWidget(parent)
 {
-	setupUi(this);
 
-	fontSize->setPrefix("");
-	
-	iconSetChange();
+	IconManager &iconManager = IconManager::instance();
 
-	colorWidgets = new PropertyWidget_TextColor(textTree);
-	colorWidgetsItem = textTree->addItem( colorWidgets, tr("Color && Effects") );
+	advancedWidgets = new PropertyWidget_Advanced(this);
+	scAdvanced = new SectionContainer(tr("Advanced Settings"));
+	scAdvanced->addPage(advancedWidgets);
+	scAdvanced->setCollapseIcons(iconManager.loadPixmap("collapse"), iconManager.loadPixmap("expand"));
+	scAdvanced->setIsCollapsed(true);
 
-	flopBox = new PropertyWidget_Flop(textTree);
-	flopItem = textTree->addItem( flopBox, tr("First Line Offset"));
+	distanceWidgets = new PropertyWidget_Distance(this);
+	scDistance = new SectionContainer(tr("Columns && Text Distances"));
+	scDistance->addPage(distanceWidgets);
+	scDistance->setCollapseIcons(iconManager.loadPixmap("collapse"), iconManager.loadPixmap("expand"));
+	scDistance->setIsCollapsed(true);
 
-	orphanBox = new PropertyWidget_Orphans(textTree);
-	orphanItem = textTree->addItem(orphanBox, tr("Orphans and Widows"));
+	flopBox = new PropertyWidget_Flop(this);
+	scFlop = new SectionContainer(tr("First Line Offset"));
+	scFlop->addPage(flopBox);
+	scFlop->setCollapseIcons(iconManager.loadPixmap("collapse"), iconManager.loadPixmap("expand"));
+	scFlop->setIsCollapsed(true);
 
-	parEffectWidgets = new PropertyWidget_ParEffect(textTree);
-	parEffectItem = textTree->addItem(parEffectWidgets, tr("Paragraph Effects"));
+	fontfeaturesWidget = new PropertyWidget_FontFeatures(this);
+	scFontFeatures = new SectionContainer(tr("Font Features"));
+	scFontFeatures->addPage(fontfeaturesWidget);
+	scFontFeatures->setCollapseIcons(iconManager.loadPixmap("collapse"), iconManager.loadPixmap("expand"));
+	scFontFeatures->setIsCollapsed(true);
 
-	distanceWidgets = new PropertyWidget_Distance(textTree);
-	distanceItem = textTree->addItem(distanceWidgets, tr("Columns && Text Distances"));
+	hyphenationWidget = new PropertyWidget_Hyphenation(this);
+	scHyphenation = new SectionContainer(tr("Hyphenation"));
+	scHyphenation->addPage(hyphenationWidget);
+	scHyphenation->setCollapseIcons(iconManager.loadPixmap("collapse"), iconManager.loadPixmap("expand"));
+	scHyphenation->setIsCollapsed(true);
 
-	//<< Optical Margins
-	optMargins = new PropertyWidget_OptMargins(textTree);
-	optMarginsItem = textTree->addItem(optMargins, tr("Optical Margins"));
-	//>> Optical Margins
+	optMargins = new PropertyWidget_OptMargins(this);
+	scOptMargins = new SectionContainer(tr("Optical Margins"));
+	scOptMargins->addPage(optMargins);
+	scOptMargins->setCollapseIcons(iconManager.loadPixmap("collapse"), iconManager.loadPixmap("expand"));
+	scOptMargins->setIsCollapsed(true);
 
-	hyphenationWidget = new PropertyWidget_Hyphenation(textTree);
-	hyphenationWidgetItem = textTree->addItem(hyphenationWidget, tr("Hyphenation"));
+	orphanBox = new PropertyWidget_Orphans(this);
+	scOrphans = new SectionContainer(tr("Orphans and Widows"));
+	scOrphans->addPage(orphanBox);
+	scOrphans->setCollapseIcons(iconManager.loadPixmap("collapse"), iconManager.loadPixmap("expand"));
+	scOrphans->setIsCollapsed(true);
 
-	//<<Advanced Settings
-	advancedWidgets = new PropertyWidget_Advanced(textTree);
-	advancedWidgetsItem = textTree->addItem(advancedWidgets, tr("Advanced Settings"));
+	parEffectWidgets = new PropertyWidget_ParEffect(this);
+	scParEffect = new SectionContainer(tr("Paragraph Effects"));
+	scParEffect->addPage(parEffectWidgets);
+	scParEffect->setCollapseIcons(iconManager.loadPixmap("collapse"), iconManager.loadPixmap("expand"));
+	scParEffect->setIsCollapsed(true);
 
-	//>>Advanced Settings
-	fontfeaturesWidget = new PropertyWidget_FontFeatures(textTree);
-	fontfeaturesWidgetItem = textTree->addItem(fontfeaturesWidget, tr("Font Features"));
+	pathTextWidgets = new PropertyWidget_PathText(this);
+	scPathText = new SectionContainer(tr("Path Text Properties"));
+	scPathText->addPage(pathTextWidgets);
+	scPathText->setCollapseIcons(iconManager.loadPixmap("collapse"), iconManager.loadPixmap("expand"));
+	scPathText->setIsCollapsed(true);
 
-	pathTextWidgets = new PropertyWidget_PathText(textTree);
-	pathTextItem = textTree->addItem(pathTextWidgets, tr("Path Text Properties"));
+	textWidgets = new PropertyWidget_Text(this);
+	scText = new SectionContainer(tr("Text"));
+	scText->addPage(textWidgets);
+	scText->setCollapseIcons(iconManager.loadPixmap("collapse"), iconManager.loadPixmap("expand"));
+	scText->setIsCollapsed(false);
 
+	colorWidgets = new PropertyWidget_TextColor(this);
+	scTextColor = new SectionContainer(tr("Color && Effects"));
+	scTextColor->addPage(colorWidgets);
+	scTextColor->setCollapseIcons(iconManager.loadPixmap("collapse"), iconManager.loadPixmap("expand"));
+	scTextColor->setIsCollapsed(true);
+
+	// Layout stack
+	QVBoxLayout * lyt = new QVBoxLayout();
+	lyt->setContentsMargins(0, 0, 0, 0);
+	lyt->setSpacing(0);
+	lyt->addWidget(scText);
+	lyt->addWidget(scTextColor);
+	lyt->addWidget(scFlop);
+	lyt->addWidget(scOrphans);
+	lyt->addWidget(scParEffect);
+	lyt->addWidget(scDistance);
+	lyt->addWidget(scOptMargins);
+	lyt->addWidget(scHyphenation);
+	lyt->addWidget(scAdvanced);
+	lyt->addWidget(scFontFeatures);
+	lyt->addWidget(scPathText);
+	lyt->addStretch(1);
+	setLayout(lyt);
+
+	iconSetChange();
 	languageChange();
 
-	connect(lineSpacing   , SIGNAL(valueChanged(double)), this, SLOT(handleLineSpacing()));
-	connect(fonts         , SIGNAL(fontSelected(QString)), this, SLOT(handleTextFont(QString)));
-	connect(fontSize      , SIGNAL(valueChanged(double)), this, SLOT(handleFontSize()));
-	connect(textAlignment , SIGNAL(State(int))   , this, SLOT(handleAlignment(int)));
-	connect(textDirection , SIGNAL(State(int))   , this, SLOT(handleDirection(int)));
-	connect(charStyleClear, SIGNAL(clicked()), this, SLOT(doClearCStyle()));
-	connect(paraStyleClear, SIGNAL(clicked()), this, SLOT(doClearPStyle()));
-
 	connect(flopBox->flopGroup, SIGNAL(idClicked(int)), this, SLOT(handleFirstLinePolicy(int)));
 
-	connect(lineSpacingModeCombo, SIGNAL(currentIndexChanged(int)), this, SLOT(handleLineSpacingMode(int)));
-	connect(langCombo, SIGNAL(currentIndexChanged(int)), this, SLOT(changeLang(int)));
-
-	connect(fontfeaturesWidget, SIGNAL(needsRelayout()), this, SLOT(updateTreeLayout()));
-	connect(parEffectWidgets,   SIGNAL(needsRelayout()), this, SLOT(updateTreeLayout()));
-
 	connect(ScQApp, SIGNAL(iconSetChanged()), this, SLOT(iconSetChange()));
 	connect(ScQApp, SIGNAL(localeChanged()), this, SLOT(localeChange()));
 
@@ -111,6 +147,7 @@
 {
 	m_ScMW = mw;
 
+	textWidgets->setMainWindow(mw);
 	advancedWidgets->setMainWindow(mw);
 	fontfeaturesWidget->setMainWindow(mw);
 	colorWidgets->setMainWindow(mw);
@@ -122,8 +159,6 @@
 
 	connect(m_ScMW, SIGNAL(UpdateRequest(int))     , this  , SLOT(handleUpdateRequest(int)));
 
-	connect(paraStyleCombo, SIGNAL(newStyle(QString)), m_ScMW, SLOT(setNewParStyle(QString)), Qt::UniqueConnection);
-	connect(charStyleCombo, SIGNAL(newStyle(QString)), m_ScMW, SLOT(setNewCharStyle(QString)), Qt::UniqueConnection);
 }
 
 void PropertiesPalette_Text::setDoc(ScribusDoc *d)
@@ -146,9 +181,7 @@
 	m_haveDoc  = true;
 	m_haveItem = false;
 
-	fontSize->setValues(0.5, 2048, 2, 1);
-	lineSpacing->setValues(1, 2048, 2, 1);
-
+	textWidgets->setDoc(m_doc);
 	advancedWidgets->setDoc(m_doc);
 	fontfeaturesWidget->setDoc(m_doc);
 	colorWidgets->setDoc(m_doc);
@@ -160,10 +193,6 @@
 	orphanBox->setDoc(m_doc);
 	pathTextWidgets->setDoc(m_doc);
 
-	fonts->rebuildList(m_doc);
-	paraStyleCombo->setDoc(m_doc);
-	charStyleCombo->setDoc(m_doc);
-
 	connect(m_doc->m_Selection, SIGNAL(selectionChanged()), this, SLOT(handleSelectionChanged()));
 	connect(m_doc             , SIGNAL(docChanged())      , this, SLOT(handleSelectionChanged()));
 }
@@ -181,9 +210,7 @@
 	m_doc      = nullptr;
 	m_item     = nullptr;
 
-	paraStyleCombo->setDoc(nullptr);
-	charStyleCombo->setDoc(nullptr);
-
+	textWidgets->setDoc(nullptr);
 	advancedWidgets->setDoc(nullptr);
 	fontfeaturesWidget->setDoc(nullptr);
 	colorWidgets->setDoc(nullptr);
@@ -195,8 +222,6 @@
 	parEffectWidgets->setDoc(nullptr);
 	pathTextWidgets->setDoc(nullptr);
 
-	m_haveItem = false;
-
 	setEnabled(false);
 }
 
@@ -272,21 +297,24 @@
 	// ColorWidget will handle its update itself
 	/*if (updateFlags & reqColorsUpdate)
 		updateColorList();*/
+
+	textWidgets->handleUpdateRequest(updateFlags);
+
 	if (updateFlags & reqCharStylesUpdate)
 	{
-		charStyleCombo->updateStyleList();
+//		charStyleCombo->updateStyleList();
 		parEffectWidgets->updateCharStyles();
 	}
-	if (updateFlags & reqParaStylesUpdate)
-		paraStyleCombo->updateStyleList();
-	if (updateFlags & reqDefFontListUpdate)
-		fonts->rebuildList(nullptr);
-	if (updateFlags & reqDocFontListUpdate)
-		fonts->rebuildList(m_haveDoc ? m_doc : nullptr);
+//	if (updateFlags & reqParaStylesUpdate)
+//		paraStyleCombo->updateStyleList();
+//	if (updateFlags & reqDefFontListUpdate)
+//		fonts->rebuildList(nullptr);
+//	if (updateFlags & reqDocFontListUpdate)
+//		fonts->rebuildList(m_haveDoc ? m_doc : nullptr);
 	if (updateFlags & reqStyleComboDocUpdate)
 	{
-		paraStyleCombo->setDoc(m_haveDoc ? m_doc : nullptr);
-		charStyleCombo->setDoc(m_haveDoc ? m_doc : nullptr);
+//		paraStyleCombo->setDoc(m_haveDoc ? m_doc : nullptr);
+//		charStyleCombo->setDoc(m_haveDoc ? m_doc : nullptr);
 		parEffectWidgets->setDoc(m_haveDoc ? m_doc : nullptr);
 	}
 }
@@ -343,17 +371,7 @@
 
 void PropertiesPalette_Text::iconSetChange()
 {
-	IconManager& iconManager = IconManager::instance();
-
-	fontSizeLabel->setPixmap(iconManager.loadPixmap("zeichen.png"));
-	lineSpacingLabel->setPixmap(iconManager.loadPixmap("linespacing2.png"));
-	textAlignmentLabel->setPixmap(iconManager.loadPixmap("22/text-align.png"));
-	langLabel->setPixmap(iconManager.loadPixmap("22/language.png"));
-	paraStyleLabel->setPixmap(iconManager.loadPixmap("22/paragraph-style.png"));
-	charStyleLabel->setPixmap(iconManager.loadPixmap("22/character-style.png"));
-
-	paraStyleClear->setIcon(iconManager.loadPixmap("16/edit-clear.png"));
-	charStyleClear->setIcon(iconManager.loadPixmap("16/edit-clear.png"));
+	textWidgets->iconSetChange();
 }
 
 void PropertiesPalette_Text::unitChange()
@@ -371,6 +389,7 @@
 	optMargins->unitChange();
 	pathTextWidgets->unitChange();
 	parEffectWidgets->unitChange();
+	textWidgets->unitChange();
 
 	m_haveItem = tmp;
 }
@@ -377,9 +396,7 @@
 
 void PropertiesPalette_Text::localeChange()
 {
-	const QLocale& l(LocaleManager::instance().userPreferredLocale());
-	fontSize->setLocale(l);
-	lineSpacing->setLocale(l);
+	textWidgets->localeChange();
 	advancedWidgets->localeChange();
 	colorWidgets->localeChange();
 	distanceWidgets->localeChange();
@@ -387,76 +404,14 @@
 	pathTextWidgets->localeChange();
 }
 
-void PropertiesPalette_Text::handleLineSpacingMode(int id)
-{
-	if (!m_haveDoc || !m_haveItem)
-		return;
-	Selection tempSelection(this, false);
-	tempSelection.addItem(m_item, true);
-	m_doc->itemSelection_SetLineSpacingMode(id, &tempSelection);
-//	updateStyle(((m_doc->appMode == modeEdit) || (m_doc->appMode == modeEditTable)) ? m_item->currentStyle() : m_item->itemText.defaultStyle());
-	m_doc->regionsChanged()->update(QRect());
-}
-
-void PropertiesPalette_Text::changeLang(int id)
-{
-	if (!m_haveDoc || !m_haveItem || !m_ScMW || m_ScMW->scriptIsRunning())
-		return;
-	QStringList languageList;
-	LanguageManager::instance()->fillInstalledStringList(&languageList);
-	QString abrv = LanguageManager::instance()->getAbbrevFromLang(languageList.value(id),false);
-	Selection tempSelection(this, false);
-	tempSelection.addItem(m_item, true);
-	m_doc->itemSelection_SetLanguage(abrv, &tempSelection);
-}
-
-void PropertiesPalette_Text::showLineSpacing(double r)
-{
-	if (!m_ScMW || m_ScMW->scriptIsRunning())
-		return;
-	bool inEditMode = (m_doc->appMode == modeEdit || m_doc->appMode == modeEditTable);
-	bool tmp = m_haveItem;
-	m_haveItem = false;
-	lineSpacing->showValue(r);
-	const ParagraphStyle& curStyle(m_haveItem && inEditMode ? m_item->currentStyle() : m_item->itemText.defaultStyle());
-	if (tmp)
-	{
-		setupLineSpacingSpinbox(curStyle.lineSpacingMode(), r);
-		lineSpacingModeCombo->setCurrentIndex(curStyle.lineSpacingMode());
-	}
-	m_haveItem = tmp;
-}
-
-void PropertiesPalette_Text::showFontFace(const QString& newFont)
-{
-	if (!m_ScMW || m_ScMW->scriptIsRunning())
-		return;
-	bool tmp = m_haveItem;
-	m_haveItem = false;
-	if (m_item != nullptr)
-		fonts->rebuildList(m_doc, m_item->isAnnotation());
-	fonts->setCurrentFont(newFont);
-	m_haveItem = tmp;
-}
-
 void PropertiesPalette_Text::showFontSize(double s)
 {
-	if (!m_ScMW || m_ScMW->scriptIsRunning())
-		return;
-	fontSize->showValue(s / 10.0);
+	textWidgets->showFontSize(s);
 }
 
 void PropertiesPalette_Text::showLanguage(const QString& w)
 {
-	if (!m_ScMW || m_ScMW->scriptIsRunning())
-		return;
-	QStringList lang;
-	LanguageManager::instance()->fillInstalledStringList(&lang);
-	QString langName = LanguageManager::instance()->getLangFromAbbrev(w, true);
-
-	bool sigBlocked  = langCombo->blockSignals(true);
-	langCombo->setCurrentIndex(lang.indexOf(langName));
-	langCombo->blockSignals(sigBlocked);
+	textWidgets->showLanguage(w);
 }
 
 void PropertiesPalette_Text::showFirstLinePolicy( FirstLineOffsetPolicy f )
@@ -471,29 +426,6 @@
 		flopBox->flopBaselineGrid->setChecked(true);
 }
 
-void PropertiesPalette_Text::setupLineSpacingSpinbox(int mode, double value)
-{
-	bool blocked = lineSpacing->blockSignals(true);
-	if (mode > 0)
-	{
-		if (mode == 1)
-			lineSpacing->setSpecialValueText( tr( "Auto" ) );
-		if (mode == 2)
-			lineSpacing->setSpecialValueText( tr( "Baseline" ) );
-		lineSpacing->setMinimum(0);
-		lineSpacing->setValue(0);
-		lineSpacing->setEnabled(false);
-	}
-	else
-	{
-		lineSpacing->setSpecialValueText("");
-		lineSpacing->setMinimum(1);
-		lineSpacing->setValue(value);
-		lineSpacing->setEnabled(true);
-	}
-	lineSpacing->blockSignals(blocked);
-}
-
 void PropertiesPalette_Text::updateCharStyle(const CharStyle& charStyle)
 {
 	if (!m_ScMW || m_ScMW->scriptIsRunning())
@@ -503,10 +435,7 @@
 	fontfeaturesWidget->updateCharStyle(charStyle);
 	colorWidgets->updateCharStyle(charStyle);
 	hyphenationWidget->updateCharStyle(charStyle);
-
-	showFontFace(charStyle.font().scName());
-	showFontSize(charStyle.fontSize());
-	showLanguage(charStyle.language());
+	textWidgets->updateCharStyle(charStyle);
 }
 
 void PropertiesPalette_Text::updateStyle(const ParagraphStyle& newCurrent)
@@ -514,8 +443,6 @@
 	if (!m_ScMW || m_ScMW->scriptIsRunning())
 		return;
 
-	const CharStyle& charStyle = newCurrent.charStyle();
-
 	advancedWidgets->updateStyle(newCurrent);
 	fontfeaturesWidget->updateStyle(newCurrent);
 	colorWidgets->updateStyle(newCurrent);
@@ -523,202 +450,36 @@
 	orphanBox->updateStyle (newCurrent);
 	parEffectWidgets->updateStyle(newCurrent);
 	hyphenationWidget->updateStyle(newCurrent);
-
-	showFontFace(charStyle.font().scName());
-	showFontSize(charStyle.fontSize());
-	showLanguage(charStyle.language());
-
-	if (m_item)
-	{
-		QString defaultParStyle = m_item->itemText.defaultStyle().parent();
-		if (defaultParStyle.isEmpty())
-			defaultParStyle = CommonStrings::DefaultParagraphStyle;
-		paraStyleCombo->setDefaultStyle(defaultParStyle);
-	}
-	showParStyle(newCurrent.parent());
-
-	if (m_item)
-	{
-		QString defaultCharStyle;
-		if (!newCurrent.parent().isEmpty())
-		{
-			const ParagraphStyle* paraStyle = m_doc->paragraphStyles().getPointer(newCurrent.parent());
-			if (paraStyle)
-				defaultCharStyle = paraStyle->charStyle().parent();
-			if (defaultCharStyle.isEmpty())
-				defaultCharStyle = CommonStrings::DefaultCharacterStyle;
-		}
-		if (defaultCharStyle.isEmpty())
-			defaultCharStyle = m_item->itemText.defaultStyle().charStyle().parent();
-		if (defaultCharStyle.isEmpty())
-			defaultCharStyle = CommonStrings::DefaultCharacterStyle;
-		charStyleCombo->setDefaultStyle(defaultCharStyle);
-	}
-	showCharStyle(charStyle.parent());
-
-	bool tmp = m_haveItem;
-	m_haveItem = false;
-
-	setupLineSpacingSpinbox(newCurrent.lineSpacingMode(), newCurrent.lineSpacing());
-	lineSpacingModeCombo->setCurrentIndex(newCurrent.lineSpacingMode());
-	textAlignment->setStyle(newCurrent.alignment(), newCurrent.direction());
-	textDirection->setStyle(newCurrent.direction());
-
-	m_haveItem = tmp;
+	textWidgets->updateStyle(newCurrent);
 }
 
 void PropertiesPalette_Text::updateCharStyles()
 {
-	charStyleCombo->updateStyleList();
+	textWidgets->updateCharStyles();
 	parEffectWidgets->updateCharStyles();
 }
 
 void PropertiesPalette_Text::updateParagraphStyles()
 {
-	paraStyleCombo->updateStyleList();
-	charStyleCombo->updateStyleList();
+	textWidgets->updateParagraphStyles();
 	parEffectWidgets->updateCharStyles();
 }
 
 void PropertiesPalette_Text::updateTextStyles()
 {
-	paraStyleCombo->updateStyleList();
-	charStyleCombo->updateStyleList();
+	textWidgets->updateTextStyles();
 }
 
-void PropertiesPalette_Text::updateTreeLayout()
-{
-	textTree->doItemsLayout();
-}
-
 void PropertiesPalette_Text::showAlignment(int e)
 {
-	if (!m_ScMW || m_ScMW->scriptIsRunning())
-		return;
-	bool tmp = m_haveItem;
-	m_haveItem = false;
-	textAlignment->setEnabled(true);
-	textAlignment->setStyle(e, textDirection->getStyle());
-	m_haveItem = tmp;
+	textWidgets->showAlignment(e);
 }
 
 void PropertiesPalette_Text::showDirection(int e)
 {
-	if (!m_ScMW || m_ScMW->scriptIsRunning())
-		return;
-	bool tmp = m_haveItem;
-	m_haveItem = false;
-	textDirection->setEnabled(true);
-	textDirection->setStyle(e);
-	m_haveItem = tmp;
+	textWidgets->showDirection(e);
 }
 
-void PropertiesPalette_Text::showCharStyle(const QString& name)
-{
-	if (!m_ScMW || m_ScMW->scriptIsRunning())
-		return;
-	bool blocked = charStyleCombo->blockSignals(true);
-	charStyleCombo->setStyle(name);
-	charStyleCombo->blockSignals(blocked);
-}
-
-void PropertiesPalette_Text::showParStyle(const QString& name)
-{
-	if (!m_ScMW || m_ScMW->scriptIsRunning())
-		return;
-	bool blocked = paraStyleCombo->blockSignals(true);
-	paraStyleCombo->setStyle(name);
-	paraStyleCombo->blockSignals(blocked);
-}
-
-void PropertiesPalette_Text::handleLineSpacing()
-{
-	if (!m_haveDoc || !m_haveItem || !m_ScMW || m_ScMW->scriptIsRunning())
-		return;
-	Selection tempSelection(this, false);
-	tempSelection.addItem(m_item, true);
-	m_doc->itemSelection_SetLineSpacing(lineSpacing->value(), &tempSelection);
-}
-
-void PropertiesPalette_Text::handleFontSize()
-{
-	if (!m_haveDoc || !m_haveItem || !m_ScMW || m_ScMW->scriptIsRunning())
-		return;
-	Selection tempSelection(this, false);
-	tempSelection.addItem(m_item, true);
-	m_doc->itemSelection_SetFontSize(qRound(fontSize->value()*10.0), &tempSelection);
-}
-
-void PropertiesPalette_Text::handleAlignment(int a)
-{
-	if (!m_haveDoc || !m_haveItem || !m_ScMW || m_ScMW->scriptIsRunning())
-		return;
-	Selection tempSelection(this, false);
-	tempSelection.addItem(m_item, true);
-	m_doc->itemSelection_SetAlignment(a, &tempSelection);
-	if (m_item->isPathText())
-		pathTextWidgets->handleSelectionChanged();
-}
-
-void PropertiesPalette_Text::handleDirection(int d)
-{
-	if (!m_haveDoc || !m_haveItem || !m_ScMW || m_ScMW->scriptIsRunning())
-		return;
-	Selection tempSelection(this, false);
-	tempSelection.addItem(m_item, true);
-	m_doc->itemSelection_SetDirection(d, &tempSelection);
-	// If current text alignment is left or right, change it to match direction
-	if (d == ParagraphStyle::RTL && textAlignment->selectedId() == ParagraphStyle::LeftAligned)
-	{
-		m_doc->itemSelection_SetAlignment(ParagraphStyle::RightAligned, &tempSelection);
-		textAlignment->setTypeStyle(ParagraphStyle::RightAligned);
-	}
-	else if (d == ParagraphStyle::LTR && textAlignment->selectedId() == ParagraphStyle::RightAligned)
-	{
-		m_doc->itemSelection_SetAlignment(ParagraphStyle::LeftAligned, &tempSelection);
-		textAlignment->setTypeStyle(ParagraphStyle::LeftAligned);
-	}
-}
-
-void PropertiesPalette_Text::handleTextFont(const QString& font)
-{
-	if (!m_haveDoc || !m_haveItem || !m_ScMW || m_ScMW->scriptIsRunning())
-		return;
-	Selection tempSelection(this, false);
-	tempSelection.addItem(m_item, true);
-	m_doc->itemSelection_SetFont(font, &tempSelection);
-}
-
-void PropertiesPalette_Text::doClearCStyle()
-{
-	if (!m_ScMW || m_ScMW->scriptIsRunning() || !m_haveDoc || !m_haveItem)
-		return;
-	Selection tempSelection(this, false);
-	tempSelection.addItem(m_item, true);
-	m_doc->itemSelection_EraseCharStyle(&tempSelection);
-}
-
-
-void PropertiesPalette_Text::doClearPStyle()
-{
-	if (!m_ScMW || m_ScMW->scriptIsRunning() || !m_haveDoc || !m_haveItem)
-		return;
-
-	UndoTransaction activeTransaction;
-	if (UndoManager::undoEnabled())
-		activeTransaction = UndoManager::instance()->beginTransaction(Um::SelectionGroup, Um::IGroup, Um::RemoveTextStyle, tr( "remove direct paragraph formatting" ), Um::IFont);
-
-	Selection tempSelection(this, false);
-	tempSelection.addItem(m_item, true);
-	m_doc->itemSelection_ClearBulNumStrings(&tempSelection);
-	m_doc->itemSelection_EraseParagraphStyle(&tempSelection);
-	CharStyle emptyCStyle;
-	m_doc->itemSelection_SetCharStyle(emptyCStyle, &tempSelection);
-
-	if (activeTransaction)
-		activeTransaction.commit();
-}
-
 void PropertiesPalette_Text::updateColorList()
 {
 	if (!m_haveDoc || !m_ScMW || m_ScMW->scriptIsRunning())
@@ -739,35 +500,18 @@
 
 void PropertiesPalette_Text::languageChange()
 {
-	retranslateUi(this);
+	scAdvanced->setText(tr("Advanced Settings"));
+	scDistance->setText(tr("Columns && Text Distances"));
+	scFlop->setText(tr("First Line Offset"));
+	scFontFeatures->setText(tr("Font Features"));
+	scHyphenation->setText(tr("Hyphenation"));
+	scOptMargins->setText(tr("Optical Margins"));
+	scOrphans->setText(tr("Orphans and Widows"));
+	scParEffect->setText(tr("Paragraph Effects"));
+	scPathText->setText(tr("Path Text Properties"));
+	scText->setText(tr("Text"));
+	scTextColor->setText(tr("Color && Effects"));
 
-	textTree->setItemText(colorWidgetsItem, tr("Color && Effects"));
-	textTree->setItemText(flopItem, tr("First Line Offset"));
-	textTree->setItemText(hyphenationWidgetItem, tr("Hyphenation"));
-	textTree->setItemText(orphanItem, tr("Orphans and Widows"));
-	textTree->setItemText(parEffectItem, tr("Paragraph Effects"));
-	textTree->setItemText(distanceItem, tr("Columns && Text Distances"));
-	textTree->setItemText(optMarginsItem, tr("Optical Margins"));
-	textTree->setItemText(advancedWidgetsItem, tr("Advanced Settings"));
-	textTree->setItemText(fontfeaturesWidgetItem, tr("Font Features"));
-	textTree->setItemText(pathTextItem, tr("Path Text Properties"));
-
-	QSignalBlocker lineSpacingModeBlocker(lineSpacingModeCombo);
-	int oldLineSpacingMode = lineSpacingModeCombo->currentIndex();
-	lineSpacingModeCombo->clear();
-	lineSpacingModeCombo->addItem( tr("Fixed Linespacing"));
-	lineSpacingModeCombo->addItem( tr("Automatic Linespacing"));
-	lineSpacingModeCombo->addItem( tr("Align to Baseline Grid"));
-	lineSpacingModeCombo->setCurrentIndex(oldLineSpacingMode);
-
-	QSignalBlocker langComboBlocker(langCombo);
-	QStringList languageList;
-	LanguageManager::instance()->fillInstalledStringList(&languageList);
-	int oldLang = langCombo->currentIndex();
-	langCombo->clear();
-	langCombo->addItems(languageList);
-	langCombo->setCurrentIndex(oldLang);
-
 	colorWidgets->languageChange();
 	flopBox->languageChange();
 	orphanBox->languageChange();
@@ -777,9 +521,7 @@
 	pathTextWidgets->languageChange();
 	fontfeaturesWidget->languageChange();
 	hyphenationWidget->languageChange();
-
-	textAlignment->languageChange();
-	textDirection->languageChange();
+	textWidgets->languageChange();
 }
 
 void PropertiesPalette_Text::handleFirstLinePolicy(int radioFlop)
Index: scribus/ui/propertiespalette_text.h
===================================================================
--- scribus/ui/propertiespalette_text.h	(Revision 25566)
+++ scribus/ui/propertiespalette_text.h	(Arbeitskopie)
@@ -7,8 +7,6 @@
 #ifndef PROPERTIESPALETTE_TEXT_H
 #define PROPERTIESPALETTE_TEXT_H
 
-#include "ui_propertiespalette_textbase.h"
-
 #include "scribusapi.h"
 #include "scrpalettebase.h"
 #include "scrspinbox.h"
@@ -27,12 +25,14 @@
 class PropertyWidget_OptMargins;
 class PropertyWidget_Orphans;
 class PropertyWidget_PathText;
+class PropertyWidget_Text;
 class PropertyWidget_TextColor;
+class SectionContainer;
 class ScribusDoc;
 class ScribusMainWindow;
 class Selection;
 
-class SCRIBUS_API PropertiesPalette_Text : public QWidget, public Ui::PropertiesPalette_TextBase
+class SCRIBUS_API PropertiesPalette_Text : public QWidget
 {
 	Q_OBJECT
 
@@ -76,43 +76,23 @@
 	void languageChange();
 	void unitChange();
 	void localeChange();
-	void changeLang(int id);
 
 	void showAlignment(int e);
 	void showDirection(int e);
-	void showCharStyle(const QString& name);
-	void showFontFace(const QString&);
 	void showFontSize(double s);
 	void showLanguage(const QString& w);
 	void showFirstLinePolicy(FirstLineOffsetPolicy);
-	void showLineSpacing(double r);
-	void showParStyle(const QString& name);
-	
-	void setupLineSpacingSpinbox(int mode, double value);
-	
+
 	/// update TB values:
 	void updateCharStyle(const CharStyle& charStyle);
-	void updateStyle(const ParagraphStyle& newCurrent);
-	
+	void updateStyle(const ParagraphStyle& newCurrent);	
 	void updateCharStyles();
 	void updateParagraphStyles();
-	void updateTextStyles();
-	
-	void handleLineSpacingMode(int id);
-	void handleTextFont(const QString&);
+	void updateTextStyles();	
 
-	// update widget layout
-	void updateTreeLayout();
+private slots:
 
-private slots:
-	void handleAlignment(int a);
-	void handleDirection(int d);
 	void handleFirstLinePolicy(int);
-	void handleFontSize();
-	void handleLineSpacing();
-	
-	void doClearCStyle();
-	void doClearPStyle();
 
 protected:
 	PropertyWidget_Advanced* advancedWidgets;
@@ -124,18 +104,20 @@
 	PropertyWidget_Orphans* orphanBox;
 	PropertyWidget_ParEffect* parEffectWidgets;
 	PropertyWidget_PathText* pathTextWidgets;
+	PropertyWidget_Text* textWidgets;
 	PropertyWidget_TextColor* colorWidgets;
 
-	int advancedWidgetsItem;
-	int colorWidgetsItem;
-	int distanceItem;
-	int flopItem;
-	int fontfeaturesWidgetItem;
-	int hyphenationWidgetItem;
-	int optMarginsItem;
-	int orphanItem;
-	int parEffectItem;
-	int pathTextItem;
+	SectionContainer * scAdvanced = {nullptr};
+	SectionContainer * scDistance = {nullptr};
+	SectionContainer * scFlop = {nullptr};
+	SectionContainer * scFontFeatures = {nullptr};
+	SectionContainer * scHyphenation = {nullptr};
+	SectionContainer * scOptMargins = {nullptr};
+	SectionContainer * scOrphans = {nullptr};
+	SectionContainer * scParEffect = {nullptr};
+	SectionContainer * scPathText = {nullptr};
+	SectionContainer * scText = {nullptr};
+	SectionContainer * scTextColor = {nullptr};
 
 };
 
Index: scribus/ui/propertiespalette_textbase.ui
===================================================================
--- scribus/ui/propertiespalette_textbase.ui	(Revision 25566)
+++ scribus/ui/propertiespalette_textbase.ui	(nicht existent)
@@ -1,370 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ui version="4.0">
- <class>PropertiesPalette_TextBase</class>
- <widget class="QWidget" name="PropertiesPalette_TextBase">
-  <property name="geometry">
-   <rect>
-    <x>0</x>
-    <y>0</y>
-    <width>308</width>
-    <height>390</height>
-   </rect>
-  </property>
-  <layout class="QVBoxLayout" name="verticalLayout">
-   <property name="spacing">
-    <number>3</number>
-   </property>
-   <property name="leftMargin">
-    <number>3</number>
-   </property>
-   <property name="topMargin">
-    <number>3</number>
-   </property>
-   <property name="rightMargin">
-    <number>3</number>
-   </property>
-   <property name="bottomMargin">
-    <number>3</number>
-   </property>
-   <item>
-    <widget class="FontComboH" name="fonts" native="true"/>
-   </item>
-   <item>
-    <layout class="QHBoxLayout" name="horizontalLayout">
-     <property name="spacing">
-      <number>3</number>
-     </property>
-     <item>
-      <widget class="QLabel" name="fontSizeLabel">
-       <property name="minimumSize">
-        <size>
-         <width>20</width>
-         <height>0</height>
-        </size>
-       </property>
-       <property name="maximumSize">
-        <size>
-         <width>22</width>
-         <height>22</height>
-        </size>
-       </property>
-       <property name="text">
-        <string/>
-       </property>
-       <property name="alignment">
-        <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
-       </property>
-      </widget>
-     </item>
-     <item>
-      <widget class="ScrSpinBox" name="fontSize">
-       <property name="sizePolicy">
-        <sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
-         <horstretch>0</horstretch>
-         <verstretch>0</verstretch>
-        </sizepolicy>
-       </property>
-       <property name="toolTip">
-        <string>Font Size</string>
-       </property>
-       <property name="suffix">
-        <string> pt</string>
-       </property>
-      </widget>
-     </item>
-    </layout>
-   </item>
-   <item>
-    <layout class="QHBoxLayout" name="horizontalLayout_2">
-     <property name="spacing">
-      <number>3</number>
-     </property>
-     <item>
-      <widget class="QLabel" name="lineSpacingLabel">
-       <property name="minimumSize">
-        <size>
-         <width>20</width>
-         <height>0</height>
-        </size>
-       </property>
-       <property name="maximumSize">
-        <size>
-         <width>22</width>
-         <height>22</height>
-        </size>
-       </property>
-       <property name="text">
-        <string/>
-       </property>
-      </widget>
-     </item>
-     <item>
-      <widget class="QComboBox" name="lineSpacingModeCombo">
-       <property name="sizePolicy">
-        <sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
-         <horstretch>0</horstretch>
-         <verstretch>0</verstretch>
-        </sizepolicy>
-       </property>
-       <property name="toolTip">
-        <string>Select the line spacing mode</string>
-       </property>
-      </widget>
-     </item>
-     <item>
-      <widget class="ScrSpinBox" name="lineSpacing">
-       <property name="sizePolicy">
-        <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
-         <horstretch>0</horstretch>
-         <verstretch>0</verstretch>
-        </sizepolicy>
-       </property>
-       <property name="toolTip">
-        <string>Line Spacing</string>
-       </property>
-       <property name="suffix">
-        <string> pt</string>
-       </property>
-      </widget>
-     </item>
-    </layout>
-   </item>
-   <item>
-    <layout class="QHBoxLayout" name="horizontalLayout_5">
-     <property name="spacing">
-      <number>3</number>
-     </property>
-     <item>
-      <widget class="QLabel" name="textAlignmentLabel">
-       <property name="minimumSize">
-        <size>
-         <width>20</width>
-         <height>0</height>
-        </size>
-       </property>
-       <property name="maximumSize">
-        <size>
-         <width>22</width>
-         <height>22</height>
-        </size>
-       </property>
-       <property name="text">
-        <string/>
-       </property>
-      </widget>
-     </item>
-     <item>
-      <widget class="AlignSelect" name="textAlignment" native="true"/>
-     </item>
-     <item alignment="Qt::AlignLeft">
-      <widget class="DirectionSelect" name="textDirection" native="true"/>
-     </item>
-     <item>
-      <spacer name="horizontalSpacer_2">
-       <property name="orientation">
-        <enum>Qt::Horizontal</enum>
-       </property>
-       <property name="sizeHint" stdset="0">
-        <size>
-         <width>40</width>
-         <height>20</height>
-        </size>
-       </property>
-      </spacer>
-     </item>
-    </layout>
-   </item>
-   <item>
-    <layout class="QHBoxLayout" name="horizontalLayout_6">
-     <property name="spacing">
-      <number>3</number>
-     </property>
-     <item>
-      <widget class="QLabel" name="langLabel">
-       <property name="minimumSize">
-        <size>
-         <width>20</width>
-         <height>0</height>
-        </size>
-       </property>
-       <property name="maximumSize">
-        <size>
-         <width>22</width>
-         <height>22</height>
-        </size>
-       </property>
-       <property name="text">
-        <string/>
-       </property>
-      </widget>
-     </item>
-     <item>
-      <widget class="QComboBox" name="langCombo">
-       <property name="sizePolicy">
-        <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
-         <horstretch>0</horstretch>
-         <verstretch>0</verstretch>
-        </sizepolicy>
-       </property>
-       <property name="toolTip">
-        <string>Text Language</string>
-       </property>
-       <property name="editable">
-        <bool>true</bool>
-       </property>
-      </widget>
-     </item>
-    </layout>
-   </item>
-   <item>
-    <layout class="QHBoxLayout" name="horizontalLayout_3">
-     <property name="spacing">
-      <number>3</number>
-     </property>
-     <item>
-      <widget class="QLabel" name="paraStyleLabel">
-       <property name="minimumSize">
-        <size>
-         <width>20</width>
-         <height>0</height>
-        </size>
-       </property>
-       <property name="maximumSize">
-        <size>
-         <width>22</width>
-         <height>22</height>
-        </size>
-       </property>
-       <property name="text">
-        <string/>
-       </property>
-      </widget>
-     </item>
-     <item>
-      <widget class="ParaStyleComboBox" name="paraStyleCombo">
-       <property name="sizePolicy">
-        <sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
-         <horstretch>0</horstretch>
-         <verstretch>0</verstretch>
-        </sizepolicy>
-       </property>
-       <property name="toolTip">
-        <string>Paragraph style of currently selected text or paragraph</string>
-       </property>
-      </widget>
-     </item>
-     <item>
-      <widget class="QToolButton" name="paraStyleClear">
-       <property name="toolTip">
-        <string>Remove Direct Paragraph Formatting</string>
-       </property>
-       <property name="text">
-        <string/>
-       </property>
-      </widget>
-     </item>
-    </layout>
-   </item>
-   <item>
-    <layout class="QHBoxLayout" name="horizontalLayout_4">
-     <property name="spacing">
-      <number>3</number>
-     </property>
-     <item>
-      <widget class="QLabel" name="charStyleLabel">
-       <property name="minimumSize">
-        <size>
-         <width>20</width>
-         <height>0</height>
-        </size>
-       </property>
-       <property name="maximumSize">
-        <size>
-         <width>22</width>
-         <height>22</height>
-        </size>
-       </property>
-       <property name="text">
-        <string/>
-       </property>
-      </widget>
-     </item>
-     <item>
-      <widget class="CharStyleComboBox" name="charStyleCombo">
-       <property name="sizePolicy">
-        <sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
-         <horstretch>0</horstretch>
-         <verstretch>0</verstretch>
-        </sizepolicy>
-       </property>
-       <property name="toolTip">
-        <string>Character style of currently selected text or paragraph</string>
-       </property>
-      </widget>
-     </item>
-     <item>
-      <widget class="QToolButton" name="charStyleClear">
-       <property name="toolTip">
-        <string>Remove Direct Character Formatting</string>
-       </property>
-       <property name="text">
-        <string/>
-       </property>
-      </widget>
-     </item>
-    </layout>
-   </item>
-   <item>
-    <widget class="ScTreeWidget" name="textTree">
-     <column>
-      <property name="text">
-       <string notr="true">1</string>
-      </property>
-     </column>
-    </widget>
-   </item>
-  </layout>
- </widget>
- <customwidgets>
-  <customwidget>
-   <class>ScrSpinBox</class>
-   <extends>QDoubleSpinBox</extends>
-   <header>ui/scrspinbox.h</header>
-  </customwidget>
-  <customwidget>
-   <class>FontComboH</class>
-   <extends>QWidget</extends>
-   <header>ui/fontcombo.h</header>
-   <container>1</container>
-  </customwidget>
-  <customwidget>
-   <class>CharStyleComboBox</class>
-   <extends>QComboBox</extends>
-   <header>ui/stylecombos.h</header>
-  </customwidget>
-  <customwidget>
-   <class>ScTreeWidget</class>
-   <extends>QTreeWidget</extends>
-   <header>ui/sctreewidget.h</header>
-  </customwidget>
-  <customwidget>
-   <class>ParaStyleComboBox</class>
-   <extends>QComboBox</extends>
-   <header>ui/stylecombos.h</header>
-  </customwidget>
-  <customwidget>
-   <class>AlignSelect</class>
-   <extends>QWidget</extends>
-   <header>ui/alignselect.h</header>
-   <container>1</container>
-  </customwidget>
-  <customwidget>
-   <class>DirectionSelect</class>
-   <extends>QWidget</extends>
-   <header>ui/directionselect.h</header>
-   <container>1</container>
-  </customwidget>
- </customwidgets>
- <resources/>
- <connections/>
-</ui>
Index: scribus/ui/propertywidget_text.cpp
===================================================================
--- scribus/ui/propertywidget_text.cpp	(nicht existent)
+++ scribus/ui/propertywidget_text.cpp	(Arbeitskopie)
@@ -0,0 +1,574 @@
+/*
+For general Scribus (>=1.3.2) copyright and licensing information please refer
+to the COPYING file provided with the program. Following this notice may exist
+a copyright and/or license notice that predates the release of Scribus 1.3.2
+for which a new license (GPL+exception) is in place.
+*/
+#include "propertywidget_text.h"
+#include "ui_propertywidget_textbase.h"
+
+#include "appmodes.h"
+#include "commonstrings.h"
+#include "fontcombo.h"
+#include "iconmanager.h"
+#include "localemgr.h"
+#include "pageitem.h"
+#include "pageitem_table.h"
+#include "pageitem_textframe.h"
+#include "scribus.h"
+#include "scribusapp.h"
+#include "selection.h"
+#include "stylecombos.h"
+#include "undomanager.h"
+#include "langmgr.h"
+
+
+PropertyWidget_Text::PropertyWidget_Text( QWidget* parent) : QFrame(parent)
+{
+	setupUi(this);
+
+	fontSize->setPrefix("");
+
+	iconSetChange();
+	languageChange();
+
+	connect(lineSpacing   , SIGNAL(valueChanged(double)), this, SLOT(handleLineSpacing()));
+	connect(fonts         , SIGNAL(fontSelected(QString)), this, SLOT(handleTextFont(QString)));
+	connect(fontSize      , SIGNAL(valueChanged(double)), this, SLOT(handleFontSize()));
+	connect(textAlignment , SIGNAL(State(int))   , this, SLOT(handleAlignment(int)));
+	connect(textDirection , SIGNAL(State(int))   , this, SLOT(handleDirection(int)));
+	connect(charStyleClear, SIGNAL(clicked()), this, SLOT(doClearCStyle()));
+	connect(paraStyleClear, SIGNAL(clicked()), this, SLOT(doClearPStyle()));
+
+	connect(lineSpacingModeCombo, SIGNAL(currentIndexChanged(int)), this, SLOT(handleLineSpacingMode(int)));
+	connect(langCombo, SIGNAL(currentIndexChanged(int)), this, SLOT(changeLang(int)));
+
+//	connect(ScQApp, SIGNAL(iconSetChanged()), this, SLOT(iconSetChange()));
+//	connect(ScQApp, SIGNAL(localeChanged()), this, SLOT(localeChange()));
+
+	setEnabled(false);
+}
+
+void PropertyWidget_Text::setMainWindow(ScribusMainWindow* mw)
+{
+	m_ScMW = mw;
+
+//	connect(m_ScMW, SIGNAL(UpdateRequest(int))     , this  , SLOT(handleUpdateRequest(int)));
+
+	connect(paraStyleCombo, SIGNAL(newStyle(QString)), m_ScMW, SLOT(setNewParStyle(QString)), Qt::UniqueConnection);
+	connect(charStyleCombo, SIGNAL(newStyle(QString)), m_ScMW, SLOT(setNewCharStyle(QString)), Qt::UniqueConnection);
+}
+
+void PropertyWidget_Text::setDoc(ScribusDoc *d)
+{
+	if((d == (ScribusDoc*) m_doc) || (m_ScMW && m_ScMW->scriptIsRunning()))
+		return;
+
+	if (m_doc)
+	{
+		disconnect(m_doc->m_Selection, SIGNAL(selectionChanged()), this, SLOT(handleSelectionChanged()));
+		disconnect(m_doc             , SIGNAL(docChanged())      , this, SLOT(handleSelectionChanged()));
+	}
+
+	m_doc  = d;
+	m_item = nullptr;
+	m_haveDoc  = true;
+	m_haveItem = false;
+
+	fontSize->setValues(0.5, 2048, 2, 1);
+	lineSpacing->setValues(1, 2048, 2, 1);
+
+	fonts->rebuildList(m_doc);
+	paraStyleCombo->setDoc(m_doc);
+	charStyleCombo->setDoc(m_doc);
+
+	if (m_doc.isNull())
+	{
+		return;
+	}
+
+	connect(m_doc->m_Selection, SIGNAL(selectionChanged()), this, SLOT(handleSelectionChanged()));
+	connect(m_doc             , SIGNAL(docChanged())      , this, SLOT(handleSelectionChanged()));
+}
+
+PageItem* PropertyWidget_Text::currentItemFromSelection()
+{
+	PageItem *currentItem = nullptr;
+
+	if (m_doc)
+	{
+		if (m_doc->m_Selection->count() > 1)
+			currentItem = m_doc->m_Selection->itemAt(0);
+		else if (m_doc->m_Selection->count() == 1)
+			currentItem = m_doc->m_Selection->itemAt(0);
+		if (currentItem  && currentItem->isTable() && m_doc->appMode == modeEditTable)
+			currentItem = currentItem->asTable()->activeCell().textFrame();
+	}
+
+	return currentItem;
+}
+
+void PropertyWidget_Text::handleSelectionChanged()
+{
+	if (!m_haveDoc || !m_ScMW || m_ScMW->scriptIsRunning())
+		return;
+
+	PageItem* currItem = currentItemFromSelection();
+	if (m_doc->m_Selection->count() > 1)
+	{
+		setEnabled(false);
+	}
+	else
+	{
+		int itemType = currItem ? (int) currItem->itemType() : -1;
+		m_haveItem = (itemType != -1);
+
+		switch (itemType)
+		{
+		case -1:
+			m_haveItem = false;
+			m_item = nullptr;
+			setEnabled(false);
+			break;
+		case PageItem::TextFrame:
+		case PageItem::PathText:
+			setEnabled(true);
+			break;
+		case PageItem::Table:
+			setEnabled(m_doc->appMode == modeEditTable);
+			break;
+		default:
+			setEnabled(false);
+			break;
+		}
+	}
+	if (currItem)
+	{
+		setCurrentItem(currItem);
+	}
+	updateGeometry();
+}
+
+void PropertyWidget_Text::handleUpdateRequest(int updateFlags)
+{
+	// ColorWidget will handle its update itself
+	/*if (updateFlags & reqColorsUpdate)
+		updateColorList();*/
+	if (updateFlags & reqCharStylesUpdate)
+	{
+		charStyleCombo->updateStyleList();
+	}
+	if (updateFlags & reqParaStylesUpdate)
+		paraStyleCombo->updateStyleList();
+	if (updateFlags & reqDefFontListUpdate)
+		fonts->rebuildList(nullptr);
+	if (updateFlags & reqDocFontListUpdate)
+		fonts->rebuildList(m_haveDoc ? m_doc : nullptr);
+	if (updateFlags & reqStyleComboDocUpdate)
+	{
+		paraStyleCombo->setDoc(m_haveDoc ? m_doc : nullptr);
+		charStyleCombo->setDoc(m_haveDoc ? m_doc : nullptr);
+	}
+}
+
+void PropertyWidget_Text::setCurrentItem(PageItem *item)
+{
+	if (!m_ScMW || m_ScMW->scriptIsRunning())
+		return;
+	//CB We shouldn't really need to process this if our item is the same one
+	//maybe we do if the item has been changed by scripter.. but that should probably
+	//set some status if so.
+	//FIXME: This won't work until when a canvas deselect happens, m_item must be nullptr.
+	//if (m_item == i)
+	//	return;
+
+	if (!m_doc)
+		setDoc(item->doc());
+
+	m_haveItem = false;
+	m_item = item;
+
+	if ((m_item->isGroup()) && (!m_item->isSingleSel))
+	{
+		setEnabled(false);
+	}
+
+	m_haveItem = true;
+
+
+	if (m_item->isTextFrame() || m_item->isPathText() || m_item->isTable())
+	{
+		ParagraphStyle parStyle =  m_item->itemText.defaultStyle();
+		if (m_doc->appMode == modeEdit || m_doc->appMode == modeEditTable)
+			m_item->currentTextProps(parStyle);
+		updateStyle(parStyle);
+	}
+	if (m_item->isOSGFrame())
+	{
+		setEnabled(false);
+	}
+	if (m_item->asSymbol())
+	{
+		setEnabled(false);
+	}
+}
+
+void PropertyWidget_Text::iconSetChange()
+{
+	IconManager& iconManager = IconManager::instance();
+
+	fontSizeLabel->setPixmap(iconManager.loadPixmap("zeichen.png"));
+	lineSpacingLabel->setPixmap(iconManager.loadPixmap("linespacing2.png"));
+	textAlignmentLabel->setPixmap(iconManager.loadPixmap("22/text-align.png"));
+	langLabel->setPixmap(iconManager.loadPixmap("22/language.png"));
+	paraStyleLabel->setPixmap(iconManager.loadPixmap("22/paragraph-style.png"));
+	charStyleLabel->setPixmap(iconManager.loadPixmap("22/character-style.png"));
+
+	paraStyleClear->setIcon(iconManager.loadPixmap("16/edit-clear.png"));
+	charStyleClear->setIcon(iconManager.loadPixmap("16/edit-clear.png"));
+}
+
+
+void PropertyWidget_Text::localeChange()
+{
+	const QLocale& l(LocaleManager::instance().userPreferredLocale());
+	fontSize->setLocale(l);
+	lineSpacing->setLocale(l);
+}
+
+void PropertyWidget_Text::handleLineSpacingMode(int id)
+{
+	if (!m_haveDoc || !m_haveItem)
+		return;
+	Selection tempSelection(this, false);
+	tempSelection.addItem(m_item, true);
+	m_doc->itemSelection_SetLineSpacingMode(id, &tempSelection);
+	updateStyle(((m_doc->appMode == modeEdit) || (m_doc->appMode == modeEditTable)) ? m_item->currentStyle() : m_item->itemText.defaultStyle());
+	m_doc->regionsChanged()->update(QRect());
+}
+
+void PropertyWidget_Text::changeLang(int id)
+{
+	if (!m_haveDoc || !m_haveItem || !m_ScMW || m_ScMW->scriptIsRunning())
+		return;
+	QStringList languageList;
+	LanguageManager::instance()->fillInstalledStringList(&languageList);
+	QString abrv = LanguageManager::instance()->getAbbrevFromLang(languageList.value(id),false);
+	Selection tempSelection(this, false);
+	tempSelection.addItem(m_item, true);
+	m_doc->itemSelection_SetLanguage(abrv, &tempSelection);
+}
+
+void PropertyWidget_Text::showLineSpacing(double r)
+{
+	if (!m_ScMW || m_ScMW->scriptIsRunning())
+		return;
+	bool inEditMode = (m_doc->appMode == modeEdit || m_doc->appMode == modeEditTable);
+	bool tmp = m_haveItem;
+	m_haveItem = false;
+	lineSpacing->showValue(r);
+	const ParagraphStyle& curStyle(m_haveItem && inEditMode ? m_item->currentStyle() : m_item->itemText.defaultStyle());
+	if (tmp)
+	{
+		setupLineSpacingSpinbox(curStyle.lineSpacingMode(), r);
+		lineSpacingModeCombo->setCurrentIndex(curStyle.lineSpacingMode());
+	}
+	m_haveItem = tmp;
+}
+
+void PropertyWidget_Text::showFontFace(const QString& newFont)
+{
+	if (!m_ScMW || m_ScMW->scriptIsRunning())
+		return;
+	bool tmp = m_haveItem;
+	m_haveItem = false;
+	if (m_item != nullptr)
+		fonts->rebuildList(m_doc, m_item->isAnnotation());
+	fonts->setCurrentFont(newFont);
+	m_haveItem = tmp;
+}
+
+void PropertyWidget_Text::showFontSize(double s)
+{
+	if (!m_ScMW || m_ScMW->scriptIsRunning())
+		return;
+	fontSize->showValue(s / 10.0);
+}
+
+void PropertyWidget_Text::showLanguage(const QString& w)
+{
+	if (!m_ScMW || m_ScMW->scriptIsRunning())
+		return;
+	QStringList lang;
+	LanguageManager::instance()->fillInstalledStringList(&lang);
+	QString langName = LanguageManager::instance()->getLangFromAbbrev(w, true);
+
+	bool sigBlocked  = langCombo->blockSignals(true);
+	langCombo->setCurrentIndex(lang.indexOf(langName));
+	langCombo->blockSignals(sigBlocked);
+}
+
+void PropertyWidget_Text::setupLineSpacingSpinbox(int mode, double value)
+{
+	bool blocked = lineSpacing->blockSignals(true);
+	if (mode > 0)
+	{
+		if (mode == 1)
+			lineSpacing->setSpecialValueText( tr( "Auto" ) );
+		if (mode == 2)
+			lineSpacing->setSpecialValueText( tr( "Baseline" ) );
+		lineSpacing->setMinimum(0);
+		lineSpacing->setValue(0);
+		lineSpacing->setEnabled(false);
+	}
+	else
+	{
+		lineSpacing->setSpecialValueText("");
+		lineSpacing->setMinimum(1);
+		lineSpacing->setValue(value);
+		lineSpacing->setEnabled(true);
+	}
+	lineSpacing->blockSignals(blocked);
+}
+
+void PropertyWidget_Text::updateCharStyle(const CharStyle& charStyle)
+{
+	if (!m_ScMW || m_ScMW->scriptIsRunning())
+		return;
+
+	showFontFace(charStyle.font().scName());
+	showFontSize(charStyle.fontSize());
+	showLanguage(charStyle.language());
+}
+
+void PropertyWidget_Text::updateStyle(const ParagraphStyle& newCurrent)
+{
+	if (!m_ScMW || m_ScMW->scriptIsRunning())
+		return;
+
+	const CharStyle& charStyle = newCurrent.charStyle();
+
+	showFontFace(charStyle.font().scName());
+	showFontSize(charStyle.fontSize());
+	showLanguage(charStyle.language());
+
+	if (m_item)
+	{
+		QString defaultParStyle = m_item->itemText.defaultStyle().parent();
+		if (defaultParStyle.isEmpty())
+			defaultParStyle = CommonStrings::DefaultParagraphStyle;
+		paraStyleCombo->setDefaultStyle(defaultParStyle);
+	}
+	showParStyle(newCurrent.parent());
+
+	if (m_item)
+	{
+		QString defaultCharStyle;
+		if (!newCurrent.parent().isEmpty())
+		{
+			const ParagraphStyle* paraStyle = m_doc->paragraphStyles().getPointer(newCurrent.parent());
+			if (paraStyle)
+				defaultCharStyle = paraStyle->charStyle().parent();
+			if (defaultCharStyle.isEmpty())
+				defaultCharStyle = CommonStrings::DefaultCharacterStyle;
+		}
+		if (defaultCharStyle.isEmpty())
+			defaultCharStyle = m_item->itemText.defaultStyle().charStyle().parent();
+		if (defaultCharStyle.isEmpty())
+			defaultCharStyle = CommonStrings::DefaultCharacterStyle;
+		charStyleCombo->setDefaultStyle(defaultCharStyle);
+	}
+	showCharStyle(charStyle.parent());
+
+	bool tmp = m_haveItem;
+	m_haveItem = false;
+
+	setupLineSpacingSpinbox(newCurrent.lineSpacingMode(), newCurrent.lineSpacing());
+	lineSpacingModeCombo->setCurrentIndex(newCurrent.lineSpacingMode());
+	textAlignment->setStyle(newCurrent.alignment(), newCurrent.direction());
+	textDirection->setStyle(newCurrent.direction());
+
+	m_haveItem = tmp;
+}
+
+void PropertyWidget_Text::updateCharStyles()
+{
+	charStyleCombo->updateStyleList();
+}
+
+void PropertyWidget_Text::updateParagraphStyles()
+{
+	paraStyleCombo->updateStyleList();
+	charStyleCombo->updateStyleList();
+}
+
+void PropertyWidget_Text::updateTextStyles()
+{
+	paraStyleCombo->updateStyleList();
+	charStyleCombo->updateStyleList();
+}
+
+void PropertyWidget_Text::showAlignment(int e)
+{
+	if (!m_ScMW || m_ScMW->scriptIsRunning())
+		return;
+	bool tmp = m_haveItem;
+	m_haveItem = false;
+	textAlignment->setEnabled(true);
+	textAlignment->setStyle(e, textDirection->getStyle());
+	m_haveItem = tmp;
+}
+
+void PropertyWidget_Text::showDirection(int e)
+{
+	if (!m_ScMW || m_ScMW->scriptIsRunning())
+		return;
+	bool tmp = m_haveItem;
+	m_haveItem = false;
+	textDirection->setEnabled(true);
+	textDirection->setStyle(e);
+	m_haveItem = tmp;
+}
+
+void PropertyWidget_Text::showCharStyle(const QString& name)
+{
+	if (!m_ScMW || m_ScMW->scriptIsRunning())
+		return;
+	bool blocked = charStyleCombo->blockSignals(true);
+	charStyleCombo->setStyle(name);
+	charStyleCombo->blockSignals(blocked);
+}
+
+void PropertyWidget_Text::showParStyle(const QString& name)
+{
+	if (!m_ScMW || m_ScMW->scriptIsRunning())
+		return;
+	bool blocked = paraStyleCombo->blockSignals(true);
+	paraStyleCombo->setStyle(name);
+	paraStyleCombo->blockSignals(blocked);
+}
+
+void PropertyWidget_Text::handleLineSpacing()
+{
+	if (!m_haveDoc || !m_haveItem || !m_ScMW || m_ScMW->scriptIsRunning())
+		return;
+	Selection tempSelection(this, false);
+	tempSelection.addItem(m_item, true);
+	m_doc->itemSelection_SetLineSpacing(lineSpacing->value(), &tempSelection);
+}
+
+void PropertyWidget_Text::handleFontSize()
+{
+	if (!m_haveDoc || !m_haveItem || !m_ScMW || m_ScMW->scriptIsRunning())
+		return;
+	Selection tempSelection(this, false);
+	tempSelection.addItem(m_item, true);
+	m_doc->itemSelection_SetFontSize(qRound(fontSize->value()*10.0), &tempSelection);
+}
+
+void PropertyWidget_Text::handleAlignment(int a)
+{
+	if (!m_haveDoc || !m_haveItem || !m_ScMW || m_ScMW->scriptIsRunning())
+		return;
+	Selection tempSelection(this, false);
+	tempSelection.addItem(m_item, true);
+	m_doc->itemSelection_SetAlignment(a, &tempSelection);
+
+	emit alignmentHandled();
+
+//	if (m_item->isPathText())
+//		pathTextWidgets->handleSelectionChanged();
+}
+
+void PropertyWidget_Text::handleDirection(int d)
+{
+	if (!m_haveDoc || !m_haveItem || !m_ScMW || m_ScMW->scriptIsRunning())
+		return;
+	Selection tempSelection(this, false);
+	tempSelection.addItem(m_item, true);
+	m_doc->itemSelection_SetDirection(d, &tempSelection);
+	// If current text alignment is left or right, change it to match direction
+	if (d == ParagraphStyle::RTL && textAlignment->selectedId() == ParagraphStyle::LeftAligned)
+	{
+		m_doc->itemSelection_SetAlignment(ParagraphStyle::RightAligned, &tempSelection);
+		textAlignment->setTypeStyle(ParagraphStyle::RightAligned);
+	}
+	else if (d == ParagraphStyle::LTR && textAlignment->selectedId() == ParagraphStyle::RightAligned)
+	{
+		m_doc->itemSelection_SetAlignment(ParagraphStyle::LeftAligned, &tempSelection);
+		textAlignment->setTypeStyle(ParagraphStyle::LeftAligned);
+	}
+}
+
+void PropertyWidget_Text::handleTextFont(const QString& font)
+{
+	if (!m_haveDoc || !m_haveItem || !m_ScMW || m_ScMW->scriptIsRunning())
+		return;
+	Selection tempSelection(this, false);
+	tempSelection.addItem(m_item, true);
+	m_doc->itemSelection_SetFont(font, &tempSelection);
+}
+
+void PropertyWidget_Text::doClearCStyle()
+{
+	if (!m_ScMW || m_ScMW->scriptIsRunning() || !m_haveDoc || !m_haveItem)
+		return;
+	Selection tempSelection(this, false);
+	tempSelection.addItem(m_item, true);
+	m_doc->itemSelection_EraseCharStyle(&tempSelection);
+}
+
+
+void PropertyWidget_Text::doClearPStyle()
+{
+	if (!m_ScMW || m_ScMW->scriptIsRunning() || !m_haveDoc || !m_haveItem)
+		return;
+
+	UndoTransaction activeTransaction;
+	if (UndoManager::undoEnabled())
+		activeTransaction = UndoManager::instance()->beginTransaction(Um::SelectionGroup, Um::IGroup, Um::RemoveTextStyle, tr( "remove direct paragraph formatting" ), Um::IFont);
+
+	Selection tempSelection(this, false);
+	tempSelection.addItem(m_item, true);
+	m_doc->itemSelection_ClearBulNumStrings(&tempSelection);
+	m_doc->itemSelection_EraseParagraphStyle(&tempSelection);
+	CharStyle emptyCStyle;
+	m_doc->itemSelection_SetCharStyle(emptyCStyle, &tempSelection);
+
+	if (activeTransaction)
+		activeTransaction.commit();
+}
+
+void PropertyWidget_Text::changeEvent(QEvent *e)
+{
+	if (e->type() == QEvent::LanguageChange)
+	{
+		languageChange();
+		return;
+	}
+	QWidget::changeEvent(e);
+}
+
+void PropertyWidget_Text::languageChange()
+{
+	retranslateUi(this);
+
+	QSignalBlocker lineSpacingModeBlocker(lineSpacingModeCombo);
+	int oldLineSpacingMode = lineSpacingModeCombo->currentIndex();
+	lineSpacingModeCombo->clear();
+	lineSpacingModeCombo->addItem( tr("Fixed Linespacing"));
+	lineSpacingModeCombo->addItem( tr("Automatic Linespacing"));
+	lineSpacingModeCombo->addItem( tr("Align to Baseline Grid"));
+	lineSpacingModeCombo->setCurrentIndex(oldLineSpacingMode);
+
+	QSignalBlocker langComboBlocker(langCombo);
+	QStringList languageList;
+	LanguageManager::instance()->fillInstalledStringList(&languageList);
+	int oldLang = langCombo->currentIndex();
+	langCombo->clear();
+	langCombo->addItems(languageList);
+	langCombo->setCurrentIndex(oldLang);
+
+	textAlignment->languageChange();
+	textDirection->languageChange();
+}
Index: scribus/ui/propertywidget_text.h
===================================================================
--- scribus/ui/propertywidget_text.h	(nicht existent)
+++ scribus/ui/propertywidget_text.h	(Arbeitskopie)
@@ -0,0 +1,89 @@
+#ifndef PROPERTYWIDGET_TEXT_H
+#define PROPERTYWIDGET_TEXT_H
+
+#include "ui_propertywidget_textbase.h"
+#include "propertywidgetbase.h"
+#include <QFrame>
+
+//namespace Ui {
+//class PropertyWidget_Text;
+//}
+
+class CharStyle;
+class ParagraphStyle;
+class ScribusDoc;
+class ScribusMainWindow;
+
+
+class PropertyWidget_Text : public QFrame, Ui::PropertyWidget_TextBase,
+		public PropertyWidgetBase
+{
+	Q_OBJECT
+
+public:
+	PropertyWidget_Text(QWidget *parent = nullptr);
+	~PropertyWidget_Text() {};
+
+private:
+	PageItem* currentItemFromSelection();
+
+protected:
+	void connectSignals();
+	void disconnectSignals();
+
+	void configureWidgets();
+	void setCurrentItem(PageItem *item);
+	void changeEvent(QEvent *e) override;
+
+	bool m_haveDoc {false};
+	bool m_haveItem {false};
+	PageItem* m_item { nullptr };
+	ScribusMainWindow* m_ScMW { nullptr };
+
+public slots:
+	void setMainWindow(ScribusMainWindow *mw);
+	void setDoc(ScribusDoc *d);
+
+	void handleSelectionChanged();
+	void handleUpdateRequest(int);
+	void iconSetChange();
+	void languageChange();
+	void localeChange();
+	void changeLang(int id);
+	void unitChange() {};
+
+	void showAlignment(int e);
+	void showDirection(int e);
+	void showCharStyle(const QString& name);
+	void showFontFace(const QString&);
+	void showFontSize(double s);
+	void showLanguage(const QString& w);
+	void showLineSpacing(double r);
+	void showParStyle(const QString& name);
+
+	void setupLineSpacingSpinbox(int mode, double value);
+
+	void updateCharStyle(const CharStyle& charStyle);
+	void updateStyle(const ParagraphStyle& newCurrent);
+
+	void updateCharStyles();
+	void updateParagraphStyles();
+	void updateTextStyles();
+
+	void handleLineSpacingMode(int id);
+	void handleTextFont(const QString&);
+
+private slots:
+	void handleAlignment(int a);
+	void handleDirection(int d);
+	void handleFontSize();
+	void handleLineSpacing();
+
+	void doClearCStyle();
+	void doClearPStyle();
+
+signals:
+	void alignmentHandled();
+};
+
+#endif // PROPERTYWIDGET_TEXT_H
Index: scribus/ui/propertywidget_textbase.ui
===================================================================
--- scribus/ui/propertywidget_textbase.ui	(nicht existent)
+++ scribus/ui/propertywidget_textbase.ui	(Arbeitskopie)
@@ -0,0 +1,359 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>PropertyWidget_TextBase</class>
+ <widget class="QFrame" name="PropertyWidget_TextBase">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>281</width>
+    <height>241</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Frame</string>
+  </property>
+  <layout class="QVBoxLayout" name="verticalLayout">
+   <property name="spacing">
+    <number>4</number>
+   </property>
+   <property name="leftMargin">
+    <number>3</number>
+   </property>
+   <property name="topMargin">
+    <number>3</number>
+   </property>
+   <property name="rightMargin">
+    <number>3</number>
+   </property>
+   <property name="bottomMargin">
+    <number>3</number>
+   </property>
+   <item>
+    <widget class="FontComboH" name="fonts" native="true"/>
+   </item>
+   <item>
+    <layout class="QHBoxLayout" name="horizontalLayout">
+     <property name="spacing">
+      <number>3</number>
+     </property>
+     <item>
+      <widget class="QLabel" name="fontSizeLabel">
+       <property name="minimumSize">
+        <size>
+         <width>20</width>
+         <height>0</height>
+        </size>
+       </property>
+       <property name="maximumSize">
+        <size>
+         <width>22</width>
+         <height>22</height>
+        </size>
+       </property>
+       <property name="text">
+        <string/>
+       </property>
+       <property name="alignment">
+        <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="ScrSpinBox" name="fontSize">
+       <property name="sizePolicy">
+        <sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
+         <horstretch>0</horstretch>
+         <verstretch>0</verstretch>
+        </sizepolicy>
+       </property>
+       <property name="toolTip">
+        <string>Font Size</string>
+       </property>
+       <property name="suffix">
+        <string> pt</string>
+       </property>
+      </widget>
+     </item>
+    </layout>
+   </item>
+   <item>
+    <layout class="QHBoxLayout" name="horizontalLayout_2">
+     <property name="spacing">
+      <number>3</number>
+     </property>
+     <item>
+      <widget class="QLabel" name="lineSpacingLabel">
+       <property name="minimumSize">
+        <size>
+         <width>20</width>
+         <height>0</height>
+        </size>
+       </property>
+       <property name="maximumSize">
+        <size>
+         <width>22</width>
+         <height>22</height>
+        </size>
+       </property>
+       <property name="text">
+        <string/>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QComboBox" name="lineSpacingModeCombo">
+       <property name="sizePolicy">
+        <sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
+         <horstretch>0</horstretch>
+         <verstretch>0</verstretch>
+        </sizepolicy>
+       </property>
+       <property name="toolTip">
+        <string>Select the line spacing mode</string>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="ScrSpinBox" name="lineSpacing">
+       <property name="sizePolicy">
+        <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+         <horstretch>0</horstretch>
+         <verstretch>0</verstretch>
+        </sizepolicy>
+       </property>
+       <property name="toolTip">
+        <string>Line Spacing</string>
+       </property>
+       <property name="suffix">
+        <string> pt</string>
+       </property>
+      </widget>
+     </item>
+    </layout>
+   </item>
+   <item>
+    <layout class="QHBoxLayout" name="horizontalLayout_5">
+     <property name="spacing">
+      <number>3</number>
+     </property>
+     <item>
+      <widget class="QLabel" name="textAlignmentLabel">
+       <property name="minimumSize">
+        <size>
+         <width>20</width>
+         <height>0</height>
+        </size>
+       </property>
+       <property name="maximumSize">
+        <size>
+         <width>22</width>
+         <height>22</height>
+        </size>
+       </property>
+       <property name="text">
+        <string/>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="AlignSelect" name="textAlignment" native="true"/>
+     </item>
+     <item alignment="Qt::AlignLeft">
+      <widget class="DirectionSelect" name="textDirection" native="true"/>
+     </item>
+     <item>
+      <spacer name="horizontalSpacer_2">
+       <property name="orientation">
+        <enum>Qt::Horizontal</enum>
+       </property>
+       <property name="sizeHint" stdset="0">
+        <size>
+         <width>40</width>
+         <height>20</height>
+        </size>
+       </property>
+      </spacer>
+     </item>
+    </layout>
+   </item>
+   <item>
+    <layout class="QHBoxLayout" name="horizontalLayout_6">
+     <property name="spacing">
+      <number>3</number>
+     </property>
+     <item>
+      <widget class="QLabel" name="langLabel">
+       <property name="minimumSize">
+        <size>
+         <width>20</width>
+         <height>0</height>
+        </size>
+       </property>
+       <property name="maximumSize">
+        <size>
+         <width>22</width>
+         <height>22</height>
+        </size>
+       </property>
+       <property name="text">
+        <string/>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QComboBox" name="langCombo">
+       <property name="sizePolicy">
+        <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
+         <horstretch>0</horstretch>
+         <verstretch>0</verstretch>
+        </sizepolicy>
+       </property>
+       <property name="toolTip">
+        <string>Text Language</string>
+       </property>
+       <property name="editable">
+        <bool>true</bool>
+       </property>
+      </widget>
+     </item>
+    </layout>
+   </item>
+   <item>
+    <layout class="QHBoxLayout" name="horizontalLayout_3">
+     <property name="spacing">
+      <number>3</number>
+     </property>
+     <item>
+      <widget class="QLabel" name="paraStyleLabel">
+       <property name="minimumSize">
+        <size>
+         <width>20</width>
+         <height>0</height>
+        </size>
+       </property>
+       <property name="maximumSize">
+        <size>
+         <width>22</width>
+         <height>22</height>
+        </size>
+       </property>
+       <property name="text">
+        <string/>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="ParaStyleComboBox" name="paraStyleCombo">
+       <property name="sizePolicy">
+        <sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
+         <horstretch>0</horstretch>
+         <verstretch>0</verstretch>
+        </sizepolicy>
+       </property>
+       <property name="toolTip">
+        <string>Paragraph style of currently selected text or paragraph</string>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QToolButton" name="paraStyleClear">
+       <property name="toolTip">
+        <string>Remove Direct Paragraph Formatting</string>
+       </property>
+       <property name="text">
+        <string/>
+       </property>
+      </widget>
+     </item>
+    </layout>
+   </item>
+   <item>
+    <layout class="QHBoxLayout" name="horizontalLayout_4">
+     <property name="spacing">
+      <number>3</number>
+     </property>
+     <item>
+      <widget class="QLabel" name="charStyleLabel">
+       <property name="minimumSize">
+        <size>
+         <width>20</width>
+         <height>0</height>
+        </size>
+       </property>
+       <property name="maximumSize">
+        <size>
+         <width>22</width>
+         <height>22</height>
+        </size>
+       </property>
+       <property name="text">
+        <string/>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="CharStyleComboBox" name="charStyleCombo">
+       <property name="sizePolicy">
+        <sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
+         <horstretch>0</horstretch>
+         <verstretch>0</verstretch>
+        </sizepolicy>
+       </property>
+       <property name="toolTip">
+        <string>Character style of currently selected text or paragraph</string>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QToolButton" name="charStyleClear">
+       <property name="toolTip">
+        <string>Remove Direct Character Formatting</string>
+       </property>
+       <property name="text">
+        <string/>
+       </property>
+      </widget>
+     </item>
+    </layout>
+   </item>
+  </layout>
+ </widget>
+ <customwidgets>
+  <customwidget>
+   <class>ScrSpinBox</class>
+   <extends>QDoubleSpinBox</extends>
+   <header>ui/scrspinbox.h</header>
+  </customwidget>
+  <customwidget>
+   <class>FontComboH</class>
+   <extends>QWidget</extends>
+   <header>ui/fontcombo.h</header>
+   <container>1</container>
+  </customwidget>
+  <customwidget>
+   <class>CharStyleComboBox</class>
+   <extends>QComboBox</extends>
+   <header>ui/stylecombos.h</header>
+  </customwidget>
+  <customwidget>
+   <class>ParaStyleComboBox</class>
+   <extends>QComboBox</extends>
+   <header>ui/stylecombos.h</header>
+  </customwidget>
+  <customwidget>
+   <class>AlignSelect</class>
+   <extends>QWidget</extends>
+   <header>ui/alignselect.h</header>
+   <container>1</container>
+  </customwidget>
+  <customwidget>
+   <class>DirectionSelect</class>
+   <extends>QWidget</extends>
+   <header>ui/directionselect.h</header>
+   <container>1</container>
+  </customwidget>
+ </customwidgets>
+ <resources/>
+ <connections/>
+</ui>
Index: scribus/ui/widgets/section_container.cpp
===================================================================
--- scribus/ui/widgets/section_container.cpp	(nicht existent)
+++ scribus/ui/widgets/section_container.cpp	(Arbeitskopie)
@@ -0,0 +1,430 @@
+#include "section_container.h"
+
+#include <QPainter>
+#include <QPen>
+#include <QMouseEvent>
+// #include "color_utils.h"
+
+
+/* ********************************************************************************* *
+ *
+ * Constructor + Setup
+ *
+ * ********************************************************************************* */
+
+SectionContainer::SectionContainer(QWidget *parent) : SectionContainer("Title", true, parent){}
+
+SectionContainer::SectionContainer(QString title, bool isCollapsible, QWidget *parent)
+    : QWidget{parent}
+    //    , headerLayout (new QHBoxLayout)
+    //    , layoutHeaderPrefix (new QHBoxLayout)
+    //    , layoutHeaderSuffix (new QHBoxLayout)
+    //    , bodyWidget(new QStackedWidget)
+    //    , labelTitle (new QLabel("Title"))
+    //    , buttonCollapse (new QToolButton)
+    //    , headerWidget (new QWidget)
+    //    , iconCollapsed(QIcon())
+    //    , iconExpanded (QIcon())
+    //    , boolIsCollapsible(isCollapsible)
+    //    , boolIsCollapsed(false)
+    //    , boolHasStyle(true)
+{
+    int padding = 4;
+    headerLayout = new QHBoxLayout;
+	layoutHeaderPrefix = new QHBoxLayout;
+	layoutHeaderSuffix = new QHBoxLayout;
+	bodyWidget= new QStackedWidget;
+	labelTitle = new QLabel(title);
+	buttonCollapse = new QToolButton;
+	headerWidget = new QWidget;
+	iconCollapsed = QIcon();
+	iconExpanded = QIcon();
+	boolIsCollapsible = isCollapsible;
+	boolIsCollapsed = false;
+	boolHasStyle = true;
+
+
+
+    // Label
+    //    QFont m_font(this->font());
+    //    m_font.setBold( true );
+    //    labelTitle->setFont(m_font);
+    labelTitle->setText(title);
+	labelTitle->setBuddy(this);
+
+    // Buttons
+    buttonCollapse->setAutoRaise(true);
+    buttonCollapse->adjustSize(); // needed to calculate the header height later
+
+    // Header Prefix layout
+    layoutHeaderPrefix->setContentsMargins( 0,0,0,0 );
+    layoutHeaderPrefix->setSpacing(padding);
+
+    // Header Suffix Layout
+    layoutHeaderSuffix->setContentsMargins( 0,0,0,0 );
+    layoutHeaderSuffix->setSpacing(padding);
+
+    // Header Layout
+    headerLayout->addWidget( buttonCollapse );
+    headerLayout->addLayout( layoutHeaderPrefix );
+    headerLayout->addWidget( labelTitle );
+    headerLayout->addStretch( 0 );
+    headerLayout->addLayout( layoutHeaderSuffix );
+    headerLayout->setContentsMargins( padding, padding/2, padding, padding/2 );
+
+    // Header Widget
+    headerWidget->setLayout(headerLayout);
+    headerWidget->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Maximum );
+    headerWidget->setMaximumHeight(buttonCollapse->height() + padding);
+    headerWidget->installEventFilter(this);
+
+
+    // Main Layout
+    QVBoxLayout * mainLayout = new QVBoxLayout(this);
+    mainLayout->setSpacing(0);
+    mainLayout->setContentsMargins(0,0,0,0);
+    mainLayout->addWidget(headerWidget);
+    mainLayout->addWidget(bodyWidget);
+
+
+    // Size Policy
+    QSizePolicy sizePol = QSizePolicy( QSizePolicy::MinimumExpanding, QSizePolicy::Maximum );
+    setSizePolicy(sizePol);
+    tmpSizePolicy = sizePol;
+
+    // initial Setup
+    setIsCollapsible(isCollapsible);
+    connectSlots();
+
+
+}
+
+void SectionContainer::connectSlots()
+{
+    connect( buttonCollapse, &QToolButton::clicked,this, &SectionContainer::toggleCollpasedState );
+}
+
+/* ********************************************************************************* *
+ *
+ * Header
+ *
+ * ********************************************************************************* */
+
+void SectionContainer::addHeaderSuffixWidget(QWidget *widget)
+{
+    insertHeaderSuffixWidget(-1, widget);
+}
+
+void SectionContainer::insertHeaderSuffixWidget(int index, QWidget *widget)
+{
+    QToolButton *toolButton = static_cast<QToolButton*>(widget);
+
+    if(toolButton){
+        toolButton->setAutoRaise(true);
+        //m_addonLayout->insertWidget( m_headerLayout->count(), toolButton );
+        layoutHeaderSuffix->insertWidget(index, toolButton);
+    }else{
+        //m_addonLayout->insertWidget( m_headerLayout->count(), widget );
+        layoutHeaderSuffix->insertWidget(index, widget);
+    }
+}
+
+void SectionContainer::removeHeaderSuffixWidget(QWidget *widget)
+{
+    layoutHeaderSuffix->removeWidget( widget );
+    widget->deleteLater();
+}
+
+void SectionContainer::addHeaderSuffixSpacing(int size)
+{
+    insertHeaderSuffixSpacing(-1, size);
+}
+
+void SectionContainer::insertHeaderSuffixSpacing(int index, int size)
+{
+    layoutHeaderSuffix->insertSpacing(index, size);
+}
+
+void SectionContainer::addHeaderPrefixWidget(QWidget *widget)
+{
+    insertHeaderPrefixWidget(-1, widget);
+}
+
+void SectionContainer::insertHeaderPrefixWidget(int index, QWidget *widget)
+{
+    QToolButton *toolButton = static_cast<QToolButton*>(widget);
+
+    if(toolButton){
+        toolButton->setAutoRaise(true);
+        //m_addonLayout->insertWidget( m_headerLayout->count(), toolButton );
+        layoutHeaderPrefix->insertWidget(index, toolButton);
+    }else{
+        //m_addonLayout->insertWidget( m_headerLayout->count(), widget );
+        layoutHeaderPrefix->insertWidget(index, widget);
+    }
+}
+
+void SectionContainer::removeHeaderPrefixWidget(QWidget *widget)
+{
+    layoutHeaderPrefix->removeWidget( widget );
+    widget->deleteLater();
+}
+
+void SectionContainer::addHeaderPrefixSpacing(int size)
+{
+    insertHeaderPrefixSpacing(-1, size);
+}
+
+void SectionContainer::insertHeaderPrefixSpacing(int index, int size)
+{
+    layoutHeaderPrefix->insertSpacing(index, size);
+}
+
+
+
+/* ********************************************************************************* *
+ *
+ * Properties
+ *
+ * ********************************************************************************* */
+
+void SectionContainer::setText(QString text)
+{
+    labelTitle->setText(text);
+}
+
+QString SectionContainer::text() const
+{
+    return labelTitle->text();
+}
+
+void SectionContainer::setFont(QFont font)
+{
+    labelTitle->setFont(font);
+    QWidget::setFont(font);
+}
+
+QFont SectionContainer::font()
+{
+    return labelTitle->font();
+}
+
+void SectionContainer::setHasStyle(bool isSimple)
+{
+    boolHasStyle = isSimple;
+    update();
+}
+
+bool SectionContainer::hasStyle()
+{
+    return boolHasStyle;
+}
+
+void SectionContainer::setIsCollapsible(bool isCollapsible)
+{
+    boolIsCollapsible = isCollapsible;
+    buttonCollapse->setVisible(isCollapsible);
+}
+
+bool SectionContainer::isCollapsible()
+{
+    return boolIsCollapsible;
+}
+
+bool SectionContainer::isCollapsed()
+{
+    return boolIsCollapsed;
+}
+
+void SectionContainer::setIsCollapsed(bool state)
+{
+    if(isCollapsible() == false) return;
+
+    boolIsCollapsed = state;
+
+    if( boolIsCollapsed ){
+        // save size policy
+        //   tmpSizePolicy = this->sizePolicy();
+
+        bodyWidget->hide();
+        buttonCollapse->setIcon(iconCollapsed);
+
+        //        // optimize size policy for collapsed state
+        //        QSizePolicy sizePol = QSizePolicy( QSizePolicy::MinimumExpanding, QSizePolicy::Maximum );
+        //        setSizePolicy(sizePol);
+
+    } else {
+        // restore size policy
+        //  this->setSizePolicy(tmpSizePolicy);
+
+        bodyWidget->show();
+        buttonCollapse->setIcon(iconExpanded);
+    }
+
+    adjustSize();
+
+    emit collapsedState(boolIsCollapsed);
+}
+
+
+void SectionContainer::setCollapseIcons(QIcon collapsed, QIcon expanded)
+{
+    iconCollapsed = collapsed;
+    iconExpanded = expanded;
+
+    if( boolIsCollapsed ){
+        buttonCollapse->setIcon(iconCollapsed);
+    } else {
+        buttonCollapse->setIcon(iconExpanded);
+    }
+}
+
+/* ********************************************************************************* *
+ *
+ * Slots
+ *
+ * ********************************************************************************* */
+
+void SectionContainer::toggleCollpasedState()
+{
+    if(isCollapsible() == false) return;
+
+    ( boolIsCollapsed ) ? boolIsCollapsed = false : boolIsCollapsed = true;
+
+    setIsCollapsed(boolIsCollapsed);
+}
+
+
+/* ********************************************************************************* *
+ *
+ * Plugin (StackedWidget)
+ *
+ * ********************************************************************************* */
+
+QWidget* SectionContainer::widget(int index)
+{
+    return bodyWidget->widget(index);
+}
+
+void SectionContainer::addPage(QWidget *page)
+{
+    insertPage(count(), page);
+}
+
+void SectionContainer::insertPage(int index, QWidget *page)
+{
+    page->setParent(bodyWidget);
+
+    bodyWidget->insertWidget(index, page);
+}
+
+void SectionContainer::removePage(int index)
+{
+    QWidget *widget = bodyWidget->widget(index);
+    bodyWidget->removeWidget(widget);
+}
+
+int SectionContainer::count() const
+{
+    return bodyWidget->count();
+}
+
+int SectionContainer::currentIndex() const
+{
+    return bodyWidget->currentIndex();
+}
+
+void SectionContainer::setCurrentIndex(int index)
+{
+    if (index != currentIndex()) {
+        bodyWidget->setCurrentIndex(index);
+        emit currentIndexChanged(index);
+    }
+}
+
+
+/* ********************************************************************************* *
+ *
+ * Events
+ *
+ * ********************************************************************************* */
+
+bool SectionContainer::eventFilter(QObject *object, QEvent *event)
+{
+    // Header Widget
+    if(object == headerWidget){
+        switch(event->type())
+        {
+        case QEvent::MouseButtonDblClick:{
+            QMouseEvent *mouseEvent = static_cast<QMouseEvent *>(event);
+            if (mouseEvent->button() == Qt::LeftButton && isCollapsible()) {
+                toggleCollpasedState();
+                return true;
+            }
+            break;
+        }
+        case QEvent::Paint:{
+
+            if(boolHasStyle){
+
+                //            QColor topLineColor( palette().color(QPalette::Mid) );
+                QColor bottomLineColor( palette().color(QPalette::Dark) );
+                //            lineColor.setAlphaF(0.12f);
+
+                QColor bgColor( palette().color(QPalette::WindowText) );
+                bgColor.setAlphaF(0.07f);
+
+                int lineWidth = 1;
+                int headerheight = headerWidget->height();
+                QRect headerRect(0, 0, this->width(), headerheight - lineWidth);
+
+                QPainter painter( headerWidget );
+
+                painter.setPen( Qt::NoPen );
+                painter.setBrush(bgColor);
+                painter.drawRect(headerRect);
+
+                painter.setBrush(Qt::NoBrush);
+
+                //            // Top Line
+                //            painter.setPen( QPen(topLineColor, lineWidth) );
+                //            painter.drawLine( 0, 0,this->width(), 0 );
+
+                // Bottom Line
+                painter.setPen( QPen(bottomLineColor, lineWidth) );
+                painter.drawLine( 0, headerheight - lineWidth, this->width(), headerheight - lineWidth );
+            }
+            return true;
+
+            break;
+        }
+        default:
+            return false;
+        }
+
+
+    }
+
+    return false;
+}
+
+
+void SectionContainer::paintEvent(QPaintEvent *event)
+{
+
+    QWidget::paintEvent(event);
+
+    if(!boolHasStyle){
+
+        int lineWidth = 1;
+        QColor bottomLineColor( palette().color(QPalette::Dark) );
+
+        QPainter painter( this );
+
+        // Bottom Line
+        painter.setPen( QPen(bottomLineColor, lineWidth) );
+        painter.drawLine( 8, this->height() - lineWidth, this->width() - 8, this->height() - lineWidth );
+
+    }
+
+}
Index: scribus/ui/widgets/section_container.h
===================================================================
--- scribus/ui/widgets/section_container.h	(nicht existent)
+++ scribus/ui/widgets/section_container.h	(Arbeitskopie)
@@ -0,0 +1,95 @@
+#ifndef SECTIONCONTAINER_H
+#define SECTIONCONTAINER_H
+
+#include <QLabel>
+#include <QStackedWidget>
+#include <QToolButton>
+#include <QVBoxLayout>
+#include <QWidget>
+
+class SectionContainer : public QWidget
+{
+    Q_OBJECT
+    Q_CLASSINFO("Version", "1.0.0")
+
+    Q_PROPERTY(QString title READ text WRITE setText)
+    Q_PROPERTY(bool isCollapsible READ isCollapsible WRITE setIsCollapsible)
+    Q_PROPERTY(bool isCollapsed READ isCollapsed WRITE setIsCollapsed)
+    Q_PROPERTY(bool hasStyle READ hasStyle WRITE setHasStyle)
+
+
+public:
+    SectionContainer(QWidget *parent = nullptr);
+    SectionContainer(QString title, bool isCollapsible = true, QWidget *parent = nullptr);
+
+    void addHeaderSuffixWidget(QWidget *widget);
+    void insertHeaderSuffixWidget(int index, QWidget *widget);    
+    void removeHeaderSuffixWidget(QWidget *widget);
+    void addHeaderSuffixSpacing(int size);
+    void insertHeaderSuffixSpacing(int index, int size);
+
+    void addHeaderPrefixWidget(QWidget *widget);
+    void insertHeaderPrefixWidget(int index, QWidget *widget);
+    void removeHeaderPrefixWidget(QWidget *widget);
+    void addHeaderPrefixSpacing(int size);
+    void insertHeaderPrefixSpacing(int index, int size);
+
+
+    void setText(QString text);
+    QString text() const;
+
+    void setFont(QFont font);
+    QFont font();
+
+    void setHasStyle(bool hasStyle);
+    bool hasStyle();
+
+    void setIsCollapsible(bool isCollapsible);
+    bool isCollapsible();
+    bool isCollapsed();
+
+    void setCollapseIcons(QIcon collapsed, QIcon expanded);
+
+    QWidget *widget(int index);
+
+    void addPage(QWidget * page);
+
+    int count() const;
+    int currentIndex() const;
+
+private:
+    QHBoxLayout * headerLayout;
+    QHBoxLayout * layoutHeaderPrefix;
+    QHBoxLayout * layoutHeaderSuffix;
+    QStackedWidget * bodyWidget;
+    QLabel * labelTitle;
+    QToolButton * buttonCollapse;
+    QWidget * headerWidget;
+    QIcon iconCollapsed;
+    QIcon iconExpanded;
+    bool boolIsCollapsible;
+    bool boolIsCollapsed;
+    QSizePolicy tmpSizePolicy;
+    bool boolHasStyle;
+
+    void connectSlots();
+
+    void paintEvent(QPaintEvent *event);
+    bool eventFilter(QObject *object, QEvent *event);
+
+public slots:
+    void toggleCollpasedState();
+    void setIsCollapsed(bool state);
+
+    void insertPage(int index, QWidget *page);
+    void removePage(int index);
+    void setCurrentIndex(int index);
+
+signals:
+    void collapsedState(bool);
+    void currentIndexChanged(int index);
+
+
+};
+
+#endif // SECTIONCONTAINER_H
action-chevron-down.svg (196 bytes)   
action-chevron-down.svg (196 bytes)   
action-chevron-up.svg (220 bytes)   
action-chevron-up.svg (220 bytes)   

Issue History

Date Modified Username Field Change
2023-08-01 20:06 nitramr New Issue
2023-08-01 20:06 nitramr Status new => assigned
2023-08-01 20:06 nitramr Assigned To => nitramr
2023-08-01 20:06 nitramr File Added: indigouicontainer_23-08-01_01.patch
2023-08-01 20:06 nitramr File Added: action-chevron-down.svg
2023-08-01 20:06 nitramr File Added: action-chevron-up.svg
2023-08-01 20:06 nitramr File Added: Bildschirmfoto vom 2023-08-01 21-57-41.png
2023-08-01 20:07 nitramr Summary Implement IndigoUI collapsable section container as UI widget => Implement IndigoUI collapsible section container as UI widget