updated styling example with context-menu for editing the current line, which shows available values

This commit is contained in:
jkriege2 2022-06-02 21:25:23 +02:00
parent 5bb0235b33
commit cbaf97c8be
5 changed files with 606 additions and 12 deletions

View File

@ -7,8 +7,8 @@ message( STATUS ".. Building Example ${EXAMPLE_NAME}" )
# Set up source files
set(SOURCES test_styling.cpp test_styling_main.cpp)
set(HEADERS test_styling.h )
set(SOURCES test_styling.cpp test_styling_main.cpp jkqtpstyleplaintextedit.cpp)
set(HEADERS test_styling.h jkqtpstyleplaintextedit.h )
set(RESOURCES )
set(UIS test_styling.ui )

View File

@ -0,0 +1,571 @@
#include "jkqtpstyleplaintextedit.h"
#include <QMenu>
#include <QContextMenuEvent>
#include <QAction>
#include <QDebug>
#include <QGuiApplication>
#include <QFont>
#include <QFontDatabase>
#include "jkqtcommon/jkqtpicons.h"
#include "jkqtcommon/jkqttools.h"
#include "jkqtcommon/jkqtpdrawingtools.h"
#include "jkqtplotter/jkqtptools.h"
#include "jkqtplotter/jkqtpimagetools.h"
#include "jkqtmathtext/jkqtmathtext.h"
JKQTPStylePlainTextEdit::JKQTPStylePlainTextEdit(QWidget *parent):
QPlainTextEdit(parent)
{
}
JKQTPStylePlainTextEdit::~JKQTPStylePlainTextEdit()
{
}
void JKQTPStylePlainTextEdit::contextMenuEvent(QContextMenuEvent *event)
{
curContextMenu=cursorForPosition(event->pos());
curContextMenu.select(QTextCursor::LineUnderCursor);
const QString currentLine=curContextMenu.selectedText();
QStringList currentLinePartsLower=currentLine.toLower().split('=');
if (currentLinePartsLower.size()>1) {
if (currentLinePartsLower[1].startsWith("\"") && currentLinePartsLower[1].endsWith("\"")) currentLinePartsLower[1]=currentLinePartsLower[1].mid(1, currentLinePartsLower[1].size()-2);
}
QStringList currentLineParts=currentLine.split('=');
if (currentLineParts.size()>1) {
if (currentLineParts[1].startsWith("\"") && currentLineParts[1].endsWith("\"")) currentLineParts[1]=currentLineParts[1].mid(1, currentLineParts[1].size()-2);
}
QMenu *menu = createStandardContextMenu();
if (currentLinePartsLower.size()>1) {
menu->addSeparator();
QAction* currentValue=menu->addAction(tr("current value: "));
currentValue->setVisible(false);
QAction* currentValue2=menu->addAction(tr("also current value: "));
currentValue2->setVisible(false);
QMenu* submenu=menu->addMenu(tr("set value to ..."));
submenu->setEnabled(false);
if (currentLinePartsLower[0].endsWith("enabled")
|| currentLinePartsLower[0].endsWith("visible")
|| currentLinePartsLower[0].endsWith("display_mouse_position")
|| currentLinePartsLower[0].endsWith("use_palette_colors")
|| currentLinePartsLower[0].endsWith("debug_show_region_boxes")
|| currentLinePartsLower[0].endsWith("antialiase_system")
|| currentLinePartsLower[0].endsWith("antialiase_text")
|| currentLinePartsLower[0].endsWith("\\autosize")
|| currentLinePartsLower[0].endsWith("label_full_number")
|| currentLinePartsLower[0].endsWith("\\antialiase")
) {
submenu->setEnabled(true);
QAction* act;
act=new QAction("true");
connect(act, &QAction::triggered, std::bind(std::mem_fn(&JKQTPStylePlainTextEdit::changeCurrentLineValueTo), this, act->text()));
submenu->addAction(act);
act=new QAction("false");
connect(act, &QAction::triggered, std::bind(std::mem_fn(&JKQTPStylePlainTextEdit::changeCurrentLineValueTo), this, act->text()));
submenu->addAction(act);
} else if (currentLinePartsLower[0].endsWith("penstyle") || currentLinePartsLower[0].endsWith("line_style") || currentLinePartsLower[0].endsWith("line\\style") || currentLinePartsLower[0].endsWith("grid\\style") || currentLinePartsLower[0].startsWith("graphs\\auto_styles\\line_style")) {
submenu->setEnabled(true);
currentValue->setVisible(true);
currentValue->setText(currentValue->text()+currentLinePartsLower[1]);
currentValue->setIcon(jkqtp_makeQPenStyleIcon(jkqtp_String2QPenStyle(currentLinePartsLower[1])));
QAction* act;
act=new QAction(jkqtp_makeQPenStyleIcon(Qt::SolidLine), jkqtp_QPenStyle2String(Qt::SolidLine));
connect(act, &QAction::triggered, std::bind(std::mem_fn(&JKQTPStylePlainTextEdit::changeCurrentLineValueTo), this, act->text()));
submenu->addAction(act);
act=new QAction(jkqtp_makeQPenStyleIcon(Qt::DashLine), jkqtp_QPenStyle2String(Qt::DashLine));
connect(act, &QAction::triggered, std::bind(std::mem_fn(&JKQTPStylePlainTextEdit::changeCurrentLineValueTo), this, act->text()));
submenu->addAction(act);
act=new QAction(jkqtp_makeQPenStyleIcon(Qt::DotLine), jkqtp_QPenStyle2String(Qt::DotLine));
connect(act, &QAction::triggered, std::bind(std::mem_fn(&JKQTPStylePlainTextEdit::changeCurrentLineValueTo), this, act->text()));
submenu->addAction(act);
act=new QAction(jkqtp_makeQPenStyleIcon(Qt::DashDotLine), jkqtp_QPenStyle2String(Qt::DashDotLine));
connect(act, &QAction::triggered, std::bind(std::mem_fn(&JKQTPStylePlainTextEdit::changeCurrentLineValueTo), this, act->text()));
submenu->addAction(act);
act=new QAction(jkqtp_makeQPenStyleIcon(Qt::DashDotDotLine), jkqtp_QPenStyle2String(Qt::DashDotDotLine));
connect(act, &QAction::triggered, std::bind(std::mem_fn(&JKQTPStylePlainTextEdit::changeCurrentLineValueTo), this, act->text()));
submenu->addAction(act);
act=new QAction(jkqtp_makeQPenStyleIcon(Qt::NoPen), jkqtp_QPenStyle2String(Qt::NoPen));
connect(act, &QAction::triggered, std::bind(std::mem_fn(&JKQTPStylePlainTextEdit::changeCurrentLineValueTo), this, act->text()));
submenu->addAction(act);
} else if (currentLinePartsLower[0].endsWith("brushstyle") ||currentLinePartsLower[0].endsWith("fill_style") || currentLinePartsLower[0].startsWith("graphs\\auto_styles\\fill_style")) {
submenu->setEnabled(true);
currentValue->setVisible(true);
currentValue->setText(currentValue->text()+currentLinePartsLower[1]);
currentValue->setIcon(jkqtp_makeQBrushStyleIcon(jkqtp_String2QBrushStyle(currentLinePartsLower[1])));
QAction* act;
act=new QAction(jkqtp_makeQBrushStyleIcon(Qt::SolidPattern), jkqtp_QBrushStyle2String(Qt::SolidPattern));
connect(act, &QAction::triggered, std::bind(std::mem_fn(&JKQTPStylePlainTextEdit::changeCurrentLineValueTo), this, act->text()));
submenu->addAction(act);
act=new QAction(jkqtp_makeQBrushStyleIcon(Qt::Dense1Pattern), jkqtp_QBrushStyle2String(Qt::Dense1Pattern));
connect(act, &QAction::triggered, std::bind(std::mem_fn(&JKQTPStylePlainTextEdit::changeCurrentLineValueTo), this, act->text()));
submenu->addAction(act);
act=new QAction(jkqtp_makeQBrushStyleIcon(Qt::Dense2Pattern), jkqtp_QBrushStyle2String(Qt::Dense2Pattern));
connect(act, &QAction::triggered, std::bind(std::mem_fn(&JKQTPStylePlainTextEdit::changeCurrentLineValueTo), this, act->text()));
submenu->addAction(act);
act=new QAction(jkqtp_makeQBrushStyleIcon(Qt::Dense3Pattern), jkqtp_QBrushStyle2String(Qt::Dense3Pattern));
connect(act, &QAction::triggered, std::bind(std::mem_fn(&JKQTPStylePlainTextEdit::changeCurrentLineValueTo), this, act->text()));
submenu->addAction(act);
act=new QAction(jkqtp_makeQBrushStyleIcon(Qt::Dense4Pattern), jkqtp_QBrushStyle2String(Qt::Dense4Pattern));
connect(act, &QAction::triggered, std::bind(std::mem_fn(&JKQTPStylePlainTextEdit::changeCurrentLineValueTo), this, act->text()));
submenu->addAction(act);
act=new QAction(jkqtp_makeQBrushStyleIcon(Qt::Dense5Pattern), jkqtp_QBrushStyle2String(Qt::Dense5Pattern));
connect(act, &QAction::triggered, std::bind(std::mem_fn(&JKQTPStylePlainTextEdit::changeCurrentLineValueTo), this, act->text()));
submenu->addAction(act);
act=new QAction(jkqtp_makeQBrushStyleIcon(Qt::Dense6Pattern), jkqtp_QBrushStyle2String(Qt::Dense6Pattern));
connect(act, &QAction::triggered, std::bind(std::mem_fn(&JKQTPStylePlainTextEdit::changeCurrentLineValueTo), this, act->text()));
submenu->addAction(act);
act=new QAction(jkqtp_makeQBrushStyleIcon(Qt::Dense7Pattern), jkqtp_QBrushStyle2String(Qt::Dense7Pattern));
connect(act, &QAction::triggered, std::bind(std::mem_fn(&JKQTPStylePlainTextEdit::changeCurrentLineValueTo), this, act->text()));
submenu->addAction(act);
act=new QAction(jkqtp_makeQBrushStyleIcon(Qt::HorPattern), jkqtp_QBrushStyle2String(Qt::HorPattern));
connect(act, &QAction::triggered, std::bind(std::mem_fn(&JKQTPStylePlainTextEdit::changeCurrentLineValueTo), this, act->text()));
submenu->addAction(act);
act=new QAction(jkqtp_makeQBrushStyleIcon(Qt::VerPattern), jkqtp_QBrushStyle2String(Qt::VerPattern));
connect(act, &QAction::triggered, std::bind(std::mem_fn(&JKQTPStylePlainTextEdit::changeCurrentLineValueTo), this, act->text()));
submenu->addAction(act);
act=new QAction(jkqtp_makeQBrushStyleIcon(Qt::CrossPattern), jkqtp_QBrushStyle2String(Qt::CrossPattern));
connect(act, &QAction::triggered, std::bind(std::mem_fn(&JKQTPStylePlainTextEdit::changeCurrentLineValueTo), this, act->text()));
submenu->addAction(act);
act=new QAction(jkqtp_makeQBrushStyleIcon(Qt::BDiagPattern), jkqtp_QBrushStyle2String(Qt::BDiagPattern));
connect(act, &QAction::triggered, std::bind(std::mem_fn(&JKQTPStylePlainTextEdit::changeCurrentLineValueTo), this, act->text()));
submenu->addAction(act);
act=new QAction(jkqtp_makeQBrushStyleIcon(Qt::FDiagPattern), jkqtp_QBrushStyle2String(Qt::FDiagPattern));
connect(act, &QAction::triggered, std::bind(std::mem_fn(&JKQTPStylePlainTextEdit::changeCurrentLineValueTo), this, act->text()));
submenu->addAction(act);
act=new QAction(jkqtp_makeQBrushStyleIcon(Qt::DiagCrossPattern), jkqtp_QBrushStyle2String(Qt::DiagCrossPattern));
connect(act, &QAction::triggered, std::bind(std::mem_fn(&JKQTPStylePlainTextEdit::changeCurrentLineValueTo), this, act->text()));
submenu->addAction(act);
act=new QAction(jkqtp_makeQBrushStyleIcon(Qt::NoBrush), jkqtp_QBrushStyle2String(Qt::NoBrush));
connect(act, &QAction::triggered, std::bind(std::mem_fn(&JKQTPStylePlainTextEdit::changeCurrentLineValueTo), this, act->text()));
submenu->addAction(act);
} else if (currentLinePartsLower[0].endsWith("decorator_type")) {
submenu->setEnabled(true);
currentValue->setVisible(true);
currentValue->setText(currentValue->text()+currentLinePartsLower[1]);
currentValue->setIcon(JKQTPLineDecoratorStyle2Icon(String2JKQTPLineDecoratorStyle(currentLinePartsLower[1])));
QAction* act;
JKQTPLineDecoratorStyle st;
for (int i=0; i<static_cast<int>(JKQTPLineDecoratorCount); i++) {
st=static_cast<JKQTPLineDecoratorStyle>(i);
act=new QAction(JKQTPLineDecoratorStyle2Icon(st), JKQTPLineDecoratorStyle2String(st));
connect(act, &QAction::triggered, std::bind(std::mem_fn(&JKQTPStylePlainTextEdit::changeCurrentLineValueTo), this, act->text()));
submenu->addAction(act);
}
} else if (currentLinePartsLower[0].startsWith("graphs\\auto_styles\\symbol") || currentLinePartsLower[0].endsWith("\\symbol")) {
submenu->setEnabled(true);
currentValue->setVisible(true);
currentValue->setText(currentValue->text()+currentLinePartsLower[1]);
currentValue->setIcon(JKQTPGraphSymbols2Icon(String2JKQTPGraphSymbols(currentLinePartsLower[1])));
QAction* act;
JKQTPGraphSymbols st;
for (int i=0; i<static_cast<int>(JKQTPSymbolCount); i++) {
st=static_cast<JKQTPGraphSymbols>(i);
act=new QAction(JKQTPGraphSymbols2Icon(st), JKQTPGraphSymbols2String(st));
connect(act, &QAction::triggered, std::bind(std::mem_fn(&JKQTPStylePlainTextEdit::changeCurrentLineValueTo), this, act->text()));
submenu->addAction(act);
}
} else if (currentLinePartsLower[0].endsWith("palette")) {
submenu->setEnabled(true);
QAction* act;
QStringList pal=JKQTPImageTools::getPredefinedPalettesMachineReadable();
for (int i=0; i<pal.size(); i++) {
act=new QAction(JKQTPImageTools::GetPaletteIcon(i), pal[i]);
connect(act, &QAction::triggered, std::bind(std::mem_fn(&JKQTPStylePlainTextEdit::changeCurrentLineValueTo), this, act->text()));
submenu->addAction(act);
if (pal[i].toLower()==currentLinePartsLower[1].toLower()) {
currentValue->setVisible(true);
currentValue->setText(currentValue->text()+currentLinePartsLower[1]);
currentValue->setIcon(JKQTPImageTools::GetPaletteIcon(i));
}
}
} else if (currentLinePartsLower[0].endsWith("color") || currentLinePartsLower[0].endsWith("widget_background_color_for_export") || currentLinePartsLower[0].startsWith("graphs\\auto_styles\\color")) {
submenu->setEnabled(true);
QMenu* menuPredef=submenu->addMenu(tr("predefined colors ..."));
QMenu* menuPal=submenu->addMenu(tr("GUI colors ..."));
QMenu* menuTrans=submenu->addMenu(tr("add transparency modifier ..."));
currentValue->setVisible(true);
currentValue->setText(currentValue->text()+currentLinePartsLower[1]);
currentValue->setIcon(jkqtp_makeQColorIcon(jkqtp_String2QColor(currentLinePartsLower[1])));
QAction* act;
QColor st;
const QStringList& names=jkqtp_listNamedColors();
for (auto colName: names) {
st=jkqtp_String2QColor(colName);
act=new QAction(jkqtp_makeQColorIcon(st), jkqtp_QColor2String(st));
connect(act, &QAction::triggered, std::bind(std::mem_fn(&JKQTPStylePlainTextEdit::changeCurrentLineValueTo), this, act->text()));
menuPredef->addAction(act);
}
QString colName;
colName="windowtext";
act=new QAction(jkqtp_makeQColorIcon(jkqtp_String2QColor(colName)), colName);
connect(act, &QAction::triggered, std::bind(std::mem_fn(&JKQTPStylePlainTextEdit::changeCurrentLineValueTo), this, act->text()));
menuPal->addAction(act);
colName="button";
act=new QAction(jkqtp_makeQColorIcon(jkqtp_String2QColor(colName)), colName);
connect(act, &QAction::triggered, std::bind(std::mem_fn(&JKQTPStylePlainTextEdit::changeCurrentLineValueTo), this, act->text()));
menuPal->addAction(act);
colName="light";
act=new QAction(jkqtp_makeQColorIcon(jkqtp_String2QColor(colName)), colName);
connect(act, &QAction::triggered, std::bind(std::mem_fn(&JKQTPStylePlainTextEdit::changeCurrentLineValueTo), this, act->text()));
menuPal->addAction(act);
colName="midlight";
act=new QAction(jkqtp_makeQColorIcon(jkqtp_String2QColor(colName)), colName);
connect(act, &QAction::triggered, std::bind(std::mem_fn(&JKQTPStylePlainTextEdit::changeCurrentLineValueTo), this, act->text()));
menuPal->addAction(act);
colName="dark";
act=new QAction(jkqtp_makeQColorIcon(jkqtp_String2QColor(colName)), colName);
connect(act, &QAction::triggered, std::bind(std::mem_fn(&JKQTPStylePlainTextEdit::changeCurrentLineValueTo), this, act->text()));
menuPal->addAction(act);
colName="mid";
act=new QAction(jkqtp_makeQColorIcon(jkqtp_String2QColor(colName)), colName);
connect(act, &QAction::triggered, std::bind(std::mem_fn(&JKQTPStylePlainTextEdit::changeCurrentLineValueTo), this, act->text()));
menuPal->addAction(act);
colName="text";
act=new QAction(jkqtp_makeQColorIcon(jkqtp_String2QColor(colName)), colName);
connect(act, &QAction::triggered, std::bind(std::mem_fn(&JKQTPStylePlainTextEdit::changeCurrentLineValueTo), this, act->text()));
menuPal->addAction(act);
colName="brightttext";
act=new QAction(jkqtp_makeQColorIcon(jkqtp_String2QColor(colName)), colName);
connect(act, &QAction::triggered, std::bind(std::mem_fn(&JKQTPStylePlainTextEdit::changeCurrentLineValueTo), this, act->text()));
menuPal->addAction(act);
colName="base";
act=new QAction(jkqtp_makeQColorIcon(jkqtp_String2QColor(colName)), colName);
connect(act, &QAction::triggered, std::bind(std::mem_fn(&JKQTPStylePlainTextEdit::changeCurrentLineValueTo), this, act->text()));
menuPal->addAction(act);
colName="window";
act=new QAction(jkqtp_makeQColorIcon(jkqtp_String2QColor(colName)), colName);
connect(act, &QAction::triggered, std::bind(std::mem_fn(&JKQTPStylePlainTextEdit::changeCurrentLineValueTo), this, act->text()));
menuPal->addAction(act);
colName="shadow";
act=new QAction(jkqtp_makeQColorIcon(jkqtp_String2QColor(colName)), colName);
connect(act, &QAction::triggered, std::bind(std::mem_fn(&JKQTPStylePlainTextEdit::changeCurrentLineValueTo), this, act->text()));
menuPal->addAction(act);
colName="highlight";
act=new QAction(jkqtp_makeQColorIcon(jkqtp_String2QColor(colName)), colName);
connect(act, &QAction::triggered, std::bind(std::mem_fn(&JKQTPStylePlainTextEdit::changeCurrentLineValueTo), this, act->text()));
menuPal->addAction(act);
colName="highlightedtext";
act=new QAction(jkqtp_makeQColorIcon(jkqtp_String2QColor(colName)), colName);
connect(act, &QAction::triggered, std::bind(std::mem_fn(&JKQTPStylePlainTextEdit::changeCurrentLineValueTo), this, act->text()));
menuPal->addAction(act);
colName="link";
act=new QAction(jkqtp_makeQColorIcon(jkqtp_String2QColor(colName)), colName);
connect(act, &QAction::triggered, std::bind(std::mem_fn(&JKQTPStylePlainTextEdit::changeCurrentLineValueTo), this, act->text()));
menuPal->addAction(act);
colName="linkvisited";
act=new QAction(jkqtp_makeQColorIcon(jkqtp_String2QColor(colName)), colName);
connect(act, &QAction::triggered, std::bind(std::mem_fn(&JKQTPStylePlainTextEdit::changeCurrentLineValueTo), this, act->text()));
menuPal->addAction(act);
colName="alternatebase";
act=new QAction(jkqtp_makeQColorIcon(jkqtp_String2QColor(colName)), colName);
connect(act, &QAction::triggered, std::bind(std::mem_fn(&JKQTPStylePlainTextEdit::changeCurrentLineValueTo), this, act->text()));
menuPal->addAction(act);
colName="norole";
act=new QAction(jkqtp_makeQColorIcon(jkqtp_String2QColor(colName)), colName);
connect(act, &QAction::triggered, std::bind(std::mem_fn(&JKQTPStylePlainTextEdit::changeCurrentLineValueTo), this, act->text()));
menuPal->addAction(act);
colName="tooltipbase";
act=new QAction(jkqtp_makeQColorIcon(jkqtp_String2QColor(colName)), colName);
connect(act, &QAction::triggered, std::bind(std::mem_fn(&JKQTPStylePlainTextEdit::changeCurrentLineValueTo), this, act->text()));
menuPal->addAction(act);
colName="tooltiptext";
act=new QAction(jkqtp_makeQColorIcon(jkqtp_String2QColor(colName)), colName);
connect(act, &QAction::triggered, std::bind(std::mem_fn(&JKQTPStylePlainTextEdit::changeCurrentLineValueTo), this, act->text()));
menuPal->addAction(act);
colName="placeholdertext";
act=new QAction(jkqtp_makeQColorIcon(jkqtp_String2QColor(colName)), colName);
connect(act, &QAction::triggered, std::bind(std::mem_fn(&JKQTPStylePlainTextEdit::changeCurrentLineValueTo), this, act->text()));
menuPal->addAction(act);
int trans;
trans=100; colName=QString::number(trans)+"%";
act=new QAction(jkqtp_makeQColorIcon(QColor(0,0,255,(100-trans)*255/100)), colName);
connect(act, &QAction::triggered, std::bind(std::mem_fn(&JKQTPStylePlainTextEdit::addTransparencyToCurrentLineValue), this, act->text()));
menuTrans->addAction(act);
trans=90; colName=QString::number(trans)+"%";
act=new QAction(jkqtp_makeQColorIcon(QColor(0,0,255,(100-trans)*255/100)), colName);
connect(act, &QAction::triggered, std::bind(std::mem_fn(&JKQTPStylePlainTextEdit::addTransparencyToCurrentLineValue), this, act->text()));
menuTrans->addAction(act);
trans=75; colName=QString::number(trans)+"%";
act=new QAction(jkqtp_makeQColorIcon(QColor(0,0,255,(100-trans)*255/100)), colName);
connect(act, &QAction::triggered, std::bind(std::mem_fn(&JKQTPStylePlainTextEdit::addTransparencyToCurrentLineValue), this, act->text()));
menuTrans->addAction(act);
trans=50; colName=QString::number(trans)+"%";
act=new QAction(jkqtp_makeQColorIcon(QColor(0,0,255,(100-trans)*255/100)), colName);
connect(act, &QAction::triggered, std::bind(std::mem_fn(&JKQTPStylePlainTextEdit::addTransparencyToCurrentLineValue), this, act->text()));
menuTrans->addAction(act);
trans=25; colName=QString::number(trans)+"%";
act=new QAction(jkqtp_makeQColorIcon(QColor(0,0,255,(100-trans)*255/100)), colName);
connect(act, &QAction::triggered, std::bind(std::mem_fn(&JKQTPStylePlainTextEdit::addTransparencyToCurrentLineValue), this, act->text()));
menuTrans->addAction(act);
trans=10; colName=QString::number(trans)+"%";
act=new QAction(jkqtp_makeQColorIcon(QColor(0,0,255,(100-trans)*255/100)), colName);
connect(act, &QAction::triggered, std::bind(std::mem_fn(&JKQTPStylePlainTextEdit::addTransparencyToCurrentLineValue), this, act->text()));
menuTrans->addAction(act);
trans=0; colName=QString::number(trans)+"%";
act=new QAction(jkqtp_makeQColorIcon(QColor(0,0,255,(100-trans)*255/100)), colName);
connect(act, &QAction::triggered, std::bind(std::mem_fn(&JKQTPStylePlainTextEdit::addTransparencyToCurrentLineValue), this, act->text()));
menuTrans->addAction(act);
} else if (currentLinePartsLower[0].endsWith("font_name")) {
const QStringList splitValue=currentLinePartsLower[1].split('+');
submenu->setEnabled(true);
QMenu* menuDefaultFonts=submenu->addMenu(tr("default fonts ..."));
QMenu* menuSystemFonts=submenu->addMenu(tr("system fonts ..."));
QMenu* menuAllFOnts=submenu->addMenu(tr("all fonts ..."));
QMenu* menuMathFont=submenu->addMenu(tr("add math-fonts specifier ..."));
currentValue->setVisible(true);
currentValue->setText(tr("text font: ")+currentLineParts[0]);
currentValue->setFont(QFont(JKQTMathTextFontSpecifier::transformFontNameAndDecodeSpecialFonts(JKQTMathTextFontSpecifier::fromFontSpec(currentLineParts[1]).fontName())));
if (!JKQTMathTextFontSpecifier::fromFontSpec(currentLineParts[1]).mathFontName().isEmpty()) {
currentValue2->setVisible(true);
currentValue2->setText(tr("math font: ")+currentLineParts[1]);
currentValue2->setFont(QFont(JKQTMathTextFontSpecifier::transformFontNameAndDecodeSpecialFonts(JKQTMathTextFontSpecifier::fromFontSpec(currentLineParts[1]).mathFontName())));
}
QAction* act;
QFontDatabase fontDB;
const QStringList names=fontDB.families();
for (auto& fntName: names) {
act=new QAction(fntName);
act->setFont(QFont(fntName));
connect(act, &QAction::triggered, std::bind(std::mem_fn(&JKQTPStylePlainTextEdit::changeCurrentLineValueTo), this, act->text()));
menuAllFOnts->addAction(act);
}
QString fontName;
fontName="application";
act=new QAction(fontName);
act->setFont(QFont(JKQTMathTextFontSpecifier::transformFontName(fontName)));
connect(act, &QAction::triggered, std::bind(std::mem_fn(&JKQTPStylePlainTextEdit::changeCurrentLineValueTo), this, act->text()));
menuDefaultFonts->addAction(act);
act=new QAction(fontName+"+XITS");
act->setFont(QFont(JKQTMathTextFontSpecifier::transformFontName(fontName)));
connect(act, &QAction::triggered, std::bind(std::mem_fn(&JKQTPStylePlainTextEdit::changeCurrentLineValueTo), this, act->text()));
menuDefaultFonts->addAction(act);
fontName="XITS";
act=new QAction(fontName);
act->setFont(QFont(JKQTMathTextFontSpecifier::getXITSFamilies().fontName()));
connect(act, &QAction::triggered, std::bind(std::mem_fn(&JKQTPStylePlainTextEdit::changeCurrentLineValueTo), this, act->text()));
menuDefaultFonts->addAction(act);
menuDefaultFonts->addSeparator();
fontName=QGuiApplication::font().family();
act=new QAction(fontName);
act->setFont(QFont(fontName));
connect(act, &QAction::triggered, std::bind(std::mem_fn(&JKQTPStylePlainTextEdit::changeCurrentLineValueTo), this, act->text()));
menuDefaultFonts->addAction(act);
act=new QAction(fontName+"+XITS");
act->setFont(QFont(fontName));
connect(act, &QAction::triggered, std::bind(std::mem_fn(&JKQTPStylePlainTextEdit::changeCurrentLineValueTo), this, act->text()));
menuDefaultFonts->addAction(act);
fontName="application";
act=new QAction(fontName);
act->setFont(QFont(JKQTMathTextFontSpecifier::transformFontName(fontName)));
connect(act, &QAction::triggered, std::bind(std::mem_fn(&JKQTPStylePlainTextEdit::changeCurrentLineValueTo), this, act->text()));
menuSystemFonts->addAction(act);
act=new QAction(fontName+"+XITS");
act->setFont(QFont(JKQTMathTextFontSpecifier::transformFontName(fontName)));
connect(act, &QAction::triggered, std::bind(std::mem_fn(&JKQTPStylePlainTextEdit::changeCurrentLineValueTo), this, act->text()));
menuSystemFonts->addAction(act);
#if QT_VERSION >= QT_VERSION_CHECK(5,2,0)
fontName="general";
act=new QAction(fontName);
act->setFont(QFont(JKQTMathTextFontSpecifier::transformFontName(fontName)));
connect(act, &QAction::triggered, std::bind(std::mem_fn(&JKQTPStylePlainTextEdit::changeCurrentLineValueTo), this, act->text()));
menuSystemFonts->addAction(act);
fontName="fixed";
act=new QAction(fontName);
act->setFont(QFont(JKQTMathTextFontSpecifier::transformFontName(fontName)));
connect(act, &QAction::triggered, std::bind(std::mem_fn(&JKQTPStylePlainTextEdit::changeCurrentLineValueTo), this, act->text()));
menuSystemFonts->addAction(act);
fontName="title";
act=new QAction(fontName);
act->setFont(QFont(JKQTMathTextFontSpecifier::transformFontName(fontName)));
connect(act, &QAction::triggered, std::bind(std::mem_fn(&JKQTPStylePlainTextEdit::changeCurrentLineValueTo), this, act->text()));
menuSystemFonts->addAction(act);
fontName="smallest_readable";
act=new QAction(fontName);
act->setFont(QFont(JKQTMathTextFontSpecifier::transformFontName(fontName)));
connect(act, &QAction::triggered, std::bind(std::mem_fn(&JKQTPStylePlainTextEdit::changeCurrentLineValueTo), this, act->text()));
menuSystemFonts->addAction(act);
#endif
fontName="serif";
act=new QAction(fontName);
act->setFont(QFont(JKQTMathTextFontSpecifier::transformFontName(fontName)));
connect(act, &QAction::triggered, std::bind(std::mem_fn(&JKQTPStylePlainTextEdit::changeCurrentLineValueTo), this, act->text()));
menuSystemFonts->addAction(act);
act=new QAction(fontName+"+XITS");
act->setFont(QFont(JKQTMathTextFontSpecifier::transformFontName(fontName)));
connect(act, &QAction::triggered, std::bind(std::mem_fn(&JKQTPStylePlainTextEdit::changeCurrentLineValueTo), this, act->text()));
menuSystemFonts->addAction(act);
fontName="sans-serif";
act=new QAction(fontName);
act->setFont(QFont(JKQTMathTextFontSpecifier::transformFontName(fontName)));
connect(act, &QAction::triggered, std::bind(std::mem_fn(&JKQTPStylePlainTextEdit::changeCurrentLineValueTo), this, act->text()));
menuSystemFonts->addAction(act);
act=new QAction(fontName+"+XITS");
act->setFont(QFont(JKQTMathTextFontSpecifier::transformFontName(fontName)));
connect(act, &QAction::triggered, std::bind(std::mem_fn(&JKQTPStylePlainTextEdit::changeCurrentLineValueTo), this, act->text()));
menuSystemFonts->addAction(act);
fontName="cursive";
act=new QAction(fontName);
act->setFont(QFont(JKQTMathTextFontSpecifier::transformFontName(fontName)));
connect(act, &QAction::triggered, std::bind(std::mem_fn(&JKQTPStylePlainTextEdit::changeCurrentLineValueTo), this, act->text()));
menuSystemFonts->addAction(act);
fontName="typewriter";
act=new QAction(fontName);
act->setFont(QFont(JKQTMathTextFontSpecifier::transformFontName(fontName)));
connect(act, &QAction::triggered, std::bind(std::mem_fn(&JKQTPStylePlainTextEdit::changeCurrentLineValueTo), this, act->text()));
menuSystemFonts->addAction(act);
fontName="monospace";
act=new QAction(fontName);
act->setFont(QFont(JKQTMathTextFontSpecifier::transformFontName(fontName)));
connect(act, &QAction::triggered, std::bind(std::mem_fn(&JKQTPStylePlainTextEdit::changeCurrentLineValueTo), this, act->text()));
menuSystemFonts->addAction(act);
fontName="fantasy";
act=new QAction(fontName);
act->setFont(QFont(JKQTMathTextFontSpecifier::transformFontName(fontName)));
connect(act, &QAction::triggered, std::bind(std::mem_fn(&JKQTPStylePlainTextEdit::changeCurrentLineValueTo), this, act->text()));
menuSystemFonts->addAction(act);
fontName="system";
act=new QAction(fontName);
act->setFont(QFont(JKQTMathTextFontSpecifier::transformFontName(fontName)));
connect(act, &QAction::triggered, std::bind(std::mem_fn(&JKQTPStylePlainTextEdit::changeCurrentLineValueTo), this, act->text()));
menuSystemFonts->addAction(act);
fontName="XITS";
act=new QAction(fontName);
connect(act, &QAction::triggered, std::bind(std::mem_fn(&JKQTPStylePlainTextEdit::addMathFontSpecifier), this, act->text()));
menuMathFont->addAction(act);
fontName="STIX";
act=new QAction(fontName);
connect(act, &QAction::triggered, std::bind(std::mem_fn(&JKQTPStylePlainTextEdit::addMathFontSpecifier), this, act->text()));
menuMathFont->addAction(act);
fontName="ASANA";
act=new QAction(fontName);
connect(act, &QAction::triggered, std::bind(std::mem_fn(&JKQTPStylePlainTextEdit::addMathFontSpecifier), this, act->text()));
menuMathFont->addAction(act);
} else if (currentLinePartsLower[0].endsWith("\\draw_mode1") || currentLinePartsLower[0].endsWith("\\draw_mode2")) {
submenu->setEnabled(true);
QAction* act;
JKQTPCADrawMode st;
for (int i=0; i<=static_cast<int>(JKQTPCADMmax); i++) {
st=static_cast<JKQTPCADrawMode>(i);
act=new QAction(JKQTPCADrawMode2String(st));
connect(act, &QAction::triggered, std::bind(std::mem_fn(&JKQTPStylePlainTextEdit::changeCurrentLineValueTo), this, act->text()));
submenu->addAction(act);
}
} else if (currentLinePartsLower[0].endsWith("axis_label\\position")) {
submenu->setEnabled(true);
QAction* act;
JKQTPLabelPosition st;
for (int i=0; i<=static_cast<int>(JKQTPLabelPositionMax); i++) {
st=static_cast<JKQTPLabelPosition>(i);
act=new QAction(JKQTPLabelPosition2String(st));
connect(act, &QAction::triggered, std::bind(std::mem_fn(&JKQTPStylePlainTextEdit::changeCurrentLineValueTo), this, act->text()));
submenu->addAction(act);
}
} else if (currentLinePartsLower[0].endsWith("ticks\\mode")) {
submenu->setEnabled(true);
QAction* act;
JKQTPLabelTickMode st;
for (int i=0; i<=static_cast<int>(JKQTPLTMmax); i++) {
st=static_cast<JKQTPLabelTickMode>(i);
act=new QAction(JKQTPLabelTickMode2String(st));
connect(act, &QAction::triggered, std::bind(std::mem_fn(&JKQTPStylePlainTextEdit::changeCurrentLineValueTo), this, act->text()));
submenu->addAction(act);
}
} else if (currentLinePartsLower[0].endsWith("axis_label\\type")) {
submenu->setEnabled(true);
QAction* act;
JKQTPCALabelType st;
for (int i=0; i<=static_cast<int>(JKQTPCALTmax); i++) {
st=static_cast<JKQTPCALabelType>(i);
act=new QAction(JKQTPCALabelType2String(st));
connect(act, &QAction::triggered, std::bind(std::mem_fn(&JKQTPStylePlainTextEdit::changeCurrentLineValueTo), this, act->text()));
submenu->addAction(act);
}
} else if (currentLinePartsLower[0].endsWith("key\\position")) {
submenu->setEnabled(true);
QAction* act;
JKQTPKeyPosition st;
for (int i=0; i<=static_cast<int>(JKQTPKeyPositionMax); i++) {
st=static_cast<JKQTPKeyPosition>(i);
act=new QAction(JKQTPKeyPosition2String(st));
connect(act, &QAction::triggered, std::bind(std::mem_fn(&JKQTPStylePlainTextEdit::changeCurrentLineValueTo), this, act->text()));
submenu->addAction(act);
}
} else if (currentLinePartsLower[0].endsWith("key\\layout")) {
submenu->setEnabled(true);
QAction* act;
JKQTPKeyLayout st;
for (int i=0; i<=static_cast<int>(JKQTPKeyLayoutMax); i++) {
st=static_cast<JKQTPKeyLayout>(i);
act=new QAction(JKQTPKeyLayout2String(st));
connect(act, &QAction::triggered, std::bind(std::mem_fn(&JKQTPStylePlainTextEdit::changeCurrentLineValueTo), this, act->text()));
submenu->addAction(act);
}
} else if (currentLinePartsLower[0].endsWith("color_mode")) {
submenu->setEnabled(true);
QAction* act;
JKQTPColorDerivationMode::PredefinedModes st;
for (int i=0; i<=static_cast<int>(JKQTPColorDerivationMode::JKQTPFFCMmax); i++) {
st=static_cast<JKQTPColorDerivationMode::PredefinedModes>(i);
act=new QAction(JKQTPColorDerivationMode(st).toString());
connect(act, &QAction::triggered, std::bind(std::mem_fn(&JKQTPStylePlainTextEdit::changeCurrentLineValueTo), this, act->text()));
submenu->addAction(act);
}
}
}
menu->exec(event->globalPos());
delete menu;
}
void JKQTPStylePlainTextEdit::changeCurrentLineValueTo(const QString& targetText)
{
const QString currentLine=curContextMenu.selectedText();
const int idx=currentLine.indexOf('=');
if (idx>=0) {
const QString newLine=currentLine.left(idx+1)+targetText;
curContextMenu.insertText(newLine);
}
}
void JKQTPStylePlainTextEdit::addTransparencyToCurrentLineValue(const QString& newTrans)
{
const QString currentLine=curContextMenu.selectedText();
//qDebug()<<"current line: '"<<currentLine<<"'";
const int idx=currentLine.indexOf('=');
if (idx>=0) {
QString colName=currentLine.mid(idx+1);
if (colName.startsWith("\"")) colName=colName.right(colName.size()-1);
if (colName.endsWith("\"")) colName=colName.left(colName.size()-1);
QColor col=jkqtp_String2QColor(colName);
col.setAlpha(255);
const QString targetText=jkqtp_QColor2String(col)+","+newTrans;
const QString newLine=currentLine.left(idx+1)+targetText;
curContextMenu.insertText(newLine);
}
}
void JKQTPStylePlainTextEdit::addMathFontSpecifier(const QString& newMath)
{
const QString currentLine=curContextMenu.selectedText();
//qDebug()<<"current line: '"<<currentLine<<"'";
const int idx=currentLine.indexOf('=');
const int idxp=currentLine.indexOf('+');
if (idx>=0) {
QString fontName=currentLine.mid(idx+1);
if (idxp>=0) fontName=currentLine.mid(idx+1, idxp-idx-1);
const QString targetText=fontName+"+"+newMath;
const QString newLine=currentLine.left(idx+1)+targetText;
curContextMenu.insertText(newLine);
}
}

