GH-1197 finish color stuff
This commit is contained in:
parent
6858f1dd62
commit
d0e88011dc
@ -129,8 +129,8 @@ SET(MULTIMC_SOURCES
|
|||||||
InstanceProxyModel.cpp
|
InstanceProxyModel.cpp
|
||||||
VersionProxyModel.h
|
VersionProxyModel.h
|
||||||
VersionProxyModel.cpp
|
VersionProxyModel.cpp
|
||||||
Colors.h
|
ColorCache.h
|
||||||
Colors.cpp
|
ColorCache.cpp
|
||||||
|
|
||||||
# GUI - windows
|
# GUI - windows
|
||||||
MainWindow.h
|
MainWindow.h
|
||||||
|
35
application/ColorCache.cpp
Normal file
35
application/ColorCache.cpp
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
#include "ColorCache.h"
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Blend the color with the front color, adapting to the back color
|
||||||
|
*/
|
||||||
|
QColor ColorCache::blend(QColor color)
|
||||||
|
{
|
||||||
|
if (Rainbow::luma(m_front) > Rainbow::luma(m_back))
|
||||||
|
{
|
||||||
|
// for dark color schemes, produce a fitting color first
|
||||||
|
color = Rainbow::tint(m_front, color, 0.5);
|
||||||
|
}
|
||||||
|
// adapt contrast
|
||||||
|
return Rainbow::mix(m_front, color, m_bias);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Blend the color with the back color
|
||||||
|
*/
|
||||||
|
QColor ColorCache::blendBackground(QColor color)
|
||||||
|
{
|
||||||
|
// adapt contrast
|
||||||
|
return Rainbow::mix(m_back, color, m_bias);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ColorCache::recolorAll()
|
||||||
|
{
|
||||||
|
auto iter = m_colors.begin();
|
||||||
|
while(iter != m_colors.end())
|
||||||
|
{
|
||||||
|
iter->front = blend(iter->original);
|
||||||
|
iter->back = blendBackground(iter->original);
|
||||||
|
}
|
||||||
|
}
|
119
application/ColorCache.h
Normal file
119
application/ColorCache.h
Normal file
@ -0,0 +1,119 @@
|
|||||||
|
#pragma once
|
||||||
|
#include <QtGui/QColor>
|
||||||
|
#include <rainbow.h>
|
||||||
|
#include <launch/MessageLevel.h>
|
||||||
|
#include <QMap>
|
||||||
|
|
||||||
|
class ColorCache
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
ColorCache(QColor front, QColor back, qreal bias)
|
||||||
|
{
|
||||||
|
m_front = front;
|
||||||
|
m_back = back;
|
||||||
|
m_bias = bias;
|
||||||
|
};
|
||||||
|
|
||||||
|
void addColor(int key, QColor color)
|
||||||
|
{
|
||||||
|
m_colors[key] = {color, blend(color), blendBackground(color)};
|
||||||
|
}
|
||||||
|
|
||||||
|
void setForeground(QColor front)
|
||||||
|
{
|
||||||
|
if(m_front != front)
|
||||||
|
{
|
||||||
|
m_front = front;
|
||||||
|
recolorAll();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void setBackground(QColor back)
|
||||||
|
{
|
||||||
|
if(m_back != back)
|
||||||
|
{
|
||||||
|
m_back = back;
|
||||||
|
recolorAll();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
QColor getFront(int key)
|
||||||
|
{
|
||||||
|
auto iter = m_colors.find(key);
|
||||||
|
if(iter == m_colors.end())
|
||||||
|
{
|
||||||
|
return QColor();
|
||||||
|
}
|
||||||
|
return (*iter).front;
|
||||||
|
}
|
||||||
|
|
||||||
|
QColor getBack(int key)
|
||||||
|
{
|
||||||
|
auto iter = m_colors.find(key);
|
||||||
|
if(iter == m_colors.end())
|
||||||
|
{
|
||||||
|
return QColor();
|
||||||
|
}
|
||||||
|
return (*iter).back;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Blend the color with the front color, adapting to the back color
|
||||||
|
*/
|
||||||
|
QColor blend(QColor color);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Blend the color with the back color
|
||||||
|
*/
|
||||||
|
QColor blendBackground(QColor color);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void recolorAll();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
struct ColorEntry
|
||||||
|
{
|
||||||
|
QColor original;
|
||||||
|
QColor front;
|
||||||
|
QColor back;
|
||||||
|
};
|
||||||
|
|
||||||
|
protected:
|
||||||
|
qreal m_bias;
|
||||||
|
QColor m_front;
|
||||||
|
QColor m_back;
|
||||||
|
QMap<int, ColorEntry> m_colors;
|
||||||
|
};
|
||||||
|
|
||||||
|
class LogColorCache : public ColorCache
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
LogColorCache(QColor front, QColor back)
|
||||||
|
: ColorCache(front, back, 1.0)
|
||||||
|
{
|
||||||
|
addColor((int)MessageLevel::MultiMC, QColor("purple"));
|
||||||
|
addColor((int)MessageLevel::Debug, QColor("green"));
|
||||||
|
addColor((int)MessageLevel::Warning, QColor("orange"));
|
||||||
|
addColor((int)MessageLevel::Error, QColor("red"));
|
||||||
|
addColor((int)MessageLevel::Fatal, QColor("red"));
|
||||||
|
addColor((int)MessageLevel::Message, front);
|
||||||
|
}
|
||||||
|
|
||||||
|
QColor getFront(MessageLevel::Enum level)
|
||||||
|
{
|
||||||
|
if(!m_colors.contains((int) level))
|
||||||
|
{
|
||||||
|
return ColorCache::getFront((int)MessageLevel::Message);
|
||||||
|
}
|
||||||
|
return ColorCache::getFront((int)level);
|
||||||
|
}
|
||||||
|
|
||||||
|
QColor getBack(MessageLevel::Enum level)
|
||||||
|
{
|
||||||
|
if(level == MessageLevel::Fatal)
|
||||||
|
{
|
||||||
|
return QColor(Qt::black);
|
||||||
|
}
|
||||||
|
return QColor(Qt::transparent);
|
||||||
|
}
|
||||||
|
};
|
@ -1,26 +0,0 @@
|
|||||||
#include "Colors.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Blend the color with the front color, adapting to the back color
|
|
||||||
*/
|
|
||||||
QColor Color::blend(QColor front, QColor back, QColor color, uchar ratio)
|
|
||||||
{
|
|
||||||
Q_ASSERT(front.isValid());
|
|
||||||
Q_ASSERT(back.isValid());
|
|
||||||
if (Rainbow::luma(front) > Rainbow::luma(back))
|
|
||||||
{
|
|
||||||
// for dark color schemes, produce a fitting color first
|
|
||||||
color = Rainbow::tint(front, color, 0.5);
|
|
||||||
}
|
|
||||||
// adapt contrast
|
|
||||||
return Rainbow::mix(front, color, float(ratio) / float(0xff));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Blend the color with the back color
|
|
||||||
*/
|
|
||||||
QColor Color::blendBackground(QColor back, QColor color, uchar ratio)
|
|
||||||
{
|
|
||||||
// adapt contrast
|
|
||||||
return Rainbow::mix(back, color, float(ratio) / float(0xff));
|
|
||||||
}
|
|
@ -1,15 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
#include <QtGui/QColor>
|
|
||||||
#include <rainbow.h>
|
|
||||||
namespace Color
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* Blend the color with the front color, adapting to the back color
|
|
||||||
*/
|
|
||||||
QColor blend(QColor front, QColor back, QColor color, uchar ratio);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Blend the color with the back color
|
|
||||||
*/
|
|
||||||
QColor blendBackground(QColor back, QColor color, uchar ratio);
|
|
||||||
}
|
|
@ -10,7 +10,7 @@
|
|||||||
#include "launch/LaunchTask.h"
|
#include "launch/LaunchTask.h"
|
||||||
#include <settings/Setting.h>
|
#include <settings/Setting.h>
|
||||||
#include "GuiUtil.h"
|
#include "GuiUtil.h"
|
||||||
#include <Colors.h>
|
#include <ColorCache.h>
|
||||||
|
|
||||||
LogPage::LogPage(std::shared_ptr<LaunchTask> proc, QWidget *parent)
|
LogPage::LogPage(std::shared_ptr<LaunchTask> proc, QWidget *parent)
|
||||||
: QWidget(parent), ui(new Ui::LogPage), m_process(proc)
|
: QWidget(parent), ui(new Ui::LogPage), m_process(proc)
|
||||||
@ -41,6 +41,10 @@ LogPage::LogPage(std::shared_ptr<LaunchTask> proc, QWidget *parent)
|
|||||||
}
|
}
|
||||||
ui->text->setMaximumBlockCount(maxLines);
|
ui->text->setMaximumBlockCount(maxLines);
|
||||||
|
|
||||||
|
auto origForeground = ui->text->palette().color(ui->text->foregroundRole());
|
||||||
|
auto origBackground = ui->text->palette().color(ui->text->backgroundRole());
|
||||||
|
m_colors.reset(new LogColorCache(origForeground, origBackground));
|
||||||
|
|
||||||
m_stopOnOverflow = MMC->settings()->get("ConsoleOverflowStop").toBool();
|
m_stopOnOverflow = MMC->settings()->get("ConsoleOverflowStop").toBool();
|
||||||
|
|
||||||
auto findShortcut = new QShortcut(QKeySequence(QKeySequence::Find), this);
|
auto findShortcut = new QShortcut(QKeySequence(QKeySequence::Find), this);
|
||||||
@ -204,48 +208,8 @@ void LogPage::write(QString data, MessageLevel::Enum mode)
|
|||||||
QListIterator<QString> iter(filtered);
|
QListIterator<QString> iter(filtered);
|
||||||
QTextCharFormat format(*defaultFormat);
|
QTextCharFormat format(*defaultFormat);
|
||||||
|
|
||||||
auto origForeground = ui->text->palette().color(ui->text->foregroundRole());
|
format.setForeground(m_colors->getFront(mode));
|
||||||
auto origBackground = ui->text->palette().color(ui->text->backgroundRole());
|
format.setBackground(m_colors->getBack(mode));
|
||||||
auto foreground = [&](QColor foreColor)
|
|
||||||
{
|
|
||||||
format.setForeground(Color::blend(origForeground, origBackground, foreColor, 255));
|
|
||||||
};
|
|
||||||
switch(mode)
|
|
||||||
{
|
|
||||||
case MessageLevel::MultiMC:
|
|
||||||
{
|
|
||||||
foreground(QColor("purple"));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case MessageLevel::Debug:
|
|
||||||
{
|
|
||||||
foreground(QColor("green"));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case MessageLevel::Warning:
|
|
||||||
{
|
|
||||||
foreground(QColor("orange"));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case MessageLevel::Error:
|
|
||||||
{
|
|
||||||
foreground(QColor("red"));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case MessageLevel::Fatal:
|
|
||||||
{
|
|
||||||
origBackground = QColor("black");
|
|
||||||
foreground(QColor("red"));
|
|
||||||
format.setBackground(QColor("black"));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case MessageLevel::Info:
|
|
||||||
case MessageLevel::Message:
|
|
||||||
default:
|
|
||||||
{
|
|
||||||
foreground(QColor("black"));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
while (iter.hasNext())
|
while (iter.hasNext())
|
||||||
{
|
{
|
||||||
|
@ -21,6 +21,7 @@
|
|||||||
#include "launch/LaunchTask.h"
|
#include "launch/LaunchTask.h"
|
||||||
#include "BasePage.h"
|
#include "BasePage.h"
|
||||||
#include <MultiMC.h>
|
#include <MultiMC.h>
|
||||||
|
#include <ColorCache.h>
|
||||||
|
|
||||||
namespace Ui
|
namespace Ui
|
||||||
{
|
{
|
||||||
@ -86,4 +87,5 @@ private:
|
|||||||
|
|
||||||
QTextCharFormat * defaultFormat;
|
QTextCharFormat * defaultFormat;
|
||||||
BasePageContainer * m_parentContainer;
|
BasePageContainer * m_parentContainer;
|
||||||
|
std::unique_ptr<LogColorCache> m_colors;
|
||||||
};
|
};
|
||||||
|
@ -40,6 +40,10 @@ enum InstSortMode
|
|||||||
MultiMCPage::MultiMCPage(QWidget *parent) : QWidget(parent), ui(new Ui::MultiMCPage)
|
MultiMCPage::MultiMCPage(QWidget *parent) : QWidget(parent), ui(new Ui::MultiMCPage)
|
||||||
{
|
{
|
||||||
ui->setupUi(this);
|
ui->setupUi(this);
|
||||||
|
auto origForeground = ui->fontPreview->palette().color(ui->fontPreview->foregroundRole());
|
||||||
|
auto origBackground = ui->fontPreview->palette().color(ui->fontPreview->backgroundRole());
|
||||||
|
m_colors.reset(new LogColorCache(origForeground, origBackground));
|
||||||
|
|
||||||
ui->sortingModeGroup->setId(ui->sortByNameBtn, Sort_Name);
|
ui->sortingModeGroup->setId(ui->sortByNameBtn, Sort_Name);
|
||||||
ui->sortingModeGroup->setId(ui->sortLastLaunchedBtn, Sort_LastLaunch);
|
ui->sortingModeGroup->setId(ui->sortLastLaunchedBtn, Sort_LastLaunch);
|
||||||
|
|
||||||
@ -424,7 +428,7 @@ void MultiMCPage::refreshFontPreview()
|
|||||||
defaultFormat->setFont(QFont(fontFamily, fontSize));
|
defaultFormat->setFont(QFont(fontFamily, fontSize));
|
||||||
{
|
{
|
||||||
QTextCharFormat format(*defaultFormat);
|
QTextCharFormat format(*defaultFormat);
|
||||||
format.setForeground(QColor("red"));
|
format.setForeground(m_colors->getFront(MessageLevel::Error));
|
||||||
// append a paragraph/line
|
// append a paragraph/line
|
||||||
auto workCursor = ui->fontPreview->textCursor();
|
auto workCursor = ui->fontPreview->textCursor();
|
||||||
workCursor.movePosition(QTextCursor::End);
|
workCursor.movePosition(QTextCursor::End);
|
||||||
@ -433,6 +437,7 @@ void MultiMCPage::refreshFontPreview()
|
|||||||
}
|
}
|
||||||
{
|
{
|
||||||
QTextCharFormat format(*defaultFormat);
|
QTextCharFormat format(*defaultFormat);
|
||||||
|
format.setForeground(m_colors->getFront(MessageLevel::Message));
|
||||||
// append a paragraph/line
|
// append a paragraph/line
|
||||||
auto workCursor = ui->fontPreview->textCursor();
|
auto workCursor = ui->fontPreview->textCursor();
|
||||||
workCursor.movePosition(QTextCursor::End);
|
workCursor.movePosition(QTextCursor::End);
|
||||||
@ -441,7 +446,7 @@ void MultiMCPage::refreshFontPreview()
|
|||||||
}
|
}
|
||||||
{
|
{
|
||||||
QTextCharFormat format(*defaultFormat);
|
QTextCharFormat format(*defaultFormat);
|
||||||
format.setForeground(QColor("orange"));
|
format.setForeground(m_colors->getFront(MessageLevel::Warning));
|
||||||
// append a paragraph/line
|
// append a paragraph/line
|
||||||
auto workCursor = ui->fontPreview->textCursor();
|
auto workCursor = ui->fontPreview->textCursor();
|
||||||
workCursor.movePosition(QTextCursor::End);
|
workCursor.movePosition(QTextCursor::End);
|
||||||
|
@ -21,6 +21,7 @@
|
|||||||
#include "java/JavaChecker.h"
|
#include "java/JavaChecker.h"
|
||||||
#include "pages/BasePage.h"
|
#include "pages/BasePage.h"
|
||||||
#include <MultiMC.h>
|
#include <MultiMC.h>
|
||||||
|
#include "ColorCache.h"
|
||||||
|
|
||||||
class QTextCharFormat;
|
class QTextCharFormat;
|
||||||
class SettingsObject;
|
class SettingsObject;
|
||||||
@ -97,4 +98,6 @@ private:
|
|||||||
|
|
||||||
// default format for the font preview...
|
// default format for the font preview...
|
||||||
QTextCharFormat *defaultFormat;
|
QTextCharFormat *defaultFormat;
|
||||||
|
|
||||||
|
std::unique_ptr<LogColorCache> m_colors;
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user