xaizek / d2if (License: GPLv2+) (since 2018-12-07)
Simple dzen2 input formatter, which is supposed to not waste CPU time for nothing and provides a number of builtin "widgets" for displaying system information.
<root> / src / StatusBar.cpp (1d1ef2257afc972ff45f291eb9f09c478f7d5f0b) (2,016B) (mode 100644) [raw]
// d2if
// Copyright (C) 2012 xaizek.
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA

#include "StatusBar.hpp"

#include <algorithm>
#include <functional>
#include <iostream>
#include <memory>
#include <sstream>
#include <string>
#include <vector>

#include "DelimOstreamIterator.hpp"
#include "Field.hpp"

StatusBar::StatusBar(std::vector<std::unique_ptr<Field>> fields)
    : fields(std::move(fields))
{
}

void StatusBar::setFieldDelimiter(const std::string &delimiter)
{
    fieldDelimiter = delimiter;
    sepCache = "^pa(;0)" + colorCache + fieldDelimiter;
}

void StatusBar::setFieldDelimiterColor(const std::string &delimiterColor)
{
    fieldDelimiterColor = delimiterColor;
    colorCache = "^fg(" + fieldDelimiterColor + ")";

    // reset delimeter to update its cache
    setFieldDelimiter(fieldDelimiter);
}

std::string StatusBar::getText() const
{
    std::vector<Field*> visibleFields;
    visibleFields.reserve(fields.size());

    for (const std::unique_ptr<Field> &field : fields) {
        field->update();
        if (field->isVisible()) {
            visibleFields.push_back(field.get());
        }
    }

    std::ostringstream result;
    result << "^pa(2;0)";
    std::copy(visibleFields.begin(), visibleFields.end(),
              DelimOstreamIterator<Field*>(result, sepCache.c_str()));

    return result.str();
}
Hints

Before first commit, do not forget to setup your git environment:
git config --global user.name "your_name_here"
git config --global user.email "your@email_here"

Clone this repository using HTTP(S):
git clone https://code.reversed.top/user/xaizek/d2if

Clone this repository using ssh (do not forget to upload a key first):
git clone ssh://rocketgit@code.reversed.top/user/xaizek/d2if

You are allowed to anonymously push to this repository.
This means that your pushed commits will automatically be transformed into a pull request:
... clone the repository ...
... make some changes and some commits ...
git push origin master