diff --git a/i18n/qgis_de.ts b/i18n/qgis_de.ts
index ac5a09e2a4c3..576e13add1d2 100644
--- a/i18n/qgis_de.ts
+++ b/i18n/qgis_de.ts
@@ -7436,94 +7436,94 @@ Diese Meldung erscheint höchstwahrscheinlich, weil die Umgebungsvariable DISPLA
QgisApp
-
-
-
+
+
+
Invalid Data Source
Ungültige Datenquelle
-
-
-
+
+
+
No Layer Selected
Keinen Layer ausgewählt
-
+
There is a new version of QGIS available
Eine neue Version von QGIS ist verfügbar
-
+
You are running a development version of QGIS
Sie verwenden eine Entwicklungsversion von QGIS
-
+
You are running the current version of QGIS
Sie verwenden die aktuelle Version von QGIS
-
+
Would you like more information?
Wollen Sie mehr Information?
-
-
-
+
+
+
QGIS Version Information
QGIS-Versionsinformationen
-
+
Unable to get current version information from server
Kann Informationen zu aktuellen Version nicht vom Server holen
-
+
Connection refused - server may be down
Verbindung abgelehnt - Server vielleicht heruntergefahren
-
+
QGIS server was not found
QGIS-Server nicht gefunden
-
+
Invalid Layer
Ungültiger Layer
-
+
%1 is an invalid layer and cannot be loaded.
%1 ist ein ungültiger Layer und kann nicht geladen werden.
-
+
Problem deleting features
Problem beim Löschen der Objekte
-
+
A problem occured during deletion of features
Beim Löschen der Objekte ist ein Problem aufgetreten
-
+
No Vector Layer Selected
Es wurde kein Vektorlayer gewählt
-
+
Deleting features only works on vector layers
Löschen von Objekten ist nur von Vektorlayern möglich
-
+
To delete features, you must select a vector layer in the legend
Zum Löschen von Objekte zu muss ein Vektorlayer in der Legende gewählt werden
@@ -7553,7 +7553,7 @@ Diese Meldung erscheint höchstwahrscheinlich, weil die Umgebungsvariable DISPLA
Wenn angewählt, werden die Kartenlayer abhängig von der Bedienung der Navigationsinstrumente, gezeichnet. Anderenfalls werden die Layer nicht gezeichnet. Dies erlaubt es, eine große Layeranzahl hinzuzufügen und das Aussehen der Layer vor dem Zeichnen zu setzen.
-
+
Choose a QGIS project file
Eine QGIS-Projektdatei wählen
@@ -7563,17 +7563,17 @@ Diese Meldung erscheint höchstwahrscheinlich, weil die Umgebungsvariable DISPLA
Zeichnen der Karte einschalten
-
+
QGIS Project Read Error
Fehler beim Lesen des QGIS-Projektes
-
+
Open a GDAL Supported Raster Data Source
Öffnen einer GDAL-Rasterdatenquelle
-
+
Choose a QGIS project file to open
QGIS-Projektdatei zum Öffnen wählen
@@ -7614,7 +7614,7 @@ Diese Meldung erscheint höchstwahrscheinlich, weil die Umgebungsvariable DISPLA
QGIS ist startklar!
-
+
New Bookmark
Neues Lesezeichen
@@ -7624,125 +7624,125 @@ Diese Meldung erscheint höchstwahrscheinlich, weil die Umgebungsvariable DISPLA
Fertig
-
+
QGIS version
QGIS-Version
-
+
QGIS code revision
QGIS-Codeversion
-
+
Compiled against Qt
Kompiliert gegen Qt
-
+
Running against Qt
Laufendes Qt
-
+
GDAL/OGR Version
GDAL/OGR-Version
-
+
GEOS Version
GEOS-Version
-
+
PostgreSQL Client Version
PostgreSQL-Client-Version
-
-
+
+
No support.
Keine Unterstützung.
-
+
SpatiaLite Version
SpatiaLite-Version
-
+
QWT Version
QWT-Version
-
+
This copy of QGIS writes debugging output.
Diese QGIS-Kopie schreibt Debugausgaben.
-
+
Unable to open project
Kann das Projekt nicht öffnen
-
+
Unknown network socket error: %1
Unbekannter Netzwerkfehler: %1
-
-
-
+
+
+
Layer is not valid
Layer ist ungültig
-
-
+
+
The layer is not a valid layer and can not be added to the map
Der Layer ist ungültig und kann daher nicht zum Kartenfenster hinzugefügt werden
-
+
Save?
Speichern?
-
+
Current CRS: %1 (OTFR enabled)
Aktuelles KBS: %1 (OTF-Reprojektion aktiv)
-
+
Current CRS: %1 (OTFR disabled)
Aktuelles KBS: %1 (OTF-Reprojektion aus)
-
+
Extents:
Ausdehnung:
-
+
Unsupported Data Source
Nicht unterstütztes Datenformat
-
+
Enter a name for the new bookmark:
Bitte einen Namen für das Lesezeichen eingeben:
-
-
-
-
+
+
+
+
Error
Fehler
-
+
Unable to create the bookmark. Your user database may be missing or corrupted
Kann das Lesezeichen nicht erstellen. Ihre Datenbank scheint zu fehlen oder ist kaputt
@@ -7757,24 +7757,24 @@ Diese Meldung erscheint höchstwahrscheinlich, weil die Umgebungsvariable DISPLA
Python wird gestartet
-
+
Provider does not support deletion
Provider unterstützt keine Löschoperationen
-
+
Data provider does not support deleting features
Der Provider hat nicht die Möglichkeit, Objekte zu löschen
-
-
-
+
+
+
Layer not editable
Der Layer kann nicht bearbeitet werden
-
+
The current layer is not editable. Choose 'Start editing' in the digitizing toolbar.
Der aktuelle Layer kann nicht bearbeitet werden. Bitte 'Bearbeitungsstatus umschalten' aus der Digitalisierwerkzeugleiste wählen.
@@ -7789,17 +7789,17 @@ Diese Meldung erscheint höchstwahrscheinlich, weil die Umgebungsvariable DISPLA
Aktueller Kartenmaßstab (x:y formatiert)
-
+
Map coordinates at mouse cursor position
Kartenkoordinaten beim Mauszeiger
-
+
Invalid scale
Ungültiger Maßstab
-
+
Do you want to save the current project?
Soll das aktuelle Projekt gespeichert werden?
@@ -7809,18 +7809,18 @@ Diese Meldung erscheint höchstwahrscheinlich, weil die Umgebungsvariable DISPLA
Aktueller Kartenmaßstab
-
+
Project file is older
Projektdatei ist älter
-
+
<tt>Settings:Options:General</tt>
Menu path to setting options
<tt>Einstellungen:Optionen:Allgemein</tt>
-
+
Warn me when opening a project file saved with an older version of QGIS
Beim Öffnen einer Projektdatei, die mit einer älteren QGIS-Version erstellt wurde, warnen
@@ -7860,7 +7860,7 @@ Diese Meldung erscheint höchstwahrscheinlich, weil die Umgebungsvariable DISPLA
KBS-Status - Klicken um den Dialog zum Koordinatenbezugssystem zu öffnen
-
+
Maptips require an active layer
Kartentipps erfordern einen aktuellen Layer
@@ -7945,7 +7945,7 @@ Bitte nehmen Sie Kontakt zu den Entwicklern auf.
-
+
Coordinate:
Koordinate:
@@ -7965,72 +7965,83 @@ Bitte nehmen Sie Kontakt zu den Entwicklern auf.
Aktuelle Kartenkoordinaten (formatiert als x,y)
-
-
+
+
+ Control rendering order
+ Bestimmt Zeichenreihenfolge
+
+
+
+ Layer order
+ Layerreihenfolge
+
+
+
+
Private qgis.db
Benutzer qgis.db
-
+
Could not open qgis.db
Konnte qgis.db nicht öffnen
-
+
Migration of private qgis.db failed.
%1
Migration der Benutzer qgis.db schlug fehl.
%1
-
+
%1 doesn't have any layers
%1 hat keine Layer
-
+
Select raster layers to add...
Einzufügende Rasterlayer wählen...
-
+
Labeling
Beschriftung
-
+
Couldn't load Python support library: %1
Konnte Python-Unterstützungsbibliothek nicht laden: %1
-
+
Couldn't resolve python support library's instance() symbol.
Konnte Symbol instance() nicht in Python-Unterstützungsbibliothek finden.
-
+
Python support ENABLED :-)
Python-Unterstützung aktiviert :-)
-
+
QGIS - Changes since last release
QGIS-Änderung seit der letzten Ausgabe
-
-
+
+
To perform a full histogram stretch, you need to have a raster layer selected.
Um eine volle Histogrammstreckung durchzuführen, muß ein Rasterlayer gewählt sein.
-
-
+
+
To perform a local histogram stretch, you need to have a grayscale or multiband (multiband single layer, singleband grayscale or multiband color) raster layer selected.
Um einen lokale Histogrammstreckung durchzuführen, muß ein Graustufen- oder Mehrkanalrasterlayer gewählt sein.
-
+
Always ignore these errors?
@@ -8039,7 +8050,7 @@ Always ignore these errors?
Diese Fehler immer ignorieren?
-
+
%n SSL errors occured
number of errors
@@ -8048,7 +8059,7 @@ Diese Fehler immer ignorieren?
-
+
Raster
Raster
@@ -8063,253 +8074,248 @@ Diese Fehler immer ignorieren?
QGIS startet...
-
+
Map layer list that displays all layers in drawing order.
Layerliste, die alle Layer in Zeichenreihenfolge anzeigt.
-
- Layerorder
- Layerreihenfolge
-
-
-
+
[ERROR] Can not make qgis.db private copy
[FEHLER] Kann private Kopie von qgis.db nicht anlegen
-
+
Select vector layers to add...
Einzufügende Vektorlayer wählen...
-
+
PostgreSQL
PostgreSQL
-
+
Cannot get PostgreSQL select dialog from provider.
Kann PostgreSQL-Auswahldialog des Datenlieferanten nicht bestimmen.
-
+
%1 is an invalid layer - not loaded
%1 ist ein ungültiger Layer - nicht geladen
-
+
SpatiaLite
SpatiaLite
-
+
Cannot get SpatiaLite select dialog from provider.
Kann SpatiaLite-Auswahldialog nicht vom Datenlieferanten holen.
-
+
WMS
WMS
-
+
Cannot get WMS select dialog from provider.
Konnte den WMS-Auswahldialog nicht vom Datenlieferanten holen.
-
+
WFS
WFS
-
+
Cannot get WFS select dialog from provider.
Konnte WFS-Auswahldialog nicht vom Datenlieferanten holen.
-
+
Calculating...
Berechne...
-
+
Abort...
Abbrechen...
-
+
Choose a file name to save the QGIS project file as
Name für zu speichernden QGIS-Projektdatei wählen
-
+
Unable to load %1
%1 kann nicht geladen werden
-
+
Choose a file name to save the map image as
Name für Datei zum Speichern des Kartenabbilds wählen
-
+
Please select a vector layer first.
Bitte wählen zur zuvor einen Layer.
-
+
Saving done
Speichern abgeschlossen
-
+
Export to vector file has been completed
Export in Vektordatei ist abgeschlossen
-
+
Save error
Fehler beim Speichern
-
+
Export to vector file failed.
Error: %1
Export in Vektordatei schlug fehl.
Fehler: %1
-
+
Features deleted
Objekt gelöscht
-
+
Merging features...
Objekte werden verschmolzen...
-
+
Abort
Abbrechen
-
-
+
+
Composer %1
Druckzusammenstellung %1
-
-
+
+
No active layer
Kein aktiver Layer
-
-
+
+
No active layer found. Please select a layer in the layer list
Keinen aktiven Layer gefunden. Bitte einen Layer aus der Liste wählen
-
-
+
+
Active layer is not vector
Aktiver ist kein Vektorlayer
-
-
+
+
The merge features tool only works on vector layers. Please select a vector layer from the layer list
Das Verschmelzen von Objekte funktioniert nur mit Vektorlayern. Bitte einen Vektorlayer aus der Liste wählen
-
-
+
+
Merging features can only be done for layers in editing mode. To use the merge tool, go to Layer->Toggle editing
Objekte können nur auf Layern im Bearbeitungsmodus verschmolzen werden. Bitte mit Layer->Bearbeitungsmodus umschalten, um das Verschmelzungswerkzeug zu benutzen
-
-
-
+
+
+
The merge tool requires at least two selected features
Das Verschmelzungswerkzeug erfordert mindestens zwei gewählte Objekte
-
-
-
+
+
+
Not enough features selected
Nicht genug Objekte gewählt
-
+
Merged feature attributes
Objektattribute vereinen
-
-
+
+
Merge failed
Zusammenführung fehlgeschlagen
-
-
+
+
An error occured during the merge operation
Beim Zusammenführen trat ein Fehler auf
-
-
+
+
The union operation would result in a geometry type that is not compatible with the current layer and therefore is canceled
Die Vereinigungsoperation würde zu einem Geometrietyp führen, der nicht zum aktuellen Layer paßt, und wurde daher abgebrochen
-
+
Union operation canceled
Vereinigungsvorgang abgebrochen
-
+
Merged features
Objekte verschmelzen
-
+
Features cut
Objekte ausgeschnitten
-
+
Features pasted
Objekte eingefügt
-
+
Start editing failed
Bearbeitungsbeginn schlug fehl
-
+
Provider cannot be opened for editing
Lieferant kann nicht zum Bearbeiten geöffnet werden
-
+
Stop editing
Bearbeitung beenden
-
+
Do you want to save the changes to layer %1?
Sollen die Änderungen am Layer %1 gespeichert werden?
-
-
+
+
Could not commit changes to layer %1
Errors: %2
@@ -8320,7 +8326,7 @@ Fehler: %2
-
+
Problems during roll back
Probleme beim Zurücknehmen der Änderungen
@@ -8330,37 +8336,37 @@ Fehler: %2
GPS-Information
-
+
Tile scale
Kachelmaßstab
-
+
Map coordinates for the current view extents
Kartenkoordinaten für den aktuell sichtbaren Ausschnitt
-
+
Warning
Warnung
-
+
This layer doesn't have a properties dialog.
Dieser Layer hat keine Eigenschaftendialog.
-
+
Authentication required
Authentifikation erforderlich
-
+
Proxy authentication required
Proxy-Authentifikation erforderlich
-
+
SSL errors occured accessing URL %1:
SSL-Fehler beim Zugriff auf URL %1:
@@ -8370,59 +8376,59 @@ Fehler: %2
Quantum GIS - %1 ('%2')
-
+
%1 is not a valid or recognized data source
%1 ist keine gültige Datenquelle oder wird nicht erkannt
-
-
+
+
Saved project to: %1
Projekt in %1 gespeichert
-
-
+
+
Unable to save project %1
Konnte Projekt %1 nicht speichern
-
+
Saved map image to %1
Kartenabbild als %1 gespeichert
-
+
Unable to communicate with QGIS Version server
%1
Konnte nicht mit dem QGIS-Versionserver kommunizieren
%1
-
-
+
+
To perform a local histogram stretch, you need to have a raster layer selected.
Um eine lokale Histogramdehnung vorzunehmen muss ein Raster Layer ausgewählt sein.
-
-
+
+
No Raster Layer Selected
Kein Rasterlayer gewählt
-
-
+
+
No Valid Raster Layer Selected
Kein gültiger Rasterlayer gewählt
-
+
The layer %1 is not a valid layer and can not be added to the map
Der Layer %1 ist ungültig und kann der Karte nicht hinzugefügt werden
-
+
%n feature(s) selected on layer %1.
number of selected features
@@ -8431,24 +8437,24 @@ Fehler: %2
-
+
%1 is not a valid or recognized raster data source
%1 ist keine gültige Rasterdatenquelle oder wird nicht erkannt
-
+
%1 is not a supported raster data source
%1 ist keine unterstützte Rasterdatenquelle
-
+
<p>This project file was saved by an older version of QGIS. When saving this project file, QGIS will update it to the latest version, possibly rendering it useless for older versions of QGIS.<p>Even though QGIS developers try to maintain backwards compatibility, some of the information from the old project file might be lost. To improve the quality of QGIS, we appreciate if you file a bug report at %3. Be sure to include the old project file, and state the version of QGIS you used to discover the error.<p>To remove this warning when opening an older project file, uncheck the box '%5' in the %4 menu.<p>Version of the project file: %1<br>Current version of QGIS: %2
<p>Diese Projektdatei wurde mit einer älteren QGIS-Version gespeichert. Beim Speichern dieser Projektdatei wird QGIS es auf die aktuelle Version aktualisieren und sie damit unter Umständen für ältere QGIS-Versionen unbrauchbar machen. <p>Obwohl die QGIS-Entwickler versuchen Rückwärtskompatibilität zu erhalten, könnten dabei einige Informationen der alten Projektdatei verloren gehen. Um die Qualität von QGIS zu verbessern, würden wir es begrüßen, wenn Sie einen Fehler unter %3 melden würden. Bitte legen Sie die alte Projektdatei bei und nennen Sie die QGIS-Version mit der Sie diesen Fehler entdeckt haben. <p>Um diese Warnung in Zukunft zu unterdrücken, entfernen Sie bitte das Häkchen in '%5' im Menü %4.<p>Version der Projektdatei: %1<br>Aktuelle QGIS-Version: %2
-
-
-
+
+
+
QGis files (*.qgs)
QGIS-Dateien (*.qgs)
@@ -8458,12 +8464,12 @@ Fehler: %2
Layer
-
+
Delete features
Objekte löschen
-
+
Delete %n feature(s)?
number of features to delete
@@ -11642,113 +11648,133 @@ Sollen die vorhandenen Klassen vor der Klassifizierung gelöscht werden?Allgemeine Optionen
-
-
+
+
Single Box
Einfacher Rahmen
-
-
+
+
Double Box
Doppelter Rahmen
-
-
-
+
+
+
Line Ticks Middle
Mittige Linieneinteilung
-
-
+
+
Line Ticks Down
Linieneinteilung unten
-
-
+
+
Line Ticks Up
Linieneinteilung oben
-
-
+
+
Numeric
Numerisch
-
-
+
+ Left
+ Links
+
+
+
+ Middle
+ Mitte
+
+
+
+ Right
+ Rechts
+
+
+
+
Map %1
Karte %1
-
+
Scalebar map changed
Maßstabsleiste geändert
-
+
Scalebar line width
Maßstabsleistenbreite
-
+
Scalebar segment size
Maßstabssegmentgröße
-
+
Scalebar segments left
Maßstabsleistensegmente links
-
+
Scalebar n segments
Maßstabsleiste n Segmente
-
+
Scalebar height changed
Maßstabsleistenhöhe geändert
-
+
Scalebar font changed
Maßstabsleistenschriftart geändert
-
+
Scalebar color changed
Maßstabsleistenfarbe geändert
-
+
Scalebar unit text
Maßstabsleisteneinheitstext
-
+
Scalebar map units per segment
Maßstabsleiste: Karteneinheiten je Segment
-
+
Scalebar style changed
Maßstabsleiste: Stil geändert
-
+
Scalebar label bar space
Maßstabsbeschriftungszwischenraum
-
+
Scalebar box content space
Maßstabsleisteninhaltszwischenraum
+
+
+ Scalebar alignment
+ Maßstableistenausrichtung
+
QgsComposerScaleBarWidgetBase
@@ -11810,6 +11836,11 @@ Sollen die vorhandenen Klassen vor der Klassifizierung gelöscht werden?Box space
Rahmenabstand
+
+
+ Alignment
+ Ausrichtung
+
Style
@@ -11845,62 +11876,62 @@ Sollen die vorhandenen Klassen vor der Klassifizierung gelöscht werden?
-
-
+
+
Ellipse
Ellipse
-
-
+
+
Rectangle
Rechteck
-
-
+
+
Triangle
Dreieck
-
+
Shape rotation changed
Formdrehung geändert
-
+
Shape type changed
Formtyp geändert
-
+
Select outline color
Umrissfarbe auswählen
-
+
Shape outline color
Formumrissfarbe
-
+
Shape outline width
Formrahmenbreite
-
+
Shape transparency toggled
Umrisstransparenz umgeschaltet
-
+
Select fill color
Füllfarbe auswählen
-
+
Shape fill color
Formfüllfarbe
@@ -12142,67 +12173,67 @@ Sollen die vorhandenen Klassen vor der Klassifizierung gelöscht werden?
QgsComposerView
-
+
Quantum GIS
Quantum GIS
-
+
Move item content
Elementinhalt verschieben
-
+
Remove item group
Elementgruppe entfernen
-
+
Item deleted
Element gelöscht
-
+
Zoom item content
Zum Elementinhalt zoomen
-
+
Arrow added
Pfeil hinzugefügt
-
+
Label added
Beschriftung hinzugefügt
-
+
Map added
Karte hinzugefügt
-
+
Scale bar added
Maßstabsleiste hinzugefügt
-
+
Legend added
Legende hinzugefügt
-
+
Picture added
Bild hinzugefügt
-
+
Shape added
Form hinzugefügt
-
+
Table added
Tabelle hinzugefügt
@@ -13205,36 +13236,41 @@ scheiterte mit Fehler: %3
+ Select at id
+ Abfrage nach ID
+
+
+
Sql
SQL
-
+
Point
Punkt
-
+
Multipoint
Multipunkt
-
+
Line
Linie
-
+
Multiline
Multilinie
-
+
Polygon
Polygon
-
+
Multipolygon
Multipolygon
@@ -24886,27 +24922,27 @@ Ausführliche Fehlerinformation:
XML-Dateien (*.xml *.XML)
-
+
Select Table
Tabelle wählen
-
+
You must select a table in order to add a layer.
Um einen Layer hinzuzufügen, muss eine Tabelle gewählt sein.
-
+
Postgres/PostGIS Provider
PostgreSQL/PostGIS-Datenlieferant
-
+
Could not open the Postgres/PostGIS Provider
Konnte den PostgreSQL/PostGIS-Datenlieferanten nicht öffnen
-
+
Waiting
Wartend
@@ -25953,7 +25989,7 @@ p, li { white-space: pre-wrap; }
QgsPostgresProvider
-
+
Unable to access relation
Auf die Relation kann nicht zugegriffen werden
@@ -25969,7 +26005,7 @@ Der Error den die Datenbank lieferte war:
SQL: %3
-
+
Unable to determine table access privileges for the %1 relation.
The error message from the database was:
%2.
@@ -25980,7 +26016,7 @@ Der Fehler der Datenbank war:
SQL: %3
-
+
Whole number (smallint - 16bit)
Kleine Ganzzahl (16bit)
@@ -25995,35 +26031,35 @@ SQL: %3
-
-
-
-
-
-
-
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
-
+
-
+
+
PostgreSQL
PostgreSQL
@@ -26050,68 +26086,68 @@ Fehler: %2
Fehler bei Felderzeugung
-
+
invalid PostgreSQL layer
Ungültiger PostgreSQL-Layer
-
+
Decimal number (numeric)
Dezimalzahl (numeric)
-
+
Decimal number (decimal)
Dezimalzahl (decimal)
-
+
Decimal number (real)
Dezimalzahl (real)
-
+
Decimal number (double)
Dezimalzahl (double)
-
+
Text, fixed length (char)
Text, feste Länge (char)
-
+
Connection to database failed
Verbindung zur Datenbank schlug fehl
-
+
error in setting encoding
Fehler beim Setzen der Codierung
-
+
undefined return value from encoding setting
Ungültiger Rückgabewert aus Codierungseinstellung
-
+
No PostGIS Support!
Keine PostGIS-Unterstützung!
-
+
Your database has no working PostGIS support.
Ihre Datenbank hat keine funktionsfähige PostGIS-Unterstützung.
-
+
No GEOS Support!
Keine GEOS Unterstützung!
-
+
Your PostGIS installation has no GEOS support.
Feature selection and identification will not work properly.
Please install PostGIS with GEOS support (http://geos.refractions.net)
@@ -26120,7 +26156,7 @@ Objektauswahl und -identifizierung kann nicht richtig funktionieren.
Bitte PostGIS mit GEOS-Unterstützung installieren (http://geos.refractions.net)
-
+
SQL:%1
result:%2
error:%3
@@ -26131,20 +26167,20 @@ Fehler:%3
-
-
-
+
+
+
Accessible tables could not be determined
Zugreifbare Tabellen konnten nicht festgestellt werden
-
+
Database connection was successful, but the accessible tables could not be determined.
Die Datenbankverbindung war erfolgreich, jedoch konnten die zugänglichen Tabelle nicht bestimmt werden.
-
-
+
+
Database connection was successful, but the accessible tables could not be determined.
The error message from the database was:
@@ -26157,12 +26193,12 @@ Die Fehlermeldung der Datenbank war:
-
+
No accessible tables found
Keine zugänglichen Tabellen gefunden
-
+
Database connection was successful, but no accessible tables were found.
Please verify that you have SELECT privilege on a table carrying PostGIS
@@ -26173,12 +26209,12 @@ Bitte stellen Sie sicher, dass Sie das SELECT-Privileg für eine Tabelle
mit PostGIS-Geometrie haben.
-
+
Unable to get list of spatially enabled tables from the database
Konnte Liste der räumlichen Tabellen der Datenbank nicht bestimmen
-
+
Couldn't get the feature geometry in binary form
Objektgeometrie konnte nicht in binärer Form abgerufen werden
@@ -26242,17 +26278,17 @@ Write accesses will be denied.
Schreibzugriffe werden verweigert.
-
+
The custom query is not a select query.
Die Benutzerabfrage ist keine SELECT-Abfrage.
-
+
Unable execute the query
Konnte die Abfrage nicht ausführen
-
+
Unable to execute the query.
The error message from the database was:
%1.
@@ -26263,133 +26299,133 @@ Dei Fehlermeldung der Datenbank war:
SQL: %2
-
+
No suitable key column in table
Keine passende Schlüsselspalte in der Tabelle
-
+
Unexpected relation type of '%1'.
Unerwarteter Relationstyp von '%1'
-
+
and
und
-
+
The unique index based on columns %1 is unsuitable because Quantum GIS does not currently support multiple columns as a key into the table.
Der eindeutige Index auf den Spalten '%1' ist ungeeignet, weil Quantum GIS zur Zeit nur einzelne Spalten als Tabellenschlüssel unterstützt.
-
+
Unable to find a key column
Kann die Schlüsselspalte nicht finden
-
+
Relation %1.%2 doesn't exist in the pg_class table. This shouldn't happen and is odd.
Relation %1.%2 existiert in der pg_class-Tabelle nicht. Die sollte nicht vorkommen und ist merkwürdig.
-
+
and is suitable.
und ist geeignet.
-
+
and has a suitable constraint)
und hat einen geeigneten Constraint)
-
+
and does not have a suitable constraint)
und hat keinen geeigneten Constraint)
-
+
No suitable key column in view
Keine geeignete Schlüsselspalte im View
-
+
Retrieval of postgis version failed
Bestimmen der PostGIS-Version schlug fehl
-
+
Could not parse postgis version string '%1'
Unverständliche PostGIS-Version '%1'
-
+
extents query failed: %1
Abfrage der Ausmaße schlug fehl: %1
-
+
no oid found
Kein OID gefunden
-
+
Unknown geometry type
Unbekannter Geometrietyp
-
+
Column %1 in %2 has a geometry type of %3, which Quantum GIS does not currently support.
Spalte %1 in %2 hat den Geometrietyp %3, den Quantum GIS zur Zeit nicht unterstützt.
-
+
Quantum GIS was unable to determine the type and srid of column %1 in %2. The database communication log was:
%3
Quantum GIS konnte den Typ und die SRID der Spalte %1 in %2 nicht bestimmen. Das Datenbankkommunikationsprotokoll war:
%3
-
+
Unable to get feature type and srid
Kann den Objekttyp und die SRID nicht ermitteln
-
+
Failed to get geometry details for PostGIS column %1.%2.
Konnte die Geometriedetails der PostGIS-Spalte %1.%2 nicht bestimmen.
-
+
Errornous query: %1 returned %2 [%3]
Fehlerhafte Abfrage: %1 ergab %2 [%3]
-
+
Query failed: %1
Error: %2
Abfrage gescheitert: %1
Fehler: %2
-
+
Query: %1 returned no result buffer
Abfrage: %1 gab nichts zurück
-
+
Query: %1 returned %2 [%3]
Abfrage: %1 ergab %2 [%3]
-
+
Query failed
Abfrage gescheitert
-
+
%1 cursor states lost.
SQL: %2
Result: %3 (%4)
@@ -26398,37 +26434,37 @@ SQL: %2
Ergebnis: %3 (%4)
-
+
resetting bad connection.
Schlechte Verbindung wird zurückgesetzt.
-
+
retry after reset succeeded.
Erneuter Versuch nach Zurücksetzung erfolgreich.
-
+
retry after reset failed again.
Erneuter Versuch nach Rücksetzung schlug wieder fehl.
-
+
connection still bad after reset.
Verbindung nach Zurücksetzung immer noch schlecht.
-
+
bad connection, not retrying.
Schlechte Verbindung, keine neuen Versuche.
-
+
Error while adding features
Fehler beim Hinzufügen von Objekten
-
+
The table has no column suitable for use as a key.
Quantum GIS requires that the table either has a column of type
@@ -26444,14 +26480,14 @@ einschließt), eine PostgreSQL-oid-Spalte oder eine ctid-Spalte
hat.
-
+
The unique index on column '%1' is unsuitable because Quantum GIS does not currently support non-integer typed columns as a key into the table.
Der eindeutige Index auf Spalte '%1' ist ungeeignet, weil Quantum GIS zur Zeit nur Spalten von Integer-Typen als Tabellenschlüssel unterstützt.
-
+
The view '%1.%2' has no column suitable for use as a unique key.
Quantum GIS requires that the view has a column that can be used as a unique key. Such a column should be derived from a table column of type integer and be a primary key, have a unique constraint on it, or be a PostgreSQL oid column. To improve performance the column should also be indexed.
The view you selected has the following columns, none of which satisfy the above conditions:
@@ -26460,68 +26496,68 @@ Quantum GIS erwartet jedoch eine solche Spalte. Sie sollte von einer Tabellespal
Der ausgewählte View hat folgende Spalten von denen keine die obigen Bedingungen erfüllt:
-
+
Error while deleting features
Fehler beim Löschen von Objekten
-
+
Error while adding attributes
Fehler beim Hinzufügen von Attributen
-
+
Error while deleting attributes
Fehler beim Löschen von Attributen
-
+
Error while changing attributes
Fehler beim Ändern von Attributen
-
+
Error while changing geometry values
Fehler beim Ändern von Geometrien
-
+
unexpected PostgreSQL error
Nicht erwarteter PostgeSQL-Fehler
-
+
'%1' derives from '%2.%3.%4'
'%1' ist von '%2.%3.%4' abgeleitet
-
+
and is not suitable (type is %1)
und ist ungeeignet (Typ ist %1)
-
+
Note: '%1' initially appeared suitable but does not contain unique data, so is not suitable.
Bemerkung: '%1' schien anfänglich geeignet, ist es allerdings nicht, da sie keine eindeutigen Daten enthält.
-
+
Whole number (integer - 32bit)
Ganzzahl (32bit)
-
+
Whole number (integer - 64bit)
Ganzzahl (64bit)
-
+
Text, limited variable length (varchar)
Text, begrenzte variable Länge (varchar)
-
+
Text, unlimited length (text)
Text, unbegrenzte Länge (text)
diff --git a/python/core/qgscomposerscalebar.sip b/python/core/qgscomposerscalebar.sip
index beeed5903b71..280726ddbb38 100644
--- a/python/core/qgscomposerscalebar.sip
+++ b/python/core/qgscomposerscalebar.sip
@@ -9,6 +9,14 @@ class QgsComposerScaleBar: QgsComposerItem
%End
public:
+ /**Added in version 1.8*/
+ enum Alignment
+ {
+ Left = 0,
+ Middle,
+ Right
+ };
+
QgsComposerScaleBar( QgsComposition* composition /TransferThis/);
~QgsComposerScaleBar();
@@ -58,6 +66,13 @@ class QgsComposerScaleBar: QgsComposerItem
double segmentMillimeters() const;
+ /**Left / Middle/ Right
+ @note: this method was added in version 1.8*/
+ Alignment alignment() const;
+
+ /**@note: this method was added in version 1.8*/
+ void setAlignment( Alignment a );
+
/**Apply default settings*/
void applyDefaultSettings();
/**Apply default size (scale bar 1/5 of map item width)
diff --git a/src/app/composer/qgscomposerscalebarwidget.cpp b/src/app/composer/qgscomposerscalebarwidget.cpp
index b1799a2ccc35..cacf3b0e5cd7 100644
--- a/src/app/composer/qgscomposerscalebarwidget.cpp
+++ b/src/app/composer/qgscomposerscalebarwidget.cpp
@@ -31,12 +31,19 @@ QgsComposerScaleBarWidget::QgsComposerScaleBarWidget( QgsComposerScaleBar* scale
toolBox->addItem( itemPropertiesWidget, tr( "General options" ) );
blockMemberSignals( true );
+
+ //style combo box
mStyleComboBox->insertItem( 0, tr( "Single Box" ) );
mStyleComboBox->insertItem( 1, tr( "Double Box" ) );
mStyleComboBox->insertItem( 2, tr( "Line Ticks Middle" ) );
mStyleComboBox->insertItem( 3, tr( "Line Ticks Down" ) );
mStyleComboBox->insertItem( 4, tr( "Line Ticks Up" ) );
mStyleComboBox->insertItem( 5, tr( "Numeric" ) );
+
+ mAlignmentComboBox->insertItem( 0, tr( "Left" ) );
+ mAlignmentComboBox->insertItem( 1, tr( "Middle" ) );
+ mAlignmentComboBox->insertItem( 2, tr( "Right" ) );
+
setGuiElements(); //set the GUI elements to the state of scaleBar
blockMemberSignals( false );
}
@@ -161,6 +168,9 @@ void QgsComposerScaleBarWidget::setGuiElements()
//style...
QString style = mComposerScaleBar->style();
mStyleComboBox->setCurrentIndex( mStyleComboBox->findText( tr( style.toLocal8Bit().data() ) ) );
+
+ //alignment
+ mAlignmentComboBox->setCurrentIndex(( int )( mComposerScaleBar->alignment() ) );
}
//slots
@@ -371,6 +381,18 @@ void QgsComposerScaleBarWidget::on_mBoxSizeSpinBox_valueChanged( double d )
mComposerScaleBar->endCommand();
}
+void QgsComposerScaleBarWidget::on_mAlignmentComboBox_currentIndexChanged( int index )
+{
+ if ( !mComposerScaleBar )
+ {
+ return;
+ }
+
+ mComposerScaleBar->beginCommand( tr( "Scalebar alignment" ) );
+ mComposerScaleBar->setAlignment(( QgsComposerScaleBar::Alignment ) index );
+ mComposerScaleBar->endCommand();
+}
+
void QgsComposerScaleBarWidget::blockMemberSignals( bool block )
{
mSegmentSizeSpinBox->blockSignals( block );
@@ -384,4 +406,5 @@ void QgsComposerScaleBarWidget::blockMemberSignals( bool block )
mLineWidthSpinBox->blockSignals( block );
mLabelBarSpaceSpinBox->blockSignals( block );
mBoxSizeSpinBox->blockSignals( block );
+ mAlignmentComboBox->blockSignals( block );
}
diff --git a/src/app/composer/qgscomposerscalebarwidget.h b/src/app/composer/qgscomposerscalebarwidget.h
index 4441d0e24fd7..4dbb3118cf07 100644
--- a/src/app/composer/qgscomposerscalebarwidget.h
+++ b/src/app/composer/qgscomposerscalebarwidget.h
@@ -46,6 +46,7 @@ class QgsComposerScaleBarWidget: public QWidget, private Ui::QgsComposerScaleBar
void on_mStyleComboBox_currentIndexChanged( const QString& text );
void on_mLabelBarSpaceSpinBox_valueChanged( double d );
void on_mBoxSizeSpinBox_valueChanged( double d );
+ void on_mAlignmentComboBox_currentIndexChanged( int index );
protected:
diff --git a/src/app/composer/qgscomposershapewidget.cpp b/src/app/composer/qgscomposershapewidget.cpp
index e62ead8395ed..18d23c52c99a 100644
--- a/src/app/composer/qgscomposershapewidget.cpp
+++ b/src/app/composer/qgscomposershapewidget.cpp
@@ -39,7 +39,10 @@ QgsComposerShapeWidget::QgsComposerShapeWidget( QgsComposerShape* composerShape
blockAllSignals( false );
- connect( mShapeComboBox, SIGNAL( currentIndexChanged( int ) ), this, SLOT( setGuiElementValues() ) );
+ if ( mComposerShape )
+ {
+ connect( mComposerShape, SIGNAL( itemChanged() ), this, SLOT( setGuiElementValues() ) );
+ }
}
QgsComposerShapeWidget::~QgsComposerShapeWidget()
diff --git a/src/app/legend/qgslayerorder.cpp b/src/app/legend/qgslayerorder.cpp
index 59dc899a9d6e..4f22694964b7 100644
--- a/src/app/legend/qgslayerorder.cpp
+++ b/src/app/legend/qgslayerorder.cpp
@@ -38,8 +38,8 @@ QgsLayerOrder::QgsLayerOrder( QgsLegend *legend, QWidget * parent, const char *n
this, SLOT( legendItemChanged( QTreeWidgetItem *, int ) ) );
// track if legend mode changes
- connect( mLegend, SIGNAL( updateDrawingOrderChanged( bool ) ),
- this, SLOT( updateDrawingOrderChanged( bool ) ) );
+ connect( mLegend, SIGNAL( updateDrawingOrderChecked( bool ) ),
+ this, SLOT( updateDrawingOrderChecked( bool ) ) );
connect( mLegend, SIGNAL( zOrderChanged() ),
this, SLOT( refreshLayerList() ) );
@@ -64,13 +64,13 @@ QgsLayerOrder::QgsLayerOrder( QgsLegend *legend, QWidget * parent, const char *n
setSelectionMode( QAbstractItemView::ExtendedSelection );
setDragEnabled( false );
setAutoScroll( true );
- QFont f( "Arial", 12, QFont::Bold );
+ QFont f( "Arial", 11, QFont::Bold );
setFont( f );
QPalette palette;
palette.setColor( backgroundRole(), QColor( 192, 192, 192 ) );
setPalette( palette );
- updateDrawingOrderChanged( mLegend->updateDrawingOrder() );
+ updateDrawingOrderChecked( mLegend->updateDrawingOrder() );
}
QgsLayerOrder::~QgsLayerOrder()
@@ -82,11 +82,12 @@ void QgsLayerOrder::refreshLayerList()
{
clear();
- foreach( QgsMapLayer *layer, mLegend->layers() )
+ foreach( QgsLegendLayer *layer, mLegend->legendLayers() )
{
- QListWidgetItem *item = new QListWidgetItem( layer->name() );
- item->setData( Qt::UserRole, qVariantFromValue( qobject_cast( layer ) ) );
- item->setCheckState( mLegend->layerCheckState( layer ) );
+ QListWidgetItem *item = new QListWidgetItem( layer->layer()->name() );
+ item->setData( 1, QString::number( layer->drawingOrder() ) );
+ item->setData( Qt::UserRole, qVariantFromValue( qobject_cast( layer->layer() ) ) );
+ item->setCheckState( layer->isVisible() ? Qt::Checked : Qt::Unchecked );
QgsDebugMsg( QString( "add item=%1 at %2" ).arg( item ? item->text() : "(null item)" ).arg( count() ) );
addItem( item );
}
@@ -189,16 +190,19 @@ void QgsLayerOrder::mouseMoveEvent( QMouseEvent * e )
{
mInsertRow = row( rowItem );
QgsDebugMsg( QString( "Move to row %1" ).arg( mInsertRow ) );
+ scrollToItem( rowItem );
}
else if ( e->pos().y() < visualItemRect( item( 0 ) ).bottom() )
{
mInsertRow = 0;
QgsDebugMsg( QString( "Insert top row %1" ).arg( mInsertRow ) );
+ scrollToTop();
}
else
{
mInsertRow = count();
QgsDebugMsg( QString( "Append bottom row %1" ).arg( mInsertRow ) );
+ scrollToBottom();
}
int y;
@@ -269,7 +273,7 @@ void QgsLayerOrder::hideLine()
mInsertionLine->setGeometry( 0, -100, 1, 1 );
}
-void QgsLayerOrder::updateDrawingOrderChanged( bool enabled )
+void QgsLayerOrder::updateDrawingOrderChecked( bool enabled )
{
setDisabled( enabled );
}
diff --git a/src/app/legend/qgslayerorder.h b/src/app/legend/qgslayerorder.h
index 4f98ff6b02ae..fc5cab6910c3 100644
--- a/src/app/legend/qgslayerorder.h
+++ b/src/app/legend/qgslayerorder.h
@@ -46,7 +46,7 @@ class QgsLayerOrder : public QListWidget
void mouseReleaseEvent( QMouseEvent * e );
private slots:
- void updateDrawingOrderChanged( bool );
+ void updateDrawingOrderChecked( bool );
void itemChanged( QListWidgetItem * );
void legendItemChanged( QTreeWidgetItem *, int );
void refreshLayerList();
diff --git a/src/app/legend/qgslegend.cpp b/src/app/legend/qgslegend.cpp
index 04d27c43760f..a7d4cbebe235 100644
--- a/src/app/legend/qgslegend.cpp
+++ b/src/app/legend/qgslegend.cpp
@@ -1403,7 +1403,8 @@ bool QgsLegend::readXML( QDomNode& legendnode )
clear(); //remove all items first
mEmbeddedGroups.clear();
mUpdateDrawingOrder = legendnode.toElement().attribute( "updateDrawingOrder", "true" ) == "true";
- emit updateDrawingOrderChanged( mUpdateDrawingOrder );
+ emit updateDrawingOrderChecked( mUpdateDrawingOrder );
+ emit updateDrawingOrderUnchecked( !mUpdateDrawingOrder );
return readXML( 0, legendnode );
}
@@ -2356,7 +2357,8 @@ void QgsLegend::setUpdateDrawingOrder( bool updateDrawingOrder )
updateMapCanvasLayerSet();
- emit updateDrawingOrderChanged( mUpdateDrawingOrder );
+ emit updateDrawingOrderChecked( mUpdateDrawingOrder );
+ emit updateDrawingOrderUnchecked( !mUpdateDrawingOrder );
}
bool QgsLegend::updateDrawingOrder()
diff --git a/src/app/legend/qgslegend.h b/src/app/legend/qgslegend.h
index ab2dae49e9d0..48d74a6b7329 100644
--- a/src/app/legend/qgslegend.h
+++ b/src/app/legend/qgslegend.h
@@ -116,6 +116,9 @@ class QgsLegend : public QTreeWidget
Else, an empty list is returned.*/
QList layers();
+ //!Return all layers in drawing order
+ QList legendLayers();
+
void setDrawingOrder( QList );
/*!set the current layer
@@ -307,6 +310,9 @@ class QgsLegend : public QTreeWidget
/** Update drawing order */
void setUpdateDrawingOrder( bool updateDrawingOrder );
+ /** Update drawing order */
+ void unsetUpdateDrawingOrder( bool dontUpdateDrawingOrder ) { setUpdateDrawingOrder( !dontUpdateDrawingOrder ); }
+
protected:
/*!Event handler for mouse movements.
@@ -432,7 +438,6 @@ class QgsLegend : public QTreeWidget
bool writeXML( QList items, QDomNode &node, QDomDocument &document );
QList canvasLayers();
- QList legendLayers();
/*! Prevent the copying of QgsLegends
* @todo See if this is really required - we may want multiple map, canvas and
@@ -511,7 +516,8 @@ class QgsLegend : public QTreeWidget
void zOrderChanged();
- void updateDrawingOrderChanged( bool );
+ void updateDrawingOrderChecked( bool );
+ void updateDrawingOrderUnchecked( bool );
//! Emitted whenever current (selected) layer changes
// the pointer to layer can be null if no layer is selected
diff --git a/src/app/qgisapp.cpp b/src/app/qgisapp.cpp
index a771b9393cc5..d99c3d0e2743 100644
--- a/src/app/qgisapp.cpp
+++ b/src/app/qgisapp.cpp
@@ -1716,19 +1716,45 @@ void QgisApp::initLegend()
mLegendDock = new QDockWidget( tr( "Layers" ), this );
mLegendDock->setObjectName( "Legend" );
mLegendDock->setAllowedAreas( Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea );
- mLegendDock->setWidget( mMapLegend );
+
+ QCheckBox *legendCb = new QCheckBox( tr( "Control rendering order" ) );
+ legendCb->setChecked( true );
+
+ QCheckBox *orderCb = new QCheckBox( tr( "Control rendering order" ) );
+ orderCb->setChecked( false );
+
+ connect( legendCb, SIGNAL( toggled( bool ) ), mMapLegend, SLOT( setUpdateDrawingOrder( bool ) ) );
+ connect( orderCb, SIGNAL( toggled( bool ) ), mMapLegend, SLOT( unsetUpdateDrawingOrder( bool ) ) );
+ connect( mMapLegend, SIGNAL( updateDrawingOrderChecked( bool ) ), legendCb, SLOT( setChecked( bool ) ) );
+ connect( mMapLegend, SIGNAL( updateDrawingOrderUnchecked( bool ) ), orderCb, SLOT( setChecked( bool ) ) );
+
+ QWidget *w = new QWidget( this );
+ QLayout *l = new QVBoxLayout;
+ l->addWidget( mMapLegend );
+ l->addWidget( legendCb );
+ w->setLayout( l );
+ mLegendDock->setWidget( w );
addDockWidget( Qt::LeftDockWidgetArea, mLegendDock );
// add to the Panel submenu
mPanelMenu->addAction( mLegendDock->toggleViewAction() );
mMapLayerOrder->setWhatsThis( tr( "Map layer list that displays all layers in drawing order." ) );
- mLayerOrderDock = new QDockWidget( tr( "Layerorder" ), this );
+ mLayerOrderDock = new QDockWidget( tr( "Layer order" ), this );
mLayerOrderDock->setObjectName( "Legend" );
mLayerOrderDock->setAllowedAreas( Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea );
- mLayerOrderDock->setWidget( mMapLayerOrder );
+
+ w = new QWidget( this );
+ l = new QVBoxLayout;
+ l->addWidget( mMapLayerOrder );
+ l->addWidget( orderCb );
+ w->setLayout( l );
+ mLayerOrderDock->setWidget( w );
addDockWidget( Qt::LeftDockWidgetArea, mLayerOrderDock );
+ // add to the Panel submenu
+ mPanelMenu->addAction( mLayerOrderDock->toggleViewAction() );
+
return;
}
diff --git a/src/core/composer/qgscomposerscalebar.cpp b/src/core/composer/qgscomposerscalebar.cpp
index e7da3c77b44f..e9c2ee0b1ce4 100644
--- a/src/core/composer/qgscomposerscalebar.cpp
+++ b/src/core/composer/qgscomposerscalebar.cpp
@@ -28,7 +28,8 @@
#include
#include
-QgsComposerScaleBar::QgsComposerScaleBar( QgsComposition* composition ): QgsComposerItem( composition ), mComposerMap( 0 ), mStyle( 0 ), mSegmentMillimeters( 0.0 )
+QgsComposerScaleBar::QgsComposerScaleBar( QgsComposition* composition ): QgsComposerItem( composition ), mComposerMap( 0 ), mStyle( 0 ),
+ mSegmentMillimeters( 0.0 ), mAlignment( Left )
{
applyDefaultSettings();
applyDefaultSize();
@@ -65,10 +66,57 @@ void QgsComposerScaleBar::paint( QPainter* painter, const QStyleOptionGraphicsIt
}
}
+void QgsComposerScaleBar::setNumSegments( int nSegments )
+{
+ if ( !mStyle )
+ {
+ mNumSegments = nSegments;
+ return;
+ }
+ double width = mStyle->calculateBoxSize().width();
+ mNumSegments = nSegments;
+ double widthAfter = mStyle->calculateBoxSize().width();
+ correctXPositionAlignment( width, widthAfter );
+}
+
void QgsComposerScaleBar::setNumUnitsPerSegment( double units )
{
+ if ( !mStyle )
+ {
+ mNumUnitsPerSegment = units;
+ return;
+ }
+ double width = mStyle->calculateBoxSize().width();
mNumUnitsPerSegment = units;
refreshSegmentMillimeters();
+ double widthAfter = mStyle->calculateBoxSize().width();
+ correctXPositionAlignment( width, widthAfter );
+}
+
+void QgsComposerScaleBar::setNumSegmentsLeft( int nSegmentsLeft )
+{
+ if ( !mStyle )
+ {
+ mNumSegmentsLeft = nSegmentsLeft;
+ return;
+ }
+ double width = mStyle->calculateBoxSize().width();
+ mNumSegmentsLeft = nSegmentsLeft;
+ double widthAfter = mStyle->calculateBoxSize().width();
+ correctXPositionAlignment( width, widthAfter );
+}
+
+void QgsComposerScaleBar::setBoxContentSpace( double space )
+{
+ if ( !mStyle )
+ {
+ mBoxContentSpace = space;
+ return;
+ }
+ double width = mStyle->calculateBoxSize().width();
+ mBoxContentSpace = space;
+ double widthAfter = mStyle->calculateBoxSize().width();
+ correctXPositionAlignment( width, widthAfter );
}
void QgsComposerScaleBar::setComposerMap( const QgsComposerMap* map )
@@ -172,7 +220,14 @@ void QgsComposerScaleBar::update()
void QgsComposerScaleBar::updateSegmentSize()
{
+ if ( !mStyle )
+ {
+ return;
+ }
+ double width = mStyle->calculateBoxSize().width();
refreshSegmentMillimeters();
+ double widthAfter = mStyle->calculateBoxSize().width();
+ correctXPositionAlignment( width, widthAfter );
update();
}
@@ -309,6 +364,9 @@ bool QgsComposerScaleBar::writeXML( QDomElement& elem, QDomDocument & doc ) cons
colorElem.setAttribute( "blue", brushColor.blue() );
composerScaleBarElem.appendChild( colorElem );
+ //alignment
+ composerScaleBarElem.setAttribute( "alignment", QString::number(( int ) mAlignment ) );
+
elem.appendChild( composerScaleBarElem );
return _writeXML( composerScaleBarElem, doc );
}
@@ -357,6 +415,9 @@ bool QgsComposerScaleBar::readXML( const QDomElement& itemElem, const QDomDocume
refreshSegmentMillimeters();
+ //alignment
+ mAlignment = ( Alignment )( itemElem.attribute( "alignment", "0" ).toInt() );
+
//restore general composer item properties
QDomNodeList composerItemList = itemElem.elementsByTagName( "ComposerItem" );
if ( composerItemList.size() > 0 )
@@ -368,4 +429,16 @@ bool QgsComposerScaleBar::readXML( const QDomElement& itemElem, const QDomDocume
return true;
}
+void QgsComposerScaleBar::correctXPositionAlignment( double width, double widthAfter )
+{
+ if ( mAlignment == Middle )
+ {
+ move( -( widthAfter - width ) / 2.0, 0 );
+ }
+ else if ( mAlignment == Right )
+ {
+ move( -( widthAfter - width ), 0 );
+ }
+}
+
diff --git a/src/core/composer/qgscomposerscalebar.h b/src/core/composer/qgscomposerscalebar.h
index 987889346075..6afca3859a94 100644
--- a/src/core/composer/qgscomposerscalebar.h
+++ b/src/core/composer/qgscomposerscalebar.h
@@ -32,6 +32,14 @@ class CORE_EXPORT QgsComposerScaleBar: public QgsComposerItem
public:
+ /**Added in version 1.8*/
+ enum Alignment
+ {
+ Left = 0,
+ Middle,
+ Right
+ };
+
QgsComposerScaleBar( QgsComposition* composition );
~QgsComposerScaleBar();
@@ -43,10 +51,10 @@ class CORE_EXPORT QgsComposerScaleBar: public QgsComposerItem
//getters and setters
int numSegments() const {return mNumSegments;}
- void setNumSegments( int nSegments ) {mNumSegments = nSegments;}
+ void setNumSegments( int nSegments );
int numSegmentsLeft() const {return mNumSegmentsLeft;}
- void setNumSegmentsLeft( int nSegmentsLeft ) {mNumSegmentsLeft = nSegmentsLeft;}
+ void setNumSegmentsLeft( int nSegmentsLeft );
double numUnitsPerSegment() const {return mNumUnitsPerSegment;}
void setNumUnitsPerSegment( double units );
@@ -77,10 +85,17 @@ class CORE_EXPORT QgsComposerScaleBar: public QgsComposerItem
void setLabelBarSpace( double space ) {mLabelBarSpace = space;}
double boxContentSpace() const {return mBoxContentSpace;}
- void setBoxContentSpace( double space ) {mBoxContentSpace = space;}
+ void setBoxContentSpace( double space );
double segmentMillimeters() const {return mSegmentMillimeters;}
+ /**Left / Middle/ Right
+ @note: this method was added in version 1.8*/
+ Alignment alignment() const { return mAlignment; }
+
+ /**@note: this method was added in version 1.8*/
+ void setAlignment( Alignment a ) { mAlignment = a; }
+
/**Apply default settings*/
void applyDefaultSettings();
/**Apply default size (scale bar 1/5 of map item width)
@@ -119,6 +134,9 @@ class CORE_EXPORT QgsComposerScaleBar: public QgsComposerItem
*/
bool readXML( const QDomElement& itemElem, const QDomDocument& doc );
+ /**Moves scalebar position to the left / right depending on alignment and change in item width*/
+ void correctXPositionAlignment( double width, double widthAfter );
+
public slots:
void updateSegmentSize();
/**Sets mCompositionMap to 0 if the map is deleted*/
@@ -159,6 +177,8 @@ class CORE_EXPORT QgsComposerScaleBar: public QgsComposerItem
/**Width of a segment (in mm)*/
double mSegmentMillimeters;
+ Alignment mAlignment;
+
/**Calculates with of a segment in mm and stores it in mSegmentMillimeters*/
void refreshSegmentMillimeters();
};
diff --git a/src/core/composer/qgsnumericscalebarstyle.cpp b/src/core/composer/qgsnumericscalebarstyle.cpp
index 71b1119974ee..0c545eee43de 100644
--- a/src/core/composer/qgsnumericscalebarstyle.cpp
+++ b/src/core/composer/qgsnumericscalebarstyle.cpp
@@ -20,12 +20,12 @@
#include
#include
-QgsNumericScaleBarStyle::QgsNumericScaleBarStyle( QgsComposerScaleBar* bar ): QgsScaleBarStyle( bar )
+QgsNumericScaleBarStyle::QgsNumericScaleBarStyle( QgsComposerScaleBar* bar ): QgsScaleBarStyle( bar ), mLastScaleBarWidth( 0 )
{
}
-QgsNumericScaleBarStyle::QgsNumericScaleBarStyle(): QgsScaleBarStyle( 0 )
+QgsNumericScaleBarStyle::QgsNumericScaleBarStyle(): QgsScaleBarStyle( 0 ), mLastScaleBarWidth( 0 )
{
}
@@ -67,9 +67,17 @@ QRectF QgsNumericScaleBarStyle::calculateBoxSize() const
double textWidth = mScaleBar->textWidthMillimeters( mScaleBar->font(), scaleText() );
double textHeight = mScaleBar->fontAscentMillimeters( mScaleBar->font() );
- return QRectF( mScaleBar->transform().dx(), mScaleBar->transform().dy(), 2 * mScaleBar->boxContentSpace()
+ rect = QRectF( mScaleBar->transform().dx(), mScaleBar->transform().dy(), 2 * mScaleBar->boxContentSpace()
+ 2 * mScaleBar->pen().width() + textWidth,
textHeight + 2 * mScaleBar->boxContentSpace() );
+
+ if ( mLastScaleBarWidth != rect.width() && mLastScaleBarWidth > 0 && rect.width() > 0 )
+ {
+ //hack to move scale bar the the left / right in order to keep the bar alignment
+ const_cast( mScaleBar )->correctXPositionAlignment( mLastScaleBarWidth, rect.width() );
+ }
+ mLastScaleBarWidth = rect.width();
+ return rect;
}
QString QgsNumericScaleBarStyle::scaleText() const
@@ -78,12 +86,14 @@ QString QgsNumericScaleBarStyle::scaleText() const
if ( mScaleBar )
{
//find out scale
+ double scaleDenominator = 1;
const QgsComposerMap* composerMap = mScaleBar->composerMap();
if ( composerMap )
{
- double scaleDenominator = composerMap->scale();
+ scaleDenominator = composerMap->scale();
scaleBarText = "1:" + QString::number( scaleDenominator, 'f', 0 );
}
+ scaleBarText = "1:" + QString::number( scaleDenominator, 'f', 0 );
}
return scaleBarText;
}
diff --git a/src/core/composer/qgsnumericscalebarstyle.h b/src/core/composer/qgsnumericscalebarstyle.h
index 4fe5d296357d..923a921dd5b1 100644
--- a/src/core/composer/qgsnumericscalebarstyle.h
+++ b/src/core/composer/qgsnumericscalebarstyle.h
@@ -39,6 +39,9 @@ class CORE_EXPORT QgsNumericScaleBarStyle: public QgsScaleBarStyle
QgsNumericScaleBarStyle(); //forbidden
/**Returns the text for the scale bar or an empty string in case of error*/
QString scaleText() const;
+
+ /**Store last width (in mm) to keep alignement to left/middle/right side*/
+ mutable double mLastScaleBarWidth;
};
#endif
diff --git a/src/core/qgsdatasourceuri.cpp b/src/core/qgsdatasourceuri.cpp
index 2761a368adfc..12261d3e0057 100644
--- a/src/core/qgsdatasourceuri.cpp
+++ b/src/core/qgsdatasourceuri.cpp
@@ -22,12 +22,20 @@
#include
#include
-QgsDataSourceURI::QgsDataSourceURI() : mSSLmode( SSLprefer ), mKeyColumn( "" ), mUseEstimatedMetadata( false )
+QgsDataSourceURI::QgsDataSourceURI()
+ : mSSLmode( SSLprefer )
+ , mKeyColumn( "" )
+ , mUseEstimatedMetadata( false )
+ , mSelectAtIdDisabled( false )
{
// do nothing
}
-QgsDataSourceURI::QgsDataSourceURI( QString uri ) : mSSLmode( SSLprefer ), mKeyColumn( "" ), mUseEstimatedMetadata( false )
+QgsDataSourceURI::QgsDataSourceURI( QString uri )
+ : mSSLmode( SSLprefer )
+ , mKeyColumn( "" )
+ , mUseEstimatedMetadata( false )
+ , mSelectAtIdDisabled( false )
{
int i = 0;
while ( i < uri.length() )
@@ -115,6 +123,10 @@ QgsDataSourceURI::QgsDataSourceURI( QString uri ) : mSSLmode( SSLprefer ), mKeyC
{
mUseEstimatedMetadata = pval == "true";
}
+ else if ( pname == "selectatid" )
+ {
+ mSelectAtIdDisabled = pval == "false";
+ }
else if ( pname == "service" )
{
mService = pval;
@@ -309,6 +321,16 @@ bool QgsDataSourceURI::useEstimatedMetadata() const
return mUseEstimatedMetadata;
}
+void QgsDataSourceURI::disableSelectAtId( bool theFlag )
+{
+ mSelectAtIdDisabled = theFlag;
+}
+
+bool QgsDataSourceURI::selectAtIdDisabled() const
+{
+ return mSelectAtIdDisabled;
+}
+
void QgsDataSourceURI::setSql( QString sql )
{
mSql = sql;
@@ -461,6 +483,11 @@ QString QgsDataSourceURI::uri() const
theUri += QString( " estimatedmetadata=true" );
}
+ if ( mSelectAtIdDisabled )
+ {
+ theUri += QString( " selectatid=false" );
+ }
+
theUri += QString( " table=%1%2 sql=%3" )
.arg( quotedTablename() )
.arg( mGeometryColumn.isNull() ? QString() : QString( " (%1)" ).arg( mGeometryColumn ) )
diff --git a/src/core/qgsdatasourceuri.h b/src/core/qgsdatasourceuri.h
index 121b5b184d59..5887d1a27ce6 100644
--- a/src/core/qgsdatasourceuri.h
+++ b/src/core/qgsdatasourceuri.h
@@ -97,6 +97,9 @@ class CORE_EXPORT QgsDataSourceURI
void setUseEstimatedMetadata( bool theFlag );
bool useEstimatedMetadata() const;
+ void disableSelectAtId( bool theFlag );
+ bool selectAtIdDisabled() const;
+
void clearSchema();
void setSql( QString sql );
@@ -147,6 +150,8 @@ class CORE_EXPORT QgsDataSourceURI
QString mKeyColumn;
//Use estimated metadata flag
bool mUseEstimatedMetadata;
+ //Disable SelectAtId capability (eg. to trigger the attribute table memory model for expensive views)
+ bool mSelectAtIdDisabled;
};
#endif //QGSDATASOURCEURI_H
diff --git a/src/core/qgsdbtablemodel.cpp b/src/core/qgsdbtablemodel.cpp
index 8a55d1c3d2fd..dbe30badb8b5 100644
--- a/src/core/qgsdbtablemodel.cpp
+++ b/src/core/qgsdbtablemodel.cpp
@@ -26,6 +26,7 @@ QgsDbTableModel::QgsDbTableModel(): QStandardItemModel(), mTableCount( 0 )
headerLabels << tr( "Type" );
headerLabels << tr( "Geometry column" );
headerLabels << tr( "Primary key column" );
+ headerLabels << tr( "Select at id" );
headerLabels << tr( "Sql" );
setHorizontalHeaderLabels( headerLabels );
}
@@ -60,17 +61,27 @@ void QgsDbTableModel::addTableEntry( QString type, QString schemaName, QString t
QIcon iconFile = iconForType( wkbType );
QList childItemList;
+
QStandardItem* schemaNameItem = new QStandardItem( schemaName );
schemaNameItem->setFlags( Qt::ItemIsEnabled | Qt::ItemIsSelectable );
+
QStandardItem* typeItem = new QStandardItem( QIcon( iconFile ), type );
typeItem->setFlags( Qt::ItemIsEnabled | Qt::ItemIsSelectable );
+
QStandardItem* tableItem = new QStandardItem( tableName );
tableItem->setFlags( Qt::ItemIsEnabled | Qt::ItemIsSelectable );
+
QStandardItem* geomItem = new QStandardItem( geometryColName );
geomItem->setFlags( Qt::ItemIsEnabled | Qt::ItemIsSelectable );
+
QStandardItem* pkItem = new QStandardItem( "" );
pkItem->setData( pkCols );
pkItem->setFlags( Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsEditable );
+
+ QStandardItem* selItem = new QStandardItem( "" );
+ selItem->setFlags( Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsUserCheckable );
+ selItem->setCheckState( Qt::Checked );
+
QStandardItem* sqlItem = new QStandardItem( sql );
sqlItem->setFlags( Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsEditable );
@@ -79,6 +90,7 @@ void QgsDbTableModel::addTableEntry( QString type, QString schemaName, QString t
childItemList.push_back( typeItem );
childItemList.push_back( geomItem );
childItemList.push_back( pkItem );
+ childItemList.push_back( selItem );
childItemList.push_back( sqlItem );
schemaItem->appendRow( childItemList );
diff --git a/src/core/qgsdbtablemodel.h b/src/core/qgsdbtablemodel.h
index 5c0370c63e46..801985c976e8 100644
--- a/src/core/qgsdbtablemodel.h
+++ b/src/core/qgsdbtablemodel.h
@@ -28,15 +28,19 @@ class CORE_EXPORT QgsDbTableModel : public QStandardItemModel
public:
QgsDbTableModel();
~QgsDbTableModel();
+
/**Adds entry for one database table to the model*/
void addTableEntry( QString type, QString schemaName, QString tableName, QString geometryColName, const QStringList &pkCols, QString Sql );
+
/**Sets an sql statement that belongs to a cell specified by a model index*/
void setSql( const QModelIndex& index, const QString& sql );
+
/**Sets one or more geometry types to a row. In case of several types, additional rows are inserted.
This is for tables where the type is dectected later by thread*/
void setGeometryTypesForTable( const QString& schema, const QString& table, const QString& attribute, const QString& type );
+
/**Returns the number of tables in the model*/
- int tableCount() const {return mTableCount;}
+ int tableCount() const { return mTableCount; }
enum columns
{
@@ -45,6 +49,7 @@ class CORE_EXPORT QgsDbTableModel : public QStandardItemModel
dbtmType,
dbtmGeomCol,
dbtmPkCol,
+ dbtmSelectAtId,
dbtmSql,
dbtmColumns
};
@@ -55,6 +60,7 @@ class CORE_EXPORT QgsDbTableModel : public QStandardItemModel
QIcon iconForType( QGis::WkbType type ) const;
QString displayStringForType( QGis::WkbType type ) const;
+
/**Returns qgis wkbtype from database typename*/
QGis::WkbType qgisTypeFromDbType( const QString& dbType ) const;
};
diff --git a/src/gui/attributetable/qgsattributetablememorymodel.cpp b/src/gui/attributetable/qgsattributetablememorymodel.cpp
index 957ae4f2db54..e4ebee69a46a 100644
--- a/src/gui/attributetable/qgsattributetablememorymodel.cpp
+++ b/src/gui/attributetable/qgsattributetablememorymodel.cpp
@@ -27,27 +27,59 @@
// In-Memory model //
/////////////////////
+QgsAttributeTableMemoryModel::QgsAttributeTableMemoryModel( QgsVectorLayer *theLayer )
+ : QgsAttributeTableModel( theLayer )
+{
+ QgsDebugMsg( "entered." );
+}
+
void QgsAttributeTableMemoryModel::loadLayer()
{
- QgsAttributeTableModel::loadLayer();
- mLayer->select( mLayer->pendingAllAttributesList(), QgsRectangle(), false );
+ QgsDebugMsg( "entered." );
+
+ QSettings settings;
+ int behaviour = settings.value( "/qgis/attributeTableBehaviour", 0 ).toInt();
+
+ QgsRectangle rect;
+ if ( behaviour == 2 )
+ {
+ // current canvas only
+ rect = mCurrentExtent;
+ }
+
+ mLayer->select( mLayer->pendingAllAttributesList(), rect, false );
- mFeatureMap.reserve( mLayer->pendingFeatureCount() + 50 );
+ if( behaviour != 1 )
+ mFeatureMap.reserve( mLayer->pendingFeatureCount() + 50 );
+ else
+ mFeatureMap.reserve( mLayer->selectedFeatureCount() );
+
+ int n = 0;
QgsFeature f;
while ( mLayer->nextFeature( f ) )
+ {
+ if( behaviour == 1 && !mLayer->selectedFeaturesIds().contains( f.id() ) )
+ continue;
+
+ mIdRowMap.insert( f.id(), n );
+ mRowIdMap.insert( n, f.id() );
mFeatureMap.insert( f.id(), f );
+ n++;
+ }
+
+ mFieldCount = mAttributes.size();
}
-QgsAttributeTableMemoryModel::QgsAttributeTableMemoryModel
-( QgsVectorLayer *theLayer )
- : QgsAttributeTableModel( theLayer )
+int QgsAttributeTableMemoryModel::rowCount( const QModelIndex &parent ) const
{
- loadLayer();
+ Q_UNUSED( parent );
+ return mFeatureMap.size();
}
-bool QgsAttributeTableMemoryModel::featureAtId( QgsFeatureId fid )
+bool QgsAttributeTableMemoryModel::featureAtId( QgsFeatureId fid ) const
{
+ QgsDebugMsg( QString( "entered featureAtId: %1." ).arg( fid ) );
if ( mFeatureMap.contains( fid ) )
{
mFeat = mFeatureMap[ fid ];
@@ -70,17 +102,14 @@ void QgsAttributeTableMemoryModel::featureDeleted( QgsFeatureId fid )
void QgsAttributeTableMemoryModel::featureAdded( QgsFeatureId fid )
{
QgsDebugMsg( "entered." );
- QgsFeature f;
- mLayer->featureAtId( fid, f, false, true );
- mFeatureMap.insert( fid, f );
- QgsAttributeTableModel::featureAdded( fid );
+ Q_UNUSED( fid );
+ loadLayer();
}
void QgsAttributeTableMemoryModel::layerDeleted()
{
QgsDebugMsg( "entered." );
- mFeatureMap.clear();
- QgsAttributeTableModel::layerDeleted();
+ loadLayer();
}
void QgsAttributeTableMemoryModel::attributeValueChanged( QgsFeatureId fid, int idx, const QVariant &value )
diff --git a/src/gui/attributetable/qgsattributetablememorymodel.h b/src/gui/attributetable/qgsattributetablememorymodel.h
index dbee7094c05a..1fd72f700f7b 100644
--- a/src/gui/attributetable/qgsattributetablememorymodel.h
+++ b/src/gui/attributetable/qgsattributetablememorymodel.h
@@ -30,7 +30,7 @@
class QgsAttributeTableMemoryModel : public QgsAttributeTableModel
{
- Q_OBJECT;
+ Q_OBJECT
public:
/**
@@ -39,6 +39,12 @@ class QgsAttributeTableMemoryModel : public QgsAttributeTableModel
*/
QgsAttributeTableMemoryModel( QgsVectorLayer *theLayer );
+ /**
+ * Returns the number of rows
+ * @param parent parent index
+ */
+ virtual int rowCount( const QModelIndex &parent = QModelIndex() ) const;
+
/**
* Remove rows
*/
@@ -75,7 +81,7 @@ class QgsAttributeTableMemoryModel : public QgsAttributeTableModel
* @param fid feature id
* @return feature exists
*/
- virtual bool featureAtId( QgsFeatureId fid );
+ virtual bool featureAtId( QgsFeatureId fid ) const;
/**
* Loads the layer into the model
diff --git a/src/gui/attributetable/qgsattributetablemodel.cpp b/src/gui/attributetable/qgsattributetablemodel.cpp
old mode 100755
new mode 100644
index 553e3bb3247d..098a408bfcdd
--- a/src/gui/attributetable/qgsattributetablemodel.cpp
+++ b/src/gui/attributetable/qgsattributetablemodel.cpp
@@ -32,6 +32,8 @@ QgsRectangle QgsAttributeTableModel::mCurrentExtent; // static member
QgsAttributeTableModel::QgsAttributeTableModel( QgsVectorLayer *theLayer, QObject *parent )
: QAbstractTableModel( parent )
{
+ QgsDebugMsg( "entered." );
+
mFeat.setFeatureId( std::numeric_limits::min() );
mFeatureMap.clear();
mFeatureQueue.clear();
@@ -44,8 +46,6 @@ QgsAttributeTableModel::QgsAttributeTableModel( QgsVectorLayer *theLayer, QObjec
connect( mLayer, SIGNAL( featureDeleted( QgsFeatureId ) ), this, SLOT( featureDeleted( QgsFeatureId ) ) );
connect( mLayer, SIGNAL( attributeAdded( int ) ), this, SLOT( attributeAdded( int ) ) );
connect( mLayer, SIGNAL( attributeDeleted( int ) ), this, SLOT( attributeDeleted( int ) ) );
-
- loadLayer();
}
bool QgsAttributeTableModel::featureAtId( QgsFeatureId fid ) const
diff --git a/src/gui/attributetable/qgsattributetablemodel.h b/src/gui/attributetable/qgsattributetablemodel.h
index 2f29d00f3eab..e4c33fec4567 100644
--- a/src/gui/attributetable/qgsattributetablemodel.h
+++ b/src/gui/attributetable/qgsattributetablemodel.h
@@ -38,18 +38,16 @@ class GUI_EXPORT QgsAttributeTableModel: public QAbstractTableModel
* @param parent parent pointer
*/
QgsAttributeTableModel( QgsVectorLayer *theLayer, QObject *parent = 0 );
-
/**
* Returns the number of rows
* @param parent parent index
*/
- int rowCount( const QModelIndex &parent = QModelIndex() ) const;
+ virtual int rowCount( const QModelIndex &parent = QModelIndex() ) const;
/**
* Returns the number of columns
* @param parent parent index
*/
int columnCount( const QModelIndex &parent = QModelIndex() ) const;
-
/**
* Returns header data
* @param section required section
@@ -214,15 +212,19 @@ class GUI_EXPORT QgsAttributeTableModel: public QAbstractTableModel
*/
void initIdMaps();
+ /**
+ * Gets mFieldCount, mAttributes and mValueMaps
+ */
+ virtual void loadAttributes();
+
+ public:
/**
* Loads the layer into the model
*/
virtual void loadLayer();
- /**
- * Gets mFieldCount, mAttributes and mValueMaps
- */
- virtual void loadAttributes();
+ private:
+ mutable QQueue mFeatureQueue;
/**
* load feature fid into mFeat
@@ -230,10 +232,6 @@ class GUI_EXPORT QgsAttributeTableModel: public QAbstractTableModel
* @return feature exists
*/
virtual bool featureAtId( QgsFeatureId fid ) const;
-
- private:
- mutable QQueue mFeatureQueue;
-
};
diff --git a/src/gui/attributetable/qgsattributetableview.cpp b/src/gui/attributetable/qgsattributetableview.cpp
index ed2299bfb2c4..7fdd6228bf36 100644
--- a/src/gui/attributetable/qgsattributetableview.cpp
+++ b/src/gui/attributetable/qgsattributetableview.cpp
@@ -23,9 +23,9 @@
#include "qgsattributetablememorymodel.h"
#include "qgsattributetabledelegate.h"
#include "qgsattributetablefiltermodel.h"
-
#include "qgsvectorlayer.h"
#include "qgsvectordataprovider.h"
+#include "qgslogger.h"
QgsAttributeTableView::QgsAttributeTableView( QWidget* parent )
: QTableView( parent ), mModel( 0 ), mFilterModel( 0 ), mActionPopup( 0 )
@@ -63,9 +63,17 @@ void QgsAttributeTableView::setLayer( QgsVectorLayer* layer )
// features in the current view. Otherwise we'll have to store
// everything in the memory because using featureAtId() would be too slow
if ( layer->dataProvider()->capabilities() & QgsVectorDataProvider::SelectAtId )
+ {
+ QgsDebugMsg( "SelectAtId supported" );
mModel = new QgsAttributeTableModel( layer );
+ }
else
+ {
+ QgsDebugMsg( "SelectAtId NOT supported" );
mModel = new QgsAttributeTableMemoryModel( layer );
+ }
+
+ mModel->loadLayer();
mFilterModel = new QgsAttributeTableFilterModel( layer );
mFilterModel->setSourceModel( mModel );
diff --git a/src/gui/qgscomposerview.cpp b/src/gui/qgscomposerview.cpp
index 05935cd741cf..2ff079d1e747 100644
--- a/src/gui/qgscomposerview.cpp
+++ b/src/gui/qgscomposerview.cpp
@@ -15,9 +15,12 @@
* *
***************************************************************************/
+#include
#include
#include
#include
+#include
+#include
#include "qgscomposerview.h"
#include "qgscomposerarrow.h"
@@ -394,40 +397,56 @@ void QgsComposerView::keyPressEvent( QKeyEvent * e )
QList composerItemList = composition()->selectedComposerItems();
QList::iterator itemIt = composerItemList.begin();
- //delete selected items
- if ( e->key() == Qt::Key_Delete || e->key() == Qt::Key_Backspace )
+ if ( e->matches( QKeySequence::Copy ) || e->matches( QKeySequence::Cut ) )
{
+ QDomDocument doc;
+ QDomElement documentElement = doc.createElement( "ComposerItemClipboard" );
for ( ; itemIt != composerItemList.end(); ++itemIt )
{
- QgsComposerMap* map = dynamic_cast( *itemIt );
- if ( !map || !map->isDrawing() ) //don't delete a composer map while it draws
+ // copy each item in a group
+ QgsComposerItemGroup* itemGroup = dynamic_cast( *itemIt );
+ if ( itemGroup && composition() )
{
- composition()->removeItem( *itemIt );
- QgsComposerItemGroup* itemGroup = dynamic_cast( *itemIt );
- if ( itemGroup && composition() )
- {
- //add add/remove item command for every item in the group
- QUndoCommand* parentCommand = new QUndoCommand( tr( "Remove item group" ) );
-
- QSet groupedItems = itemGroup->items();
- QSet::iterator it = groupedItems.begin();
- for ( ; it != groupedItems.end(); ++it )
- {
- QgsAddRemoveItemCommand* subcommand = new QgsAddRemoveItemCommand( QgsAddRemoveItemCommand::Removed, *it, composition(), "", parentCommand );
- connectAddRemoveCommandSignals( subcommand );
- emit itemRemoved( *it );
- }
-
- composition()->undoStack()->push( parentCommand );
- delete itemGroup;
- emit itemRemoved( itemGroup );
- }
- else
+ QSet groupedItems = itemGroup->items();
+ QSet::iterator it = groupedItems.begin();
+ for ( ; it != groupedItems.end(); ++it )
{
- emit itemRemoved( *itemIt );
- pushAddRemoveCommand( *itemIt, tr( "Item deleted" ), QgsAddRemoveItemCommand::Removed );
+ ( *it )->writeXML( documentElement, doc );
}
}
+ ( *itemIt )->writeXML( documentElement, doc );
+ if ( e->matches( QKeySequence::Cut ) )
+ {
+ removeItem( *itemIt );
+ }
+ }
+ doc.appendChild( documentElement );
+ QMimeData *mimeData = new QMimeData;
+ mimeData->setData( "text/xml", doc.toByteArray() );
+ QClipboard *clipboard = QApplication::clipboard();
+ clipboard->setMimeData( mimeData );
+ }
+
+ if ( e->matches( QKeySequence::Paste ) )
+ {
+ QDomDocument doc;
+ QClipboard *clipboard = QApplication::clipboard();
+ if ( doc.setContent( clipboard->mimeData()->data( "text/xml" ) ) )
+ {
+ QDomElement docElem = doc.documentElement();
+ if ( docElem.tagName() == "ComposerItemClipboard" )
+ {
+ addItemsfromXML( docElem, doc );
+ }
+ }
+ }
+
+ //delete selected items
+ if ( e->key() == Qt::Key_Delete || e->key() == Qt::Key_Backspace )
+ {
+ for ( ; itemIt != composerItemList.end(); ++itemIt )
+ {
+ removeItem( *itemIt );
}
}
@@ -626,6 +645,133 @@ void QgsComposerView::addComposerTable( QgsComposerAttributeTable* table )
pushAddRemoveCommand( table, tr( "Table added" ) );
}
+void QgsComposerView::removeItem( QgsComposerItem* item )
+{
+ QgsComposerMap* map = dynamic_cast( item );
+ if ( !map || !map->isDrawing() ) //don't delete a composer map while it draws
+ {
+ composition()->removeItem( item );
+ QgsComposerItemGroup* itemGroup = dynamic_cast( item );
+ if ( itemGroup && composition() )
+ {
+ //add add/remove item command for every item in the group
+ QUndoCommand* parentCommand = new QUndoCommand( tr( "Remove item group" ) );
+
+ QSet groupedItems = itemGroup->items();
+ QSet::iterator it = groupedItems.begin();
+ for ( ; it != groupedItems.end(); ++it )
+ {
+ QgsAddRemoveItemCommand* subcommand = new QgsAddRemoveItemCommand( QgsAddRemoveItemCommand::Removed, *it, composition(), "", parentCommand );
+ connectAddRemoveCommandSignals( subcommand );
+ emit itemRemoved( *it );
+ }
+
+ composition()->undoStack()->push( parentCommand );
+ delete itemGroup;
+ emit itemRemoved( itemGroup );
+ }
+ else
+ {
+ emit itemRemoved( item );
+ pushAddRemoveCommand( item, tr( "Item deleted" ), QgsAddRemoveItemCommand::Removed );
+ }
+ }
+}
+
+void QgsComposerView::addItemsfromXML( const QDomElement& docElem, const QDomDocument& doc )
+{
+ QPointF scenePoint = mapToScene( mapFromGlobal( QCursor::pos() ) );
+
+ // label
+ QDomNodeList composerLabelList = docElem.elementsByTagName( "ComposerLabel" );
+ for ( int i = 0; i < composerLabelList.size(); ++i )
+ {
+ QDomElement currentComposerLabelElem = composerLabelList.at( i ).toElement();
+ QgsComposerLabel* newLabel = new QgsComposerLabel( composition() );
+ newLabel->readXML( currentComposerLabelElem, doc );
+ newLabel->setItemPosition( scenePoint.x(), scenePoint.y() );
+ addComposerLabel( newLabel );
+ emit actionFinished();
+ }
+ // map
+ QDomNodeList composerMapList = docElem.elementsByTagName( "ComposerMap" );
+ for ( int i = 0; i < composerMapList.size(); ++i )
+ {
+ QDomElement currentComposerMapElem = composerMapList.at( i ).toElement();
+ QgsComposerMap* newMap = new QgsComposerMap( composition() );
+ newMap->readXML( currentComposerMapElem, doc );
+ newMap->setItemPosition( scenePoint.x(), scenePoint.y() );
+ addComposerMap( newMap );
+ emit actionFinished();
+ }
+ // arrow
+ QDomNodeList composerArrowList = docElem.elementsByTagName( "ComposerArrow" );
+ for ( int i = 0; i < composerArrowList.size(); ++i )
+ {
+ QDomElement currentComposerArrowElem = composerArrowList.at( i ).toElement();
+ QgsComposerArrow* newArrow = new QgsComposerArrow( composition() );
+ newArrow->readXML( currentComposerArrowElem, doc );
+ newArrow->setItemPosition( scenePoint.x(), scenePoint.y() );
+ addComposerArrow( newArrow );
+ emit actionFinished();
+ }
+ // scalebar
+ QDomNodeList composerScaleBarList = docElem.elementsByTagName( "ComposerScaleBar" );
+ for ( int i = 0; i < composerScaleBarList.size(); ++i )
+ {
+ QDomElement currentComposerScaleBarElem = composerScaleBarList.at( i ).toElement();
+ QgsComposerScaleBar* newScaleBar = new QgsComposerScaleBar( composition() );
+ newScaleBar->readXML( currentComposerScaleBarElem, doc );
+ newScaleBar->setItemPosition( scenePoint.x(), scenePoint.y() );
+ addComposerScaleBar( newScaleBar );
+ emit actionFinished();
+ }
+ // shape
+ QDomNodeList composerShapeList = docElem.elementsByTagName( "ComposerShape" );
+ for ( int i = 0; i < composerShapeList.size(); ++i )
+ {
+ QDomElement currentComposerShapeElem = composerShapeList.at( i ).toElement();
+ QgsComposerShape* newShape = new QgsComposerShape( composition() );
+ newShape->readXML( currentComposerShapeElem, doc );
+ newShape->setItemPosition( scenePoint.x(), scenePoint.y() );
+ addComposerShape( newShape );
+ emit actionFinished();
+ }
+ // picture
+ QDomNodeList composerPictureList = docElem.elementsByTagName( "ComposerPicture" );
+ for ( int i = 0; i < composerPictureList.size(); ++i )
+ {
+ QDomElement currentComposerPictureElem = composerPictureList.at( i ).toElement();
+ QgsComposerPicture* newPicture = new QgsComposerPicture( composition() );
+ newPicture->readXML( currentComposerPictureElem, doc );
+ newPicture->setItemPosition( scenePoint.x(), scenePoint.y() );
+ addComposerPicture( newPicture );
+ emit actionFinished();
+ }
+ // legend
+ QDomNodeList composerLegendList = docElem.elementsByTagName( "ComposerLegend" );
+ for ( int i = 0; i < composerLegendList.size(); ++i )
+ {
+ QDomElement currentComposerLegendElem = composerLegendList.at( i ).toElement();
+ QgsComposerLegend* newLegend = new QgsComposerLegend( composition() );
+ newLegend->readXML( currentComposerLegendElem, doc );
+ newLegend->setItemPosition( scenePoint.x(), scenePoint.y() );
+ addComposerLegend( newLegend );
+ emit actionFinished();
+ }
+ // table
+ QDomNodeList composerTableList = docElem.elementsByTagName( "ComposerAttributeTable" );
+ for ( int i = 0; i < composerTableList.size(); ++i )
+ {
+ QDomElement currentComposerTableElem = composerTableList.at( i ).toElement();
+ QgsComposerAttributeTable* newTable = new QgsComposerAttributeTable( composition() );
+ newTable->readXML( currentComposerTableElem, doc );
+ newTable->setItemPosition( scenePoint.x(), scenePoint.y() );
+ addComposerTable( newTable );
+ emit actionFinished();
+ }
+}
+
void QgsComposerView::groupItems()
{
if ( !composition() )
diff --git a/src/gui/qgscomposerview.h b/src/gui/qgscomposerview.h
index 80fad5726d81..4ab9884a9f94 100644
--- a/src/gui/qgscomposerview.h
+++ b/src/gui/qgscomposerview.h
@@ -20,6 +20,8 @@
#include
#include "qgsaddremoveitemcommand.h"
+class QDomDocument;
+class QDomElement;
class QKeyEvent;
class QMainWindow;
class QMouseEvent;
@@ -95,6 +97,12 @@ class GUI_EXPORT QgsComposerView: public QGraphicsView
/**Adds a composer table to the graphics scene and advices composer to create a widget for it (through signal)*/
void addComposerTable( QgsComposerAttributeTable* table );
+ /**Remove item from the graphics scene*/
+ void removeItem( QgsComposerItem* item );
+
+ /**Add items from XML representation to the graphics scene (for pasting items from clipboard)*/
+ void addItemsfromXML( const QDomElement& docElem, const QDomDocument& doc );
+
/**Returns the composer main window*/
QMainWindow* composerWindow();
diff --git a/src/providers/postgres/qgspgsourceselect.cpp b/src/providers/postgres/qgspgsourceselect.cpp
index 6eedf6116105..c3f5c931bf69 100644
--- a/src/providers/postgres/qgspgsourceselect.cpp
+++ b/src/providers/postgres/qgspgsourceselect.cpp
@@ -353,6 +353,7 @@ QString QgsPgSourceSelect::layerURI( const QModelIndex &index )
QString tableName = mTableModel.itemFromIndex( index.sibling( index.row(), QgsDbTableModel::dbtmTable ) )->text();
QString geomColumnName = mTableModel.itemFromIndex( index.sibling( index.row(), QgsDbTableModel::dbtmGeomCol ) )->text();
QString pkColumnName = mTableModel.itemFromIndex( index.sibling( index.row(), QgsDbTableModel::dbtmPkCol ) )->text();
+ bool selectAtId = mTableModel.itemFromIndex( index.sibling( index.row(), QgsDbTableModel::dbtmSelectAtId ) )->checkState() == Qt::Checked;
QString sql = mTableModel.itemFromIndex( index.sibling( index.row(), QgsDbTableModel::dbtmSql ) )->text();
if ( geomColumnName.contains( " AS " ) )
@@ -389,6 +390,7 @@ QString QgsPgSourceSelect::layerURI( const QModelIndex &index )
QgsDataSourceURI uri( m_connInfo );
uri.setDataSource( schemaName, tableName, geomColumnName, sql, pkColumnName );
uri.setUseEstimatedMetadata( mUseEstimatedMetadata );
+ uri.disableSelectAtId( !selectAtId );
return uri.uri();
}
diff --git a/src/providers/postgres/qgspgsourceselect.h b/src/providers/postgres/qgspgsourceselect.h
index 3a9be99888e5..ca9277b6eec7 100644
--- a/src/providers/postgres/qgspgsourceselect.h
+++ b/src/providers/postgres/qgspgsourceselect.h
@@ -151,8 +151,7 @@ class QgsPgSourceSelect : public QDialog, private Ui::QgsDbSourceSelectBase
void setSql( const QModelIndex& index );
//! Store the selected database
void on_cmbConnections_activated( int );
- void setLayerType( QString schema, QString table, QString column,
- QString type );
+ void setLayerType( QString schema, QString table, QString column, QString type );
void on_mTablesTreeView_clicked( const QModelIndex &index );
void on_mTablesTreeView_doubleClicked( const QModelIndex &index );
//!Sets a new regular expression to the model
diff --git a/src/providers/postgres/qgspostgresprovider.cpp b/src/providers/postgres/qgspostgresprovider.cpp
index 7418955ed281..17884da4a066 100644
--- a/src/providers/postgres/qgspostgresprovider.cpp
+++ b/src/providers/postgres/qgspostgresprovider.cpp
@@ -422,6 +422,7 @@ QgsPostgresProvider::QgsPostgresProvider( QString const & uri )
, geomType( QGis::WKBUnknown )
, mFeatureQueueSize( 200 )
, mUseEstimatedMetadata( false )
+ , mSelectAtIdDisabled( false )
, mPrimaryKeyDefault( QString::null )
{
// assume this is a valid layer until we determine otherwise
@@ -463,6 +464,7 @@ QgsPostgresProvider::QgsPostgresProvider( QString const & uri )
primaryKey = mUri.keyColumn();
mUseEstimatedMetadata = mUri.useEstimatedMetadata();
+ mSelectAtIdDisabled = mUri.selectAtIdDisabled();
QgsDebugMsg( "Connection info is " + mUri.connectionInfo() );
QgsDebugMsg( "Geometry column is: " + geometryColumn );
@@ -1327,20 +1329,18 @@ void QgsPostgresProvider::select( QgsAttributeList fetchAttributes, QgsRectangle
if ( whereClause.isEmpty() )
{
QString qBox = QString( "%1('BOX3D(%2)'::box3d,%3)" )
- .arg( connectionRO->majorVersion() < 2 ? "setsrid"
- : "st_setsrid" )
- .arg( rect.asWktCoordinates() )
- .arg( srid );
+ .arg( connectionRO->majorVersion() < 2 ? "setsrid" : "st_setsrid" )
+ .arg( rect.asWktCoordinates() )
+ .arg( srid );
whereClause = QString( "%1 && %2" )
- .arg( quotedIdentifier( geometryColumn ) )
- .arg( qBox );
+ .arg( quotedIdentifier( geometryColumn ) )
+ .arg( qBox );
if ( useIntersect )
{
- whereClause += QString( " and %1(%2,%3))" )
- .arg( connectionRO->majorVersion() < 2 ? "intersects"
- : "st_intersects" )
- .arg( quotedIdentifier( geometryColumn ) )
- .arg( qBox );
+ whereClause += QString( " and %1(%2,%3)" )
+ .arg( connectionRO->majorVersion() < 2 ? "intersects" : "st_intersects" )
+ .arg( quotedIdentifier( geometryColumn ) )
+ .arg( qBox );
}
}
}
@@ -1836,7 +1836,10 @@ bool QgsPostgresProvider::hasSufficientPermsAndCapabilities()
// postgres has fast access to features at id (thanks to primary key / unique index)
// the latter flag is here just for compatibility
- enabledCapabilities = QgsVectorDataProvider::SelectAtId | QgsVectorDataProvider::SelectGeometryAtId;
+ if ( !mSelectAtIdDisabled )
+ {
+ enabledCapabilities = QgsVectorDataProvider::SelectAtId | QgsVectorDataProvider::SelectGeometryAtId;
+ }
if ( !inRecovery )
{
@@ -1965,7 +1968,10 @@ bool QgsPostgresProvider::hasSufficientPermsAndCapabilities()
return false;
}
- enabledCapabilities = QgsVectorDataProvider::SelectAtId | QgsVectorDataProvider::SelectGeometryAtId;
+ if ( !mSelectAtIdDisabled )
+ {
+ enabledCapabilities = QgsVectorDataProvider::SelectAtId | QgsVectorDataProvider::SelectGeometryAtId;
+ }
}
return true;
diff --git a/src/providers/postgres/qgspostgresprovider.h b/src/providers/postgres/qgspostgresprovider.h
index c1168f98e389..327c512ee966 100644
--- a/src/providers/postgres/qgspostgresprovider.h
+++ b/src/providers/postgres/qgspostgresprovider.h
@@ -525,6 +525,9 @@ class QgsPostgresProvider : public QgsVectorDataProvider
/* Use estimated metadata. Uses fast table counts, geometry type and extent determination */
bool mUseEstimatedMetadata;
+ /* Disable support for SelectAtId */
+ bool mSelectAtIdDisabled;
+
// Produces a QMessageBox with the given title and text. Doesn't
// return until the user has dismissed the dialog box.
static void showMessageBox( const QString& title, const QString &text );
diff --git a/src/ui/qgscomposerscalebarwidgetbase.ui b/src/ui/qgscomposerscalebarwidgetbase.ui
index 583085fd5c20..5b9f3c8332f5 100644
--- a/src/ui/qgscomposerscalebarwidgetbase.ui
+++ b/src/ui/qgscomposerscalebarwidgetbase.ui
@@ -33,8 +33,8 @@
0
0
- 307
- 616
+ 298
+ 545
@@ -143,7 +143,7 @@
- -
+
-
mm
@@ -153,7 +153,7 @@
- -
+
-
@@ -178,7 +178,7 @@
- -
+
-
Label space
@@ -188,7 +188,7 @@
- -
+
-
Box space
@@ -198,7 +198,7 @@
- -
+
-
Unit label
@@ -211,10 +211,10 @@
- -
+
-
- -
+
-
@@ -227,14 +227,14 @@
- -
+
-
Color...
- -
+
-
Qt::Vertical
@@ -247,6 +247,16 @@
+ -
+
+
+ -
+
+
+ Alignment
+
+
+