Commit 7591e825 authored by Gus Grubba's avatar Gus Grubba

Export color palette in formats that can be directly used by QGC and custom...

Export color palette in formats that can be directly used by QGC and custom plugins (in addition to the original Json)
Tweak palette export UI
parent 182b76af
...@@ -24,6 +24,8 @@ QGCPalette::Theme QGCPalette::_theme = QGCPalette::Dark; ...@@ -24,6 +24,8 @@ QGCPalette::Theme QGCPalette::_theme = QGCPalette::Dark;
QMap<int, QMap<int, QMap<QString, QColor>>> QGCPalette::_colorInfoMap; QMap<int, QMap<int, QMap<QString, QColor>>> QGCPalette::_colorInfoMap;
QStringList QGCPalette::_colors;
QGCPalette::QGCPalette(QObject* parent) : QGCPalette::QGCPalette(QObject* parent) :
QObject(parent), QObject(parent),
_colorGroupEnabled(true) _colorGroupEnabled(true)
...@@ -44,7 +46,7 @@ QGCPalette::~QGCPalette() ...@@ -44,7 +46,7 @@ QGCPalette::~QGCPalette()
} }
} }
void QGCPalette::_buildMap(void) void QGCPalette::_buildMap()
{ {
// Light Dark // Light Dark
// Disabled Enabled Disabled Enabled // Disabled Enabled Disabled Enabled
......
...@@ -25,12 +25,22 @@ ...@@ -25,12 +25,22 @@
_colorInfoMap[Light][ColorGroupDisabled][QStringLiteral(#name)] = colorInfo[Light][ColorGroupDisabled]; \ _colorInfoMap[Light][ColorGroupDisabled][QStringLiteral(#name)] = colorInfo[Light][ColorGroupDisabled]; \
_colorInfoMap[Dark][ColorGroupEnabled][QStringLiteral(#name)] = colorInfo[Dark][ColorGroupEnabled]; \ _colorInfoMap[Dark][ColorGroupEnabled][QStringLiteral(#name)] = colorInfo[Dark][ColorGroupEnabled]; \
_colorInfoMap[Dark][ColorGroupDisabled][QStringLiteral(#name)] = colorInfo[Dark][ColorGroupDisabled]; \ _colorInfoMap[Dark][ColorGroupDisabled][QStringLiteral(#name)] = colorInfo[Dark][ColorGroupDisabled]; \
_colors << #name; \
} }
#define DEFINE_QGC_COLOR(name, setName) \ #define DEFINE_QGC_COLOR(NAME, SETNAME) \
Q_PROPERTY(QColor name READ name WRITE setName NOTIFY paletteChanged) \ Q_PROPERTY(QColor NAME READ NAME WRITE SETNAME NOTIFY paletteChanged) \
QColor name() const { return _colorInfoMap[_theme][_colorGroupEnabled ? ColorGroupEnabled : ColorGroupDisabled][QStringLiteral(#name)]; } \ Q_PROPERTY(QStringList NAME ## Colors READ NAME ## Colors NOTIFY paletteChanged) \
void setName(QColor& color) { _colorInfoMap[_theme][_colorGroupEnabled ? ColorGroupEnabled : ColorGroupDisabled][QStringLiteral(#name)] = color; _signalPaletteChangeToAll(); } QColor NAME() const { return _colorInfoMap[_theme][_colorGroupEnabled ? ColorGroupEnabled : ColorGroupDisabled][QStringLiteral(#NAME)]; } \
QStringList NAME ## Colors() const { \
QStringList c; \
c << _colorInfoMap[Light][ColorGroupEnabled][QStringLiteral(#NAME)].name(QColor::HexRgb); \
c << _colorInfoMap[Light][ColorGroupDisabled][QStringLiteral(#NAME)].name(QColor::HexRgb); \
c << _colorInfoMap[Dark][ColorGroupEnabled][QStringLiteral(#NAME)].name(QColor::HexRgb); \
c << _colorInfoMap[Dark][ColorGroupDisabled][QStringLiteral(#NAME)].name(QColor::HexRgb); \
return c; \
} \
void SETNAME(QColor& color) { _colorInfoMap[_theme][_colorGroupEnabled ? ColorGroupEnabled : ColorGroupDisabled][QStringLiteral(#NAME)] = color; _signalPaletteChangeToAll(); }
/*! /*!
QGCPalette is used in QML ui to expose color properties for the QGC palette. There are two QGCPalette is used in QML ui to expose color properties for the QGC palette. There are two
...@@ -70,8 +80,9 @@ public: ...@@ -70,8 +80,9 @@ public:
typedef QColor PaletteColorInfo_t[cMaxTheme][cMaxColorGroup]; typedef QColor PaletteColorInfo_t[cMaxTheme][cMaxColorGroup];
Q_PROPERTY(Theme globalTheme READ globalTheme WRITE setGlobalTheme NOTIFY paletteChanged) Q_PROPERTY(Theme globalTheme READ globalTheme WRITE setGlobalTheme NOTIFY paletteChanged)
Q_PROPERTY(bool colorGroupEnabled READ colorGroupEnabled WRITE setColorGroupEnabled NOTIFY paletteChanged) Q_PROPERTY(bool colorGroupEnabled READ colorGroupEnabled WRITE setColorGroupEnabled NOTIFY paletteChanged)
Q_PROPERTY(QStringList colors READ colors CONSTANT)
DEFINE_QGC_COLOR(window, setWindow) DEFINE_QGC_COLOR(window, setWindow)
DEFINE_QGC_COLOR(windowShade, setWindowShade) DEFINE_QGC_COLOR(windowShade, setWindowShade)
...@@ -108,23 +119,25 @@ public: ...@@ -108,23 +119,25 @@ public:
QGCPalette(QObject* parent = nullptr); QGCPalette(QObject* parent = nullptr);
~QGCPalette(); ~QGCPalette();
bool colorGroupEnabled (void) const { return _colorGroupEnabled; } QStringList colors () const { return _colors; }
void setColorGroupEnabled (bool enabled); bool colorGroupEnabled () const { return _colorGroupEnabled; }
void setColorGroupEnabled (bool enabled);
static Theme globalTheme (void) { return _theme; } static Theme globalTheme () { return _theme; }
static void setGlobalTheme (Theme newTheme); static void setGlobalTheme (Theme newTheme);
signals: signals:
void paletteChanged (); void paletteChanged ();
private: private:
static void _buildMap (void); static void _buildMap ();
static void _signalPaletteChangeToAll (void); static void _signalPaletteChangeToAll ();
void _signalPaletteChanged (void); void _signalPaletteChanged ();
void _themeChanged (void); void _themeChanged ();
static Theme _theme; ///< There is a single theme for all palettes static Theme _theme; ///< There is a single theme for all palettes
bool _colorGroupEnabled; ///< Currently selected ColorGroup. true: enabled, false: disabled bool _colorGroupEnabled; ///< Currently selected ColorGroup. true: enabled, false: disabled
static QStringList _colors;
static QMap<int, QMap<int, QMap<QString, QColor>>> _colorInfoMap; // theme -> colorGroup -> color name -> color static QMap<int, QMap<int, QMap<QString, QColor>>> _colorInfoMap; // theme -> colorGroup -> color name -> color
static QList<QGCPalette*> _paletteObjects; ///< List of all active QGCPalette objects static QList<QGCPalette*> _paletteObjects; ///< List of all active QGCPalette objects
......
...@@ -72,10 +72,38 @@ Rectangle { ...@@ -72,10 +72,38 @@ Rectangle {
palette.globalTheme = oldTheme; palette.globalTheme = oldTheme;
palette.colorGroupEnabled = true; palette.colorGroupEnabled = true;
var jsonString = JSON.stringify(themeObj); var jsonString = JSON.stringify(themeObj, null, 4);
themeImportExportEdit.text = jsonString themeImportExportEdit.text = jsonString
paletteImportExportPopup.open() }
function exportThemeCPP() {
var palToExport = ""
for(var i = 0; i < palette.colors.length; i++) {
var cs = palette.colors[i]
var csc = cs + 'Colors'
palToExport += 'DECLARE_QGC_COLOR(' + cs + ', \"' + palette[csc][0] + '\", \"' + palette[csc][1] + '\", \"' + palette[csc][2] + '\", \"' + palette[csc][3] + '\")\n'
}
themeImportExportEdit.text = palToExport
}
function exportThemePlugin() {
var palToExport = ""
for(var i = 0; i < palette.colors.length; i++) {
var cs = palette.colors[i]
var csc = cs + 'Colors'
if(i > 0) {
palToExport += '\nelse '
}
palToExport +=
'if (colorName == QStringLiteral(\"' + cs + '\")) {\n' +
' colorInfo[QGCPalette::Dark][QGCPalette::ColorGroupEnabled] = QColor(\"' + palette[csc][0] + '\");\n' +
' colorInfo[QGCPalette::Dark][QGCPalette::ColorGroupDisabled] = QColor(\"' + palette[csc][1] + '\");\n' +
' colorInfo[QGCPalette::Light][QGCPalette::ColorGroupEnabled] = QColor(\"' + palette[csc][2] + '\");\n' +
' colorInfo[QGCPalette::Light][QGCPalette::ColorGroupDisabled] = QColor(\"' + palette[csc][3] + '\");\n' +
'}'
}
themeImportExportEdit.text = palToExport
} }
function importTheme(jsonStr) { function importTheme(jsonStr) {
...@@ -101,30 +129,64 @@ Rectangle { ...@@ -101,30 +129,64 @@ Rectangle {
} }
Popup { Popup {
id: paletteImportExportPopup id: paletteImportExportPopup
focus: true width: impCol.width + (ScreenTools.defaultFontPixelWidth * 4)
parent: Overlay.overlay height: impCol.height + (ScreenTools.defaultFontPixelHeight * 2)
x: (_root.width - width)/2 modal: true
y: (_root.height - height)/2 focus: true
width: _root.width * 0.666 parent: Overlay.overlay
height: _root.height * 0.666 closePolicy: Popup.CloseOnEscape | Popup.CloseOnPressOutside
modal: true x: Math.round((mainWindow.width - width) * 0.5)
y: Math.round((mainWindow.height - height) * 0.5)
onVisibleChanged: {
if(visible) {
_header.exportTheme()
_jsonButton.checked = true
}
}
background: Rectangle {
anchors.fill: parent
color: palette.window
radius: ScreenTools.defaultFontPixelHeight * 0.5
border.width: 1
border.color: palette.text
}
Column { Column {
anchors.fill: parent id: impCol
spacing: 5 spacing: ScreenTools.defaultFontPixelHeight
anchors.centerIn: parent
Row {
id: exportFormats
spacing: ScreenTools.defaultFontPixelWidth * 2
anchors.horizontalCenter: parent.horizontalCenter
QGCRadioButton {
id: _jsonButton
text: "Json"
onClicked: _header.exportTheme()
}
QGCRadioButton {
text: "QGC"
onClicked: _header.exportThemeCPP()
}
QGCRadioButton {
text: "Custom Plugin"
onClicked: _header.exportThemePlugin()
}
}
Rectangle { Rectangle {
width: parent.width width: flick.width + (ScreenTools.defaultFontPixelWidth * 2)
height: parent.height - importButton.height height: flick.height + (ScreenTools.defaultFontPixelHeight * 2)
border.width: 1 color: "white"
anchors.margins: 10
Flickable { Flickable {
id: flick id: flick
clip: true
anchors.fill: parent width: mainWindow.width * 0.666
contentWidth: themeImportExportEdit.paintedWidth height: mainWindow.height * 0.666
contentHeight: themeImportExportEdit.paintedHeight contentWidth: themeImportExportEdit.paintedWidth
clip: true contentHeight: themeImportExportEdit.paintedHeight
anchors.centerIn: parent
flickableDirection: Flickable.VerticalFlick
function ensureVisible(r) function ensureVisible(r)
{ {
...@@ -139,19 +201,31 @@ Rectangle { ...@@ -139,19 +201,31 @@ Rectangle {
} }
TextEdit { TextEdit {
id: themeImportExportEdit id: themeImportExportEdit
width: flick.width width: flick.width
focus: true focus: true
wrapMode: TextEdit.Wrap font.family: ScreenTools.fixedFontFamily
font.pointSize: ScreenTools.defaultFontPointSize
onCursorRectangleChanged: flick.ensureVisible(cursorRectangle) onCursorRectangleChanged: flick.ensureVisible(cursorRectangle)
} }
} }
} }
Button { Row {
id: importButton spacing: ScreenTools.defaultFontPixelWidth * 2
text: "Import" anchors.horizontalCenter: parent.horizontalCenter
onPressed: { QGCButton {
_header.importTheme(themeImportExportEdit.text); id: importButton
text: "Import (Json Only)"
enabled: themeImportExportEdit.text[0] === "{" && _jsonButton.checked
onClicked: {
_header.importTheme(themeImportExportEdit.text);
}
}
QGCButton {
text: "Close"
onClicked: {
paletteImportExportPopup.close()
}
} }
} }
} }
...@@ -164,7 +238,7 @@ Rectangle { ...@@ -164,7 +238,7 @@ Rectangle {
height: 30 height: 30
anchors.left: windowColorLabel.right anchors.left: windowColorLabel.right
anchors.leftMargin: 20 anchors.leftMargin: 20
onPressed: _header.exportTheme() onPressed: paletteImportExportPopup.open()
} }
Row { Row {
......
...@@ -31,7 +31,7 @@ Rectangle { ...@@ -31,7 +31,7 @@ Rectangle {
property AbstractButton lastClickedButton: null property AbstractButton lastClickedButton: null
// Ensure we don't get lower than // Ensure we don't get narrower than content
property real _idealWidth: (ScreenTools.isMobile ? ScreenTools.minTouchPixels : ScreenTools.defaultFontPixelWidth * 8) + toolStripColumn.anchors.margins * 2 property real _idealWidth: (ScreenTools.isMobile ? ScreenTools.minTouchPixels : ScreenTools.defaultFontPixelWidth * 8) + toolStripColumn.anchors.margins * 2
signal clicked(int index, bool checked) signal clicked(int index, bool checked)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment