Hello community,

here is the log from the commit of package treeline for openSUSE:Factory 
checked in at 2016-02-25 22:05:34
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/treeline (Old)
 and      /work/SRC/openSUSE:Factory/.treeline.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "treeline"

Changes:
--------
--- /work/SRC/openSUSE:Factory/treeline/treeline.changes        2015-04-10 
10:20:36.000000000 +0200
+++ /work/SRC/openSUSE:Factory/.treeline.new/treeline.changes   2016-02-26 
00:46:22.000000000 +0100
@@ -1,0 +2,31 @@
+Tue Feb 16 12:07:09 UTC 2016 - [email protected]
+
+- Update to version 2.0.2
+ * Bug Fixes:
+   - Fixed a major regression in 2.0.1 that broke data editors for
+     most specialized field types (number, math, boolean, choice, etc.)
+   - Reduce the amount of work that a single undo command removes
+     from editors in the data edit view.
+   - Fixed a bug that prevented setting the unique ID reference
+     field on a newly created data type.
+   - Preserve hard newlines in text fields when converting TreeLine
+     1.4.x files to this version.
+   - Fix problems preserving expand/collapse node states when
+     indenting and unindenting nodes.
+ * Updates:
+   - Added methods to the plugin interface that allow general
+     program options to be queried and changed.
+   - Improve text table import error messages by including the line
+     number where the problem is found.
+   - Modified the Treepad file import to use SpacedText fields to more
+     closely match Treepad formatting.
+   - An optional plugin was written that can export files to the
+     Treepad text file format.
+   - The TreeLine icon was replaced with a new one. Thanks to
+     David Reimer for contributing the artwork.
+   - The German and Portuguese GUI translations were updated.
+   - Updated the long text sample file to include the SpacedText field
+     type, and added a conditional equation to the math sample file.
+   - Updated the Math Field section of the documentation.
+
+-------------------------------------------------------------------

Old:
----
  treeline-1.9.7.tar.gz

New:
----
  treeline-2.0.2.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ treeline.spec ++++++
--- /var/tmp/diff_new_pack.diyO4p/_old  2016-02-26 00:46:23.000000000 +0100
+++ /var/tmp/diff_new_pack.diyO4p/_new  2016-02-26 00:46:23.000000000 +0100
@@ -1,7 +1,7 @@
 #
 # spec file for package treeline
 #
-# Copyright (c) 2015 SUSE LINUX Products GmbH, Nuernberg, Germany.
+# Copyright (c) 2016 SUSE LINUX GmbH, Nuernberg, Germany.
 #
 # All modifications and additions to the file contributed by third parties
 # remain the property of their copyright owners, unless otherwise agreed
@@ -17,24 +17,24 @@
 
 
 Name:           treeline
+Version:        2.0.2
+Release:        0
 Summary:        Versatile Tree-Style Outliner for Defining Custom Data Schemas
 License:        GPL-2.0+
 Group:          Productivity/Office/Other
-Version:        1.9.7
-Release:        0
 Url:            http://treeline.bellz.org
-BuildRequires:  perl
-BuildRequires:  python3-devel
-BuildRequires:  update-desktop-files
-BuildRequires:  fdupes
-Requires:       python3-qt4
 Source0:        
http://sourceforge.net/projects/treeline/files/%{version}/treeline-%{version}.tar.gz
-Source1:        %name.desktop
-Source2:        x-%name.desktop
-Source3:        x-%name-gz.desktop
+Source1:        %{name}.desktop
+Source2:        x-%{name}.desktop
+Source3:        x-%{name}-gz.desktop
 Source4:        x-treepad.desktop
 Source5:        treeline.png
 Source99:       treeline-rpmlintrc
+BuildRequires:  fdupes
+BuildRequires:  perl
+BuildRequires:  python3-devel
+BuildRequires:  update-desktop-files
+Requires:       python3-qt4
 BuildRoot:      %{_tmppath}/%{name}-%{version}-build
 BuildArch:      noarch
 
@@ -58,16 +58,16 @@
 toolkit, which makes it very portable.
 
 %prep
-%setup -n TreeLine
+%setup -q -n TreeLine
 for i in source/*.py; do
-       sed -i "s|#!/usr/bin/env python|#!/usr/bin/python|g" "$i"
+       sed -i "s|#!%{_bindir}/env python|#!%{_bindir}/python|g" "$i"
 done
 
 find source/ -type f -name '*.py' | while read f; do
     case $f in
     */treeline.py) continue;;
     esac
-    %__perl -i -n -e 'print unless m,^#!, and 1..1' "$f"
+    perl -i -n -e 'print unless m,^#!, and 1..1' "$f"
 done
 
 %build
@@ -76,18 +76,20 @@
 python3 install.py -x \
    -p "%{_prefix}" \
    -d "%{_docdir}/%{name}" \
-   -b "%{buildroot}"
+   -b %{buildroot}
 
-python3 -c "import compileall; 
compileall.compile_dir('%{buildroot}%{_prefix}/lib/treeline',2,ddir='%{_prefix}/lib/treeline')"
+pushd %{buildroot}%{python_sitearch}
+python3 -c "import compileall; 
compileall.compile_dir('%{buildroot}%{_libexecdir}/treeline',2,ddir='%{_libexecdir}/treeline')"
+popd
 
-%__install -d "%{buildroot}%{_datadir}/mimelnk/application"
-%__install -m0644 \
+install -d "%{buildroot}%{_datadir}/mimelnk/application"
+install -m0644 \
     "%{SOURCE2}" \
     "%{SOURCE3}" \
     "%{SOURCE4}" \
     "%{buildroot}%{_datadir}/mimelnk/application/"
 
-%__install -D -m0644 "%{SOURCE5}" 
"%{buildroot}%{_datadir}/pixmaps/treeline.png"
+install -D -m0644 "%{SOURCE5}" "%{buildroot}%{_datadir}/pixmaps/treeline.png"
 
 %suse_update_desktop_file -i treeline Office ProjectManagement
 

++++++ treeline-1.9.7.tar.gz -> treeline-2.0.2.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/TreeLine/doc/documentation.trl 
new/TreeLine/doc/documentation.trl
--- old/TreeLine/doc/documentation.trl  2015-03-28 00:09:23.000000000 +0100
+++ new/TreeLine/doc/documentation.trl  2015-10-03 20:20:31.000000000 +0200
@@ -1,11 +1,11 @@
 <?xml version='1.0' encoding='utf-8'?>
-<HEADINGS formathtml="y" item="y" line0="{*Name*}" 
line1="&lt;b&gt;{*Name*}&lt;/b&gt;" tlversion="1.9.7" 
uniqueid="treeline_documentation">
+<HEADINGS formathtml="y" item="y" line0="{*Name*}" 
line1="&lt;b&gt;{*Name*}&lt;/b&gt;" tlversion="2.0.2" 
uniqueid="treeline_documentation">
 <Name idref="y" type="Text">TreeLine Documentation</Name>
 <HEADINGS item="y" uniqueid="introduction_1">
 <Name>Introduction</Name>
 <PARAGRAPH icon="bullet_2" item="y" line0="{*Name*}" line1="{*Text*}" 
uniqueid="version">
 <Name idref="y" type="Text">Version</Name>
-<Text lines="8" type="Text">This document covers TreeLine, Version 1.9.7, 
released March 29, 2015 by Doug Bell.</Text>
+<Text lines="8" type="Text">This document covers TreeLine, Version 2.0.2, 
released October 3, 2015 by Doug Bell.</Text>
 </PARAGRAPH>
 <PARAGRAPH item="y" uniqueid="why_treeline">
 <Name>Why TreeLine?</Name>
@@ -192,6 +192,14 @@
 <Name>Fonts</Name>
 <Text>Fonts used for editing and output can be customized.</Text>
 </BULLETS>
+<BULLETS item="y" uniqueid="languages">
+<Name>Languages</Name>
+<Text>The user interface is available in English, German and Portuguese.</Text>
+</BULLETS>
+<BULLETS item="y" uniqueid="plugins">
+<Name>Plugins</Name>
+<Text>Plugin extension modules can be loaded to further customize 
TreeLine.</Text>
+</BULLETS>
 </BULLET_HEADING>
 </HEADINGS>
 <HEADINGS item="y" uniqueid="system_requirements">
@@ -477,9 +485,9 @@
 &lt;br /&gt;
 In equations, date fields are represented by the number of days since January 
1, 1970, and time fields are the number of seconds since midnight. So date 
fields can be subtracted to give the number of days elapsed, and numbers of 
days can be added to or subtracted from dates to result in new dates. Time 
fields can be subtracted to give the number of seconds elapsed, and numbers of 
seconds can be added to or subtracted from times to result in new times.&lt;br 
/&gt;
 &lt;br /&gt;
-The "if" comparison operator can be used to make the result depend on the 
value of another field.  The expression is written as "&amp;lt;true 
value&amp;gt; if &amp;lt;condition&amp;gt; else &amp;lt;false 
value&amp;gt;".&lt;br /&gt;
+The "if" comparison operator can be used to make the result depend on the 
value of another field. The expression is written as "true_value if condition 
else false_value".  Of course, the "true_value", "condition" and "false_value" 
strings must be replaced with valid fields or expressions.  If this operator is 
inserted from the operator list (under comparisons), it will include 
parenthesis as placeholders.  These parenthesis are optional in the 
equations.&lt;br /&gt;
 &lt;br /&gt;
-The "join" text function is used to combine text from several other fields (or 
from child nodes).  The first argument to the function is a separator string 
that is placed between each piece of text.  The remaining argument(s) are the 
text to be joined.&lt;br /&gt;
+The "join" text function is used to combine text from several other fields (or 
from child nodes). The first argument to the function is a separator string 
that is placed between each piece of text. The remaining argument(s) are the 
text to be joined.&lt;br /&gt;
 &lt;br /&gt;
 By default, math fields are shown in the data edit view, but they are 
