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 + + +