Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
c5fcc81
qt: Generalized css files, simple design changes, added scripts to ke…
xdustinface Jun 26, 2020
b409254
qt: Redesign of the main toolbar (#3554)
xdustinface Jun 28, 2020
d296cbd
Merge pull request #3555 from xdustinface/pr-ui-2-fonts
UdjinM6 Jul 7, 2020
0676227
qt: Disable macOS system focus rectangles for dash themes (#3556)
xdustinface Jul 8, 2020
dde4ab5
qt: Add -custom-css-dir commmand line parameter (#3557)
xdustinface Jul 12, 2020
f371e47
qt: Add -debug-ui command line parameter (#3558)
xdustinface Jul 14, 2020
edfc3a4
qt: Call GUIUtil::loadFonts earlier (#3593)
xdustinface Jul 8, 2020
06d69d7
qt: Replace usage of QTabBar with custom replacement (#3560)
xdustinface Jul 14, 2020
1dea248
qt: Make use of GUIUtil themed colors/styles (#3561)
xdustinface Jul 14, 2020
b373864
qt: General CSS related redesigns (#3563)
xdustinface Jul 16, 2020
7db9909
qt: Introduce runtime theme changes (#3559)
xdustinface Jul 19, 2020
a16cfa7
qt: Redesign BitcoinAmountField (#3569)
xdustinface Jul 19, 2020
d22ab43
qt: Introduce platform specific css sections (#3570)
xdustinface Jul 20, 2020
d44611b
qt: General qt/c++ related fixes and updates (#3562)
xdustinface Jul 20, 2020
1a2867f
qt: Introduce appearance tab and setup dialog (#3568)
xdustinface Jul 26, 2020
b073ae9
qt: Redesign scrollbar styles (#3571)
xdustinface Jul 26, 2020
2cc36df
qt: Drop PlatformStyle (#3573)
xdustinface Jul 26, 2020
103fda2
qt: Fix appearancewidget.h to make lint-include-guards.sh happy (#3627)
xdustinface Jul 27, 2020
0ed7f16
qt: Add missing placeholders (#3575)
xdustinface Jul 27, 2020
966be38
qt: Make sure stylesheet updates of -debug-ui are activated (#3623)
xdustinface Jul 27, 2020
0969c2d
qt: Splashscreen redesign (#3613)
xdustinface Jul 28, 2020
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ src/dash-tx
src/test/test_dash
src/test/test_dash_fuzzy
src/qt/test/test_dash-qt
src/qt/res/css/colors/*
src/bench/bench_dash

# autoreconf
Expand Down
1 change: 1 addition & 0 deletions contrib/dash-qt.pro
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
FORMS += \
../src/qt/forms/aboutdialog.ui \
../src/qt/forms/addressbookpage.ui \
../src/qt/forms/appearancewidget.ui \
../src/qt/forms/askpassphrasedialog.ui \
../src/qt/forms/coincontroldialog.ui \
../src/qt/forms/debugwindow.ui \
Expand Down
198 changes: 198 additions & 0 deletions contrib/devtools/update-css-files.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,198 @@
#!/usr/bin/env python3
#
# update-css-files.py creates color analyse files in css/colors and updates the
# `<colors></colors>` section in all css files.
#
# Copyright (c) 2020 The Dash Core developers
# Distributed under the MIT/X11 software license, see the accompanying
# file COPYING or http://www.opensource.org/licenses/mit-license.php.

from pathlib import Path
import re
import subprocess
import sys

MATCH_REPLACE = '<colors>.+?</colors>'
MATCH_COLORS = '#(?:[0-9a-fA-F]{2}){2,4}|#(?:[0-9a-f]{1}){3}'

def error(msg):
exit('\nERROR: {}\n'.format(msg))

def parse_css(file_css):
# Temporarily
state = 0
selectors = []

# Results
by_attribute = {}
by_color = {}

for line in file_css.read_text().splitlines():

if line == '':
continue

# start of a comment
if state == 0 and line.startswith('/*'):
if '*/' in line:
state = 0
else:
state = 1
# we are in a comment section
elif state == 1:
# end of the comment
if '*/' in line:
state = 0
else:
continue
# first line of multiple selector
elif (state == 0 or state == 2) and ',' in line:
state = 2
# first line of single selector or end of multiple
elif (state == 0 or state == 2) and '{' in line:
state = 3
# end of element
elif state == 4 and line == '}':
state = 0

if state == 0 and len(selectors):
selectors = []

if state == 2:
selector = line.split(",")[0].strip(' ')
selectors.append(selector)

if state == 3:
selector = line.split("{")[0].strip(' ')
selectors.append(selector)
state = 4
continue

if state == 4:
matched_colors = re.findall(MATCH_COLORS, line)

if len(matched_colors) > 1:
error("Multiple colors in a line.\n\n {}\n\nSeems to be an invalid file!".format(line))
elif len(matched_colors) == 1:
matched_color = matched_colors[0]
element = line.split(":")[0].strip(' ')

if not matched_color in by_color:
by_color[matched_color] = []

by_color[matched_color].append(element)

entry = element + " " + matched_color

if not entry in by_attribute:
by_attribute[entry] = []

by_attribute[entry].extend(selectors)

def sort_color(color):
tmp = color[0].replace('#', '0x')
return int(tmp, 0)

def remove_duplicates(l):
no_duplicates = []
[no_duplicates.append(i) for i in l if not no_duplicates.count(i)]
return no_duplicates

colors = []

# sort colors just by hex value
if len(by_color):
colors = sorted(by_color.items(), key=lambda x: sort_color(x))

for k, l in by_attribute.items():
by_attribute[k] = remove_duplicates(l)

for k, l in by_color.items():
by_color[k] = remove_duplicates(l)

return {'fileName': file_css.stem, 'byAttribute': by_attribute, 'byColor': by_color, 'colors': colors}


def create_color_file(content, commit):

str_result = "Color analyse of " +\
content['fileName'] + ".css " + \
"by " + \
Path(__file__).name + \
" for commit " + \
commit + \
"\n\n"

if not len(content['colors']):
return None

str_result += "# Used colors\n\n"
for c in content['colors']:
str_result += c[0] + '\n'

str_result += "\n# Grouped by attribute\n"

for k, v in content['byAttribute'].items():
str_result += '\n' + k + '\n'
for val in v:
str_result += ' ' + val + '\n'

str_result += "\n# Grouped by color\n"

for k, v in content['byColor'].items():
str_result += '\n' + k + '\n'
for val in v:
str_result += ' ' + val + '\n'

return str_result

if __name__ == '__main__':

if len(sys.argv) > 1:
error('No argument required!')

try:
css_folder_path = Path(__file__).parent.absolute() / Path('../../src/qt/res/css/')
css_folder_path = css_folder_path.resolve(strict=True)
except Exception:
error("Path doesn't exist: {}".format(css_folder_path))

if not len(list(css_folder_path.glob('*.css'))):
error("No .css files found in {}".format(css_folder_path))

results = [parse_css(x) for x in css_folder_path.glob('*.css') if x.is_file()]

colors_folder_path = css_folder_path / Path('colors/')
if not colors_folder_path.is_dir():
try:
colors_folder_path.mkdir()
except Exception:
error("Can't create new folder: {}".format(colors_folder_path))

commit = subprocess.check_output(['git', '-C', css_folder_path, 'rev-parse', '--short', 'HEAD']).decode("utf-8")

for r in results:

# Update the css file
css_file = css_folder_path / Path(r['fileName'] + '.css')
css_content = css_file.read_text()
to_replace = re.findall(MATCH_REPLACE, css_content, re.DOTALL)

str_result = "\n# Used colors in {}.css for commit {}\n".format(r['fileName'], commit)
for c in r['colors']:
str_result += c[0] + '\n'

str_replace = "<colors>\n{}\n</colors>".format(str_result)
css_content = css_content.replace(to_replace[0], str_replace)
css_file.write_text(css_content)

# Write the <css>_color.txt files
str_result = create_color_file(r, commit)

if str_result is not None:
color_file = colors_folder_path / Path(r['fileName'] + '_css_colors.txt')
color_file.write_text(str_result)

print('\n{}.css -> {} created!'.format(r['fileName'], color_file))
else:
print('\n{}.css -> No colors found..'.format(r['fileName'] + ".css"))
35 changes: 28 additions & 7 deletions src/Makefile.qt.include
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ QT_TS = \

QT_FORMS_UI = \
qt/forms/addressbookpage.ui \
qt/forms/appearancewidget.ui \
qt/forms/askpassphrasedialog.ui \
qt/forms/coincontroldialog.ui \
qt/forms/editaddressdialog.ui \
Expand All @@ -54,6 +55,7 @@ QT_FORMS_UI = \
QT_MOC_CPP = \
qt/moc_addressbookpage.cpp \
qt/moc_addresstablemodel.cpp \
qt/moc_appearancewidget.cpp \
qt/moc_askpassphrasedialog.cpp \
qt/moc_bantablemodel.cpp \
qt/moc_bitcoinaddressvalidator.cpp \
Expand Down Expand Up @@ -126,6 +128,7 @@ PROTOBUF_PROTO = qt/paymentrequest.proto
BITCOIN_QT_H = \
qt/addressbookpage.h \
qt/addresstablemodel.h \
qt/appearancewidget.h \
qt/askpassphrasedialog.h \
qt/bantablemodel.h \
qt/bitcoinaddressvalidator.h \
Expand Down Expand Up @@ -155,7 +158,6 @@ BITCOIN_QT_H = \
qt/paymentrequestplus.h \
qt/paymentserver.h \
qt/peertablemodel.h \
qt/platformstyle.h \
qt/qrdialog.h \
qt/qvalidatedlineedit.h \
qt/qvaluecombobox.h \
Expand Down Expand Up @@ -238,6 +240,7 @@ RES_ICONS = \
qt/res/icons/network_disabled.png

BITCOIN_QT_BASE_CPP = \
qt/appearancewidget.cpp \
qt/bantablemodel.cpp \
qt/bitcoinaddressvalidator.cpp \
qt/bitcoinamountfield.cpp \
Expand All @@ -253,7 +256,6 @@ BITCOIN_QT_BASE_CPP = \
qt/optionsdialog.cpp \
qt/optionsmodel.cpp \
qt/peertablemodel.cpp \
qt/platformstyle.cpp \
qt/qvalidatedlineedit.cpp \
qt/qvaluecombobox.cpp \
qt/rpcconsole.cpp \
Expand Down Expand Up @@ -352,8 +354,27 @@ RES_CSS = \
qt/res/css/dark.css \
qt/res/css/general.css \
qt/res/css/light.css \
qt/res/css/scrollbars.css \
qt/res/css/trad.css
qt/res/css/traditional.css

RES_FONTS = \
qt/res/fonts/Montserrat/Montserrat-Black.otf \
qt/res/fonts/Montserrat/Montserrat-BlackItalic.otf \
qt/res/fonts/Montserrat/Montserrat-Bold.otf \
qt/res/fonts/Montserrat/Montserrat-BoldItalic.otf \
qt/res/fonts/Montserrat/Montserrat-ExtraBold.otf \
qt/res/fonts/Montserrat/Montserrat-ExtraBoldItalic.otf \
qt/res/fonts/Montserrat/Montserrat-ExtraLight.otf \
qt/res/fonts/Montserrat/Montserrat-ExtraLightItalic.otf \
qt/res/fonts/Montserrat/Montserrat-Italic.otf \
qt/res/fonts/Montserrat/Montserrat-Light.otf \
qt/res/fonts/Montserrat/Montserrat-LightItalic.otf \
qt/res/fonts/Montserrat/Montserrat-Medium.otf \
qt/res/fonts/Montserrat/Montserrat-MediumItalic.otf \
qt/res/fonts/Montserrat/Montserrat-Regular.otf \
qt/res/fonts/Montserrat/Montserrat-SemiBold.otf \
qt/res/fonts/Montserrat/Montserrat-SemiBoldItalic.otf \
qt/res/fonts/Montserrat/Montserrat-Thin.otf \
qt/res/fonts/Montserrat/Montserrat-ThinItalic.otf

RES_MOVIES = $(wildcard $(srcdir)/qt/res/movies/spinner-*.png)

Expand All @@ -367,7 +388,7 @@ qt_libdashqt_a_CXXFLAGS = $(AM_CXXFLAGS) $(QT_PIE_FLAGS)
qt_libdashqt_a_OBJCXXFLAGS = $(AM_OBJCXXFLAGS) $(QT_PIE_FLAGS)

qt_libdashqt_a_SOURCES = $(BITCOIN_QT_CPP) $(BITCOIN_QT_H) $(QT_FORMS_UI) \
$(QT_QRC) $(QT_QRC_LOCALE) $(QT_TS) $(PROTOBUF_PROTO) $(RES_ICONS) $(RES_IMAGES) $(RES_CSS) $(RES_MOVIES)
$(QT_QRC) $(QT_QRC_LOCALE) $(QT_TS) $(PROTOBUF_PROTO) $(RES_ICONS) $(RES_IMAGES) $(RES_CSS) $(RES_FONTS) $(RES_MOVIES)

nodist_qt_libdashqt_a_SOURCES = $(QT_MOC_CPP) $(QT_MOC) $(PROTOBUF_CC) \
$(PROTOBUF_H) $(QT_QRC_CPP) $(QT_QRC_LOCALE_CPP)
Expand Down Expand Up @@ -430,12 +451,12 @@ $(QT_QRC_LOCALE_CPP): $(QT_QRC_LOCALE) $(QT_QM)
$(SED) -e '/^\*\*.*Created:/d' -e '/^\*\*.*by:/d' > $@
@rm $(@D)/temp_$(<F)

$(QT_QRC_CPP): $(QT_QRC) $(QT_FORMS_H) $(RES_ICONS) $(RES_IMAGES) $(RES_CSS) $(RES_MOVIES) $(PROTOBUF_H)
$(QT_QRC_CPP): $(QT_QRC) $(QT_FORMS_H) $(RES_ICONS) $(RES_IMAGES) $(RES_CSS) $(RES_FONTS) $(RES_MOVIES) $(PROTOBUF_H)
@test -f $(RCC)
$(AM_V_GEN) QT_SELECT=$(QT_SELECT) $(RCC) $(RCCFLAGS) -name dash $< | \
$(SED) -e '/^\*\*.*Created:/d' -e '/^\*\*.*by:/d' > $@

CLEAN_QT = $(nodist_qt_libdashqt_a_SOURCES) $(QT_QM) $(QT_FORMS_H) qt/*.gcda qt/*.gcno qt/temp_dash_locale.qrc
CLEAN_QT = $(nodist_qt_libdashqt_a_SOURCES) $(QT_QM) $(QT_FORMS_H) qt/*.gcda qt/*.gcno qt/temp_dash_locale.qrc qt/res/css/colors/*

CLEANFILES += $(CLEAN_QT)

Expand Down
17 changes: 4 additions & 13 deletions src/qt/addressbookpage.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -16,33 +16,22 @@
#include <qt/editaddressdialog.h>
#include <qt/guiutil.h>
#include <qt/optionsmodel.h>
#include <qt/platformstyle.h>
#include <qt/qrdialog.h>

#include <QIcon>
#include <QMenu>
#include <QMessageBox>
#include <QSortFilterProxyModel>

AddressBookPage::AddressBookPage(const PlatformStyle *platformStyle, Mode _mode, Tabs _tab, QWidget *parent) :
AddressBookPage::AddressBookPage(Mode _mode, Tabs _tab, QWidget *parent) :
QDialog(parent),
ui(new Ui::AddressBookPage),
model(0),
mode(_mode),
tab(_tab)
{
ui->setupUi(this);
if (!platformStyle->getImagesOnButtons()) {
ui->newAddress->setIcon(QIcon());
ui->copyAddress->setIcon(QIcon());
ui->deleteAddress->setIcon(QIcon());
ui->exportButton->setIcon(QIcon());
} else {
ui->newAddress->setIcon(QIcon(":/icons/add"));
ui->copyAddress->setIcon(QIcon(":/icons/editcopy"));
ui->deleteAddress->setIcon(QIcon(":/icons/remove"));
ui->exportButton->setIcon(QIcon(":/icons/export"));
}

ui->showAddressQRCode->setIcon(QIcon());

switch(mode)
Expand Down Expand Up @@ -106,6 +95,8 @@ AddressBookPage::AddressBookPage(const PlatformStyle *platformStyle, Mode _mode,
connect(ui->tableView, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(contextualMenu(QPoint)));

connect(ui->closeButton, SIGNAL(clicked()), this, SLOT(accept()));

GUIUtil::updateFonts();
}

AddressBookPage::~AddressBookPage()
Expand Down
3 changes: 1 addition & 2 deletions src/qt/addressbookpage.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@
#include <QDialog>

class AddressTableModel;
class PlatformStyle;

namespace Ui {
class AddressBookPage;
Expand Down Expand Up @@ -38,7 +37,7 @@ class AddressBookPage : public QDialog
ForEditing /**< Open address book for editing */
};

explicit AddressBookPage(const PlatformStyle *platformStyle, Mode mode, Tabs tab, QWidget *parent);
explicit AddressBookPage(Mode mode, Tabs tab, QWidget* parent);
~AddressBookPage();

void setModel(AddressTableModel *model);
Expand Down
Loading