read-only. To hide them, uncheck the "Show math fields in the Data Edit View" 
box under "Tools &amp;gt; General Options &amp;gt; Features Available".&lt;br 
/&gt;
 &lt;br /&gt;
@@ -750,6 +758,109 @@
 </HEADINGS>
 <HEADINGS item="y" uniqueid="revision_history">
 <Name>Revision History</Name>
+<HEADINGS item="y" uniqueid="october_3_2015_-_release_202_new_stable">
+<Name>October 3, 2015 - Release 2.0.2 (new stable release)</Name>
+<BULLET_HEADING item="y" uniqueid="bug_fixes_8">
+<Name>Bug Fixes</Name>
+<BULLETS item="y" uniqueid="data_edit_regression">
+<Name>Data edit regression</Name>
+<Text>Fixed a major regression in 2.0.1 that broke data editors for most 
specialized field types (number, math, boolean, choice, etc.)</Text>
+</BULLETS>
+</BULLET_HEADING>
+<BULLET_HEADING item="y" uniqueid="compatibility_notes_2">
+<Name>Compatibility Notes</Name>
+<BULLETS item="y" uniqueid="file_format_2">
+<Name>File format</Name>
+<Text>There are some file format changes between TreeLine 1.4.x and this 
version of TreeLine.</Text>
+</BULLETS>
+<BULLETS item="y" uniqueid="file_conversion_2">
+<Name>File conversion</Name>
+<Text>Older files opened in this version are automatically converted when 
saved.</Text>
+</BULLETS>
+<BULLETS item="y" uniqueid="file_compatibility_2">
+<Name>File compatibility</Name>
+<Text>Files saved in this version may not be fully compatible with TreeLine 
1.4.x.</Text>
+</BULLETS>
+</BULLET_HEADING>
+</HEADINGS>
+<HEADINGS item="y" uniqueid="september_26_2015_-_release_201_new_stable">
+<Name>September 26, 2015 - Release 2.0.1 (new stable release)</Name>
+<BULLET_HEADING item="y" uniqueid="updates_9">
+<Name>Updates</Name>
+<BULLETS item="y" uniqueid="plugin_options">
+<Name>Plugin options</Name>
+<Text>Added methods to the plugin interface that allow general program options 
to be queried and changed.</Text>
+</BULLETS>
+<BULLETS item="y" uniqueid="table_import_errors">
+<Name>Table import errors</Name>
+<Text>Improve text table import error messages by including the line number 
where the problem is found.</Text>
+</BULLETS>
+</BULLET_HEADING>
+<BULLET_HEADING item="y" uniqueid="bug_fixes_7">
+<Name>Bug Fixes</Name>
+<BULLETS item="y" uniqueid="data_edit_undo">
+<Name>Data edit undo</Name>
+<Text>Reduce the amount of work that a single undo command removes from 
editors in the data edit view.</Text>
+</BULLETS>
+<BULLETS item="y" uniqueid="configuration_changes">
+<Name>Configuration changes</Name>
+<Text>Fixed a bug that prevented setting the unique ID reference field on a 
newly created data type.</Text>
+</BULLETS>
+<BULLETS item="y" uniqueid="legacy_newline_convert">
+<Name>Legacy newline convert</Name>
+<Text>Preserve hard newlines in text fields when converting TreeLine 1.4.x 
files to this version.</Text>
+</BULLETS>
+<BULLETS item="y" uniqueid="indent_expand_status">
+<Name>Indent expand status</Name>
+<Text>Fix problems preserving expand/collapse node states when indenting and 
unindenting nodes.</Text>
+</BULLETS>
+</BULLET_HEADING>
+</HEADINGS>
+<HEADINGS item="y" uniqueid="may_17_2015_-_release_200_new_stable_release">
+<Name>May 17, 2015 - Release 2.0.0 (new stable release)</Name>
+<BULLET_HEADING item="y" uniqueid="updates_8">
+<Name>Updates</Name>
+<BULLETS item="y" uniqueid="treepad_import_update">
+<Name>Treepad import update</Name>
+<Text>Modified the Treepad file import to use SpacedText fields to more 
closely match Treepad formatting.</Text>
+</BULLETS>
+<BULLETS item="y" uniqueid="treepad_export">
+<Name>Treepad export</Name>
+<Text>An optional plugin was written that can export files to the Treepad text 
file format.</Text>
+</BULLETS>
+<BULLETS item="y" uniqueid="new_icon">
+<Name>New icon</Name>
+<Text>The TreeLine icon was replaced with a new one.  Thanks to David Reimer 
for contributing the artwork.</Text>
+</BULLETS>
+<BULLETS item="y" uniqueid="translation_updates">
+<Name>Translation updates</Name>
+<Text>The German and Portuguese GUI translations were updated.</Text>
+</BULLETS>
+<BULLETS item="y" uniqueid="sample_file_updates">
+<Name>Sample file updates</Name>
+<Text>Updated the long text sample file to include the SpacedText field type, 
and added a conditional equation to the math sample file.</Text>
+</BULLETS>
+<BULLETS item="y" uniqueid="documentation_update">
+<Name>Documentation update</Name>
+<Text>Updated the Math Field section of the documentation.</Text>
+</BULLETS>
+</BULLET_HEADING>
+<BULLET_HEADING item="y" uniqueid="compatibility_notes">
+<Name>Compatibility Notes</Name>
+<BULLETS item="y" uniqueid="file_format">
+<Name>File format</Name>
+<Text>There are some file format changes between TreeLine 1.4.x and this 
version of TreeLine.</Text>
+</BULLETS>
+<BULLETS item="y" uniqueid="file_conversion">
+<Name>File conversion</Name>
+<Text>Older files opened in this version are automatically converted when 
saved.</Text>
+</BULLETS>
+<BULLETS item="y" uniqueid="file_compatibility_1">
+<Name>File compatibility</Name>
+<Text>Files saved in this version may not be fully compatible with TreeLine 
1.4.x.</Text>
+</BULLETS>
+</BULLET_HEADING>
+</HEADINGS>
 <HEADINGS item="y" uniqueid="march_29_2015_-_release_197_unstable">
 <Name>March 29, 2015 - Release 1.9.7 (unstable development snapshot)</Name>
 <BULLET_HEADING item="y" uniqueid="new_features_6">
@@ -789,21 +900,6 @@
 <Text>Fixed a focus problem that made the pull-downs in choice and boolean 
field editors unusable on Linux.</Text>
 </BULLETS>
 </BULLET_HEADING>
-<BULLET_HEADING item="y" uniqueid="compatibility_notes_1">
-<Name>Compatibility Notes</Name>
-<BULLETS item="y" uniqueid="file_format_1">
-<Name>File format</Name>
-<Text>There are some file format changes between TreeLine 1.4.x and this 
version of TreeLine.</Text>
-</BULLETS>
-<BULLETS item="y" uniqueid="file_conversion_1">
-<Name>File conversion</Name>
-<Text>Older files opened in this version are automatically converted when 
saved.</Text>
-</BULLETS>
-<BULLETS item="y" uniqueid="file_compatibility">
-<Name>File compatibility</Name>
-<Text>Files saved in this version may not be fully compatible with TreeLine 
1.4.x.</Text>
-</BULLETS>
-</BULLET_HEADING>
 </HEADINGS>
 <HEADINGS item="y" uniqueid="march_10_2015_-_release_196_unstable">
 <Name>March 10, 2015 - Release 1.9.6 (unstable development snapshot)</Name>
Files old/TreeLine/icons/toolbar/32x32/helpabout.png and 
new/TreeLine/icons/toolbar/32x32/helpabout.png differ
Files old/TreeLine/icons/toolbar/32x32/treeline.png and 
new/TreeLine/icons/toolbar/32x32/treeline.png differ
Files old/TreeLine/icons/toolbar/32x32/treelogo.png and 
new/TreeLine/icons/toolbar/32x32/treelogo.png differ
Files old/TreeLine/icons/tree/treelogo.png and 
new/TreeLine/icons/tree/treelogo.png differ
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/TreeLine/samples/110en_sample_basic_longtext.trl 
new/TreeLine/samples/110en_sample_basic_longtext.trl
--- old/TreeLine/samples/110en_sample_basic_longtext.trl        2015-02-01 
21:14:57.000000000 +0100
+++ new/TreeLine/samples/110en_sample_basic_longtext.trl        2015-05-10 
20:31:10.000000000 +0200
@@ -1,21 +1,28 @@
 <?xml version='1.0' encoding='utf-8'?>
-<ROOT childtype="PLAIN_TEXT" item="y" line0="{*Name*}" line1="{*Name*}" 
tlversion="1.9.0" uniqueid="Text_Fields">
+<ROOT item="y" line0="{*Name*}" line1="{*Name*}" tlversion="1.9.7" 
uniqueid="Text_Fields">
 <Name idref="y" type="Text">Text Fields</Name>
 <REGULAR_TEXT formathtml="y" item="y" line0="{*Name*}" 
line1="&lt;b&gt;{*Name*}&lt;/b&gt;" line2="{*Text*}" 
uniqueid="Similar_to_Treepad">
 <Name idref="y" type="Text">Similar to Treepad</Name>
-<Text lines="12" type="Text">This file provides a single long text field for 
each node.
-This is similar to how the Treepad program on windows is usually used.</Text>
+<Text lines="12" type="Text">This file provides a single long text field for 
each node. This is similar to how the Treepad program on windows is usually 
used.</Text>
 </REGULAR_TEXT>
 <REGULAR_TEXT item="y" uniqueid="Regular_text_field">
 <Name>Regular text field</Name>
-<Text>The most commonly used field type is regular text. Formatting such as 
&lt;b&gt;bold&lt;/b&gt;, &lt;i&gt;itallics&lt;/i&gt;, &lt;span 
style="font-size:x-large"&gt;font &lt;/span&gt;&lt;span 
style="font-size:large"&gt;sizes&lt;/span&gt; and &lt;span 
style="color:#aa0000"&gt;font colors&lt;/span&gt; can be used from the Edit 
menu.</Text>
+<Text>The most commonly used field type is regular text. Formatting such as 
&lt;b&gt;bold&lt;/b&gt;, &lt;i&gt;italics&lt;/i&gt;, font sizes and &lt;span 
style="color:#aa0000"&gt;font colors&lt;/span&gt; can be used from the Edit 
menu.&lt;br /&gt;
+&lt;br /&gt;
+It preserves carriage return spaces, but not multiple spaces      within a 
line.</Text>
 </REGULAR_TEXT>
-<HTML_TEXT formathtml="y" item="y" line0="{*Name*}" 
line1="&lt;b&gt;{*Name*}&lt;/b&gt;" line2="{*Text*}" uniqueid="HTML_text_field">
+<HTML_TEXT formathtml="y" item="y" line0="{*Name*}" 
line1="&lt;b&gt;{*Name*}&lt;/b&gt;" line2="{*Text*}" uniqueid="html_text_field">
 <Name idref="y" type="Text">HTML text field</Name>
-<Text lines="12" type="HtmlText">An HTML field allows tags such as 
&lt;i&gt;itallics&lt;/i&gt; to be added manually.
+<Text lines="12" type="HtmlText">An HTML field allows tags such as 
&lt;i&gt;italics&lt;/i&gt; to be added manually.
 
 It does not preserve white space.
 
 Characters like &amp;lt;, &amp;gt;, and &amp;amp; must be escaped.</Text>
 </HTML_TEXT>
+<SPACED_TEXT formathtml="y" item="y" line0="{*Name*}" 
line1="&lt;b&gt;{*Name*}&lt;/b&gt;{*Text*}" uniqueid="spaced_text_field">
+<Name idref="y" type="Text">Spaced text field</Name>
+<Text lines="12" type="SpacedText">A spaced text field preserves all    white  
  space.
+
+It does not allow character formatting.</Text>
+</SPACED_TEXT>
 </ROOT>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/TreeLine/samples/330en_sample_math_fields.trl 
new/TreeLine/samples/330en_sample_math_fields.trl
--- old/TreeLine/samples/330en_sample_math_fields.trl   2015-02-01 
21:14:57.000000000 +0100
+++ new/TreeLine/samples/330en_sample_math_fields.trl   2015-05-10 
20:32:44.000000000 +0200
@@ -1,5 +1,5 @@
 <?xml version='1.0' encoding='utf-8'?>
-<TOP_ASSEMBLY childtype="ASSEMBLY" item="y" line0="{*PartNumber*} {*Name*}" 
line1="Part {*PartNumber*}" line2="{*Name*}" line3="Assembly Level: {*Level*}" 
line4="Cost: {*TotalCost*}" tlversion="1.9.5" uniqueid="widget_top_assembly">
+<TOP_ASSEMBLY childtype="ASSEMBLY" item="y" line0="{*PartNumber*} {*Name*}" 
line1="Part {*PartNumber*}" line2="{*Name*}" line3="Assembly Level: {*Level*}" 
line4="Cost: {*TotalCost*}" tlversion="1.9.8" uniqueid="widget_top_assembly">
 <PartNumber type="Text">123456</PartNumber>
 <Name idref="y" type="Text">Widget Top Assembly</Name>
 <Level format="#" type="Number">1</Level>
@@ -13,12 +13,13 @@
 <Cost eqn="sum({*&amp;Cost*}) + {*LaborCost*}" format="0.00" prefix="$" 
type="Math">10.040000000000001</Cost>
 <TotalCost eqn="{**TotalCost*}" format="0.00" prefix="$" 
type="Math">23.89</TotalCost>
 <PercentCost eqn="{*Cost*} / {*TotalCost*} * 100" format="0" suffix="%" 
type="Math">42.02595228128925</PercentCost>
-<PART item="y" line0="{*PartNumber*} {*Name*}" line1="Part {*PartNumber*}" 
line2="{*Name*}" line3="Assembly Level: {*Level*}" line4="Cost: {*Cost*}" 
line5="Percent Cost: {*PercentCost*}" uniqueid="lever">
+<PART item="y" line0="{*PartNumber*} {*Name*}" line1="Part {*PartNumber*}" 
line2="{*Name*}" line3="Assembly Level: {*Level*}" line4="Cost: {*Cost*}" 
line5="Percent Cost: {*PercentCost*}" line6="Cost Level: {*CostLevel*}" 
uniqueid="lever">
 <PartNumber type="Text">987654</PartNumber>
 <Name idref="y" type="Text">Lever</Name>
 <Level eqn="{**Level*} + 1" format="#" type="Math">3</Level>
 <Cost format="0.00" prefix="$" type="Number">5.4</Cost>
 <PercentCost eqn="{*Cost*} / {**TotalCost*} * 100" format="0" suffix="%" 