View File

@ -0,0 +1,22 @@
#ifndef JKQTPSTYLEPLAINTEXTEDIT_H
#define JKQTPSTYLEPLAINTEXTEDIT_H
#include <QPlainTextEdit>
class JKQTPStylePlainTextEdit : public QPlainTextEdit
{
Q_OBJECT
public:
JKQTPStylePlainTextEdit(QWidget *parent = nullptr);
virtual ~JKQTPStylePlainTextEdit();
protected:
void contextMenuEvent(QContextMenuEvent *event) override;
protected slots:
void changeCurrentLineValueTo(const QString &targetText);
void addTransparencyToCurrentLineValue(const QString &targetText);
void addMathFontSpecifier(const QString &newMath);
private:
QTextCursor curContextMenu;
};
#endif // JKQTPSTYLEPLAINTEXTEDIT_H

View File

@ -9,10 +9,12 @@ TARGET = test_styling
# source code for this simple demo
SOURCES = test_styling_main.cpp \
test_styling.cpp
test_styling.cpp \
jkqtpstyleplaintextedit.cpp
HEADERS += \
test_styling.h
test_styling.h \
jkqtpstyleplaintextedit.h
FORMS += \
test_styling.ui

View File

@ -29,7 +29,6 @@
<widget class="QLabel" name="label_4">
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
@ -66,7 +65,6 @@
<widget class="QLabel" name="label">
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
@ -106,7 +104,6 @@
<widget class="QLabel" name="label_2">
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
@ -160,7 +157,6 @@
<widget class="QPushButton" name="btnUpdate">
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
@ -177,10 +173,9 @@
</widget>
</item>
<item row="1" column="0" colspan="4">
<widget class="QPlainTextEdit" name="plainTextEdit">
<widget class="JKQTPStylePlainTextEdit" name="plainTextEdit">
<property name="font">
<font>
<family>Courier New</family>
<pointsize>10</pointsize>
</font>
</property>
@ -196,7 +191,6 @@
<widget class="QLabel" name="label_3">
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
@ -219,7 +213,7 @@
<x>0</x>
<y>0</y>
<width>1068</width>
<height>21</height>
<height>17</height>
</rect>
</property>
</widget>
@ -232,6 +226,11 @@
<header>jkqtplotter/jkqtplotter.h</header>
<container>1</container>
</customwidget>
<customwidget>
<class>JKQTPStylePlainTextEdit</class>
<extends>QPlainTextEdit</extends>
<header>jkqtpstyleplaintextedit.h</header>
</customwidget>
</customwidgets>
<resources/>
<connections/>