Commit 93b66735 authored by Sylvain Joubert's avatar Sylvain Joubert

ccmake: Use type-based colors to display cache values

The colors are based on the entry type (or value for booleans),
paths and filepaths sharing the same color.
parent dbd14eca
ccmake-colored-values
---------------------
* :manual:`ccmake(1)` now displays cache values using colors
based on the entry type if the terminal supports color.
......@@ -5,6 +5,7 @@ add_executable(ccmake
ccmake.cxx
cmCursesBoolWidget.cxx
cmCursesCacheEntryComposite.cxx
cmCursesColor.cxx
cmCursesDummyWidget.cxx
cmCursesFilePathWidget.cxx
cmCursesForm.cxx
......@@ -17,21 +18,41 @@ add_executable(ccmake
cmCursesWidget.cxx
)
target_include_directories(ccmake PRIVATE ${CURSES_INCLUDE_PATH})
set(CMAKE_REQUIRED_INCLUDES ${CURSES_INCLUDE_PATH})
target_link_libraries(ccmake CMakeLib)
if(CMAKE_USE_SYSTEM_FORM)
find_path(CURSES_FORM_INCLUDE_DIR NAMES form.h HINTS ${CURSES_INCLUDE_PATH} ${CURSES_INCLUDE_PATH}/ncurses)
if(CURSES_FORM_INCLUDE_DIR)
target_include_directories(ccmake PRIVATE ${CURSES_FORM_INCLUDE_DIR})
list(APPEND CMAKE_REQUIRED_INCLUDES ${CURSES_FORM_INCLUDE_DIR})
endif()
target_link_libraries(ccmake
${CURSES_FORM_LIBRARY}
${CURSES_LIBRARY}
)
set(CMAKE_REQUIRED_LIBRARIES
${CURSES_FORM_LIBRARY}
${CURSES_LIBRARY}
)
if(CURSES_EXTRA_LIBRARY)
target_link_libraries(ccmake ${CURSES_EXTRA_LIBRARY})
list(APPEND CMAKE_REQUIRED_LIBRARIES ${CURSES_EXTRA_LIBRARY})
endif()
else()
target_link_libraries(ccmake cmForm)
get_target_property(cmFormIncludeDirs cmForm INTERFACE_INCLUDE_DIRECTORIES)
list(APPEND CMAKE_REQUIRED_INCLUDES ${cmFormIncludeDirs})
get_target_property(cmFormLibraries cmForm INTERFACE_LINK_LIBRARIES)
set(CMAKE_REQUIRED_LIBRARIES ${cmFormLibraries})
endif()
include(CheckSymbolExists)
check_symbol_exists(use_default_colors
"form.h"
HAVE_CURSES_USE_DEFAULT_COLORS)
if(HAVE_CURSES_USE_DEFAULT_COLORS)
set_source_files_properties(cmCursesColor.cxx
PROPERTIES COMPILE_DEFINITIONS HAVE_CURSES_USE_DEFAULT_COLORS)
endif()
if(CMake_JOB_POOL_LINK_BIN)
......
......@@ -9,6 +9,7 @@
#include "cmsys/Encoding.hxx"
#include "cmCursesColor.h"
#include "cmCursesForm.h"
#include "cmCursesMainForm.h"
#include "cmCursesStandardIncludes.h"
......@@ -126,6 +127,7 @@ int main(int argc, char const* const* argv)
noecho(); /* Echo off */
cbreak(); /* nl- or cr not needed */
keypad(stdscr, true); /* Use key symbols as KEY_DOWN */
cmCursesColor::InitColors();
signal(SIGWINCH, onsig);
......
......@@ -4,6 +4,7 @@
#include <string>
#include "cmCursesColor.h"
#include "cmCursesWidget.h"
#include "cmStateTypes.h"
......@@ -12,8 +13,10 @@ cmCursesBoolWidget::cmCursesBoolWidget(int width, int height, int left,
: cmCursesWidget(width, height, left, top)
{
this->Type = cmStateEnums::BOOL;
set_field_fore(this->Field, A_NORMAL);
set_field_back(this->Field, A_STANDOUT);
if (!cmCursesColor::HasColors()) {
set_field_fore(this->Field, A_NORMAL);
set_field_back(this->Field, A_STANDOUT);
}
field_opts_off(this->Field, O_STATIC);
this->SetValueAsBool(false);
}
......@@ -42,8 +45,16 @@ void cmCursesBoolWidget::SetValueAsBool(bool value)
{
if (value) {
this->SetValue("ON");
if (cmCursesColor::HasColors()) {
set_field_fore(this->Field, COLOR_PAIR(cmCursesColor::BoolOn));
set_field_back(this->Field, COLOR_PAIR(cmCursesColor::BoolOn));
}
} else {
this->SetValue("OFF");
if (cmCursesColor::HasColors()) {
set_field_fore(this->Field, COLOR_PAIR(cmCursesColor::BoolOff));
set_field_back(this->Field, COLOR_PAIR(cmCursesColor::BoolOff));
}
}
}
......
/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
file Copyright.txt or https://cmake.org/licensing for details. */
#include "cmCursesColor.h"
#include "cmCursesStandardIncludes.h"
bool cmCursesColor::HasColors()
{
#ifdef HAVE_CURSES_USE_DEFAULT_COLORS
return has_colors();
#else
return false;
#endif
}
void cmCursesColor::InitColors()
{
#ifdef HAVE_CURSES_USE_DEFAULT_COLORS
if (HasColors()) {
start_color();
use_default_colors();
init_pair(cmCursesColor::BoolOff, COLOR_RED, -1);
init_pair(cmCursesColor::BoolOn, COLOR_GREEN, -1);
init_pair(cmCursesColor::String, COLOR_BLUE, -1);
init_pair(cmCursesColor::Path, COLOR_YELLOW, -1);
init_pair(cmCursesColor::Options, COLOR_MAGENTA, -1);
}
#endif
}
/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
file Copyright.txt or https://cmake.org/licensing for details. */
#ifndef cmCursesColor_h
#define cmCursesColor_h
class cmCursesColor
{
public:
enum Color
{
// Default color is pair 0
BoolOff = 1,
BoolOn,
String,
Path,
Options
};
static bool HasColors();
static void InitColors();
};
#endif // cmCursesColor_h
......@@ -2,6 +2,7 @@
file Copyright.txt or https://cmake.org/licensing for details. */
#include "cmCursesOptionsWidget.h"
#include "cmCursesColor.h"
#include "cmCursesWidget.h"
#include "cmStateTypes.h"
......@@ -15,8 +16,13 @@ cmCursesOptionsWidget::cmCursesOptionsWidget(int width, int height, int left,
// there is no option type, and string type causes ccmake to cast
// the widget into a string widget at some point. BOOL is safe for
// now.
set_field_fore(this->Field, A_NORMAL);
set_field_back(this->Field, A_STANDOUT);
if (cmCursesColor::HasColors()) {
set_field_fore(this->Field, COLOR_PAIR(cmCursesColor::Options));
set_field_back(this->Field, COLOR_PAIR(cmCursesColor::Options));
} else {
set_field_fore(this->Field, A_NORMAL);
set_field_back(this->Field, A_STANDOUT);
}
field_opts_off(this->Field, O_STATIC);
}
......
......@@ -4,6 +4,7 @@
#include <vector>
#include "cmCursesColor.h"
#include "cmCursesMainForm.h"
#include "cmCursesStringWidget.h"
#include "cmStateTypes.h"
......@@ -16,6 +17,13 @@ cmCursesPathWidget::cmCursesPathWidget(int width, int height, int left,
this->Type = cmStateEnums::PATH;
this->Cycle = false;
this->CurrentIndex = 0;
if (cmCursesColor::HasColors()) {
set_field_fore(this->Field, COLOR_PAIR(cmCursesColor::Path));
set_field_back(this->Field, COLOR_PAIR(cmCursesColor::Path));
} else {
set_field_fore(this->Field, A_NORMAL);
set_field_back(this->Field, A_STANDOUT);
}
}
void cmCursesPathWidget::OnType(int& key, cmCursesMainForm* fm, WINDOW* w)
......
......@@ -4,6 +4,7 @@
#include <cstdio>
#include "cmCursesColor.h"
#include "cmCursesForm.h"
#include "cmCursesMainForm.h"
#include "cmCursesStandardIncludes.h"
......@@ -21,8 +22,13 @@ cmCursesStringWidget::cmCursesStringWidget(int width, int height, int left,
{
this->InEdit = false;
this->Type = cmStateEnums::STRING;
set_field_fore(this->Field, A_NORMAL);
set_field_back(this->Field, A_STANDOUT);
if (cmCursesColor::HasColors()) {
set_field_fore(this->Field, COLOR_PAIR(cmCursesColor::String));
set_field_back(this->Field, COLOR_PAIR(cmCursesColor::String));
} else {
set_field_fore(this->Field, A_NORMAL);
set_field_back(this->Field, A_STANDOUT);
}
field_opts_off(this->Field, O_STATIC);
}
......
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