type="Math">22.60359983256593</PercentCost>
+<CostLevel eqn="('Low') if ({*PercentCost*} &lt; 20) else ('High')" 
resulttype="text" type="Math">High</CostLevel>
 </PART>
 <PART item="y" uniqueid="lever_bolt">
 <PartNumber>998877</PartNumber>
@@ -26,6 +27,7 @@
 <Level>3</Level>
 <Cost>2.89</Cost>
 <PercentCost>12.097111762243616</PercentCost>
+<CostLevel>Low</CostLevel>
 </PART>
 </ASSEMBLY>
 <ASSEMBLY item="y" uniqueid="bracket_assembly">
@@ -42,6 +44,7 @@
 <Level>3</Level>
 <Cost>6.2</Cost>
 <PercentCost>25.952281289242364</PercentCost>
+<CostLevel>High</CostLevel>
 </PART>
 <PART item="y" uniqueid="bracket_pin">
 <PartNumber>665544</PartNumber>
@@ -49,6 +52,7 @@
 <Level>3</Level>
 <Cost>1.9</Cost>
 <PercentCost>7.95311845960653</PercentCost>
+<CostLevel>Low</CostLevel>
 </PART>
 </ASSEMBLY>
 </TOP_ASSEMBLY>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/TreeLine/source/dataeditview.py 
new/TreeLine/source/dataeditview.py
--- old/TreeLine/source/dataeditview.py 2015-03-21 19:07:20.000000000 +0100
+++ new/TreeLine/source/dataeditview.py 2015-10-03 20:20:31.000000000 +0200
@@ -80,6 +80,7 @@
         super().__init__(parent)
         self.editorClickPos = None
         self.lastEditor = None
+        self.prevNumLines = -1
 
     def paint(self, painter, styleOption, modelIndex):
         """Paint the Data Edit Cells with support for rich text.
@@ -166,6 +167,14 @@
             if hasattr(editor, 'setLinkFromNode'):
                 self.parent().internalLinkSelected.connect(editor.
                                                            setLinkFromNode)
+            # viewport filter required to catch mouse events for undo limits
+            try:
+                editor.viewport().installEventFilter(self)
+            except AttributeError:
+                try:
+                    editor.lineEdit().installEventFilter(self)
+                except AttributeError:
+                    pass
             self.lastEditor = editor
             return editor
         return super().createEditor(parent, styleOption, modelIndex)
@@ -208,10 +217,14 @@
         cell = self.parent().item(modelIndex.row(), modelIndex.column())
         if isinstance(cell, DataEditCell):
             if editor.modified:
-                undo.DataUndo(cell.node.modelRef.undoList, cell.node, True,
-                              cell.field.name)
+                newText = editor.contents()
+                numLines = newText.count('\n')
+                skipUndoAvail = numLines == self.prevNumLines
+                self.prevNumLines = numLines
+                undo.DataUndo(cell.node.modelRef.undoList, cell.node,
+                              skipUndoAvail, cell.field.name)
                 try:
-                    cell.node.setData(cell.field, editor.contents())
+                    cell.node.setData(cell.field, newText)
                 except ValueError:
                     editor.setErrorFlag()
                 self.parent().nodeModified.emit(cell.node)
@@ -281,17 +294,20 @@
                 key = QtGui.QKeySequence(event.modifiers() | event.key())
                 view.shortcutEntered.emit(key)
                 return True
-        if (event.type() == QtCore.QEvent.FocusOut and
-            event.reason() in (QtCore.Qt.MouseFocusReason,
-                               QtCore.Qt.TabFocusReason,
-                               QtCore.Qt.BacktabFocusReason) and
-            (not hasattr(editor, 'calendar') or
-             not editor.calendar or not editor.calendar.isVisible()) and
-            (not hasattr(editor, 'intLinkDialog') or
-             not editor.intLinkDialog or
-             not editor.intLinkDialog.isVisible())):
-            self.parent().setCurrentCell(-1, -1)
-            return True
+        if event.type() == QtCore.QEvent.MouseButtonPress:
+            self.prevNumLines = -1  # reset undo avail for mose cursor changes
+        if event.type() == QtCore.QEvent.FocusOut:
+            self.prevNumLines = -1  # reset undo avail for any focus loss
+            if (event.reason() in (QtCore.Qt.MouseFocusReason,
+                                   QtCore.Qt.TabFocusReason,
+                                   QtCore.Qt.BacktabFocusReason) and
+                (not hasattr(editor, 'calendar') or
+                 not editor.calendar or not editor.calendar.isVisible()) and
+                (not hasattr(editor, 'intLinkDialog') or
+                 not editor.intLinkDialog or
+                 not editor.intLinkDialog.isVisible())):
+                self.parent().setCurrentCell(-1, -1)
+                return True
         return super().eventFilter(editor, event)
 
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/TreeLine/source/imports.py 
new/TreeLine/source/imports.py
--- old/TreeLine/source/imports.py      2015-03-09 00:31:57.000000000 +0100
+++ new/TreeLine/source/imports.py      2015-09-23 03:39:06.000000000 +0200
@@ -67,6 +67,7 @@
             filePath -- the file to import from if give, otherwise prompt user
         """
         self.filePath = filePath
+        self.errorMessage = ''
 
     def interactiveImport(self, addWarning=False):
         """Prompt the user for import type & proceed with import.
@@ -98,6 +99,7 @@
                                                    defaultFilePath, filters)
             if not self.filePath:
                 return None
+        self.errorMessage = ''
         try:
             QtGui.QApplication.setOverrideCursor(QtCore.Qt.WaitCursor)
             model = getattr(self, method)()
@@ -110,10 +112,12 @@
                                       format(self.filePath))
             return None
         if not model:
+            message = _('Error - improper format in {0}').format(self.filePath)
+            if self.errorMessage:
+                message = '{0}\n{1}'.format(message, self.errorMessage)
+                self.errorMessage = ''
             QtGui.QMessageBox.warning(QtGui.QApplication.activeWindow(),
-                                      'TreeLine',
-                                      _('Error - improper format in {0}').
-                                      format(self.filePath))
+                                      'TreeLine', message)
         return model
 
     def importTabbedText(self):
@@ -156,7 +160,9 @@
             headings = [self.correctFieldName(name) for name in 
                         f.readline().split('\t')]
             tableFormat.addFieldList(headings, True, True)
+            lineNum = 1
             for line in f:
+                lineNum += 1
                 if line.strip():
                     entries = line.split('\t')
                     node = treenode.TreeNode(model.root, typeName, model)
@@ -167,6 +173,8 @@
                     except IndexError:
                         pass    # fewer entries than headings is OK
                     if entries:
+                        self.errorMessage = (_('Too many entries on Line {0}').
+                                             format(lineNum))
                         return None   # abort if too few headings
                     node.setUniqueId(True)
         return model
@@ -232,6 +240,7 @@
         model = treemodel.TreeModel(True)
         tpFormat = model.formats[treeformats.defaultTypeName]
         tpFormat.addFieldList([textFieldName], False, True)
+        tpFormat.fieldDict[textFieldName].changeType('SpacedText')
         with open(self.filePath, 'r',
                   encoding=globalref.localTextEncoding) as f:
             textList = f.read().split('<end node> 5P9i0s8y19Z')
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/TreeLine/source/plugininterface.py 
new/TreeLine/source/plugininterface.py
--- old/TreeLine/source/plugininterface.py      2015-03-09 00:31:57.000000000 
+0100
+++ new/TreeLine/source/plugininterface.py      2015-09-18 02:45:24.000000000 
+0200
@@ -1196,6 +1196,35 @@
 
 
     #**************************************************************************
+    #   General Options:
+    #**************************************************************************
+
+    def getOptionValue(self, name):
+        """Return the value of a general option item.
+
+        See the setGenOptionDefaults function in the optiondefaults.py file
+        for available name values.
+        Raises a KeyError if the name is incorrect.
+        Arguments:
+            name -- the key name for the option
+        """
+        return globalref.genOptions.getValue(name)
+
+    def changeOptionValue(self, name, value):
+        """Set the name of an existing option to the given value.
+
+        Returns True if changed, False if value is the same or not permitted.
+        See the setGenOptionDefaults function in the optiondefaults.py file
+        for available name values.
+        Raises a KeyError if the name is incorrect.
+        Arguments:
+            name -- the key name for the option
+            value -- a value or a string defining the value
+        """
+        return globalref.genOptions.changeValue(name, value)
+
+
+    #**************************************************************************
     #  Internal methods (not for plugin use):
     #**************************************************************************
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/TreeLine/source/setup.py new/TreeLine/source/setup.py
--- old/TreeLine/source/setup.py        2015-03-09 00:31:57.000000000 +0100
+++ new/TreeLine/source/setup.py        2015-05-17 21:54:20.000000000 +0200
@@ -38,5 +38,5 @@
                                'excludes': ['*.pyc'],
                                'icon': '../win/treeline.ico',
                                'include_msvcr': True,
-                               'build_exe': '../../TreeLine-1.9'}},
+                               'build_exe': '../../TreeLine-2.0'}},
       executables = [Executable('treeline.py', base=base)])
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/TreeLine/source/treeline.py 
new/TreeLine/source/treeline.py
--- old/TreeLine/source/treeline.py     2015-03-21 17:31:08.000000000 +0100
+++ new/TreeLine/source/treeline.py     2015-10-03 20:20:31.000000000 +0200
@@ -13,7 +13,7 @@
 #******************************************************************************
 
 __progname__ = 'TreeLine'
-__version__ = '1.9.7'
+__version__ = '2.0.2'
 __author__ = 'Doug Bell'
 
 docPath = None         # modified by install script if required
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/TreeLine/source/treemaincontrol.py 
new/TreeLine/source/treemaincontrol.py
--- old/TreeLine/source/treemaincontrol.py      2015-03-09 00:31:57.000000000 
+0100
+++ new/TreeLine/source/treemaincontrol.py      2015-05-15 03:59:30.000000000 
+0200
@@ -124,7 +124,7 @@
                                                  for path in iconPathList],
                                                 ['', '32x32', '16x16'])
         globalref.toolIcons.loadAllIcons()
-        windowIcon = globalref.toolIcons.getIcon('treeline')
+        windowIcon = globalref.toolIcons.getIcon('treelogo')
         if windowIcon:
             QtGui.QApplication.setWindowIcon(windowIcon)
         globalref.treeIcons = icondict.IconDict(iconPathList, ['', 'tree'])
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/TreeLine/source/treenode.py 
new/TreeLine/source/treenode.py
--- old/TreeLine/source/treenode.py     2015-02-01 21:14:57.000000000 +0100
+++ new/TreeLine/source/treenode.py     2015-09-20 03:11:26.000000000 +0200
@@ -224,6 +224,38 @@
         """
         globalref.mainControl.currentTreeView().collapse(self.index())
 
