Merge branch 'next' into kilrah/companion_sdcard_download

# Conflicts:
#	companion/src/fwpreferencesdialog.cpp
This commit is contained in:
Andre Bernet
2017-05-08 09:48:53 +02:00
742 changed files with 317562 additions and 289911 deletions
+111
View File
@@ -1 +1,112 @@
# Handle line endings automatically for files detected as text
# and leave all files detected as binary untouched.
* text=auto
#
# The above will handle all files NOT found below
#
# These files are text and should be normalized (Convert crlf => lf)
# Source files
*.c text
*.cc text
*.cxx text
*.cpp text
*.c++ text
*.hpp text
*.h text
*.h++ text
*.hh text
*.lua text
*.pxd text
*.py text
*.py3 text
*.pyw text
*.pyx text
*.pl text
*.pm text
*.sln text eol=crlf
*.csproj text eol=crlf
*.vbproj text eol=crlf
*.vcxproj text eol=crlf
*.vcproj text eol=crlf
*.dbproj text eol=crlf
*.fsproj text eol=crlf
*.lsproj text eol=crlf
*.wixproj text eol=crlf
*.modelproj text eol=crlf
*.sqlproj text eol=crlf
*.wmaproj text eol=crlf
*.xproj text eol=crlf
*.props text eol=crlf
*.filters text eol=crlf
*.vcxitems text eol=crlf
*.sh eol=lf
# Compiled Object files
*.slo binary
*.lo binary
*.o binary
*.obj binary
# Precompiled Headers
*.gch binary
*.pch binary
# Compiled Dynamic libraries
*.so binary
*.dylib binary
*.dll binary
# Compiled Static libraries
*.lai binary
*.la binary
*.a binary
*.lib binary
# Executables
*.exe binary
*.out binary
*.app binary
# Binary files
*.db binary
*.p binary
*.pkl binary
*.pyc binary
*.pyd binary
*.pyo binary
# Documents
*.doc diff=astextplain
*.DOC diff=astextplain
*.docx diff=astextplain
*.DOCX diff=astextplain
*.dot diff=astextplain
*.DOT diff=astextplain
*.pdf diff=astextplain
*.PDF diff=astextplain
*.rtf diff=astextplain
*.RTF diff=astextplain
*.md text
*.adoc text
*.textile text
*.mustache text
*.csv text
*.tab text
*.tsv text
*.sql text
# Graphics
*.png binary
*.jpg binary
*.jpeg binary
*.gif binary
*.tif binary
*.tiff binary
*.ico binary
# SVG treated as an asset (binary) by default. If you want to treat it as text,
# comment-out the following line and uncomment the line after.
*.svg binary
#*.svg text
*.eps binary
+36 -5
View File
@@ -6,7 +6,7 @@ set(VERSION_REVISION "0")
set(VERSION_SUFFIX $ENV{OPENTX_VERSION_SUFFIX})
set(VERSION_FAMILY ${VERSION_MAJOR}.${VERSION_MINOR})
set(VERSION ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_REVISION}${VERSION_SUFFIX})
set(SDCARD_REVISION "0008")
set(SDCARD_REVISION "0010")
set(SDCARD_VERSION ${VERSION_MAJOR}.${VERSION_MINOR}V${SDCARD_REVISION})
cmake_minimum_required(VERSION 2.8)
@@ -21,6 +21,9 @@ endif()
if(POLICY CMP0054)
cmake_policy(SET CMP0054 NEW)
endif()
if(POLICY CMP0058)
cmake_policy(SET CMP0058 NEW) # for ninja
endif()
set(CMAKE_COLOR_MAKEFILE ON)
@@ -59,6 +62,7 @@ if(WIN32)
list(APPEND CMAKE_PREFIX_PATH "${WIN_EXTRA_LIBS_PATH}" "${WIN_EXTRA_LIBS_PATH}/SDL") # hints for FindSDL
endif()
find_package(Qt5Core)
find_package(Qt5Widgets)
find_package(Qt5Xml)
find_package(Qt5LinguistTools)
@@ -66,11 +70,37 @@ find_package(Qt5PrintSupport)
find_package(Qt5Multimedia)
find_package(Qt5Svg)
if(Qt5Widgets_FOUND)
message(STATUS "Qt Version: ${Qt5Widgets_VERSION}")
if(Qt5Core_FOUND)
message(STATUS "Qt Version: ${Qt5Core_VERSION}")
### Get locations of Qt binary executables & libs (libs are for distros, not for linking)
# first set up some hints
get_target_property(QtCore_LOCATION Qt5::Core LOCATION)
get_filename_component(qt_core_path ${QtCore_LOCATION} PATH)
if(APPLE)
get_filename_component(qt_core_path "${qt_core_path}/.." ABSOLUTE)
endif()
set(QT_LIB_DIR ${qt_core_path} CACHE PATH "Path to Qt libraries (.dll|.framework|.so).")
find_path(QT_BIN_DIR NAMES "qmake" "qmake.exe" HINTS "${CMAKE_PREFIX_PATH}/bin" "${qt_core_path}/../bin" "${qt_core_path}" DOC "Path to Qt binaries (qmake, lupdate, etc.).")
find_program(QT_QMAKE_EXECUTABLE qmake HINTS "${QT_BIN_DIR}" DOC "Location of qmake program.")
find_program(QT_LUPDATE_EXECUTABLE lupdate HINTS "${QT_BIN_DIR}" DOC "Location of Qt's 'lupdate' program for updating translation files.")
# Try to find Qt translations
if(QT_QMAKE_EXECUTABLE)
execute_process(
COMMAND ${QT_QMAKE_EXECUTABLE} -query QT_INSTALL_TRANSLATIONS
OUTPUT_VARIABLE qt_translations_hint
OUTPUT_STRIP_TRAILING_WHITESPACE
)
endif()
find_path(QT_TRANSLATIONS_DIR NAMES "qt_en.qm" HINTS "${qt_translations_hint}" DOC "Path to prebuilt Qt translations (qt_*.qm).")
### Common definitions for the Qt-based apps
list(APPEND APP_COMMON_DEFINES -DSIMU)
list(APPEND APP_COMMON_DEFINES -DQXT_STATIC)
list(APPEND APP_COMMON_DEFINES -DQT_USE_QSTRINGBUILDER) # more efficient QString construction using % operator
if(APP_CUSTOM_DBG_HANDLER)
# provide full qDebug log context to our custom handler. This may also affect libsimulator, which is why it is here
list(APPEND APP_COMMON_DEFINES -DQT_MESSAGELOGCONTEXT)
@@ -84,6 +114,7 @@ if(Qt5Widgets_FOUND)
else()
list(APPEND APP_COMMON_DEFINES -DAPP_DBG_HANDLER_ENABLE=0)
endif()
else()
message(WARNING "Qt not found! Companion and Simulator builds disabled.")
endif()
@@ -97,7 +128,7 @@ if(NOT WIN32)
endif()
endif()
if(Qt5Widgets_FOUND OR FOX_FOUND)
if(Qt5Core_FOUND OR FOX_FOUND)
set(SDL_BUILDING_LIBRARY YES) # this prevents FindSDL from appending SDLmain lib to the results, which we don't want
find_package("SDL")
if(SDL_FOUND)
@@ -136,6 +167,6 @@ endif()
add_subdirectory(${RADIO_SRC_DIRECTORY})
if(Qt5Widgets_FOUND)
if(Qt5Core_FOUND)
add_subdirectory(${COMPANION_SRC_DIRECTORY})
endif()
+1199
View File
File diff suppressed because it is too large Load Diff
-852
View File
@@ -1,852 +0,0 @@
<a href="http://frsky-rc.com">FrSky (monthly)</a>
<a href="http://alofthobbies.com">Aloft Hobbies</a>
<a href="http://jonathan.it">Jonathan Modellismo</a>
<a href="http://wstech.de">WsTech</a>
<a href="http://aviomotive.com">Aviomotive</a>
<a href="http://boltrc.com">BoltRC</a>
<a href="http://aerialtechhobbies.com">Aerial Tech Hobbies</a>
<a href="http://litepilots.com">LitePilots</a>
<a href="http://openpilot.com">David Ankers (OpenPilot)</a>
<a href="http://3drobotics.com">3D Robotics</a>
<a href="http://rcstudio.cz">RC Studio (monthly)</a>
Mario Sette
Felice Baratto
Alessandro Mari
Gianpiero Spontina
Ingo Kuzniak
Hans-Åke Rahm
Tamas Varga
Thomas Gregg
Didier Christien
Alain Pinard
Sergio Melas
Paul Montenot
Chris Guy
Adrien Gravouille
Thomas Black
Marc Lucht
Zdenek Trojanek
Martin Hotar
Stefan Grundevik
Fabio Eboli
Federico Zotti
Albin Esbjörnsson
Kilian Hüttenhofer
Stephen Stough
Adilson Oliveira
Robert Saint Marie
Tad Leake
Andreas Weitl
Chan Lofland
Dirk Kasten
Denisov Alexander
Timo Varppee
Ondrej Hatapka
Valérie Billon
R. Scott Page
Johan Cronje
Renato Aranghelovici
Jeffrey Irvin
John Rodgers
Kenneth Crump
Damjan Adamic
Martin Wilson
Joe Street
John Holdsworth
Daniel Schwartz
Dean Church (monthly)
Michael Halse
David Mark
Ted Moss
Jim Wagner
Nicola Porzi
Michael Halse
Chewytm
Espen Solbu
Mike Frizell
Bruce Jones
Stefano Airaghi
Dan Eeckhout
Alex Calderhead
Leonard MacKey
Heung Jin Choi
Mike Retterer
Keith Wood
Viljo Liukku
Eric Beier
Burt Pickard-Richardson
Helmut Renz
Rick Harms
Vincenzo Vavala
Patricia Martin
Harald Klein
Carl Petersen
Douglas Burkett
Clifford Evans
Teodor Yantchev
Jarad Berkman
Christian Schulz
Gregory J Shepherd
Michael Shellim
Ming Wang
Bernard Lukaschek
Nigel Chippindale
Mike Perkins
Ted Hammond
David Beanland
Bernd Koehler
Frédéric Duflos
Dave Fasken
Heinrich Illig
Michael Collins
Michael Manning
Craig Lorentz
André Lasseret
Felipe Alexandre de Oliveira
Brian Harris
Philippe Herbots
Rainer Nelte
Franck Bernhard
Erhard Werner
Stig Jøran Moen
Keith Hertzog
Christophe Dauvergne
Tauno Rautakorpi
Sven Assmus
Paul Dittman
Mike Matheny
Cheryl Wynne
Emay Toha
Don Nolder
André Lasseret
Filip Lowette
Arnaldo Gabella
Fiorenzo Agnelli
Michele Villa
Christophe Rodriguez
Larisa Filocamo
Hartmut Sahm
Åke Brodin
Ted Moss
Filippos Tigarakis
Chewytm
Eric Burdis
Nigel Chippindale
Michael Deasy
Stephen Stough
Kenneth Lilja (monthly)
Robert Jero
Gary Bancroft
Robert Cotsford
NorthSide
George Constandinides
Robert Schonk Jr
Kevin Berkefeld
Peter Webster
Mike Matheny
Martin Sniedze
Fernando Rimoldi
Sidney Fisher
Bruce Anderson
John Rodgers
Ed Pare
Thomas Kilduff
Robert Ferguson
Bryan Green
Kevin Berkefeld
Julien Michel
Krittikun Chiraphanda
Douglas Law
Alberto Scotti
Oliver Kunkel
D. Joseph Frazier
Heiko Polig
Andrew Fernie
Marco Lange
Nick McMillan
Michel Baily (monthly)
Patrick Mullen
Scott Campbell
Erich Roeder
Wayne Davy
Michael Fontenot
Willie Swanepoel
Satoru Sasaki
Tyler Darby
Nicholas Crego
Johan Moelich
Timo Esser
Brian Paddock
Jean Pierre Parisy
Norbert Martsch
Jean-Marie Guitard
Tilman Baumann
Fred Larssen
Ari Aalto
Robert Sams
Kirk Robertson
John Koontz
Jeffery Golias
Paul Robinson
Dave Matison
Mike Matheny
Pino Agostino
Graham Boucher
Nelson Noura
Joel Allamy
Philip David Martin
Sean Stephen
Bruce Mackay
Blake Spilman
Timothy Pelletier
Glen Roe (ShowMaster)
Jan Van Ooteghem
Lawrence Christensen
Leo Duflou
Bruce Wood
Arnd Feige
Tauno Rautakorpi
Steve Coley
Stefan Kiendl
Gregory Nuspel
Mitchell Brenner
Ronnnie DePrez
Ferenc Koller
Robert Sessler
Didier Lanot
Rodney Hunt
Steve Bernard
Paul Nazaroff
Gordon Ernenputsch
Ksamak
Marc Gittelman
David Poole
Ralph Sauer
Karl-Heinz Gansel
Michels Bernhard
Thomas Demmelbauer
Felice Baratto
Michael Halse
Horst Kampen
Ian Gough
Matthew Brett
Lexington S Morley
Clemens Drews
Axel Stöckle
Roberto Orsello
Richard Ruck
Hugh Caldwell
Christian Marauli
Albin Esbjörnsson
Per Esbjörnsson
Bernd Hohmann
Sławomir Juszczak
Stephen Henderson
David Morgan
Aloft Hobbies
Netanel Hobara
Cameron Galipo
Doug Schafer
Pietro Rossin
Earl Killingsworth
Victor B Wright
Terry McKinley
Марков Алексей
Offer Shmuely
Ian Lobley
Stéphane Fortas
Peter Mitrik
Thomas Majewski
ANF King
Henrik Hammarström
Kenneth Lilja
R Wells
Uwe Jordt
Harald Wilczak
Bernhard Lohmann
Ferenc Koller
Robert Ferguson
Daniel Byers
Tyler Darby
Miguel Villalpando
Kim Dong Hoon
Terry McKinley
Walter Bell
Clinton Linck
Josep Clodas Sola
Thierry Martin
Peter Mauro
Mitchell Brenner
Yak
Lluis Bullich Rañe
Steffen Rohr
Eric Jacquin
Harvest Lane
Ville Kuvaja
DK-System
Heinz Vogel
Heung Jin Choi
MMJS van der Helm
Dan Neelands
Yashiro Masayuki
Isaac Sloan
Harold Baird
Roy Bender
Bradley Murchie
Maximilian Süß
Dean Jansa
Ronald Donker
Paul Oldenkamp
Dietmar Drees
Bradley Murchie
Richard Fahie
James Kaufman
Henry Deucker
Christian Fuchs
Arold Reinders
Robert Miller
Mark Gaskievicz
Roland Müller
Frank Gewalt
Remi Viard
Reginald H Millsom
Pierluigi Sommaruga
A Harris
Stefan Grunenberg
Francisco Gutierrez Muñoz
Steve Coley
Sean Cull
Roberto Orsello
David Finger
Jean-Marie Oddo
Mike Matheny
Glen Roe (Showmaster)
Arron Bates
Tim Spurr
Daniel Morgan
Trent Ready
Mark Maskiell
Robert Crockford
Mark Illum
David McGuire
Martyn Coles
Jose Sobral
Heung Jin Choi
Tomasz Janiak
Fabien Gagné
Joe Street
Micha Ronen
Albert Blondin
Klaus Schuebel
Evening Shade Pottery
Thomas Kilduff
Sven Assmus
Markus Eberl
Nicholas Field
Harald Wilczak
John Grepps
Anthony Burbidge
Sherba Baine
Gordon Evans
Fred Figge
Uwe Kuehn
David Beatty
Aaron Stringer
Alan J Wasserman
Wolfgang Rauser
Samuel Cook
Friedrich Ipolt
Barrington Cole
Charles Lakins
Thos. O'Meara Photography
Adam Chevalier
Mike Mulligan
Serge Michaux
Robert Young
Wilco Hijink
Roy Nixon
Lexington S Morley
Daryl Dacko
Beat Zurflueh
Piotr Kundu
Kevin Berkefeld
Tomasz Klys
Mirco Didone'
Christoph Schroeter
Zdenek Trojanek
Bryan Anderson
Kamco Enterprises
Robert Bates
Robert Brown
Dennis Marinus
Ronald Van Putte
Thomas Kvitle Jenssen
Patrick Tuxbury
Istvan Magi
Sasaki Satoru
David Laburthe
Vit Jelinek
Pablo Gomez Martinez
Alan Thoren
Jack Clodfelter
William Simon
James Houck
Peter Fithern
Thomas Svedman
TechFixPros
Rafael Eric Suarez Nordlow
Colin Rycroft
Emanuel Stassar
Michael Gregory
Robert Russell
Felix Kaiser
Joshua Bardwell
Davd Goodall
Leonard MacKey
Miles Kelly
Sergio Robledo
Mikael Wallbäck
Daniel Malcman
Paul Dittman
Attilio Rausse
Sidney Gates
Andrea Montefusco
Paul Luby
Donald L Webster
Kenneth Frehafer
Matthias Hase
Markus Wolf
Andrew Fazio
Stefan Künst
Stephen Adams
Tauno Rautakorpi
Frank Houvenaghel
George Neusse
Andreja Rusjakovski
Axel Stöckle
Erwin Störrle
Rodger Hopper
Fernando Cesar
Jonathan Gillis
DK-System
Lexington S Morley
Bernd Koehler
Davis RC
Pete Johnson
Patricia Martin
Florian Tschacher
Brian Spearing
Craig Hall
Joseph Case
Harald Klein
Robert Crockford
Chris Boultinghouse
Kitsew
Georgios Papadopoulos
Fourmost Products
Dennis Miller
Dave Matison
Maximilian Radig
Juan Rodriguez
Robert Sessler
John Murray
Martin Sniedze
David Poole
Manfred Delakowitz
Martijn Kruissen
Jörgen Norman
Nathan Kinney
John Godden
Larry Roper
Mike Frizell
Daniel Pospolita
Peter Herz
Don Mondrik
Paul Fram
Charles Knight
Matthew Adams
Kenneth Reed
Gary Wild
Christof Ramm
Bruno Bedard
Salih Samim Aydin
Alexander Pils
Andrew Scerbina
Donovan Bodishbaugh
Ray Dunn
Burt Pickard-Richardson
Robert Ferguson
CY Enterprise
Michel Stathakis Neto
Beat Zurflueh
Portstate Pty Ltd
Jens Hoffmann
Ricardo Santos
Jean-Francois Le Breton
Michael Deasy
Anindya Mukerjee
Emay Toha
Kamco Enterprises
Peter Mueller
Giovanni Trentini
Cecil Porter
Robert Canavan
Greg Higginbottom
Tim Walker
Spis Ltd/TurboNote
Patricia Cox
Matthew Lukes
Sabine Witte
Phillip Perry
Beat Zurflueh
Russell Stutzman
Dietmar Drees
Kenneth Ward
Jens Lochmüller
Anthony Witham
Peter Hauke
Arizona Action Photos
Francis F Dale
Willie Swanepoel
Edward Hauser
Adilson Oliveira
Joseph Ordille
Michael Shellim
Teddie Holmes
Alexandre Rault
Eric Albin
Lukas Kliment
Bernard Philippe
Bernard Delpy
Didier Klein
Arnaldo Guedes
Cyberauto Systems
John Alsbrooks
John Kearney
Christopher Borden
Marc Virgilio Ricci
Frederick Davie
Jürgen Enders
Terrence Pitts
Thomas Sandner
Marco Coltorti
Harald Wilczak
Rodney Lorimor
Richard Davis
Stephen Palmer
Michael Napolitan
Joshua Bardwell
Fred Dawson
Jim Wagner
Peter Johnson
Fredrik Lewerth
Arvin Stenersen
Daniel Morgan
Roy Nixon
Joachim Blunck
Karl-Heinz Gansel
Monrovia Mountain Enterprises
Alessandro Villa
Jan-Åke Nilsson
Matthias Rei
DVR Solutions BV
Bertrand Condevaux Lanloy
Henri Mirra
Aurélien Planiol
Kevin Caldwell
Andrew Garello
Tomasz Maziarz
Russell Flack
Fernando Rimoldi
Greg Reid
Dietmar Drees
Holger Landwehr
Arno Loehdorf
Boon Sripattha
Patrik Åkerfeldt
Alonzo Fretwell
Renjith Chandrasekharan
Ruben Gomez Hernandez
Michael Gardner
Judith Green
Timo Ruppell
John Lipscomb
Norbert Wenke
Erik Frieberg
Raimo Ruotsalainen
Brian Harris
Sebastian Blüml
Efisio Maxia
Jeff Theobald
Anthony Rizzo
Rodney Huddleston
Dietmar Drees
Jürgen Monden
David Morgan
Andrew Fernie
Donald Burke
Ronald Donker
Fredie Singh
Patrizio Simoncini
Harald Gabler
Michael Brown
Julien Gérard
Alexandre d'Alton
Peter Mergaerts
Jan Houwers
Christian Grandjean
Roger Bergevin
NorthSide
Sigmund Martinsen
Lionel Lafraise
Gisli Ofeigsson
The Gruvin9x Project
Manuel McLure
Fernando Rimoldi
Hiltenkamp Stephan
Sandeep Kishore Jain
Greg Parker
Norman Maaß
Adriano Del Ben
Justin Poole
Kenneth Harrison
Eugene LaFaille
John O'Shaughnessy
Uwe Jordt
Stuart Olson
Frédéric Devillard
Cheung Leo
Peter Webster
Jean-Claude Bachetta
Delfin Perena
Sae-wook Yoon
Focus on Excellence
Jeffery Golias
Nick Milton
Paul Zasso
Reidar Johannes Lillebotn
Handley William
Luke Williams
Michael Shellim
Brian Spearing
Derek Foster
Pasi Pitkänen
Lexington S Morley
Jeff Roberson
Volkov Victor
Bryan Anderson
Daniel Garber
Pavel Stein
Ravi Gupta
Patrick Tuxbury
Mark Deverell
John Capell
Neil McVean
Matthew Elyash
Kerry Cochrell
Willem Aandewiel
Reg Bell
Jean Chenoz
Philippe Grand
Tauno Rautakorpi
Jeff Dillingham
Brad Kelley
Shaun Currier
Danilo Schiara
John Hennig
RK Custom Homes
James Houck
Piet Teekens
Tommy Widenflycht
Johan Petrus Theophilus
Maria van Melis
Ralph Gustafson
Paul Luby
Andrew Duncan
Stephen Crowther
Edward Glover
Kelly Byrd
Brad Curtis
Wolfgang Kuhl
John Beidl
Roy Nixon
Glen Roe
CY Enterprise
Evening Shade Pottery
Gilles Dando
Patrick Richard
Justin Altemeier
Constant Dupuis
Tony Kenward
Pierre Rondel
Ernest Luguera Sanchez
Adam Brackney
Joe Baker
单 雷平
Ben Fay
Chris Monk
Stan von Miller
Christian Krebs
Michel Motte
Graziano Rampinelli
Joe Baker
Jean-Philippe Laurent
Romain Rouzaud
Michel Garbarino
Henri Mirra
Otto Fröhlich
Thomas Cramer
Anthony Trombetta
Fernando Rimoldi
Dietmar Drees
Michal Kowalski
Ivan Correa
Modellbau
Massimo Luigi Stara
Graham Baldwin
Tomasz Rejman
Wolfgang Lang
John Greenwood
Till von Reumont
Paul Pereira Brunner
Donald L Singer
Junsun Lee
Guy Lamaison
Erwin Dulken
Mike H Dailey
Jon Cammarata
Martin Krueger
Adolfo Perogio
Sylvain Techer
Wes Warner
Kevin Caldwell
Ali Ersan Gur
Hans-Rudolf Riniker
Sébastien Boutard
Jean Chessé
Mike H Dailey
Don Polk
Roberto Orsello
Borovikov Dmitriy
John Lipscomb
Peter Glassey
Joseph Kramer
F.Javier Martinez Velasco
Claudio Piccinini
John Jackson
John Beech
Rene TraaJohn Jackson
Sebastien Charpentier (monthly)
Nigel Hendriks
Frédéric Devillard
Albert Herzog
Anindya Mukerjee
Kenny Stanberry
Tauno Rautakorpi
Mathias Krapp
Fernando Rimoldi
Wolfgang Rauser
Richard Shagam
Stephen Bailey
DK-System
Casa Kuxtal
Christopher Potts
Douglas George
Michael Banks
Jon Wiltshire
David Green
Guy Willems
Xavier Mestelan Pinon
Maik Gottschalk
Scott Sparks
John Dunning
RAD51
Ron Powell
Alain Labonne
Carol Sills
Franck Aßmann
Larry Anderson
Mikael Wallbäck
Wes Warner
Christoffer H Henni
Donna Bayer
Garry Ogilvie
Karlheinz Sirsch
Fred Larssen
Rob Coppock
Franz Josef Hahn
Serge Ribault
Tanguy Le Moign
Barrett Powell
Patrice Lafeuille
Martin Blume
Marek Kopyto
Marco Lange
Gary Nix
Jack Oliphant
John Lever
Adolphe Montefiore
Steven De Weerdt
Håkan Berggen
Ayelet Egosi
Jean-Frederic Gaudreault
Jim Wagner
Lee Scott
Roger Keatley
Sherman Lovell
Hugh Caldwell
JB Fisher Company
Michels Bernhard
Pietro Rossin
Carsten Wache
Brock White
Steven Poretz
David Huelster
Gordon Stahl (monthly)
John Mathison
Richard Duczmal
Gregory Barron
Marcel Fischer
Klas Mälman
Viljo Liukku
Eric Smith
Sven Assmus
Luke Mole
NorthSide
Hannes Mössler
James Kaufman
Ravi Gupta
Lexington S Morley
Ralph Segar
Frédéric Devillard
Cory Theurer
Valentinos Zachariou
Garrett Paquette
Heung Jin Choi
Kerry Cochrell
Doug Miller
Andrzej Weydmann
Chair-man.nl
Eric Beier
Jay Warren
Marian Matej
Alastair Smith
Timothy Senecal
Dietmar Drees
Bruce Jones
Adil Busaidy
Herman Hofman
Jean Paul Michel
Peter McHenry
Julien lecoquierre
Jean-Marie Clay
Robert Nicoll
Dan Nixon
Ewald Moehring
Giovanni Carnesecchi
Paul Dumsday
Tadeusz Adamowski
Andrew Newton
Neil Horne
Kerstin Appelqvist
+9 -2
View File
@@ -1,4 +1,4 @@
##OpenTX 2.2 Branch
## OpenTX 2.2 Branch
[![Build Status](https://travis-ci.org/opentx/opentx.svg?branch=next)](https://travis-ci.org/opentx/opentx)
[![Coverity Scan Build Status](https://scan.coverity.com/projects/11787/badge.svg)](https://scan.coverity.com/projects/opentx-opentx)
@@ -7,4 +7,11 @@
The ongoing development on 2.2.x is done in this branch.
Refer to the opentx.wiki for information about setting up the tool chains for building OpenTX and OpenTX Companion as well as other development related issues.
Refer to the [OpenTX wiki](https://github.com/opentx/opentx/wiki) for information about setting up the tool chains for building OpenTX and OpenTX Companion as well as other development related issues.
Useful links:
* OpenTX Blog http://blog.open-tx.org/
* OpenTX Main Site http://www.open-tx.org/
* OpenTx University http://open-txu.org/
* OpenTX User Manual https://www.gitbook.com/book/opentx/opentx-taranis-manual/details
* OpenTX Lua Reference Guide https://www.gitbook.com/book/opentx/opentx-lua-reference-guide/details
-17
View File
@@ -1,17 +0,0 @@
# Locate lupdate binary from QT
# This module defines
# LUPDATE_EXECUTABLE, where is QT lupdate
# LUPDATE_FOUND, if false, don't try to use lupdate
FIND_PROGRAM( LUPDATE_EXECUTABLE
NAMES
lupdate lupdate-qt4
)
# if the program is found then we have it
IF( LUPDATE_EXECUTABLE )
SET( LUPDATE_FOUND "YES" )
ENDIF( LUPDATE_EXECUTABLE )
MARK_AS_ADVANCED( LUPDATE_EXECUTABLE )
+67 -67
View File
@@ -1,68 +1,68 @@
# Find Xerces-C
# The following setings are defined
# XERCESC_ROOT_DIR, the root of the include and lib directory
# XERCESC_INCLUDE_DIR, the full path of the include dir (ADVANCED)
# XERCESC_LIBRARIES, the name of the xerces-c library (ADVANCED)
# Look for a root installation
IF( MSVC )
SET( XERCES_WINDIR C:/Programs/xerces-vc )
ELSE( )
SET( XERCES_WINDIR C:/Programs/xerces )
ENDIF( )
FIND_PATH(XERCESC_ROOT_DIR include/xercesc/parsers/SAXParser.hpp
${XERCES_WINDIR}
"C:/mingw/msys/1.0/local"
"C:/Program Files/CodeSynthesis XSD 3.2"
/usr
/usr/local
"C:/MinGW"
$ENV{CODESYNTH}
DOC "The root of an installed xerces-c installation"
)
# try to find the header
FIND_PATH(XERCESC_INCLUDE_DIR xercesc/parsers/SAXParser.hpp
${XERCESC_ROOT_DIR}/include
/usr/include
/usr/local/include
)
# Find the library
FIND_LIBRARY(XERCESC_LIBRARY
NAMES xerces-c xerces-c_3
PATHS
${XERCESC_ROOT_DIR}/lib
${XERCESC_ROOT_DIR}/lib/vc-9.0
${XERCESC_ROOT_DIR}/lib64/vc-9.0
/usr/lib
/usr/local/lib
DOC "The name of the xerces-c library"
)
IF (XERCESC_ROOT_DIR)
IF (XERCESC_INCLUDE_DIR AND XERCESC_LIBRARY)
SET (XERCESC_FOUND TRUE)
SET (XERCESC_LIBRARIES "${XERCESC_LIBRARY}")
# FIXME: There should be a better way of handling this?
# FIXME: How can we test to see if the lib dir isn't
# FIXME: one of the default dirs?
LINK_DIRECTORIES(${XERCESC_ROOT_DIR}/lib)
ENDIF (XERCESC_INCLUDE_DIR AND XERCESC_LIBRARY)
ENDIF (XERCESC_ROOT_DIR)
IF (XERCESC_FOUND)
IF (NOT XERCESC_FIND_QUIETLY)
MESSAGE (STATUS " found xerces-c: ${XERCESC_LIBRARY}")
ENDIF (NOT XERCESC_FIND_QUIETLY)
ELSE (XERCESC_FOUND)
IF (XERCESC_FIND_REQUIRED)
MESSAGE(FATAL_ERROR "Could not find Xerces-C")
ENDIF (XERCESC_FIND_REQUIRED)
ENDIF (XERCESC_FOUND)
MARK_AS_ADVANCED(
XERCESC_INCLUDE_DIR
XERCESC_LIBRARY
# Find Xerces-C
# The following setings are defined
# XERCESC_ROOT_DIR, the root of the include and lib directory
# XERCESC_INCLUDE_DIR, the full path of the include dir (ADVANCED)
# XERCESC_LIBRARIES, the name of the xerces-c library (ADVANCED)
# Look for a root installation
IF( MSVC )
SET( XERCES_WINDIR C:/Programs/xerces-vc )
ELSE( )
SET( XERCES_WINDIR C:/Programs/xerces )
ENDIF( )
FIND_PATH(XERCESC_ROOT_DIR include/xercesc/parsers/SAXParser.hpp
${XERCES_WINDIR}
"C:/mingw/msys/1.0/local"
"C:/Program Files/CodeSynthesis XSD 3.2"
/usr
/usr/local
"C:/MinGW"
$ENV{CODESYNTH}
DOC "The root of an installed xerces-c installation"
)
# try to find the header
FIND_PATH(XERCESC_INCLUDE_DIR xercesc/parsers/SAXParser.hpp
${XERCESC_ROOT_DIR}/include
/usr/include
/usr/local/include
)
# Find the library
FIND_LIBRARY(XERCESC_LIBRARY
NAMES xerces-c xerces-c_3
PATHS
${XERCESC_ROOT_DIR}/lib
${XERCESC_ROOT_DIR}/lib/vc-9.0
${XERCESC_ROOT_DIR}/lib64/vc-9.0
/usr/lib
/usr/local/lib
DOC "The name of the xerces-c library"
)
IF (XERCESC_ROOT_DIR)
IF (XERCESC_INCLUDE_DIR AND XERCESC_LIBRARY)
SET (XERCESC_FOUND TRUE)
SET (XERCESC_LIBRARIES "${XERCESC_LIBRARY}")
# FIXME: There should be a better way of handling this?
# FIXME: How can we test to see if the lib dir isn't
# FIXME: one of the default dirs?
LINK_DIRECTORIES(${XERCESC_ROOT_DIR}/lib)
ENDIF (XERCESC_INCLUDE_DIR AND XERCESC_LIBRARY)
ENDIF (XERCESC_ROOT_DIR)
IF (XERCESC_FOUND)
IF (NOT XERCESC_FIND_QUIETLY)
MESSAGE (STATUS " found xerces-c: ${XERCESC_LIBRARY}")
ENDIF (NOT XERCESC_FIND_QUIETLY)
ELSE (XERCESC_FOUND)
IF (XERCESC_FIND_REQUIRED)
MESSAGE(FATAL_ERROR "Could not find Xerces-C")
ENDIF (XERCESC_FIND_REQUIRED)
ENDIF (XERCESC_FOUND)
MARK_AS_ADVANCED(
XERCESC_INCLUDE_DIR
XERCESC_LIBRARY
)
+110 -109
View File
@@ -1,6 +1,6 @@
set(SIMULATOR_INSTALL_PREFIX "" CACHE STRING "Alternative simulator library search path")
if(${CMAKE_SYSTEM_NAME} MATCHES "Linux")
if(${CMAKE_SYSTEM_NAME} MATCHES "(Linux|FreeBSD)")
set(C9X_NAME_SUFFIX ${VERSION_MAJOR}${VERSION_MINOR})
set(COMPANION_NAME "companion${C9X_NAME_SUFFIX}")
set(SIMULATOR_NAME "simulator${C9X_NAME_SUFFIX}")
@@ -11,10 +11,10 @@ if(${CMAKE_SYSTEM_NAME} MATCHES "Linux")
endif()
message(STATUS "Simulators library search path: " ${SIMULATOR_LIB_PATH})
set(SIMULATOR_LIB_INSTALL_PATH ${CMAKE_INSTALL_PREFIX}/lib/companion${C9X_NAME_SUFFIX})
else(${CMAKE_SYSTEM_NAME} MATCHES "Linux")
else()
set(COMPANION_NAME "companion")
set(SIMULATOR_NAME "simulator")
endif(${CMAKE_SYSTEM_NAME} MATCHES "Linux")
endif()
# This the name that the user will see in the generated DMG and what the application
# will be called under /Applications. We include the version string to make installing
@@ -100,15 +100,104 @@ use_cxx11() # ensure gnu++11 in CXX_FLAGS with CMake < 3.1
include_directories(
${CMAKE_BINARY_DIR}
${CMAKE_CURRENT_BINARY_DIR}
${CMAKE_SOURCE_DIR}
${COMPANION_SRC_DIRECTORY}
${COMPANION_SRC_DIRECTORY}/shared
${SIMU_SRC_DIRECTORY}
${COMPANION_SRC_DIRECTORY}/thirdparty/qxtcommandoptions
${COMPANION_SRC_DIRECTORY}/thirdparty/qcustomplot
${COMPANION_SRC_DIRECTORY}/thirdparty/miniz
${COMPANION_SRC_DIRECTORY}/storage
)
############# Do macro replacements on input files #############
configure_file(${COMPANION_SRC_DIRECTORY}/version.h.in ${CMAKE_BINARY_DIR}/version.h @ONLY)
configure_file(${COMPANION_SRC_DIRECTORY}/companion.desktop.in ${CMAKE_CURRENT_BINARY_DIR}/companion.desktop @ONLY)
configure_file(${COMPANION_SRC_DIRECTORY}/simulator.desktop.in ${CMAKE_CURRENT_BINARY_DIR}/simulator.desktop @ONLY)
############# Translations ###############
### Generate .qm files and assemble resource (qrc) file.
# available Companion translations (src/translations/*.ts)
set(LANGUAGES cs de en es fi fr it pl sv zh_CN)
foreach(language ${LANGUAGES})
list(APPEND companion_TS translations/companion_${language}.ts)
endforeach(language)
# .ts -> .qm
qt5_add_translation(companion_QM ${companion_TS})
# add Qt translations if found
if(QT_TRANSLATIONS_DIR)
# Some languages have all translations in one qt_*.qm file and others break them up into modules, in which case we need qt_base_*.qm
file(GLOB qtbase_QM "${QT_TRANSLATIONS_DIR}/qtbase_*.qm")
file(GLOB qt_QM "${QT_TRANSLATIONS_DIR}/qt_??.qm") # don't want to match "qt_help_*.qm"
list(APPEND qt_QM "${QT_TRANSLATIONS_DIR}/qt_zh_CN.qm" "${QT_TRANSLATIONS_DIR}/qt_zh_TW.qm") # exceptions not matched by the GLOB
else()
message(STATUS "QT_TRANSLATIONS_DIR not found, unable to package pre-built Qt translations with application.")
endif()
set(TRANSLATIONS_QRC "${CMAKE_CURRENT_BINARY_DIR}/translations.qrc")
# Dynamically create translations.qrc file (XML) from all collected translation files.
foreach(qm_file ${companion_QM} ${qt_QM} ${qtbase_QM})
get_filename_component(qm_file_name ${qm_file} NAME)
# Add file with full path and file name (w/out path) as alias to be used in actual code
set(TRANSLATION_FILES_LIST "${TRANSLATION_FILES_LIST} <file alias=\"${qm_file_name}\">${qm_file}</file>\n")
endforeach()
configure_file(${COMPANION_SRC_DIRECTORY}/translations.qrc.in ${TRANSLATIONS_QRC} @ONLY)
### Add optional "translations" target for updating .ts files
if(QT_LUPDATE_EXECUTABLE)
add_custom_target(translations
WORKING_DIRECTORY ${COMPANION_SRC_DIRECTORY}
COMMAND ${QT_LUPDATE_EXECUTABLE} ${CMAKE_SOURCE_DIR} -no-obsolete -ts ${companion_TS}
)
else()
message(STATUS "Qt lupdate not found, 'translations' target will not be availabe.")
endif()
############# Common lib ###############
set(common_SRCS
appdebugmessagehandler.cpp
boards.cpp
customdebug.cpp
eeprominterface.cpp
helpers.cpp
radiodata.cpp
translations.cpp
firmwares/er9x/er9xeeprom.cpp
firmwares/er9x/er9xinterface.cpp
firmwares/ersky9x/ersky9xeeprom.cpp
firmwares/ersky9x/ersky9xinterface.cpp
firmwares/opentx/opentxeeprom.cpp
firmwares/opentx/opentxinterface.cpp
modeledit/node.cpp # used in simulator
modeledit/edge.cpp # used by node
)
set(common_MOC_HDRS
appdebugmessagehandler.h
helpers.h
modeledit/node.h
)
set(common_RESOURCES
companion.qrc
${TRANSLATIONS_QRC}
)
qt5_wrap_cpp(common_SRCS ${common_MOC_HDRS})
qt5_add_resources(common_RCC ${common_RESOURCES})
#add_custom_target(gen_qrc DEPENDS ${common_RCC} ${companion_QM})
add_library(common ${common_SRCS} ${common_RCC})
qt5_use_modules(common Core Xml Widgets)
target_link_libraries(common PRIVATE simulation)
#add_dependencies(common gen_qrc)
set(CPN_COMMON_LIB common)
############# Supporting libraries ###############
add_subdirectory(shared)
@@ -117,36 +206,10 @@ add_subdirectory(generaledit)
add_subdirectory(simulation)
add_subdirectory(storage)
add_subdirectory(thirdparty/qcustomplot)
add_subdirectory(thirdparty/qxtcommandoptions)
############# Common lib ###############
set(common_SRCS
appdebugmessagehandler.cpp
boards.cpp
eeprominterface.cpp
radiodata.cpp
firmwares/er9x/er9xeeprom.cpp
firmwares/er9x/er9xinterface.cpp
firmwares/ersky9x/ersky9xeeprom.cpp
firmwares/ersky9x/ersky9xinterface.cpp
firmwares/opentx/opentxeeprom.cpp
firmwares/opentx/opentxinterface.cpp
)
set(common_MOC_HDRS
appdebugmessagehandler.h
)
qt5_wrap_cpp(common_SRCS ${common_MOC_HDRS})
add_library(common ${common_SRCS})
qt5_use_modules(common Core Xml Widgets)
############# Companion ###############
set(companion_SRCS
helpers.cpp
helpers_html.cpp
mdichild.cpp
modelslist.cpp
@@ -155,7 +218,7 @@ set(companion_SRCS
burnconfigdialog.cpp
multimodelprinter.cpp
comparedialog.cpp
contributorsdialog.cpp
creditsdialog.cpp
releasenotesdialog.cpp
releasenotesfirmwaredialog.cpp
customizesplashdialog.cpp
@@ -189,7 +252,7 @@ set(companion_MOC_HDRS
printdialog.h
fusesdialog.h
logsdialog.h
contributorsdialog.h
creditsdialog.h
releasenotesdialog.h
releasenotesfirmwaredialog.h
customizesplashdialog.h
@@ -206,7 +269,6 @@ set(companion_MOC_HDRS
mdichild.h
mainwindow.h
radionotfound.h
helpers.h
wizarddialog.h
modelprinter.h
multimodelprinter.h
@@ -233,80 +295,25 @@ set(companion_UIS
radionotfound.ui
)
set(companion_RESOURCES
companion.qrc
${CMAKE_CURRENT_BINARY_DIR}/translations.qrc
)
configure_file(${COMPANION_SRC_DIRECTORY}/version.h.in ${CMAKE_BINARY_DIR}/version.h @ONLY)
configure_file(${COMPANION_SRC_DIRECTORY}/translations.qrc.in ${CMAKE_CURRENT_BINARY_DIR}/translations.qrc @ONLY)
configure_file(${COMPANION_SRC_DIRECTORY}/companion.desktop.in ${CMAKE_CURRENT_BINARY_DIR}/companion.desktop @ONLY)
configure_file(${COMPANION_SRC_DIRECTORY}/simulator.desktop.in ${CMAKE_CURRENT_BINARY_DIR}/simulator.desktop @ONLY)
if(WIN32)
list(APPEND companion_SRCS icon.rc)
set(icon_RC icon.rc)
endif()
include_directories(${CMAKE_BINARY_DIR})
include_directories(${CMAKE_SOURCE_DIR})
set(LANGUAGES pl de fr es it sv cs fi zh)
foreach(language ${LANGUAGES})
list(APPEND companion_TS translations/companion_${language}.ts)
endforeach(language)
qt5_wrap_ui(companion_SRCS ${companion_UIS})
qt5_wrap_cpp(companion_SRCS ${companion_MOC_HDRS})
qt5_add_translation(companion_QM ${companion_TS})
qt5_add_resources(companion_RCC ${companion_RESOURCES})
add_custom_target(gen_qrc DEPENDS ${companion_RCC})
add_executable(${COMPANION_NAME} MACOSX_BUNDLE ${WIN_EXECUTABLE_TYPE} ${companion_SRCS} ${companion_RCC} ${companion_QM})
add_dependencies(${COMPANION_NAME} gen_qrc)
add_executable(${COMPANION_NAME} MACOSX_BUNDLE ${WIN_EXECUTABLE_TYPE} ${companion_SRCS} ${icon_RC})
qt5_use_modules(${COMPANION_NAME} Core Widgets Network)
target_link_libraries(${COMPANION_NAME} PRIVATE generaledit modeledit simulation common qcustomplot shared storage ${PTHREAD_LIBRARY} ${SDL_LIBRARY} ${WIN_LINK_LIBRARIES})
target_link_libraries(${COMPANION_NAME} PRIVATE generaledit modeledit simulation ${CPN_COMMON_LIB} qcustomplot shared storage ${PTHREAD_LIBRARY} ${SDL_LIBRARY} ${WIN_LINK_LIBRARIES})
PrintTargetReport("${COMPANION_NAME}")
############# Standalone simulator ###############
set(simu_SRCS
modeledit/node.cpp
modeledit/edge.cpp
helpers.cpp
simulator.cpp
)
set(simu_SRCS simulator.cpp )
set(simu_MOC_HDRS
modeledit/node.h
helpers.h
)
qt5_wrap_cpp(simu_SRCS ${simu_MOC_HDRS} )
if(WIN32)
list(APPEND simu_SRCS icon.rc)
endif()
add_executable(${SIMULATOR_NAME} MACOSX_BUNDLE ${WIN_EXECUTABLE_TYPE} ${simu_SRCS} ${companion_RCC})
add_dependencies(${SIMULATOR_NAME} gen_qrc)
target_link_libraries(${SIMULATOR_NAME} PRIVATE simulation common shared storage qxtcommandoptions ${PTHREAD_LIBRARY} ${SDL_LIBRARY} ${WIN_LINK_LIBRARIES})
############# Translations ####################
find_package(Lupdate)
if(LUPDATE_FOUND)
message(STATUS "Qt lupdate: " ${LUPDATE_EXECUTABLE})
add_custom_target(translations
WORKING_DIRECTORY ${COMPANION_SRC_DIRECTORY}
COMMAND ${LUPDATE_EXECUTABLE} ${CMAKE_SOURCE_DIR} -no-obsolete -ts ${companion_TS}
)
else()
message(STATUS "Qt lupdate not found, 'translations' target will not be availabe.")
endif()
add_executable(${SIMULATOR_NAME} MACOSX_BUNDLE ${WIN_EXECUTABLE_TYPE} ${simu_SRCS} ${icon_RC})
target_link_libraries(${SIMULATOR_NAME} PRIVATE simulation ${CPN_COMMON_LIB} storage ${PTHREAD_LIBRARY} ${SDL_LIBRARY} ${WIN_LINK_LIBRARIES})
############# Install ####################
@@ -348,8 +355,7 @@ if(${CMAKE_SYSTEM_NAME} MATCHES "Linux")
elseif(WIN32)
get_target_property(QtCore_LOCATION Qt5::Core LOCATION)
get_filename_component(QT_DLL_DIR ${QtCore_LOCATION} PATH)
set(QT_DLL_DIR ${QT_LIB_DIR})
set(INSTALL_TEMP_QTDLL_FILES Qt5Core Qt5Gui Qt5Widgets Qt5Xml Qt5Network Qt5PrintSupport Qt5Multimedia Qt5Svg)
set(INSTALL_TEMP_ICUDLL_FILES icudt54.dll icuin54.dll icuuc54.dll)
if(CMAKE_BUILD_TYPE STREQUAL "Debug")
@@ -428,7 +434,7 @@ if(WIN32)
set(SYSDIR "$ENV{windir}/system32")
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/../targets/windows/${COMPANION_NSI_IN_FILE} ${PROJECT_BINARY_DIR}/companion/companion.nsi @ONLY)
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/../targets/windows/${SIMULATOR_NSI_IN_FILE} ${PROJECT_BINARY_DIR}/companion/simulator.nsi @ONLY)
#configure_file(${CMAKE_CURRENT_SOURCE_DIR}/../targets/windows/${SIMULATOR_NSI_IN_FILE} ${PROJECT_BINARY_DIR}/companion/simulator.nsi @ONLY)
find_program(NSIS_EXE makensis.exe PATHS
"C:/Program Files/NSIS"
@@ -441,16 +447,16 @@ if(WIN32)
DEPENDS companion simulator opentx-simulators ${PROJECT_BINARY_DIR}/companion/companion.nsi
COMMENT "Companion Windows NSIS Installer")
add_custom_command(OUTPUT ${PROJECT_BINARY_DIR}/companion/simulator-install.exe
COMMAND "${NSIS_EXE}" ARGS ${PROJECT_BINARY_DIR}/companion/simulator.nsi
DEPENDS simulator ${PROJECT_BINARY_DIR}/companion/simulator.nsi
COMMENT "Simulator Windows NSIS Installer")
# add_custom_command(OUTPUT ${PROJECT_BINARY_DIR}/companion/simulator-install.exe
# COMMAND "${NSIS_EXE}" ARGS ${PROJECT_BINARY_DIR}/companion/simulator.nsi
# DEPENDS simulator ${PROJECT_BINARY_DIR}/companion/simulator.nsi
# COMMENT "Simulator Windows NSIS Installer")
add_custom_target(installer
DEPENDS ${PROJECT_BINARY_DIR}/companion/companion-windows.exe
DEPENDS ${PROJECT_BINARY_DIR}/companion/simulator-windows.exe
# DEPENDS ${PROJECT_BINARY_DIR}/companion/simulator-windows.exe
SOURCES ${PROJECT_BINARY_DIR}/companion/companion.nsi
SOURCES ${PROJECT_BINARY_DIR}/companion/simulator.nsi
# SOURCES ${PROJECT_BINARY_DIR}/companion/simulator.nsi
)
endif()
@@ -520,11 +526,6 @@ IF(APPLE)
install(PROGRAMS ${DFU_UTIL_ABSOLUTE_PATH} ${AVRDUDE_ABSOLUTE_PATH} DESTINATION ${companion_res_dir} COMPONENT Runtime)
set(bundle_tools_path "\${CMAKE_INSTALL_PREFIX}/${companion_res_dir}/dfu-util;\${CMAKE_INSTALL_PREFIX}/${companion_res_dir}/avrdude")
# These needs to be relative to CMAKE_INSTALL_PREFIX
get_target_property(QT_LIBRARY_DIR Qt5::Core LOCATION)
get_filename_component(QT_LIBRARY_DIR ${QT_LIBRARY_DIR} PATH)
get_filename_component(QT_LIBRARY_DIR "${QT_LIBRARY_DIR}/.." ABSOLUTE)
# Include depencies (adding frameworks, fixing the embbeded libraries)
# I get write errors without setting BU_CHMOD_BUNDLE_ITEMS even though it is
# technically a hack (that is already is in the Bundle library ...)
@@ -532,7 +533,7 @@ IF(APPLE)
include(BundleUtilities)
file(GLOB bundle_simulator_libs \"\${CMAKE_INSTALL_PREFIX}/${companion_res_dir}/libopentx-*${CMAKE_SHARED_LIBRARY_SUFFIX}\")
set(BU_CHMOD_BUNDLE_ITEMS on)
fixup_bundle(\"${APPS}\" \"\${bundle_simulator_libs};${bundle_qt_libs};${bundle_tools_path}\" \"${QT_LIBRARY_DIR}\")
fixup_bundle(\"${APPS}\" \"\${bundle_simulator_libs};${bundle_qt_libs};${bundle_tools_path}\" \"${QT_LIB_DIR}\")
file(RENAME \"\${CMAKE_INSTALL_PREFIX}/${COMPANION_NAME}.app\" \"\${CMAKE_INSTALL_PREFIX}/${COMPANION_OSX_APP_BUNDLE_NAME}.app\")
" COMPONENT Runtime)
endif()
+2 -2
View File
@@ -98,7 +98,7 @@ void AppDebugMessageHandler::messageHandler(QtMsgType type, const QMessageLogCon
qSetMessagePattern(msgPattern);
if (!m_defaultHandler || receivers(SIGNAL(messageOutput(quint8, const QString &, const QMessageLogContext &)))) {
if (!m_defaultHandler || receivers(SIGNAL(messageOutput(quint8, const QString &)))) {
#if (QT_VERSION >= QT_VERSION_CHECK(5, 4, 0))
msgPattern = qFormatLogMessage(type, context, msg);
#else
@@ -111,7 +111,7 @@ void AppDebugMessageHandler::messageHandler(QtMsgType type, const QMessageLogCon
}
#endif
emit messageOutput(lvl, msgPattern, context);
emit messageOutput(lvl, msgPattern);
}
// if (QThread::currentThread() == qApp->thread()) // gui thread
+1 -1
View File
@@ -127,7 +127,7 @@ class AppDebugMessageHandler : public QObject
bool m_showFunctionDeclarations;
signals:
void messageOutput(quint8 level, const QString & msg, const QMessageLogContext & context);
void messageOutput(quint8 level, const QString & msg);
};
// Message handler which is installed using qInstallMessageHandler. This needs to be global.
+50 -61
View File
@@ -67,7 +67,8 @@ void AppPreferencesDialog::writeValues()
g.autoCheckFw(ui->autoCheckFirmware->isChecked());
g.showSplash(ui->showSplash->isChecked());
g.simuSW(ui->simuSW->isChecked());
g.useWizard(ui->modelWizard_CB->isChecked());
g.removeModelSlots(ui->opt_removeBlankSlots->isChecked());
g.newModelAction(ui->opt_newMdl_useWizard->isChecked() ? 1 : ui->opt_newMdl_useEditor->isChecked() ? 2 : 0);
g.historySize(ui->historySize->value());
g.backLight(ui->backLightColor->currentIndex());
g.profile[g.id()].volumeGain(round(ui->volumeGain->value() * 10.0));
@@ -77,7 +78,7 @@ void AppPreferencesDialog::writeValues()
g.enableBackup(ui->backupEnable->isChecked());
if (ui->joystickChkB ->isChecked() && ui->joystickCB->isEnabled()) {
g.jsSupport(ui->joystickChkB ->isChecked());
g.jsSupport(ui->joystickChkB ->isChecked());
g.jsCtrl(ui->joystickCB ->currentIndex());
}
else {
@@ -100,12 +101,13 @@ void AppPreferencesDialog::writeValues()
g.profile[g.id()].name(ui->profileNameLE->text());
// If a new fw type has been choosen, several things need to reset
current_firmware_variant = getFirmwareVariant();
QString id = current_firmware_variant->getId();
Firmware::setCurrentVariant(getFirmwareVariant());
QString id = Firmware::getCurrentVariant()->getId();
if (g.profile[g.id()].fwType() != id) {
g.profile[g.id()].fwName("");
g.profile[g.id()].initFwVariables();
g.profile[g.id()].fwType(id);
emit firmwareProfileChanged(g.id());
}
}
@@ -148,7 +150,10 @@ void AppPreferencesDialog::initSettings()
}
ui->simuSW->setChecked(g.simuSW());
ui->modelWizard_CB->setChecked(g.useWizard());
ui->opt_removeBlankSlots->setChecked(g.removeModelSlots());
ui->opt_newMdl_useNone->setChecked(g.newModelAction() == 0);
ui->opt_newMdl_useWizard->setChecked(g.newModelAction() == 1);
ui->opt_newMdl_useEditor->setChecked(g.newModelAction() == 2);
ui->libraryPath->setText(g.libDir());
ui->ge_lineedit->setText(g.gePath());
@@ -193,7 +198,7 @@ void AppPreferencesDialog::initSettings()
ui->joystickCB->setDisabled(true);
ui->joystickcalButton->setDisabled(true);
}
#endif
#endif
// Profile Tab Inits
ui->channelorderCB->setCurrentIndex(g.profile[g.id()].channelOrder());
ui->stickmodeCB->setCurrentIndex(g.profile[g.id()].defaultMode());
@@ -213,7 +218,6 @@ void AppPreferencesDialog::initSettings()
}
ui->profileNameLE->setText(g.profile[g.id()].name());
ui->SplashFileName->setText(g.profile[g.id()].splashFile());
QString hwSettings;
if (g.profile[g.id()].stickPotCalib() == "" ) {
@@ -228,31 +232,14 @@ void AppPreferencesDialog::initSettings()
}
ui->lblGeneralSettings->setText(hwSettings);
Firmware * current_firmware = getCurrentFirmware();
if (!IS_HORUS(current_firmware->getBoard())) {
displayImage(g.profile[g.id()].splashFile());
}
// TODO: Remove once splash replacement supported on Horus
// NOTE: 480x272 image causes issues on screens <800px high, needs a solution like scrolling once reinstated
else {
ui->imageLabel->hide();
ui->splashLabel->hide();
ui->SplashFileName->hide();
ui->SplashSelect->hide();
ui->SplashSelect->setEnabled(false);
ui->clearImageButton->hide();
ui->clearImageButton->setEnabled(false);
ui->splashSeparator->hide();
}
foreach(Firmware * firmware, firmwares) {
QString currType = QStringList(g.profile[g.id()].fwType().split('-').mid(0, 2)).join('-');
foreach(Firmware * firmware, Firmware::getRegisteredFirmwares()) {
ui->downloadVerCB->addItem(firmware->getName(), firmware->getId());
if (current_firmware->getFirmwareBase() == firmware) {
if (currType == firmware->getId()) {
ui->downloadVerCB->setCurrentIndex(ui->downloadVerCB->count() - 1);
}
}
baseFirmwareChanged();
}
@@ -306,7 +293,7 @@ void AppPreferencesDialog::on_ge_pathButton_clicked()
ui->ge_lineedit->setText(fileName);
}
}
#if defined(JOYSTICKS)
void AppPreferencesDialog::on_joystickChkB_clicked() {
if (ui->joystickChkB->isChecked()) {
@@ -350,27 +337,18 @@ void AppPreferencesDialog::on_sdPathButton_clicked()
}
}
void AppPreferencesDialog::on_removeProfileButton_clicked()
{
if ( g.id() == 0 ) {
QMessageBox::information(this, tr("Not possible to remove profile"), tr("The default profile can not be removed."));
}
else {
g.profile[g.id()].remove();
g.id( 0 );
initSettings();
}
}
bool AppPreferencesDialog::displayImage(const QString & fileName)
{
// Start by clearing the label
ui->imageLabel->clear();
QImage image(fileName);
if (image.isNull())
if (fileName.isEmpty())
return false;
QImage image(fileName);
if (image.isNull())
return false;
ui->imageLabel->setPixmap(makePixMap(image));
ui->imageLabel->setFixedSize(getCurrentFirmware()->getCapability(LcdWidth), getCurrentFirmware()->getCapability(LcdHeight));
return true;
@@ -388,7 +366,7 @@ void AppPreferencesDialog::on_SplashSelect_clicked()
if (!fileName.isEmpty()){
g.imagesDir(QFileInfo(fileName).dir().absolutePath());
displayImage(fileName);
ui->SplashFileName->setText(fileName);
}
@@ -405,14 +383,13 @@ void AppPreferencesDialog::showVoice(bool show)
{
ui->voiceLabel->setVisible(show);
ui->voiceCombo->setVisible(show);
QTimer::singleShot(0, this, SLOT(shrink()));
}
void AppPreferencesDialog::baseFirmwareChanged()
{
QVariant selected_firmware = ui->downloadVerCB->itemData(ui->downloadVerCB->currentIndex());
QString selected_firmware = ui->downloadVerCB->currentData().toString();
foreach(Firmware * firmware, firmwares) {
foreach(Firmware * firmware, Firmware::getRegisteredFirmwares()) {
if (firmware->getId() == selected_firmware) {
populateFirmwareOptions(firmware);
break;
@@ -422,31 +399,31 @@ void AppPreferencesDialog::baseFirmwareChanged()
Firmware * AppPreferencesDialog::getFirmwareVariant()
{
QVariant selected_firmware = ui->downloadVerCB->itemData(ui->downloadVerCB->currentIndex());
QString selected_firmware = ui->downloadVerCB->currentData().toString();
foreach(Firmware * firmware, firmwares) {
foreach(Firmware * firmware, Firmware::getRegisteredFirmwares()) {
QString id = firmware->getId();
if (id == selected_firmware) {
foreach(QCheckBox *cb, optionsCheckBoxes) {
if (cb->isChecked()) {
id += QString("-") + cb->text();
id += "-" + cb->text();
}
}
if (voice && voice->isChecked()) {
id += QString("-tts") + ui->voiceCombo->currentText();
id += "-tts" + ui->voiceCombo->currentText();
}
if (ui->langCombo->count()) {
id += QString("-") + ui->langCombo->currentText();
id += "-" + ui->langCombo->currentText();
}
return getFirmware(id);
return Firmware::getFirmwareForId(id);
}
}
// Should never occur...
return default_firmware_variant;
return Firmware::getDefaultVariant();
}
void AppPreferencesDialog::firmwareOptionChanged(bool state)
@@ -457,8 +434,8 @@ void AppPreferencesDialog::firmwareOptionChanged(bool state)
}
Firmware * firmware=NULL;
if (cb && state) {
QVariant selected_firmware = ui->downloadVerCB->itemData(ui->downloadVerCB->currentIndex());
foreach(firmware, firmwares) {
QVariant selected_firmware = ui->downloadVerCB->currentData();
foreach(firmware, Firmware::getRegisteredFirmwares()) {
if (firmware->getId() == selected_firmware) {
foreach(QList<Option> opts, firmware->opts) {
foreach(Option opt, opts) {
@@ -478,7 +455,7 @@ void AppPreferencesDialog::firmwareOptionChanged(bool state)
}
}
}
}
}
}
void AppPreferencesDialog::populateFirmwareOptions(const Firmware * firmware)
@@ -487,7 +464,7 @@ void AppPreferencesDialog::populateFirmwareOptions(const Firmware * firmware)
updateLock = true;
QString id = current_firmware_variant->getId();
QString id = Firmware::getCurrentVariant()->getId();
ui->langCombo->clear();
foreach(const char *lang, parent->languages) {
ui->langCombo->addItem(lang);
@@ -542,12 +519,24 @@ void AppPreferencesDialog::populateFirmwareOptions(const Firmware * firmware)
showVoice(voice && voice->isChecked());
// TODO: Remove once splash replacement supported on Horus
// NOTE: 480x272 image causes issues on screens <800px high, needs a solution like scrolling once reinstated
if (IS_HORUS(parent->getBoard())) {
ui->widget_splashImage->hide();
ui->SplashFileName->setText("");
}
else {
ui->widget_splashImage->show();
ui->SplashFileName->setText(g.profile[g.id()].splashFile());
displayImage(g.profile[g.id()].splashFile());
}
updateLock = false;
QTimer::singleShot(0, this, SLOT(shrink()));
QTimer::singleShot(50, this, SLOT(shrink()));
}
void AppPreferencesDialog::shrink()
{
resize(0,0);
adjustSize();
}
+3 -1
View File
@@ -40,6 +40,9 @@ class AppPreferencesDialog : public QDialog
~AppPreferencesDialog();
Joystick * joystick;
signals:
void firmwareProfileChanged(int profId);
private:
QList<QCheckBox *> optionsCheckBoxes;
bool updateLock;
@@ -69,7 +72,6 @@ class AppPreferencesDialog : public QDialog
void on_ge_pathButton_clicked();
void on_sdPathButton_clicked();
void on_removeProfileButton_clicked();
void on_SplashSelect_clicked();
void on_clearImageButton_clicked();
File diff suppressed because it is too large Load Diff
+170 -48
View File
@@ -21,92 +21,156 @@
#include "boards.h"
#include "macros.h"
// TODO remove all those constants
// Update: These are now all only used within this class.
// External access is only via getEEpromSize() and getFlashSize()
#define EESIZE_STOCK 2048
#define EESIZE_M128 4096
#define EESIZE_GRUVIN9X 4096
#define EESIZE_TARANIS (32*1024)
#define EESIZE_SKY9X (128*4096)
#define EESIZE_9XRPRO (128*4096)
#define EESIZE_MAX EESIZE_9XRPRO
// getFlashSize() (and these macros) is only used by radiointerface::getDfuArgs (perhaps can find a better way?)
#define FSIZE_STOCK (64*1024)
#define FSIZE_M128 (128*1024)
#define FSIZE_GRUVIN9X (256*1024)
#define FSIZE_TARANIS (512*1024)
#define FSIZE_SKY9X (256*1024)
#define FSIZE_9XRPRO (512*1024)
#define FSIZE_HORUS (2048*1024)
#define FSIZE_MAX FSIZE_HORUS
using namespace Board;
int getEEpromSize(Board::Type board)
void Boards::setBoardType(const Type & board)
{
if (board >= BOARD_UNKNOWN && board < BOARD_ENUM_COUNT)
m_boardType = board;
else
m_boardType = BOARD_UNKNOWN;
}
const int Boards::getEEpromSize(Board::Type board)
{
switch (board) {
case Board::BOARD_STOCK:
case BOARD_STOCK:
return EESIZE_STOCK;
case Board::BOARD_M128:
case BOARD_M128:
return EESIZE_M128;
case Board::BOARD_MEGA2560:
case Board::BOARD_GRUVIN9X:
case BOARD_MEGA2560:
case BOARD_GRUVIN9X:
return EESIZE_GRUVIN9X;
case Board::BOARD_SKY9X:
case BOARD_SKY9X:
return EESIZE_SKY9X;
case Board::BOARD_9XRPRO:
case Board::BOARD_AR9X:
case BOARD_9XRPRO:
case BOARD_AR9X:
return EESIZE_9XRPRO;
case Board::BOARD_TARANIS_X7:
case Board::BOARD_TARANIS_X9D:
case Board::BOARD_TARANIS_X9DP:
case Board::BOARD_TARANIS_X9E:
case Board::BOARD_FLAMENCO:
case BOARD_TARANIS_X7:
case BOARD_TARANIS_X9D:
case BOARD_TARANIS_X9DP:
case BOARD_TARANIS_X9E:
case BOARD_FLAMENCO:
return EESIZE_TARANIS;
case BOARD_UNKNOWN:
return EESIZE_MAX;
default:
return 0; // unlimited
}
}
Board::SwitchInfo getSwitchInfo(Board::Type board, unsigned index)
const int Boards::getFlashSize(Type board)
{
switch (board) {
case BOARD_STOCK:
return FSIZE_STOCK;
case BOARD_M128:
return FSIZE_M128;
case BOARD_MEGA2560:
case BOARD_GRUVIN9X:
return FSIZE_GRUVIN9X;
case BOARD_SKY9X:
return FSIZE_SKY9X;
case BOARD_9XRPRO:
case BOARD_AR9X:
return FSIZE_9XRPRO;
case BOARD_TARANIS_X9D:
case BOARD_TARANIS_X9DP:
case BOARD_TARANIS_X9E:
case BOARD_FLAMENCO:
return FSIZE_TARANIS;
case BOARD_X12S:
case BOARD_X10:
return FSIZE_HORUS;
case BOARD_UNKNOWN:
return FSIZE_MAX;
default:
return 0;
}
}
const SwitchInfo Boards::getSwitchInfo(Board::Type board, unsigned index)
{
if (IS_TARANIS_X7(board)) {
const Board::SwitchInfo switches[] = {
{Board::SWITCH_3POS, "SA"},
{Board::SWITCH_3POS, "SB"},
{Board::SWITCH_3POS, "SC"},
{Board::SWITCH_3POS, "SD"},
{Board::SWITCH_2POS, "SF"},
{Board::SWITCH_TOGGLE, "SH"}
{SWITCH_3POS, "SA"},
{SWITCH_3POS, "SB"},
{SWITCH_3POS, "SC"},
{SWITCH_3POS, "SD"},
{SWITCH_2POS, "SF"},
{SWITCH_TOGGLE, "SH"}
};
if (index < DIM(switches))
return switches[index];
}
else if (IS_HORUS_OR_TARANIS(board)) {
const Board::SwitchInfo switches[] = {
{Board::SWITCH_3POS, "SA"},
{Board::SWITCH_3POS, "SB"},
{Board::SWITCH_3POS, "SC"},
{Board::SWITCH_3POS, "SD"},
{Board::SWITCH_3POS, "SE"},
{Board::SWITCH_2POS, "SF"},
{Board::SWITCH_3POS, "SG"},
{Board::SWITCH_TOGGLE, "SH"},
{Board::SWITCH_3POS, "SI"},
{Board::SWITCH_3POS, "SJ"},
{Board::SWITCH_3POS, "SK"},
{Board::SWITCH_3POS, "SL"},
{Board::SWITCH_3POS, "SM"},
{Board::SWITCH_3POS, "SN"},
{Board::SWITCH_3POS, "SO"},
{Board::SWITCH_3POS, "SP"},
{Board::SWITCH_3POS, "SQ"},
{Board::SWITCH_3POS, "SR"}
{SWITCH_3POS, "SA"},
{SWITCH_3POS, "SB"},
{SWITCH_3POS, "SC"},
{SWITCH_3POS, "SD"},
{SWITCH_3POS, "SE"},
{SWITCH_2POS, "SF"},
{SWITCH_3POS, "SG"},
{SWITCH_TOGGLE, "SH"},
{SWITCH_3POS, "SI"},
{SWITCH_3POS, "SJ"},
{SWITCH_3POS, "SK"},
{SWITCH_3POS, "SL"},
{SWITCH_3POS, "SM"},
{SWITCH_3POS, "SN"},
{SWITCH_3POS, "SO"},
{SWITCH_3POS, "SP"},
{SWITCH_3POS, "SQ"},
{SWITCH_3POS, "SR"}
};
if (index < DIM(switches))
return switches[index];
}
else {
const Board::SwitchInfo switches[] = {
{Board::SWITCH_2POS, "THR"},
{Board::SWITCH_2POS, "RUD"},
{Board::SWITCH_2POS, "ELE"},
{Board::SWITCH_3POS, "3POS"},
{Board::SWITCH_2POS, "AIL"},
{Board::SWITCH_2POS, "GEA"},
{Board::SWITCH_TOGGLE, "TRN"}
{SWITCH_2POS, "THR"},
{SWITCH_2POS, "RUD"},
{SWITCH_2POS, "ELE"},
{SWITCH_3POS, "3POS"},
{SWITCH_2POS, "AIL"},
{SWITCH_2POS, "GEA"},
{SWITCH_TOGGLE, "TRN"}
};
if (index < DIM(switches))
return switches[index];
}
return {Board::SWITCH_NOT_AVAILABLE, "???"};
return {SWITCH_NOT_AVAILABLE, "???"};
}
int getBoardCapability(Board::Type board, Board::Capability capability)
const int Boards::getCapability(Board::Type board, Board::Capability capability)
{
switch (capability) {
case Sticks:
return 4;
case Pots:
if (IS_HORUS(board))
return 3;
@@ -147,14 +211,72 @@ int getBoardCapability(Board::Type board, Board::Capability capability)
return 8;
else
return 7;
case SwitchPositions:
if (IS_HORUS_OR_TARANIS(board))
return getCapability(board, Switches) * 3;
else
return 9;
case NumTrims:
if (IS_HORUS(board))
return 6;
else
return 4;
case NumTrimSwitches:
return getBoardCapability(board, NumTrims) * 2;
return getCapability(board, NumTrims) * 2;
}
return 0;
}
const QString Boards::getAxisName(int index)
{
const QString axes[] = {
QObject::tr("Left Horizontal"),
QObject::tr("Left Vertical"),
QObject::tr("Right Vertical"),
QObject::tr("Right Horizontal"),
QObject::tr("Aux. 1"),
QObject::tr("Aux. 2"),
};
if (index < (int)DIM(axes))
return axes[index];
else
return QObject::tr("Unknown");
}
/* Currently unused
const QString Boards::getBoardName(Board::Type board)
{
switch (board) {
case BOARD_STOCK:
return "9X";
case BOARD_M128:
return "9X128";
case BOARD_GRUVIN9X:
return "Gruvin9x";
case BOARD_MEGA2560:
return "MEGA2560";
case BOARD_TARANIS_X7:
return "Taranis X7";
case BOARD_TARANIS_X9D:
return "Taranis X9D";
case BOARD_TARANIS_X9DP:
return "Taranis X9D+";
case BOARD_TARANIS_X9E:
return "Taranis X9E";
case BOARD_SKY9X:
return "Sky9x";
case BOARD_9XRPRO:
return "9XR-PRO";
case BOARD_AR9X:
return "AR9X";
case BOARD_X12S:
return "Horus";
case BOARD_X10:
return "X10";
default:
return QObject::tr("Unknown");
}
}
*/
+83 -32
View File
@@ -21,13 +21,17 @@
#ifndef _BOARDS_H_
#define _BOARDS_H_
#include <QObject>
#include <QString>
// TODO create a Board class with all these functions
namespace Board {
enum Type
{
BOARD_STOCK,
BOARD_UNKNOWN = -1,
BOARD_STOCK = 0,
BOARD_M128,
BOARD_MEGA2560,
BOARD_GRUVIN9X,
@@ -41,7 +45,7 @@ namespace Board {
BOARD_FLAMENCO,
BOARD_X12S,
BOARD_X10,
BOARD_UNKNOWN = -1
BOARD_ENUM_COUNT
};
enum PotType
@@ -66,10 +70,57 @@ namespace Board {
SWITCH_3POS
};
enum StickAxes {
STICK_AXIS_LH = 0,
STICK_AXIS_LV,
STICK_AXIS_RV,
STICK_AXIS_RH,
STICK_AXIS_COUNT
};
enum TrimAxes {
TRIM_AXIS_LH = 0,
TRIM_AXIS_LV,
TRIM_AXIS_RV,
TRIM_AXIS_RH,
TRIM_AXIS_T5,
TRIM_AXIS_T6,
TRIM_AXIS_COUNT
};
enum TrimSwitches
{
TRIM_SW_LH_DEC,
TRIM_SW_LH_INC,
TRIM_SW_LV_DEC,
TRIM_SW_LV_INC,
TRIM_SW_RV_DEC,
TRIM_SW_RV_INC,
TRIM_SW_RH_DEC,
TRIM_SW_RH_INC,
TRIM_SW_T5_DEC,
TRIM_SW_T5_INC,
TRIM_SW_T6_DEC,
TRIM_SW_T6_INC,
TRIM_SW_COUNT
};
enum Capability {
Sticks,
Pots,
Sliders,
MouseAnalogs,
Switches,
SwitchPositions,
FactoryInstalledSwitches,
NumTrims,
NumTrimSwitches
};
struct SwitchInfo
{
SwitchType config;
const char * name;
QString name;
};
struct SwitchPosition {
@@ -82,40 +133,40 @@ namespace Board {
unsigned int position;
};
enum Capability {
Pots,
Sliders,
MouseAnalogs,
Switches,
FactoryInstalledSwitches,
NumTrims,
NumTrimSwitches
};
}
// TODO remove all those constants
#define EESIZE_STOCK 2048
#define EESIZE_M128 4096
#define EESIZE_GRUVIN9X 4096
#define EESIZE_TARANIS (32*1024)
#define EESIZE_SKY9X (128*4096)
#define EESIZE_9XRPRO (128*4096)
#define EESIZE_MAX EESIZE_9XRPRO
class Boards
{
public:
// TODO remove all those constants
#define FSIZE_STOCK (64*1024)
#define FSIZE_M128 (128*1024)
#define FSIZE_GRUVIN9X (256*1024)
#define FSIZE_TARANIS (512*1024)
#define FSIZE_SKY9X (256*1024)
#define FSIZE_9XRPRO (512*1024)
#define FSIZE_HORUS (2048*1024)
#define FSIZE_MAX FSIZE_HORUS
Boards(Board::Type board)
{
setBoardType(board);
}
int getEEpromSize(Board::Type board);
Board::SwitchInfo getSwitchInfo(Board::Type board, unsigned index);
void setBoardType(const Board::Type & board);
Board::Type getBoardType() const { return m_boardType; }
int getBoardCapability(Board::Type board, Board::Capability capability);
const int getEEpromSize() { return getEEpromSize(m_boardType); }
const int getFlashSize() { return getFlashSize(m_boardType); }
const Board::SwitchInfo getSwitchInfo(unsigned index) { return getSwitchInfo(m_boardType, index); }
const int getCapability(Board::Capability capability) { return getCapability(m_boardType, capability); }
static const int getEEpromSize(Board::Type board);
static const int getFlashSize(Board::Type board);
static const Board::SwitchInfo getSwitchInfo(Board::Type board, unsigned index);
static const int getCapability(Board::Type board, Board::Capability capability);
static const QString getAxisName(int index);
protected:
Board::Type m_boardType;
};
// temporary aliases for transition period, use Boards class instead.
#define getBoardCapability(b__, c__) Boards::getCapability(b__, c__)
#define getEEpromSize(b__) Boards::getEEpromSize(b__)
#define getSwitchInfo(b__, i__) Boards::getSwitchInfo(b__, i__)
#define IS_9X(board) (board==Board::BOARD_STOCK || board==Board::BOARD_M128)
#define IS_STOCK(board) (board==Board::BOARD_STOCK)
+5
View File
@@ -125,6 +125,11 @@ void burnConfigDialog::getSettings()
sambaLoc = "/usr/local/bin/sam-ba";
if ( dfuLoc.isEmpty())
dfuLoc = QFileInfo(QApplication::applicationDirPath() + "/../Resources/dfu-util").absoluteFilePath();
#elif defined __FreeBSD__
if (avrLoc.isEmpty())
avrLoc = "/usr/local/bin/avrdude";
if (dfuLoc.isEmpty())
dfuLoc = "/usr/local/bin/dfu-util";
#else
if ( avrLoc.isEmpty())
avrLoc = "/usr/bin/avrdude";
+13 -15
View File
@@ -19,8 +19,6 @@
*/
#include <QApplication>
#include <QTranslator>
#include <QDir>
#include <QSplashScreen>
#if defined(JOYSTICKS) || defined(SIMU_AUDIO)
#include <SDL.h>
@@ -28,10 +26,12 @@
#endif
#include "appdebugmessagehandler.h"
#include "customdebug.h"
#include "mainwindow.h"
#include "version.h"
#include "appdata.h"
#include "storage.h"
#include "translations.h"
#ifdef __APPLE__
#include <QProxyStyle>
@@ -50,9 +50,8 @@ class MyProxyStyle : public QProxyStyle
int main(int argc, char *argv[])
{
Q_INIT_RESOURCE(companion);
#if (QT_VERSION >= QT_VERSION_CHECK(5, 6, 0))
/* From doc: This attribute must be set before Q(Gui)Application is constructed. */
QApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
#endif
@@ -62,9 +61,13 @@ int main(int argc, char *argv[])
app.setOrganizationDomain(COMPANY_DOMAIN);
app.setAttribute(Qt::AA_DontShowIconsInMenus, false);
Q_INIT_RESOURCE(companion);
if (AppDebugMessageHandler::instance())
AppDebugMessageHandler::instance()->installAppMessageHandler();
CustomDebug::setFilterRules();
g.init();
QStringList strl = QApplication::arguments();
@@ -78,12 +81,7 @@ int main(int argc, char *argv[])
app.setStyle(new MyProxyStyle);
#endif
QTranslator companionTranslator;
companionTranslator.load(":/companion_" + g.locale());
QTranslator qtTranslator;
qtTranslator.load((QString)"qt_" + g.locale().left(2), QLibraryInfo::location(QLibraryInfo::TranslationsPath));
app.installTranslator(&companionTranslator);
app.installTranslator(&qtTranslator);
Translations::installTranslators();
// QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));
@@ -102,10 +100,10 @@ int main(int argc, char *argv[])
registerStorageFactories();
registerOpenTxFirmwares();
registerSimulators();
SimulatorLoader::registerSimulators();
if (g.profile[g.id()].fwType().isEmpty()){
g.profile[g.id()].fwType(default_firmware_variant->getId());
g.profile[g.id()].fwType(Firmware::getDefaultVariant()->getId());
g.profile[g.id()].fwName("");
}
@@ -115,7 +113,7 @@ int main(int argc, char *argv[])
QPixmap pixmap = QPixmap(splashScreen);
QSplashScreen *splash = new QSplashScreen(pixmap);
current_firmware_variant = getFirmware(g.profile[g.id()].fwType());
Firmware::setCurrentVariant(Firmware::getFirmwareForId(g.profile[g.id()].fwType()));
MainWindow *mainWin = new MainWindow();
if (g.showSplash()) {
@@ -132,9 +130,9 @@ int main(int argc, char *argv[])
delete splash;
delete mainWin;
unregisterSimulators();
SimulatorLoader::unregisterSimulators();
unregisterOpenTxFirmwares();
unregisterEEpromInterfaces();
unregisterStorageFactories();
#if defined(JOYSTICKS) || defined(SIMU_AUDIO)
SDL_Quit();
+25 -2
View File
@@ -3,7 +3,6 @@
<file>images/customize.png</file>
<file>icon.png</file>
<file>../../CREDITS.txt</file>
<file>../../DONATIONS.txt</file>
<file>../releasenotes.txt</file>
<file>images/screenshot.png</file>
<file>images/splash.png</file>
@@ -12,26 +11,42 @@
<file>images/track.png</file>
<file>images/track0.png</file>
<file>images/taranison.png</file>
<file>images/simulator/icons/svg/arrow_click.svg</file>
<file>images/simulator/icons/svg/camera.svg</file>
<file>images/simulator/icons/svg/camera-active.svg</file>
<file>images/simulator/icons/svg/console.svg</file>
<file>images/simulator/icons/svg/console-active.svg</file>
<file>images/simulator/icons/svg/eraser.svg</file>
<file>images/simulator/icons/svg/eraser-active.svg</file>
<file>images/simulator/icons/svg/fixed_x.svg</file>
<file>images/simulator/icons/svg/fixed_x-on.svg</file>
<file>images/simulator/icons/svg/fixed_y.svg</file>
<file>images/simulator/icons/svg/fixed_y-on.svg</file>
<file>images/simulator/icons/svg/folder_open.svg</file>
<file>images/simulator/icons/svg/hold_x.svg</file>
<file>images/simulator/icons/svg/hold_x-on.svg</file>
<file>images/simulator/icons/svg/hold_y.svg</file>
<file>images/simulator/icons/svg/hold_y-on.svg</file>
<file>images/simulator/icons/svg/info.svg</file>
<file>images/simulator/icons/svg/info-active.svg</file>
<file>images/simulator/icons/svg/joystick_settings.svg</file>
<file>images/simulator/icons/svg/joystick_settings-active.svg</file>
<file>images/simulator/icons/svg/line_horiz.svg</file>
<file>images/simulator/icons/svg/mouse.svg</file>
<file>images/simulator/icons/svg/toggle_lock.svg</file>
<file>images/simulator/icons/svg/toggle_lock-on.svg</file>
<file>images/simulator/icons/svg/radio_outputs.svg</file>
<file>images/simulator/icons/svg/radio_outputs-active.svg</file>
<file>images/simulator/icons/svg/reload_script.svg</file>
<file>images/simulator/icons/svg/reload_script-active.svg</file>
<file>images/simulator/icons/svg/restart.svg</file>
<file>images/simulator/icons/svg/restart-active.svg</file>
<file>images/simulator/icons/svg/telemetry.svg</file>
<file>images/simulator/icons/svg/telemetry-active.svg</file>
<file>images/simulator/icons/svg/trainer.svg</file>
<file>images/simulator/icons/svg/trainer-active.svg</file>
<file>images/simulator/icons/svg/word_wrap.svg</file>
<file>images/simulator/icons/svg/word_wrap-active.svg</file>
<file>images/simulator/icons/svg/word_wrap-on.svg</file>
<file>images/simulator/Horus/middle.png</file>
<file>images/simulator/Horus/left.png</file>
<file>images/simulator/Horus/right.png</file>
@@ -604,6 +619,7 @@
<file>themes/monoblue/16/contributors.png</file>
<file>themes/monoblue/16/stop.png</file>
<file>themes/monoblue/16/write_eeprom.png</file>
<file>themes/monoblue/16/sdsync.png</file>
<file>themes/monoblue/24/paintbrush.png</file>
<file>themes/monoblue/24/open.png</file>
<file>themes/monoblue/24/edit.png</file>
@@ -647,6 +663,7 @@
<file>themes/monoblue/24/contributors.png</file>
<file>themes/monoblue/24/stop.png</file>
<file>themes/monoblue/24/write_eeprom.png</file>
<file>themes/monoblue/24/sdsync.png</file>
<file>themes/monoblue/32/paintbrush.png</file>
<file>themes/monoblue/32/open.png</file>
<file>themes/monoblue/32/edit.png</file>
@@ -690,6 +707,7 @@
<file>themes/monoblue/32/contributors.png</file>
<file>themes/monoblue/32/stop.png</file>
<file>themes/monoblue/32/write_eeprom.png</file>
<file>themes/monoblue/32/sdsync.png</file>
<file>themes/monoblue/48/paintbrush.png</file>
<file>themes/monoblue/48/open.png</file>
<file>themes/monoblue/48/edit.png</file>
@@ -733,6 +751,7 @@
<file>themes/monoblue/48/contributors.png</file>
<file>themes/monoblue/48/stop.png</file>
<file>themes/monoblue/48/write_eeprom.png</file>
<file>themes/monoblue/48/sdsync.png</file>
<file>themes/monowhite/16/paintbrush.png</file>
<file>themes/monowhite/16/open.png</file>
<file>themes/monowhite/16/edit.png</file>
@@ -776,6 +795,7 @@
<file>themes/monowhite/16/contributors.png</file>
<file>themes/monowhite/16/stop.png</file>
<file>themes/monowhite/16/write_eeprom.png</file>
<file>themes/monowhite/16/sdsync.png</file>
<file>themes/monowhite/24/paintbrush.png</file>
<file>themes/monowhite/24/open.png</file>
<file>themes/monowhite/24/edit.png</file>
@@ -819,6 +839,7 @@
<file>themes/monowhite/24/contributors.png</file>
<file>themes/monowhite/24/stop.png</file>
<file>themes/monowhite/24/write_eeprom.png</file>
<file>themes/monowhite/24/sdsync.png</file>
<file>themes/monowhite/32/paintbrush.png</file>
<file>themes/monowhite/32/open.png</file>
<file>themes/monowhite/32/edit.png</file>
@@ -862,6 +883,7 @@
<file>themes/monowhite/32/contributors.png</file>
<file>themes/monowhite/32/stop.png</file>
<file>themes/monowhite/32/write_eeprom.png</file>
<file>themes/monowhite/32/sdsync.png</file>
<file>themes/monowhite/48/paintbrush.png</file>
<file>themes/monowhite/48/open.png</file>
<file>themes/monowhite/48/edit.png</file>
@@ -905,6 +927,7 @@
<file>themes/monowhite/48/contributors.png</file>
<file>themes/monowhite/48/stop.png</file>
<file>themes/monowhite/48/write_eeprom.png</file>
<file>themes/monowhite/48/sdsync.png</file>
<file>themes/yerico/16/paintbrush.png</file>
<file>themes/yerico/16/open.png</file>
<file>themes/yerico/16/edit.png</file>
+91 -58
View File
@@ -20,42 +20,46 @@
#include "comparedialog.h"
#include "ui_comparedialog.h"
#include "appdata.h"
#include "helpers.h"
#include "modelslist.h"
#include <QPrinter>
#include <QPrintDialog>
class DragDropHeader {
public:
DragDropHeader():
general_settings(false),
models_count(0)
{
}
bool general_settings;
uint8_t models_count;
uint8_t models[CPN_MAX_MODELS];
};
//class DragDropHeader {
// public:
// DragDropHeader():
// general_settings(false),
// models_count(0)
// {
// }
// bool general_settings;
// uint8_t models_count;
// uint8_t models[CPN_MAX_MODELS];
//};
CompareDialog::CompareDialog(QWidget * parent, Firmware * firmware):
QDialog(parent, Qt::WindowTitleHint | Qt::WindowSystemMenuHint),
multimodelprinter(firmware),
model1Valid(false),
model2Valid(false),
QDialog(parent, Qt::Window),
multimodelprinter(new MultiModelPrinter(firmware)),
ui(new Ui::CompareDialog)
{
ui->setupUi(this);
setWindowIcon(CompanionIcon("compare.png"));
setAcceptDrops(true);
if (!g.compareWinGeo().isEmpty()) {
restoreGeometry(g.compareWinGeo());
}
}
//setDragDropOverwriteMode(true);
//setDropIndicatorShown(true);
// TODO scroll to top ... ui->textEdit->scrollToAnchor("1");
CompareDialog::~CompareDialog()
{
delete multimodelprinter;
delete ui;
}
void CompareDialog::dragMoveEvent(QDragMoveEvent * event)
{
if (event->mimeData()->hasFormat("application/x-companion")) {
if (event->mimeData()->hasFormat("application/x-companion-modeldata")) {
event->acceptProposedAction();
}
else {
@@ -65,8 +69,7 @@ void CompareDialog::dragMoveEvent(QDragMoveEvent * event)
void CompareDialog::dragEnterEvent(QDragEnterEvent * event)
{
// accept just text/uri-list mime format
if (event->mimeData()->hasFormat("application/x-companion")) {
if (event->mimeData()->hasFormat("application/x-companion-modeldata")) {
event->acceptProposedAction();
}
else {
@@ -79,55 +82,85 @@ void CompareDialog::dragLeaveEvent(QDragLeaveEvent * event)
event->accept();
}
bool CompareDialog::handleDroppedModel(const QMimeData * mimeData, ModelData & model, QLabel * label)
bool CompareDialog::handleMimeData(const QMimeData * mimeData)
{
if (mimeData->hasFormat("application/x-companion")) {
QByteArray gmData = mimeData->data("application/x-companion");
DragDropHeader * header = (DragDropHeader *)gmData.data();
if (!header->general_settings) {
char * gData = gmData.data() + sizeof(DragDropHeader);
if (gData[0] == 'M') {
ModelData * modeltemp = (ModelData *)(gData + 1);
if (modeltemp->used) {
memcpy(&model, modeltemp, sizeof(ModelData));
QString name(model.name);
if (!name.isEmpty())
label->setText(name);
else
label->setText(tr("No name"));
return true;
}
}
}
QVector<ModelData> mList;
GeneralSettings gs;
if (!TreeModel::decodeMimeData(mimeData, &mList, &gs) || mList.isEmpty())
return false;
for (int i=0; i < mList.size(); ++i) {
GMData data;
data.model = mList[i];
data.gs = gs;
modelsList.append(data);
}
return false;
return true;
}
void CompareDialog::closeEvent(QCloseEvent * event)
{
g.compareWinGeo(saveGeometry());
}
void CompareDialog::dropEvent(QDropEvent *event)
{
QLabel * child = qobject_cast<QLabel*>(childAt(event->pos()));
if (!child) return;
if (child->objectName().contains("label_1")) {
model1Valid = handleDroppedModel(event->mimeData(), model1, ui->label_1);
}
else if (child->objectName().contains("label_2")) {
model2Valid = handleDroppedModel(event->mimeData(), model2, ui->label_2);
}
event->accept();
if (model1Valid && model2Valid) {
multimodelprinter.setModel(0, model1);
multimodelprinter.setModel(1, model2);
ui->textEdit->setHtml(multimodelprinter.print(ui->textEdit->document()));
if (handleMimeData(event->mimeData())) {
event->accept();
compare();
}
}
void CompareDialog::closeEvent(QCloseEvent *event)
void CompareDialog::compare()
{
QLayoutItem *child;
while ((child = ui->layout_modelNames->takeAt(0))) {
if (child->widget())
delete child->widget();
delete child;
}
multimodelprinter->clearModels();
ui->textEdit->clear();
for (int i=0; i < modelsList.size(); ++i) {
multimodelprinter->setModel(i, &modelsList[i].model, &modelsList[i].gs);
QString name(modelsList.at(i).model.name);
if (name.isEmpty())
name = tr("Unnamed Model %1").arg(i+1);
QWidget * hdr = new QWidget(this);
hdr->setLayout(new QHBoxLayout());
hdr->layout()->setContentsMargins(0, 0, 0, 0);
hdr->layout()->setSpacing(2);
QToolButton * btn = new QToolButton(hdr);
btn->setIcon(CompanionIcon("clear.png"));
btn->setProperty("index", i);
btn->setFixedSize(18, 18);
btn->setToolTip(tr("Click to remove this model."));
hdr->layout()->addWidget(btn);
QLabel * lbl = new QLabel(name, this);
lbl->setStyleSheet("font-weight: bold;");
hdr->layout()->addWidget(lbl);
connect(btn, &QToolButton::clicked, this, &CompareDialog::removeModelBtnClicked);
ui->layout_modelNames->addWidget(hdr);
}
if (modelsList.size())
ui->textEdit->setHtml(multimodelprinter->print(ui->textEdit->document()));
}
CompareDialog::~CompareDialog()
void CompareDialog::removeModel(int idx)
{
delete ui;
if (idx < modelsList.size()) {
modelsList.remove(idx);
compare();
}
}
void CompareDialog::removeModelBtnClicked()
{
if (sender() && sender()->property("index").isValid())
removeModel(sender()->property("index").toInt());
}
void CompareDialog::on_printButton_clicked()
+20 -15
View File
@@ -35,27 +35,32 @@ class CompareDialog : public QDialog
public:
CompareDialog(QWidget *parent, Firmware * firmware);
~CompareDialog();
protected:
MultiModelPrinter multimodelprinter;
ModelData model1;
ModelData model2;
bool model1Valid;
bool model2Valid;
struct GMData {
ModelData model;
GeneralSettings gs;
};
MultiModelPrinter * multimodelprinter;
QVector<GMData> modelsList;
QMap<int, GMData> modelsMap;
Ui::CompareDialog * ui;
protected slots:
void removeModelBtnClicked();
void on_printButton_clicked();
void on_printFileButton_clicked();
protected:
void closeEvent(QCloseEvent * event);
bool handleDroppedModel(const QMimeData * mimeData, ModelData & model, QLabel * label);
void dropEvent(QDropEvent *event);
void dragMoveEvent(QDragMoveEvent *event);
void dragEnterEvent(QDragEnterEvent *event);
void dragLeaveEvent(QDragLeaveEvent *event);
void printDiff();
virtual void closeEvent(QCloseEvent * event);
virtual void dragMoveEvent(QDragMoveEvent *event);
virtual void dragEnterEvent(QDragEnterEvent *event);
virtual void dragLeaveEvent(QDragLeaveEvent *event);
virtual void dropEvent(QDropEvent *event);
bool handleMimeData(const QMimeData * mimeData);
void compare();
void removeModel(int idx);
};
#endif // _COMPAREDIALOG_H_
+29 -53
View File
@@ -29,63 +29,22 @@
<string>Compare Models</string>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0">
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QLabel" name="label_1">
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="acceptDrops">
<bool>true</bool>
</property>
<property name="styleSheet">
<string notr="true">color:green;</string>
</property>
<property name="text">
<string>Drag first model here</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_2">
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="acceptDrops">
<bool>true</bool>
</property>
<property name="styleSheet">
<string notr="true">color:red;</string>
</property>
<property name="text">
<string>Drag second model here</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
</layout>
</item>
<item row="1" column="0">
<item row="2" column="0">
<widget class="QTextEdit" name="textEdit">
<property name="readOnly">
<bool>true</bool>
</property>
</widget>
</item>
<item row="2" column="0">
<item row="3" column="0">
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QLabel" name="label">
<property name="text">
<string>To compare models, drag and drop them anywhere in this window.</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
@@ -122,11 +81,28 @@
</item>
</layout>
</item>
<item row="1" column="0">
<layout class="QHBoxLayout" name="layout_modelNames">
<property name="spacing">
<number>6</number>
</property>
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
</layout>
</item>
</layout>
</widget>
<resources>
<include location="companion.qrc"/>
</resources>
<resources/>
<connections>
<connection>
<sender>closeButton</sender>
+29 -21
View File
@@ -21,6 +21,8 @@
#ifndef _CONSTANTS_H_
#define _CONSTANTS_H_
#include <QCoreApplication>
#define CPN_MAX_MODELS 60
#define CPN_MAX_TIMERS 3
#define CPN_MAX_FLIGHT_MODES 9
@@ -30,34 +32,40 @@
#define CPN_MAX_CURVES 32
#define CPN_MAX_POINTS 17
#define CPN_MAX_GVARS 9
#define CPN_MAX_ENCODERS 2
#define CPN_MAX_ENCODERS 2 // rotary encoders
#define CPN_MAX_CHNOUT 32 // number of real output channels
#define CPN_MAX_CSW 64 // number of custom switches
#define CPN_MAX_CUSTOM_FUNCTIONS 64 // number of functions assigned to switches
#define CPN_MAX_LOGICAL_SWITCHES 64 // number of custom switches
#define CPN_MAX_SPECIAL_FUNCTIONS 64 // number of functions assigned to switches
#define CPN_MAX_MODULES 2
#define CPN_MAX_STICKS 4
#define CPN_MAX_AUX_TRIMS 2
#define CPN_MAX_POTS 8
#define CPN_MAX_STICKS Board::STICK_AXIS_COUNT
#define CPN_MAX_TRIMS Board::TRIM_AXIS_COUNT
#define CPN_MAX_TRIM_SW Board::TRIM_SW_COUNT
#define CPN_MAX_KNOBS 4
#define CPN_MAX_SLIDERS 4
#define CPN_MAX_POTS (CPN_MAX_KNOBS + CPN_MAX_SLIDERS)
#define CPN_MAX_CYC 3
#define CPN_MAX_SWITCHES 32
#define CPN_MAX_KEYS 32
#define CPN_MAX_MOUSE_ANALOGS 2
#define CPN_MAX_ANALOGS (CPN_MAX_STICKS + CPN_MAX_POTS + CPN_MAX_MOUSE_ANALOGS)
#define HEX_FILES_FILTER "HEX files (*.hex);;"
#define BIN_FILES_FILTER "BIN files (*.bin);;"
#define DFU_FILES_FILTER "DFU files (*.dfu);;"
#define EEPE_FILES_FILTER "EEPE files (*.eepe);;"
#define OTX_FILES_FILTER "OpenTX files (*.otx);;"
#define EEPROM_FILES_FILTER "Radio and Models settings files (*.otx *.eepe *.bin *.hex);;" OTX_FILES_FILTER EEPE_FILES_FILTER BIN_FILES_FILTER HEX_FILES_FILTER
#define FLASH_FILES_FILTER "FLASH files (*.bin *.hex *.dfu);;" BIN_FILES_FILTER HEX_FILES_FILTER DFU_FILES_FILTER
#define EXTERNAL_EEPROM_FILES_FILTER "EEPROM files (*.bin *.hex);;" BIN_FILES_FILTER HEX_FILES_FILTER
#define ER9X_EEPROM_FILE_TYPE "ER9X_EEPROM_FILE"
#define EEPE_EEPROM_FILE_HEADER "EEPE EEPROM FILE"
#define EEPE_MODEL_FILE_HEADER "EEPE MODEL FILE"
#define CPN_STR_FILES QCoreApplication::translate("Companion", "files")
#define CPN_STR_RAD_MOD_SETTINGS QCoreApplication::translate("Companion", "Radio and Models settings")
#define HEX_FILES_FILTER "HEX " % CPN_STR_FILES % " (*.hex);;"
#define BIN_FILES_FILTER "BIN " % CPN_STR_FILES % " (*.bin);;"
#define DFU_FILES_FILTER "DFU " % CPN_STR_FILES % " (*.dfu);;"
#define EEPE_FILES_FILTER "EEPE " % CPN_STR_FILES % " (*.eepe);;"
#define OTX_FILES_FILTER "OpenTX " % CPN_STR_FILES % " (*.otx);;"
#define EEPROM_FILES_FILTER CPN_STR_RAD_MOD_SETTINGS % " " % CPN_STR_FILES % " (*.otx *.eepe *.bin *.hex);;" % OTX_FILES_FILTER % EEPE_FILES_FILTER % BIN_FILES_FILTER % HEX_FILES_FILTER
#define FLASH_FILES_FILTER "FLASH " % CPN_STR_FILES % " (*.bin *.hex *.dfu);;" % BIN_FILES_FILTER % HEX_FILES_FILTER % DFU_FILES_FILTER
#define EXTERNAL_EEPROM_FILES_FILTER "EEPROM " % CPN_STR_FILES % " (*.bin *.hex);;" % BIN_FILES_FILTER % HEX_FILES_FILTER
#define ER9X_EEPROM_FILE_TYPE "ER9X_EEPROM_FILE"
#define EEPE_EEPROM_FILE_HEADER "EEPE EEPROM FILE"
#define EEPE_MODEL_FILE_HEADER "EEPE MODEL FILE"
const char * const ARROW_LEFT = "\xE2\x86\x90";
const char * const ARROW_UP = "\xE2\x86\x91";
const char * const ARROW_RIGHT = "\xE2\x86\x92";
const char * const ARROW_DOWN = "\xE2\x86\x93";
#define CPN_STR_SW_INDICATOR_UP QCoreApplication::translate("RawSwitch", "\xE2\x86\x91") // Switch up position indicator: Up arrow, or similar.
#define CPN_STR_SW_INDICATOR_DN QCoreApplication::translate("RawSwitch", "\xE2\x86\x93") // Switch down position indicator: Down arrow, or similar.
#define CPN_STR_SW_INDICATOR_NEUT QCoreApplication::translate("RawSwitch", "-") // Switch neutral (middle) position indicator.
#define CPN_STR_SW_INDICATOR_REV QCoreApplication::translate("RawSwitch", "!") // Switch reversed logic (NOT) indicator.
#endif // _CONSTANTS_H_
@@ -18,12 +18,12 @@
* GNU General Public License for more details.
*/
#include "contributorsdialog.h"
#include "creditsdialog.h"
#include "ui_htmldialog.h"
#include "helpers.h"
#include <QFile>
ContributorsDialog::ContributorsDialog(QWidget * parent):
CreditsDialog::CreditsDialog(QWidget * parent):
QDialog(parent),
ui(new Ui::HtmlDialog)
{
@@ -42,42 +42,8 @@ ContributorsDialog::ContributorsDialog(QWidget * parent):
"</head>"
"<body class=\"normal\">";
QFile credits(":/CREDITS.txt");
if (credits.open(QIODevice::ReadOnly | QIODevice::Text)) {
QStringList names;
while (!credits.atEnd()) {
QByteArray line = credits.readLine();
if (line.trimmed() == "")
break;
names.append(line.trimmed());
}
str.append(formatTable(tr("Main Developers"), names, 3));
names.clear();
while (!credits.atEnd()) {
QByteArray line = credits.readLine();
names.append(line.trimmed());
}
str.append(formatTable(tr("Other contributors"), names, 3));
}
QFile donations(":/DONATIONS.txt");
if (donations.open(QIODevice::ReadOnly | QIODevice::Text)) {
QStringList names;
while (!donations.atEnd()) {
QByteArray line = donations.readLine();
if (line.trimmed() == "")
break;
names.append(line.trimmed());
}
str.append(formatTable(tr("Companies and projects who have donated to OpenTX"), names, 3));
names.clear();
while (!donations.atEnd()) {
QByteArray line = donations.readLine();
names.append(line);
}
str.append(formatTable(tr("People who have donated to OpenTX"), names, 6));
foreach(CreditsSection section, readCredits()) {
str.append(formatTable(sectionTitle(section.title), section.names, 3));
}
str.append("<table><tr><td class=\"normal\">&nbsp;</td></tr>" \
@@ -87,9 +53,9 @@ ContributorsDialog::ContributorsDialog(QWidget * parent):
#if 0
QFile blacklist(":/BLACKLIST.txt");
if (blacklist.open(QIODevice::ReadOnly | QIODevice::Text)) {
QStringList names;
names << blacklist.readAll();
str.append(formatTable(tr("OpenTX Blacklist"), names, 1));
QStringList names;
names << blacklist.readAll();
str.append(formatTable(tr("OpenTX Blacklist"), names, 1));
}
#endif
@@ -99,12 +65,45 @@ ContributorsDialog::ContributorsDialog(QWidget * parent):
ui->textEditor->setOpenExternalLinks(true);
}
ContributorsDialog::~ContributorsDialog()
CreditsDialog::~CreditsDialog()
{
delete ui;
}
QString ContributorsDialog::formatTable(const QString & title, const QStringList & names, int columns)
QList<CreditsDialog::CreditsSection> CreditsDialog::readCredits()
{
QFile credits(":/CREDITS.txt");
QList<CreditsSection> result;
if (credits.open(QIODevice::ReadOnly | QIODevice::Text)) {
while (!credits.atEnd()) {
QByteArray line = credits.readLine().trimmed();
if (line.size() >= 2) {
if (line.startsWith("[") && line.endsWith("]")) {
result.push_back(CreditsSection(line.mid(1, line.size() - 2)));
} else {
result.back().addName(line);
}
}
}
}
return result;
}
QString CreditsDialog::sectionTitle(const QString & title)
{
if (title == "Main developers")
return tr("Main developers");
else if (title == "Translators")
return tr("Translators");
else if (title == "Companies and projects who have donated to OpenTX")
return tr("Companies and projects who have donated to OpenTX");
else if (title == "People who have donated to OpenTX")
return tr("People who have donated to OpenTX");
else
return tr("Other contributors");
}
QString CreditsDialog::formatTable(const QString & title, const QStringList & names, int columns)
{
const float cwidth = 100.0 / columns;
QString str = "<table width=\"100%\" border=0 cellspacing=0 cellpadding=2>" \
@@ -18,8 +18,8 @@
* GNU General Public License for more details.
*/
#ifndef _CONTRIBUTORSDIALOG_H_
#define _CONTRIBUTORSDIALOG_H_
#ifndef _CREDITSDIALOG_H_
#define _CREDITSDIALOG_H_
#include <QDialog>
@@ -27,17 +27,36 @@ namespace Ui {
class HtmlDialog;
}
class ContributorsDialog : public QDialog
class CreditsDialog : public QDialog
{
Q_OBJECT
class CreditsSection
{
public:
CreditsSection(const QString & title):
title(title)
{
}
void addName(const QString & name)
{
names.push_back(name);
}
QString title;
QStringList names;
};
public:
explicit ContributorsDialog(QWidget * parent = 0);
~ContributorsDialog();
explicit CreditsDialog(QWidget * parent = 0);
~CreditsDialog();
private:
Ui::HtmlDialog * ui;
QList<CreditsSection> readCredits();
QString sectionTitle(const QString & title);
QString formatTable(const QString & title, const QStringList & names, int colums);
};
#endif // _CONTRIBUTORSDIALOG_H_
#endif // _CREDITSDIALOG_H_
+40
View File
@@ -0,0 +1,40 @@
/*
* Copyright (C) OpenTX
*
* Based on code named
* th9x - http://code.google.com/p/th9x
* er9x - http://code.google.com/p/er9x
* gruvin9x - http://code.google.com/p/gruvin9x
*
* License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*/
#include "customdebug.h"
Q_LOGGING_CATEGORY(eepromImport, "eeprom.import")
Q_LOGGING_CATEGORY(simulatorInterfaceLoader, "simulator.interface.loader")
void CustomDebug::setFilterRules()
{
QString rules;
rules.append("eeprom.import=");
#if defined(DEBUG_STORAGE_IMPORT)
rules.append("true\n");
#else
rules.append("false\n");
#endif
rules.append("simulator.interface.*=true\n");
QLoggingCategory::setFilterRules(rules);
}
+10 -7
View File
@@ -21,15 +21,18 @@
#ifndef _CUSTOMDEBUG_H_
#define _CUSTOMDEBUG_H_
#include <QDebug>
#include <QLoggingCategory>
// Controls the generation of debug output for EEPROM import
#if defined(DEBUG_STORAGE_IMPORT)
inline QDebug eepromImportDebug() { return QDebug(QtDebugMsg); }
#else
#undef eepromImportDebug
inline QNoDebug eepromImportDebug() { return QNoDebug(); }
#endif
Q_DECLARE_LOGGING_CATEGORY(eepromImport) // "eeprom.import"
// Controls the generation of debug output of SimulatorLoader class
Q_DECLARE_LOGGING_CATEGORY(simulatorInterfaceLoader) // "simulator.interface.loader"
class CustomDebug
{
public:
static void setFilterRules();
};
#endif // _CUSTOMDEBUG_H_
+23 -25
View File
@@ -150,11 +150,9 @@ bool Side::saveImage()
return true;
}
//*** customizeSplashDialog Class ***
customizeSplashDialog::customizeSplashDialog(QWidget *parent) :
CustomizeSplashDialog::CustomizeSplashDialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::customizeSplashDialog)
ui(new Ui::CustomizeSplashDialog)
{
ui->setupUi(this);
setWindowIcon(CompanionIcon("paintbrush.png"));
@@ -185,22 +183,22 @@ customizeSplashDialog::customizeSplashDialog(QWidget *parent) :
resize(0,0);
}
customizeSplashDialog::~customizeSplashDialog()
CustomizeSplashDialog::~CustomizeSplashDialog()
{
delete ui;
}
void customizeSplashDialog::on_copyRightToLeftButton_clicked() {
void CustomizeSplashDialog::on_copyRightToLeftButton_clicked() {
left.copyImage(right);
}
void customizeSplashDialog::on_copyLeftToRightButton_clicked() {
void CustomizeSplashDialog::on_copyLeftToRightButton_clicked() {
right.copyImage(left);
}
void customizeSplashDialog::on_leftLoadFwButton_clicked() {loadFirmware(left);}
void customizeSplashDialog::on_rightLoadFwButton_clicked() {loadFirmware(right);}
void customizeSplashDialog::loadFirmware(Side side)
void CustomizeSplashDialog::on_leftLoadFwButton_clicked() {loadFirmware(left);}
void CustomizeSplashDialog::on_rightLoadFwButton_clicked() {loadFirmware(right);}
void CustomizeSplashDialog::loadFirmware(Side side)
{
QString fileName = QFileDialog::getOpenFileName(this, tr("Open Firmware File"), g.flashDir(), FLASH_FILES_FILTER);
if (!fileName.isEmpty()) {
@@ -212,9 +210,9 @@ void customizeSplashDialog::loadFirmware(Side side)
side.markSourceButton();
}
void customizeSplashDialog::on_leftLoadPictButton_clicked() {loadPicture(left);}
void customizeSplashDialog::on_rightLoadPictButton_clicked() {loadPicture(right);}
void customizeSplashDialog::loadPicture(Side side)
void CustomizeSplashDialog::on_leftLoadPictButton_clicked() {loadPicture(left);}
void CustomizeSplashDialog::on_rightLoadPictButton_clicked() {loadPicture(right);}
void CustomizeSplashDialog::loadPicture(Side side)
{
QString supportedImageFormats;
for (int formatIndex = 0; formatIndex < QImageReader::supportedImageFormats().count(); formatIndex++) {
@@ -232,9 +230,9 @@ void customizeSplashDialog::loadPicture(Side side)
side.markSourceButton();
}
void customizeSplashDialog::on_leftLoadProfileButton_clicked() {loadProfile(left);}
void customizeSplashDialog::on_rightLoadProfileButton_clicked() {loadProfile(right);}
void customizeSplashDialog::loadProfile(Side side)
void CustomizeSplashDialog::on_leftLoadProfileButton_clicked() {loadProfile(left);}
void CustomizeSplashDialog::on_rightLoadProfileButton_clicked() {loadProfile(right);}
void CustomizeSplashDialog::loadProfile(Side side)
{
QString fileName=g.profile[g.id()].splashFile();
@@ -245,9 +243,9 @@ void customizeSplashDialog::loadProfile(Side side)
side.markSourceButton();
}
void customizeSplashDialog::on_leftLibraryButton_clicked(){libraryButton_clicked(left);}
void customizeSplashDialog::on_rightLibraryButton_clicked(){libraryButton_clicked(right);}
void customizeSplashDialog::libraryButton_clicked( Side side )
void CustomizeSplashDialog::on_leftLibraryButton_clicked(){libraryButton_clicked(left);}
void CustomizeSplashDialog::on_rightLibraryButton_clicked(){libraryButton_clicked(right);}
void CustomizeSplashDialog::libraryButton_clicked( Side side )
{
QString fileName;
SplashLibraryDialog *ld = new SplashLibraryDialog(this,&fileName);
@@ -258,9 +256,9 @@ void customizeSplashDialog::libraryButton_clicked( Side side )
}
}
void customizeSplashDialog::on_leftSaveButton_clicked(){saveButton_clicked(left);}
void customizeSplashDialog::on_rightSaveButton_clicked(){saveButton_clicked(right);}
void customizeSplashDialog::saveButton_clicked( Side side )
void CustomizeSplashDialog::on_leftSaveButton_clicked(){saveButton_clicked(left);}
void CustomizeSplashDialog::on_rightSaveButton_clicked(){saveButton_clicked(right);}
void CustomizeSplashDialog::saveButton_clicked( Side side )
{
if (side.saveImage()){
QMessageBox::information(this, tr("File Saved"), tr("The image was saved to the file %1").arg(*side.saveToFileName));
@@ -272,9 +270,9 @@ void customizeSplashDialog::saveButton_clicked( Side side )
QMessageBox::critical(this, tr("File Save Error"), tr("Failed to write image to %1").arg(*side.saveToFileName));
}
void customizeSplashDialog::on_leftInvertButton_clicked(){invertButton_clicked(left);}
void customizeSplashDialog::on_rightInvertButton_clicked(){invertButton_clicked(right);}
void customizeSplashDialog::invertButton_clicked(Side side)
void CustomizeSplashDialog::on_leftInvertButton_clicked(){invertButton_clicked(left);}
void CustomizeSplashDialog::on_rightInvertButton_clicked(){invertButton_clicked(right);}
void CustomizeSplashDialog::invertButton_clicked(Side side)
{
QImage image = side.imageLabel->pixmap()->toImage();
image.invertPixels();
+5 -5
View File
@@ -26,7 +26,7 @@
namespace Ui
{
class customizeSplashDialog;
class CustomizeSplashDialog;
}
const int WIDTH_TARANIS = 212;
@@ -63,15 +63,15 @@ private:
LCDFormat *format;
};
class customizeSplashDialog : public QDialog
class CustomizeSplashDialog : public QDialog
{
Q_OBJECT
Side left;
Side right;
public:
explicit customizeSplashDialog(QWidget *parent = 0);
~customizeSplashDialog();
explicit CustomizeSplashDialog(QWidget *parent = 0);
~CustomizeSplashDialog();
private slots:
void on_leftLoadFwButton_clicked();
@@ -99,7 +99,7 @@ private:
void saveButton_clicked( Side );
void invertButton_clicked( Side );
Ui::customizeSplashDialog *ui;
Ui::CustomizeSplashDialog *ui;
enum sideEnum { LEFT, RIGHT };
};
+2 -2
View File
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>customizeSplashDialog</class>
<widget class="QDialog" name="customizeSplashDialog">
<class>CustomizeSplashDialog</class>
<widget class="QDialog" name="CustomizeSplashDialog">
<property name="enabled">
<bool>true</bool>
</property>
+11 -11
View File
@@ -181,7 +181,7 @@ class BaseUnsignedField: public DataField {
if (input[i])
field |= ((container)1<<i);
}
eepromImportDebug() << QString("\timported %1<%2>: 0x%3(%4)").arg(name).arg(N).arg(field, 0, 16).arg(field);
qCDebug(eepromImport) << QString("\timported %1<%2>: 0x%3(%4)").arg(name).arg(N).arg(field, 0, 16).arg(field);
}
virtual unsigned int size()
@@ -238,7 +238,7 @@ class BoolField: public DataField {
virtual void ImportBits(const QBitArray & input)
{
field = input[0] ? true : false;
eepromImportDebug() << QString("\timported %1<%2>: 0x%3(%4)").arg(name).arg(N).arg(field, 0, 16).arg(field);
qCDebug(eepromImport) << QString("\timported %1<%2>: 0x%3(%4)").arg(name).arg(N).arg(field, 0, 16).arg(field);
}
virtual unsigned int size()
@@ -308,7 +308,7 @@ class SignedField: public DataField {
}
field = (int)value;
eepromImportDebug() << QString("\timported %1<%2>: 0x%3(%4)").arg(name).arg(N).arg(field, 0, 16).arg(field);
qCDebug(eepromImport) << QString("\timported %1<%2>: 0x%3(%4)").arg(name).arg(N).arg(field, 0, 16).arg(field);
}
virtual unsigned int size()
@@ -369,7 +369,7 @@ class CharField: public DataField {
}
field[i] = idx;
}
eepromImportDebug() << QString("\timported %1<%2>: '%3'").arg(name).arg(N).arg(field);
qCDebug(eepromImport) << QString("\timported %1<%2>: '%3'").arg(name).arg(N).arg(field);
}
virtual unsigned int size()
@@ -427,7 +427,7 @@ class ZCharField: public DataField {
else
break;
}
eepromImportDebug() << QString("\timported %1<%2>: '%3'").arg(name).arg(N).arg(field);
qCDebug(eepromImport) << QString("\timported %1<%2>: '%3'").arg(name).arg(N).arg(field);
}
virtual unsigned int size()
@@ -453,7 +453,7 @@ class StructField: public DataField {
}
inline void Append(DataField * field) {
//eepromImportDebug() << QString("StructField(%1) appending field: %2").arg(name).arg(field->getName());
//qCDebug(eepromImport) << QString("StructField(%1) appending field: %2").arg(name).arg(field->getName());
fields.append(field);
}
@@ -471,7 +471,7 @@ class StructField: public DataField {
virtual void ImportBits(const QBitArray & input)
{
eepromImportDebug() << QString("\timporting %1[%2]:").arg(name).arg(fields.size());
qCDebug(eepromImport) << QString("\timporting %1[%2]:").arg(name).arg(fields.size());
int offset = 0;
foreach(DataField *field, fields) {
unsigned int size = field->size();
@@ -526,7 +526,7 @@ class TransformedField: public DataField {
virtual void ImportBits(const QBitArray & input)
{
eepromImportDebug() << QString("\timporting TransformedField %1:").arg(field.getName());
qCDebug(eepromImport) << QString("\timporting TransformedField %1:").arg(field.getName());
field.ImportBits(input);
afterImport();
}
@@ -564,7 +564,7 @@ class ConversionTable {
after = 0;
for (std::list<ConversionTuple>::iterator it=exportTable.begin(); it!=exportTable.end(); it++) {
ConversionTuple tuple = *it;
ConversionTuple & tuple = *it;
if (before == tuple.a) {
after = tuple.b;
return true;
@@ -579,7 +579,7 @@ class ConversionTable {
after = 0;
for (std::list<ConversionTuple>::iterator it=importTable.begin(); it!=importTable.end(); it++) {
ConversionTuple tuple = *it;
ConversionTuple & tuple = *it;
if (before == tuple.b) {
after = tuple.a;
return true;
@@ -756,7 +756,7 @@ class ConversionField: public TransformedField {
if (scale) {
field *= scale;
}
eepromImportDebug() << QString("\timported ConversionField<%1>:").arg(internalField.getName()) << QString(" before: %1, after: %2").arg(_field).arg(field);
qCDebug(eepromImport) << QString("\timported ConversionField<%1>:").arg(internalField.getName()) << QString(" before: %1, after: %2").arg(_field).arg(field);
}
protected:
+190 -169
View File
@@ -134,27 +134,6 @@ int TimToVal(float value)
return (temp-129);
}
QString getSignedStr(int value)
{
return value > 0 ? QString("+%1").arg(value) : QString("%1").arg(value);
}
QString getGVarString(int16_t val, bool sign)
{
if (val >= -10000 && val <= 10000) {
if (sign)
return QString("%1%").arg(getSignedStr(val));
else
return QString("%1%").arg(val);
}
else {
if (val<0)
return QObject::tr("-GV%1").arg(-val-10000);
else
return QObject::tr("GV%1").arg(val-10000);
}
}
void SensorData::updateUnit()
{
if (type == TELEM_TYPE_CALCULATED) {
@@ -239,7 +218,7 @@ RawSourceRange RawSource::getRange(const ModelData * model, const GeneralSetting
{
RawSourceRange result;
Firmware * firmware = getCurrentFirmware();
Firmware * firmware = Firmware::getCurrentVariant();
int board = firmware->getBoard();
bool singleprec = (flags & RANGE_SINGLE_PRECISION);
@@ -494,13 +473,7 @@ RawSourceRange RawSource::getRange(const ModelData * model, const GeneralSetting
return result;
}
QString RotaryEncoderString(int index)
{
static const QString rotary[] = { QObject::tr("REa"), QObject::tr("REb") };
return CHECK_IN_ARRAY(rotary, index);
}
QString RawSource::toString(const ModelData * model) const
QString RawSource::toString(const ModelData * model, const GeneralSettings * const generalSettings) const
{
static const QString trims[] = {
QObject::tr("TrmR"), QObject::tr("TrmE"), QObject::tr("TrmT"), QObject::tr("TrmA"), QObject::tr("Trm5"), QObject::tr("Trm6")
@@ -525,73 +498,131 @@ QString RawSource::toString(const ModelData * model) const
QObject::tr("ACC"), QObject::tr("GPS Time"),
};
static const QString rotary[] = { QObject::tr("REa"), QObject::tr("REb") };
if (index<0) {
return QObject::tr("----");
}
QString result;
int genAryIdx = 0;
switch (type) {
case SOURCE_TYPE_VIRTUAL_INPUT:
{
QString result = QObject::tr("[I%1]").arg(index+1);
if (model && strlen(model->inputNames[index]) > 0) {
result += QString(model->inputNames[index]);
}
result = QObject::tr("[I%1]").arg(index+1);
if (model && model->inputNames[index][0])
result.append(":" + QString(model->inputNames[index]).trimmed());
return result;
}
case SOURCE_TYPE_LUA_OUTPUT:
return QObject::tr("LUA%1%2").arg(index/16+1).arg(QChar('a'+index%16));
case SOURCE_TYPE_STICK:
return getCurrentFirmware()->getAnalogInputName(index);
if (generalSettings) {
if (isPot(&genAryIdx))
result = QString(generalSettings->potName[genAryIdx]);
else if (isSlider(&genAryIdx))
result = QString(generalSettings->sliderName[genAryIdx]);
else if (isStick(&genAryIdx))
result = QString(generalSettings->stickName[genAryIdx]);
}
if (result.isEmpty())
result = getCurrentFirmware()->getAnalogInputName(index);;
return result;
case SOURCE_TYPE_TRIM:
return CHECK_IN_ARRAY(trims, index);
case SOURCE_TYPE_ROTARY_ENCODER:
return RotaryEncoderString(index);
return CHECK_IN_ARRAY(rotary, index);
case SOURCE_TYPE_MAX:
return QObject::tr("MAX");
case SOURCE_TYPE_SWITCH:
return getSwitchInfo(getCurrentBoard(), index).name;
if (generalSettings)
result = QString(generalSettings->switchName[index]);
if (result.isEmpty())
result = getSwitchInfo(getCurrentBoard(), index).name;
return result;
case SOURCE_TYPE_CUSTOM_SWITCH:
return QObject::tr("L%1").arg(index+1);
return QObject::tr("LSw%1").arg(index+1, 2, 10, QChar('0'));
case SOURCE_TYPE_CYC:
return QObject::tr("CYC%1").arg(index+1);
case SOURCE_TYPE_PPM:
return QObject::tr("TR%1").arg(index+1);
case SOURCE_TYPE_CH:
return QObject::tr("CH%1").arg(index+1);
result = QObject::tr("CH%1").arg(index+1, 2, 10, QChar('0'));
if (getCurrentFirmware()->getCapability(ChannelsName) && model && model->limitData[index].name[0])
result.append(":" + QString(model->limitData[index].name).trimmed());
return result;
case SOURCE_TYPE_SPECIAL:
return CHECK_IN_ARRAY(special, index);
case SOURCE_TYPE_TELEMETRY:
if (IS_ARM(getCurrentBoard())) {
div_t qr = div(index, 3);
QString result = QString(model ? model->sensorData[qr.quot].label : QString("[T%1]").arg(qr.quot+1));
if (qr.rem) result += qr.rem == 1 ? "-" : "+";
result = model ? QString(model->sensorData[qr.quot].label) : QString("[T%1]").arg(qr.quot+1);
if (qr.rem)
result += (qr.rem == 1 ? "-" : "+");
return result;
}
else {
return CHECK_IN_ARRAY(telemetry, index);
}
case SOURCE_TYPE_GVAR:
return QObject::tr("GV%1").arg(index+1);
result = QObject::tr("GV%1").arg(index+1);
if (getCurrentFirmware()->getCapability(GvarsName) && model && model->gvars_names[index][0])
result.append(":" + QString(model->gvars_names[index]).trimmed());
return result;
default:
return QObject::tr("----");
}
}
bool RawSource::isPot() const
bool RawSource::isStick(int * stickIndex) const
{
return (type == SOURCE_TYPE_STICK &&
index >= CPN_MAX_STICKS &&
index < CPN_MAX_STICKS + getBoardCapability(getCurrentBoard(), Board::Pots));
if (type == SOURCE_TYPE_STICK && index < getBoardCapability(getCurrentBoard(), Board::Sticks)) {
if (stickIndex)
*stickIndex = index;
return true;
}
return false;
}
bool RawSource::isSlider() const
bool RawSource::isPot(int * potsIndex) const
{
return (type == SOURCE_TYPE_STICK &&
index >= CPN_MAX_STICKS + getBoardCapability(getCurrentBoard(), Board::Pots) &&
index < CPN_MAX_STICKS + getBoardCapability(getCurrentBoard(), Board::Pots) + getBoardCapability(getCurrentBoard(), Board::Sliders));
if (type == SOURCE_TYPE_STICK &&
index >= getBoardCapability(getCurrentBoard(), Board::Sticks) &&
index < getBoardCapability(getCurrentBoard(), Board::Sticks) + getBoardCapability(getCurrentBoard(), Board::Pots)) {
if (potsIndex)
*potsIndex = index - getBoardCapability(getCurrentBoard(), Board::Sticks);
return true;
}
return false;
}
QString RawSwitch::toString(Board::Type board) const
bool RawSource::isSlider(int * sliderIndex) const
{
if (type == SOURCE_TYPE_STICK &&
index >= getBoardCapability(getCurrentBoard(), Board::Sticks) + getBoardCapability(getCurrentBoard(), Board::Pots) &&
index < getBoardCapability(getCurrentBoard(), Board::Sticks) + getBoardCapability(getCurrentBoard(), Board::Pots) + getBoardCapability(getCurrentBoard(), Board::Sliders)) {
if (sliderIndex)
*sliderIndex = index - getBoardCapability(getCurrentBoard(), Board::Sticks) - getBoardCapability(getCurrentBoard(), Board::Pots);
return true;
}
return false;
}
/*
* RawSwitch
*/
QString RawSwitch::toString(Board::Type board, const GeneralSettings * const generalSettings) const
{
if (board == Board::BOARD_UNKNOWN) {
board = getCurrentBoard();
@@ -607,12 +638,6 @@ QString RawSwitch::toString(Board::Type board) const
QObject::tr("FM0"), QObject::tr("FM1"), QObject::tr("FM2"), QObject::tr("FM3"), QObject::tr("FM4"), QObject::tr("FM5"), QObject::tr("FM6"), QObject::tr("FM7"), QObject::tr("FM8")
};
static const QString multiposPots[] = {
QObject::tr("S11"), QObject::tr("S12"), QObject::tr("S13"), QObject::tr("S14"), QObject::tr("S15"), QObject::tr("S16"),
QObject::tr("S21"), QObject::tr("S22"), QObject::tr("S23"), QObject::tr("S24"), QObject::tr("S25"), QObject::tr("S26"),
QObject::tr("S31"), QObject::tr("S32"), QObject::tr("S33"), QObject::tr("S34"), QObject::tr("S35"), QObject::tr("S36")
};
static const QString trimsSwitches[] = {
QObject::tr("RudTrim Left"), QObject::tr("RudTrim Right"),
QObject::tr("EleTrim Down"), QObject::tr("EleTrim Up"),
@@ -631,64 +656,121 @@ QString RawSwitch::toString(Board::Type board) const
QObject::tr("THs"), QObject::tr("TH%"), QObject::tr("THt")
};
const QStringList directionIndicators = QStringList()
<< CPN_STR_SW_INDICATOR_UP
<< CPN_STR_SW_INDICATOR_NEUT
<< CPN_STR_SW_INDICATOR_DN;
if (index < 0) {
return QString("!") + RawSwitch(type, -index).toString();
return CPN_STR_SW_INDICATOR_REV % RawSwitch(type, -index).toString(board, generalSettings);
}
else {
QString swName;
div_t qr;
switch(type) {
case SWITCH_TYPE_SWITCH:
if (IS_HORUS_OR_TARANIS(board)) {
div_t qr = div(index-1, 3);
Board::SwitchInfo switchInfo = getSwitchInfo(board, qr.quot);
const char * positions[] = { ARROW_UP, "-", ARROW_DOWN };
return QString(switchInfo.name) + QString(positions[qr.rem]);
qr = div(index-1, 3);
if (generalSettings)
swName = QString(generalSettings->switchName[qr.quot]);
if (swName.isEmpty())
swName = getSwitchInfo(board, qr.quot).name;
return swName + directionIndicators.at(qr.rem > -1 && qr.rem < directionIndicators.size() ? qr.rem : 1);
}
else {
return CHECK_IN_ARRAY(switches9X, index - 1);
}
case SWITCH_TYPE_VIRTUAL:
return QObject::tr("L%1").arg(index);
return QObject::tr("LSw%1").arg(index, 2, 10, QChar('0'));
case SWITCH_TYPE_MULTIPOS_POT:
return CHECK_IN_ARRAY(multiposPots, index-1);
if (!getCurrentFirmware()->getCapability(MultiposPotsPositions))
return QObject::tr("???");
qr = div(index - 1, getCurrentFirmware()->getCapability(MultiposPotsPositions));
if (generalSettings && qr.quot < (int)DIM(generalSettings->potConfig))
swName = QString(generalSettings->potName[qr.quot]);
if (swName.isEmpty())
swName = getCurrentFirmware()->getAnalogInputName(qr.quot + getBoardCapability(board, Board::Sticks));;
return swName + "_" + QString::number(qr.rem + 1);
case SWITCH_TYPE_TRIM:
return CHECK_IN_ARRAY(trimsSwitches, index-1);
case SWITCH_TYPE_ROTARY_ENCODER:
return CHECK_IN_ARRAY(rotaryEncoders, index-1);
case SWITCH_TYPE_ON:
return QObject::tr("ON");
case SWITCH_TYPE_OFF:
return QObject::tr("OFF");
case SWITCH_TYPE_ONE:
return QObject::tr("One");
case SWITCH_TYPE_FLIGHT_MODE:
return CHECK_IN_ARRAY(flightModes, index-1);
case SWITCH_TYPE_NONE:
return QObject::tr("----");
case SWITCH_TYPE_TIMER_MODE:
return CHECK_IN_ARRAY(timerModes, index);
default:
return QObject::tr("???");
}
}
}
QString CurveReference::toString() const
/*
* CurveReference
*/
QString CurveReference::toString(const ModelData * model, bool verbose) const
{
if (value == 0) {
return "----";
}
else {
switch(type) {
case CURVE_REF_DIFF:
return QObject::tr("Diff(%1)").arg(getGVarString(value));
case CURVE_REF_EXPO:
return QObject::tr("Expo(%1)").arg(getGVarString(value));
case CURVE_REF_FUNC:
return QObject::tr("Function(%1)").arg(QString("x>0" "x<0" "|x|" "f>0" "f<0" "|f|").mid(3*(value-1), 3));
default:
return QString(value > 0 ? QObject::tr("Curve(%1)") : QObject::tr("!Curve(%1)")).arg(abs(value));
}
QString ret;
unsigned idx = abs(value) - 1;
switch(type) {
case CURVE_REF_DIFF:
ret = QObject::tr("Diff(%1)").arg(Helpers::getAdjustmentString(value, model));
break;
case CURVE_REF_EXPO:
ret = QObject::tr("Expo(%1)").arg(Helpers::getAdjustmentString(value, model));
break;
case CURVE_REF_FUNC:
ret = QString("x>0" "x<0" "|x|" "f>0" "f<0" "|f|").mid(3*(value-1), 3);
if (verbose)
ret = QObject::tr("Function(%1)").arg(ret);
break;
default:
if (model)
ret = model->curves[idx].nameToString(idx);
else
ret = CurveData().nameToString(idx);
if (verbose)
ret = QObject::tr("Curve(%1)").arg(ret);
if (value < 0)
ret.prepend(CPN_STR_SW_INDICATOR_REV);
break;
}
return ret;
}
bool LogicalSwitchData::isEmpty() const
{
return (func == 0);
}
CSFunctionFamily LogicalSwitchData::getFunctionFamily() const
@@ -775,10 +857,15 @@ void CustomFunctionData::clear()
}
}
QString CustomFunctionData::funcToString() const
bool CustomFunctionData::isEmpty() const
{
return (swtch.type == SWITCH_TYPE_NONE);
}
QString CustomFunctionData::funcToString(const ModelData * model) const
{
if (func >= FuncOverrideCH1 && func <= FuncOverrideCH32)
return QObject::tr("Override %1").arg(RawSource(SOURCE_TYPE_CH, func).toString());
return QObject::tr("Override %1").arg(RawSource(SOURCE_TYPE_CH, func).toString(model));
else if (func == FuncTrainer)
return QObject::tr("Trainer");
else if (func == FuncTrainerRUD)
@@ -822,7 +909,7 @@ QString CustomFunctionData::funcToString() const
else if (func == FuncBackgroundMusicPause)
return QObject::tr("Background Music Pause");
else if (func >= FuncAdjustGV1 && func <= FuncAdjustGVLast)
return QObject::tr("Adjust GV%1").arg(func-FuncAdjustGV1+1);
return QObject::tr("Adjust %1").arg(RawSource(SOURCE_TYPE_GVAR, func-FuncAdjustGV1).toString(model));
else if (func == FuncSetFailsafeInternalModule)
return QObject::tr("SetFailsafe Int. Module");
else if (func == FuncSetFailsafeExternalModule)
@@ -843,7 +930,7 @@ QString CustomFunctionData::funcToString() const
void CustomFunctionData::populateResetParams(const ModelData * model, QComboBox * b, unsigned int value = 0)
{
int val = 0;
Firmware * firmware = getCurrentFirmware();
Firmware * firmware = Firmware::getCurrentVariant();
Board::Type board = firmware->getBoard();
b->addItem(QObject::tr("Timer1"), val++);
@@ -997,6 +1084,14 @@ bool CurveData::isEmpty() const
return true;
}
QString CurveData::nameToString(const int idx) const
{
QString ret = QCoreApplication::translate("CurveData", "CV%1").arg(idx+1, 2, 10, QChar('0'));
if (name[0])
ret.append(":" + QString(name).trimmed());
return ret;
}
QString LimitData::minToString() const
{
return QString::number((qreal)min/10);
@@ -1063,17 +1158,17 @@ GeneralSettings::GeneralSettings()
contrast = 25;
vBatWarn = 90;
for (int i=0; i<CPN_MAX_STICKS+CPN_MAX_POTS; ++i) {
for (int i=0; i < CPN_MAX_ANALOGS; ++i) {
calibMid[i] = 0x200;
calibSpanNeg[i] = 0x180;
calibSpanPos[i] = 0x180;
}
Firmware * firmware = getCurrentFirmware();
Firmware * firmware = Firmware::getCurrentVariant();
Board::Type board = firmware->getBoard();
for (int i=0; i<getBoardCapability(board, Board::FactoryInstalledSwitches); i++) {
switchConfig[i] = getSwitchInfo(board, i).config;
switchConfig[i] = Boards::getSwitchInfo(board, i).config;
}
backlightMode = 3; // keys and sticks
@@ -1423,14 +1518,10 @@ void ModelData::clearMixes()
mixData[i].clear();
}
RadioData::RadioData()
{
models.resize(getCurrentFirmware()->getCapability(Models));
}
void ModelData::clear()
{
memset(this, 0, sizeof(ModelData));
modelIndex = -1; // an invalid index, this is managed by the TreeView data model
moduleData[0].channelsCount = 8;
moduleData[1].channelsStart = 0;
moduleData[1].channelsCount = 8;
@@ -1459,9 +1550,9 @@ void ModelData::clear()
limitData[i].clear();
for (int i=0; i<CPN_MAX_STICKS; i++)
expoData[i].clear();
for (int i=0; i<CPN_MAX_CSW; i++)
for (int i=0; i<CPN_MAX_LOGICAL_SWITCHES; i++)
logicalSw[i].clear();
for (int i=0; i<CPN_MAX_CUSTOM_FUNCTIONS; i++)
for (int i=0; i<CPN_MAX_SPECIAL_FUNCTIONS; i++)
customFn[i].clear();
for (int i=0; i<CPN_MAX_CURVES; i++)
curves[i].clear(5);
@@ -1666,10 +1757,6 @@ void unregisterEEpromInterfaces()
OpenTxEepromCleanup();
}
QList<Firmware *> firmwares;
Firmware * default_firmware_variant;
Firmware * current_firmware_variant;
void ShowEepromErrors(QWidget *parent, const QString &title, const QString &mainMessage, unsigned long errorsFound)
{
std::bitset<NUM_ERRORS> errors((unsigned long long)errorsFound);
@@ -1721,78 +1808,22 @@ void ShowEepromWarnings(QWidget *parent, const QString &title, unsigned long err
msgBox.exec();
}
QString getBoardName(Board::Type board)
{
switch (board) {
case Board::BOARD_STOCK:
return "9X";
case Board::BOARD_M128:
return "9X128";
case Board::BOARD_GRUVIN9X:
return "Gruvin9x";
case Board::BOARD_MEGA2560:
return "MEGA2560";
case Board::BOARD_TARANIS_X7:
return "Taranis X7";
case Board::BOARD_TARANIS_X9D:
return "Taranis X9D";
case Board::BOARD_TARANIS_X9DP:
return "Taranis X9D+";
case Board::BOARD_TARANIS_X9E:
return "Taranis X9E";
case Board::BOARD_SKY9X:
return "Sky9x";
case Board::BOARD_9XRPRO:
return "9XR-PRO";
case Board::BOARD_AR9X:
return "AR9X";
case Board::BOARD_X12S:
return "Horus";
case Board::BOARD_X10:
return "X10";
default:
return "Unknown";
}
}
// static
QVector<Firmware *> Firmware::registeredFirmwares;
Firmware * Firmware::defaultVariant = NULL;
Firmware * Firmware::currentVariant = NULL;
const int Firmware::getFlashSize()
// static
Firmware * Firmware::getFirmwareForId(const QString & id)
{
switch (board) {
case Board::BOARD_STOCK:
return FSIZE_STOCK;
case Board::BOARD_M128:
return FSIZE_M128;
case Board::BOARD_MEGA2560:
case Board::BOARD_GRUVIN9X:
return FSIZE_GRUVIN9X;
case Board::BOARD_SKY9X:
return FSIZE_SKY9X;
case Board::BOARD_9XRPRO:
case Board::BOARD_AR9X:
return FSIZE_9XRPRO;
case Board::BOARD_TARANIS_X9D:
case Board::BOARD_TARANIS_X9DP:
case Board::BOARD_TARANIS_X9E:
case Board::BOARD_FLAMENCO:
return FSIZE_TARANIS;
case Board::BOARD_X12S:
case Board::BOARD_X10:
return FSIZE_HORUS;
default:
return 0;
}
}
Firmware * getFirmware(const QString & id)
{
foreach(Firmware * firmware, firmwares) {
foreach(Firmware * firmware, registeredFirmwares) {
Firmware * result = firmware->getFirmwareVariant(id);
if (result) {
return result;
}
}
return default_firmware_variant;
return defaultVariant;
}
void Firmware::addOption(const char *option, QString tooltip, uint32_t variant)
@@ -1837,16 +1868,6 @@ void Firmware::addOptions(Option options[])
this->opts.push_back(opts);
}
SimulatorInterface * getCurrentSimulator()
{
QString firmwareId = getCurrentFirmware()->getId();
SimulatorFactory * factory = getSimulatorFactory(firmwareId);
if (factory)
return factory->create();
else
return NULL;
}
void FlightModeData::clear(const int phase)
{
memset(this, 0, sizeof(FlightModeData));
+47 -26
View File
@@ -21,6 +21,7 @@
#ifndef _EEPROMINTERFACE_H_
#define _EEPROMINTERFACE_H_
#include "macros.h"
#include "radiodata.h"
#include "../../radio/src/definitions.h"
#include "simulatorinterface.h"
@@ -29,8 +30,6 @@
#include <iostream>
#include <QDebug>
QString RotaryEncoderString(int index);
const uint8_t modn12x3[4][4]= {
{1, 2, 3, 4},
{1, 3, 2, 4},
@@ -51,7 +50,6 @@ enum Capability {
VoicesMaxLength,
MultiLangVoice,
ModelImage,
SwitchesPositions,
CustomFunctions,
SafetyChannelCustomFunction,
LogicalSwitches,
@@ -62,7 +60,8 @@ enum Capability {
Outputs,
ChannelsName,
ExtraInputs,
ExtendedTrims,
TrimsRange,
ExtendedTrimsRange,
NumCurves,
NumCurvePoints,
OffsetWeight,
@@ -185,9 +184,6 @@ void getEEPROMString(char *dst, const char *src, int size);
float ValToTim(int value);
int TimToVal(float value);
QString getSignedStr(int value);
QString getGVarString(int16_t val, bool sign=false);
inline int applyStickMode(int stick, unsigned int mode)
{
if (mode == 0 || mode > 4) {
@@ -195,14 +191,8 @@ inline int applyStickMode(int stick, unsigned int mode)
return stick;
}
const unsigned int stickModes[]= {
1, 2, 3, 4,
1, 3, 2, 4,
4, 2, 3, 1,
4, 3, 2, 1 };
if (stick >= 1 && stick <= 4)
return stickModes[(mode-1)*4 + stick - 1];
return modn12x3[mode-1][stick-1];
else
return stick;
}
@@ -329,11 +319,41 @@ class Firmware {
const int getFlashSize();
static Firmware * getFirmwareForId(const QString & id);
static QVector<Firmware *> getRegisteredFirmwares()
{
return registeredFirmwares;
}
static void addRegisteredFirmware(Firmware * fw)
{
registeredFirmwares.append(fw);
}
static Firmware * getDefaultVariant()
{
return defaultVariant;
}
static void setDefaultVariant(Firmware * value)
{
defaultVariant = value;
}
static Firmware * getCurrentVariant()
{
return currentVariant;
}
static void setCurrentVariant(Firmware * value)
{
currentVariant = value;
}
public:
QList<const char *> languages;
QList<const char *> ttslanguages;
QList< QList<Option> > opts;
protected:
QString id;
QString name;
@@ -342,32 +362,28 @@ class Firmware {
Firmware * base;
EEPROMInterface * eepromInterface;
static QVector<Firmware *> registeredFirmwares;
static Firmware * defaultVariant;
static Firmware * currentVariant;
private:
Firmware();
};
extern QList<Firmware *> firmwares;
extern Firmware * default_firmware_variant;
extern Firmware * current_firmware_variant;
Firmware * getFirmware(const QString & id);
inline Firmware * getCurrentFirmware()
{
return current_firmware_variant;
return Firmware::getCurrentVariant();
}
SimulatorInterface * getCurrentSimulator();
inline EEPROMInterface * getCurrentEEpromInterface()
{
return getCurrentFirmware()->getEEpromInterface();
return Firmware::getCurrentVariant()->getEEpromInterface();
}
inline Board::Type getCurrentBoard()
{
return getCurrentFirmware()->getBoard();
return Firmware::getCurrentVariant()->getBoard();
}
inline int divRoundClosest(const int n, const int d)
@@ -375,7 +391,12 @@ inline int divRoundClosest(const int n, const int d)
return ((n < 0) ^ (d < 0)) ? ((n - d/2)/d) : ((n + d/2)/d);
}
#define CHECK_IN_ARRAY(T, index) ((unsigned int)index < (unsigned int)(sizeof(T)/sizeof(T[0])) ? T[(unsigned int)index] : "???")
inline int calcRESXto100(int x)
{
return divRoundClosest(x*100, 1024);
}
#define CHECK_IN_ARRAY(T, index) ((unsigned int)index < DIM(T) ? T[(unsigned int)index] : "???")
extern QList<EEPROMInterface *> eepromInterfaces;
@@ -116,7 +116,7 @@ unsigned long Er9xInterface::load(RadioData &radioData, const uint8_t *eeprom, i
std::bitset<NUM_ERRORS> errors;
if (size != getEEpromSize(Board::BOARD_STOCK)) {
if (size != Boards::getEEpromSize(Board::BOARD_STOCK)) {
std::cout << "wrong size\n";
errors.set(WRONG_SIZE);
return errors.to_ulong();
@@ -127,7 +127,7 @@ unsigned long Er9xInterface::load(RadioData &radioData, const uint8_t *eeprom, i
errors.set(WRONG_FILE_SYSTEM);
return errors.to_ulong();
}
efile->openRd(FILE_GENERAL);
Er9xGeneral er9xGeneral;
@@ -164,7 +164,7 @@ unsigned long Er9xInterface::load(RadioData &radioData, const uint8_t *eeprom, i
}
radioData.generalSettings = er9xGeneral;
for (int i=0; i<getCapability(Models); i++) {
Er9xModelData er9xModel;
efile->openRd(FILE_MODEL(i));
@@ -174,7 +174,7 @@ unsigned long Er9xInterface::load(RadioData &radioData, const uint8_t *eeprom, i
else {
applyStickModeToModel(er9xModel, radioData.generalSettings.stickMode+1);
radioData.models[i] = er9xModel;
}
}
}
std::cout << "ok\n";
@@ -329,4 +329,4 @@ int Er9xInterface::getCapability(Capability capability)
default:
return 0;
}
}
}
@@ -158,7 +158,7 @@ unsigned long Ersky9xInterface::load(RadioData &radioData, const uint8_t *eeprom
std::bitset<NUM_ERRORS> errors;
if (size != EESIZE_SKY9X) {
if (size != Boards::getEEpromSize(Board::BOARD_SKY9X)) {
std::cout << "wrong size\n";
errors.set(WRONG_SIZE);
return errors.to_ulong();
@@ -169,7 +169,7 @@ unsigned long Ersky9xInterface::load(RadioData &radioData, const uint8_t *eeprom
errors.set(WRONG_FILE_SYSTEM);
return errors.to_ulong();
}
efile->openRd(FILE_GENERAL);
Ersky9xGeneral ersky9xGeneral;
@@ -198,13 +198,13 @@ unsigned long Ersky9xInterface::load(RadioData &radioData, const uint8_t *eeprom
return errors.to_ulong();
}
radioData.generalSettings = ersky9xGeneral;
for (int i=0; i<getCapability(Models); i++) {
uint8_t buffer[4096];
uint size;
memset(buffer,0,sizeof(buffer));
efile->openRd(FILE_MODEL(i));
// if (!efile->readRlc2((uint8_t*)&ersky9xModel, sizeof(Ersky9xModelData))) {
size = efile->readRlc2(buffer, 4096);
if (!size) {
@@ -222,7 +222,7 @@ unsigned long Ersky9xInterface::load(RadioData &radioData, const uint8_t *eeprom
applyStickModeToModel(ersky9xModel, radioData.generalSettings.stickMode+1);
radioData.models[i] = ersky9xModel;
}
}
}
}
std::cout << "ok\n";
@@ -382,4 +382,4 @@ int Ersky9xInterface::getCapability(Capability capability)
default:
return 0;
}
}
}
+36 -30
View File
@@ -160,6 +160,7 @@ class SwitchesConversionTable: public ConversionTable {
}
}
protected:
void addConversion(const RawSwitch & sw, const int b)
@@ -199,7 +200,7 @@ class SwitchesConversionTable: public ConversionTable {
static SwitchesConversionTable * getInstance(Board::Type board, unsigned int version, unsigned long flags=0)
{
for (std::list<Cache>::iterator it=internalCache.begin(); it!=internalCache.end(); it++) {
Cache element = *it;
Cache & element = *it;
if (element.board == board && element.version == version && element.flags == flags)
return element.table;
}
@@ -211,8 +212,9 @@ class SwitchesConversionTable: public ConversionTable {
static void Cleanup()
{
for (std::list<Cache>::iterator it=internalCache.begin(); it!=internalCache.end(); it++) {
Cache element = *it;
delete element.table;
Cache & element = *it;
if (element.table)
delete element.table;
}
internalCache.clear();
}
@@ -241,9 +243,12 @@ class SourcesConversionTable: public ConversionTable {
for (int i=0; i<32; i++) {
addConversion(RawSource(SOURCE_TYPE_VIRTUAL_INPUT, i), val++);
}
for (int i=0; i<MAX_SCRIPTS(board); i++) {
for (int j=0; j<6; j++) {
addConversion(RawSource(SOURCE_TYPE_LUA_OUTPUT, i*16+j), val++);
}
if (IS_STM32(board) && version >= 216) {
for (int i = 0; i < MAX_SCRIPTS(board); i++) {
for (int j = 0; j < 6; j++) {
addConversion(RawSource(SOURCE_TYPE_LUA_OUTPUT, i * 16 + j), val++);
}
}
}
@@ -386,7 +391,7 @@ class SourcesConversionTable: public ConversionTable {
static SourcesConversionTable * getInstance(Board::Type board, unsigned int version, unsigned int variant, unsigned long flags=0)
{
for (std::list<Cache>::iterator it=internalCache.begin(); it!=internalCache.end(); it++) {
Cache element = *it;
Cache & element = *it;
if (element.board == board && element.version == version && element.variant == variant && element.flags == flags)
return element.table;
}
@@ -398,8 +403,9 @@ class SourcesConversionTable: public ConversionTable {
static void Cleanup()
{
for (std::list<Cache>::iterator it=internalCache.begin(); it!=internalCache.end(); it++) {
Cache element = *it;
delete element.table;
Cache & element = *it;
if (element.table)
delete element.table;
}
internalCache.clear();
}
@@ -439,7 +445,7 @@ class SwitchField: public ConversionField< SignedField<N> > {
{
ConversionField< SignedField<N> >::afterImport();
sw = RawSwitch(_switch);
eepromImportDebug() << QString("imported %1: %2").arg(ConversionField< SignedField<N> >::internalField.getName()).arg(sw.toString(board));
qCDebug(eepromImport) << QString("imported %1: %2").arg(ConversionField< SignedField<N> >::internalField.getName()).arg(sw.toString(board));
}
protected:
@@ -565,7 +571,7 @@ class TelemetrySourceField: public ConversionField< UnsignedField<N> > {
{
ConversionField< UnsignedField<N> >::afterImport();
source = (_source == 0 ? RawSource(0) : RawSource(SOURCE_TYPE_TELEMETRY, _source-1));
eepromImportDebug() << QString("imported %1: %2").arg(ConversionField< UnsignedField<N> >::internalField.getName()).arg(source.toString());
qCDebug(eepromImport) << QString("imported %1: %2").arg(ConversionField< UnsignedField<N> >::internalField.getName()).arg(source.toString());
}
protected:
@@ -601,7 +607,7 @@ class SourceField: public ConversionField< UnsignedField<N> > {
{
ConversionField< UnsignedField<N> >::afterImport();
source = RawSource(_source);
eepromImportDebug() << QString("imported %1: %2").arg(ConversionField< UnsignedField<N> >::internalField.getName()).arg(source.toString());
qCDebug(eepromImport) << QString("imported %1: %2").arg(ConversionField< UnsignedField<N> >::internalField.getName()).arg(source.toString());
}
protected:
@@ -760,7 +766,7 @@ class CurveReferenceField: public TransformedField {
{
curve.type = (CurveReference::CurveRefType)_curve_type;
curve.value = smallGvarToC9x(_curve_value);
eepromImportDebug() << QString("imported CurveReference(%1)").arg(curve.toString());
qCDebug(eepromImport) << QString("imported CurveReference(%1)").arg(curve.toString());
}
protected:
@@ -942,7 +948,7 @@ class FlightModeField: public TransformedField {
}
}
}
eepromImportDebug() << QString("imported %1: '%2'").arg(internalField.getName()).arg(phase.name);
qCDebug(eepromImport) << QString("imported %1: '%2'").arg(internalField.getName()).arg(phase.name);
}
protected:
@@ -952,9 +958,9 @@ class FlightModeField: public TransformedField {
Board::Type board;
unsigned int version;
int rotencCount;
int trimBase[CPN_MAX_STICKS+CPN_MAX_AUX_TRIMS];
int trimExt[CPN_MAX_STICKS+CPN_MAX_AUX_TRIMS];
unsigned int trimMode[CPN_MAX_STICKS+CPN_MAX_AUX_TRIMS];
int trimBase[CPN_MAX_TRIMS];
int trimExt[CPN_MAX_TRIMS];
unsigned int trimMode[CPN_MAX_TRIMS];
};
class MixField: public TransformedField {
@@ -1231,7 +1237,7 @@ class MixField: public TransformedField {
}
if (mix.carryTrim < 0) mix.carryTrim = 0;
}
eepromImportDebug() << QString("imported %1: ch %2, name '%3'").arg(internalField.getName()).arg(mix.destCh).arg(mix.name);
qCDebug(eepromImport) << QString("imported %1: ch %2, name '%3'").arg(internalField.getName()).arg(mix.destCh).arg(mix.name);
}
protected:
@@ -1412,7 +1418,7 @@ class InputField: public TransformedField {
else
expo.curve = CurveReference(CurveReference::CURVE_REF_FUNC, _curveParam);
}
eepromImportDebug() << QString("imported %1: ch %2 name '%3'").arg(internalField.getName()).arg(expo.chn).arg(expo.name);
qCDebug(eepromImport) << QString("imported %1: ch %2 name '%3'").arg(internalField.getName()).arg(expo.chn).arg(expo.name);
}
protected:
@@ -1589,7 +1595,7 @@ class CurvesField: public TransformedField {
for (int i=0; i<maxCurves; i++) {
CurveData * curve = &curves[i];
if (!IS_STM32(board) || version < 216) {
if (!IS_ARM(board) || (!IS_STM32(board) && version < 218) || version < 216) {
int * next = &_points[5*(i+1) + _curves[i]];
int size = next - cur;
if (size % 2 == 0) {
@@ -1626,7 +1632,7 @@ class CurvesField: public TransformedField {
for (int j=0; j<curve->count; j++)
curve->points[j].x = -100 + (200*i) / (curve->count-1);
}
eepromImportDebug() << QString("imported curve: %3 points").arg(curve->count);
qCDebug(eepromImport) << QString("imported curve: %3 points").arg(curve->count);
}
}
@@ -1955,7 +1961,7 @@ class LogicalSwitchField: public TransformedField {
}
}
}
eepromImportDebug() << QString("imported %1: %2").arg(internalField.getName()).arg(csw.funcToString());
qCDebug(eepromImport) << QString("imported %1: %2").arg(internalField.getName()).arg(csw.funcToString());
}
protected:
@@ -2115,7 +2121,7 @@ class SwitchesWarningField: public TransformedField {
else {
sw = _sw;
}
eepromImportDebug() << QString("imported %1").arg(internalField.getName());
qCDebug(eepromImport) << QString("imported %1").arg(internalField.getName());
}
protected:
@@ -2350,7 +2356,7 @@ class ArmCustomFunctionField: public TransformedField {
else {
fn.param = value;
}
eepromImportDebug() << QString("imported %1").arg(internalField.getName());
qCDebug(eepromImport) << QString("imported %1").arg(internalField.getName());
}
protected:
@@ -2539,7 +2545,7 @@ class AvrCustomFunctionField: public TransformedField {
else if (version >= 213)
fn.repeatParam = _active * 10;
}
eepromImportDebug() << QString("imported %1").arg(internalField.getName());
qCDebug(eepromImport) << QString("imported %1").arg(internalField.getName());
}
protected:
@@ -2634,7 +2640,7 @@ class FrskyScreenField: public DataField {
virtual void ImportBits(const QBitArray & input)
{
eepromImportDebug() << QString("importing %1: type: %2").arg(name).arg(screen.type);
qCDebug(eepromImport) << QString("importing %1: type: %2").arg(name).arg(screen.type);
// NOTA: screen.type should have been imported first!
if (IS_ARM(board) && version >= 217) {
@@ -3007,7 +3013,7 @@ class SensorField: public TransformedField {
sensor.unit++;
}
eepromImportDebug() << QString("imported %1").arg(internalField.getName());
qCDebug(eepromImport) << QString("imported %1").arg(internalField.getName());
}
protected:
@@ -3041,7 +3047,7 @@ OpenTxModelData::OpenTxModelData(ModelData & modelData, Board::Type board, unsig
{
sprintf(name, "Model %s", modelData.name);
eepromImportDebug() << QString("OpenTxModelData::OpenTxModelData(name: %1, board: %2, ver: %3, var: %4)").arg(name).arg(board).arg(version).arg(variant);
qCDebug(eepromImport) << QString("OpenTxModelData::OpenTxModelData(name: %1, board: %2, ver: %3, var: %4)").arg(name).arg(board).arg(version).arg(variant);
if (IS_HORUS(board))
internalField.Append(new ZCharField<15>(this, modelData.name, "Model name"));
@@ -3452,7 +3458,7 @@ void OpenTxModelData::beforeExport()
void OpenTxModelData::afterImport()
{
eepromImportDebug() << QString("OpenTxModelData::afterImport()") << modelData.name;
qCDebug(eepromImport) << QString("OpenTxModelData::afterImport()") << modelData.name;
if (IS_TARANIS(board) && version < 216) {
for (unsigned int i=0; i<CPN_MAX_STICKS; i++) {
@@ -3520,7 +3526,7 @@ OpenTxGeneralData::OpenTxGeneralData(GeneralSettings & generalData, Board::Type
version(version),
inputsCount(CPN_MAX_STICKS+MAX_POTS(board, version)+MAX_SLIDERS(board)+MAX_MOUSE_ANALOGS(board))
{
eepromImportDebug() << QString("OpenTxGeneralData::OpenTxGeneralData(board: %1, version:%2, variant:%3)").arg(board).arg(version).arg(variant);
qCDebug(eepromImport) << QString("OpenTxGeneralData::OpenTxGeneralData(board: %1, version:%2, variant:%3)").arg(board).arg(version).arg(variant);
generalData.version = version;
generalData.variant = variant;
@@ -26,6 +26,7 @@
#include <QMessageBox>
#include <QTime>
#include <QUrl>
#include <companion/src/storage/storage.h>
using namespace Board;
@@ -95,30 +96,6 @@ const char * OpenTxEepromInterface::getName()
}
}
uint32_t OpenTxEepromInterface::getFourCC()
{
switch (board) {
case BOARD_X12S:
case BOARD_X10:
return 0x3478746F;
case BOARD_TARANIS_X7:
return 0x3678746F;
case BOARD_TARANIS_X9E:
return 0x3578746F;
case BOARD_TARANIS_X9D:
case BOARD_TARANIS_X9DP:
return 0x3378746F;
case BOARD_SKY9X:
case BOARD_AR9X:
return 0x3278746F;
case BOARD_MEGA2560:
case BOARD_GRUVIN9X:
return 0x3178746F;
default:
return 0;
}
}
bool OpenTxEepromInterface::loadRadioSettingsFromRLE(GeneralSettings & settings, RleFile * rleFile, uint8_t version)
{
QByteArray data(sizeof(settings), 0); // GeneralSettings should be always bigger than the EEPROM struct
@@ -163,7 +140,7 @@ bool OpenTxEepromInterface::saveToByteArray(const T & src, QByteArray & data, ui
// manager.Dump();
manager.Export(raw);
data.resize(8);
*((uint32_t*)&data.data()[0]) = getFourCC();
*((uint32_t*)&data.data()[0]) = StorageFormat::getFourCC(board);
data[4] = version;
data[5] = 'M';
*((uint16_t*)&data.data()[6]) = raw.size();
@@ -186,12 +163,12 @@ template <class T, class M>
bool OpenTxEepromInterface::loadFromByteArray(T & dest, const QByteArray & data)
{
uint32_t fourcc = *((uint32_t*)&data.data()[0]);
if (getFourCC() != fourcc) {
if (StorageFormat::getFourCC(board) != fourcc) {
if (IS_HORUS(board) && fourcc == 0x3178396F) {
qDebug() << QString().sprintf("%s: Deprecated fourcc used %x vs %x", getName(), fourcc, getFourCC());
qDebug() << QString().sprintf("%s: Deprecated fourcc used %x vs %x", getName(), fourcc, StorageFormat::getFourCC(board));
}
else {
qDebug() << QString().sprintf("%s: Wrong fourcc %x vs %x", getName(), fourcc, getFourCC());
qDebug() << QString().sprintf("%s: Wrong fourcc %x vs %x", getName(), fourcc, StorageFormat::getFourCC(board));
return false;
}
}
@@ -207,7 +184,7 @@ unsigned long OpenTxEepromInterface::load(RadioData &radioData, const uint8_t *
std::bitset<NUM_ERRORS> errors;
if (size != getEEpromSize(board)) {
if (size != Boards::getEEpromSize(board)) {
if (size == 4096) {
int notnull = false;
for (int i = 2048; i < 4096; i++) {
@@ -227,7 +204,7 @@ unsigned long OpenTxEepromInterface::load(RadioData &radioData, const uint8_t *
}
}
else {
std::cout << " wrong size (" << size << "/" << getEEpromSize(board) << ")\n";
std::cout << " wrong size (" << size << "/" << Boards::getEEpromSize(board) << ")\n";
errors.set(WRONG_SIZE);
return errors.to_ulong();
}
@@ -254,6 +231,7 @@ unsigned long OpenTxEepromInterface::load(RadioData &radioData, const uint8_t *
if (version_error == OLD_VERSION) {
errors.set(version_error);
errors.set(HAS_WARNINGS);
ShowEepromWarnings(NULL, QObject::tr("Warning"), errors.to_ulong());
}
else if (version_error == NOT_OPENTX) {
std::cout << " not open9x\n";
@@ -272,7 +250,7 @@ unsigned long OpenTxEepromInterface::load(RadioData &radioData, const uint8_t *
radioData.models.resize(firmware->getCapability(Models));
}
for (int i = 0; i < firmware->getCapability(Models); i++) {
if (!loadModelFromRLE(radioData.models[i], efile, i, version, radioData.generalSettings.variant)) {
if (i < (int)radioData.models.size() && !loadModelFromRLE(radioData.models[i], efile, i, version, radioData.generalSettings.variant)) {
std::cout << " ko\n";
errors.set(UNKNOWN_ERROR);
if (getCurrentFirmware()->getCapability(Models) == 0) {
@@ -281,7 +259,6 @@ unsigned long OpenTxEepromInterface::load(RadioData &radioData, const uint8_t *
return errors.to_ulong();
}
}
std::cout << " ok\n";
errors.set(ALL_OK);
return errors.to_ulong();
@@ -330,7 +307,7 @@ int OpenTxEepromInterface::save(uint8_t * eeprom, const RadioData & radioData, u
version = getLastDataVersion(board);
}
int size = getEEpromSize(board);
int size = Boards::getEEpromSize(board);
efile->EeFsCreate(eeprom, size, board, version);
@@ -379,8 +356,8 @@ int OpenTxEepromInterface::getSize(const ModelData &model)
if (model.isEmpty())
return 0;
QByteArray tmp(EESIZE_MAX, 0);
efile->EeFsCreate((uint8_t *) tmp.data(), EESIZE_MAX, board, 255/*version max*/);
QByteArray tmp(Boards::getEEpromSize(Board::BOARD_UNKNOWN), 0);
efile->EeFsCreate((uint8_t *) tmp.data(), Boards::getEEpromSize(Board::BOARD_UNKNOWN), board, 255/*version max*/);
OpenTxModelData open9xModel((ModelData &) model, board, 255/*version max*/, getCurrentFirmware()->getVariantNumber());
@@ -398,8 +375,8 @@ int OpenTxEepromInterface::getSize(const GeneralSettings &settings)
if (IS_SKY9X(board))
return 0;
QByteArray tmp(EESIZE_MAX, 0);
efile->EeFsCreate((uint8_t *) tmp.data(), EESIZE_MAX, board, 255);
QByteArray tmp(Boards::getEEpromSize(Board::BOARD_UNKNOWN), 0);
efile->EeFsCreate((uint8_t *) tmp.data(), Boards::getEEpromSize(Board::BOARD_UNKNOWN), board, 255);
OpenTxGeneralData open9xGeneral((GeneralSettings &) settings, board, 255, getCurrentFirmware()->getVariantNumber());
// open9xGeneral.Dump();
@@ -512,11 +489,6 @@ int OpenTxFirmware::getCapability(::Capability capability)
return 0;
case PermTimers:
return (IS_2560(board) || IS_ARM(board));
case SwitchesPositions:
if (IS_HORUS_OR_TARANIS(board))
return getBoardCapability(board, Board::Switches) * 3;
else
return 9;
case CustomFunctions:
if (IS_ARM(board))
return 64;
@@ -570,7 +542,9 @@ int OpenTxFirmware::getCapability(::Capability capability)
return (IS_ARM(board) ? 1 : 0);
case ExtraInputs:
return 1;
case ExtendedTrims:
case TrimsRange:
return 125;
case ExtendedTrimsRange:
return 500;
case Simulation:
return 1;
@@ -727,7 +701,7 @@ int OpenTxFirmware::getCapability(::Capability capability)
QString OpenTxFirmware::getAnalogInputName(unsigned int index)
{
if (index < 4) {
if ((int)index < getBoardCapability(board, Board::Sticks)) {
const QString sticks[] = {
QObject::tr("Rud"),
QObject::tr("Ele"),
@@ -737,7 +711,7 @@ QString OpenTxFirmware::getAnalogInputName(unsigned int index)
return sticks[index];
}
index -= 4;
index -= getBoardCapability(board, Board::Sticks);
if (IS_9X(board) || IS_2560(board) || IS_SKY9X(board)) {
const QString pots[] = {
@@ -1152,6 +1126,7 @@ void addOpenTxFrskyOptions(OpenTxFirmware * firmware)
firmware->addOption("nogvars", QObject::tr("Disable Global variables"));
firmware->addOption("lua", QObject::tr("Support for Lua model scripts"));
firmware->addOption("luac", QObject::tr("Enable Lua compiler"));
firmware->addOption("bindopt", QObject::tr("Enable bindings options"));
Option usb_options[] = {{"massstorage", QObject::tr("Instead of Joystick emulation, USB connection is Mass Storage (as in the Bootloader)")},
{"cli", QObject::tr("Instead of Joystick emulation, USB connection is Command Line Interface")},
{NULL}};
@@ -1196,7 +1171,7 @@ void registerOpenTxFirmware(OpenTxFirmware * firmware)
firmware->setEEpromInterface(eepromInterface);
opentxEEpromInterfaces.push_back(eepromInterface);
eepromInterfaces.push_back(eepromInterface);
firmwares.push_back(firmware);
Firmware::addRegisteredFirmware(firmware);
}
void registerOpenTxFirmwares()
@@ -1505,15 +1480,16 @@ void registerOpenTxFirmwares()
addOpenTxCommonOptions(firmware);
registerOpenTxFirmware(firmware);
default_firmware_variant = getFirmware("opentx-x9d+");
current_firmware_variant = default_firmware_variant;
Firmware::setDefaultVariant(Firmware::getFirmwareForId("opentx-x9d+"));
Firmware::setCurrentVariant(Firmware::getDefaultVariant());
}
void unregisterOpenTxFirmwares()
{
foreach (Firmware * f, firmwares) {
foreach (Firmware * f, Firmware::getRegisteredFirmwares()) {
delete f;
}
unregisterEEpromInterfaces();
}
template <class T, class M>
@@ -72,8 +72,6 @@ class OpenTxEepromInterface : public EEPROMInterface
uint8_t getLastDataVersion(Board::Type board);
uint32_t getFourCC();
RleFile * efile;
OpenTxFirmware * firmware;
+2 -2
View File
@@ -102,7 +102,7 @@ void FlashEEpromDialog::updateUI()
void FlashEEpromDialog::on_eepromLoad_clicked()
{
QString filename = QFileDialog::getOpenFileName(this, tr("Choose Radio Backup file"), g.eepromDir(), tr(EXTERNAL_EEPROM_FILES_FILTER));
QString filename = QFileDialog::getOpenFileName(this, tr("Choose Radio Backup file"), g.eepromDir(), EXTERNAL_EEPROM_FILES_FILTER);
if (!filename.isEmpty()) {
eepromFilename = filename;
updateUI();
@@ -227,7 +227,7 @@ void FlashEEpromDialog::on_burnButton_clicked()
if (patch) {
QString filename = generateProcessUniqueTempFileName("temp.bin");
QFile file(filename);
uint8_t *eeprom = (uint8_t*)malloc(getEEpromSize(getCurrentBoard()));
uint8_t *eeprom = (uint8_t*)malloc(Boards::getEEpromSize(getCurrentBoard()));
int eeprom_size = getCurrentEEpromInterface()->save(eeprom, *radioData, 0, getCurrentFirmware()->getVariantNumber());
if (eeprom_size == 0) {
return;
+1 -4
View File
@@ -21,12 +21,9 @@
#ifndef _FLASHEEPROMDIALOG_H_
#define _FLASHEEPROMDIALOG_H_
#include <constants.h>
#include <QtWidgets>
#define HEX_FILES_FILTER "HEX files (*.hex);;"
#define BIN_FILES_FILTER "BIN files (*.bin);;"
#define EXTERNAL_EEPROM_FILES_FILTER "EEPROM files (*.bin *.hex);;" BIN_FILES_FILTER HEX_FILES_FILTER
namespace Ui
{
class FlashEEpromDialog;
+3 -2
View File
@@ -23,9 +23,10 @@ foreach(name ${generaledit_NAMES})
set(generaledit_HDRS ${generaledit_HDRS} ${name}.h)
set(generaledit_UIS ${generaledit_UIS} ${name}.ui)
endforeach()
qt5_wrap_ui(generaledit_SRCS ${generaledit_UIS})
qt5_wrap_cpp(generaledit_SRCS ${generaledit_HDRS})
add_library(generaledit ${generaledit_SRCS})
qt5_use_modules(generaledit Widgets Xml Multimedia)
qt5_use_modules(generaledit Widgets Xml Multimedia)
target_link_libraries(generaledit PRIVATE ${CPN_COMMON_LIB})
+3 -3
View File
@@ -41,10 +41,10 @@ CalibrationPanel::CalibrationPanel(QWidget * parent, GeneralSettings & generalSe
tableWidget->setFrameStyle(QFrame::NoFrame | QFrame::Plain);
tableWidget->setStyleSheet("QTableWidget {background-color: transparent;}");
QStringList headerLabels;
headerLabels << QObject::tr("Negative span") << QObject::tr("Mid value") << QObject::tr("Positive span");
headerLabels << QObject::tr("Negative span") << QObject::tr("Mid value") << QObject::tr("Positive span");
tableWidget->setHorizontalHeaderLabels(headerLabels);
int rows = CPN_MAX_STICKS + getBoardCapability(getCurrentBoard(), Board::Pots) + getBoardCapability(getCurrentBoard(), Board::Sliders);
int rows = CPN_MAX_STICKS + getBoardCapability(getCurrentBoard(), Board::Pots) + getBoardCapability(getCurrentBoard(), Board::Sliders) + getBoardCapability(getCurrentBoard(), Board::MouseAnalogs);
tableWidget->setRowCount(rows);
for(int i = 0; i < rows; ++i) {
@@ -80,7 +80,7 @@ void CalibrationPanel::onCellChanged(int value)
emit modified();
}
}
int CalibrationPanel::getCalibrationValue(int row, int column)
{
switch(column) {
+39 -22
View File
@@ -21,7 +21,7 @@
#include "hardware.h"
#include "ui_hardware.h"
void HardwarePanel::setupSwitchType(int index, QLabel * label, AutoLineEdit * name, AutoComboBox * type, bool threePos = true)
void HardwarePanel::setupSwitchType(int index, QLabel * label, AutoLineEdit * name, AutoComboBox * type, bool threePos)
{
Board::Type board = getCurrentBoard();
if (IS_STM32(board) && index < getBoardCapability(board, Board::Switches)) {
@@ -92,7 +92,7 @@ HardwarePanel::HardwarePanel(QWidget * parent, GeneralSettings & generalSettings
ui(new Ui::Hardware)
{
ui->setupUi(this);
Board::Type board = firmware->getBoard();
if (IS_STM32(board)) {
@@ -110,6 +110,8 @@ HardwarePanel::HardwarePanel(QWidget * parent, GeneralSettings & generalSettings
ui->thrName->hide();
ui->ailLabel->hide();
ui->ailName->hide();
ui->potsTypeSeparator_1->hide();
ui->potsTypeSeparator_2->hide();
}
setupPotType(0, ui->pot1Label, ui->pot1Name, ui->pot1Type);
@@ -141,10 +143,11 @@ HardwarePanel::HardwarePanel(QWidget * parent, GeneralSettings & generalSettings
setupSwitchType(16, ui->sqLabel, ui->sqName, ui->sqType);
setupSwitchType(17, ui->srLabel, ui->srName, ui->srType);
if (IS_HORUS_OR_TARANIS(board) && !IS_TARANIS_X7(board)) {
if (IS_TARANIS(board) && !IS_TARANIS_X7(board)) {
ui->serialPortMode->setCurrentIndex(generalSettings.hw_uartMode);
}
else {
ui->serialPortMode->setCurrentIndex(0);
ui->serialPortMode->hide();
ui->serialPortLabel->hide();
}
@@ -160,10 +163,9 @@ HardwarePanel::HardwarePanel(QWidget * parent, GeneralSettings & generalSettings
}
else {
ui->bluetoothLabel->hide();
ui->bluetoothEnable->hide();
ui->bluetoothName->hide();
ui->bluetoothWidget->hide();
}
if (IS_HORUS_OR_TARANIS(board)) {
ui->filterEnable->setChecked(!generalSettings.jitterFilter);
}
@@ -188,39 +190,52 @@ void HardwarePanel::on_filterEnable_stateChanged()
void HardwarePanel::on_PPM_MultiplierDSB_editingFinished()
{
generalSettings.PPM_Multiplier = (int)(ui->PPM_MultiplierDSB->value()*10)-10;
emit modified();
int val = (int)(ui->PPM_MultiplierDSB->value()*10)-10;
if (generalSettings.PPM_Multiplier != val) {
generalSettings.PPM_Multiplier = val;
emit modified();
}
}
void HardwarePanel::on_PPM1_editingFinished()
{
generalSettings.trainer.calib[0] = ui->PPM1->value();
emit modified();
if (generalSettings.trainer.calib[0] != ui->PPM1->value()) {
generalSettings.trainer.calib[0] = ui->PPM1->value();
emit modified();
}
}
void HardwarePanel::on_PPM2_editingFinished()
{
generalSettings.trainer.calib[1] = ui->PPM2->value();
emit modified();
if (generalSettings.trainer.calib[1] != ui->PPM2->value()) {
generalSettings.trainer.calib[1] = ui->PPM2->value();
emit modified();
}
}
void HardwarePanel::on_PPM3_editingFinished()
{
generalSettings.trainer.calib[2] = ui->PPM3->value();
emit modified();
if (generalSettings.trainer.calib[2] != ui->PPM3->value()) {
generalSettings.trainer.calib[2] = ui->PPM3->value();
emit modified();
}
}
void HardwarePanel::on_PPM4_editingFinished()
{
generalSettings.trainer.calib[3] = ui->PPM4->value();
emit modified();
if (generalSettings.trainer.calib[3] != ui->PPM4->value()) {
generalSettings.trainer.calib[3] = ui->PPM4->value();
emit modified();
}
}
void HardwarePanel::on_txCurrentHardware_editingFinished()
void HardwarePanel::on_txCurrentCalibration_editingFinished()
{
generalSettings.txCurrentCalibration = ui->txCurrentCalibration->value();
emit modified();
if (generalSettings.txCurrentCalibration != ui->txCurrentCalibration->value()) {
generalSettings.txCurrentCalibration = ui->txCurrentCalibration->value();
emit modified();
}
}
void HardwarePanel::on_bluetoothEnable_stateChanged(int)
@@ -241,10 +256,12 @@ void HardwarePanel::setValues()
ui->PPM_MultiplierDSB->setValue((qreal)(generalSettings.PPM_Multiplier+10)/10);
}
void HardwarePanel::on_txVoltageHardware_editingFinished()
void HardwarePanel::on_txVoltageCalibration_editingFinished()
{
generalSettings.txVoltageCalibration = ui->txVoltageCalibration->value()*10;
emit modified();
if (generalSettings.txVoltageCalibration != ui->txVoltageCalibration->value()*10) {
generalSettings.txVoltageCalibration = ui->txVoltageCalibration->value()*10;
emit modified();
}
}
void HardwarePanel::on_serialPortMode_currentIndexChanged(int index)
+3 -3
View File
@@ -40,14 +40,14 @@ class HardwarePanel : public GeneralPanel
virtual ~HardwarePanel();
private slots:
void on_txVoltageHardware_editingFinished();
void on_PPM1_editingFinished();
void on_PPM2_editingFinished();
void on_PPM3_editingFinished();
void on_PPM4_editingFinished();
void on_PPM_MultiplierDSB_editingFinished();
void on_txCurrentHardware_editingFinished();
void on_txCurrentCalibration_editingFinished();
void on_txVoltageCalibration_editingFinished();
void on_bluetoothEnable_stateChanged(int);
void on_filterEnable_stateChanged();
@@ -56,7 +56,7 @@ class HardwarePanel : public GeneralPanel
protected:
void setupPotType(int index, QLabel * label, AutoLineEdit * name, AutoComboBox * type);
void setupSliderType(int index, QLabel * label, AutoLineEdit * name, AutoComboBox * type);
void setupSwitchType(int index, QLabel * label, AutoLineEdit * name, AutoComboBox * type, bool threePos);
void setupSwitchType(int index, QLabel * label, AutoLineEdit * name, AutoComboBox * type, bool threePos = true);
private:
Ui::Hardware *ui;
+120 -65
View File
@@ -6,14 +6,23 @@
<rect>
<x>0</x>
<y>0</y>
<width>359</width>
<height>1594</height>
<width>470</width>
<height>1095</height>
</rect>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Maximum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
<layout class="QGridLayout" name="gridLayout_2" rowstretch="0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0" columnstretch="0,0,0,0,0">
<layout class="QGridLayout" name="gridLayout_2">
<property name="spacing">
<number>6</number>
</property>
<item row="29" column="0">
<widget class="QLabel" name="sqLabel">
<property name="text">
@@ -125,19 +134,6 @@
</property>
</widget>
</item>
<item row="12" column="0" colspan="5">
<widget class="Line" name="potsTypeSeparator_2">
<property name="minimumSize">
<size>
<width>0</width>
<height>10</height>
</size>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item row="5" column="1">
<widget class="AutoLineEdit" name="pot2Name">
<property name="maxLength">
@@ -730,32 +726,6 @@
</property>
</widget>
</item>
<item row="31" column="0" colspan="4">
<widget class="Line" name="potsTypeSeparator_3">
<property name="minimumSize">
<size>
<width>0</width>
<height>10</height>
</size>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item row="38" column="0" colspan="4">
<widget class="Line" name="potsTypeSeparator_4">
<property name="minimumSize">
<size>
<width>0</width>
<height>10</height>
</size>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item row="25" column="0">
<widget class="QLabel" name="smLabel">
<property name="text">
@@ -1075,6 +1045,12 @@
</item>
<item row="32" column="0">
<widget class="QLabel" name="bluetoothLabel">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Bluetooth</string>
</property>
@@ -1090,24 +1066,6 @@
</property>
</widget>
</item>
<item row="32" column="1">
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QCheckBox" name="bluetoothEnable">
<property name="text">
<string/>
</property>
</widget>
</item>
<item>
<widget class="AutoLineEdit" name="bluetoothName">
<property name="maxLength">
<number>10</number>
</property>
</widget>
</item>
</layout>
</item>
<item row="33" column="1">
<widget class="QCheckBox" name="filterEnable">
<property name="text">
@@ -1122,19 +1080,116 @@
</property>
</widget>
</item>
<item row="32" column="1">
<widget class="QWidget" name="bluetoothWidget" native="true">
<layout class="QHBoxLayout" name="horizontalLayout">
<property name="spacing">
<number>6</number>
</property>
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QCheckBox" name="bluetoothEnable">
<property name="text">
<string/>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Fixed</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>5</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QLabel" name="btNameLabel">
<property name="text">
<string>Device Name:</string>
</property>
</widget>
</item>
<item>
<widget class="AutoLineEdit" name="bluetoothName">
<property name="maxLength">
<number>10</number>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item row="31" column="0" colspan="3">
<widget class="Line" name="potsTypeSeparator_2">
<property name="minimumSize">
<size>
<width>0</width>
<height>10</height>
</size>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item row="38" column="0" colspan="3">
<widget class="Line" name="ppmSeparator">
<property name="minimumSize">
<size>
<width>0</width>
<height>10</height>
</size>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item row="12" column="0" colspan="3">
<widget class="Line" name="potsTypeSeparator_1">
<property name="minimumSize">
<size>
<width>0</width>
<height>10</height>
</size>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
</layout>
</widget>
<customwidgets>
<customwidget>
<class>AutoLineEdit</class>
<extends>QLineEdit</extends>
<header>autolineedit.h</header>
</customwidget>
<customwidget>
<class>AutoComboBox</class>
<extends>QComboBox</extends>
<header>autocombobox.h</header>
</customwidget>
<customwidget>
<class>AutoLineEdit</class>
<extends>QLineEdit</extends>
<header>autolineedit.h</header>
</customwidget>
</customwidgets>
<resources/>
<connections/>
+251 -333
View File
@@ -25,16 +25,18 @@
#elif defined __GNUC__
#include <unistd.h>
#endif
#if defined(WIN32) && defined(WIN_USE_CONSOLE_STDIO)
#include "windows.h"
#endif
#include "appdata.h"
#include "macros.h"
#include "helpers.h"
#include "modeledit/modeledit.h"
#include "simulatormainwindow.h"
#include "storage/sdcard.h"
#include <QLabel>
#include <QMessageBox>
using namespace Helpers;
Stopwatch gStopwatch("global");
const QColor colors[CPN_MAX_CURVES] = {
@@ -72,61 +74,11 @@ const QColor colors[CPN_MAX_CURVES] = {
QColor(255,127,0),
};
void populateGvSourceCB(QComboBox *b, int value)
{
QString strings[] = { QObject::tr("---"), QObject::tr("Rud Trim"), QObject::tr("Ele Trim"), QObject::tr("Thr Trim"), QObject::tr("Ail Trim"), QObject::tr("Rot Enc"), QObject::tr("Rud"), QObject::tr("Ele"), QObject::tr("Thr"), QObject::tr("Ail"), QObject::tr("P1"), QObject::tr("P2"), QObject::tr("P3")};
b->clear();
for (int i=0; i<= 12; i++) {
b->addItem(strings[i]);
}
b->setCurrentIndex(value);
}
/*
* GVarGroup
*/
void populateFileComboBox(QComboBox * b, const QSet<QString> & set, const QString & current)
{
b->clear();
b->addItem("----");
bool added = false;
// Convert set into list and sort it alphabetically case insensitive
QStringList list = QStringList::fromSet(set);
qSort(list.begin(), list.end(), caseInsensitiveLessThan);
foreach (QString entry, list) {
b->addItem(entry);
if (entry == current) {
b->setCurrentIndex(b->count()-1);
added = true;
}
}
if (!added && !current.isEmpty()) {
b->addItem(current);
b->setCurrentIndex(b->count()-1);
}
}
void getFileComboBoxValue(QComboBox * b, char * dest, int length)
{
memset(dest, 0, length+1);
if (b->currentText() != "----") {
strncpy(dest, b->currentText().toLatin1(), length);
}
}
void populatePhasesCB(QComboBox *b, int value)
{
for (int i=-getCurrentFirmware()->getCapability(FlightModes); i<=getCurrentFirmware()->getCapability(FlightModes); i++) {
if (i < 0)
b->addItem(QObject::tr("!Flight mode %1").arg(-i-1), i);
else if (i > 0)
b->addItem(QObject::tr("Flight mode %1").arg(i-1), i);
else
b->addItem(QObject::tr("----"), 0);
}
b->setCurrentIndex(value + getCurrentFirmware()->getCapability(FlightModes));
}
GVarGroup::GVarGroup(QCheckBox * weightGV, QAbstractSpinBox * weightSB, QComboBox * weightCB, int & weight, const ModelData & model, const int deflt, const int mini, const int maxi, const double step, bool allowGvars, ModelPanel * panel):
GVarGroup::GVarGroup(QCheckBox * weightGV, QAbstractSpinBox * weightSB, QComboBox * weightCB, int & weight, const ModelData & model, const int deflt, const int mini, const int maxi, const double step, bool allowGvars):
QObject(),
weightGV(weightGV),
weightSB(weightSB),
@@ -135,11 +87,10 @@ GVarGroup::GVarGroup(QCheckBox * weightGV, QAbstractSpinBox * weightSB, QComboBo
weightCB(weightCB),
weight(weight),
step(step),
lock(true),
panel(panel)
lock(true)
{
if (allowGvars && getCurrentFirmware()->getCapability(Gvars)) {
populateGVCB(*weightCB, weight, model);
Helpers::populateGVCB(*weightCB, weight, model);
connect(weightGV, SIGNAL(stateChanged(int)), this, SLOT(gvarCBChanged(int)));
connect(weightCB, SIGNAL(currentIndexChanged(int)), this, SLOT(valuesChanged()));
}
@@ -200,12 +151,15 @@ void GVarGroup::valuesChanged()
weight = sb->value();
else
weight = round(dsb->value()/step);
if (panel)
emit panel->modified();
emit valueChanged();
}
}
/*
* CurveGroup
*/
CurveGroup::CurveGroup(QComboBox * curveTypeCB, QCheckBox * curveGVarCB, QComboBox * curveValueCB, QSpinBox * curveValueSB, CurveReference & curve, const ModelData & model, unsigned int flags):
QObject(),
curveTypeCB(curveTypeCB),
@@ -247,7 +201,7 @@ void CurveGroup::update()
curveGVarCB->setChecked(true);
if (lastType != CurveReference::CURVE_REF_DIFF && lastType != CurveReference::CURVE_REF_EXPO) {
lastType = curve.type;
populateGVCB(*curveValueCB, curve.value, model);
Helpers::populateGVCB(*curveValueCB, curve.value, model);
}
curveValueCB->show();
curveValueSB->hide();
@@ -271,7 +225,7 @@ void CurveGroup::update()
lastType = curve.type;
curveValueCB->clear();
for (int i=0; i<=6/*TODO constant*/; i++) {
curveValueCB->addItem(CurveReference(CurveReference::CURVE_REF_FUNC, i).toString());
curveValueCB->addItem(CurveReference(CurveReference::CURVE_REF_FUNC, i).toString(&model, false));
}
}
curveValueCB->setCurrentIndex(curve.value);
@@ -283,7 +237,7 @@ void CurveGroup::update()
lastType = curve.type;
curveValueCB->clear();
for (int i= ((flags & HIDE_NEGATIVE_CURVES) ? 0 : -numcurves); i<=numcurves; i++) {
curveValueCB->addItem(CurveReference(CurveReference::CURVE_REF_CUSTOM, i).toString(), i);
curveValueCB->addItem(CurveReference(CurveReference::CURVE_REF_CUSTOM, i).toString(&model, false), i);
if (i == curve.value) {
curveValueCB->setCurrentIndex(curveValueCB->count() - 1);
}
@@ -364,7 +318,52 @@ void CurveGroup::valuesChanged()
}
}
void populateGvarUseCB(QComboBox *b, unsigned int phase)
/*
* Helpers namespace functions
*/
void Helpers::populateGVCB(QComboBox & b, int value, const ModelData & model)
{
int count = getCurrentFirmware()->getCapability(Gvars);
b.clear();
for (int i=-count; i<=-1; i++) {
int16_t gval = (int16_t)(-10000+i);
b.addItem("-" + RawSource(SOURCE_TYPE_GVAR, abs(i)-1).toString(&model), gval);
}
for (int i=1; i<=count; i++) {
int16_t gval = (int16_t)(10000+i);
b.addItem(RawSource(SOURCE_TYPE_GVAR, i-1).toString(&model), gval);
}
b.setCurrentIndex(b.findData(value));
if (b.currentIndex() == -1)
b.setCurrentIndex(count);
}
// Returns Diff/Expo/Weight/Offset adjustment value as either a percentage or a global variable name.
QString Helpers::getAdjustmentString(int16_t val, const ModelData * model, bool sign)
{
QString ret;
if (val >= -10000 && val <= 10000) {
ret = "%1%";
if (sign && val > 0)
ret.prepend("+");
ret = ret.arg(val);
}
else {
ret = RawSource(SOURCE_TYPE_GVAR, abs(val) - 10001).toString(model);
if (val < 0)
ret.prepend("-");
else if (sign)
ret.prepend("+");
}
return ret;
}
void Helpers::populateGvarUseCB(QComboBox * b, unsigned int phase)
{
b->addItem(QObject::tr("Own value"));
for (int i=0; i<getCurrentFirmware()->getCapability(FlightModes); i++) {
@@ -374,307 +373,221 @@ void populateGvarUseCB(QComboBox *b, unsigned int phase)
}
}
void populateSwitchCB(QComboBox * b, const RawSwitch & value, const GeneralSettings & generalSettings, SwitchContext context)
void Helpers::populateFileComboBox(QComboBox * b, const QSet<QString> & set, const QString & current)
{
Board::Type board = getCurrentBoard();
RawSwitch item;
b->clear();
b->addItem("----");
if (context != MixesContext && context != GlobalFunctionsContext) {
// !FMx
if (IS_ARM(board)) {
for (int i=-getCurrentFirmware()->getCapability(FlightModes); i<0; i++) {
item = RawSwitch(SWITCH_TYPE_FLIGHT_MODE, i);
b->addItem(item.toString(), item.toValue());
}
bool added = false;
// Convert set into list and sort it alphabetically case insensitive
QStringList list = QStringList::fromSet(set);
qSort(list.begin(), list.end(), caseInsensitiveLessThan);
foreach (QString entry, list) {
b->addItem(entry);
if (entry == current) {
b->setCurrentIndex(b->count()-1);
added = true;
}
}
if (!added && !current.isEmpty()) {
b->addItem(current);
b->setCurrentIndex(b->count()-1);
}
}
void Helpers::getFileComboBoxValue(QComboBox * b, char * dest, int length)
{
memset(dest, 0, length+1);
if (b->currentText() != "----") {
strncpy(dest, b->currentText().toLatin1(), length);
}
}
void Helpers::addRawSwitchItems(QStandardItemModel * itemModel, const RawSwitchType & type, int count, const GeneralSettings * const generalSettings)
{
// Most RawSwitch() indices are one-based (vs. typical zero); these are exceptions to the rule:
const static QVector<int> rawSwitchIndexBaseZeroTypes = QVector<int>() << SWITCH_TYPE_NONE << SWITCH_TYPE_ON << SWITCH_TYPE_OFF << SWITCH_TYPE_TIMER_MODE;
int rawIdxAdj = 0;
const Board::Type board = getCurrentBoard();
int i = (count < 0 ? count : 1);
const int maxCount = (i < 0 ? 0 : count + i);
// handle exceptions in RawSwitch() index values
if (rawSwitchIndexBaseZeroTypes.contains(type))
rawIdxAdj = -1;
for ( ; i < maxCount; ++i) {
if (generalSettings) {
if (type == SWITCH_TYPE_SWITCH && IS_HORUS_OR_TARANIS(board) && !generalSettings->switchPositionAllowedTaranis(abs(i)))
continue;
if (type == SWITCH_TYPE_MULTIPOS_POT) {
int pot = div(abs(i) - 1, getCurrentFirmware()->getCapability(MultiposPotsPositions)).quot;
if (!generalSettings->isPotAvailable(pot) || generalSettings->potConfig[pot] != Board::POT_MULTIPOS_SWITCH)
continue;
}
}
RawSwitch rs(type, i + rawIdxAdj);
QStandardItem * modelItem = new QStandardItem(rs.toString(board, generalSettings));
modelItem->setData(rs.toValue(), Qt::UserRole);
itemModel->appendRow(modelItem);
}
}
QStandardItemModel * Helpers::getRawSwitchItemModel(const GeneralSettings * const generalSettings, SwitchContext context)
{
QStandardItemModel * itemModel = new QStandardItemModel();
Boards board = Boards(getCurrentBoard());
Board::Type btype = board.getBoardType();
Firmware * fw = getCurrentFirmware();
// Descending switch direction: NOT (!) switches
if (context != MixesContext && context != GlobalFunctionsContext && IS_ARM(btype)) {
addRawSwitchItems(itemModel, SWITCH_TYPE_FLIGHT_MODE, -fw->getCapability(FlightModes), generalSettings);
}
if (context != GlobalFunctionsContext) {
for (int i=-getCurrentFirmware()->getCapability(LogicalSwitches); i<0; i++) {
item = RawSwitch(SWITCH_TYPE_VIRTUAL, i);
b->addItem(item.toString(), item.toValue());
}
addRawSwitchItems(itemModel, SWITCH_TYPE_VIRTUAL, -fw->getCapability(LogicalSwitches), generalSettings);
}
addRawSwitchItems(itemModel, SWITCH_TYPE_ROTARY_ENCODER, -fw->getCapability(RotaryEncoders), generalSettings);
addRawSwitchItems(itemModel, SWITCH_TYPE_TRIM, -board.getCapability(Board::NumTrimSwitches), generalSettings);
addRawSwitchItems(itemModel, SWITCH_TYPE_MULTIPOS_POT, -(fw->getCapability(MultiposPots) * fw->getCapability(MultiposPotsPositions)), generalSettings);
addRawSwitchItems(itemModel, SWITCH_TYPE_SWITCH, -board.getCapability(Board::SwitchPositions), generalSettings);
for (int i=-getCurrentFirmware()->getCapability(RotaryEncoders); i<0; i++) {
item = RawSwitch(SWITCH_TYPE_ROTARY_ENCODER, i);
b->addItem(item.toString(), item.toValue());
}
for (int i = -getBoardCapability(board, Board::NumTrimSwitches); i < 0; i++) {
item = RawSwitch(SWITCH_TYPE_TRIM, i);
b->addItem(item.toString(), item.toValue());
}
for (int i=getCurrentFirmware()->getCapability(MultiposPots)-1; i>=0; i--) {
if (generalSettings.potConfig[i] == Board::POT_MULTIPOS_SWITCH) {
for (int j=-getCurrentFirmware()->getCapability(MultiposPotsPositions); j<0; j++) {
item = RawSwitch(SWITCH_TYPE_MULTIPOS_POT, -i*getCurrentFirmware()->getCapability(MultiposPotsPositions)+j);
b->addItem(item.toString(), item.toValue());
}
}
}
for (int i=-getCurrentFirmware()->getCapability(SwitchesPositions); i<0; i++) {
item = RawSwitch(SWITCH_TYPE_SWITCH, i);
if (IS_HORUS_OR_TARANIS(board) && !generalSettings.switchPositionAllowedTaranis(i)) {
continue;
}
b->addItem(item.toString(), item.toValue());
}
// Ascending switch direction (including zero)
if (context == TimersContext) {
for (int i=0; i<5; i++) {
item = RawSwitch(SWITCH_TYPE_TIMER_MODE, i);
b->addItem(item.toString(), item.toValue());
}
addRawSwitchItems(itemModel, SWITCH_TYPE_TIMER_MODE, 5, generalSettings);
}
else {
item = RawSwitch(SWITCH_TYPE_NONE);
b->addItem(item.toString(), item.toValue());
}
for (int i=1; i<=getCurrentFirmware()->getCapability(SwitchesPositions); i++) {
item = RawSwitch(SWITCH_TYPE_SWITCH, i);
if (IS_HORUS_OR_TARANIS(board) && !generalSettings.switchPositionAllowedTaranis(i)) {
continue;
}
b->addItem(item.toString(), item.toValue());
}
for (int i=0; i<getCurrentFirmware()->getCapability(MultiposPots); i++) {
if (generalSettings.potConfig[i] == Board::POT_MULTIPOS_SWITCH) {
for (int j=1; j<=getCurrentFirmware()->getCapability(MultiposPotsPositions); j++) {
item = RawSwitch(SWITCH_TYPE_MULTIPOS_POT, i*getCurrentFirmware()->getCapability(MultiposPotsPositions)+j);
b->addItem(item.toString(), item.toValue());
}
}
}
for (int i=1; i <= getBoardCapability(board, Board::NumTrimSwitches); i++) {
item = RawSwitch(SWITCH_TYPE_TRIM, i);
b->addItem(item.toString(), item.toValue());
}
for (int i=1; i<=getCurrentFirmware()->getCapability(RotaryEncoders); i++) {
item = RawSwitch(SWITCH_TYPE_ROTARY_ENCODER, i);
b->addItem(item.toString(), item.toValue());
addRawSwitchItems(itemModel, SWITCH_TYPE_NONE, 1);
}
addRawSwitchItems(itemModel, SWITCH_TYPE_SWITCH, board.getCapability(Board::SwitchPositions), generalSettings);
addRawSwitchItems(itemModel, SWITCH_TYPE_MULTIPOS_POT, fw->getCapability(MultiposPots) * fw->getCapability(MultiposPotsPositions), generalSettings);
addRawSwitchItems(itemModel, SWITCH_TYPE_TRIM, board.getCapability(Board::NumTrimSwitches), generalSettings);
addRawSwitchItems(itemModel, SWITCH_TYPE_ROTARY_ENCODER, fw->getCapability(RotaryEncoders), generalSettings);
if (context != GlobalFunctionsContext) {
for (int i=1; i<=getCurrentFirmware()->getCapability(LogicalSwitches); i++) {
item = RawSwitch(SWITCH_TYPE_VIRTUAL, i);
b->addItem(item.toString(), item.toValue());
}
addRawSwitchItems(itemModel, SWITCH_TYPE_VIRTUAL, fw->getCapability(LogicalSwitches), generalSettings);
}
if (context != MixesContext && context != GlobalFunctionsContext && IS_ARM(btype)) {
addRawSwitchItems(itemModel, SWITCH_TYPE_FLIGHT_MODE, fw->getCapability(FlightModes), generalSettings);
}
if (context == SpecialFunctionsContext || context == GlobalFunctionsContext) {
// ON
item = RawSwitch(SWITCH_TYPE_ON);
b->addItem(item.toString(), item.toValue());
// One
item = RawSwitch(SWITCH_TYPE_ONE, 1);
b->addItem(item.toString(), item.toValue());
addRawSwitchItems(itemModel, SWITCH_TYPE_ON, 1);
addRawSwitchItems(itemModel, SWITCH_TYPE_ONE, 1);
}
// FMx
if (context != MixesContext && context != GlobalFunctionsContext) {
if (IS_ARM(board)) {
for (int i=1; i<=getCurrentFirmware()->getCapability(FlightModes); i++) {
item = RawSwitch(SWITCH_TYPE_FLIGHT_MODE, i);
b->addItem(item.toString(), item.toValue());
}
}
}
for (int i=0; i < b->count(); ++i) {
if (RawSwitch(b->itemData(i).toInt()) == value) {
b->setCurrentIndex(i);
break;
}
}
b->setMaxVisibleItems(10);
return itemModel;
}
void populateGVCB(QComboBox & b, int value, const ModelData & model)
void Helpers::addRawSourceItems(QStandardItemModel * itemModel, const RawSourceType & type, int count, const GeneralSettings * const generalSettings,
const ModelData * const model, const int start, const QList<int> exclude)
{
bool selected = false;
for (int i = start; i < start + count; i++) {
if (exclude.contains(i))
continue;
b.clear();
int count = getCurrentFirmware()->getCapability(Gvars);
for (int i=-count; i<=-1; i++) {
int16_t gval = (int16_t)(-10000+i);
if (strlen(model.gvars_names[-i-1]) > 0)
b.addItem(QObject::tr("-GV%1 (%2)").arg(-i).arg(model.gvars_names[-i-1]), gval);
else
b.addItem(QObject::tr("-GV%1").arg(-i), gval);
if (value == gval) {
b.setCurrentIndex(b.count()-1);
selected = true;
RawSource src = RawSource(type, i);
if (model) {
if (type == SOURCE_TYPE_VIRTUAL_INPUT && !model->isInputValid(i))
continue;
}
}
for (int i=1; i<=count; i++) {
int16_t gval = (int16_t)(10000+i);
if (strlen(model.gvars_names[i-1]) > 0)
b.addItem(QObject::tr("GV%1 (%2)").arg(i).arg(model.gvars_names[i-1]), gval);
else
b.addItem(QObject::tr("GV%1").arg(i), gval);
if (value == gval) {
b.setCurrentIndex(b.count()-1);
selected = true;
if (generalSettings) {
int genAryIdx = 0;
if (type == SOURCE_TYPE_STICK && ((src.isPot(&genAryIdx) && !generalSettings->isPotAvailable(genAryIdx)) || (src.isSlider(&genAryIdx) && !generalSettings->isSliderAvailable(genAryIdx))))
continue;
}
}
if (!selected) {
b.setCurrentIndex(count);
QStandardItem * modelItem = new QStandardItem(src.toString(model, generalSettings));
modelItem->setData(src.toValue(), Qt::UserRole);
itemModel->appendRow(modelItem);
if (type == SOURCE_TYPE_SWITCH && generalSettings && IS_HORUS_OR_TARANIS(getCurrentBoard()) && !generalSettings->switchSourceAllowedTaranis(i)) {
modelItem->setData(0, Qt::UserRole - 1); // trick to disable an item
}
}
}
void populateSourceCB(QComboBox * b, const RawSource & source, const GeneralSettings generalSettings, const ModelData * model, unsigned int flags)
QStandardItemModel * Helpers::getRawSourceItemModel(const GeneralSettings * const generalSettings, const ModelData * const model, unsigned int flags)
{
Board::Type board = getCurrentBoard();
RawSource item;
b->clear();
QStandardItemModel * itemModel = new QStandardItemModel();
Boards board = Boards(getCurrentBoard());
Firmware * fw = getCurrentFirmware();
if (flags & POPULATE_NONE) {
item = RawSource(SOURCE_TYPE_NONE);
b->addItem(item.toString(model), item.toValue());
addRawSourceItems(itemModel, SOURCE_TYPE_NONE, 1, generalSettings, model);
}
if (flags & POPULATE_SCRIPT_OUTPUTS) {
for (int i=0; i<getCurrentFirmware()->getCapability(LuaScripts); i++) {
for (int j=0; j<getCurrentFirmware()->getCapability(LuaOutputsPerScript); j++) {
item = RawSource(SOURCE_TYPE_LUA_OUTPUT, i*16+j);
b->addItem(item.toString(model), item.toValue());
}
for (int i=0; i < getCurrentFirmware()->getCapability(LuaScripts); i++) {
addRawSourceItems(itemModel, SOURCE_TYPE_LUA_OUTPUT, fw->getCapability(LuaOutputsPerScript), generalSettings, model, i * 16);
}
}
if (model && (flags & POPULATE_VIRTUAL_INPUTS)) {
int virtualInputs = getCurrentFirmware()->getCapability(VirtualInputs);
for (int i=0; i<virtualInputs; i++) {
if (model->isInputValid(i)) {
item = RawSource(SOURCE_TYPE_VIRTUAL_INPUT, i);
b->addItem(item.toString(model), item.toValue());
}
}
addRawSourceItems(itemModel, SOURCE_TYPE_VIRTUAL_INPUT, fw->getCapability(VirtualInputs), generalSettings, model);
}
if (flags & POPULATE_SOURCES) {
int totalSources = CPN_MAX_STICKS + getBoardCapability(board, Board::Pots) + getBoardCapability(board, Board::Sliders) + getBoardCapability(board, Board::MouseAnalogs);
for (int i=0; i < totalSources; i++) {
item = RawSource(SOURCE_TYPE_STICK, i);
// skip unavailable pots and sliders
if (item.isPot() && !generalSettings.isPotAvailable(i-CPN_MAX_STICKS))
continue;
if (item.isSlider() && !generalSettings.isSliderAvailable(i-CPN_MAX_STICKS-getBoardCapability(board, Board::Pots)))
continue;
b->addItem(item.toString(model), item.toValue());
}
for (int i=0; i<getCurrentFirmware()->getCapability(RotaryEncoders); i++) {
item = RawSource(SOURCE_TYPE_ROTARY_ENCODER, i);
b->addItem(item.toString(model), item.toValue());
}
int totalSources = CPN_MAX_STICKS + board.getCapability(Board::Pots) + board.getCapability(Board::Sliders) + board.getCapability(Board::MouseAnalogs);
addRawSourceItems(itemModel, SOURCE_TYPE_STICK, totalSources, generalSettings, model);
addRawSourceItems(itemModel, SOURCE_TYPE_ROTARY_ENCODER, fw->getCapability(RotaryEncoders), generalSettings, model);
}
if (flags & POPULATE_TRIMS) {
for (int i=0; i < getBoardCapability(board, Board::NumTrims); i++) {
item = RawSource(SOURCE_TYPE_TRIM, i);
b->addItem(item.toString(model), item.toValue());
}
addRawSourceItems(itemModel, SOURCE_TYPE_TRIM, board.getCapability(Board::NumTrims), generalSettings, model);
}
if (flags & POPULATE_SOURCES) {
item = RawSource(SOURCE_TYPE_MAX);
b->addItem(item.toString(model), item.toValue());
addRawSourceItems(itemModel, SOURCE_TYPE_MAX, 1, generalSettings, model);
}
if (flags & POPULATE_SWITCHES) {
for (int i=0; i<getBoardCapability(board, Board::Switches); i++) {
item = RawSource(SOURCE_TYPE_SWITCH, i);
b->addItem(item.toString(model), item.toValue());
if (IS_HORUS_OR_TARANIS(board) && !generalSettings.switchSourceAllowedTaranis(i)) {
QModelIndex index = b->model()->index(b->count()-1, 0);
QVariant v(0);
b->model()->setData(index, v, Qt::UserRole - 1);
}
}
for (int i=0; i<getCurrentFirmware()->getCapability(LogicalSwitches); i++) {
item = RawSource(SOURCE_TYPE_CUSTOM_SWITCH, i);
b->addItem(item.toString(model), item.toValue());
}
addRawSourceItems(itemModel, SOURCE_TYPE_SWITCH, board.getCapability(Board::Switches), generalSettings, model);
addRawSourceItems(itemModel, SOURCE_TYPE_CUSTOM_SWITCH, fw->getCapability(LogicalSwitches), generalSettings, model);
}
if (flags & POPULATE_SOURCES) {
for (int i=0; i<CPN_MAX_CYC; i++) {
item = RawSource(SOURCE_TYPE_CYC, i);
b->addItem(item.toString(model), item.toValue());
}
for (int i=0; i<getCurrentFirmware()->getCapability(TrainerInputs); i++) {
item = RawSource(SOURCE_TYPE_PPM, i);
b->addItem(item.toString(model), item.toValue());
}
for (int i=0; i<getCurrentFirmware()->getCapability(Outputs); i++) {
item = RawSource(SOURCE_TYPE_CH, i);
b->addItem(item.toString(model), item.toValue());
}
addRawSourceItems(itemModel, SOURCE_TYPE_CYC, CPN_MAX_CYC, generalSettings, model);
addRawSourceItems(itemModel, SOURCE_TYPE_PPM, fw->getCapability(TrainerInputs), generalSettings, model);
addRawSourceItems(itemModel, SOURCE_TYPE_CH, fw->getCapability(Outputs), generalSettings, model);
}
if (flags & POPULATE_TELEMETRY) {
if (IS_ARM(board)) {
for (int i=0; i<5; ++i) {
item = RawSource(SOURCE_TYPE_SPECIAL, i);
b->addItem(item.toString(model), item.toValue());
}
for (int i=0; i<CPN_MAX_SENSORS; ++i) {
if (model && model->sensorData[i].isAvailable()) { //this conditon must be false if we populate Global Functions where model = 0
for (int j=0; j<3; ++j) {
item = RawSource(SOURCE_TYPE_TELEMETRY, 3*i+j);
b->addItem(item.toString(model), item.toValue());
// qDebug() << item.toString(model) << source.toString(model);
}
if (IS_ARM(board.getBoardType())) {
addRawSourceItems(itemModel, SOURCE_TYPE_SPECIAL, 5, generalSettings, model);
if (model) {
QList<int> exclude;
for (int i=0; i < CPN_MAX_SENSORS * 3; ++i) {
//this conditon must be false if we populate Global Functions where model = 0
if (!model->sensorData[div(i, 3).quot].isAvailable())
exclude << i;
}
if (exclude.size() < CPN_MAX_SENSORS * 3)
addRawSourceItems(itemModel, SOURCE_TYPE_TELEMETRY, CPN_MAX_SENSORS * 3, generalSettings, model, 0, exclude);
}
}
else {
for (int i=0; i<(flags & POPULATE_TELEMETRYEXT ? TELEMETRY_SOURCES_STATUS_COUNT : TELEMETRY_SOURCES_COUNT); i++) {
if (i==TELEMETRY_SOURCE_TX_TIME && !getCurrentFirmware()->getCapability(RtcTime))
continue;
if (i==TELEMETRY_SOURCE_SWR && !getCurrentFirmware()->getCapability(SportTelemetry))
continue;
if (i==TELEMETRY_SOURCE_TIMER3 && !IS_ARM(board))
continue;
item = RawSource(SOURCE_TYPE_TELEMETRY, i);
b->addItem(item.toString(model), item.toValue());
}
QList<int> exclude;
if (!fw->getCapability(RtcTime))
exclude << TELEMETRY_SOURCE_TX_TIME;
if (!fw->getCapability(SportTelemetry))
exclude << TELEMETRY_SOURCE_SWR;
if (!IS_ARM(board.getBoardType()))
exclude << TELEMETRY_SOURCE_TIMER3;
int count = ((flags & POPULATE_TELEMETRYEXT) ? TELEMETRY_SOURCES_STATUS_COUNT : TELEMETRY_SOURCES_COUNT);
addRawSourceItems(itemModel, SOURCE_TYPE_TELEMETRY, count, generalSettings, model, 0, exclude);
}
}
if (flags & POPULATE_GVARS) {
for (int i=0; i<getCurrentFirmware()->getCapability(Gvars); i++) {
item = RawSource(SOURCE_TYPE_GVAR, i);
b->addItem(item.toString(model), item.toValue());
}
addRawSourceItems(itemModel, SOURCE_TYPE_GVAR, fw->getCapability(Gvars), generalSettings, model);
}
for (int i=0; i < b->count(); ++i) {
if (RawSource(b->itemData(i).toInt()) == source) {
b->setCurrentIndex(i);
break;
}
}
b->setMaxVisibleItems(10);
return itemModel;
}
QString image2qstring(QImage image)
@@ -799,39 +712,44 @@ CompanionIcon::CompanionIcon(const QString &baseimage)
void startSimulation(QWidget * parent, RadioData & radioData, int modelIdx)
{
SimulatorInterface * simulator = getCurrentSimulator();
if (simulator) {
RadioData * simuData = new RadioData(radioData);
unsigned int flags = 0;
QString fwId = SimulatorLoader::findSimulatorByFirmwareName(getCurrentFirmware()->getId());
if (fwId.isEmpty()) {
QMessageBox::warning(NULL,
QObject::tr("Warning"),
QObject::tr("Simulator for this firmware is not yet available"));
return;
}
if (modelIdx >= 0) {
flags |= SIMULATOR_FLAGS_NOTX;
simuData->setCurrentModel(modelIdx);
}
RadioData * simuData = new RadioData(radioData);
unsigned int flags = 0;
SimulatorMainWindow * dialog = new SimulatorMainWindow(parent, simulator, flags);
if (!dialog->setRadioData(simuData)) {
QMessageBox::critical(NULL, QObject::tr("Data Load Error"), QObject::tr("Error occurred while starting simulator."));
delete dialog;
delete simuData;
return;
}
if (modelIdx >= 0) {
flags |= SIMULATOR_FLAGS_NOTX;
simuData->setCurrentModel(modelIdx);
}
dialog->setWindowModality(Qt::ApplicationModal);
dialog->setAttribute(Qt::WA_DeleteOnClose);
dialog->start();
SimulatorMainWindow * dialog = new SimulatorMainWindow(parent, fwId, flags);
dialog->setWindowModality(Qt::ApplicationModal);
dialog->setAttribute(Qt::WA_DeleteOnClose);
QObject::connect(dialog, &SimulatorMainWindow::destroyed, [simuData] (void) {
// TODO simuData and Horus tmp directory is deleted on simulator close OR we could use it to get back data from the simulation
delete simuData;
});
QObject::connect(dialog, &SimulatorMainWindow::destroyed, [simuData] (void) {
// TODO simuData and Horus tmp directory is deleted on simulator close OR we could use it to get back data from the simulation
delete simuData;
});
QString resultMsg;
if (dialog->getExitStatus(&resultMsg)) {
if (resultMsg.isEmpty())
resultMsg = QObject::tr("Uknown error during Simulator startup.");
QMessageBox::critical(NULL, QObject::tr("Simulator Error"), resultMsg);
dialog->deleteLater();
}
else if (dialog->setRadioData(simuData)) {
dialog->show();
}
else {
QMessageBox::warning(NULL,
QObject::tr("Warning"),
QObject::tr("Simulator for this firmware is not yet available"));
QMessageBox::critical(NULL, QObject::tr("Data Load Error"), QObject::tr("Error occurred while starting simulator."));
dialog->deleteLater();
}
}
@@ -856,6 +774,7 @@ QPixmap makePixMap(const QImage & image)
return QPixmap::fromImage(result);
}
int version2index(const QString & version)
{
int result = 999;
@@ -872,8 +791,10 @@ int version2index(const QString & version)
return result;
}
QString index2version(int index)
const QString index2version(int index)
{
QString result;
QString templt("%1.%2.%3");
if (index >= 19900000) {
int nightly = index % 1000;
index /= 1000;
@@ -881,22 +802,19 @@ QString index2version(int index)
index /= 100;
int minor = index % 100;
int major = index / 100;
QString result = QString("%1.%2.%3").arg(major).arg(minor).arg(revision);
result = templt.arg(major).arg(minor).arg(revision);
if (nightly > 0 && nightly < 999) {
result += QString("N%1").arg(nightly);
result += "N" + QString::number(nightly);
}
return result;
}
else if (index >= 19900) {
int revision = index % 100;
index /= 100;
int minor = index % 100;
int major = index / 100;
return QString("%1.%2.%3").arg(major).arg(minor).arg(revision);
}
else {
return QString();
result = templt.arg(major).arg(minor).arg(revision);
}
return result;
}
bool qunlink(const QString & fileName)
+44 -54
View File
@@ -22,7 +22,6 @@
#define _HELPERS_H_
#include "eeprominterface.h"
#include "modeledit/modeledit.h"
#include <QCheckBox>
#include <QSpinBox>
#include <QTableWidget>
@@ -30,6 +29,7 @@
#include <QDebug>
#include <QTime>
#include <QElapsedTimer>
#include <QStandardItemModel>
extern const QColor colors[CPN_MAX_CURVES];
@@ -52,11 +52,6 @@ extern const QColor colors[CPN_MAX_CURVES];
#define TRIM_MODE_NONE 0x1F // 0b11111
void populateGvSourceCB(QComboBox *b, int value);
void populateFileComboBox(QComboBox * b, const QSet<QString> & set, const QString & current);
void getFileComboBoxValue(QComboBox * b, char * dest, int length);
void populateRotEncCB(QComboBox *b, int value, int renumber);
QString getTheme();
class CompanionIcon: public QIcon {
@@ -69,7 +64,10 @@ class GVarGroup: public QObject {
Q_OBJECT
public:
GVarGroup(QCheckBox * weightGV, QAbstractSpinBox * weightSB, QComboBox * weightCB, int & weight, const ModelData & model, const int deflt, const int mini, const int maxi, const double step=1.0, bool allowGVars=true, ModelPanel * panel=NULL);
GVarGroup(QCheckBox * weightGV, QAbstractSpinBox * weightSB, QComboBox * weightCB, int & weight, const ModelData & model, const int deflt, const int mini, const int maxi, const double step=1.0, bool allowGVars=true);
signals:
void valueChanged();
protected slots:
void gvarCBChanged(int);
@@ -84,7 +82,6 @@ class GVarGroup: public QObject {
int & weight;
double step;
bool lock;
ModelPanel * panel;
};
#define HIDE_DIFF 0x01
@@ -116,19 +113,6 @@ class CurveGroup : public QObject {
int lastType;
};
enum SwitchContext
{
LogicalSwitchesContext,
SpecialFunctionsContext,
GlobalFunctionsContext,
TimersContext,
MixesContext
};
void populateSwitchCB(QComboBox *b, const RawSwitch & value, const GeneralSettings & generalSettings, SwitchContext context);
void populatePhasesCB(QComboBox *b, int value);
void populateGvarUseCB(QComboBox *b, unsigned int phase);
#define POPULATE_NONE (1<<0)
#define POPULATE_SOURCES (1<<1)
@@ -143,8 +127,34 @@ void populateGvarUseCB(QComboBox *b, unsigned int phase);
#define GVARS_VARIANT 0x0001
#define FRSKY_VARIANT 0x0002
void populateGVCB(QComboBox & b, int value, const ModelData & model);
void populateSourceCB(QComboBox *b, const RawSource &source, const GeneralSettings generalSettings, const ModelData * model, unsigned int flags);
namespace Helpers
{
enum SwitchContext
{
LogicalSwitchesContext,
SpecialFunctionsContext,
GlobalFunctionsContext,
TimersContext,
MixesContext
};
void addRawSwitchItems(QStandardItemModel * itemModel, const RawSwitchType & type, int count, const GeneralSettings * const generalSettings = NULL);
QStandardItemModel * getRawSwitchItemModel(const GeneralSettings * const generalSettings = NULL, SwitchContext context = LogicalSwitchesContext);
void addRawSourceItems(QStandardItemModel * itemModel, const RawSourceType & type, int count, const GeneralSettings * const generalSettings = NULL,
const ModelData * const model = NULL, const int start = 0, const QList<int> exclude = QList<int>());
QStandardItemModel * getRawSourceItemModel(const GeneralSettings * const generalSettings = NULL, const ModelData * const model = NULL, unsigned int flags = 0);
void populateGvarUseCB(QComboBox *b, unsigned int phase);
void populateGVCB(QComboBox & b, int value, const ModelData & model);
QString getAdjustmentString(int16_t val, const ModelData * model = NULL, bool sign = false);
void populateFileComboBox(QComboBox * b, const QSet<QString> & set, const QString & current);
void getFileComboBoxValue(QComboBox * b, char * dest, int length);
} // namespace Helpers
// TODO : move to Helpers namespace
QString image2qstring(QImage image);
int findmult(float value, float base);
@@ -157,38 +167,18 @@ QString getFrSkySrc(int index);
void startSimulation(QWidget * parent, RadioData & radioData, int modelIdx);
template <class T>
QVector<T> findWidgets(QObject * object, const QString & name)
{
QVector<T> result;
QRegExp rx(name.arg("([0-9]+)"));
QList<T> children = object->findChildren<T>();
foreach(T child, children) {
int pos = rx.indexIn(child->objectName());
if (pos >= 0) {
QStringList list = rx.capturedTexts();
int index = list[1].toInt();
if (result.size() <= index) {
result.resize(index+1);
}
result[index] = child;
}
}
return result;
}
// Format a pixmap to fit on the current firmware
QPixmap makePixMap(const QImage & image);
int version2index(const QString & version);
QString index2version(int index);
const QString index2version(int index);
class QTimeS : public QTime
{
public:
QTimeS(int s) { int h = s/3600; s %= 3600; int m = s/60; s %=60; setHMS(h, m, s); };
QTimeS(const QTime & q) : QTime(q) {};
int seconds() const { return hour()*3600 + minute()*60 + second(); };
QTimeS(int s) { int h = s/3600; s %= 3600; int m = s/60; s %=60; setHMS(h, m, s); }
QTimeS(const QTime & q) : QTime(q) {}
int seconds() const { return hour()*3600 + minute()*60 + second(); }
};
bool qunlink(const QString & fileName);
@@ -205,7 +195,7 @@ bool caseInsensitiveLessThan(const QString &s1, const QString &s2);
class GpsCoord
{
public:
GpsCoord(): latitude(0), longitude(0) {};
GpsCoord(): latitude(0), longitude(0) {}
double latitude; // Precede South latitudes and West longitudes with a minus sign. Latitudes range from -90 to 90.
double longitude; // Longitudes range from -180 to 180.
};
@@ -213,7 +203,7 @@ public:
class GpsGlitchFilter
{
public:
GpsGlitchFilter() : lastValid(false), glitchCount(0) {};
GpsGlitchFilter() : lastValid(false), glitchCount(0) {}
bool isGlitch(GpsCoord coord);
private:
@@ -226,7 +216,7 @@ private:
class GpsLatLonFilter
{
public:
GpsLatLonFilter() {};
GpsLatLonFilter() {}
bool isValid(GpsCoord coord);
private:
@@ -249,13 +239,13 @@ public:
void resizeColumnsToContents();
void setColumnWidth(int col, int width);
void pushRowsUp(int row);
void pushRowsUp(int row);
private:
#if defined(TABLE_LAYOUT)
QTableWidget * tableWidget;
QTableWidget * tableWidget;
#else
QGridLayout * gridWidget;
QGridLayout * gridWidget;
#endif
};
@@ -267,7 +257,7 @@ public:
name(name), total(0) {
timer.start();
};
~Stopwatch() {};
~Stopwatch() {}
void restart() {
total = 0;
+1 -1
View File
@@ -1 +1 @@
IDI_ICON1 ICON DISCARDABLE "icon.ico"
IDI_ICON1 ICON DISCARDABLE "icon.ico"
@@ -0,0 +1,27 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" version="1.1" width="64" height="64" id="svg3007">
<defs id="defs3009" />
<metadata id="metadata3012">
<rdf:RDF>
<cc:Work rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g id="layer1">
<g transform="matrix(0.64592419,0,0,0.64592419,3.7118734,3.509355)" id="g4">
<g id="g6">
<path d="M 49.634152,27.060548 V 2.7303987 c 0,-1.6220105 -1.31026,-2.94910955 -2.911691,-2.94910955 -1.60143,0 -2.911692,1.32709905 -2.911692,2.94910955 V 27.060548 c 0,1.62201 1.310262,2.94911 2.911692,2.94911 1.601431,0 2.911691,-1.3271 2.911691,-2.94911 z" id="path8" />
<path d="M 2.3191619,50.211055 H 26.340619 c 1.60143,0 2.911691,-1.3271 2.911691,-2.94911 0,-1.62201 -1.310261,-2.94911 -2.911691,-2.94911 H 2.3191619 c -1.60142995,0 -2.91169115,1.3271 -2.91169115,2.94911 0,1.62201 1.3102612,2.94911 2.91169115,2.94911 z" id="path10" />
<path d="m 18.479051,18.803043 c -1.164676,1.179643 -1.164676,2.94911 0,4.128753 l 7.715983,7.815139 c 0.582339,0.589821 1.310262,0.884733 2.038184,0.884733 0.727924,0 1.455846,-0.294912 2.038185,-0.884733 1.164677,-1.179644 1.164677,-2.949109 0,-4.128753 L 22.55542,18.803043 c -1.019093,-1.032188 -2.911692,-1.032188 -4.076369,0 z" id="path12" />
<path d="m 70.16158,18.950499 -7.715985,7.815138 c -1.164674,1.179644 -1.164674,2.94911 0,4.128754 0.582339,0.589821 1.310263,0.884732 2.038185,0.884732 0.727924,0 1.455847,-0.294911 2.038185,-0.884732 l 7.715982,-7.81514 c 1.164677,-1.179644 1.164677,-2.949109 0,-4.128752 -1.019092,-1.03219 -2.911691,-1.03219 -4.076367,0 z" id="path14" />
<path d="m 26.04945,63.776956 -7.715984,7.81514 c -1.164675,1.179642 -1.164675,2.949108 0,4.128752 0.582339,0.589822 1.310262,0.884733 2.038185,0.884733 0.727924,0 1.455846,-0.294911 2.038184,-0.884733 l 7.715982,-7.815138 c 1.164677,-1.179644 1.164677,-2.94911 0,-4.128754 -1.164675,-1.179644 -2.91169,-1.179644 -4.076367,0 z" id="path16" />
<polygon points="85.3,77 64.5,56.2 81.3,50.5 39.5,38.7 51,80.8 56.7,64.1 77.5,84.8 " transform="matrix(0.87815057,0,0,0.88943545,9.8347839,11.453988)" id="polygon18" />
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.6 KiB

@@ -1 +1,53 @@
<svg version="1.2" baseProfile="tiny" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path d="M19 6h-1.586l-1-1c-.579-.579-1.595-1-2.414-1h-4c-.819 0-1.835.421-2.414 1l-1 1h-1.586c-1.654 0-3 1.346-3 3v8c0 1.654 1.346 3 3 3h14c1.654 0 3-1.346 3-3v-8c0-1.654-1.346-3-3-3zm-7 10c-1.933 0-3.5-1.568-3.5-3.5 0-1.934 1.567-3.5 3.5-3.5s3.5 1.566 3.5 3.5c0 1.932-1.567 3.5-3.5 3.5zm6-4.701c-.719 0-1.3-.58-1.3-1.299s.581-1.301 1.3-1.301 1.3.582 1.3 1.301-.581 1.299-1.3 1.299z"/></svg>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
version="1.1"
id="svg5332"
viewBox="0 0 64.000001 64.000001"
height="64"
width="64">
<defs
id="defs5334" />
<metadata
id="metadata5337">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
transform="translate(0,-988.36216)"
id="layer1">
<path
id="path6537"
d="m 18.817586,1033.1534 c -2.003825,-0.7073 -3.457036,-2.1866 -4.13535,-4.2095 -0.277505,-0.8277 -0.289265,-1.1387 -0.289265,-7.6504 0,-6.3546 0.01745,-6.8438 0.272479,-7.6693 0.615999,-1.9932 1.929935,-3.3663 3.958827,-4.1373 0.683013,-0.2595 1.201275,-0.3291 2.888021,-0.3877 1.902622,-0.066 2.068978,-0.093 2.234764,-0.3643 0.09853,-0.1611 0.571783,-0.9613 1.051717,-1.7783 0.658724,-1.1214 0.983189,-1.5378 1.323858,-1.6995 0.670602,-0.3182 11.165398,-0.3186 11.775534,0 0.499476,0.2604 0.629457,0.4367 1.677451,2.2751 l 0.835283,1.4651 2.078074,0.088 c 2.401585,0.1024 3.161571,0.3205 4.473867,1.2866 0.998498,0.735 1.566768,1.4411 2.148637,2.6696 l 0.449898,0.9499 0.0385,6.9923 c 0.03339,6.0829 0.0093,7.0933 -0.18434,7.769 -0.589336,2.0549 -2.23303,3.7437 -4.323807,4.4422 -0.84773,0.2834 -1.07511,0.2883 -13.110118,0.2854 l -12.247417,0 -0.916547,-0.3235 z"
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:2.21017289;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
id="path6535"
d="m 34.313422,1030.5706 c 3.191745,-0.8042 5.775519,-3.2111 6.79891,-6.3335 0.362189,-1.1051 0.402193,-1.4096 0.398343,-3.032 -0.0035,-1.5896 -0.04804,-1.9284 -0.37338,-2.8573 -0.546668,-1.5609 -1.272035,-2.7034 -2.473253,-3.8955 -0.868074,-0.8613 -1.320892,-1.1833 -2.371213,-1.686 -1.724935,-0.8255 -2.500938,-0.9977 -4.419694,-0.9806 -1.3037,0.012 -1.789903,0.078 -2.659024,0.3631 -2.573677,0.8441 -4.593833,2.5556 -5.727803,4.8525 -0.826058,1.6733 -1.095012,2.944 -1.007199,4.7588 0.217877,4.502 3.338466,8.0392 7.937336,8.9969 0.81339,0.1694 2.876191,0.071 3.896977,-0.1864 z"
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:1.1632489;stroke-opacity:1" />
<path
id="path6533"
d="m 30.434149,1027.6409 c -0.934321,-0.2194 -2.398328,-1.0873 -3.118181,-1.8484 -2.480698,-2.623 -2.418499,-6.5741 0.143591,-9.1202 2.522587,-2.507 6.557199,-2.5048 9.122058,0 1.603993,1.5694 2.303559,3.9386 1.80349,6.1077 -0.518332,2.2485 -2.614507,4.3444 -4.863113,4.8629 -0.736116,0.1697 -2.350973,0.166 -3.087845,-0.012 z"
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:1.1632489;stroke-opacity:1" />
<path
id="path6529"
d="m 21.270726,1012.8887 c -0.0976,-0.5202 -0.682222,-1.113 -1.223284,-1.2405 -0.478723,-0.1128 -1.244048,0.1971 -1.543771,0.625 -0.450084,0.6426 -0.196298,1.7722 0.482702,2.1487 0.452294,0.2506 1.373692,0.2394 1.730711,-0.056 0.357018,-0.2951 0.650413,-0.9615 0.553642,-1.4773 z"
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:1.1632489;stroke-opacity:1" />
<circle
r="26.662109"
id="path7511-3-8-6-2-5-2-6-2-3"
style="fill:none;stroke:#000000;stroke-width:4.03292418;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
cx="32"
cy="1020.3622" />
</g>
</svg>

Before

Width:  |  Height:  |  Size: 508 B

After

Width:  |  Height:  |  Size: 3.6 KiB

@@ -1 +1,57 @@
<svg version="1.2" baseProfile="tiny" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path d="M19 20h-14c-1.654 0-3-1.346-3-3v-8c0-1.654 1.346-3 3-3h1.586l1-1c.579-.579 1.596-1 2.414-1h4c.818 0 1.835.421 2.414 1l1 1h1.586c1.654 0 3 1.346 3 3v8c0 1.654-1.346 3-3 3zm-14-12c-.552 0-1 .448-1 1v8c0 .552.448 1 1 1h14c.552 0 1-.448 1-1v-8c0-.552-.448-1-1-1h-2c-.266 0-.52-.105-.707-.293l-1.293-1.293c-.201-.201-.715-.414-1-.414h-4c-.285 0-.799.213-1 .414l-1.293 1.293c-.187.188-.441.293-.707.293h-2zM12 10c1.379 0 2.5 1.121 2.5 2.5s-1.121 2.5-2.5 2.5-2.5-1.121-2.5-2.5 1.121-2.5 2.5-2.5m0-1c-1.934 0-3.5 1.566-3.5 3.5 0 1.932 1.566 3.5 3.5 3.5s3.5-1.568 3.5-3.5c0-1.934-1.566-3.5-3.5-3.5zM18 8.699c-.719 0-1.3.582-1.3 1.301s.581 1.299 1.3 1.299 1.3-.58 1.3-1.299-.581-1.301-1.3-1.301z"/></svg>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
version="1.1"
id="svg5332"
viewBox="0 0 64.000001 64.000001"
height="64"
width="64">
<defs
id="defs5334" />
<metadata
id="metadata5337">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
transform="translate(0,-988.36216)"
id="layer1">
<g
id="g6539"
transform="translate(0,-2.2617187e-5)">
<circle
cy="1020.3622"
cx="32"
style="fill:none;stroke:#000000;stroke-width:4.359375;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="path7511-3-8-6-2-5-2-6-2"
r="28.820312" />
<path
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:2.21017289;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 18.817586,1033.1534 c -2.003825,-0.7073 -3.457036,-2.1866 -4.13535,-4.2095 -0.277505,-0.8277 -0.289265,-1.1387 -0.289265,-7.6504 0,-6.3546 0.01745,-6.8438 0.272479,-7.6693 0.615999,-1.9932 1.929935,-3.3663 3.958827,-4.1373 0.683013,-0.2595 1.201275,-0.3291 2.888021,-0.3877 1.902622,-0.066 2.068978,-0.093 2.234764,-0.3643 0.09853,-0.1611 0.571783,-0.9613 1.051717,-1.7783 0.658724,-1.1214 0.983189,-1.5378 1.323858,-1.6995 0.670602,-0.3182 11.165398,-0.3186 11.775534,0 0.499476,0.2604 0.629457,0.4367 1.677451,2.2751 l 0.835283,1.4651 2.078074,0.088 c 2.401585,0.1024 3.161571,0.3205 4.473867,1.2866 0.998498,0.735 1.566768,1.4411 2.148637,2.6696 l 0.449898,0.9499 0.0385,6.9923 c 0.03339,6.0829 0.0093,7.0933 -0.18434,7.769 -0.589336,2.0549 -2.23303,3.7437 -4.323807,4.4422 -0.84773,0.2834 -1.07511,0.2883 -13.110118,0.2854 l -12.247417,0 -0.916547,-0.3235 z"
id="path6537" />
<path
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:1.1632489;stroke-opacity:1"
d="m 34.313422,1030.5706 c 3.191745,-0.8042 5.775519,-3.2111 6.79891,-6.3335 0.362189,-1.1051 0.402193,-1.4096 0.398343,-3.032 -0.0035,-1.5896 -0.04804,-1.9284 -0.37338,-2.8573 -0.546668,-1.5609 -1.272035,-2.7034 -2.473253,-3.8955 -0.868074,-0.8613 -1.320892,-1.1833 -2.371213,-1.686 -1.724935,-0.8255 -2.500938,-0.9977 -4.419694,-0.9806 -1.3037,0.012 -1.789903,0.078 -2.659024,0.3631 -2.573677,0.8441 -4.593833,2.5556 -5.727803,4.8525 -0.826058,1.6733 -1.095012,2.944 -1.007199,4.7588 0.217877,4.502 3.338466,8.0392 7.937336,8.9969 0.81339,0.1694 2.876191,0.071 3.896977,-0.1864 z"
id="path6535" />
<path
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:1.1632489;stroke-opacity:1"
d="m 30.434149,1027.6409 c -0.934321,-0.2194 -2.398328,-1.0873 -3.118181,-1.8484 -2.480698,-2.623 -2.418499,-6.5741 0.143591,-9.1202 2.522587,-2.507 6.557199,-2.5048 9.122058,0 1.603993,1.5694 2.303559,3.9386 1.80349,6.1077 -0.518332,2.2485 -2.614507,4.3444 -4.863113,4.8629 -0.736116,0.1697 -2.350973,0.166 -3.087845,-0.012 z"
id="path6533" />
<path
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:1.1632489;stroke-opacity:1"
d="m 21.270726,1012.8887 c -0.0976,-0.5202 -0.682222,-1.113 -1.223284,-1.2405 -0.478723,-0.1128 -1.244048,0.1971 -1.543771,0.625 -0.450084,0.6426 -0.196298,1.7722 0.482702,2.1487 0.452294,0.2506 1.373692,0.2394 1.730711,-0.056 0.357018,-0.2951 0.650413,-0.9615 0.553642,-1.4773 z"
id="path6529" />
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 819 B

After

Width:  |  Height:  |  Size: 3.7 KiB

@@ -0,0 +1,49 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
version="1.1"
id="svg5332"
viewBox="0 0 64.000001 64.000001"
height="64"
width="64">
<defs
id="defs5334" />
<metadata
id="metadata5337">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<circle
cy="32.000004"
cx="32"
style="fill:none;stroke:#000000;stroke-width:4.359375;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="path7511-3-8-6-2-5-2-6"
r="28.820312" />
<path
id="path5361-4"
d="m 8.1113332,30.95822 9.1263358,8.3942 -8.9368928,7.6254"
style="fill:none;stroke:#000000;stroke-width:4.54343081;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<g
id="text3339"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:24.54616547px;line-height:120.00000477%;font-family:Arial;-inkscape-font-specification:'Arial, Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1">
<path
id="path3344"
style=""
d="m 37.969558,48.949154 -3.859309,0 -1.534135,-3.991149 -7.023464,0 -1.450237,3.991149 -3.763426,0 6.843682,-17.570644 3.751441,0 7.035448,17.570644 z m -6.53206,-6.951551 -2.421058,-6.520075 -2.373115,6.520075 4.794173,0 z" />
<path
id="path3346"
style=""
d="m 39.875242,31.37851 7.023463,0 q 2.085465,0 3.104227,0.179782 1.030747,0.167796 1.833771,0.719125 0.81501,0.55133 1.354354,1.474209 0.539345,0.910893 0.539345,2.049509 0,1.234499 -0.671185,2.265246 -0.659198,1.030748 -1.797814,1.546121 1.606047,0.467432 2.468999,1.594063 0.862951,1.12663 0.862951,2.64878 0,1.198543 -0.563316,2.337159 -0.55133,1.126631 -1.52215,1.809801 -0.958834,0.671184 -2.373115,0.826995 -0.886922,0.09588 -4.278799,0.119854 l -5.980731,0 0,-17.570644 z m 3.547688,2.924446 0,4.063061 2.325174,0 q 2.073479,0 2.576868,-0.05993 0.910892,-0.107869 1.426266,-0.623243 0.527359,-0.527359 0.527359,-1.378324 0,-0.81501 -0.455446,-1.318398 -0.443461,-0.515373 -1.330383,-0.623242 -0.527359,-0.05993 -3.032315,-0.05993 l -2.037523,0 z m 0,6.987507 0,4.698289 3.284008,0 q 1.917669,0 2.433043,-0.107869 0.791039,-0.143825 1.282441,-0.695155 0.503388,-0.563315 0.503388,-1.498179 0,-0.791038 -0.383533,-1.342368 -0.383534,-0.55133 -1.114646,-0.803024 -0.719126,-0.251694 -3.140183,-0.251694 l -2.864518,0 z" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.9 KiB

@@ -1,10 +1,49 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" version="1.1" width="68" height="53" viewBox="-0.462891 -0.018555 68 53" id="svg2" xml:space="preserve"><metadata id="metadata14"><rdf:RDF><cc:Work rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata>
<defs id="defs4">
</defs>
<path d="M 60.37793,0 H 6.289551 C 2.81543,0 0,2.802734 0,6.260742 v 40.071289 c 0,3.458008 2.81543,6.260742 6.289551,6.260742 H 60.37793 c 3.473633,0 6.288086,-2.802734 6.288086,-6.260742 V 6.260742 C 66.666016,2.802734 63.851563,0 60.37793,0 z M 20.739258,5.193359 c 1.229492,0 2.226074,0.991699 2.226074,2.215332 0,1.224121 -0.996582,2.21582 -2.226074,2.21582 -1.229492,0 -2.226074,-0.991699 -2.226074,-2.21582 0,-1.223632 0.996582,-2.215332 2.226074,-2.215332 z m -6.660645,0 c 1.229492,0 2.226074,0.991699 2.226074,2.215332 0,1.224121 -0.996582,2.21582 -2.226074,2.21582 -1.229004,0 -2.226074,-0.991699 -2.226074,-2.21582 0,-1.223632 0.99707,-2.215332 2.226074,-2.215332 z m -6.67041,0 c 1.223633,0 2.215332,0.991699 2.215332,2.215332 0,1.224121 -0.991699,2.21582 -2.215332,2.21582 -1.223633,0 -2.215332,-0.991699 -2.215332,-2.21582 0,-1.223632 0.991699,-2.215332 2.215332,-2.215332 z M 64.444336,45.18457 c 0,2.962891 -2.22168,5.185547 -5.18457,5.185547 H 7.407715 c -2.963379,0 -5.185547,-2.222656 -5.185547,-5.185547 V 13.333496 c 0,0.0049 62.14502,0 62.222168,0 V 45.18457 z" id="path6" />
<path d="m 5.3691063,21.009388 0,6.863626 54.9094277,0 0,-6.863626 z m 0,13.727252 0,6.863625 34.3183947,0 0,-6.863625 z" id="path3386" /></svg>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
version="1.1"
id="svg5332"
viewBox="0 0 64.000001 64.000001"
height="64"
width="64">
<defs
id="defs5334" />
<metadata
id="metadata5337">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
transform="translate(0,-988.36216)"
id="layer1">
<g
id="g5962"
transform="translate(0,-2.2617187e-5)">
<circle
cy="1020.3622"
cx="32"
style="fill:none;stroke:#000000;stroke-width:4.359375;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="path7511-3-8-6-2-5-2-6"
r="28.820312" />
<path
id="path5361-4"
d="m 15.97574,1019.3204 9.126336,8.3942 -8.936893,7.6254"
style="fill:none;stroke:#000000;stroke-width:4.54343081;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
id="path5363-3"
d="m 30.356373,1035.2409 13.806832,0"
style="fill:none;stroke:#000000;stroke-width:4.54343081;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.9 KiB

After

Width:  |  Height:  |  Size: 1.6 KiB

@@ -1,12 +1,33 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" version="1.2" width="64" height="64" viewBox="0 0 64 64" id="svg3254" xml:space="preserve"><metadata id="metadata11"><rdf:RDF><cc:Work rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs id="defs9" />
<g id="layer1">
<g transform="matrix(1.5756397,0,0,1.6644338,54.170963,-1788.6456)" id="g3219">
<g transform="matrix(0.63466286,0,0,0.60080491,-55.333181,1055.0231)" id="g3488">
<path d="M 90.122,87.857 H 62.31 L 90.594,59.568 c 2.043,-2.042 2.043,-5.366 0,-7.409 L 80.59,42.157 c -0.795,-0.796 -1.785,-1.26 -2.817,-1.436 0.002,0 -4.577,0.241 -8.999,0.744 -1.358,0.153 -2.492,0.923 -3.284,1.714 L 37.616,71.055 c -2.043,2.043 -2.043,5.365 0,7.407 l 10.003,10.003 c 0.982,0.984 2.296,1.527 3.691,1.527 0.109,0 6.752,-0.131 6.821,-0.135 0.335,-0.031 1.14,-0.123 1.14,-0.123 h 30.851 c 0.518,0 0.938,-0.421 0.938,-0.939 0.001,-0.517 -0.421,-0.938 -0.938,-0.938 z M 60.339,86.862 c -1.226,1.225 -3.218,1.225 -4.446,0 L 45.89,76.86 c -1.226,-1.228 -1.226,-3.222 0,-4.445 L 60.138,58.167 74.544,72.655 60.339,86.862 z M 72.661,42.961 75.489,42.73 60.095,58.125 57.737,57.887 72.661,42.961 z M 39.098,76.983 c -1.227,-1.227 -1.227,-3.221 0,-4.448 l 15.049,-15.049 3.346,0.359 -13.086,13.086 c -2.042,2.042 -2.042,5.368 0,7.409 l 9.508,9.508 c -0.152,0.003 -0.289,0.005 -0.435,0.008 H 50.904 C 50.222,87.768 49.59,87.475 49.099,86.983 l -10.001,-10 z" id="path3495" style="fill:#042fb5" />
</g>
</g>
</g>
</svg>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
id="svg3254"
height="64"
width="64"
version="1.1">
<defs
id="defs3256" />
<metadata
id="metadata3259">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<path
d="M 34.720404,45.186814 52.10144,17.094529 c 1.25533,-2.028627 0.626297,-4.699942 -1.40233,-5.955275 L 40.764783,4.9921938 C 39.97448,4.5031479 39.091005,4.3170345 38.228028,4.3714288 c 0.0015,1.308e-4 -3.633307,1.0604815 -7.092404,2.3015 -1.063335,0.3806651 -1.829347,1.214316 -2.315397,1.9991581 L 11.690516,36.355735 c -1.255331,2.028628 -0.626617,4.698591 1.402012,5.953923 l 9.933987,6.147615 c 0.975952,0.605082 2.134546,0.792499 3.256228,0.528368 0.08739,-0.02058 5.402948,-1.383525 5.45772,-1.399275 0.263445,-0.08865 0.892584,-0.314309 0.892584,-0.314309 0.810732,-0.489373 1.461711,-1.26464 2.087357,-2.085243 z m -1.773055,-0.426415 c -0.753518,1.215825 -2.355407,1.593033 -3.573617,0.841504 l -9.933667,-6.146266 c -1.218053,-0.754894 -1.595473,-2.357682 -0.841609,-3.574063 l 8.756087,-14.149305 14.321501,8.919985 z M 34.542891,7.140056 36.772178,6.4187491 27.312007,21.707101 25.371326,21.962018 Z M 14.003992,40.839832 C 12.785808,40.086395 12.408388,38.483607 13.162064,37.264416 L 22.41019,22.319349 25.167971,21.974721 17.126272,34.97019 c -1.255333,2.028628 -0.625876,4.701744 1.40233,5.955274 l 9.442443,5.843061 c -0.121437,0.03147 -0.231009,0.05882 -0.347986,0.08903 l -2.070834,0.487634 c -0.564878,0.05838 -1.1286,-0.05802 -1.6159,-0.360723 z"
id="path3495" />
<path
id="path3388"
d="m 9.4915253,53.559323 44.2033897,-14.915255 1.423729,1.898305 -6.576271,2.779661 3.186441,-0.406779 -0.20339,0.813559 -4.745763,1.898305 7.457627,-1.559322 0,0.542373 6.847458,-1.152542 0.406779,1.220339 L 36,52.135594 l -9.762712,2.305085 -7.728813,3.525423 -8.067797,1.016949 0.0678,-1.084745 5.694915,-2.169492 -0.20339,-0.474576 -5.016949,1.694915 -6.5762717,0.813559 -0.4067791,-1.084745 8.8813558,-2.847458 -3.1864407,0.271186 z"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
</svg>

Before

Width:  |  Height:  |  Size: 1.8 KiB

After

Width:  |  Height:  |  Size: 2.5 KiB

@@ -1,21 +1,40 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" version="1.1" width="64" height="64" id="svg3254">
<defs id="defs3256" />
<metadata id="metadata3259">
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
id="svg3254"
height="64"
width="64"
version="1.1">
<defs
id="defs3256" />
<metadata
id="metadata3259">
<rdf:RDF>
<cc:Work rdf:about="">
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g id="layer1">
<g transform="matrix(1.5756397,0,0,1.6644338,54.170963,-1788.6456)" id="g3219" style="display:inline">
<g transform="matrix(0.63466286,0,0,0.60080491,-55.333181,1055.0231)" id="g3488">
<path d="M 90.121527,87.856832 H 62.310073 l 28.28445,-28.288377 c 2.042733,-2.042734 2.042733,-5.366031 0,-7.408767 L 80.591011,42.156731 c -0.795799,-0.795799 -1.785502,-1.260389 -2.817798,-1.4358 0.0017,5.61e-4 -4.576959,0.241542 -8.998683,0.744239 -1.35902,0.153556 -2.493313,0.923575 -3.284066,1.713768 l -27.874789,27.87647 c -2.042735,2.042734 -2.042735,5.364349 0,7.407085 L 47.618633,88.46601 c 0.982417,0.9841 2.296044,1.526587 3.691493,1.526587 0.108722,0 6.752515,-0.131138 6.821447,-0.1345 0.335131,-0.03137 1.139336,-0.122734 1.139336,-0.122734 h 30.850057 c 0.51783,0 0.939264,-0.421436 0.939264,-0.939266 0.0012,-0.517828 -0.420314,-0.939265 -0.938703,-0.939265 z M 60.338511,86.862085 c -1.225641,1.223959 -3.218499,1.223959 -4.445821,0 L 45.889735,76.860247 c -1.226203,-1.227882 -1.226203,-3.221858 0,-4.446378 L 60.13788,58.166282 74.542946,72.65541 60.338511,86.862085 z M 72.66105,42.961495 75.488937,42.730042 60.094728,58.12481 57.736476,57.886631 72.66105,42.961495 z M 39.097989,76.98298 c -1.226762,-1.226201 -1.226762,-3.220177 0,-4.44806 l 15.048988,-15.04899 3.346276,0.359231 -13.085832,13.085834 c -2.042737,2.042734 -2.042737,5.368272 0,7.408766 l 9.508103,9.508104 c -0.151875,0.0034 -0.288618,0.0052 -0.434887,0.0084 H 50.90438 C 50.222349,87.768285 49.590193,87.47462 49.099826,86.98257 L 39.097989,76.98299 z" id="path3495" />
<g
id="layer1">
<g
style="display:inline"
id="g3219"
transform="matrix(1.5756397,0,0,1.6644338,54.170963,-1788.6456)">
<g
id="g3488"
transform="matrix(0.63466286,0,0,0.60080491,-55.333181,1055.0231)">
<path
id="path3495"
d="M 90.121527,87.856832 H 62.310073 l 28.28445,-28.288377 c 2.042733,-2.042734 2.042733,-5.366031 0,-7.408767 L 80.591011,42.156731 c -0.795799,-0.795799 -1.785502,-1.260389 -2.817798,-1.4358 0.0017,5.61e-4 -4.576959,0.241542 -8.998683,0.744239 -1.35902,0.153556 -2.493313,0.923575 -3.284066,1.713768 l -27.874789,27.87647 c -2.042735,2.042734 -2.042735,5.364349 0,7.407085 L 47.618633,88.46601 c 0.982417,0.9841 2.296044,1.526587 3.691493,1.526587 0.108722,0 6.752515,-0.131138 6.821447,-0.1345 0.335131,-0.03137 1.139336,-0.122734 1.139336,-0.122734 h 30.850057 c 0.51783,0 0.939264,-0.421436 0.939264,-0.939266 0.0012,-0.517828 -0.420314,-0.939265 -0.938703,-0.939265 z M 60.338511,86.862085 c -1.225641,1.223959 -3.218499,1.223959 -4.445821,0 L 45.889735,76.860247 c -1.226203,-1.227882 -1.226203,-3.221858 0,-4.446378 L 60.13788,58.166282 74.542946,72.65541 60.338511,86.862085 z M 72.66105,42.961495 75.488937,42.730042 60.094728,58.12481 57.736476,57.886631 72.66105,42.961495 z M 39.097989,76.98298 c -1.226762,-1.226201 -1.226762,-3.220177 0,-4.44806 l 15.048988,-15.04899 3.346276,0.359231 -13.085832,13.085834 c -2.042737,2.042734 -2.042737,5.368272 0,7.408766 l 9.508103,9.508104 c -0.151875,0.0034 -0.288618,0.0052 -0.434887,0.0084 H 50.90438 C 50.222349,87.768285 49.590193,87.47462 49.099826,86.98257 L 39.097989,76.98299 z" />
</g>
</g>
</g>

Before

Width:  |  Height:  |  Size: 2.2 KiB

After

Width:  |  Height:  |  Size: 2.3 KiB

@@ -0,0 +1,47 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
id="svg2"
viewBox="0 0 24 24"
height="24"
width="24"
version="1.2">
<metadata
id="metadata12">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs10" />
<path
id="path3336"
d="m 11.998047,14.830593 a 3.1280487,3.1280487 0 0 0 3.128906,-3.128906 3.1280487,3.1280487 0 0 0 -3.128906,-3.1289062 3.1280487,3.1280487 0 0 0 -3.1289061,3.1289062 3.1280487,3.1280487 0 0 0 3.1289061,3.128906 z m 0,-1.007813 A 2.1213202,2.1213202 0 0 1 9.8769529,11.701687 2.1213202,2.1213202 0 0 1 11.998047,9.5805928 2.1213202,2.1213202 0 0 1 14.11914,11.701687 2.1213202,2.1213202 0 0 1 11.998047,13.82278 Z"
style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.70899999;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
<path
id="rect4153"
d="m 11.294665,22.801039 1.677734,0 0,-9.142578 a 2.2112069,2.3010933 0 0 1 -1.033203,0.267578 2.2112069,2.3010933 0 0 1 -0.644531,-0.09961 l 0,8.97461 z m 0,-13.3750002 a 2.2112069,2.3010933 0 0 1 0.644531,-0.101563 2.2112069,2.3010933 0 0 1 1.033203,0.267579 l 0,-8.68945395 -1.677734,0 0,8.52343795 z"
style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.70899999;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
<circle
r="0"
cy="13.5"
cx="74.440681"
id="path3336-6"
style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.70899999;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
<circle
r="0"
style="opacity:1;fill:#fffdfd;fill-opacity:1;stroke:none;stroke-width:0.70899999;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="circle3343-7"
cx="74.440681"
cy="13.5" />
</svg>

After

Width:  |  Height:  |  Size: 2.3 KiB

@@ -0,0 +1,47 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
id="svg2"
viewBox="0 0 24 24"
height="24"
width="24"
version="1.2">
<metadata
id="metadata12">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs10" />
<path
id="path3336"
d="m 11.998047,14.830593 a 3.1280487,3.1280487 0 0 0 3.128906,-3.128906 3.1280487,3.1280487 0 0 0 -3.128906,-3.1289062 3.1280487,3.1280487 0 0 0 -3.1289061,3.1289062 3.1280487,3.1280487 0 0 0 3.1289061,3.128906 z m 0,-1.007813 A 2.1213202,2.1213202 0 0 1 9.8769529,11.701687 2.1213202,2.1213202 0 0 1 11.998047,9.5805928 2.1213202,2.1213202 0 0 1 14.11914,11.701687 2.1213202,2.1213202 0 0 1 11.998047,13.82278 Z"
style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.70899999;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
<path
id="rect4153"
d="M 11.294922 0.90234375 L 11.294922 2.5429688 L 12.972656 2.5429688 L 12.972656 0.90234375 L 11.294922 0.90234375 z M 11.294922 4.1191406 L 11.294922 5.6445312 L 12.972656 5.6445312 L 12.972656 4.1191406 L 11.294922 4.1191406 z M 11.294922 7.2207031 L 11.294922 9.4257812 A 2.2112069 2.3010933 0 0 1 11.939453 9.3242188 A 2.2112069 2.3010933 0 0 1 12.972656 9.5917969 L 12.972656 7.2207031 L 11.294922 7.2207031 z M 12.972656 13.658203 A 2.2112069 2.3010933 0 0 1 11.939453 13.925781 A 2.2112069 2.3010933 0 0 1 11.294922 13.826172 L 11.294922 16.220703 L 12.972656 16.220703 L 12.972656 13.658203 z M 11.294922 17.796875 L 11.294922 19.423828 L 12.972656 19.423828 L 12.972656 17.796875 L 11.294922 17.796875 z M 11.294922 21 L 11.294922 22.800781 L 12.972656 22.800781 L 12.972656 21 L 11.294922 21 z "
style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.70899999;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
<circle
r="0"
cy="13.5"
cx="74.440681"
id="path3336-6"
style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.70899999;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
<circle
r="0"
style="opacity:1;fill:#fffdfd;fill-opacity:1;stroke:none;stroke-width:0.70899999;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="circle3343-7"
cx="74.440681"
cy="13.5" />
</svg>

After

Width:  |  Height:  |  Size: 2.8 KiB

@@ -0,0 +1,47 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
id="svg2"
viewBox="0 0 24 24"
height="24"
width="24"
version="1.2">
<metadata
id="metadata12">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs10" />
<path
id="path3336"
d="M 9.0192742,11.85182 A 3.1280487,3.1280487 0 0 0 12.14818,14.980726 3.1280487,3.1280487 0 0 0 15.277086,11.85182 3.1280487,3.1280487 0 0 0 12.14818,8.7229136 3.1280487,3.1280487 0 0 0 9.0192742,11.85182 Z m 1.0078128,0 A 2.1213202,2.1213202 0 0 1 12.14818,9.7307256 2.1213202,2.1213202 0 0 1 14.269274,11.85182 2.1213202,2.1213202 0 0 1 12.14818,13.972913 2.1213202,2.1213202 0 0 1 10.027087,11.85182 Z"
style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.70899999;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
<path
id="rect4153"
d="M 1.0488281 11.148438 L 1.0488281 12.826172 L 10.191406 12.826172 A 2.3010933 2.2112069 0 0 1 9.9238281 11.792969 A 2.3010933 2.2112069 0 0 1 10.023438 11.148438 L 1.0488281 11.148438 z M 14.423828 11.148438 A 2.3010933 2.2112069 0 0 1 14.525391 11.792969 A 2.3010933 2.2112069 0 0 1 14.257812 12.826172 L 22.947266 12.826172 L 22.947266 11.148438 L 14.423828 11.148438 z "
style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.70899999;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
<circle
r="0"
cy="13.5"
cx="74.440681"
id="path3336-6"
style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.70899999;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
<circle
r="0"
style="opacity:1;fill:#fffdfd;fill-opacity:1;stroke:none;stroke-width:0.70899999;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="circle3343-7"
cx="74.440681"
cy="13.5" />
</svg>

After

Width:  |  Height:  |  Size: 2.4 KiB

@@ -0,0 +1,47 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
id="svg2"
viewBox="0 0 24 24"
height="24"
width="24"
version="1.2">
<metadata
id="metadata12">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs10" />
<path
id="path3336"
d="m 9.0190163,11.851562 a 3.1280487,3.1280487 0 0 0 3.1289057,3.128906 3.1280487,3.1280487 0 0 0 3.128907,-3.128906 3.1280487,3.1280487 0 0 0 -3.128907,-3.1289057 3.1280487,3.1280487 0 0 0 -3.1289057,3.1289057 z m 1.0078127,0 a 2.1213202,2.1213202 0 0 1 2.121093,-2.1210937 2.1213202,2.1213202 0 0 1 2.121095,2.1210937 2.1213202,2.1213202 0 0 1 -2.121095,2.121093 2.1213202,2.1213202 0 0 1 -2.121093,-2.121093 z"
style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.70899999;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
<path
id="rect4153"
d="m 22.947266,11.148437 -1.640625,0 0,1.677734 1.640625,0 0,-1.677734 z m -3.216797,0 -1.525391,0 0,1.677734 1.525391,0 0,-1.677734 z m -3.101563,0 -2.205078,0 a 2.3010933,2.2112069 0 0 1 0.101563,0.644531 2.3010933,2.2112069 0 0 1 -0.267579,1.033203 l 2.371094,0 0,-1.677734 z m -6.4375,1.677734 a 2.3010933,2.2112069 0 0 1 -0.2675777,-1.033203 2.3010933,2.2112069 0 0 1 0.099609,-0.644531 l -2.3945307,0 0,1.677734 2.5624997,0 z m -4.1386717,-1.677734 -1.626953,0 0,1.677734 1.626953,0 0,-1.677734 z m -3.203125,0 -1.800781,0 0,1.677734 1.800781,0 0,-1.677734 z"
style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.70899999;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
<circle
r="0"
cy="13.5"
cx="74.440681"
id="path3336-6"
style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.70899999;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
<circle
r="0"
style="opacity:1;fill:#fffdfd;fill-opacity:1;stroke:none;stroke-width:0.70899999;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="circle3343-7"
cx="74.440681"
cy="13.5" />
</svg>

After

Width:  |  Height:  |  Size: 2.6 KiB

@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" version="1.2" width="24" height="24" viewBox="0 0 24 24" id="svg2">
<defs id="defs8" />
<path d="M 22.3,8 H 19.9 C 19.5,6.8 18.4,6 17.1,6 h -6 c 0,-1.1 -0.9,-2 -2,-2 H 5 C 3.3,4 2,5.3 2,7 v 10 c 0,1.7 1.3,3 3,3 h 12 c 1.7,0 3.4,-1.3 3.8,-3 L 23,9 C 23.1,8.4 22.8,8 22.3,8 z M 4,9 V 7 C 4,6.4 4.4,6 5,6 h 4 c 0,1.1 0.9,2 2,2 h 6 c 0.6,0 1,0.4 1,1 H 6.9 C 6.3,9 5.8,9.4 5.6,10 L 4,16.3 V 9 z m 14.9,7.5 C 18.7,17.3 17.8,18 17,18 H 5 C 5,18 4.6,17.8 4.8,17.2 l 1.9,-7 C 6.7,10.1 6.9,10 7,10 h 13.7 l -1.8,6.5 z" id="path4" />
</svg>

After

Width:  |  Height:  |  Size: 783 B

@@ -0,0 +1,75 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
id="svg2"
viewBox="0 0 24 24"
height="24"
width="24"
version="1.2">
<metadata
id="metadata12">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs10" />
<path
id="path3336"
d="M 9.0192742,11.85182 A 3.1280487,3.1280487 0 0 0 12.14818,14.980726 3.1280487,3.1280487 0 0 0 15.277086,11.85182 3.1280487,3.1280487 0 0 0 12.14818,8.7229136 3.1280487,3.1280487 0 0 0 9.0192742,11.85182 Z m 1.0078128,0 A 2.1213202,2.1213202 0 0 1 12.14818,9.7307256 2.1213202,2.1213202 0 0 1 14.269274,11.85182 2.1213202,2.1213202 0 0 1 12.14818,13.972913 2.1213202,2.1213202 0 0 1 10.027087,11.85182 Z"
style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.70899999;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
<rect
transform="matrix(0,-1,1,0,0,0)"
style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.70899999;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect4151"
width="12.340152"
height="1.6779661"
x="-18.021896"
y="5.6419506" />
<rect
transform="matrix(0,-1,1,0,0,0)"
y="1.5233065"
x="-18.021896"
height="1.6779661"
width="12.340152"
id="rect4153"
style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.70899999;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
<rect
transform="matrix(0,-1,1,0,0,0)"
y="17.086863"
x="-18.021896"
height="1.6779661"
width="12.340152"
id="rect4155"
style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.70899999;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
<rect
transform="matrix(0,-1,1,0,0,0)"
style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.70899999;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect4157"
width="12.340152"
height="1.6779661"
x="-18.021896"
y="20.798727" />
<circle
r="0"
cy="13.5"
cx="74.440681"
id="path3336-6"
style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.70899999;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
<circle
r="0"
style="opacity:1;fill:#fffdfd;fill-opacity:1;stroke:none;stroke-width:0.70899999;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="circle3343-7"
cx="74.440681"
cy="13.5" />
</svg>

After

Width:  |  Height:  |  Size: 3.2 KiB

@@ -0,0 +1,59 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
id="svg2"
viewBox="0 0 24 24"
height="24"
width="24"
version="1.2">
<metadata
id="metadata12">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs10" />
<path
id="path3336"
d="m 8.7009423,11.864221 a 3.1280487,3.1280487 0 0 0 3.1289067,3.128906 3.1280487,3.1280487 0 0 0 3.128906,-3.128906 3.1280487,3.1280487 0 0 0 -3.128906,-3.1289059 3.1280487,3.1280487 0 0 0 -3.1289067,3.1289059 z m 1.0078124,0 a 2.1213202,2.1213202 0 0 1 2.1210943,-2.1210939 2.1213202,2.1213202 0 0 1 2.121094,2.1210939 2.1213202,2.1213202 0 0 1 -2.121094,2.121094 2.1213202,2.1213202 0 0 1 -2.1210943,-2.121094 z"
style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.70899999;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
<circle
r="0"
cy="13.5"
cx="74.440681"
id="path3336-6"
style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.70899999;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
<circle
r="0"
style="opacity:1;fill:#fffdfd;fill-opacity:1;stroke:none;stroke-width:0.70899999;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="circle3343-7"
cx="74.440681"
cy="13.5" />
<path
id="path4154"
d="M 3.2141393,18.8352 7.8153934,11.926279 3.3352254,5.1991721"
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.82534468px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.82534468px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 0.48159108,18.8352 5.0828452,11.926279 0.60267718,5.1991721"
id="path4156" />
<path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.82534468px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 20.479931,18.8352 15.878677,11.926279 20.358845,5.1991721"
id="path4158" />
<path
id="path4160"
d="M 23.212479,18.8352 18.611225,11.926279 23.091393,5.1991721"
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.82534468px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
</svg>

After

Width:  |  Height:  |  Size: 2.8 KiB

@@ -0,0 +1,71 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
id="svg2"
viewBox="0 0 24 24"
height="24"
width="24"
version="1.2">
<metadata
id="metadata12">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs10" />
<path
id="path3336"
d="M 12 8.8710938 A 3.1280487 3.1280487 0 0 0 8.8710938 12 A 3.1280487 3.1280487 0 0 0 12 15.128906 A 3.1280487 3.1280487 0 0 0 15.128906 12 A 3.1280487 3.1280487 0 0 0 12 8.8710938 z M 12 9.8789062 A 2.1213202 2.1213202 0 0 1 14.121094 12 A 2.1213202 2.1213202 0 0 1 12 14.121094 A 2.1213202 2.1213202 0 0 1 9.8789062 12 A 2.1213202 2.1213202 0 0 1 12 9.8789062 z "
style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.70899999;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
<rect
style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.70899999;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect4151"
width="12.340152"
height="1.6779661"
x="5.8299241"
y="5.4937701" />
<rect
y="1.3751261"
x="5.8299241"
height="1.6779661"
width="12.340152"
id="rect4153"
style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.70899999;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
<rect
y="16.938683"
x="5.8299241"
height="1.6779661"
width="12.340152"
id="rect4155"
style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.70899999;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
<rect
style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.70899999;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect4157"
width="12.340152"
height="1.6779661"
x="5.8299241"
y="20.650547" />
<circle
r="0"
cy="13.5"
cx="74.440681"
id="path3336-6"
style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.70899999;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
<circle
r="0"
style="opacity:1;fill:#fffdfd;fill-opacity:1;stroke:none;stroke-width:0.70899999;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="circle3343-7"
cx="74.440681"
cy="13.5" />
</svg>

After

Width:  |  Height:  |  Size: 3.0 KiB

@@ -0,0 +1,59 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
id="svg2"
viewBox="0 0 24 24"
height="24"
width="24"
version="1.2">
<metadata
id="metadata12">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs10" />
<path
id="path3336"
d="M 12 8.8710938 A 3.1280487 3.1280487 0 0 0 8.8710938 12 A 3.1280487 3.1280487 0 0 0 12 15.128906 A 3.1280487 3.1280487 0 0 0 15.128906 12 A 3.1280487 3.1280487 0 0 0 12 8.8710938 z M 12 9.8789062 A 2.1213202 2.1213202 0 0 1 14.121094 12 A 2.1213202 2.1213202 0 0 1 12 14.121094 A 2.1213202 2.1213202 0 0 1 9.8789062 12 A 2.1213202 2.1213202 0 0 1 12 9.8789062 z "
style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.70899999;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
<circle
r="0"
cy="13.5"
cx="74.440681"
id="path3336-6"
style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.70899999;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
<circle
r="0"
style="opacity:1;fill:#fffdfd;fill-opacity:1;stroke:none;stroke-width:0.70899999;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="circle3343-7"
cx="74.440681"
cy="13.5" />
<path
id="path4154"
d="m 5.0290206,3.3842908 6.9089214,4.6012541 6.727107,-4.480168"
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.82534468px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.82534468px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 5.0290206,0.65174257 11.937942,5.2529967 18.665049,0.77282867"
id="path4156" />
<path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.82534468px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 5.0290206,20.650082 6.9089214,-4.601254 6.727107,4.480168"
id="path4158" />
<path
id="path4160"
d="m 5.0290206,23.38263 6.9089214,-4.601254 6.727107,4.480168"
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.82534468px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
</svg>

After

Width:  |  Height:  |  Size: 2.7 KiB

@@ -1,15 +1,40 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" version="1.2" width="64" height="64" viewBox="0 0 64 64" id="svg3254" xml:space="preserve"><metadata id="metadata11"><rdf:RDF><cc:Work rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs id="defs9" />
<g id="layer1">
<g transform="matrix(1.5756397,0,0,1.6644338,54.170963,-1788.6456)" id="g3219">
<g transform="matrix(0.63466286,0,0,0.60080491,-55.333181,1055.0231)" id="g3488">
<path d="m 89.528,64.797 c 0,13.331 -10.805,24.134 -24.135,24.134 -13.33,0 -24.134,-10.804 -24.134,-24.134 0,-13.331 10.804,-24.135 24.134,-24.135 13.33,0 24.135,10.803 24.135,24.135 z" id="path3474" style="fill:none;stroke:#7d0297;stroke-width:6;stroke-miterlimit:10" />
<path d="m 68.948,59.507 -3.057,14.439 c -0.129,0.552 -0.17,0.976 -0.17,1.358 0,1.189 0.551,1.572 1.742,1.572 0.762,0 1.104,-0.126 1.358,-0.253 -0.214,3.014 -2.38,4.373 -4.673,4.373 -2.548,0 -4.544,-1.528 -4.544,-5.099 0,-0.804 0.128,-1.738 0.34,-2.76 l 2.889,-13.632 6.115,0.002 0,0 z m -1.91,-11.035 c 1.868,0 3.398,1.528 3.398,3.396 0,1.87 -1.531,3.357 -3.398,3.357 -1.87,0 -3.355,-1.487 -3.355,-3.357 -10e-4,-1.868 1.485,-3.396 3.355,-3.396 z" id="path3476" style="fill:#9b0297;stroke:#7d0297;stroke-miterlimit:10" />
</g>
</g>
</g>
</svg>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
version="1.1"
id="svg5332"
viewBox="0 0 64.000001 64.000001"
height="64"
width="64">
<defs
id="defs5334" />
<metadata
id="metadata5337">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
transform="translate(0,-988.36216)"
id="layer1">
<path
id="path3476"
d="m 35.552054,1014.4088 -3.057829,14.4391 c -0.128038,0.552 -0.168924,0.9759 -0.168924,1.359 0,1.1894 0.549807,1.5724 1.741952,1.5724 0.761768,0 1.103917,-0.1264 1.358378,-0.2533 -0.214113,3.0137 -2.379985,4.3726 -4.673358,4.3726 -2.54837,0 -4.544783,-1.5284 -4.544783,-5.0978 0,-0.8043 0.128038,-1.7393 0.339998,-2.7604 l 2.888907,-13.6322 6.115659,0 z m -1.910875,-11.0355 c 1.868375,0 3.397828,1.5279 3.397828,3.3957 0,1.87 -1.529991,3.3575 -3.397828,3.3575 -1.869988,0 -3.354789,-1.4875 -3.354789,-3.3575 -5.38e-4,-1.8678 1.484801,-3.3957 3.354789,-3.3957 z" />
<circle
r="26.662109"
id="path7511-3-8-6-2-5-2-6-2-3"
style="fill:none;stroke:#000000;stroke-width:4.03292418;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
cx="32"
cy="1020.3622" />
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.6 KiB

After

Width:  |  Height:  |  Size: 1.6 KiB

@@ -1,23 +1,44 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" version="1.1" width="64" height="64" id="svg3254">
<defs id="defs3256" />
<metadata id="metadata3259">
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
version="1.1"
id="svg5332"
viewBox="0 0 64.000001 64.000001"
height="64"
width="64">
<defs
id="defs5334" />
<metadata
id="metadata5337">
<rdf:RDF>
<cc:Work rdf:about="">
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g id="layer1">
<g transform="matrix(1.5756397,0,0,1.6644338,54.170963,-1788.6456)" id="g3219" style="display:inline">
<g transform="matrix(0.63466286,0,0,0.60080491,-55.333181,1055.0231)" id="g3488">
<path d="m 89.527433,64.796857 c 0,13.330947 -10.804079,24.134502 -24.134474,24.134502 -13.329856,0 -24.133935,-10.803555 -24.133935,-24.134502 0,-13.330947 10.804079,-24.135039 24.133935,-24.135039 13.330395,0 24.134474,10.803554 24.134474,24.135039 z" id="path3474" style="fill:none;stroke:#000000;stroke-width:6;stroke-miterlimit:10" />
<path d="m 68.948411,59.507519 -3.057829,14.43917 c -0.128038,0.551959 -0.168924,0.975881 -0.168924,1.358917 0,1.189456 0.549807,1.572493 1.741952,1.572493 0.761768,0 1.103917,-0.126424 1.358378,-0.253385 -0.214113,3.013719 -2.379985,4.372636 -4.673358,4.372636 -2.54837,0 -4.544783,-1.528378 -4.544783,-5.097822 0,-0.804269 0.128038,-1.739264 0.339998,-2.760335 l 2.888907,-13.632212 h 6.115659 z M 67.037536,48.472098 c 1.868375,0 3.397828,1.527841 3.397828,3.395679 0,1.869991 -1.529991,3.357484 -3.397828,3.357484 -1.869988,0 -3.354789,-1.487493 -3.354789,-3.357484 -5.38e-4,-1.867838 1.484801,-3.395679 3.354789,-3.395679 z" id="path3476" />
</g>
<g
transform="translate(0,-988.36216)"
id="layer1">
<g
id="g5857"
transform="translate(0,-2.2617187e-5)">
<circle
cy="1020.3622"
cx="32"
style="fill:none;stroke:#000000;stroke-width:4.359375;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="path7511-3-8-6-2-5-2-6"
r="28.820312" />
<path
d="m 35.552054,1014.4088 -3.057829,14.4391 c -0.128038,0.552 -0.168924,0.9759 -0.168924,1.359 0,1.1894 0.549807,1.5724 1.741952,1.5724 0.761768,0 1.103917,-0.1264 1.358378,-0.2533 -0.214113,3.0137 -2.379985,4.3726 -4.673358,4.3726 -2.54837,0 -4.544783,-1.5284 -4.544783,-5.0978 0,-0.8043 0.128038,-1.7393 0.339998,-2.7604 l 2.888907,-13.6322 6.115659,0 z m -1.910875,-11.0355 c 1.868375,0 3.397828,1.5279 3.397828,3.3957 0,1.87 -1.529991,3.3575 -3.397828,3.3575 -1.869988,0 -3.354789,-1.4875 -3.354789,-3.3575 -5.38e-4,-1.8678 1.484801,-3.3957 3.354789,-3.3957 z"
id="path3476" />
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.9 KiB

After

Width:  |  Height:  |  Size: 1.7 KiB

@@ -1,18 +1,85 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" version="1.2" width="64" height="64" viewBox="0 0 64 64" id="svg3254" xml:space="preserve"><defs id="defs14" />
<g id="layer1">
<g transform="matrix(1.5756397,0,0,1.6644338,54.170963,-1788.6456)" id="g3219">
<path d="m -15.805,1110.28 c 0.028,-0.49 0.111,-1.315 0.185,-1.835 0.124,-0.872 0.086,-0.983 -0.492,-1.433 l -0.626,-0.488 -1.778,0.613 c -0.978,0.336 -1.851,0.593 -1.94,0.57 -0.209,-0.053 -2.69,-4.165 -2.633,-4.364 0.024,-0.084 0.698,-0.667 1.497,-1.297 l 1.454,-1.147 -0.125,-0.736 c -0.121,-0.715 -0.164,-0.754 -1.498,-1.329 -2.442,-1.053 -2.267,-0.627 -1.441,-3.512 l 0.721,-2.515 1.515,0.148 c 2.351,0.229 2.385,0.224 2.887,-0.387 0.461,-0.561 0.461,-0.563 -0.086,-2.002 -0.301,-0.793 -0.597,-1.58 -0.659,-1.749 -0.087,-0.24 0.416,-0.594 2.277,-1.604 l 2.389,-1.296 1.163,1.353 c 1.257,1.461 1.43,1.563 2.337,1.378 0.534,-0.108 0.666,-0.264 1.223,-1.445 1.103,-2.335 0.67,-2.168 3.638,-1.405 l 2.587,0.664 -0.083,1.073 c -0.045,0.59 -0.107,1.323 -0.136,1.629 -0.096,0.995 -0.056,1.161 0.365,1.491 0.662,0.52 0.897,0.508 2.701,-0.135 l 1.708,-0.608 1.334,2.195 c 0.734,1.207 1.316,2.259 1.294,2.337 -0.022,0.079 -0.683,0.649 -1.468,1.269 -1.428,1.125 -1.428,1.126 -1.332,1.817 0.104,0.75 0.136,0.774 2.283,1.7 l 1.385,0.597 -0.722,2.521 -0.723,2.52 -0.542,-0.037 c -0.299,-0.02 -1.117,-0.084 -1.819,-0.139 -1.469,-0.119 -1.685,-0.063 -2.141,0.568 -0.301,0.417 -0.273,0.62 0.286,2.103 0.341,0.902 0.595,1.724 0.566,1.827 -0.061,0.21 -4.383,2.584 -4.603,2.528 -0.079,-0.02 -0.697,-0.665 -1.372,-1.433 l -1.229,-1.397 -0.767,0.171 c -0.743,0.166 -0.792,0.221 -1.574,1.77 -0.444,0.88 -0.818,1.618 -0.83,1.642 -0.012,0.023 -1.194,-0.26 -2.627,-0.628 l -2.604,-0.669 0.055,-0.894 z m 4.699,-1.662 c 0.403,-0.767 0.767,-1.407 0.808,-1.42 0.042,-0.019 0.917,-0.124 1.947,-0.246 l 1.872,-0.222 1.078,1.219 1.077,1.219 0.773,-0.435 0.773,-0.435 -0.576,-1.473 -0.576,-1.472 1.224,-1.497 1.223,-1.496 1.603,0.143 1.602,0.145 0.291,-0.806 0.291,-0.805 -1.302,-0.573 c -0.716,-0.316 -1.401,-0.658 -1.521,-0.761 -0.12,-0.103 -0.33,-0.99 -0.467,-1.97 l -0.249,-1.781 1.26,-1.001 1.261,-1.001 -0.458,-0.73 -0.459,-0.73 -1.453,0.494 c -0.8,0.272 -1.54,0.473 -1.645,0.446 -0.335,-0.086 -2.939,-2.101 -3.011,-2.329 -0.038,-0.121 0,-0.833 0.083,-1.584 l 0.152,-1.365 -0.9,-0.231 -0.9,-0.231 -0.652,1.36 c -0.358,0.748 -0.76,1.401 -0.892,1.452 -0.293,0.114 -3.494,0.461 -3.709,0.404 -0.084,-0.022 -0.594,-0.55 -1.134,-1.173 l -0.98,-1.133 -0.802,0.42 -0.802,0.419 0.566,1.472 0.566,1.473 -0.474,0.566 c -0.26,0.311 -0.769,0.944 -1.129,1.406 -0.36,0.462 -0.808,0.868 -0.994,0.904 -0.186,0.035 -0.977,0.02 -1.758,-0.064 l -1.42,-0.127 -0.226,0.787 c -0.254,0.886 -0.301,0.836 1.483,1.596 l 1.282,0.546 0.283,1.875 0.283,1.875 -1.299,1.022 -1.299,1.023 0.363,0.629 c 0.199,0.347 0.453,0.654 0.563,0.682 0.111,0.028 0.865,-0.16 1.677,-0.421 l 1.476,-0.472 1.462,1.078 c 0.804,0.593 1.495,1.163 1.534,1.268 0.04,0.104 0.005,0.795 -0.077,1.535 -0.082,0.739 -0.109,1.411 -0.059,1.493 0.049,0.082 0.436,0.212 0.86,0.29 l 0.77,0.141 0.737,-1.398 z m -1.432,-4.941 c -2.207,-1.374 -3.184,-3.549 -2.667,-5.939 1.055,-4.879 7.628,-6.017 10.666,-1.848 0.253,0.348 0.578,1.186 0.721,1.863 0.468,2.204 -0.517,4.48 -2.466,5.699 -1.396,0.874 -2.844,1.122 -4.5,0.772 -0.73,-0.154 -1.518,-0.402 -1.754,-0.547 l 0,0 z m 3.043,-1.343 c 2.247,-0.02 3.962,-2.039 3.536,-4.18 -0.487,-2.451 -3.773,-3.601 -5.816,-2.036 -1.947,1.491 -1.879,4.26 0.138,5.587 0.793,0.522 1.176,0.635 2.143,0.628 l -10e-4,10e-4 z" id="path4448-4-4" style="fill:#007f00" />
<path d="m -24.424,1077.473 h 13.202 c 3.947,0 7.146,3.199 7.146,7.146 v 7.859 c 0,3.947 -3.199,7.146 -7.146,7.146 h -13.202 c -3.946,0 -7.146,-3.199 -7.146,-7.146 v -7.859 c 0,-3.947 3.199,-7.146 7.146,-7.146 z" id="rect3980-2-6" style="fill:#757575" />
<path d="m -24.761,1077.181 h 13.995 c 3.919,0 7.096,3.177 7.096,7.096 v 8.227 c 0,3.919 -3.177,7.096 -7.096,7.096 h -13.995 c -3.919,0 -7.096,-3.177 -7.096,-7.096 v -8.227 c 0,-3.919 3.177,-7.096 7.096,-7.096 z" id="rect3980-9" style="fill:none;stroke:#009100;stroke-width:1.23500001;stroke-linecap:round;stroke-linejoin:round" />
<g transform="matrix(1.4151129,0,0,1.4016181,-59.15926,-361.58526)" id="g4236-1">
<path d="m 34.219,1033.737 c 0,2.697 -2.186,4.884 -4.883,4.884 -2.697,0 -4.884,-2.186 -4.884,-4.884 0,-2.697 2.187,-4.884 4.884,-4.884 2.697,10e-4 4.883,2.187 4.883,4.884 z" id="path3984-8-3" style="fill:#008700;fill-opacity:1;stroke:#000100;stroke-width:0.38479999;stroke-linecap:round;stroke-linejoin:round" />
<path d="m 30.369,1028.415 -2.629,6.561 6.798,-2.771 -4.169,-3.79 z" id="path4007-7" style="fill:#ffffff" />
<path d="m 34.988,1030.354 c 0,1.421 -1.152,2.572 -2.574,2.572 -1.421,0 -2.574,-1.151 -2.574,-2.572 0,-1.421 1.152,-2.573 2.574,-2.573 1.421,10e-4 2.574,1.153 2.574,2.573 z" id="path4004-0" style="fill:#ffffff;stroke:#000000;stroke-width:0.43849999" />
</g>
</g>
</g>
</svg>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
version="1.1"
id="svg5332"
viewBox="0 0 64.000001 64.000001"
height="64"
width="64">
<defs
id="defs5334" />
<metadata
id="metadata5337">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
transform="translate(0,-988.36216)"
id="layer1">
<circle
r="26.662109"
id="path7511-3-8-6-2-5-2-6-2"
style="fill:none;stroke:#000000;stroke-width:4.03292418;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
cx="32"
cy="1020.3622" />
<path
id="path6700"
d="m 14.03679,1030.0123 c -2.35397,-0.7404 -2.770983,-5.7332 -1.120218,-13.4122 0.987656,-4.5944 2.475067,-8.7912 4.188046,-11.8168 1.229617,-2.1719 1.873402,-3.1037 2.610178,-3.778 1.504901,-1.37737 2.967128,-1.37137 5.395579,0.022 2.201718,1.2632 4.0896,1.7225 7.074552,1.7211 2.999245,0 4.913924,-0.4947 7.284808,-1.8772 2.656429,-1.54897 4.551968,-1.08027 6.319358,1.5624 0.681911,1.0196 2.022303,3.4016 2.535611,4.506 1.632208,3.5117 3.357153,9.8902 3.868976,14.3068 0.206417,1.7812 0.206698,4.5038 6.33e-4,5.6858 -0.325523,1.8667 -1.091397,2.9477 -2.243528,3.1667 -0.855362,0.1626 -2.481083,-0.479 -3.915795,-1.5455 -1.121505,-0.8337 -2.918598,-2.4684 -3.968669,-3.6102 -0.949211,-1.0321 -1.899385,-1.7431 -2.948415,-2.2063 -4.08595,-1.8044 -10.574009,-1.7161 -14.30132,0.1944 -1.070496,0.5488 -1.193141,0.6492 -3.132713,2.5664 -0.990096,0.9786 -2.194672,2.0957 -2.676836,2.4824 -2.158366,1.7309 -3.797692,2.4012 -4.970247,2.0324 z"
style="fill:none;stroke:#000000;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
id="path6698"
d="m 41.765778,1015.1083 c 0.568081,-0.3537 0.79519,-1.1501 0.503341,-1.7651 -0.474937,-1.0009 -1.912339,-1.0833 -2.485963,-0.1425 -0.762667,1.2509 0.730264,2.6873 1.982622,1.9076 z"
style="fill:#000000;fill-opacity:1" />
<path
id="path6696"
d="m 24.07221,1014.7677 c 0.291529,-0.3263 0.299033,-0.3652 0.299033,-1.5474 l 0,-1.2126 1.222411,0 c 1.203103,0 1.227163,-0.01 1.523294,-0.3008 0.362081,-0.3621 0.479435,-0.8888 0.325457,-1.4606 -0.197205,-0.7324 -0.38323,-0.8207 -1.814833,-0.8608 l -1.256329,-0.035 -0.0016,-1.1263 c -9.57e-4,-0.6826 -0.05326,-1.2302 -0.132821,-1.3902 -0.342577,-0.689 -1.606617,-0.8094 -2.205777,-0.2102 -0.294573,0.2945 -0.299604,0.3201 -0.299604,1.522 l 0,1.2224 -1.212623,0 c -1.190606,0 -1.218884,0.01 -1.557457,0.3081 -0.324066,0.2895 -0.344835,0.3505 -0.344835,1.0118 0,0.6612 0.02077,0.7222 0.344835,1.0117 0.338573,0.3025 0.366851,0.3082 1.557457,0.3082 l 1.212623,0 0,1.2 c 0,1.066 0.02522,1.2321 0.225764,1.4871 0.307439,0.3908 0.571593,0.4849 1.243841,0.443 0.486296,-0.03 0.616931,-0.086 0.87112,-0.3703 z"
style="fill:#000000;fill-opacity:1" />
<path
id="path6694"
d="m 44.971269,1012.161 c 1.026948,-0.5311 0.940958,-2.094 -0.13898,-2.5261 -1.456158,-0.5827 -2.622851,1.2236 -1.478744,2.2895 0.158362,0.1475 0.359205,0.2941 0.446317,0.3258 0.311523,0.1133 0.860548,0.072 1.171407,-0.089 z"
style="fill:#000000;fill-opacity:1" />
<path
id="path6692"
d="m 38.46863,1011.7501 c 1.047319,-0.4376 1.045723,-2.0367 -0.0025,-2.5342 -0.939802,-0.4459 -1.987167,0.2186 -1.987167,1.2607 0,0.5356 0.226698,0.9299 0.700872,1.219 0.401565,0.2448 0.793586,0.2614 1.288824,0.055 z"
style="fill:#000000;fill-opacity:1" />
<path
id="path6657"
d="m 41.912778,1008.6746 c 0.302866,-0.1566 0.717835,-0.8453 0.723272,-1.2003 0.0047,-0.3094 -0.425646,-1.0206 -0.724465,-1.1971 -0.408551,-0.2414 -1.040571,-0.2308 -1.459089,0.025 -1.156022,0.7048 -0.680367,2.5384 0.658506,2.5384 0.265072,0 0.625873,-0.074 0.801776,-0.1654 z"
style="fill:#000000;fill-opacity:1" />
<path
id="path5108-2-2-7-1-7-0-6"
d="m 23.681102,1038.8276 c -0.187887,2.2169 0.87114,3.4268 3.363249,3.4791 l 7.576969,-7.7314 3.32459,-0.077 2.126185,-2.1262 0.07737,-2.0489 -1.198395,-1.3144 -1.85559,1.9716 -2.164845,-0.077 -0.07728,-1.7784 2.087527,-2.1262 -1.314372,-1.2756 -2.242163,0.04 -2.087535,2.0102 -0.115969,3.5954 z"
style="fill:#030000;fill-opacity:1;stroke:none" />
<path
id="rect7808-9-3-1"
d="m 35.565335,1035.5075 3.626322,3.6263 c 0.78845,0.7757 -1.951438,3.5883 -2.763458,2.7634 l -3.626322,-3.6263 z"
style="fill:#000000;fill-opacity:1;stroke:none" />
<rect
transform="matrix(0.70710678,0.70710678,-0.70710678,0.70710678,0,0)"
y="708.09564"
x="743.69879"
height="2.0641963"
width="2.6759293"
id="rect7828-7-5"
style="fill:#000000;fill-opacity:1;stroke:none" />
<rect
transform="matrix(0.70710678,0.70710678,-0.70710678,0.70710678,0,0)"
y="708.50305"
x="744.7854"
height="1.1639781"
width="5.4537458"
id="rect7828-5-9-9"
style="fill:#000000;fill-opacity:1;stroke:none" />
</g>
</svg>

Before

Width:  |  Height:  |  Size: 5.1 KiB

After

Width:  |  Height:  |  Size: 5.3 KiB

@@ -1,18 +1,89 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" version="1.1" width="64" height="64" id="svg3254">
<defs id="defs3256" />
<g id="layer1">
<g transform="matrix(1.5756397,0,0,1.6644338,54.170963,-1788.6456)" id="g3219" style="display:inline">
<path d="m -15.804948,1110.2798 c 0.02792,-0.4898 0.111136,-1.3157 0.184859,-1.8355 0.123657,-0.8723 0.08577,-0.9827 -0.492201,-1.433 l -0.626209,-0.4877 -1.777652,0.6121 c -0.977654,0.3367 -1.850646,0.5934 -1.93993,0.5706 -0.209502,-0.053 -2.689644,-4.1649 -2.632607,-4.3638 0.02374,-0.084 0.697501,-0.6667 1.497265,-1.2975 l 1.454108,-1.1468 -0.124527,-0.7365 c -0.120885,-0.7155 -0.164131,-0.7535 -1.497938,-1.3292 -2.44191,-1.0527 -2.267523,-0.6268 -1.440666,-3.5118 l 0.720895,-2.5154 1.514864,0.1484 c 2.351578,0.2286 2.38512,0.2241 2.886555,-0.3865 0.46072,-0.5613 0.460632,-0.5632 -0.08611,-2.0025 -0.301026,-0.7927 -0.597509,-1.5798 -0.658862,-1.7492 -0.08688,-0.2399 0.415749,-0.5938 2.277221,-1.604 l 2.388763,-1.296 1.163547,1.3525 c 1.256899,1.4608 1.429425,1.5626 2.336111,1.3777 0.534545,-0.1079 0.6655389,-0.2639 1.2237319,-1.4449 1.103253,-2.3349 0.669842,-2.1676 3.63823,-1.4051 l 2.5864222,0.6644 -0.08233,1.0727 c -0.04525,0.5897 -0.106624,1.3225 -0.13632,1.6292 -0.09658,0.9949 -0.05598,1.1608 0.364627,1.491 0.662023,0.52 0.896696,0.5082 2.700966,-0.1353 l 1.7083605,-0.6084 1.3346706,2.1946 c 0.7340447,1.2072 1.3163479,2.2587 1.293957,2.3369 -0.022277,0.079 -0.6830622,0.6486 -1.4682671,1.2681 -1.4272235,1.1253 -1.4275789,1.126 -1.3315798,1.8165 0.1043322,0.7506 0.1364398,0.7747 2.2822984,1.7003 l 1.3858308,0.5978 -0.7223669,2.5201 -0.7223225,2.5202 -0.5422814,-0.037 c -0.298063,-0.02 -1.1164862,-0.084 -1.8185439,-0.139 -1.4690987,-0.1191 -1.6855317,-0.063 -2.1413967,0.5689 -0.301053,0.4164 -0.273356,0.6196 0.286068,2.1021 0.340623,0.9027 0.595434,1.7246 0.566195,1.8267 -0.06023,0.2102 -4.382702,2.5844 -4.602492,2.5278 -0.07857,-0.02 -0.6959462,-0.665 -1.3718942,-1.433 l -1.229018,-1.3965 -0.766457,0.1704 c -0.7422,0.1664 -0.792091,0.2214 -1.573926,1.7702 -0.4440739,0.8797 -0.8174139,1.6184 -0.8295809,1.6415 -0.01212,0.023 -1.193959,-0.2601 -2.626425,-0.6279 l -2.604472,-0.6689 z m 4.698467,-1.6615 c 0.403855,-0.7674 0.767853,-1.4066 0.808909,-1.4203 0.04113,-0.019 0.9169169,-0.1243 1.9464349,-0.2459 l 1.871875,-0.222 1.077619,1.2191 1.0776392,1.2188 0.773489,-0.4349 0.773546,-0.4351 -0.576268,-1.4725 -0.576236,-1.4723 1.223979,-1.4966 1.223979,-1.4964 1.602289,0.1426 1.6022575,0.1447 0.2911834,-0.8051 0.2911833,-0.8052 -1.3025821,-0.5732 c -0.7163951,-0.3152 -1.4008151,-0.6576 -1.5208931,-0.761 -0.120186,-0.1023 -0.330355,-0.9896 -0.467303,-1.9693 l -0.248971,-1.781 1.260465,-1.0013 1.260498,-1.0011 -0.4582964,-0.7303 -0.4582966,-0.73 -1.453181,0.4944 c -0.799225,0.2721 -1.539222,0.4726 -1.644418,0.4457 -0.334467,-0.086 -2.9395742,-2.1009 -3.0111132,-2.3288 -0.03776,-0.1207 -2.67e-4,-0.8331 0.08334,-1.5839 l 0.151989,-1.3651 -0.899838,-0.2311 -0.899838,-0.2312 -0.6519,1.3603 c -0.358534,0.7477 -0.760015,1.4012 -0.892146,1.4517 -0.292503,0.1138 -3.4946249,0.461 -3.7094449,0.4042 -0.08435,-0.022 -0.594311,-0.5499 -1.133242,-1.1734 l -0.979951,-1.1327 -0.802188,0.4195 -0.802183,0.4194 0.565688,1.4723 0.565656,1.4727 -0.473649,0.5663 c -0.260497,0.3113 -0.768691,0.9439 -1.129281,1.4055 -0.360602,0.4618 -0.807843,0.8684 -0.993907,0.9035 -0.186153,0.035 -0.977356,0.02 -1.758448,-0.064 l -1.420172,-0.1263 -0.225496,0.7868 c -0.254113,0.8864 -0.301382,0.8358 1.483423,1.5961 l 1.282044,0.5461 0.282546,1.8745 0.282558,1.875 -1.298844,1.022 -1.298875,1.0223 0.362538,0.6296 c 0.199386,0.3465 0.452953,0.653 0.563447,0.6813 0.110489,0.028 0.865211,-0.1591 1.677192,-0.4206 l 1.476309,-0.4724 1.462237,1.0779 c 0.804213,0.5929 1.494834,1.1635 1.534647,1.2682 0.03986,0.1047 0.0051,0.7951 -0.07726,1.5345 -0.08232,0.7394 -0.1092,1.4112 -0.05978,1.4929 0.04931,0.082 0.43654,0.2121 0.86019,0.2901 l 0.770373,0.141 z m -1.430842,-4.9409 c -2.207116,-1.3739 -3.183887,-3.5489 -2.667303,-5.9392 1.054562,-4.879 7.6275429,-6.0176 10.6654331,-1.8479 0.253141,0.3474 0.577949,1.1857 0.721795,1.8626 0.468134,2.2036 -0.516507,4.4794 -2.4659632,5.6991 -1.396417,0.8738 -2.844407,1.1219 -4.5005469,0.7719 -0.729507,-0.1537 -1.518069,-0.4011 -1.75356,-0.5459 z m 3.0421429,-1.3428 c 2.247258,-0.02 3.961584,-2.0393 3.53624,-4.1801 -0.486895,-2.451 -3.773255,-3.6015 -5.8168439,-2.0363 -1.947032,1.4913 -1.878862,4.2604 0.137582,5.5872 0.793779,0.5223 1.176595,0.6349 2.1432949,0.6282 z" id="path4448-4-4" style="fill:#000000;fill-opacity:1;display:inline" />
<rect width="27.494143" height="22.15127" ry="7.1462564" x="-31.570469" y="1077.4731" id="rect3980-2-6" style="fill:#757575;fill-opacity:1;stroke:none" />
<rect width="28.186502" height="22.418978" ry="7.0958796" x="-31.85692" y="1077.1814" id="rect3980-9" style="fill:none;stroke:#000100;stroke-width:1.23500371;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
<g transform="matrix(1.4151129,0,0,1.4016181,-59.15926,-361.58526)" id="g4236-1">
<path d="m -4.4642859,77.678574 a 4.2857141,4.2857141 0 1 1 -8.5714281,0 4.2857141,4.2857141 0 1 1 8.5714281,0 z" transform="matrix(1.13953,0,0,1.13953,39.306585,945.21999)" id="path3984-8-3" style="fill:#0c0000;fill-opacity:1;stroke:#000100;stroke-width:0.38477078;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
<path d="m 30.368507,1028.4151 -2.629324,6.5608 6.79834,-2.7712 z" id="path4007-7" style="fill:#ffffff;fill-opacity:1;stroke:none" />
<path d="m 34.987833,1030.3543 c 0,1.4208 -1.152235,2.5723 -2.573586,2.5723 -1.421352,0 -2.573587,-1.1515 -2.573587,-2.5723 0,-1.4207 1.152235,-2.5724 2.573587,-2.5724 1.421351,0 2.573586,1.1517 2.573586,2.5724 z" id="path4004-0" style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.43845785;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
</g>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
version="1.1"
id="svg5332"
viewBox="0 0 64.000001 64.000001"
height="64"
width="64">
<defs
id="defs5334" />
<metadata
id="metadata5337">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
transform="translate(0,-988.36216)"
id="layer1">
<g
id="g6707"
transform="translate(0,-2.2617187e-5)">
<circle
cy="1020.3622"
cx="32"
style="fill:none;stroke:#000000;stroke-width:4.359375;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="path7511-3-8-6-2-5-2-6-2"
r="28.820312" />
<path
style="fill:none;stroke:#000000;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 14.03679,1030.0123 c -2.35397,-0.7404 -2.770983,-5.7332 -1.120218,-13.4122 0.987656,-4.5944 2.475067,-8.7912 4.188046,-11.8168 1.229617,-2.1719 1.873402,-3.1037 2.610178,-3.778 1.504901,-1.37735 2.967128,-1.37135 5.395579,0.022 2.201718,1.2632 4.0896,1.7225 7.074552,1.7211 2.999245,0 4.913924,-0.4947 7.284808,-1.8772 2.656429,-1.54895 4.551968,-1.08025 6.319358,1.5624 0.681911,1.0196 2.022303,3.4016 2.535611,4.506 1.632208,3.5117 3.357153,9.8902 3.868976,14.3068 0.206417,1.7812 0.206698,4.5038 6.33e-4,5.6858 -0.325523,1.8667 -1.091397,2.9477 -2.243528,3.1667 -0.855362,0.1626 -2.481083,-0.479 -3.915795,-1.5455 -1.121505,-0.8337 -2.918598,-2.4684 -3.968669,-3.6102 -0.949211,-1.0321 -1.899385,-1.7431 -2.948415,-2.2063 -4.08595,-1.8044 -10.574009,-1.7161 -14.30132,0.1944 -1.070496,0.5488 -1.193141,0.6492 -3.132713,2.5664 -0.990096,0.9786 -2.194672,2.0957 -2.676836,2.4824 -2.158366,1.7309 -3.797692,2.4012 -4.970247,2.0324 z"
id="path6700" />
<path
style="fill:#000000;fill-opacity:1"
d="m 41.765778,1015.1083 c 0.568081,-0.3537 0.79519,-1.1501 0.503341,-1.7651 -0.474937,-1.0009 -1.912339,-1.0833 -2.485963,-0.1425 -0.762667,1.2509 0.730264,2.6873 1.982622,1.9076 z"
id="path6698" />
<path
style="fill:#000000;fill-opacity:1"
d="m 24.07221,1014.7677 c 0.291529,-0.3263 0.299033,-0.3652 0.299033,-1.5474 l 0,-1.2126 1.222411,0 c 1.203103,0 1.227163,-0.01 1.523294,-0.3008 0.362081,-0.3621 0.479435,-0.8888 0.325457,-1.4606 -0.197205,-0.7324 -0.38323,-0.8207 -1.814833,-0.8608 l -1.256329,-0.035 -0.0016,-1.1263 c -9.57e-4,-0.6826 -0.05326,-1.2302 -0.132821,-1.3902 -0.342577,-0.689 -1.606617,-0.8094 -2.205777,-0.2102 -0.294573,0.2945 -0.299604,0.3201 -0.299604,1.522 l 0,1.2224 -1.212623,0 c -1.190606,0 -1.218884,0.01 -1.557457,0.3081 -0.324066,0.2895 -0.344835,0.3505 -0.344835,1.0118 0,0.6612 0.02077,0.7222 0.344835,1.0117 0.338573,0.3025 0.366851,0.3082 1.557457,0.3082 l 1.212623,0 0,1.2 c 0,1.066 0.02522,1.2321 0.225764,1.4871 0.307439,0.3908 0.571593,0.4849 1.243841,0.443 0.486296,-0.03 0.616931,-0.086 0.87112,-0.3703 z"
id="path6696" />
<path
style="fill:#000000;fill-opacity:1"
d="m 44.971269,1012.161 c 1.026948,-0.5311 0.940958,-2.094 -0.13898,-2.5261 -1.456158,-0.5827 -2.622851,1.2236 -1.478744,2.2895 0.158362,0.1475 0.359205,0.2941 0.446317,0.3258 0.311523,0.1133 0.860548,0.072 1.171407,-0.089 z"
id="path6694" />
<path
style="fill:#000000;fill-opacity:1"
d="m 38.46863,1011.7501 c 1.047319,-0.4376 1.045723,-2.0367 -0.0025,-2.5342 -0.939802,-0.4459 -1.987167,0.2186 -1.987167,1.2607 0,0.5356 0.226698,0.9299 0.700872,1.219 0.401565,0.2448 0.793586,0.2614 1.288824,0.055 z"
id="path6692" />
<path
style="fill:#000000;fill-opacity:1"
d="m 41.912778,1008.6746 c 0.302866,-0.1566 0.717835,-0.8453 0.723272,-1.2003 0.0047,-0.3094 -0.425646,-1.0206 -0.724465,-1.1971 -0.408551,-0.2414 -1.040571,-0.2308 -1.459089,0.025 -1.156022,0.7048 -0.680367,2.5384 0.658506,2.5384 0.265072,0 0.625873,-0.074 0.801776,-0.1654 z"
id="path6657" />
<path
style="fill:#030000;fill-opacity:1;stroke:none"
d="m 23.681102,1038.8276 c -0.187887,2.2169 0.87114,3.4268 3.363249,3.4791 l 7.576969,-7.7314 3.32459,-0.077 2.126185,-2.1262 0.07737,-2.0489 -1.198395,-1.3144 -1.85559,1.9716 -2.164845,-0.077 -0.07728,-1.7784 2.087527,-2.1262 -1.314372,-1.2756 -2.242163,0.04 -2.087535,2.0102 -0.115969,3.5954 z"
id="path5108-2-2-7-1-7-0-6" />
<path
style="fill:#000000;fill-opacity:1;stroke:none"
d="m 35.565335,1035.5075 3.626322,3.6263 c 0.78845,0.7757 -1.951438,3.5883 -2.763458,2.7634 l -3.626322,-3.6263 z"
id="rect7808-9-3-1" />
<rect
style="fill:#000000;fill-opacity:1;stroke:none"
id="rect7828-7-5"
width="2.6759293"
height="2.0641963"
x="743.69879"
y="708.09564"
transform="matrix(0.70710678,0.70710678,-0.70710678,0.70710678,0,0)" />
<rect
style="fill:#000000;fill-opacity:1;stroke:none"
id="rect7828-5-9-9"
width="5.4537458"
height="1.1639781"
x="744.7854"
y="708.50305"
transform="matrix(0.70710678,0.70710678,-0.70710678,0.70710678,0,0)" />
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 6.1 KiB

After

Width:  |  Height:  |  Size: 5.5 KiB

@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" version="1.1" width="8" height="8" viewBox="0 0 8 8" id="svg2">
<defs id="defs8" />
<path d="m 0,3.7627118 0,0.4576272 8,0 0,-0.4576272 z" id="path4" />
</svg>

After

Width:  |  Height:  |  Size: 298 B

@@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.1" width="64" height="64" id="svg3007" inkscape:version="0.48.4 r9939" sodipodi:docname="mouse.svg">
<sodipodi:namedview pagecolor="#ffffff" bordercolor="#666666" borderopacity="1" objecttolerance="10" gridtolerance="10" guidetolerance="10" inkscape:pageopacity="0" inkscape:pageshadow="2" inkscape:window-width="640" inkscape:window-height="480" id="namedview8" showgrid="false" inkscape:zoom="3.6875" inkscape:cx="32" inkscape:cy="32" inkscape:current-layer="layer1" />
<defs id="defs3009" />
<metadata id="metadata3012">
<rdf:RDF>
<cc:Work rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g id="layer1">
<path d="m 32.627622,1.1648443 c -12.462898,0 -22.562142,8.7258932 -22.562142,19.4940177 v 22.27888 c 0,10.768123 10.099244,19.494018 22.562142,19.494018 12.462898,0 22.562144,-8.725895 22.562144,-19.494018 V 20.658862 C 55.189766,9.8907375 45.09052,1.1648443 32.627622,1.1648443 z M 49.817827,42.937742 c 0,8.168921 -7.735593,14.852585 -17.190205,14.852585 -9.454612,0 -17.190204,-6.683664 -17.190204,-14.852585 v -22.27888 c 0,-8.168921 7.735592,-14.8525846 17.190204,-14.8525846 9.454612,0 17.190205,6.6836636 17.190205,14.8525846 v 22.27888 z" id="path4" />
<path d="m 32.627622,9.2529782 c -3.116845,0 -5.565794,2.1994928 -5.565794,4.9988458 v 14.596624 c 0,2.799353 2.448949,4.998843 5.565794,4.998843 3.116843,0 5.565795,-2.19949 5.565795,-4.998843 V 14.251824 c 0,-2.599399 -2.448952,-4.9988458 -5.565795,-4.9988458 z" id="path6" inkscape:connector-curvature="0" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.1 KiB

@@ -0,0 +1,72 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
version="1.1"
id="svg5332"
viewBox="0 0 64.000001 64.000001"
height="64"
width="64">
<defs
id="defs5334" />
<metadata
id="metadata5337">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
transform="matrix(1.8755013,0,0,1.8755013,-218.60064,-1883.4128)"
id="g4416">
<rect
ry="1.8592992"
y="1017.7581"
x="122.49059"
height="6.8816891"
width="7.2173815"
id="rect9178-6-67"
style="fill:#000000;fill-opacity:1;stroke:none"
rx="1.8592992" />
<path
id="rect9178-53"
d="m 121.64625,1021.6774 c -1.64577,0.3942 -2.86526,1.8494 -2.86526,3.6193 l 0,6.3639 c 0,2.0735 1.66637,3.7399 3.73992,3.7399 l 7.0576,0 c 2.07355,0 3.73992,-1.6664 3.73992,-3.7399 l 0,-6.3639 c 0,-1.7358 -1.1772,-3.162 -2.77478,-3.5891 l 0,1.2064 c 0,1.3936 -1.10978,2.5335 -2.50334,2.5335 l -3.86056,0 c -1.39356,0 -2.5335,-1.1399 -2.5335,-2.5335 z m 0.57305,4.2527 c 1.3934,0 2.5335,1.14 2.5335,2.5335 0,1.3934 -1.1401,2.5335 -2.5335,2.5335 -1.3934,0 -2.53349,-1.1401 -2.53349,-2.5335 0,-1.3935 1.14009,-2.5335 2.53349,-2.5335 z m 7.7513,0.03 c 1.3934,0 2.53349,1.1401 2.53349,2.5335 0,1.3934 -1.14009,2.5335 -2.53349,2.5335 -1.3934,0 -2.5335,-1.1401 -2.5335,-2.5335 0,-1.3934 1.1401,-2.5335 2.5335,-2.5335 z m -7.7513,0.935 c -0.86656,0 -1.53819,0.7018 -1.53819,1.5684 0,0.8665 0.67163,1.5381 1.53819,1.5381 0.86657,0 1.56836,-0.6716 1.56836,-1.5381 0,-0.8666 -0.70179,-1.5684 -1.56836,-1.5684 z m 7.7513,0.061 c -0.86657,0 -1.56836,0.6716 -1.56836,1.5382 0,0.8666 0.70179,1.5683 1.56836,1.5683 0.86656,0 1.53819,-0.7017 1.53819,-1.5683 0,-0.8666 -0.67163,-1.5382 -1.53819,-1.5382 z"
style="fill:#040404;fill-opacity:1;stroke:none" />
</g>
<path
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4.359375;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
d="M 32,1 C 14.904983,1 0.99998932,14.905 1,32 c 1.2e-6,2.941019 0.4209024,5.782843 1.1894531,8.480469 0.3727265,-3.603568 1.7256364,-6.45992 3.1914063,-7.623047 C 5.3718622,32.572027 5.3593751,32.287623 5.359375,32 5.3593658,17.261 17.260965,5.359375 32,5.359375 46.739035,5.359375 58.640634,17.261 58.640625,32 58.640619,46.7391 46.739024,58.640625 32,58.640625 c -0.652395,0 -1.29701,-0.03227 -1.9375,-0.07813 -3.220423,1.812983 -6.704115,2.268517 -9.509766,2.236328 C 24.096895,62.212362 27.957339,63 32,63 49.095004,63 62.999993,49.095 63,32 63.000011,14.905 49.095017,1 32,1 Z"
id="path7511-3-8-6-2-5" />
<path
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.40400004;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
d="m 32,20.257812 c -3.61005,0 -6.845221,1.641126 -9.001953,4.214844 l 1.685547,1.720703 c 1.708453,-2.152308 4.343595,-3.53125 7.316406,-3.53125 5.172408,0 9.339851,4.165491 9.339844,9.337891 7e-6,5.02858 -3.942185,9.095423 -8.914063,9.318359 l -0.111328,2.410157 C 38.640304,43.559629 43.744149,38.365652 43.744141,32 43.74415,25.5284 38.471627,20.257812 32,20.257812 Z"
id="path4251-9" />
<path
id="path5021-2"
d="M 39.742188 6.9082031 A 6.4425364 6.4425364 0 0 0 33.300781 13.349609 A 6.4425364 6.4425364 0 0 0 39.742188 19.792969 A 6.4425364 6.4425364 0 0 0 46.185547 13.349609 A 6.4425364 6.4425364 0 0 0 39.742188 6.9082031 z M 39.796875 9.2890625 A 4.0677967 4.0677967 0 0 1 43.865234 13.355469 A 4.0677967 4.0677967 0 0 1 39.796875 17.423828 A 4.0677967 4.0677967 0 0 1 35.728516 13.355469 A 4.0677967 4.0677967 0 0 1 39.796875 9.2890625 z "
style="fill:#000000;fill-opacity:1;stroke:none" />
<path
id="path5023-0"
d="M 51.648438 26.556641 A 5.3467021 5.3467021 0 0 0 46.302734 31.904297 A 5.3467021 5.3467021 0 0 0 51.648438 37.25 A 5.3467021 5.3467021 0 0 0 56.996094 31.904297 A 5.3467021 5.3467021 0 0 0 51.648438 26.556641 z M 51.626953 28.609375 A 3.2881355 3.2881355 0 0 1 54.916016 31.898438 A 3.2881355 3.2881355 0 0 1 51.626953 35.185547 A 3.2881355 3.2881355 0 0 1 48.339844 31.898438 A 3.2881355 3.2881355 0 0 1 51.626953 28.609375 z "
style="fill:#000000;fill-opacity:1;stroke:none" />
<path
style="fill:none;stroke:#000000;stroke-width:2.14189005;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 47.871459,32.1264 -6.219647,0.061"
id="path5025-2" />
<path
style="fill:none;stroke:#000000;stroke-width:2.14189005;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 38.064723,17.299766 35.165895,23.0418"
id="path5027-3" />
<path
id="path3393"
d="M 21.781039,30.295659 32.883928,30.774846 35.5173,41.907749 37.047251,25.332528 Z"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
</svg>

After

Width:  |  Height:  |  Size: 6.9 KiB

@@ -1,33 +1,90 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" version="1.1" width="64" height="64" id="svg3254">
<defs id="defs3256" />
<metadata id="metadata3259">
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
width="64"
height="64"
viewBox="0 0 64.000001 64.000001"
id="svg5332"
version="1.1">
<defs
id="defs5334" />
<metadata
id="metadata5337">
<rdf:RDF>
<cc:Work rdf:about="">
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g transform="matrix(1.1234718,0,0,1.1234718,-4.5608191,-1.4655251)" id="layer1">
<g transform="translate(-72.000133,-1072.4267)" id="g3209" style="display:inline">
<path d="m 99.349441,1094.4654 0,8.8551 -8.045911,0 0,22.5193 37.84818,0 0,-22.5193 -8.27712,0 0,-8.8551 -21.525149,0 z" id="rect5128-4-3" style="fill:none;stroke:#000000;stroke-width:3.11534309;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
<path d="m 100.09052,1103.3954 0,2.9404 20.02752,0 0.0179,-3.0711" id="path5261-5-2" style="fill:none;stroke:#000000;stroke-width:1.70797408;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
<g transform="translate(59.145039,46.442959)" id="g5674-3-35">
<path d="m 35.901786,1064.1033 0,12.0312 13.9375,0 0,-8.1562 -9,3.625 3.0625,-7.5 -8,0 z" id="rect5190-1-4-3-4" style="fill:#000000;fill-opacity:1;stroke:none" />
<path d="m 50.388469,1065.2434 c 0,1.7268 -1.39996,3.1264 -3.1269,3.1264 -1.72692,0 -3.12688,-1.3996 -3.12688,-3.1264 0,-1.7268 1.39996,-3.1266 3.12688,-3.1266 1.72694,0 3.1269,1.3998 3.1269,3.1266 z" id="path4004-69-7-4-5-5-7-1" style="fill:none;stroke:#000000;stroke-width:1.19000506;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
<g
id="layer1"
transform="translate(0,-988.36216)">
<g
transform="translate(0,-4e-5)"
id="g5340">
<g
transform="matrix(1.8898538,0,0,1.8898538,-206.632,-920.79926)"
id="g4360">
<g
transform="matrix(0.99240551,0,0,0.99240551,-6.3331053,13.624687)"
id="g4416">
<rect
ry="1.8592992"
y="1017.7581"
x="122.49059"
height="6.8816891"
width="7.2173815"
id="rect9178-6-67"
style="fill:#000000;fill-opacity:1;stroke:none"
rx="1.8592992" />
<path
id="rect9178-53"
d="m 121.64625,1021.6774 c -1.64577,0.3942 -2.86526,1.8494 -2.86526,3.6193 l 0,6.3639 c 0,2.0735 1.66637,3.7399 3.73992,3.7399 l 7.0576,0 c 2.07355,0 3.73992,-1.6664 3.73992,-3.7399 l 0,-6.3639 c 0,-1.7358 -1.1772,-3.162 -2.77478,-3.5891 l 0,1.2064 c 0,1.3936 -1.10978,2.5335 -2.50334,2.5335 l -3.86056,0 c -1.39356,0 -2.5335,-1.1399 -2.5335,-2.5335 z m 0.57305,4.2527 c 1.3934,0 2.5335,1.14 2.5335,2.5335 0,1.3934 -1.1401,2.5335 -2.5335,2.5335 -1.3934,0 -2.53349,-1.1401 -2.53349,-2.5335 0,-1.3935 1.14009,-2.5335 2.53349,-2.5335 z m 7.7513,0.03 c 1.3934,0 2.53349,1.1401 2.53349,2.5335 0,1.3934 -1.14009,2.5335 -2.53349,2.5335 -1.3934,0 -2.5335,-1.1401 -2.5335,-2.5335 0,-1.3934 1.1401,-2.5335 2.5335,-2.5335 z m -7.7513,0.935 c -0.86656,0 -1.53819,0.7018 -1.53819,1.5684 0,0.8665 0.67163,1.5381 1.53819,1.5381 0.86657,0 1.56836,-0.6716 1.56836,-1.5381 0,-0.8666 -0.70179,-1.5684 -1.56836,-1.5684 z m 7.7513,0.061 c -0.86657,0 -1.56836,0.6716 -1.56836,1.5382 0,0.8666 0.70179,1.5683 1.56836,1.5683 0.86656,0 1.53819,-0.7017 1.53819,-1.5683 0,-0.8666 -0.67163,-1.5382 -1.53819,-1.5382 z"
style="fill:#040404;fill-opacity:1;stroke:none" />
</g>
</g>
<g transform="translate(75.782819,46.495259)" id="g5674-0-8">
<path d="m 35.901786,1064.1033 0,12.0312 13.9375,0 0,-8.1562 -9,3.625 3.0625,-7.5 -8,0 z" id="rect5190-1-4-7-8" style="fill:#000000;fill-opacity:1;stroke:none" />
<path d="m 50.388469,1065.2434 c 0,1.7268 -1.39996,3.1264 -3.1269,3.1264 -1.72692,0 -3.12688,-1.3996 -3.12688,-3.1264 0,-1.7268 1.39996,-3.1266 3.12688,-3.1266 1.72694,0 3.1269,1.3998 3.1269,3.1266 z" id="path4004-69-7-4-5-5-0-9" style="fill:none;stroke:#000000;stroke-width:1.19000506;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
</g>
</g>
<g transform="translate(-120.71403,-1067.1752)" id="g3138" style="display:inline">
<path d="m 144.85461,1081.6667 -4.46467,0 -3.88859,-3.8125 -3.85772,3.7822 -4.51611,0 8.43041,-8.2653 z" id="path3956-37" style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.89009798px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path d="m 145.06641,1091.87 -4.46467,0 -3.88858,-3.8125 -3.85772,3.7822 -4.51611,0 8.43041,-8.2653 z" id="path3956-3-0" style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.89009798px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path
id="path7511-3-8-6-2-5"
transform="translate(0,988.3622)"
d="M 32,1 C 14.904983,1 0.99998932,14.905 1,32 c 1.2e-6,2.941019 0.4209024,5.782843 1.1894531,8.480469 0.3727265,-3.603568 1.7256364,-6.45992 3.1914063,-7.623047 C 5.3718622,32.572027 5.3593751,32.287623 5.359375,32 5.3593658,17.261 17.260965,5.359375 32,5.359375 46.739035,5.359375 58.640634,17.261 58.640625,32 58.640619,46.7391 46.739024,58.640625 32,58.640625 c -0.652395,0 -1.29701,-0.03227 -1.9375,-0.07813 -3.220423,1.812983 -6.704115,2.268517 -9.509766,2.236328 C 24.096895,62.212362 27.957339,63 32,63 49.095004,63 62.999993,49.095 63,32 63.000011,14.905 49.095017,1 32,1 Z"
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4.359375;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
<path
id="path4251-9"
transform="translate(0,988.3622)"
d="m 32,20.257812 c -3.61005,0 -6.845221,1.641126 -9.001953,4.214844 l 1.685547,1.720703 c 1.708453,-2.152308 4.343595,-3.53125 7.316406,-3.53125 5.172408,0 9.339851,4.165491 9.339844,9.337891 7e-6,5.02858 -3.942185,9.095423 -8.914063,9.318359 l -0.111328,2.410157 C 38.640304,43.559629 43.744149,38.365652 43.744141,32 43.74415,25.5284 38.471627,20.257812 32,20.257812 Z"
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.40400004;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
<circle
style="fill:#000000;fill-opacity:1;stroke:none"
id="path5021-2"
cx="39.742958"
cy="1001.7123"
r="5.2899938" />
<circle
id="path5023-0"
style="fill:#000000;fill-opacity:1;stroke:none"
cx="51.648651"
cy="1020.2657"
r="3.8551764" />
<path
id="path5025-2"
d="m 49.405521,1020.4886 -7.753709,0.061"
style="fill:none;stroke:#000000;stroke-width:2.14189005;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
id="path5027-3"
d="m 39.285062,1002.984 -4.119167,8.42"
style="fill:none;stroke:#000000;stroke-width:2.14189005;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
id="path5283"
d="m 25.957486,1018.1934 7.582463,0.4142 1.712269,7.6273 1.174923,-11.3133 z"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 3.2 KiB

After

Width:  |  Height:  |  Size: 6.7 KiB

@@ -1,13 +1,57 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" version="1.2" width="64" height="64" viewBox="0 0 64 64" id="svg3254" xml:space="preserve"><metadata id="metadata10"><rdf:RDF><cc:Work rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs id="defs8" />
<g id="layer1">
<g transform="matrix(1.5756397,0,0,1.6644338,54.170963,-1788.6456)" id="g3219">
<path d="m -14.05,1077.797 c -9.455,0 -17.192,7.323 -17.192,16.275 0,8.951 7.736,16.275 17.192,16.275 4.727,0 9.112,-1.749 12.206,-4.719 l -3.095,-2.93 c -2.32,2.197 -5.545,3.58 -9.155,3.58 -7.135,0 -12.894,-5.452 -12.894,-12.206 0,-6.754 5.759,-12.206 12.894,-12.206 3.567,0 6.662,1.465 8.982,3.702 l -4.684,4.435 H 3.1 v -12.206 l -5.114,4.841 c -3.095,-2.93 -7.349,-4.841 -12.077,-4.841 h 0.041 z" id="path3441" style="fill:#002ad8" />
<path d="m -17.177,1085.626 c 2.553,-0.958 5.429,0.219 6.441,2.636 l -3.075,1.154 c -0.341,-0.815 -1.286,-1.202 -2.147,-0.879 -0.861,0.323 -1.27,1.218 -0.928,2.032 0.341,0.815 5.075,3.621 6.122,6.125 1.049,2.504 -0.232,5.14 -2.785,6.098 -2.553,0.958 -5.43,-0.219 -6.441,-2.637 l 3.075,-1.153 c 0.341,0.815 1.286,1.202 2.147,0.879 0.861,-0.323 1.27,-1.218 0.928,-2.032 -0.439,-1.048 -5.318,-4.204 -6.122,-6.125 -0.987,-2.359 0.232,-5.14 2.785,-6.098 l 0,0 z" id="path3452" style="fill:#002ad8" />
</g>
</g>
</svg>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
version="1.1"
id="svg5332"
viewBox="0 0 64.000001 64.000001"
height="64"
width="64">
<defs
id="defs5334" />
<metadata
id="metadata5337">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
transform="translate(0,-988.36216)"
id="layer1">
<g
id="g6116"
transform="matrix(0.93996508,-0.34127063,0.34127063,0.93996508,-346.29853,72.177979)">
<rect
style="fill:none;stroke:#000000;stroke-width:2.86239505;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect7803-0-2-1-4-5-96-1-0"
width="30.724201"
height="34.655006"
x="16.687479"
y="1002.8078"
rx="2.5002778"
ry="2.8531349" />
<path
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4.359375;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
d="m 32,989.3622 c -14.80378,0 -27.2084401,10.42959 -30.2695312,24.3262 l 12.0734662,-5.979 -4.582272,-1.1911 C 13.890279,998.83877 22.3347,993.72158 32,993.72158 c 12.433892,0 22.847298,8.46872 25.800781,19.96682 l 4.46875,0 C 59.20844,999.79179 46.80378,989.3622 32,989.3622 Z M 1.7089844,1026.9384 C 4.7334431,1040.8836 17.161678,1051.3622 32,1051.3622 c 14.838322,0 27.266557,-10.4786 30.291016,-24.4238 l -12.189761,5.2541 5.12329,1.2478 C 50.66162,1041.543 41.982195,1047.0028 32,1047.0028 c -12.468173,0 -22.9038891,-8.5178 -25.8242188,-20.0644 z"
id="path7511-3-8-6-2-5-2-6" />
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16.78224373px;line-height:120.00000477%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
x="20.080101"
y="1033.3553"
id="text6112"><tspan
id="tspan6114"
x="20.080101"
y="1033.3553">&lt;/&gt;</tspan></text>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.7 KiB

After

Width:  |  Height:  |  Size: 3.4 KiB

@@ -1,21 +1,57 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" version="1.1" width="64" height="64" id="svg3254">
<defs id="defs3256" />
<metadata id="metadata3259">
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
version="1.1"
id="svg5332"
viewBox="0 0 64.000001 64.000001"
height="64"
width="64">
<defs
id="defs5334" />
<metadata
id="metadata5337">
<rdf:RDF>
<cc:Work rdf:about="">
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g id="layer1">
<g transform="matrix(1.5756397,0,0,1.6644338,54.170963,-1788.6456)" id="g3219" style="display:inline">
<path d="m -14.0496,1077.7967 c -9.455526,0 -17.191866,7.3233 -17.191866,16.2746 0,8.9506 7.73634,16.2746 17.191866,16.2746 4.7277622,0 9.1116881,-1.7493 12.2062302,-4.7194 l -3.0945421,-2.9297 c -2.3209027,2.1969 -5.5443771,3.5805 -9.1546711,3.5805 -7.134623,0 -12.893898,-5.4523 -12.893898,-12.206 0,-6.7545 5.759275,-12.206 12.893898,-12.206 3.567319,0 6.6618533,1.4649 8.9827563,3.7023 l -4.6847867,4.4351 H 3.0992902 v -12.206 l -5.1145825,4.8414 c -3.0945344,-2.9297 -7.3495203,-4.8414 -12.0772907,-4.8414 z" id="path3441" />
<path d="m -17.17734,1085.626 c 2.552571,-0.9574 5.429568,0.2195 6.44112,2.6363 l -3.075396,1.1539 c -0.341196,-0.8151 -1.285932,-1.2018 -2.147034,-0.8789 -0.86111,0.3231 -1.269543,1.2173 -0.928348,2.0325 0.341197,0.8151 5.074068,3.6209 6.122113,6.1244 1.0481409,2.5039 -0.232373,5.1401 -2.784956,6.0978 -2.552568,0.9575 -5.429564,-0.2194 -6.441212,-2.6365 l 3.075393,-1.1538 c 0.341197,0.815 1.28603,1.2019 2.147128,0.879 0.861114,-0.323 1.269453,-1.2176 0.928257,-2.0327 -0.438699,-1.0479 -5.317867,-4.2032 -6.122117,-6.1243 -0.987208,-2.3585 0.232468,-5.1399 2.785052,-6.0977 z" id="path3452" />
<g
transform="translate(0,-988.36216)"
id="layer1">
<g
id="g6116"
transform="translate(-2e-7,-4e-5)">
<rect
style="fill:none;stroke:#000000;stroke-width:2.86239505;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect7803-0-2-1-4-5-96-1-0"
width="30.724201"
height="34.655006"
x="16.687479"
y="1002.8078"
rx="2.5002778"
ry="2.8531349" />
<path
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4.359375;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
d="m 32,989.3622 c -14.80378,0 -27.2084401,10.42959 -30.2695312,24.3262 l 12.0734662,-5.979 -4.582272,-1.1911 C 13.890279,998.83877 22.3347,993.72158 32,993.72158 c 12.433892,0 22.847298,8.46872 25.800781,19.96682 l 4.46875,0 C 59.20844,999.79179 46.80378,989.3622 32,989.3622 Z M 1.7089844,1026.9384 C 4.7334431,1040.8836 17.161678,1051.3622 32,1051.3622 c 14.838322,0 27.266557,-10.4786 30.291016,-24.4238 l -12.189761,5.2541 5.12329,1.2478 C 50.66162,1041.543 41.982195,1047.0028 32,1047.0028 c -12.468173,0 -22.9038891,-8.5178 -25.8242188,-20.0644 z"
id="path7511-3-8-6-2-5-2-6" />
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16.78224373px;line-height:120.00000477%;font-family:Arial;-inkscape-font-specification:'Arial, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
x="20.080101"
y="1033.3553"
id="text6112"><tspan
id="tspan6114"
x="20.080101"
y="1033.3553">&lt;/&gt;</tspan></text>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.9 KiB

After

Width:  |  Height:  |  Size: 3.4 KiB

@@ -1,13 +1,39 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" version="1.2" width="64" height="64" viewBox="0 0 64 64" id="svg3254" xml:space="preserve"><metadata id="metadata10"><rdf:RDF><cc:Work rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs id="defs8" />
<g id="layer1">
<g transform="matrix(1.5756397,0,0,1.6644338,54.170963,-1788.6456)" id="g3219">
<path d="m -14.747,1077.753 v 15.251 h 4.027 v -15.251 h -4.027 z" id="path3397" style="fill:#720000" />
<path d="m -28.493,1098.125 c 1.281,7.768 9.042,13.131 17.248,11.919 8.205,-1.212 13.871,-8.56 12.59,-16.328 -0.64,-3.884 -2.837,-7.249 -5.98,-9.389 l -2.266,2.939 c 2.328,1.609 4.033,4.07 4.522,7.036 0.966,5.861 -3.252,11.331 -9.443,12.245 -6.192,0.915 -11.97,-3.079 -12.936,-8.939 -0.483,-2.931 0.441,-5.671 2.178,-7.881 l 4.7,3.248 -1.746,-10.593 -11.19,1.653 5.131,3.546 c -2.267,2.939 -3.443,6.694 -2.803,10.578 l -0.005,-0.034 z" id="path3408" style="fill:#720000" />
</g>
</g>
</svg>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
width="64"
height="64"
viewBox="0 0 64.000001 64.000001"
id="svg5332"
version="1.1">
<defs
id="defs5334" />
<metadata
id="metadata5337">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<path
id="path7511-3-8-6-2-5-2-6"
d="M 21.445681,2.851991 C 7.5263028,7.8921108 -0.58640746,21.921932 1.2666527,36.030558 L 10.58321,26.2982 5.8691667,26.738347 C 7.6442729,17.928082 13.842004,10.241599 22.929883,6.9509347 34.620954,2.7176709 47.295535,7.1351279 53.987235,16.940765 l 4.201779,-1.521438 C 50.579521,3.3950694 35.36506,-2.1881287 21.445681,2.851991 Z M 5.7575691,48.496296 C 13.349148,60.578675 28.602462,66.199929 42.554319,61.148049 56.506176,56.096169 64.624366,42.01224 62.720333,27.870436 l -9.672705,9.090358 5.242044,-0.571029 C 56.758002,45.561897 50.455953,53.650532 41.07011,57.049087 29.346806,61.294022 16.634552,56.83805 9.9575122,46.975523 Z"
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4.359375;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
<path
id="rect9178-6"
d="m 22.183626,15.276817 c -2.01487,0.729572 -3.049649,2.93909 -2.320077,4.953961 l 2.240275,6.187002 c 0.729572,2.014871 2.93909,3.049649 4.953961,2.320077 l 6.843873,-2.478124 c 2.014872,-0.729572 3.04965,-2.939089 2.320078,-4.953961 L 33.981461,15.11877 C 33.251889,13.103899 31.042371,12.069121 29.0275,12.798693 l -6.843874,2.478124 z m 1.506954,1.413748 5.084463,-1.841053 c 1.49651,-0.541876 3.137303,0.226553 3.67918,1.723062 l 1.664244,4.596169 c 0.541877,1.496511 -0.226552,3.137304 -1.723061,3.679181 l -5.084464,1.841052 c -1.496509,0.541877 -3.137303,-0.226552 -3.67918,-1.723063 l -1.664244,-4.596169 c -0.541877,-1.496509 0.226552,-3.137303 1.723062,-3.679179 z"
style="fill:#000000;fill-opacity:1;stroke:none" />
<path
id="rect9178"
d="m 19.671267,24.858645 c -2.940082,1.936773 -4.294736,5.647214 -3.04114,9.109292 l 4.507468,12.448343 c 1.468632,4.055947 5.908502,6.135296 9.964527,4.666635 l 13.80528,-4.998805 c 4.056044,-1.468669 6.135339,-5.908567 4.666706,-9.964513 L 45.066641,23.671254 c -1.229444,-3.395377 -4.542399,-5.351541 -7.969843,-5.055245 l 0.854477,2.359823 c 0.987069,2.726004 -0.376381,5.741789 -3.102286,6.728822 l -7.551612,2.734392 c -2.725905,0.987033 -5.763103,-0.435305 -6.750172,-3.161309 z m 4.133067,7.912767 c 2.725613,-0.986927 5.763265,0.435689 6.750192,3.161301 0.986928,2.725612 -0.43569,5.763264 -3.161302,6.750192 -2.725612,0.986926 -5.763265,-0.43569 -6.750192,-3.161302 -0.986927,-2.725612 0.435691,-5.763264 3.161302,-6.750191 z m 15.183447,-5.431455 c 2.725612,-0.986927 5.763265,0.43569 6.750192,3.161302 0.986927,2.725612 -0.43569,5.763265 -3.161302,6.750192 -2.725611,0.986927 -5.763264,-0.43569 -6.750191,-3.161302 -0.986927,-2.725613 0.43569,-5.763265 3.161301,-6.750192 z m -14.49995,7.319079 c -1.695086,0.613779 -2.511777,2.462268 -1.897975,4.157414 0.613801,1.695145 2.403183,2.532951 4.098268,1.919171 1.695087,-0.61378 2.592215,-2.424354 1.978413,-4.119499 -0.613801,-1.695146 -2.48362,-2.570867 -4.178706,-1.957086 z M 39.693235,29.28822 c -1.695086,0.61378 -2.592143,2.42455 -1.978342,4.119695 0.613802,1.695146 2.483549,2.57067 4.178635,1.956889 1.695086,-0.61378 2.511848,-2.462072 1.898046,-4.157217 -0.613801,-1.695145 -2.403253,-2.533147 -4.098339,-1.919367 z"
style="fill:#040404;fill-opacity:1;stroke:none" />
</svg>

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 4.6 KiB

@@ -1,21 +1,39 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" version="1.1" width="64" height="64" id="svg3254">
<defs id="defs3256" />
<metadata id="metadata3259">
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
width="64"
height="64"
viewBox="0 0 64.000001 64.000001"
id="svg5332"
version="1.1">
<defs
id="defs5334" />
<metadata
id="metadata5337">
<rdf:RDF>
<cc:Work rdf:about="">
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g id="layer1">
<g transform="matrix(1.5756397,0,0,1.6644338,54.170963,-1788.6456)" id="g3219" style="display:inline">
<path d="m -14.746549,1077.7527 0,15.2513 4.027731,0 0,-15.2513 z" id="path3397" />
<path d="m -28.493102,1098.125 c 1.280572,7.768 9.04186,13.1318 17.247791,11.9196 8.205389,-1.2122 13.8717377,-8.5597 12.5911658,-16.3278 -0.64028535,-3.8839 -2.8375946,-7.2486 -5.9796213,-9.3887 l -2.2664742,2.9392 c 2.3282028,1.609 4.0331007,4.0698 4.5220467,7.036 0.9662505,5.8611 -3.2519743,11.331 -9.443375,12.2456 -6.192048,0.9148 -11.969592,-3.0784 -12.935843,-8.9396 -0.483125,-2.9307 0.440618,-5.6713 2.177425,-7.881 l 4.700237,3.248 -1.746236,-10.5928 -11.189608,1.653 5.130941,3.5462 c -2.266583,2.939 -3.442915,6.6935 -2.802629,10.5777 z" id="path3408" />
</g>
</g>
<path
id="path7511-3-8-6-2-5-2-6"
d="M 32,1 C 17.19622,1 4.7915597,11.42959 1.7304686,25.32624 l 12.0734664,-5.979 -4.5822722,-1.1911 C 13.890279,10.47657 22.3347,5.35938 32,5.35938 c 12.433892,0 22.847298,8.46876 25.800781,19.96686 l 4.46875,0 C 59.20844,11.42959 46.80378,1 32,1 Z M 1.7089842,38.57624 C 4.7334429,52.52144 17.161678,63.00004 32,63.00004 c 14.838322,0 27.266557,-10.4786 30.291016,-24.4238 l -12.189761,5.2541 5.12329,1.2478 C 50.66162,53.18084 41.982195,58.64064 32,58.64064 c -12.468173,0 -22.9038893,-8.5178 -25.824219,-20.0644 z"
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4.359375;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
<path
id="rect9178-6"
d="m 28.463682,12.933789 c -2.14289,0 -3.868106,1.725215 -3.868106,3.868106 l 0,6.580108 c 0,2.142891 1.725216,3.868106 3.868106,3.868106 l 7.278716,0 c 2.142891,0 3.868106,-1.725215 3.868106,-3.868106 l 0,-6.580108 c 0,-2.142891 -1.725215,-3.868106 -3.868106,-3.868106 l -7.278716,0 z m 0.935599,1.842348 5.407517,0 c 1.591594,0 2.872743,1.281149 2.872743,2.872743 l 0,4.888198 c 0,1.591595 -1.281149,2.872744 -2.872743,2.872744 l -5.407517,0 c -1.591594,0 -2.872743,-1.281149 -2.872743,-2.872744 l 0,-4.888198 c 0,-1.591594 1.281149,-2.872743 2.872743,-2.872743 z"
style="fill:#000000;fill-opacity:1;stroke:none" />
<path
id="rect9178"
d="m 22.83917,21.087821 c -3.423834,0.820082 -5.960822,3.847647 -5.960822,7.529697 l 0,13.239279 c 0,4.313651 3.466686,7.780382 7.78042,7.780382 l 14.682432,0 c 4.313755,0 7.780445,-3.466731 7.780445,-7.780382 l 0,-13.239279 c 0,-3.61111 -2.449035,-6.578344 -5.772595,-7.466662 l 0,2.50976 c 0,2.899207 -2.308755,5.270622 -5.207857,5.270622 l -8.031422,0 c -2.899102,0 -5.270601,-2.371415 -5.270601,-5.270622 z m 1.192157,8.847197 c 2.898791,0 5.270623,2.371831 5.270623,5.270621 0,2.898791 -2.371832,5.270622 -5.270623,5.270622 -2.89879,0 -5.270622,-2.371831 -5.270622,-5.270622 0,-2.89879 2.371832,-5.270621 5.270622,-5.270621 z m 16.125566,0.06241 c 2.89879,0 5.270622,2.371832 5.270622,5.270623 0,2.89879 -2.371832,5.270622 -5.270622,5.270622 -2.89879,0 -5.270622,-2.371832 -5.270622,-5.270622 0,-2.898791 2.371832,-5.270623 5.270622,-5.270623 z m -16.125566,1.945148 c -1.802787,0 -3.200027,1.460005 -3.200027,3.262856 0,1.80285 1.39724,3.19982 3.200027,3.19982 1.802788,0 3.262751,-1.39697 3.262751,-3.19982 0,-1.802851 -1.459963,-3.262856 -3.262751,-3.262856 z m 16.125566,0.126903 c -1.802788,0 -3.262751,1.397178 -3.262751,3.200028 0,1.802851 1.459963,3.262647 3.262751,3.262647 1.802787,0 3.200027,-1.459796 3.200027,-3.262647 0,-1.80285 -1.39724,-3.200028 -3.200027,-3.200028 z"
style="fill:#040404;fill-opacity:1;stroke:none" />
</svg>

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 4.2 KiB

@@ -0,0 +1,61 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
version="1.1"
id="svg5332"
viewBox="0 0 64.000001 64.000001"
height="64"
width="64">
<defs
id="defs5334" />
<metadata
id="metadata5337">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
transform="translate(0,-988.36216)"
id="layer1">
<path
id="path3382"
d="m 31.103871,1022.2231 c -0.994982,-0.7345 -1.522912,-1.8248 -1.535396,-3.1708 -0.0082,-0.8789 0.782326,-2.3642 1.541643,-2.8965 0.683629,-0.4792 1.758058,-0.7766 2.574482,-0.713 0.736377,0.058 2.074248,0.7323 2.535916,1.2794 0.501094,0.5934 0.905282,1.7099 0.903757,2.4963 -0.006,3.0668 -3.544635,4.833 -6.020503,3.0049 z"
style="fill:#000000;fill-opacity:1" />
<path
id="path3380"
d="m 29.316097,1012.6301 c -0.674862,-0.8293 -0.530481,-1.9527 0.329924,-2.5668 0.385686,-0.2753 1.655027,-0.4802 2.933475,-0.4737 2.995693,0.015 6.497335,1.5723 8.599978,3.824 0.950638,1.018 1.772013,2.2001 2.110676,3.0377 0.225706,0.5582 0.223669,0.7635 -0.01335,1.3606 -0.259346,0.6532 -0.329574,0.7219 -0.987505,0.9659 -0.615071,0.2283 -0.784284,0.2237 -1.28509,-0.034 -0.452308,-0.2318 -0.69656,-0.5059 -1.129075,-1.2587 -0.929827,-1.6182 -1.711864,-2.3225 -3.704297,-3.3361 -1.542536,-0.7907 -1.812688,-0.8798 -2.810651,-0.9791 -0.606608,-0.061 -1.501855,-0.065 -1.989487,-0.012 -1.086886,0.1205 -1.64356,-0.023 -2.054598,-0.5273 z"
style="fill:#000000;fill-opacity:1" />
<path
id="path3378"
d="m 27.74395,1006.3811 c -0.325853,-0.4771 -0.275645,-1.3164 0.108382,-1.8121 0.364771,-0.4709 1.126859,-0.7306 2.667576,-0.9092 6.448172,-0.7476 12.56804,1.9553 16.346602,7.2194 1.228303,1.7111 2.094997,3.516 1.995248,4.1549 -0.179341,1.148 -1.323919,1.7251 -2.365092,1.1928 -0.380085,-0.1945 -0.593476,-0.4798 -1.102016,-1.4733 -1.511035,-2.9524 -3.404027,-4.8757 -6.216361,-6.3161 -2.982315,-1.5289 -5.406639,-1.9117 -9.010043,-1.4276 -1.410097,0.1895 -1.963404,0.046 -2.424301,-0.6288 z"
style="fill:#000000;fill-opacity:1" />
<path
id="path3377"
d="m 26.067015,1000.4894 c -0.377182,-0.4434 -0.468199,-1.14765 -0.229859,-1.77807 0.227692,-0.60223 0.245093,-0.61466 1.329571,-0.94657 2.253034,-0.68975 6.369752,-0.87475 9.323243,-0.41902 2.809085,0.43337 3.92781,0.82088 7.148899,2.47585 3.222513,1.65201 4.21659,2.35661 6.183378,4.35901 2.083937,2.1217 4.346959,5.582 5.093797,7.7889 0.325825,0.9629 0.334374,1.1126 0.09047,1.5884 -0.217511,0.4243 -0.397065,0.5726 -0.934398,0.7721 -0.592092,0.2197 -0.731187,0.2128 -1.266548,-0.061 -0.543355,-0.2786 -0.651124,-0.419 -1.116051,-1.453 -1.827851,-4.0659 -4.316809,-6.9508 -8.045544,-9.3256 -2.194335,-1.3975 -4.871502,-2.3985 -7.622016,-2.8493 -1.610709,-0.2639 -4.650632,-0.2736 -6.223563,-0.019 -2.674039,0.4318 -2.888821,0.4503 -3.210047,0.2758 -0.180977,-0.093 -0.413348,-0.2805 -0.521331,-0.4074 z"
style="fill:#000000;fill-opacity:1" />
<path
id="path4196"
d="m 16.287361,1035.29 c -0.552127,-0.093 -0.992698,-0.4693 -1.200278,-1.0242 -0.217617,-0.5816 -0.07451,-1.2133 0.377201,-1.665 0.16455,-0.1645 0.362532,-0.2931 0.569302,-0.3698 0.316666,-0.1172 0.323334,-0.1174 6.059435,-0.1174 l 5.742421,0 0.03354,0.2097 c 0.0469,0.2933 0.243449,0.5607 0.530344,0.7215 l 0.244371,0.1369 3.478273,0 3.478273,0 0.244375,-0.1369 c 0.286891,-0.1608 0.483439,-0.4282 0.53034,-0.7215 l 0.03354,-0.2097 5.74242,0 c 5.736102,0 5.742766,0 6.059439,0.1174 0.600716,0.2226 1.056489,0.869 1.056489,1.4985 0,0.5174 -0.383936,1.1734 -0.815569,1.3937 -0.110692,0.056 -0.346737,0.1296 -0.524545,0.1624 -0.379166,0.07 -31.225897,0.074 -31.639368,0.01 z"
style="fill:#010101" />
<path
id="path4194"
d="m 17.689453,1009.6286 -0.376953,0.1231 c -1.087372,0.3568 -1.808991,1.062 -2.175781,2.125 l -0.132813,0.3808 0,7.5313 0,7.5312 0.13086,0.3848 c 0.351213,1.0345 1.090215,1.7714 2.105468,2.1016 0.18618,0.06 0.413527,0.1208 0.503907,0.1328 l 0,0 c 0.09038,0.01 6.634688,0.028 14.542968,0.018 l 14.376953,-0.012 0.357422,-0.1308 c 1.033508,-0.3858 1.746704,-1.1083 2.087891,-2.1133 l 0.130859,-0.3848 0,-7.5312 0,-2.9317 -2.117187,0.7168 -0.0059,2.2989 -0.01367,7.2285 -0.15625,0.2304 c -0.100721,0.1485 -0.256407,0.2821 -0.435547,0.3711 l -0.279297,0.1387 -14.111328,0 -14.109375,0 -0.279297,-0.1387 c -0.17914,-0.089 -0.334822,-0.2226 -0.435547,-0.3711 l -0.15625,-0.2304 -0.01367,-7.2285 -0.01563,-7.2286 0.142578,-0.289 c 0.106978,-0.2187 0.205212,-0.3259 0.398438,-0.4395 l 0.255859,-0.1523 10.076172,0 c -0.301461,-0.8367 -0.473022,-1.3216 -0.761719,-2.1348 l -9.533203,0 z"
style="fill:#010101" />
<circle
r="28.820312"
id="path7511-3-8-6-2-5-2-6-2"
style="fill:none;stroke:#000000;stroke-width:4.359375;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
cx="32"
cy="1020.3622" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 5.2 KiB

@@ -0,0 +1,49 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
version="1.1"
id="svg5332"
viewBox="0 0 64.000001 64.000001"
height="64"
width="64">
<defs
id="defs5334" />
<metadata
id="metadata5337">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
transform="translate(0,-988.36216)"
id="layer1">
<path
id="path3377"
d="m 31.517527,1021.6653 c -0.811444,-0.599 -1.24199,-1.4882 -1.252171,-2.5859 -0.0067,-0.7168 0.638015,-1.9281 1.257265,-2.3622 0.557524,-0.3908 1.43376,-0.6334 2.099583,-0.5815 0.600542,0.047 1.691624,0.5972 2.068131,1.0434 0.40866,0.4839 0.73829,1.3945 0.737046,2.0358 -0.0049,2.5011 -2.890777,3.9415 -4.909937,2.4506 z m -1.554794,-8.5065 c -0.567303,-0.6971 -0.445933,-1.6415 0.277341,-2.1577 0.324215,-0.2314 1.391249,-0.4037 2.465939,-0.3982 2.51824,0.013 5.461792,1.3217 7.229316,3.2145 0.799126,0.8558 1.48959,1.8495 1.774277,2.5536 0.189733,0.4692 0.188021,0.6418 -0.01122,1.1437 -0.218012,0.5491 -0.277047,0.6069 -0.830117,0.812 -0.517041,0.1919 -0.659285,0.188 -1.080273,-0.029 -0.380219,-0.1949 -0.585542,-0.4253 -0.949123,-1.0581 -0.781632,-1.3603 -1.439028,-1.9524 -3.113908,-2.8044 -1.296687,-0.6647 -1.523782,-0.7396 -2.36269,-0.8231 -0.509927,-0.051 -1.26249,-0.055 -1.672403,-0.01 -0.913659,0.1013 -1.38161,-0.019 -1.727137,-0.4432 z m -1.883262,-5.434 c -0.293134,-0.4292 -0.247967,-1.1843 0.0975,-1.6302 0.328144,-0.4236 1.01371,-0.6572 2.399723,-0.8179 5.800707,-0.6725 11.306075,1.759 14.705229,6.4945 1.104969,1.5393 1.884637,3.163 1.794904,3.7377 -0.161333,1.0327 -1.190983,1.5519 -2.127611,1.073 -0.341921,-0.1749 -0.533885,-0.4316 -0.991362,-1.3253 -1.359311,-2.656 -3.062227,-4.3862 -5.592173,-5.6819 -2.682859,-1.3754 -4.863755,-1.7198 -8.105339,-1.2843 -1.268508,0.1705 -1.766257,0.041 -2.180875,-0.5656 z m -1.518341,-5.018 c -0.333758,-0.3923 -0.414297,-1.0155 -0.203396,-1.5733 0.201479,-0.5329 0.216876,-0.5439 1.176503,-0.8376 1.993652,-0.61034 5.636429,-0.77404 8.249897,-0.37078 2.485687,0.38348 3.475618,0.72638 6.325877,2.19078 2.851518,1.4618 3.731151,2.0853 5.471511,3.8572 1.844022,1.8774 3.846512,4.9393 4.50737,6.8922 0.288314,0.852 0.295879,0.9845 0.08005,1.4055 -0.19247,0.3755 -0.351353,0.5067 -0.826825,0.6832 -0.523927,0.1944 -0.647008,0.1883 -1.120735,-0.054 -0.480801,-0.2465 -0.576163,-0.3707 -0.987565,-1.2857 -1.617418,-3.5978 -3.819833,-6.1506 -7.119294,-8.252 -1.941711,-1.2366 -4.310667,-2.1223 -6.744526,-2.5212 -1.425275,-0.2336 -4.115224,-0.2421 -5.50707,-0.017 -2.366188,0.3821 -2.556243,0.3984 -2.840488,0.244 -0.160142,-0.082 -0.365761,-0.2482 -0.461312,-0.3605 z"
style="fill:#000000;fill-opacity:1" />
<path
id="path4196"
d="m 16.287361,1035.29 c -0.552127,-0.093 -0.992698,-0.4693 -1.200278,-1.0242 -0.217617,-0.5816 -0.07451,-1.2133 0.377201,-1.665 0.16455,-0.1645 0.362532,-0.2931 0.569302,-0.3698 0.316666,-0.1172 0.323334,-0.1174 6.059435,-0.1174 l 5.742421,0 0.03354,0.2097 c 0.0469,0.2933 0.243449,0.5607 0.530344,0.7215 l 0.244371,0.1369 3.478273,0 3.478273,0 0.244375,-0.1369 c 0.286891,-0.1608 0.483439,-0.4282 0.53034,-0.7215 l 0.03354,-0.2097 5.74242,0 c 5.736102,0 5.742766,0 6.059439,0.1174 0.600716,0.2226 1.056489,0.869 1.056489,1.4985 0,0.5174 -0.383936,1.1734 -0.815569,1.3937 -0.110692,0.056 -0.346737,0.1296 -0.524545,0.1624 -0.379166,0.07 -31.225897,0.074 -31.639368,0.01 z"
style="fill:#010101" />
<path
id="path4194"
d="m 17.689453,1009.6286 -0.376953,0.1231 c -1.087372,0.3568 -1.808991,1.062 -2.175781,2.125 l -0.132813,0.3808 0,7.5313 0,7.5312 0.13086,0.3848 c 0.351213,1.0345 1.090215,1.7714 2.105468,2.1016 0.18618,0.06 0.413527,0.1208 0.503907,0.1328 l 0,0 c 0.09038,0.01 6.634688,0.028 14.542968,0.018 l 14.376953,-0.012 0.357422,-0.1308 c 1.033508,-0.3858 1.746704,-1.1083 2.087891,-2.1133 l 0.130859,-0.3848 0,-7.5312 0,-2.9317 -2.117187,0.7168 -0.0059,2.2989 -0.01367,7.2285 -0.15625,0.2304 c -0.100721,0.1485 -0.256407,0.2821 -0.435547,0.3711 l -0.279297,0.1387 -14.111328,0 -14.109375,0 -0.279297,-0.1387 c -0.17914,-0.089 -0.334822,-0.2226 -0.435547,-0.3711 l -0.15625,-0.2304 -0.01367,-7.2285 -0.01563,-7.2286 0.142578,-0.289 c 0.106978,-0.2187 0.205212,-0.3259 0.398438,-0.4395 l 0.255859,-0.1523 10.076172,0 c -0.301461,-0.8367 -0.473022,-1.3216 -0.761719,-2.1348 l -9.533203,0 z"
style="fill:#010101" />
<circle
r="28.820312"
id="path7511-3-8-6-2-5-2-6-2"
style="fill:none;stroke:#000000;stroke-width:4.359375;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
cx="32"
cy="1020.3622" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 4.9 KiB

@@ -0,0 +1,69 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
width="64"
height="64"
viewBox="0 0 64.000001 64.000001"
id="svg5332"
version="1.1">
<defs
id="defs5334" />
<metadata
id="metadata5337">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<path
id="path7511-3-8-6-2-5-2"
d="M 31.489076,1 C 14.394066,1 0.4890765,14.905 0.4890765,32 c 0,17.095 13.9049895,31 30.9999995,31 17.095011,0 31.000001,-13.905 31.000001,-31 0,-4.368869 -0.913278,-8.527463 -2.550781,-12.300781 l -3.5625,2.771484 c 1.129824,2.957915 1.753906,6.169006 1.753906,9.529297 0,14.7391 -11.901596,26.640625 -26.640626,26.640625 C 16.750047,58.640625 4.8484515,46.7391 4.8484515,32 c 0,-14.739 11.9015955,-26.640625 26.6406245,-26.640625 2.460106,0 4.837798,0.3379936 7.097657,0.9589844 L 38.549624,1.8203125 C 36.279809,1.2894147 33.918497,1 31.489076,1 Z"
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4.359375;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
<path
id="path7147-38-9-7"
d="m 40.736477,15.9366 0,3.3269 c 4.065857,0.1025 7.700353,1.6628 10.904472,3.9668 l 2.271765,-2.0475 c -3.81729,-2.9957 -8.212698,-5.1397 -13.176237,-5.2462 z"
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:Sans;-inkscape-font-specification:Sans;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.20479071;marker:none;enable-background:accumulate" />
<path
id="path7149-4-2-8"
d="m 40.736477,9.09102 0,3.26278 c 6.010142,0.1127 11.53244,2.4234 16.015945,6.206 l 2.214971,-2.1114 C 53.909718,11.9799 47.616004,9.20811 40.736477,9.09102 Z"
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:Sans;-inkscape-font-specification:Sans;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.96289933;marker:none;enable-background:accumulate" />
<path
id="path7151-4-6-4"
d="m 40.736477,2.50117 0,3.1989 c 7.852038,0.12079 14.955899,3.34857 20.61627,8.57303 l 2.158176,-2.0473 C 57.311078,6.34169 49.436765,2.62503 40.736477,2.50117 Z"
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:Sans;-inkscape-font-specification:Sans;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.79512143;marker:none;enable-background:accumulate" />
<path
id="path7254-4-8-5"
d="m 41.918202,19.030988 c -15.869433,0 -21.196555,12.627716 -21.196555,12.627716 l 0,1.578498 c 0,0 4.782277,13.830349 21.12139,13.830349 15.13199,0 20.069078,-13.680136 20.069078,-13.680136 l 0,-1.728711 c 0,0 -5.262009,-12.627716 -19.993913,-12.627716 z m -1.428136,2.104576 c 0.391584,-0.0397 0.800564,0 1.202641,0 6.433221,0 11.650588,5.142194 11.650588,11.575428 0,6.433234 -5.217367,11.6506 -11.650588,11.6506 -6.433219,0 -11.650587,-5.217366 -11.650587,-11.6506 0,-6.031165 4.574184,-10.978942 10.447946,-11.575428 z"
style="fill:#000000;fill-opacity:1;stroke:none" />
<circle
id="path7259-4-9-0"
style="fill:#030000;fill-opacity:1;stroke:none"
cx="44.113647"
cy="35.082993"
r="5.9723058" />
<g
transform="matrix(0.52500254,0,0,0.52500254,0.4993988,14.4037)"
id="layer1-3">
<g
transform="matrix(1.5756397,0,0,1.6644338,54.170963,-1788.6456)"
id="g3219"
style="display:inline">
<g
transform="matrix(0.63466286,0,0,0.60080491,-55.333181,1055.0231)"
id="g3488">
<path
d="m 60.353163,39.726048 -3.12794,10.182437 -5.191046,17.037284 -0.199657,-0.399311 -0.598967,-2.262764 -12.511754,0 0,6.655188 7.720019,0 2.528972,7.720019 3.127938,9.783127 3.127939,-9.982783 5.191046,-16.637971 5.191049,16.637971 2.728627,8.917954 3.52725,-8.518642 3.926561,-9.783127 0.865176,1.863452 10.807846,0 0,-6.655188 -6.681629,0 -2.528973,-4.991392 -3.327593,-6.455534 -2.728629,6.854847 -3.127938,7.919673 -5.590359,-17.702803 z"
id="path3506" />
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 6.2 KiB

@@ -1,21 +1,77 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" version="1.1" width="64" height="64" id="svg3254">
<defs id="defs3256" />
<metadata id="metadata3259">
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
version="1.1"
id="svg5332"
viewBox="0 0 64.000001 64.000001"
height="64"
width="64">
<defs
id="defs5334" />
<metadata
id="metadata5337">
<rdf:RDF>
<cc:Work rdf:about="">
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g id="layer1">
<g transform="matrix(1.5756397,0,0,1.6644338,54.170963,-1788.6456)" id="g3219" style="display:inline">
<g transform="matrix(0.63466286,0,0,0.60080491,-55.333181,1055.0231)" id="g3488">
<path d="M 60.353163,39.726048 57.225223,49.908485 52.034177,66.945769 51.83452,66.546458 51.235553,64.283694 H 38.723799 v 6.655188 h 7.720019 l 2.528972,7.720019 3.127938,9.783127 3.127939,-9.982783 5.191046,-16.637971 5.191049,16.637971 2.728627,8.917954 3.52725,-8.518642 3.926561,-9.783127 0.865176,1.863452 H 92.031861 V 64.283694 H 80.784593 L 78.25562,59.292302 74.928027,52.836768 72.199398,59.691615 69.07146,67.611288 63.481101,49.908485 60.353163,39.726048 z" id="path3506" />
<g
transform="translate(0,-988.36216)"
id="layer1">
<g
id="g5553"
transform="translate(-0.5109235,-4e-5)">
<path
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4.359375;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
d="M 32,1 C 14.90499,1 1,14.905 1,32 1,49.095 14.90499,63 32,63 49.09501,63 63,49.095 63,32 63,27.631131 62.086722,23.472537 60.449219,19.699219 l -3.5625,2.771484 C 58.016543,25.428618 58.640625,28.639709 58.640625,32 58.640625,46.7391 46.739029,58.640625 32,58.640625 17.260971,58.640625 5.359375,46.7391 5.359375,32 5.359375,17.261 17.260971,5.359375 32,5.359375 c 2.460105,0 4.837797,0.3379936 7.097656,0.9589844 L 39.060547,1.8203125 C 36.790732,1.2894147 34.42942,1 32,1 Z"
transform="translate(0,988.3622)"
id="path7511-3-8-6-2-5-2" />
<path
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:Sans;-inkscape-font-specification:Sans;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.20479071;marker:none;enable-background:accumulate"
d="m 41.2474,1004.2988 0,3.3269 c 4.065858,0.1025 7.700354,1.6628 10.904473,3.9668 l 2.271765,-2.0475 c -3.81729,-2.9957 -8.212698,-5.1397 -13.176238,-5.2462 z"
id="path7147-38-9-7" />
<path
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:Sans;-inkscape-font-specification:Sans;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.96289933;marker:none;enable-background:accumulate"
d="m 41.2474,997.45322 0,3.26278 c 6.010142,0.1127 11.53244,2.4234 16.015945,6.206 l 2.214971,-2.1114 c -5.057675,-4.4685 -11.351389,-7.24029 -18.230916,-7.35738 z"
id="path7149-4-2-8" />
<path
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:Sans;-inkscape-font-specification:Sans;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.79512143;marker:none;enable-background:accumulate"
d="m 41.2474,990.86337 0,3.1989 c 7.852038,0.12079 14.955899,3.34857 20.61627,8.57303 l 2.158177,-2.0473 C 57.822001,994.70389 49.947688,990.98723 41.2474,990.86337 Z"
id="path7151-4-6-4" />
<path
style="fill:#000000;fill-opacity:1;stroke:none"
d="m 42.234218,1010.852 c -11.990815,0 -16.015945,9.5414 -16.015945,9.5414 l 0,1.1927 c 0,0 3.61345,10.4501 15.959151,10.4501 11.433609,0 15.164033,-10.3366 15.164033,-10.3366 l 0,-1.3062 c 0,0 -3.975932,-9.5414 -15.107239,-9.5414 z m -1.079088,1.5902 c 0.295878,-0.03 0.6049,0 0.908706,0 4.860889,0 8.80309,3.8854 8.80309,8.7463 0,4.8609 -3.942201,8.8031 -8.80309,8.8031 -4.860889,0 -8.80309,-3.9422 -8.80309,-8.8031 0,-4.5571 3.456216,-8.2956 7.894384,-8.7463 z"
id="path7254-4-8-5" />
<circle
r="4.5126262"
cy="1021.444"
cx="42.048923"
style="fill:#030000;fill-opacity:1;stroke:none"
id="path7259-4-9-0" />
<g
id="layer1-3"
transform="matrix(0.52500254,0,0,0.52500254,1.0103223,1002.7659)">
<g
style="display:inline"
id="g3219"
transform="matrix(1.5756397,0,0,1.6644338,54.170963,-1788.6456)">
<g
id="g3488"
transform="matrix(0.63466286,0,0,0.60080491,-55.333181,1055.0231)">
<path
id="path3506"
d="m 60.353163,39.726048 -3.12794,10.182437 -5.191046,17.037284 -0.199657,-0.399311 -0.598967,-2.262764 -12.511754,0 0,6.655188 7.720019,0 2.528972,7.720019 3.127938,9.783127 3.127939,-9.982783 5.191046,-16.637971 5.191049,16.637971 2.728627,8.917954 3.52725,-8.518642 3.926561,-9.783127 0.865176,1.863452 15.373485,0 0,-6.655188 -11.247268,0 -2.528973,-4.991392 -3.327593,-6.455534 -2.728629,6.854847 -3.127938,7.919673 -5.590359,-17.702803 -3.127938,-10.182437 z" />
</g>
</g>
</g>
</g>
</g>

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 6.4 KiB

@@ -0,0 +1,46 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
width="64"
height="64"
viewBox="0 0 64.000001 64.000001"
id="svg5332"
version="1.1">
<defs
id="defs5334" />
<metadata
id="metadata5337">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<path
id="path3387"
d="M 42.798828 14.162109 C 32.851229 14.162105 24.787105 22.226229 24.787109 32.173828 C 24.787105 42.121427 32.851229 50.185551 42.798828 50.185547 C 43.72275 50.178247 44.644742 50.099917 45.556641 49.951172 C 53.316083 49.894362 60.862923 40.817052 60.802734 32.380859 C 60.805734 32.314469 60.808347 32.248061 60.810547 32.181641 C 60.810551 22.234042 52.746427 14.169918 42.798828 14.169922 L 42.798828 14.162109 z M 41.515625 16.871094 L 44.316406 16.871094 L 44.316406 24.103516 L 41.515625 24.103516 L 41.515625 16.871094 z M 51.144531 18.185547 A 10.278627 7.6807337 76.219691 0 1 59.521484 26.503906 A 10.278627 7.6807337 76.219691 0 1 54.509766 38.316406 A 10.278627 7.6807337 76.219691 0 1 49.972656 37.654297 L 39.304688 34.398438 L 44.941406 22.880859 A 10.278627 7.6807337 76.219691 0 1 45.666016 21.402344 L 46.085938 20.542969 L 46.21875 20.613281 A 10.278627 7.6807337 76.219691 0 1 49.613281 18.349609 A 10.278627 7.6807337 76.219691 0 1 51.144531 18.185547 z M 44.427734 29.320312 L 42.863281 32.585938 L 46.037109 33.720703 A 10.278627 7.6807337 76.219691 0 1 44.603516 30.162109 A 10.278627 7.6807337 76.219691 0 1 44.427734 29.320312 z M 27.402344 30.167969 L 35.333984 30.167969 L 35.333984 32.966797 L 27.402344 32.966797 L 27.402344 30.167969 z M 41.697266 38.714844 L 44.810547 38.714844 L 44.810547 46.302734 L 41.697266 46.302734 L 41.697266 39.865234 L 41.697266 38.714844 z "
style="fill:#060000;fill-opacity:1;stroke:none;stroke-width:2.74752069;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
<path
id="path3506-4"
d="m 13.384792,17.01835 -1.642176,5.345805 -2.7253124,8.944618 -0.1048205,-0.20964 -0.3144591,-1.187956 -6.5687027,0 0,3.49399 4.0530296,0 1.3277167,4.05303 1.6421754,5.136166 1.642176,-5.240986 2.725312,-8.734977 2.725314,8.734977 1.432536,4.681948 1.851816,-4.472308 2.061454,-5.136167 0.45422,0.978317 3.386698,0 0,-3.49399 -1.220424,0 -1.327717,-2.620494 -1.746995,-3.389172 -1.432537,3.598812 -1.642176,4.157849 -2.934952,-9.294017 z" />
<path
id="path7511-3-8-6-2-5-2-6"
d="M 32 1 C 14.90499 1 1 14.90499 1 32 C 1 49.09501 14.90499 63 32 63 C 49.09501 63 63 49.09501 63 32 C 63 14.90499 49.09501 1 32 1 z M 32 5.359375 C 42.528499 5.359375 51.604627 11.435277 55.933594 20.277344 A 10.278627 7.6807337 76.219691 0 1 59.521484 26.503906 A 10.278627 7.6807337 76.219691 0 1 58.429688 35.314453 C 56.802243 48.481755 45.615547 58.640625 32 58.640625 C 17.260971 58.640625 5.359375 46.739029 5.359375 32 C 5.359375 17.260971 17.260971 5.359375 32 5.359375 z "
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4.359375;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
<ellipse
style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:2.005;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="ellipse3393"
cx="44.019794"
cy="39.866295"
rx="5.3665624"
ry="7.1817222"
transform="matrix(0.9712162,-0.2381997,0.2381997,0.9712162,0,0)" />
</svg>

After

Width:  |  Height:  |  Size: 4.6 KiB

@@ -1,35 +1,57 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" version="1.1" width="64" height="64" id="svg3254">
<defs id="defs3256" />
<metadata id="metadata3259">
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
version="1.1"
id="svg5332"
viewBox="0 0 64.000001 64.000001"
height="64"
width="64">
<defs
id="defs5334" />
<metadata
id="metadata5337">
<rdf:RDF>
<cc:Work rdf:about="">
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g id="layer1">
<g transform="matrix(1.5756397,0,0,1.6644338,54.170963,-1788.6456)" id="g3219" style="display:inline">
<rect width="35.110096" height="17.12899" ry="5.0985756" x="-31.308317" y="1079.7126" id="rect3980-2-6" style="fill:#757575;fill-opacity:1;stroke:none" />
<rect width="35.110096" height="17.008244" ry="5.062634" x="-31.51074" y="1079.5045" id="rect3980-9" style="fill:none;stroke:#000100;stroke-width:1.23500371;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
<g transform="translate(-50.80414,53.000428)" id="g4236-1">
<path d="m -4.4642859,77.678574 a 4.2857141,4.2857141 0 1 1 -8.5714281,0 4.2857141,4.2857141 0 1 1 8.5714281,0 z" transform="matrix(1.13953,0,0,1.13953,39.306585,945.21999)" id="path3984-8-3" style="fill:#0c0000;fill-opacity:1;stroke:#000100;stroke-width:0.54189169;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
<path d="m 30.368507,1028.4151 -2.629324,6.5608 6.79834,-2.7712 z" id="path4007-7" style="fill:#ffffff;fill-opacity:1;stroke:none" />
<path d="m 34.753087,1030.3543 c 0,1.2916 -1.047136,2.3385 -2.338841,2.3385 -1.291706,0 -2.338842,-1.0469 -2.338842,-2.3385 0,-1.2916 1.047136,-2.3386 2.338842,-2.3386 1.291705,0 2.338841,1.047 2.338841,2.3386 z" id="path4004-0" style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.61750185;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
<g
transform="translate(0,-988.36216)"
id="layer1">
<path
id="path7511-3-8-6-2-5-2-6-1"
transform="translate(0,988.36216)"
d="M 32 1 C 14.90499 1 1 14.905 1 32 C 1 49.095 14.90499 63 32 63 C 41.554811 63 50.109963 58.652738 55.800781 51.835938 C 53.64343 52.811837 51.321081 53.053034 49.1875 52.365234 C 44.551325 56.279434 38.558237 58.640625 32 58.640625 C 17.260971 58.640625 5.359375 46.7391 5.359375 32 C 5.359375 17.261 17.260971 5.359375 32 5.359375 C 46.383112 5.359375 58.057523 16.6933 58.613281 30.9375 C 58.875394 31.0533 59.136806 31.175766 59.390625 31.322266 C 60.982864 32.241566 62.123278 33.627419 62.828125 35.261719 C 62.940829 34.189019 63 33.102 63 32 C 63 14.905 49.095009 1 32 1 z M 58.572266 33.816406 C 58.516873 34.642129 58.421478 35.45668 58.292969 36.259766 A 5.0874057 6.9803934 30.000001 0 1 58.042969 43.796875 A 5.0874057 6.9803934 30.000001 0 1 53.585938 47.583984 C 52.924545 48.499415 52.225196 49.386368 51.455078 50.208984 C 54.324858 50.325384 57.601891 48.471078 59.595703 45.017578 C 62.094522 40.689578 61.412466 35.874006 58.572266 33.816406 z "
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4.359375;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
<path
id="path8516-6-6"
transform="translate(0,988.36216)"
d="M 42.798828 14.162109 A 18.011712 18.011712 0 0 0 24.787109 32.173828 A 18.011712 18.011712 0 0 0 42.798828 50.185547 A 18.011712 18.011712 0 0 0 45.556641 49.951172 C 44.264551 48.444072 43.536408 46.487534 43.386719 44.365234 L 38.242188 28.537109 L 39.082031 28.263672 L 39.210938 27.484375 L 40.714844 27.732422 L 40.726562 27.732422 L 40.728516 27.742188 L 56.396484 30.328125 C 57.431436 30.462625 58.443509 30.783178 59.390625 31.330078 C 59.911742 31.630878 60.376252 31.988659 60.802734 32.380859 A 18.011712 18.011712 0 0 0 60.810547 32.181641 A 18.011712 18.011712 0 0 0 42.798828 14.169922 L 42.798828 14.162109 z M 41.515625 16.871094 L 44.316406 16.871094 L 44.316406 24.103516 L 41.515625 24.103516 L 41.515625 16.871094 z M 27.402344 30.167969 L 35.333984 30.167969 L 35.333984 32.966797 L 27.402344 32.966797 L 27.402344 30.167969 z M 41.638672 30.533203 L 44.292969 38.697266 C 44.553788 38.029466 44.863887 37.368263 45.234375 36.726562 C 46.421901 34.669764 48.044724 33.012872 49.859375 31.888672 L 41.638672 30.533203 z M 55.800781 32.193359 A 7.0300808 9.6459236 30.000001 0 0 47.421875 37.738281 A 7.0300808 9.6459236 30.000001 0 0 48.6875 49.607422 A 7.0300808 9.6459236 30.000001 0 0 59.599609 44.767578 A 7.0300808 9.6459236 30.000001 0 0 58.333984 32.900391 A 7.0300808 9.6459236 30.000001 0 0 55.800781 32.193359 z M 55.292969 34.697266 A 5.0874057 6.9803934 30.000001 0 1 57.126953 35.207031 A 5.0874057 6.9803934 30.000001 0 1 58.042969 43.796875 A 5.0874057 6.9803934 30.000001 0 1 50.146484 47.298828 A 5.0874057 6.9803934 30.000001 0 1 49.230469 38.708984 A 5.0874057 6.9803934 30.000001 0 1 55.292969 34.697266 z "
style="fill:#060000;fill-opacity:1;stroke:none;stroke-width:2.74752069;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
<g
transform="matrix(0.52500254,0,0,0.52500254,-4.1333866,1001.6548)"
id="layer1-3-5">
<g
transform="matrix(1.5756397,0,0,1.6644338,54.170963,-1788.6456)"
id="g3219-4"
style="display:inline">
<g
transform="matrix(0.63466286,0,0,0.60080491,-55.333181,1055.0231)"
id="g3488-7">
<path
d="m 66.38199,39.726048 -3.12794,10.182437 -5.191046,17.037284 -0.199657,-0.399311 -0.598967,-2.262764 -12.511754,0 0,6.655188 7.720019,0 2.528972,7.720019 3.127938,9.783127 3.127939,-9.982783 5.191046,-16.637971 5.191049,16.637971 2.728627,8.917954 3.52725,-8.518642 3.926561,-9.783127 0.865176,1.863452 6.450822,0 0,-6.655188 -2.324605,0 -2.528973,-4.991392 -3.327593,-6.455534 -2.728629,6.854847 -3.127938,7.919673 -5.590359,-17.702803 z"
id="path3506-4" />
</g>
</g>
<g transform="translate(-35.406682,53.115808)" id="g4236-8-9">
<path d="m -4.4642859,77.678574 a 4.2857141,4.2857141 0 1 1 -8.5714281,0 4.2857141,4.2857141 0 1 1 8.5714281,0 z" transform="matrix(1.13953,0,0,1.13953,39.306585,945.21999)" id="path3984-8-7-6" style="fill:#0c0000;fill-opacity:1;stroke:#000100;stroke-width:0.54189169;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
<path d="m 30.368507,1028.4151 -2.629324,6.5608 6.79834,-2.7712 z" id="path4007-0-6" style="fill:#ffffff;fill-opacity:1;stroke:none" />
<path d="m 34.753087,1030.3543 c 0,1.2916 -1.047136,2.3385 -2.338841,2.3385 -1.291706,0 -2.338842,-1.0469 -2.338842,-2.3385 0,-1.2916 1.047136,-2.3386 2.338842,-2.3386 1.291705,0 2.338841,1.047 2.338841,2.3386 z" id="path4004-6-2" style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.61750185;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
</g>
</g>
<g transform="matrix(1,0,0,-1,-92.41515,1131.1661)" id="g3138" style="display:inline">
<path d="m 144.85461,1081.6667 -4.46467,0 -3.88859,-3.8125 -3.85772,3.7822 -4.51611,0 8.43041,-8.2653 z" id="path3956-37" style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path d="m 145.06641,1091.87 -4.46467,0 -3.88858,-3.8125 -3.85772,3.7822 -4.51611,0 8.43041,-8.2653 z" id="path3956-3-0" style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 3.7 KiB

After

Width:  |  Height:  |  Size: 5.5 KiB

@@ -1,11 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" version="1.2" width="64" height="64" viewBox="0 0 64 64" id="svg3254" xml:space="preserve"><metadata id="metadata9"><rdf:RDF><cc:Work rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs id="defs7" />
<g id="layer1">
<g transform="matrix(1.2799322,0,0,1.3520619,50.823596,-1446.5167)" id="g3219">
<path d="m -31.496,1077.031 v 4.123 H 3.353 v -4.123 h -34.849 z m 0,8.247 v 4.124 h 21.78 v -4.124 h -21.78 z m 0,12.371 v 4.124 H 3.353 v -4.124 h -34.849 z m 0,8.247 v 4.124 h 26.137 v -4.124 h -26.137 z" id="path3386" style="fill:#041eb5" />
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1018 B

@@ -0,0 +1,46 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
id="svg3254"
height="64"
width="64"
version="1.1">
<defs
id="defs3256" />
<metadata
id="metadata3259">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<path
id="path3361"
d="m 6.6852387,56.408075 0,-2.638845 9.3616333,0 9.361634,0 0,2.638845 0,2.638852 -9.361634,0 -9.3616333,0 0,-2.638852 z"
style="fill:#000000;fill-opacity:1" />
<path
id="path3359"
d="m 34.707354,53.329462 -4.962398,-4.963595 4.962398,-4.963589 4.962399,-4.96359 1.884348,1.884348 1.884348,1.884348 -1.756452,1.75982 -1.756447,1.759815 3.593877,0 c 3.906893,0 4.54727,-0.06969 5.731269,-0.623753 2.01929,-0.944942 3.318869,-3.399692 2.939637,-5.552633 C 51.782312,37.234272 50.06821,35.480689 47.789619,35.048564 47.347178,34.964654 40.123145,34.9203 26.89927,34.9203 l -20.2140313,0 0,-2.640988 0,-2.640987 21.1422163,0.03354 21.14221,0.03354 1.06811,0.356534 c 4.601585,1.536009 7.539568,5.534734 7.539568,10.261697 0,2.947286 -1.040609,5.452602 -3.134532,7.546525 -1.135085,1.135081 -2.237448,1.873897 -3.557775,2.384457 -1.775584,0.686604 -2.355578,0.750076 -6.854035,0.750076 l -4.105451,0 1.756447,1.759815 1.756452,1.75982 -1.884348,1.884346 -1.884348,1.884348 -4.962399,-4.963588 z"
style="fill:#000000;fill-opacity:1" />
<path
id="path3355"
d="m 6.6852387,44.350575 0,-2.638852 9.3616333,0 9.361634,0 0,2.638852 0,2.638847 -9.361634,0 -9.3616333,0 0,-2.638847 z"
style="fill:#000000;fill-opacity:1" />
<path
id="path3353"
d="m 6.6852387,20.02057 0,-2.638846 25.4460523,0 25.446052,0 0,2.638846 0,2.638853 -25.446052,0 -25.4460523,0 0,-2.638853 z"
style="fill:#000000;fill-opacity:1" />
<path
id="path3347"
d="m 6.6852387,8.1548255 0,-2.638852 25.4460523,0 25.446052,0 0,2.638852 0,2.6388475 -25.446052,0 -25.4460523,0 0,-2.6388475 z"
style="fill:#000000;fill-opacity:1" />
</svg>

After

Width:  |  Height:  |  Size: 2.3 KiB

@@ -1,20 +1,46 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" version="1.1" width="64" height="64" id="svg3254">
<defs id="defs3256" />
<metadata id="metadata3259">
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
id="svg3254"
height="64"
width="64"
version="1.1">
<defs
id="defs3256" />
<metadata
id="metadata3259">
<rdf:RDF>
<cc:Work rdf:about="">
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g id="layer1">
<g transform="matrix(1.2799322,0,0,1.3520619,50.823596,-1446.5167)" id="g3219" style="display:inline">
<path d="m -31.495574,1077.0304 0,4.1237 34.8489745,0 0,-4.1237 z m 0,8.2474 0,4.1237 21.7806103,0 0,-4.1237 z m 0,12.3711 0,4.1237 34.8489745,0 0,-4.1237 z m 0,8.2474 0,4.1237 26.1367347,0 0,-4.1237 z" id="path3386" />
</g>
</g>
<path
id="path3361"
d="m 6.6852387,56.408075 0,-2.638845 9.3616333,0 9.361634,0 0,2.638845 0,2.638852 -9.361634,0 -9.3616333,0 0,-2.638852 z"
style="fill:#000000;fill-opacity:1" />
<path
id="path3355"
d="m 6.6852387,44.350575 0,-2.638852 9.3616333,0 9.361634,0 0,2.638852 0,2.638847 -9.361634,0 -9.3616333,0 0,-2.638847 z"
style="fill:#000000;fill-opacity:1" />
<path
id="path3353"
d="m 6.6852387,20.02057 0,-2.638846 25.4460523,0 25.446052,0 0,2.638846 0,2.638853 -25.446052,0 -25.4460523,0 0,-2.638853 z"
style="fill:#000000;fill-opacity:1" />
<path
id="path3347"
d="m 6.6852387,8.1548255 0,-2.638852 25.4460523,0 25.446052,0 0,2.638852 0,2.6388475 -25.446052,0 -25.4460523,0 0,-2.6388475 z"
style="fill:#000000;fill-opacity:1" />
<path
style="fill:#000000;fill-opacity:1"
d="m 6.6852387,31.681587 0,-2.638846 25.4460523,0 25.446052,0 0,2.638846 0,2.638853 -25.446052,0 -25.4460523,0 0,-2.638853 z"
id="path4201" />
</svg>

Before

Width:  |  Height:  |  Size: 1.0 KiB

After

Width:  |  Height:  |  Size: 1.6 KiB

+6 -2
View File
@@ -21,6 +21,10 @@
#ifndef _MACROS_H_
#define _MACROS_H_
#define DIM(arr) (sizeof((arr))/sizeof((arr)[0]))
#include <iterator>
#endif // _MACROS_H_
// #define DIM(arr) (sizeof((arr))/sizeof((arr)[0]))
// new way for c++11
#define DIM(arr__) ((size_t)(std::end((arr__)) - std::begin((arr__))))
#endif // _MACROS_H_
File diff suppressed because it is too large Load Diff
+64 -90
View File
@@ -27,8 +27,6 @@
#include "eeprominterface.h"
#define SPLASH_TIME 5
#define MAX_RECENT 15
#define MAX_PROFILES 15
class MdiChild;
QT_BEGIN_NAMESPACE
@@ -52,47 +50,39 @@ class MainWindow : public QMainWindow
public:
MainWindow();
~MainWindow();
signals:
void FirmwareChanged();
void firmwareChanged();
protected:
QString getCompanionUpdateBaseUrl();
QString seekCodeString(const QByteArray & qba, const QString & label);
protected slots:
void dowloadLastFirmwareUpdate();
void startFirmwareDownload();
void closeEvent(QCloseEvent *event);
void dragEnterEvent(QDragEnterEvent *event);
void dropEvent(QDropEvent *event);
void setLanguage(const QString & langString);
QString seekCodeString(const QByteArray & qba, const QString & label);
virtual void closeEvent(QCloseEvent *event);
virtual void changeEvent(QEvent *e);
virtual void dragEnterEvent(QDragEnterEvent *event);
virtual void dropEvent(QDropEvent *event);
private slots:
void openDocURL();
void retranslateUi(bool showMsg = false);
void setSysLanguage() { setLanguage(""); };
void setCZLanguage() { setLanguage("cs_CZ"); };
void setDELanguage() { setLanguage("de_DE"); };
void setENLanguage() { setLanguage("en"); };
void setFILanguage() { setLanguage("fi_FI"); };
void setFRLanguage() { setLanguage("fr_FR"); };
void setITLanguage() { setLanguage("it_IT"); };
void setPLLanguage() { setLanguage("pl_PL"); };
void setESLanguage() { setLanguage("es_ES"); };
void setSELanguage() { setLanguage("sv_SE"); };
void setCNLanguage() { setLanguage("zh_CN"); };
void setLanguage(const QString & langString);
void onLanguageChanged(QAction * act);
void setTheme(int index);
void setClassicTheme() {setTheme(0);};
void setYericoTheme() {setTheme(1);};
void setMonoWhiteTheme() {setTheme(2);};
void setMonochromeTheme(){setTheme(3);};
void setMonoBlueTheme() {setTheme(4);};
void onThemeChanged(QAction * act);
void setIconThemeSize(int index);
void setSmallIconThemeSize() {setIconThemeSize(0);};
void setNormalIconThemeSize() {setIconThemeSize(1);};
void setBigIconThemeSize() {setIconThemeSize(2);};
void setHugeIconThemeSize() {setIconThemeSize(3);};
void onIconSizeChanged(QAction * act);
void setTabbedWindows(bool on);
void onChangeWindowAction(QAction * act);
void updateWindowActions();
void updateWindowActionTitle(const QMdiSubWindow * win, QAction * act = NULL);
void onSubwindowTitleChanged();
void onSubwindowModified();
void checkForUpdates();
void checkForFirmwareUpdate();
@@ -109,12 +99,11 @@ class MainWindow : public QMainWindow
void openFile();
void save();
void saveAs();
void cut();
void closeFile();
void openRecentFile();
void loadProfileId(const unsigned pid);
void loadProfile();
void logFile();
void copy();
void paste();
void writeEeprom();
void readEeprom();
void writeFlash(QString fileToFlash="");
@@ -124,7 +113,6 @@ class MainWindow : public QMainWindow
void burnConfig();
void burnList();
void burnFuses();
void simulate();
void contributors();
void sdsync();
void changelog();
@@ -132,40 +120,38 @@ class MainWindow : public QMainWindow
void customizeSplash();
void about();
void compare();
void print();
void loadBackup();
void appPrefs();
void fwPrefs();
void updateMenus();
void createProfile();
MdiChild * createMdiChild();
void setActiveSubWindow(QWidget *window);
QMenu * createRecentFileMenu();
QMenu * createProfilesMenu();
void copyProfile();
void deleteProfile(const int pid);
void deleteCurrentProfile();
void autoClose();
private:
void closeUpdatesWaitDialog();
void onUpdatesError();
void createActions();
QAction * addAct(const QString &, const QString &, const QString &, enum QKeySequence::StandardKey, const char *, QObject *slotObj=NULL);
QAction * addAct(const QString &, const QString &, const QString &, const QKeySequence &, const char *, QObject *slotObj=NULL);
QAction * addAct(QActionGroup *, const QString &, const QString &, const char *);
QAction * addAct(const QString &, const QString &, const QString &, const char *);
void createMenus();
void createToolBars();
void createStatusBar();
void updateRecentFileActions();
void updateProfilesActions();
void updateIconSizeActions();
void updateLanguageActions();
void updateIconThemeActions();
void openFile(const QString & fileName, bool updateLastUsedDir = false);
private:
QAction * addAct(const QString & icon, const char * slot = NULL, const QKeySequence & shortcut = 0, QObject * slotObj = NULL, const char * signal = NULL);
QAction * addActToGroup(QActionGroup * aGroup, const QString & sName, const QString & lName, const char * propName = 0,
const QVariant & propValue = QVariant(), const QVariant & dfltValue = QVariant(), const QKeySequence & shortcut = 0);
void trAct(QAction * act, const QString & text, const QString & descript);
QMenu * createLanguageMenu(QWidget * parent = Q_NULLPTR);
void createActions();
void createMenus();
void createToolBars();
void showReadyStatus();
void updateRecentFileActions();
void updateProfilesActions();
int newProfile(bool loadProfile = true);
QString strippedName(const QString & fullFileName);
MdiChild * createMdiChild();
MdiChild * activeMdiChild();
QMdiSubWindow * findMdiChild(const QString & fileName);
@@ -182,11 +168,21 @@ class MainWindow : public QMainWindow
QNetworkAccessManager *networkManager;
QVector<QAction *> recentFileActs;
QVector<QAction *> profileActs;
QList<QAction *> fileWindowActions;
QMenu *fileMenu;
QMenu *editMenu;
QMenu *settingsMenu;
QMenu *burnMenu;
QMenu *helpMenu;
QMenu *windowMenu;
QMenu *iconThemeSizeMenu;
QMenu *themeMenu;
QMenu *recentFilesMenu;
QMenu *profilesMenu;
QActionGroup * windowsListActions;
QToolBar *fileToolBar;
QToolBar *editToolBar;
QToolBar *burnToolBar;
@@ -195,6 +191,8 @@ class MainWindow : public QMainWindow
QAction *openAct;
QAction *saveAct;
QAction *saveAsAct;
QAction *closeAct;
QAction *recentFilesAct;
QAction *exitAct;
QAction *appPrefsAct;
QAction *fwPrefsAct;
@@ -205,9 +203,6 @@ class MainWindow : public QMainWindow
QAction *fwchangelogAct;
QAction *compareAct;
QAction *editSplashAct;
QAction *cutAct;
QAction *copyAct;
QAction *pasteAct;
QAction *writeEepromAct;
QAction *readEepromAct;
QAction *burnConfigAct;
@@ -215,40 +210,19 @@ class MainWindow : public QMainWindow
QAction *burnFusesAct;
QAction *writeFlashAct;
QAction *readFlashAct;
QAction *writeBackupToRadioAct;
QAction *readBackupToFileAct;
QAction *simulateAct;
QAction *separatorAct;
QAction *writeBUToRadioAct;
QAction *readBUToFileAct;
QAction *aboutAct;
QAction *printAct;
QAction *loadbackupAct;
QAction *logsAct;
QAction *recentFileActs[MAX_RECENT];
QAction *profileActs[MAX_PROFILES];
QAction *profilesMenuAct;
QAction *createProfileAct;
QAction *classicThemeAct;
QAction *yericoThemeAct;
QAction *monoThemeAct;
QAction *monoBlueAct;
QAction *monoWhiteAct;
QAction *smallIconAct;
QAction *normalIconAct;
QAction *bigIconAct;
QAction *hugeIconAct;
QAction *sysLangAct;
QAction *czechLangAct;
QAction *germanLangAct;
QAction *englishLangAct;
QAction *finnishLangAct;
QAction *frenchLangAct;
QAction *italianLangAct;
QAction *polishLangAct;
QAction *spanishLangAct;
QAction *swedishLangAct;
QAction *chineseLangAct;
QAction *copyProfileAct;
QAction *deleteProfileAct;
QAction *openDocURLAct;
QAction *actTabbedWindows;
QAction *actTileWindows;
QAction *actCascadeWindows;
QAction *actCloseAllWindows;
};
#endif // _MAINWINDOW_H_
+1127 -454
View File
File diff suppressed because it is too large Load Diff
+168 -58
View File
@@ -23,9 +23,14 @@
#include "eeprominterface.h"
#include "modelslist.h"
#include <QtGui>
class MainWindow;
#include <QActionGroup>
#include <QtGui>
#include <QMessageBox>
#include <QProxyStyle>
#include <QWidget>
class QToolBar;
namespace Ui {
class MdiChild;
@@ -33,93 +38,198 @@ class MdiChild;
class MdiChild : public QWidget
{
// friend class ModelsListWidget;
Q_OBJECT
Q_OBJECT
public:
MdiChild(MainWindow * parent);
enum Actions {
ACT_GEN_EDT, // radio general settings
ACT_GEN_CPY,
ACT_GEN_PST,
ACT_GEN_SIM,
ACT_ITM_EDT, // edit model/rename category
ACT_ITM_DEL, // delete model or cat
ACT_CAT_ADD, // category actions...
//ACT_CAT_EDT, // not sure these are needed...
//ACT_CAT_DEL, // the ACT_ITM_* actions do the same thing
ACT_CAT_SEP, // convenience separator shown/hidden with category actions
ACT_MDL_ADD, // model actions...
ACT_MDL_CPY,
ACT_MDL_CUT,
ACT_MDL_PST,
ACT_MDL_DUP,
ACT_MDL_INS,
ACT_MDL_MOV,
ACT_MDL_RTR, // ResToRe backup
ACT_MDL_WIZ,
ACT_MDL_DFT, // set as DeFaulT
ACT_MDL_PRT, // print
ACT_MDL_SIM,
ACT_ENUM_END
};
MdiChild(QWidget *parent = Q_NULLPTR, QWidget * parentWin = Q_NULLPTR, Qt::WindowFlags f = Qt::WindowFlags());
~MdiChild();
void newFile();
QString currentFile() const;
QString userFriendlyCurrentFile() const;
QVector<int> getSelectedCategories() const;
QVector<int> getSelectedModels() const;
QList<QAction *> getGeneralActions();
QList<QAction *> getEditActions(bool incCatNew = true);
QList<QAction *> getModelActions();
//QList<QAction *> getCategoryActions();
QAction * getAction(const Actions type);
public slots:
void newFile(bool createDefaults = true);
bool loadFile(const QString & fileName, bool resetCurrentFile=true);
bool save();
bool saveAs(bool isNew=false);
bool saveFile(const QString & fileName, bool setCurrent=true);
bool hasModelSelected();
bool hasPasteData() const;
QString userFriendlyCurrentFile() const;
QString currentFile() const { return curFile; }
int getCurrentModel() const;
int getCurrentCategory() const;
void refresh(bool expand=false);
void keyPressEvent(QKeyEvent * event);
signals:
void copyAvailable(bool val);
protected:
void convertStorage(Board::Type from, Board::Type to);
void forceNewFilename(const QString & suffix, const QString & ext);
void closeEvent(QCloseEvent * event);
protected slots:
void documentWasModified();
void on_simulateButton_clicked();
void onModelMoveToCategory();
void on_radioSettings_clicked();
void setDefault();
void writeEeprom();
void print(int model=-1, const QString & filename="");
void onFirmwareChanged();
public slots:
signals:
void modified();
void newStatusMessage(const QString & msg, const int duration);
protected:
virtual void changeEvent(QEvent * event);
virtual void closeEvent(QCloseEvent * event);
virtual void resizeEvent(QResizeEvent * event);
virtual QSize sizeHint() const;
private slots:
void setupNavigation();
void updateNavigation();
void updateTitle();
void setModified();
void retranslateUi();
void showModelsListContextMenu(const QPoint & pos);
void checkAndInitModel(int row);
void generalEdit();
void categoryAdd();
void categoryRename();
void categoryDelete();
void modelAdd();
void modelEdit();
void modelDuplicate();
void modelChangeCategory(int toCategoryId);
void wizardEdit();
void openModelEditWindow();
bool loadBackup();
void confirmDelete();
void deleteSelectedModels();
void showContextMenu(const QPoint & pos);
void adjustToolbarLayout();
void initModelsList();
void refresh();
void onItemActivated(const QModelIndex index);
void onItemSelected(const QModelIndex &);
void onCurrentItemChanged(const QModelIndex &, const QModelIndex &);
void onDataChanged(const QModelIndex & index);
void cut();
void generalEdit();
void copyGeneralSettings();
void pasteGeneralSettings();
void copy();
void cut();
void paste();
void writeEeprom();
void insert();
void edit();
void confirmDelete();
void categoryAdd();
void modelAdd();
void modelEdit();
void wizardEdit();
void modelDuplicate();
void onModelMoveToCategory();
void openModelWizard(int row = -1);
void openModelEditWindow(int row = -1);
void setDefault();
void modelSimulate();
void radioSimulate();
void print(int model=-1, const QString & filename="");
void setModified();
void updateTitle();
void onItemSelected(QModelIndex);
bool isModel(QModelIndex);
bool isCategory(QModelIndex);
bool loadBackup();
void pasteModelData(const QMimeData * mimeData, const QModelIndex row, bool insert = false, bool move = false);
void pasteGeneralData(const QMimeData * mimeData);
private:
QAction *addAct(Actions actId, const QString & icon, const char * slot = 0, const QKeySequence & shortcut = 0, QObject * slotObj = NULL);
QModelIndex getCurrentIndex() const;
int getCurrentModel() const;
int countSelectedModels() const;
bool hasSelectedModel();
bool setSelectedModel(const int modelIndex);
int getCurrentCategory() const;
int countSelectedCats() const;
bool hasSelectedCat();
bool deleteCategory(int categoryIndex = -1, QString * error = NULL);
void deleteSelectedCats();
void checkAndInitModel(int row);
void findNewDefaultModel(const unsigned startAt = 0);
bool insertModelRows(int atModelIdx, int count);
int modelAppend(const ModelData model);
int newModel(int modelIndex = -1, int categoryIndex = -1);
unsigned deleteModels(const QVector<int> modelIndices);
bool deleteModel(const int modelIndex);
void deleteSelectedModels();
void moveModelsToCategory(const QVector<int> models, const int toCategoryId);
void moveSelectedModelsToCat(const int toCategoryId);
unsigned countUsedModels(const int categoryId = -1);
void clearCutList();
void removeModelFromCutList(const int modelIndex);
bool hasClipboardData(const quint8 type = 0) const;
bool maybeSave();
void setCurrentFile(const QString & fileName);
void doCopy(QByteArray * gmData);
void doPaste(QByteArray * gmData, QModelIndex row);
void initModelsList();
void forceNewFilename(const QString & suffix = "", const QString & ext = "otx");
void convertStorage(Board::Type from, Board::Type to);
void showWarning(const QString & msg);
int askQuestion(const QString & msg, int button0 = QMessageBox::Yes, int button1 = QMessageBox::No | QMessageBox::Default, int button2 = 0);
MainWindow * parent;
Ui::MdiChild * ui;
TreeModel * modelsListModel;
QWidget * parentWindow;
QString curFile;
QVector<int> cutModels;
QVector<QAction *> action;
QToolBar * radioToolbar;
QToolBar * categoriesToolbar;
QToolBar * modelsToolbar;
Firmware * firmware;
RadioData radioData;
int lastSelectedModel;
bool isUntitled;
bool fileChanged;
bool showCatToolbar;
const quint16 stateDataVersion;
};
// This will draw the drop indicator across all columns of a model View (vs. in just one column), and lets us make the indicator more obvious.
class ItemViewProxyStyle: public QProxyStyle
{
public:
ItemViewProxyStyle(QStyle * style = 0) : QProxyStyle(style) {}
void drawPrimitive(PrimitiveElement element, const QStyleOption * option, QPainter * painter, const QWidget * widget = 0) const
{
if (element == QStyle::PE_IndicatorItemViewItemDrop && !option->rect.isNull()) {
painter->save();
// set a wider stroke
QPen pen(painter->pen());
pen.setWidthF(2.5f);
painter->setPen(pen);
// adjust the rectangle size of the indicator to encompass the whole row
QStyleOption opt(*option);
opt.rect.setLeft(0);
if (widget)
opt.rect.setRight(widget->width());
// call default handler and exit
QProxyStyle::drawPrimitive(element, &opt, painter, widget);
painter->restore();
}
else {
QProxyStyle::drawPrimitive(element, option, painter, widget);
}
}
};
#endif // _MDICHILD_H_
+19 -17
View File
@@ -6,35 +6,37 @@
<rect>
<x>0</x>
<y>0</y>
<width>468</width>
<height>414</height>
<width>545</width>
<height>575</height>
</rect>
</property>
<property name="windowTitle">
<string/>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<layout class="QVBoxLayout" name="verticalLayout" stretch="0,0,1">
<property name="spacing">
<number>5</number>
</property>
<item>
<widget class="QPushButton" name="radioSettings">
<property name="text">
<string>Radio settings</string>
<layout class="QHBoxLayout" name="topToolbarLayout">
<property name="spacing">
<number>2</number>
</property>
</widget>
</layout>
</item>
<item>
<widget class="QTreeView" name="modelsList"/>
<layout class="QHBoxLayout" name="botToolbarLayout">
<property name="spacing">
<number>2</number>
</property>
</layout>
</item>
<item>
<widget class="QPushButton" name="simulateButton">
<property name="text">
<string>Simulate Tx</string>
<widget class="QTreeView" name="modelsList">
<property name="uniformRowHeights">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</widget>
<resources>
<include location="companion.qrc"/>
</resources>
<resources/>
<connections/>
</ui>
+5 -4
View File
@@ -23,8 +23,8 @@ set(modeledit_SRCS
customfunctions.cpp
# templates.cpp
mixerslistwidget.cpp
node.cpp
edge.cpp
# node.cpp ## node and edge are built in common lib because also used by simulator
# edge.cpp ## commenting them here avoids a "duplicate target" warning eg. from ninja
)
set(modeledit_HDRS
@@ -36,7 +36,7 @@ set(modeledit_HDRS
customfunctions.h
# templates.h
mixerslistwidget.h
node.h
# node.h
)
set(modeledit_UIS
@@ -53,9 +53,10 @@ foreach(name ${modeledit_NAMES})
set(modeledit_HDRS ${modeledit_HDRS} ${name}.h)
set(modeledit_UIS ${modeledit_UIS} ${name}.ui)
endforeach()
qt5_wrap_ui(modeledit_SRCS ${modeledit_UIS})
qt5_wrap_cpp(modeledit_SRCS ${modeledit_HDRS})
add_library(modeledit ${modeledit_SRCS})
qt5_use_modules(modeledit Widgets Xml Multimedia)
target_link_libraries(modeledit PRIVATE ${CPN_COMMON_LIB})
+4 -3
View File
@@ -64,7 +64,8 @@ LimitsGroup::LimitsGroup(Firmware * firmware, TableLayout * tableLayout, int row
horizontalLayout->addWidget(cb);
horizontalLayout->addWidget(spinbox);
tableLayout->addLayout(row, col, horizontalLayout);
gvarGroup = new GVarGroup(gv, spinbox, cb, value, model, deflt, min, max, displayStep, allowGVars, panel);
gvarGroup = new GVarGroup(gv, spinbox, cb, value, model, deflt, min, max, displayStep, allowGVars);
QObject::connect(gvarGroup, &GVarGroup::valueChanged, panel, &ModelPanel::modified);
}
LimitsGroup::~LimitsGroup()
@@ -155,7 +156,7 @@ Channels::Channels(QWidget * parent, ModelData & model, GeneralSettings & genera
curveCB->setProperty("index", i);
int numcurves = firmware->getCapability(NumCurves);
for (int j=-numcurves; j<=numcurves; j++) {
curveCB->addItem(CurveReference(CurveReference::CURVE_REF_CUSTOM, j).toString(), j);
curveCB->addItem(CurveReference(CurveReference::CURVE_REF_CUSTOM, j).toString(&model, false), j);
}
curveCB->setCurrentIndex(model.limitData[i].curve.value+numcurves);
connect(curveCB, SIGNAL(currentIndexChanged(int)), this, SLOT(curveEdited()));
@@ -227,7 +228,7 @@ void Channels::refreshExtendedLimits()
group->updateMinMax(10*channelMax);
}
emit modified();
emit modified();
}
void Channels::invEdited()
+196 -156
View File
@@ -29,6 +29,8 @@ RepeatComboBox::RepeatComboBox(QWidget *parent, int & repeatParam):
unsigned int step = IS_ARM(getCurrentBoard()) ? 1 : 10;
int value = repeatParam/step;
setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Fixed);
if (step == 1) {
addItem(QObject::tr("Played once, not during startup"), -1);
value++;
@@ -71,6 +73,13 @@ CustomFunctionsPanel::CustomFunctionsPanel(QWidget * parent, ModelData * model,
lock = true;
int num_fsw = model ? firmware->getCapability(CustomFunctions) : firmware->getCapability(GlobalFunctions);
rawSwitchItemModel = Helpers::getRawSwitchItemModel(&generalSettings, model ? Helpers::SpecialFunctionsContext : Helpers::GlobalFunctionsContext);
rawSwitchItemModel->setParent(this);
rawSrcInputsItemModel = Helpers::getRawSourceItemModel(&generalSettings, model, POPULATE_NONE|POPULATE_SOURCES|POPULATE_VIRTUAL_INPUTS|POPULATE_TRIMS|POPULATE_SWITCHES);
rawSrcInputsItemModel->setParent(this);
rawSrcAllItemModel = Helpers::getRawSourceItemModel(&generalSettings, model, POPULATE_NONE|POPULATE_SOURCES|POPULATE_VIRTUAL_INPUTS|POPULATE_SWITCHES|POPULATE_GVARS|POPULATE_TRIMS|POPULATE_TELEMETRY|POPULATE_TELEMETRYEXT|POPULATE_SCRIPT_OUTPUTS);
rawSrcAllItemModel->setParent(this);
if (!firmware->getCapability(VoicesAsNumbers)) {
tracksSet = getFilesSet(getSoundsPath(generalSettings), QStringList() << "*.wav" << "*.WAV", firmware->getCapability(VoicesMaxLength));
for (int i=0; i<num_fsw; i++) {
@@ -121,8 +130,9 @@ CustomFunctionsPanel::CustomFunctionsPanel(QWidget * parent, ModelData * model,
// The switch
fswtchSwtch[i] = new QComboBox(this);
fswtchSwtch[i]->setModel(rawSwitchItemModel);
fswtchSwtch[i]->setCurrentIndex(fswtchSwtch[i]->findData(functions[i].swtch.toValue()));
fswtchSwtch[i]->setProperty("index", i);
populateSwitchCB(fswtchSwtch[i], functions[i].swtch, generalSettings, model ? SpecialFunctionsContext : GlobalFunctionsContext);
fswtchSwtch[i]->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Minimum);
fswtchSwtch[i]->setMaxVisibleItems(10);
connect(fswtchSwtch[i], SIGNAL(currentIndexChanged(int)), this, SLOT(customFunctionEdited()));
@@ -131,8 +141,14 @@ CustomFunctionsPanel::CustomFunctionsPanel(QWidget * parent, ModelData * model,
// The function
fswtchFunc[i] = new QComboBox(this);
if (!i) {
populateFuncCB(fswtchFunc[i], functions[i].func);
}
else {
fswtchFunc[i]->setModel(fswtchFunc[0]->model());
fswtchFunc[i]->setCurrentIndex(fswtchFunc[i]->findData(functions[i].func));
}
fswtchFunc[i]->setProperty("index", i);
populateFuncCB(fswtchFunc[i], functions[i].func);
connect(fswtchFunc[i], SIGNAL(currentIndexChanged(int)), this, SLOT(functionEdited()));
tableLayout->addWidget(i, 2, fswtchFunc[i]);
// s1.report("func");
@@ -214,6 +230,7 @@ CustomFunctionsPanel::CustomFunctionsPanel(QWidget * parent, ModelData * model,
repeatLayout->addWidget(fswtchEnable[i], i+1);
connect(fswtchEnable[i], SIGNAL(stateChanged(int)), this, SLOT(customFunctionEdited()));
}
s1.report("add items");
disableMouseScrolling();
@@ -320,6 +337,7 @@ void CustomFunctionsPanel::playMusic()
#define CUSTOM_FUNCTION_REPEAT (1<<7)
#define CUSTOM_FUNCTION_PLAY (1<<8)
#define CUSTOM_FUNCTION_BL_COLOR (1<<9)
#define CUSTOM_FUNCTION_SHOW_FUNC (1<<10)
void CustomFunctionsPanel::customFunctionEdited()
{
@@ -340,7 +358,7 @@ void CustomFunctionsPanel::functionEdited()
RawSwitch swtch = functions[index].swtch;
functions[index].clear();
functions[index].swtch = swtch;
functions[index].func = (AssignFunc)fswtchFunc[index]->itemData(fswtchFunc[index]->currentIndex()).toInt();
functions[index].func = (AssignFunc)fswtchFunc[index]->currentData().toInt();
refreshCustomFunction(index);
emit modified();
lock = false;
@@ -355,181 +373,199 @@ void CustomFunctionsPanel::onChildModified()
void CustomFunctionsPanel::refreshCustomFunction(int i, bool modified)
{
CustomFunctionData & cfn = functions[i];
AssignFunc func = (AssignFunc)fswtchFunc[i]->itemData(fswtchFunc[i]->currentIndex()).toInt();
AssignFunc func = (AssignFunc)fswtchFunc[i]->currentData().toInt();
unsigned int widgetsMask = 0;
if (modified) {
cfn.swtch = RawSwitch(fswtchSwtch[i]->itemData(fswtchSwtch[i]->currentIndex()).toInt());
cfn.swtch = RawSwitch(fswtchSwtch[i]->currentData().toInt());
cfn.func = func;
cfn.enabled = fswtchEnable[i]->isChecked();
cfn.adjustMode = (AssignFunc)fswtchGVmode[i]->currentIndex();
}
if (func>=FuncOverrideCH1 && func<=FuncOverrideCH32) {
if (model) {
int channelsMax = model->getChannelsMax(true);
fswtchParam[i]->setDecimals(0);
fswtchParam[i]->setSingleStep(1);
fswtchParam[i]->setMinimum(-channelsMax);
fswtchParam[i]->setMaximum(channelsMax);
if (modified) {
cfn.param = fswtchParam[i]->value();
}
fswtchParam[i]->setValue(cfn.param);
widgetsMask |= CUSTOM_FUNCTION_NUMERIC_PARAM + CUSTOM_FUNCTION_ENABLE;
}
}
else if (func==FuncLogs) {
fswtchParam[i]->setDecimals(1);
fswtchParam[i]->setMinimum(0);
fswtchParam[i]->setMaximum(25.5);
fswtchParam[i]->setSingleStep(0.1);
if (modified) cfn.param = fswtchParam[i]->value()*10.0;
fswtchParam[i]->setValue(cfn.param/10.0);
widgetsMask |= CUSTOM_FUNCTION_NUMERIC_PARAM;
}
else if (func>=FuncAdjustGV1 && func<=FuncAdjustGVLast) {
if (modified) cfn.adjustMode = fswtchGVmode[i]->currentIndex();
widgetsMask |= CUSTOM_FUNCTION_GV_MODE | CUSTOM_FUNCTION_ENABLE;
if (cfn.adjustMode==FUNC_ADJUST_GVAR_CONSTANT || cfn.adjustMode==FUNC_ADJUST_GVAR_INCDEC) {
if (modified) cfn.param = fswtchParam[i]->value();
fswtchParam[i]->setDecimals(0);
fswtchParam[i]->setSingleStep(1);
if (IS_ARM(getCurrentBoard())) {
fswtchParam[i]->setMinimum(-500);
fswtchParam[i]->setMaximum(500);
}
else {
fswtchParam[i]->setMinimum(-125);
fswtchParam[i]->setMaximum(125);
}
fswtchParam[i]->setValue(cfn.param);
widgetsMask |= CUSTOM_FUNCTION_NUMERIC_PARAM;
}
else {
if (modified) cfn.param = fswtchParamT[i]->itemData(fswtchParamT[i]->currentIndex()).toInt();
populateFuncParamCB(fswtchParamT[i], func, cfn.param, cfn.adjustMode);
widgetsMask |= CUSTOM_FUNCTION_SOURCE_PARAM;
}
}
else if (func==FuncReset) {
if (modified) cfn.param = fswtchParamT[i]->itemData(fswtchParamT[i]->currentIndex()).toInt();
populateFuncParamCB(fswtchParamT[i], func, cfn.param);
widgetsMask |= CUSTOM_FUNCTION_SOURCE_PARAM | CUSTOM_FUNCTION_ENABLE;
}
else if (func>=FuncSetTimer1 && func<=FuncSetTimer3) {
if (modified) cfn.param = QTimeS(fswtchParamTime[i]->time()).seconds();
fswtchParamTime[i]->setMinimumTime(QTime(0, 0, 0));
fswtchParamTime[i]->setMaximumTime(firmware->getMaxTimerStart());
fswtchParamTime[i]->setTime(QTimeS(cfn.param));
widgetsMask |= CUSTOM_FUNCTION_TIME_PARAM + CUSTOM_FUNCTION_ENABLE;
}
else if (func>=FuncSetFailsafeInternalModule && func<=FuncBindExternalModule) {
widgetsMask |= CUSTOM_FUNCTION_ENABLE;
}
else if (func==FuncVolume) {
if (modified) cfn.param = fswtchParamT[i]->itemData(fswtchParamT[i]->currentIndex()).toInt();
populateFuncParamCB(fswtchParamT[i], func, cfn.param);
widgetsMask |= CUSTOM_FUNCTION_SOURCE_PARAM + CUSTOM_FUNCTION_ENABLE;
}
else if (func==FuncPlaySound || func==FuncPlayHaptic || func==FuncPlayValue || func==FuncPlayPrompt || func==FuncPlayBoth || func==FuncBackgroundMusic) {
if (func != FuncBackgroundMusic) {
widgetsMask |= CUSTOM_FUNCTION_REPEAT;
fswtchRepeat[i]->update();
}
if (func==FuncPlayValue) {
if (modified) cfn.param = fswtchParamT[i]->itemData(fswtchParamT[i]->currentIndex()).toInt();
populateFuncParamCB(fswtchParamT[i], func, cfn.param);
widgetsMask |= CUSTOM_FUNCTION_SOURCE_PARAM + CUSTOM_FUNCTION_REPEAT;
}
else if (func==FuncPlayPrompt || func==FuncPlayBoth) {
if (firmware->getCapability(VoicesAsNumbers)) {
if (!cfn.isEmpty()) {
widgetsMask |= CUSTOM_FUNCTION_SHOW_FUNC;
if (func>=FuncOverrideCH1 && func<=FuncOverrideCH32) {
if (model) {
int channelsMax = model->getChannelsMax(true);
fswtchParam[i]->setDecimals(0);
fswtchParam[i]->setSingleStep(1);
fswtchParam[i]->setMinimum(0);
if (func==FuncPlayPrompt) {
widgetsMask |= CUSTOM_FUNCTION_NUMERIC_PARAM + CUSTOM_FUNCTION_REPEAT + CUSTOM_FUNCTION_GV_TOOGLE;
}
else {
widgetsMask |= CUSTOM_FUNCTION_NUMERIC_PARAM + CUSTOM_FUNCTION_REPEAT;
fswtchParamGV[i]->setChecked(false);
}
fswtchParam[i]->setMaximum(func==FuncPlayBoth ? 254 : 255);
fswtchParam[i]->setMinimum(-channelsMax);
fswtchParam[i]->setMaximum(channelsMax);
if (modified) {
if (fswtchParamGV[i]->isChecked()) {
fswtchParam[i]->setMinimum(1);
cfn.param = std::min(fswtchParam[i]->value(),5.0)+(fswtchParamGV[i]->isChecked() ? 250 : 0);
}
else {
cfn.param = fswtchParam[i]->value();
}
cfn.param = fswtchParam[i]->value();
}
if (cfn.param>250 && (func!=FuncPlayBoth)) {
fswtchParamGV[i]->setChecked(true);
fswtchParam[i]->setValue(cfn.param-250);
fswtchParam[i]->setMaximum(5);
fswtchParam[i]->setValue(cfn.param);
widgetsMask |= CUSTOM_FUNCTION_NUMERIC_PARAM | CUSTOM_FUNCTION_ENABLE;
}
}
else if (func==FuncLogs) {
fswtchParam[i]->setDecimals(1);
fswtchParam[i]->setMinimum(0);
fswtchParam[i]->setMaximum(25.5);
fswtchParam[i]->setSingleStep(0.1);
if (modified)
cfn.param = fswtchParam[i]->value()*10.0;
fswtchParam[i]->setValue(cfn.param/10.0);
widgetsMask |= CUSTOM_FUNCTION_NUMERIC_PARAM;
}
else if (func>=FuncAdjustGV1 && func<=FuncAdjustGVLast) {
if (modified)
cfn.adjustMode = fswtchGVmode[i]->currentIndex();
widgetsMask |= CUSTOM_FUNCTION_GV_MODE | CUSTOM_FUNCTION_ENABLE;
if (cfn.adjustMode==FUNC_ADJUST_GVAR_CONSTANT || cfn.adjustMode==FUNC_ADJUST_GVAR_INCDEC) {
if (modified)
cfn.param = fswtchParam[i]->value();
fswtchParam[i]->setDecimals(0);
fswtchParam[i]->setSingleStep(1);
if (IS_ARM(getCurrentBoard())) {
fswtchParam[i]->setMinimum(-500);
fswtchParam[i]->setMaximum(500);
}
else {
fswtchParamGV[i]->setChecked(false);
fswtchParam[i]->setValue(cfn.param);
fswtchParam[i]->setMinimum(-125);
fswtchParam[i]->setMaximum(125);
}
if (cfn.param < 251)
widgetsMask |= CUSTOM_FUNCTION_PLAY;
fswtchParam[i]->setValue(cfn.param);
widgetsMask |= CUSTOM_FUNCTION_NUMERIC_PARAM;
}
else {
if (modified)
cfn.param = fswtchParamT[i]->currentData().toInt();
populateFuncParamCB(fswtchParamT[i], func, cfn.param, cfn.adjustMode);
widgetsMask |= CUSTOM_FUNCTION_SOURCE_PARAM;
}
}
else if (func==FuncReset) {
if (modified)
cfn.param = fswtchParamT[i]->currentData().toInt();
populateFuncParamCB(fswtchParamT[i], func, cfn.param);
widgetsMask |= CUSTOM_FUNCTION_SOURCE_PARAM | CUSTOM_FUNCTION_ENABLE;
}
else if (func>=FuncSetTimer1 && func<=FuncSetTimer3) {
if (modified)
cfn.param = QTimeS(fswtchParamTime[i]->time()).seconds();
fswtchParamTime[i]->setMinimumTime(QTime(0, 0, 0));
fswtchParamTime[i]->setMaximumTime(firmware->getMaxTimerStart());
fswtchParamTime[i]->setTime(QTimeS(cfn.param));
widgetsMask |= CUSTOM_FUNCTION_TIME_PARAM | CUSTOM_FUNCTION_ENABLE;
}
else if (func>=FuncSetFailsafeInternalModule && func<=FuncBindExternalModule) {
widgetsMask |= CUSTOM_FUNCTION_ENABLE;
}
else if (func==FuncVolume) {
if (modified)
cfn.param = fswtchParamT[i]->currentData().toInt();
populateFuncParamCB(fswtchParamT[i], func, cfn.param);
widgetsMask |= CUSTOM_FUNCTION_SOURCE_PARAM | CUSTOM_FUNCTION_ENABLE;
}
else if (func==FuncPlaySound || func==FuncPlayHaptic || func==FuncPlayValue || func==FuncPlayPrompt || func==FuncPlayBoth || func==FuncBackgroundMusic) {
if (func != FuncBackgroundMusic) {
widgetsMask |= CUSTOM_FUNCTION_REPEAT;
fswtchRepeat[i]->update();
}
if (func==FuncPlayValue) {
if (modified)
cfn.param = fswtchParamT[i]->currentData().toInt();
populateFuncParamCB(fswtchParamT[i], func, cfn.param);
widgetsMask |= CUSTOM_FUNCTION_SOURCE_PARAM | CUSTOM_FUNCTION_REPEAT;
}
else if (func==FuncPlayPrompt || func==FuncPlayBoth) {
if (firmware->getCapability(VoicesAsNumbers)) {
fswtchParam[i]->setDecimals(0);
fswtchParam[i]->setSingleStep(1);
fswtchParam[i]->setMinimum(0);
if (func==FuncPlayPrompt) {
widgetsMask |= CUSTOM_FUNCTION_NUMERIC_PARAM | CUSTOM_FUNCTION_REPEAT | CUSTOM_FUNCTION_GV_TOOGLE;
}
else {
widgetsMask |= CUSTOM_FUNCTION_NUMERIC_PARAM | CUSTOM_FUNCTION_REPEAT;
fswtchParamGV[i]->setChecked(false);
}
fswtchParam[i]->setMaximum(func==FuncPlayBoth ? 254 : 255);
if (modified) {
if (fswtchParamGV[i]->isChecked()) {
fswtchParam[i]->setMinimum(1);
cfn.param = std::min(fswtchParam[i]->value(),5.0)+(fswtchParamGV[i]->isChecked() ? 250 : 0);
}
else {
cfn.param = fswtchParam[i]->value();
}
}
if (cfn.param>250 && (func!=FuncPlayBoth)) {
fswtchParamGV[i]->setChecked(true);
fswtchParam[i]->setValue(cfn.param-250);
fswtchParam[i]->setMaximum(5);
}
else {
fswtchParamGV[i]->setChecked(false);
fswtchParam[i]->setValue(cfn.param);
}
if (cfn.param < 251)
widgetsMask |= CUSTOM_FUNCTION_PLAY;
}
else {
widgetsMask |= CUSTOM_FUNCTION_FILE_PARAM;
if (modified) {
Helpers::getFileComboBoxValue(fswtchParamArmT[i], cfn.paramarm, firmware->getCapability(VoicesMaxLength));
}
Helpers::populateFileComboBox(fswtchParamArmT[i], tracksSet, cfn.paramarm);
if (fswtchParamArmT[i]->currentText() != "----") {
widgetsMask |= CUSTOM_FUNCTION_PLAY;
}
}
}
else if (func==FuncBackgroundMusic) {
widgetsMask |= CUSTOM_FUNCTION_FILE_PARAM;
if (modified) {
getFileComboBoxValue(fswtchParamArmT[i], cfn.paramarm, firmware->getCapability(VoicesMaxLength));
Helpers::getFileComboBoxValue(fswtchParamArmT[i], cfn.paramarm, firmware->getCapability(VoicesMaxLength));
}
populateFileComboBox(fswtchParamArmT[i], tracksSet, cfn.paramarm);
Helpers::populateFileComboBox(fswtchParamArmT[i], tracksSet, cfn.paramarm);
if (fswtchParamArmT[i]->currentText() != "----") {
widgetsMask |= CUSTOM_FUNCTION_PLAY;
}
}
else if (func==FuncPlaySound) {
if (modified)
cfn.param = (uint8_t)fswtchParamT[i]->currentIndex();
populateFuncParamCB(fswtchParamT[i], func, cfn.param);
widgetsMask |= CUSTOM_FUNCTION_SOURCE_PARAM;
}
else if (func==FuncPlayHaptic) {
if (modified)
cfn.param = (uint8_t)fswtchParamT[i]->currentIndex();
populateFuncParamCB(fswtchParamT[i], func, cfn.param);
widgetsMask |= CUSTOM_FUNCTION_SOURCE_PARAM;
}
}
else if (func==FuncBackgroundMusic) {
else if (func==FuncPlayScript) {
widgetsMask |= CUSTOM_FUNCTION_FILE_PARAM;
if (modified) {
getFileComboBoxValue(fswtchParamArmT[i], cfn.paramarm, firmware->getCapability(VoicesMaxLength));
Helpers::getFileComboBoxValue(fswtchParamArmT[i], cfn.paramarm, 8);
}
populateFileComboBox(fswtchParamArmT[i], tracksSet, cfn.paramarm);
if (fswtchParamArmT[i]->currentText() != "----") {
widgetsMask |= CUSTOM_FUNCTION_PLAY;
Helpers::populateFileComboBox(fswtchParamArmT[i], scriptsSet, cfn.paramarm);
}
else if (func==FuncBacklight && IS_TARANIS_PLUS(getCurrentBoard())) {
if (modified)
cfn.param = (uint8_t)fswtchBLcolor[i]->value();
fswtchBLcolor[i]->setValue(cfn.param);
widgetsMask |= CUSTOM_FUNCTION_BL_COLOR;
}
else {
if (modified)
cfn.param = fswtchParam[i]->value();
fswtchParam[i]->setDecimals(0);
fswtchParam[i]->setSingleStep(1);
fswtchParam[i]->setValue(cfn.param);
if (func <= FuncInstantTrim) {
widgetsMask |= CUSTOM_FUNCTION_ENABLE;
}
}
else if (func==FuncPlaySound) {
if (modified) cfn.param = (uint8_t)fswtchParamT[i]->currentIndex();
populateFuncParamCB(fswtchParamT[i], func, cfn.param);
widgetsMask |= CUSTOM_FUNCTION_SOURCE_PARAM;
}
else if (func==FuncPlayHaptic) {
if (modified) cfn.param = (uint8_t)fswtchParamT[i]->currentIndex();
populateFuncParamCB(fswtchParamT[i], func, cfn.param);
widgetsMask |= CUSTOM_FUNCTION_SOURCE_PARAM;
}
}
else if (func==FuncPlayScript) {
widgetsMask |= CUSTOM_FUNCTION_FILE_PARAM;
if (modified) {
getFileComboBoxValue(fswtchParamArmT[i], cfn.paramarm, 8);
}
populateFileComboBox(fswtchParamArmT[i], scriptsSet, cfn.paramarm);
}
else if (func==FuncBacklight && IS_TARANIS_PLUS(getCurrentBoard())) {
if (modified) cfn.param = (uint8_t)fswtchBLcolor[i]->value();
fswtchBLcolor[i]->setValue(cfn.param);
widgetsMask |= CUSTOM_FUNCTION_BL_COLOR;
}
else {
if (modified) cfn.param = fswtchParam[i]->value();
fswtchParam[i]->setDecimals(0);
fswtchParam[i]->setSingleStep(1);
fswtchParam[i]->setValue(cfn.param);
if (func <= FuncInstantTrim) {
widgetsMask |= CUSTOM_FUNCTION_ENABLE;
}
}
fswtchFunc[i]->setVisible(widgetsMask & CUSTOM_FUNCTION_SHOW_FUNC);
fswtchParam[i]->setVisible(widgetsMask & CUSTOM_FUNCTION_NUMERIC_PARAM);
fswtchParamTime[i]->setVisible(widgetsMask & CUSTOM_FUNCTION_TIME_PARAM);
fswtchParamGV[i]->setVisible(widgetsMask & CUSTOM_FUNCTION_GV_TOOGLE);
@@ -565,8 +601,8 @@ void CustomFunctionsPanel::fswPaste()
CustomFunctionData *fsw = &functions[selectedFunction];
memcpy(fsw, fswData.constData(), sizeof(CustomFunctionData));
lock = true;
populateSwitchCB(fswtchSwtch[selectedFunction], functions[selectedFunction].swtch, generalSettings, model ? SpecialFunctionsContext : GlobalFunctionsContext);
populateFuncCB(fswtchFunc[selectedFunction], functions[selectedFunction].func);
fswtchSwtch[selectedFunction]->setCurrentIndex(fswtchSwtch[selectedFunction]->findData(functions[selectedFunction].swtch.toValue()));
fswtchFunc[selectedFunction]->setCurrentIndex(fswtchFunc[selectedFunction]->findData(functions[selectedFunction].func));
populateGVmodeCB(fswtchGVmode[selectedFunction], functions[selectedFunction].adjustMode);
populateFuncParamCB(fswtchParamT[selectedFunction], functions[selectedFunction].func, functions[selectedFunction].param, functions[selectedFunction].adjustMode);
refreshCustomFunction(selectedFunction);
@@ -580,8 +616,8 @@ void CustomFunctionsPanel::fswDelete()
functions[selectedFunction].clear();
// TODO update switch and func
lock = true;
populateSwitchCB(fswtchSwtch[selectedFunction], functions[selectedFunction].swtch, generalSettings, model ? SpecialFunctionsContext : GlobalFunctionsContext);
populateFuncCB(fswtchFunc[selectedFunction], functions[selectedFunction].func);
fswtchSwtch[selectedFunction]->setCurrentIndex(fswtchSwtch[selectedFunction]->findData(functions[selectedFunction].swtch.toValue()));
fswtchFunc[selectedFunction]->setCurrentIndex(fswtchFunc[selectedFunction]->findData(functions[selectedFunction].func));
refreshCustomFunction(selectedFunction);
lock = false;
emit modified();
@@ -644,7 +680,7 @@ void CustomFunctionsPanel::populateFuncCB(QComboBox *b, unsigned int value)
// b->model()->setData(index, v, Qt::UserRole - 1);
}
else {
b->addItem(CustomFunctionData(AssignFunc(i)).funcToString(), i);
b->addItem(CustomFunctionData(AssignFunc(i)).funcToString(model), i);
if (i == value) {
b->setCurrentIndex(b->count()-1);
}
@@ -665,7 +701,7 @@ void CustomFunctionsPanel::populateGVmodeCB(QComboBox *b, unsigned int value)
void CustomFunctionsPanel::populateFuncParamCB(QComboBox *b, uint function, unsigned int value, unsigned int adjustmode)
{
QStringList qs;
b->clear();
b->setModel(new QStandardItemModel(b)); // clear combo box but not any shared item model
if (function==FuncPlaySound) {
CustomFunctionData::populatePlaySoundParams(qs);
b->addItems(qs);
@@ -680,18 +716,22 @@ void CustomFunctionsPanel::populateFuncParamCB(QComboBox *b, uint function, unsi
CustomFunctionData::populateResetParams(model, b, value);
}
else if (function==FuncVolume) {
populateSourceCB(b, RawSource(value), generalSettings, model, POPULATE_NONE|POPULATE_SOURCES|POPULATE_VIRTUAL_INPUTS|POPULATE_TRIMS|POPULATE_SWITCHES);
b->setModel(rawSrcInputsItemModel);
b->setCurrentIndex(b->findData(value));
}
else if (function==FuncPlayValue) {
populateSourceCB(b, RawSource(value), generalSettings, model, POPULATE_NONE|POPULATE_SOURCES|POPULATE_VIRTUAL_INPUTS|POPULATE_SWITCHES|POPULATE_GVARS|POPULATE_TRIMS|POPULATE_TELEMETRY|POPULATE_TELEMETRYEXT|POPULATE_SCRIPT_OUTPUTS);
b->setModel(rawSrcAllItemModel);
b->setCurrentIndex(b->findData(value));
}
else if (function>=FuncAdjustGV1 && function<=FuncAdjustGVLast) {
switch (adjustmode) {
case 1:
populateSourceCB(b, RawSource(value), generalSettings, model, POPULATE_NONE|POPULATE_SOURCES|POPULATE_VIRTUAL_INPUTS|POPULATE_TRIMS|POPULATE_SWITCHES);
b->setModel(rawSrcInputsItemModel);
b->setCurrentIndex(b->findData(value));
break;
case 2:
populateSourceCB(b, RawSource(value), generalSettings, model, POPULATE_GVARS);
b->setModel(Helpers::getRawSourceItemModel(&generalSettings, model, POPULATE_GVARS));
b->setCurrentIndex(b->findData(value));
break;
}
}
+15 -12
View File
@@ -74,22 +74,25 @@ class CustomFunctionsPanel : public GenericPanel
void populateFuncCB(QComboBox *b, unsigned int value);
void populateGVmodeCB(QComboBox *b, unsigned int value);
void populateFuncParamCB(QComboBox *b, uint function, unsigned int value, unsigned int adjustmode=0);
QStandardItemModel * rawSwitchItemModel;
QStandardItemModel * rawSrcInputsItemModel;
QStandardItemModel * rawSrcAllItemModel;
QSet<QString> tracksSet;
QSet<QString> scriptsSet;
int mediaPlayerCurrent;
QComboBox * fswtchSwtch[CPN_MAX_CUSTOM_FUNCTIONS];
QComboBox * fswtchFunc[CPN_MAX_CUSTOM_FUNCTIONS];
QCheckBox * fswtchParamGV[CPN_MAX_CUSTOM_FUNCTIONS];
QDoubleSpinBox * fswtchParam[CPN_MAX_CUSTOM_FUNCTIONS];
QTimeEdit * fswtchParamTime[CPN_MAX_CUSTOM_FUNCTIONS];
QPushButton * playBT[CPN_MAX_CUSTOM_FUNCTIONS];
QComboBox * fswtchParamT[CPN_MAX_CUSTOM_FUNCTIONS];
QComboBox * fswtchParamArmT[CPN_MAX_CUSTOM_FUNCTIONS];
QCheckBox * fswtchEnable[CPN_MAX_CUSTOM_FUNCTIONS];
RepeatComboBox * fswtchRepeat[CPN_MAX_CUSTOM_FUNCTIONS];
QComboBox * fswtchGVmode[CPN_MAX_CUSTOM_FUNCTIONS];
QSlider * fswtchBLcolor[CPN_MAX_CUSTOM_FUNCTIONS];
QComboBox * fswtchSwtch[CPN_MAX_SPECIAL_FUNCTIONS];
QComboBox * fswtchFunc[CPN_MAX_SPECIAL_FUNCTIONS];
QCheckBox * fswtchParamGV[CPN_MAX_SPECIAL_FUNCTIONS];
QDoubleSpinBox * fswtchParam[CPN_MAX_SPECIAL_FUNCTIONS];
QTimeEdit * fswtchParamTime[CPN_MAX_SPECIAL_FUNCTIONS];
QPushButton * playBT[CPN_MAX_SPECIAL_FUNCTIONS];
QComboBox * fswtchParamT[CPN_MAX_SPECIAL_FUNCTIONS];
QComboBox * fswtchParamArmT[CPN_MAX_SPECIAL_FUNCTIONS];
QCheckBox * fswtchEnable[CPN_MAX_SPECIAL_FUNCTIONS];
RepeatComboBox * fswtchRepeat[CPN_MAX_SPECIAL_FUNCTIONS];
QComboBox * fswtchGVmode[CPN_MAX_SPECIAL_FUNCTIONS];
QSlider * fswtchBLcolor[CPN_MAX_SPECIAL_FUNCTIONS];
QMediaPlayer * mediaPlayer;
int selectedFunction;
+4 -3
View File
@@ -60,7 +60,8 @@ ExpoDialog::ExpoDialog(QWidget *parent, ModelData & model, ExpoData *expoData, G
curveGroup = new CurveGroup(ui->curveTypeCB, ui->curveGVarCB, ui->curveValueCB, ui->curveValueSB, ed->curve, model,
firmware->getCapability(HasInputDiff) ? 0 : (HIDE_DIFF | HIDE_NEGATIVE_CURVES));
populateSwitchCB(ui->switchesCB, ed->swtch, generalSettings, MixesContext);
ui->switchesCB->setModel(Helpers::getRawSwitchItemModel(&generalSettings, Helpers::MixesContext));
ui->switchesCB->setCurrentIndex(ui->switchesCB->findData(ed->swtch.toValue()));
ui->sideCB->setCurrentIndex(ed->mode-1);
@@ -90,8 +91,8 @@ ExpoDialog::ExpoDialog(QWidget *parent, ModelData & model, ExpoData *expoData, G
if (firmware->getCapability(VirtualInputs)) {
ui->inputName->setMaxLength(firmware->getCapability(InputsLength));
populateSourceCB(ui->sourceCB, ed->srcRaw, generalSettings, &model, POPULATE_NONE | POPULATE_SOURCES |
POPULATE_SWITCHES | POPULATE_TRIMS | POPULATE_TELEMETRY);
ui->sourceCB->setModel(Helpers::getRawSourceItemModel(&generalSettings, &model, POPULATE_NONE | POPULATE_SOURCES | POPULATE_SWITCHES | POPULATE_TRIMS | POPULATE_TELEMETRY));
ui->sourceCB->setCurrentIndex(ui->sourceCB->findData(ed->srcRaw.toValue()));
ui->sourceCB->removeItem(0);
ui->inputName->setValidator(new QRegExpValidator(rx, this));
ui->inputName->setText(inputName);
+29 -13
View File
@@ -50,7 +50,8 @@ FlightModePanel::FlightModePanel(QWidget * parent, ModelData & model, int phaseI
// Phase switch
if (phaseIdx > 0) {
populateSwitchCB(ui->swtch, phase.swtch, generalSettings, MixesContext);
ui->swtch->setModel(Helpers::getRawSwitchItemModel(&generalSettings, Helpers::MixesContext));
ui->swtch->setCurrentIndex(ui->swtch->findData(phase.swtch.toValue()));
connect(ui->swtch, SIGNAL(currentIndexChanged(int)), this, SLOT(phaseSwitch_currentIndexChanged(int)));
}
else {
@@ -74,7 +75,7 @@ FlightModePanel::FlightModePanel(QWidget * parent, ModelData & model, int phaseI
ui->fadeIn->setDisabled(true);
ui->fadeOut->setDisabled(true);
}
// The trims
QString labels[CPN_MAX_STICKS];
for(int i=0; i < CPN_MAX_STICKS; i++) {
@@ -129,7 +130,7 @@ FlightModePanel::FlightModePanel(QWidget * parent, ModelData & model, int phaseI
// RE link to another RE
reUse[i] = new QComboBox(ui->reGB);
reUse[i]->setProperty("index", i);
populateGvarUseCB(reUse[i], phaseIdx);
Helpers::populateGvarUseCB(reUse[i], phaseIdx);
if (phase.rotaryEncoders[i] > 1024) {
reUse[i]->setCurrentIndex(phase.rotaryEncoders[i] - 1024);
}
@@ -152,12 +153,27 @@ FlightModePanel::FlightModePanel(QWidget * parent, ModelData & model, int phaseI
// GVars
if (gvCount > 0 && (firmware->getCapability(GvarsFlightModes) || phaseIdx == 0) ) {
QGridLayout *gvLayout = new QGridLayout(ui->gvGB);
// Column headers
int headerCol = 1;
QLabel *nameLabel = new QLabel(ui->gvGB);
nameLabel->setText(tr("Name"));
gvLayout->addWidget(nameLabel, 0, headerCol++, 1, 1);
if (phaseIdx > 0) {
QLabel *sourceLabel = new QLabel(ui->gvGB);
sourceLabel->setText(tr("Value source"));
gvLayout->addWidget(sourceLabel, 0, headerCol++, 1, 1);
}
QLabel *valueLabel = new QLabel(ui->gvGB);
valueLabel->setText(tr("Value"));
gvLayout->addWidget(valueLabel, 0, headerCol++, 1, 1);
for (int i=0; i<gvCount; i++) {
int col = 0;
// GVar label
QLabel *label = new QLabel(ui->gvGB);
label->setText(tr("GVAR%1").arg(i+1));
gvLayout->addWidget(label, i, col++, 1, 1);
gvLayout->addWidget(label, i+1, col++, 1, 1);
// GVar name
int nameLen = firmware->getCapability(GvarsName);
if (nameLen > 0) {
@@ -165,18 +181,18 @@ FlightModePanel::FlightModePanel(QWidget * parent, ModelData & model, int phaseI
gvNames[i]->setProperty("index", i);
gvNames[i]->setMaxLength(nameLen);
connect(gvNames[i], SIGNAL(editingFinished()), this, SLOT(GVName_editingFinished()));
gvLayout->addWidget(gvNames[i], i, col++, 1, 1);
gvLayout->addWidget(gvNames[i], i+1, col++, 1, 1);
}
if (phaseIdx > 0) {
// GVar link to another GVar
gvUse[i] = new QComboBox(ui->gvGB);
gvUse[i]->setProperty("index", i);
populateGvarUseCB(gvUse[i], phaseIdx);
Helpers::populateGvarUseCB(gvUse[i], phaseIdx);
if (phase.gvars[i] > 1024) {
gvUse[i]->setCurrentIndex(phase.gvars[i] - 1024);
}
connect(gvUse[i], SIGNAL(currentIndexChanged(int)), this, SLOT(phaseGVUse_currentIndexChanged(int)));
gvLayout->addWidget(gvUse[i], i, col++, 1, 1);
gvLayout->addWidget(gvUse[i], i+1, col++, 1, 1);
}
// GVar value
gvValues[i] = new QSpinBox(ui->gvGB);
@@ -184,15 +200,15 @@ FlightModePanel::FlightModePanel(QWidget * parent, ModelData & model, int phaseI
connect(gvValues[i], SIGNAL(editingFinished()), this, SLOT(phaseGVValue_editingFinished()));
gvValues[i]->setMinimum(-1024);
gvValues[i]->setMaximum(1024);
gvLayout->addWidget(gvValues[i], i, col++, 1, 1);
gvLayout->addWidget(gvValues[i], i+1, col++, 1, 1);
// Popups
if (IS_TARANIS(board) && phaseIdx == 0) {
gvPopups[i] = new QCheckBox(ui->gvGB);
gvPopups[i]->setProperty("index", i);
gvPopups[i]->setText(tr("Popup enabled"));
connect(gvPopups[i], SIGNAL(toggled(bool)), this, SLOT(phaseGVPopupToggled(bool)));
gvLayout->addWidget(gvPopups[i], i, col++, 1, 1);
gvLayout->addWidget(gvPopups[i], i+1, col++, 1, 1);
}
}
}
@@ -219,9 +235,9 @@ void FlightModePanel::update()
ui->fadeOut->setValue(float(phase.fadeOut)/scale);
for (int i=0; i<4; i++) {
int trimsMax = firmware->getCapability(ExtendedTrims);
int trimsMax = firmware->getCapability(ExtendedTrimsRange);
if (trimsMax == 0 || !model->extendedTrims) {
trimsMax = 125;
trimsMax = firmware->getCapability(TrimsRange);
}
trimsSlider[i]->setRange(-trimsMax, +trimsMax);
trimsValue[i]->setRange(-trimsMax, +trimsMax);
@@ -244,7 +260,7 @@ void FlightModePanel::update()
}
}
for (int i=0; i<reCount; i++) {
for (int i=0; i<reCount; i++) {
reValues[i]->setDisabled(false);
int idx = phase.rotaryEncoders[i];
FlightModeData *phasere = &phase;
+9 -3
View File
@@ -28,6 +28,9 @@ HeliPanel::HeliPanel(QWidget *parent, ModelData & model, GeneralSettings & gener
{
ui->setupUi(this);
rawSourceItemModel = Helpers::getRawSourceItemModel(&generalSettings, &model, POPULATE_NONE | POPULATE_SOURCES | POPULATE_VIRTUAL_INPUTS | POPULATE_SWITCHES | POPULATE_TRIMS);
rawSourceItemModel->setParent(this);
connect(ui->swashType, SIGNAL(currentIndexChanged(int)), this, SLOT(edited()));
connect(ui->swashRingVal, SIGNAL(editingFinished()), this, SLOT(edited()));
connect(ui->swashCollectiveSource, SIGNAL(currentIndexChanged(int)), this, SLOT(edited()));
@@ -68,11 +71,14 @@ void HeliPanel::update()
lock = true;
ui->swashType->setCurrentIndex(model->swashRingData.type);
populateSourceCB(ui->swashCollectiveSource, model->swashRingData.collectiveSource, generalSettings, model, POPULATE_NONE | POPULATE_SOURCES | POPULATE_VIRTUAL_INPUTS | POPULATE_SWITCHES | POPULATE_TRIMS);
ui->swashCollectiveSource->setModel(rawSourceItemModel);
ui->swashCollectiveSource->setCurrentIndex(ui->swashCollectiveSource->findData(model->swashRingData.collectiveSource.toValue()));
ui->swashRingVal->setValue(model->swashRingData.value);
if (firmware->getCapability(VirtualInputs)) {
populateSourceCB(ui->swashElevatorSource, model->swashRingData.elevatorSource, generalSettings, model, POPULATE_NONE | POPULATE_SOURCES | POPULATE_VIRTUAL_INPUTS | POPULATE_SWITCHES | POPULATE_TRIMS);
populateSourceCB(ui->swashAileronSource, model->swashRingData.aileronSource, generalSettings, model, POPULATE_NONE | POPULATE_SOURCES | POPULATE_VIRTUAL_INPUTS | POPULATE_SWITCHES | POPULATE_TRIMS);
ui->swashElevatorSource->setModel(rawSourceItemModel);
ui->swashElevatorSource->setCurrentIndex(ui->swashElevatorSource->findData(model->swashRingData.elevatorSource.toValue()));
ui->swashAileronSource->setModel(rawSourceItemModel);
ui->swashAileronSource->setCurrentIndex(ui->swashAileronSource->findData(model->swashRingData.aileronSource.toValue()));
ui->swashElevatorWeight->setValue(model->swashRingData.elevatorWeight);
ui->swashAileronWeight->setValue(model->swashRingData.aileronWeight);
ui->swashCollectiveWeight->setValue(model->swashRingData.collectiveWeight);
+1
View File
@@ -41,6 +41,7 @@ class HeliPanel : public ModelPanel
private:
Ui::Heli *ui;
QStandardItemModel * rawSourceItemModel;
};
#endif // _HELI_H_
+101 -71
View File
@@ -28,6 +28,11 @@ LogicalSwitchesPanel::LogicalSwitchesPanel(QWidget * parent, ModelData & model,
Stopwatch s1("LogicalSwitchesPanel");
int channelsMax = model.getChannelsMax(true);
rawSwitchItemModel = Helpers::getRawSwitchItemModel(&generalSettings, Helpers::LogicalSwitchesContext);
rawSwitchItemModel->setParent(this);
int srcFlags = POPULATE_NONE | POPULATE_SOURCES | POPULATE_SCRIPT_OUTPUTS | POPULATE_VIRTUAL_INPUTS | POPULATE_TRIMS | POPULATE_SWITCHES | POPULATE_TELEMETRY | (firmware->getCapability(GvarsInCS) ? POPULATE_GVARS : 0);
rawSourceItemModel = Helpers::getRawSourceItemModel(&generalSettings, &model, srcFlags);
rawSourceItemModel->setParent(this);
QStringList headerLabels;
headerLabels << "#" << tr("Function") << tr("V1") << tr("V2") << tr("AND Switch");
@@ -214,7 +219,7 @@ void LogicalSwitchesPanel::edited()
if (oldFuncFamily != newFuncFamily) {
model->logicalSw[i].clear();
model->logicalSw[i].func = csw[i]->itemData(csw[i]->currentIndex()).toInt();
model->logicalSw[i].func = csw[i]->currentData().toInt();
if (newFuncFamily == LS_FAMILY_TIMER) {
model->logicalSw[i].val1 = -119;
model->logicalSw[i].val2 = -119;
@@ -249,7 +254,7 @@ void LogicalSwitchesPanel::edited()
updateTimerParam(cswitchOffset[i], model->logicalSw[i].val2, 0.1);
break;
case LS_FAMILY_EDGE:
cswitchOffset2[i]->setSpecialValueText(tr("(instant)"));
cswitchOffset2[i]->setSpecialValueText(" " + tr("(instant)"));
if (sender() == cswitchOffset[i]) {
model->logicalSw[i].val2 = TimToVal(cswitchOffset[i]->value());
updateTimerParam(cswitchOffset[i], model->logicalSw[i].val2, 0.0);
@@ -259,7 +264,7 @@ void LogicalSwitchesPanel::edited()
}
updateTimerParam(cswitchOffset2[i], model->logicalSw[i].val2+model->logicalSw[i].val3, ValToTim(TimToVal(cswitchOffset[i]->value())-1));
if (model->logicalSw[i].val3 == 0) {
cswitchOffset2[i]->setSuffix("(infinite)");
cswitchOffset2[i]->setSuffix(" " + tr("(infinite)"));
}
else {
cswitchOffset2[i]->setSuffix("");
@@ -297,74 +302,89 @@ void LogicalSwitchesPanel::updateTimerParam(QDoubleSpinBox *sb, int timer, doubl
#define VALUE3_VISIBLE 0x10
#define VALUE_TO_VISIBLE 0x20
#define DELAY_ENABLED 0x40
#define DURATION_ENABLED 0x80
void LogicalSwitchesPanel::setSwitchWidgetVisibility(int i)
{
lock = true;
unsigned int mask;
unsigned int mask = DELAY_ENABLED;
RawSource source = RawSource(model->logicalSw[i].val1);
RawSourceRange range = source.getRange(model, generalSettings, model->logicalSw[i].getRangeFlags());
if (!model->logicalSw[i].func) {
mask = 0;
}
else {
mask = DELAY_ENABLED | DURATION_ENABLED;
switch (model->logicalSw[i].getFunctionFamily())
{
case LS_FAMILY_VOFS:
{
mask |= SOURCE1_VISIBLE;
RawSource source = RawSource(model->logicalSw[i].val1);
RawSourceRange range = source.getRange(model, generalSettings, model->logicalSw[i].getRangeFlags());
cswitchSource1[i]->setModel(rawSourceItemModel);
cswitchSource1[i]->setCurrentIndex(cswitchSource1[i]->findData(source.toValue()));
cswitchOffset[i]->setDecimals(range.decimals);
cswitchOffset[i]->setSingleStep(range.step);
if (source.isTimeBased()) {
mask |= VALUE_TO_VISIBLE;
int maxTime = round(range.max);
int value = round(range.step*model->logicalSw[i].val2 + range.offset);
cswitchTOffset[i]->setMaximumTime(QTimeS(maxTime));
QString format = (maxTime>=3600) ? "hh:mm:ss" : "mm:ss";
if (!range.unit.isEmpty())
format += QString("' [%1]'").arg(range.unit);
cswitchTOffset[i]->setDisplayFormat(format);
cswitchTOffset[i]->setTime(QTimeS(value));
}
else {
mask |= VALUE2_VISIBLE;
if (range.unit.isEmpty())
cswitchOffset[i]->setSuffix("");
else
cswitchOffset[i]->setSuffix(" " + range.unit);
cswitchOffset[i]->setMinimum(range.min);
cswitchOffset[i]->setMaximum(range.max);
cswitchOffset[i]->setValue(range.step*(model->logicalSw[i].val2/* TODO+source.getRawOffset(model)*/)+range.offset);
}
switch (model->logicalSw[i].getFunctionFamily())
{
case LS_FAMILY_VOFS:
mask |= SOURCE1_VISIBLE;
populateSourceCB(cswitchSource1[i], source, generalSettings, model, POPULATE_NONE | POPULATE_SOURCES | POPULATE_SCRIPT_OUTPUTS | POPULATE_VIRTUAL_INPUTS | POPULATE_TRIMS | POPULATE_SWITCHES | POPULATE_TELEMETRY | (firmware->getCapability(GvarsInCS) ? POPULATE_GVARS : 0));
cswitchOffset[i]->setDecimals(range.decimals);
cswitchOffset[i]->setSingleStep(range.step);
if (source.isTimeBased()) {
mask |= VALUE_TO_VISIBLE;
int maxTime = round(range.max);
int value = round(range.step*model->logicalSw[i].val2 + range.offset);
cswitchTOffset[i]->setMaximumTime(QTimeS(maxTime));
QString format = (maxTime>=3600) ? "hh:mm:ss" : "mm:ss";
if (!range.unit.isEmpty())
format += QString("' [%1]'").arg(range.unit);
cswitchTOffset[i]->setDisplayFormat(format);
cswitchTOffset[i]->setTime(QTimeS(value));
break;
}
else {
mask |= VALUE2_VISIBLE;
if (range.unit.isEmpty())
cswitchOffset[i]->setSuffix("");
else
cswitchOffset[i]->setSuffix(" " + range.unit);
cswitchOffset[i]->setMinimum(range.min);
cswitchOffset[i]->setMaximum(range.max);
cswitchOffset[i]->setValue(range.step*(model->logicalSw[i].val2/* TODO+source.getRawOffset(model)*/)+range.offset);
}
break;
case LS_FAMILY_STICKY:
// no break
case LS_FAMILY_VBOOL:
mask |= SOURCE1_VISIBLE | SOURCE2_VISIBLE;
populateSwitchCB(cswitchSource1[i], RawSwitch(model->logicalSw[i].val1), generalSettings, LogicalSwitchesContext);
populateSwitchCB(cswitchSource2[i], RawSwitch(model->logicalSw[i].val2), generalSettings, LogicalSwitchesContext);
break;
case LS_FAMILY_EDGE:
mask |= SOURCE1_VISIBLE | VALUE2_VISIBLE | VALUE3_VISIBLE;
mask &= ~DELAY_ENABLED;
populateSwitchCB(cswitchSource1[i], RawSwitch(model->logicalSw[i].val1), generalSettings, LogicalSwitchesContext);
updateTimerParam(cswitchOffset[i], model->logicalSw[i].val2, 0.0);
updateTimerParam(cswitchOffset2[i], model->logicalSw[i].val2+model->logicalSw[i].val3, ValToTim(TimToVal(cswitchOffset[i]->value())-1));
cswitchOffset2[i]->setSpecialValueText(tr("(instant)"));
if (model->logicalSw[i].val3 == 0) {
cswitchOffset2[i]->setSuffix(tr("(infinite)"));
}
else {
cswitchOffset2[i]->setSuffix("");
}
break;
case LS_FAMILY_VCOMP:
mask |= SOURCE1_VISIBLE | SOURCE2_VISIBLE;
populateSourceCB(cswitchSource1[i], RawSource(model->logicalSw[i].val1), generalSettings, model, POPULATE_NONE | POPULATE_SOURCES | POPULATE_SCRIPT_OUTPUTS | POPULATE_VIRTUAL_INPUTS | POPULATE_TRIMS | POPULATE_SWITCHES | POPULATE_TELEMETRY | (firmware->getCapability(GvarsInCS) ? POPULATE_GVARS : 0));
populateSourceCB(cswitchSource2[i], RawSource(model->logicalSw[i].val2), generalSettings, model, POPULATE_NONE | POPULATE_SOURCES | POPULATE_SCRIPT_OUTPUTS | POPULATE_VIRTUAL_INPUTS | POPULATE_TRIMS | POPULATE_SWITCHES | POPULATE_TELEMETRY | (firmware->getCapability(GvarsInCS) ? POPULATE_GVARS : 0));
break;
case LS_FAMILY_TIMER:
mask |= VALUE1_VISIBLE | VALUE2_VISIBLE;
updateTimerParam(cswitchValue[i], model->logicalSw[i].val1, 0.1);
updateTimerParam(cswitchOffset[i], model->logicalSw[i].val2, 0.1);
case LS_FAMILY_STICKY: // no break
case LS_FAMILY_VBOOL:
mask |= SOURCE1_VISIBLE | SOURCE2_VISIBLE;
cswitchSource1[i]->setModel(rawSwitchItemModel);
cswitchSource1[i]->setCurrentIndex(cswitchSource1[i]->findData(model->logicalSw[i].val1));
cswitchSource2[i]->setModel(rawSwitchItemModel);
cswitchSource2[i]->setCurrentIndex(cswitchSource2[i]->findData(model->logicalSw[i].val2));
break;
case LS_FAMILY_EDGE:
mask |= SOURCE1_VISIBLE | VALUE2_VISIBLE | VALUE3_VISIBLE;
mask &= ~DELAY_ENABLED;
cswitchSource1[i]->setModel(rawSwitchItemModel);
cswitchSource1[i]->setCurrentIndex(cswitchSource1[i]->findData(model->logicalSw[i].val1));
updateTimerParam(cswitchOffset[i], model->logicalSw[i].val2, 0.0);
updateTimerParam(cswitchOffset2[i], model->logicalSw[i].val2+model->logicalSw[i].val3, ValToTim(TimToVal(cswitchOffset[i]->value())-1));
cswitchOffset2[i]->setSpecialValueText(tr("(instant)"));
if (model->logicalSw[i].val3 == 0) {
cswitchOffset2[i]->setSuffix(tr("(infinite)"));
}
else {
cswitchOffset2[i]->setSuffix("");
}
break;
case LS_FAMILY_VCOMP:
mask |= SOURCE1_VISIBLE | SOURCE2_VISIBLE;
cswitchSource1[i]->setModel(rawSourceItemModel);
cswitchSource1[i]->setCurrentIndex(cswitchSource1[i]->findData(model->logicalSw[i].val1));
cswitchSource2[i]->setModel(rawSourceItemModel);
cswitchSource2[i]->setCurrentIndex(cswitchSource2[i]->findData(model->logicalSw[i].val2));
break;
case LS_FAMILY_TIMER:
mask |= VALUE1_VISIBLE | VALUE2_VISIBLE;
updateTimerParam(cswitchValue[i], model->logicalSw[i].val1, 0.1);
updateTimerParam(cswitchOffset[i], model->logicalSw[i].val2, 0.1);
break;
}
}
cswitchSource1[i]->setVisible(mask & SOURCE1_VISIBLE);
@@ -374,9 +394,12 @@ void LogicalSwitchesPanel::setSwitchWidgetVisibility(int i)
cswitchOffset2[i]->setVisible(mask & VALUE3_VISIBLE);
cswitchTOffset[i]->setVisible(mask & VALUE_TO_VISIBLE);
if (firmware->getCapability(LogicalSwitchesExt)) {
cswitchDelay[i]->setEnabled(mask & DELAY_ENABLED);
cswitchDuration[i]->setValue(model->logicalSw[i].duration/10.0);
cswitchDelay[i]->setValue(model->logicalSw[i].delay/10.0);
cswitchDuration[i]->setVisible(mask & DURATION_ENABLED);
cswitchDelay[i]->setVisible(mask & DELAY_ENABLED);
if (mask & DURATION_ENABLED)
cswitchDuration[i]->setValue(model->logicalSw[i].duration/10.0);
if (mask & DELAY_ENABLED)
cswitchDelay[i]->setValue(model->logicalSw[i].delay/10.0);
}
lock = false;
}
@@ -425,10 +448,16 @@ void LogicalSwitchesPanel::populateCSWCB(QComboBox *b, int value)
b->setMaxVisibleItems(10);
}
void LogicalSwitchesPanel::populateAndSwitchCB(QComboBox *b, const RawSwitch & value)
void LogicalSwitchesPanel::populateAndSwitchCB(QComboBox *b, const RawSwitch & value, const int idx)
{
if (!model->logicalSw[idx].func) {
b->setVisible(false);
return;
}
if (IS_ARM(firmware->getBoard())) {
populateSwitchCB(b, value, generalSettings, LogicalSwitchesContext);
b->setModel(rawSwitchItemModel);
b->setCurrentIndex(b->findData(value.toValue()));
}
else {
RawSwitch item;
@@ -439,7 +468,7 @@ void LogicalSwitchesPanel::populateAndSwitchCB(QComboBox *b, const RawSwitch & v
b->addItem(item.toString(), item.toValue());
if (item == value) b->setCurrentIndex(b->count()-1);
for (int i=1; i<=firmware->getCapability(SwitchesPositions); i++) {
for (int i=1; i <= Boards::getCapability(firmware->getBoard(), Board::SwitchPositions); i++) {
item = RawSwitch(SWITCH_TYPE_SWITCH, i);
b->addItem(item.toString(), item.toValue());
if (item == value) b->setCurrentIndex(b->count()-1);
@@ -451,6 +480,7 @@ void LogicalSwitchesPanel::populateAndSwitchCB(QComboBox *b, const RawSwitch & v
if (item == value) b->setCurrentIndex(b->count()-1);
}
}
b->setVisible(true);
}
void LogicalSwitchesPanel::updateLine(int i)
@@ -460,7 +490,7 @@ void LogicalSwitchesPanel::updateLine(int i)
lock = true;
setSwitchWidgetVisibility(i);
lock = true;
populateAndSwitchCB(cswitchAnd[i], RawSwitch(model->logicalSw[i].andsw));
populateAndSwitchCB(cswitchAnd[i], RawSwitch(model->logicalSw[i].andsw), i);
lock = false;
}
+13 -11
View File
@@ -48,21 +48,23 @@ class LogicalSwitchesPanel : public ModelPanel
void cswCut();
private:
QComboBox * csw[CPN_MAX_CSW];
QDoubleSpinBox * cswitchValue[CPN_MAX_CSW];
QDoubleSpinBox * cswitchOffset[CPN_MAX_CSW];
QDoubleSpinBox * cswitchOffset2[CPN_MAX_CSW];
QTimeEdit * cswitchTOffset[CPN_MAX_CSW];
QComboBox * cswitchAnd[CPN_MAX_CSW];
QDoubleSpinBox * cswitchDuration[CPN_MAX_CSW];
QDoubleSpinBox * cswitchDelay[CPN_MAX_CSW];
QComboBox * cswitchSource1[CPN_MAX_CSW];
QComboBox * cswitchSource2[CPN_MAX_CSW];
QComboBox * csw[CPN_MAX_LOGICAL_SWITCHES];
QDoubleSpinBox * cswitchValue[CPN_MAX_LOGICAL_SWITCHES];
QDoubleSpinBox * cswitchOffset[CPN_MAX_LOGICAL_SWITCHES];
QDoubleSpinBox * cswitchOffset2[CPN_MAX_LOGICAL_SWITCHES];
QTimeEdit * cswitchTOffset[CPN_MAX_LOGICAL_SWITCHES];
QComboBox * cswitchAnd[CPN_MAX_LOGICAL_SWITCHES];
QDoubleSpinBox * cswitchDuration[CPN_MAX_LOGICAL_SWITCHES];
QDoubleSpinBox * cswitchDelay[CPN_MAX_LOGICAL_SWITCHES];
QComboBox * cswitchSource1[CPN_MAX_LOGICAL_SWITCHES];
QComboBox * cswitchSource2[CPN_MAX_LOGICAL_SWITCHES];
QStandardItemModel * rawSwitchItemModel;
QStandardItemModel * rawSourceItemModel;
void setSwitchWidgetVisibility(int i);
int selectedSwitch;
void populateCSWCB(QComboBox *b, int value);
void populateAndSwitchCB(QComboBox *b, const RawSwitch & value);
void populateAndSwitchCB(QComboBox *b, const RawSwitch & value, const int idx);
void updateLine(int index);
void updateTimerParam(QDoubleSpinBox *sb, int timer, double minimum=0);

Some files were not shown because too many files have changed in this diff Show More