+    def saveExpandViewStatus(self, statusDict=None):
+        """Recursively save the expand/collapse status of nodes in the branch.
+
+        Saves by unique ID, returns dictionary.
+        Arguments:
+            statusDict -- a dictionary to save in
+        """
+        if not statusDict:
+            statusDict = {}
+        statusDict[self.uniqueId] = self.isExpanded()
+        for node in self.childList:
+            statusDict = node.saveExpandViewStatus(statusDict)
+        return statusDict
+
+    def restoreExpandViewStatus(self, statusDict):
+        """Recursively restore expand/collapse status of nodes in the branch.
+
+        Arguments:
+            statusDict -- a dictionary with status by unique ID
+        """
+        try:
+            expanded = statusDict[self.uniqueId]
+            if expanded:
+                self.expandInView()
+            else:
+                self.collapseInView()
+                return
+        except KeyError:
+            pass
+        for node in self.childList:
+            node.restoreExpandViewStatus(statusDict)
+
     def setUniqueId(self, validate=False):
         """Add this node's unique ID to the ref dict.
 
@@ -571,9 +603,12 @@
         newParent = self.prevSibling()
         if not newParent:
             return
+        oldParent = self.parent
+        expandDict = oldParent.saveExpandViewStatus()
         self.parent.childList.remove(self)
         newParent.childList.append(self)
         self.parent = newParent
+        oldParent.restoreExpandViewStatus(expandDict)
 
     def unindent(self):
         """Make this node its parent's next sibling.
@@ -581,10 +616,12 @@
         sibling = self.parent
         if not sibling or not sibling.parent:
             return
+        expandDict = sibling.parent.saveExpandViewStatus()
         self.parent.childList.remove(self)
         pos = sibling.parent.childList.index(sibling) + 1
         sibling.parent.childList.insert(pos, self)
         self.parent = sibling.parent
+        sibling.parent.restoreExpandViewStatus(expandDict)
 
     def wordSearch(self, wordList, titleOnly=False):
         """Return True if all words in wordlist are found in this node's data.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/TreeLine/source/treeopener.py 
new/TreeLine/source/treeopener.py
--- old/TreeLine/source/treeopener.py   2015-02-01 21:14:57.000000000 +0100
+++ new/TreeLine/source/treeopener.py   2015-09-12 23:30:35.000000000 +0200
@@ -146,7 +146,10 @@
                 text = node.data.get(field.name, '')
                 if text:
                     if field.typeName == 'Text' and not field.oldHasHtml:
-                        node.data[field.name] = xml.sax.saxutils.escape(text)
+                        text = text.strip()
+                        text = xml.sax.saxutils.escape(text)
+                        text = text.replace('\n', '<br />\n')
+                        node.data[field.name] = text
                     elif (field.typeName == 'ExternalLink' and
                           field.oldTypeName):
                         dispName = node.data.get(field.oldLinkAltField, '')
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/TreeLine/source/undo.py new/TreeLine/source/undo.py
--- old/TreeLine/source/undo.py 2015-03-09 00:31:57.000000000 +0100
+++ new/TreeLine/source/undo.py 2015-09-12 23:30:35.000000000 +0200
@@ -244,8 +244,12 @@
                 del self.treeFormats.fieldRenameDict[newName]
         self.treeFormats.changedIdFieldTypes = set()
         for typeObj in newTreeFormats.changedIdFieldTypes:
-            self.treeFormats.changedIdFieldTypes.add(self.treeFormats[typeObj.
-                                                                      name])
+            try:
+                self.treeFormats.changedIdFieldTypes.add(self.
+                                                         treeFormats[typeObj.
+                                                                     name])
+            except KeyError:   # not needed for new tree formats
+                pass
         listRef.addUndoObj(self, clearRedo)
 
     def undo(self, redoRef):
Files old/TreeLine/translations/treeline_de.qm and 
new/TreeLine/translations/treeline_de.qm differ
Files old/TreeLine/translations/treeline_pt.qm and 
new/TreeLine/translations/treeline_pt.qm differ



Reply via email to