New widget FBusyIndicator

This commit is contained in:
Markus Gans 2020-06-11 21:38:33 +02:00
parent 0ff67da077
commit ccb7eeb3c6
22 changed files with 675 additions and 36 deletions

View File

@ -1,3 +1,7 @@
2020-06-11 Markus Gans <guru.mail@muenster.de>
* New widget FBusyIndicator to indicate background activity
* Added example/busy to demonstrate the functionality of this widget
2020-06-07 Markus Gans <guru.mail@muenster.de> 2020-06-07 Markus Gans <guru.mail@muenster.de>
* The --log-file parameter stores log output to any file. The file * The --log-file parameter stores log output to any file. The file
can be viewed directly on another terminal with "tail -f". can be viewed directly on another terminal with "tail -f".

View File

@ -177,11 +177,11 @@ Class digramm
: 1┌───────────────┐ │ ┌─────────────┐ : 1┌───────────────┐ │ ┌─────────────┐
┌-----------┤ FMouseControl │ ├────┤ FTimerEvent │ ┌-----------┤ FMouseControl │ ├────┤ FTimerEvent │
: └───────────────┘ │ └─────────────┘ : └───────────────┘ │ └─────────────┘
: 1┌─────────┐ │ : 1┌─────────┐ │ ┌──────┐ ┌─────────┐
┌-----------┤ FSystem │ │ ┌-----------┤ FSystem │ │ │ FLog │◄──┤ FLogger │
: └─────────┘ │ : └─────────┘ │ └──┬───┘ └─────────┘
: *┌─────────┐ │ : *┌─────────┐ │ :1
: ┌--------┤ FString │ │ ┌─────────────┐ : ┌--------┤ FString │ │ ┌─────────────┐
: : └─────────┘ │ ┌────┤ FApplication │ : : └─────────┘ │ ┌────┤ FApplication │
: : *┌────────┐ │ │ └──────────────┘ : : *┌────────┐ │ │ └──────────────┘
: ┌--------┤ FPoint │ │ │ ┌────────┐ : ┌--------┤ FPoint │ │ │ ┌────────┐
@ -201,11 +201,11 @@ Class digramm
│ FVTerm │◄──┐ :1 │ └──────────────┘ │ └──────────────┘ │ FVTerm │◄──┐ :1 │ └──────────────┘ │ └──────────────┘
└────────┘ │ ┌────┴────┐ │ ┌───────────────┐ │ ┌───────────┐ └────────┘ │ ┌────┴────┐ │ ┌───────────────┐ │ ┌───────────┐
├────┤ FWidget │◄───────┼────┤ FToggleButton │◄─┼──┤ FCheckBox │ ├────┤ FWidget │◄───────┼────┤ FToggleButton │◄─┼──┤ FCheckBox │
┌─────────┐ │ └────────┘ │ └───────────────┘ │ └───────────┘ ┌─────────┐ │ └────────┘ │ └───────────────┘ │ └───────────┘
│ FObject │◄──┘ │ ┌──────────────┐ │ ┌─────────┐ │ FObject │◄──┘ :1 │ ┌──────────────┐ │ ┌─────────┐
└─────────┘ ├────┤ FProgressbar │ └──┤ FSwitch │ └─────────┘ ┌──────┴────────┐ ├────┤ FProgressbar │ └──┤ FSwitch │
│ └──────────────┘ └─────────┘ │ FWidgetColors │ │ └──────────────┘ └─────────┘
│ ┌────────────┐ └───────────────┘ │ ┌────────────┐
├────┤ FScrollbar │ ├────┤ FScrollbar │
│ └────────────┘ │ └────────────┘
│ ┌───────────┐ │ ┌───────────┐
@ -233,9 +233,9 @@ Class digramm
└──┬──┬───┘ └─────────┘ │ ┌─────────────┐ └──┬──┬───┘ └─────────┘ │ ┌─────────────┐
▲ ▲ └──┤ FMessageBox │ ▲ ▲ └──┤ FMessageBox │
│ │ └─────────────┘ │ │ └─────────────┘
│ │ ┌──────────┐ │ │ ┌──────────┐ ┌────────────────┐
│ └──────┤ FToolTip │ │ └──────┤ FToolTip │◄─┤ FBusyIndicator │
│ └──────────┘ │ └──────────┘ └────────────────┘
└───────────────┐ ┌──────────┐ └───────────────┐ ┌──────────┐
│ ┌───┤ FMenuBar │ │ ┌───┤ FMenuBar │
┌───────────┐ └──────┤ └──────────┘ ┌───────────┐ └──────┤ └──────────┘

View File

@ -37,11 +37,11 @@
: 1┌───────────────┐ │ ┌─────────────┐ : 1┌───────────────┐ │ ┌─────────────┐
┌-----------┤ FMouseControl │ ├────┤ FTimerEvent │ ┌-----------┤ FMouseControl │ ├────┤ FTimerEvent │
: └───────────────┘ │ └─────────────┘ : └───────────────┘ │ └─────────────┘
: 1┌─────────┐ │ : 1┌─────────┐ │ ┌──────┐ ┌─────────┐
┌-----------┤ FSystem │ │ ┌-----------┤ FSystem │ │ │ FLog │◄──┤ FLogger │
: └─────────┘ │ : └─────────┘ │ └──┬───┘ └─────────┘
: *┌─────────┐ │ : *┌─────────┐ │ :1
: ┌--------┤ FString │ │ ┌─────────────┐ : ┌--------┤ FString │ │ ┌─────────────┐
: : └─────────┘ │ ┌────┤ FApplication │ : : └─────────┘ │ ┌────┤ FApplication │
: : *┌────────┐ │ │ └──────────────┘ : : *┌────────┐ │ │ └──────────────┘
: ┌--------┤ FPoint │ │ │ ┌────────┐ : ┌--------┤ FPoint │ │ │ ┌────────┐
@ -61,11 +61,11 @@
│ FVTerm │◄──┐ :1 │ └──────────────┘ │ └──────────────┘ │ FVTerm │◄──┐ :1 │ └──────────────┘ │ └──────────────┘
└────────┘ │ ┌────┴────┐ │ ┌───────────────┐ │ ┌───────────┐ └────────┘ │ ┌────┴────┐ │ ┌───────────────┐ │ ┌───────────┐
├────┤ FWidget │◄───────┼────┤ FToggleButton │◄─┼──┤ FCheckBox │ ├────┤ FWidget │◄───────┼────┤ FToggleButton │◄─┼──┤ FCheckBox │
┌─────────┐ │ └────────┘ │ └───────────────┘ │ └───────────┘ ┌─────────┐ │ └────────┘ │ └───────────────┘ │ └───────────┘
│ FObject │◄──┘ │ ┌──────────────┐ │ ┌─────────┐ │ FObject │◄──┘ :1 │ ┌──────────────┐ │ ┌─────────┐
└─────────┘ ├────┤ FProgressbar │ └──┤ FSwitch │ └─────────┘ ┌──────┴────────┐ ├────┤ FProgressbar │ └──┤ FSwitch │
│ └──────────────┘ └─────────┘ │ FWidgetColors │ │ └──────────────┘ └─────────┘
│ ┌────────────┐ └───────────────┘ │ ┌────────────┐
├────┤ FScrollbar │ ├────┤ FScrollbar │
│ └────────────┘ │ └────────────┘
│ ┌───────────┐ │ ┌───────────┐
@ -93,9 +93,9 @@
└──┬──┬───┘ └─────────┘ │ ┌─────────────┐ └──┬──┬───┘ └─────────┘ │ ┌─────────────┐
▲ ▲ └──┤ FMessageBox │ ▲ ▲ └──┤ FMessageBox │
│ │ └─────────────┘ │ │ └─────────────┘
│ │ ┌──────────┐ │ │ ┌──────────┐ ┌────────────────┐
│ └──────┤ FToolTip │ │ └──────┤ FToolTip │◄─┤ FBusyIndicator │
│ └──────────┘ │ └──────────┘ └────────────────┘
└───────────────┐ ┌──────────┐ └───────────────┐ ┌──────────┐
│ ┌───┤ FMenuBar │ │ ┌───┤ FMenuBar │
┌───────────┐ └──────┤ └──────────┘ ┌───────────┐ └──────┤ └──────────┘

View File

@ -15,6 +15,7 @@ noinst_PROGRAMS = \
fullwidth-character \ fullwidth-character \
7segment \ 7segment \
choice \ choice \
busy \
listbox \ listbox \
listview \ listview \
checklist \ checklist \
@ -44,6 +45,7 @@ event_log_SOURCES = event-log.cpp
fullwidth_character_SOURCES = fullwidth-character.cpp fullwidth_character_SOURCES = fullwidth-character.cpp
7segment_SOURCES = 7segment.cpp 7segment_SOURCES = 7segment.cpp
choice_SOURCES = choice.cpp choice_SOURCES = choice.cpp
busy_SOURCES = busy.cpp
listbox_SOURCES = listbox.cpp listbox_SOURCES = listbox.cpp
listview_SOURCES = listview.cpp listview_SOURCES = listview.cpp
checklist_SOURCES = checklist.cpp checklist_SOURCES = checklist.cpp

210
examples/busy Executable file
View File

@ -0,0 +1,210 @@
#! /bin/bash
# busy - temporary wrapper script for .libs/busy
# Generated by libtool (GNU libtool) 2.4.6 Debian-2.4.6-2
#
# The busy program cannot be directly executed until all the libtool
# libraries that it depends on are installed.
#
# This wrapper script should never be moved out of the build directory.
# If it is, it will not operate correctly.
# Sed substitution that helps us do robust quoting. It backslashifies
# metacharacters that are still active within double-quoted strings.
sed_quote_subst='s|\([`"$\\]\)|\\\1|g'
# Be Bourne compatible
if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
emulate sh
NULLCMD=:
# Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
# is contrary to our usage. Disable this feature.
alias -g '${1+"$@"}'='"$@"'
setopt NO_GLOB_SUBST
else
case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac
fi
BIN_SH=xpg4; export BIN_SH # for Tru64
DUALCASE=1; export DUALCASE # for MKS sh
# The HP-UX ksh and POSIX shell print the target directory to stdout
# if CDPATH is set.
(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
relink_command=""
# This environment variable determines our operation mode.
if test "$libtool_install_magic" = "%%%MAGIC variable%%%"; then
# install mode needs the following variables:
generated_by_libtool_version='2.4.6'
notinst_deplibs=' /usr/local/src/MyProgs/finalcut/src/.libs/libfinal.la'
else
# When we are sourced in execute mode, $file and $ECHO are already set.
if test "$libtool_execute_magic" != "%%%MAGIC variable%%%"; then
file="$0"
# A function that is used when there is no print builtin or printf.
func_fallback_echo ()
{
eval 'cat <<_LTECHO_EOF
$1
_LTECHO_EOF'
}
ECHO="printf %s\\n"
fi
# Very basic option parsing. These options are (a) specific to
# the libtool wrapper, (b) are identical between the wrapper
# /script/ and the wrapper /executable/ that is used only on
# windows platforms, and (c) all begin with the string --lt-
# (application programs are unlikely to have options that match
# this pattern).
#
# There are only two supported options: --lt-debug and
# --lt-dump-script. There is, deliberately, no --lt-help.
#
# The first argument to this parsing function should be the
# script's ../libtool value, followed by no.
lt_option_debug=
func_parse_lt_options ()
{
lt_script_arg0=$0
shift
for lt_opt
do
case "$lt_opt" in
--lt-debug) lt_option_debug=1 ;;
--lt-dump-script)
lt_dump_D=`$ECHO "X$lt_script_arg0" | /bin/sed -e 's/^X//' -e 's%/[^/]*$%%'`
test "X$lt_dump_D" = "X$lt_script_arg0" && lt_dump_D=.
lt_dump_F=`$ECHO "X$lt_script_arg0" | /bin/sed -e 's/^X//' -e 's%^.*/%%'`
cat "$lt_dump_D/$lt_dump_F"
exit 0
;;
--lt-*)
$ECHO "Unrecognized --lt- option: '$lt_opt'" 1>&2
exit 1
;;
esac
done
# Print the debug banner immediately:
if test -n "$lt_option_debug"; then
echo "busy:busy:$LINENO: libtool wrapper (GNU libtool) 2.4.6 Debian-2.4.6-2" 1>&2
fi
}
# Used when --lt-debug. Prints its arguments to stdout
# (redirection is the responsibility of the caller)
func_lt_dump_args ()
{
lt_dump_args_N=1;
for lt_arg
do
$ECHO "busy:busy:$LINENO: newargv[$lt_dump_args_N]: $lt_arg"
lt_dump_args_N=`expr $lt_dump_args_N + 1`
done
}
# Core function for launching the target application
func_exec_program_core ()
{
if test -n "$lt_option_debug"; then
$ECHO "busy:busy:$LINENO: newargv[0]: $progdir/$program" 1>&2
func_lt_dump_args ${1+"$@"} 1>&2
fi
exec "$progdir/$program" ${1+"$@"}
$ECHO "$0: cannot exec $program $*" 1>&2
exit 1
}
# A function to encapsulate launching the target application
# Strips options in the --lt-* namespace from $@ and
# launches target application with the remaining arguments.
func_exec_program ()
{
case " $* " in
*\ --lt-*)
for lt_wr_arg
do
case $lt_wr_arg in
--lt-*) ;;
*) set x "$@" "$lt_wr_arg"; shift;;
esac
shift
done ;;
esac
func_exec_program_core ${1+"$@"}
}
# Parse options
func_parse_lt_options "$0" ${1+"$@"}
# Find the directory that this script lives in.
thisdir=`$ECHO "$file" | /bin/sed 's%/[^/]*$%%'`
test "x$thisdir" = "x$file" && thisdir=.
# Follow symbolic links until we get to the real thisdir.
file=`ls -ld "$file" | /bin/sed -n 's/.*-> //p'`
while test -n "$file"; do
destdir=`$ECHO "$file" | /bin/sed 's%/[^/]*$%%'`
# If there was a directory component, then change thisdir.
if test "x$destdir" != "x$file"; then
case "$destdir" in
[\\/]* | [A-Za-z]:[\\/]*) thisdir="$destdir" ;;
*) thisdir="$thisdir/$destdir" ;;
esac
fi
file=`$ECHO "$file" | /bin/sed 's%^.*/%%'`
file=`ls -ld "$thisdir/$file" | /bin/sed -n 's/.*-> //p'`
done
# Usually 'no', except on cygwin/mingw when embedded into
# the cwrapper.
WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=no
if test "$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR" = "yes"; then
# special case for '.'
if test "$thisdir" = "."; then
thisdir=`pwd`
fi
# remove .libs from thisdir
case "$thisdir" in
*[\\/].libs ) thisdir=`$ECHO "$thisdir" | /bin/sed 's%[\\/][^\\/]*$%%'` ;;
.libs ) thisdir=. ;;
esac
fi
# Try to get the absolute directory name.
absdir=`cd "$thisdir" && pwd`
test -n "$absdir" && thisdir="$absdir"
program='busy'
progdir="$thisdir/.libs"
if test -f "$progdir/$program"; then
# Add our own library path to LD_LIBRARY_PATH
LD_LIBRARY_PATH="/usr/local/src/MyProgs/finalcut/src/.libs:$LD_LIBRARY_PATH"
# Some systems cannot cope with colon-terminated LD_LIBRARY_PATH
# The second colon is a workaround for a bug in BeOS R4 sed
LD_LIBRARY_PATH=`$ECHO "$LD_LIBRARY_PATH" | /bin/sed 's/::*$//'`
export LD_LIBRARY_PATH
if test "$libtool_execute_magic" != "%%%MAGIC variable%%%"; then
# Run the actual program with our arguments.
func_exec_program ${1+"$@"}
fi
else
# The program doesn't exist.
$ECHO "$0: error: '$progdir/$program' does not exist" 1>&2
$ECHO "This script is just a wrapper for $program." 1>&2
$ECHO "See the libtool documentation for more information." 1>&2
exit 1
fi
fi

128
examples/busy.cpp Normal file
View File

@ -0,0 +1,128 @@
/***********************************************************************
* busy.cpp - Shows the use of the FBusyIndicator *
* *
* This file is part of the Final Cut widget toolkit *
* *
* Copyright 2020 Markus Gans *
* *
* The Final Cut is free software; you can redistribute it and/or *
* modify it under the terms of the GNU Lesser General Public License *
* as published by the Free Software Foundation; either version 3 of *
* the License, or (at your option) any later version. *
* *
* The Final Cut 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 Lesser General Public License for more details. *
* *
* You should have received a copy of the GNU Lesser General Public *
* License along with this program. If not, see *
* <http://www.gnu.org/licenses/>. *
***********************************************************************/
#include <final/final.h>
using finalcut::FPoint;
using finalcut::FRect;
using finalcut::FSize;
//----------------------------------------------------------------------
// class Dialog
//----------------------------------------------------------------------
class Dialog final : public finalcut::FDialog
{
public:
explicit Dialog (FWidget* parent = nullptr);
private:
void adjustSize() override;
// Event handler
void onTimer (finalcut::FTimerEvent*) override;
// Callback method
void cb_start (const finalcut::FWidget*, const FDataPtr);
// Data members
finalcut::FSpinBox seconds{this};
finalcut::FButton start{"&Start", this};
finalcut::FButton quit{"&Quit", this};
finalcut::FBusyIndicator busy_indicator{this};
};
//----------------------------------------------------------------------
Dialog::Dialog (FWidget* parent)
: finalcut::FDialog{parent}
{
setText ("Dialog");
finalcut::FDialog::setGeometry (FPoint{26, 5}, FSize{28, 10});
seconds.setGeometry (FPoint{10, 2}, FSize{10, 1});
seconds.setLabelText ("Seconds");
seconds.setRange (0, 60);
seconds.setValue (3);
start.setGeometry (FPoint{2, 6}, FSize{10, 1});
quit.setGeometry (FPoint{15, 6}, FSize{10, 1});
// Add button callbacks
seconds.addCallback
(
"activate",
F_METHOD_CALLBACK (this, &Dialog::cb_start)
);
start.addCallback
(
"clicked",
F_METHOD_CALLBACK (this, &Dialog::cb_start)
);
quit.addCallback
(
"clicked",
F_METHOD_CALLBACK (this, &finalcut::FApplication::cb_exitApp)
);
}
//----------------------------------------------------------------------
void Dialog::adjustSize()
{
int X = int((getDesktopWidth() - getWidth()) / 2);
const int Y = 5;
if ( X < 1 )
X = 1;
setPos ({X, Y}, false);
finalcut::FDialog::adjustSize();
}
//----------------------------------------------------------------------
void Dialog::onTimer (finalcut::FTimerEvent*)
{
delOwnTimer();
busy_indicator.stop();
}
//----------------------------------------------------------------------
void Dialog::cb_start (const finalcut::FWidget*, const FDataPtr)
{
if ( seconds.getValue() < 1 )
return;
busy_indicator.start();
addTimer(seconds.getValue() * 1000);
}
//----------------------------------------------------------------------
// main part
//----------------------------------------------------------------------
int main (int argc, char* argv[])
{
finalcut::FApplication app(argc, argv);
Dialog dialog(&app);
finalcut::FWidget::setMainWidget(&dialog);
dialog.show();
return app.exec();
}

View File

@ -1042,8 +1042,7 @@ void MyDialog::cb_setInput (finalcut::FWidget* widget, FDataPtr data)
int main (int argc, char* argv[]) int main (int argc, char* argv[])
{ {
const finalcut::FString ver{F_VERSION}; // Library version const finalcut::FString ver{F_VERSION}; // Library version
const finalcut::FString title { "The FINAL CUT " const finalcut::FString title { "The FINAL CUT " + ver
+ ver
+ " (C) 2020 by Markus Gans" }; + " (C) 2020 by Markus Gans" };
// Create the application object app // Create the application object app

View File

@ -44,6 +44,7 @@ libfinal_la_SOURCES = \
fwindow.cpp \ fwindow.cpp \
fmessagebox.cpp \ fmessagebox.cpp \
ftooltip.cpp \ ftooltip.cpp \
fbusyindicator.cpp \
ffiledialog.cpp \ ffiledialog.cpp \
fkey_map.cpp \ fkey_map.cpp \
fcharmap.cpp \ fcharmap.cpp \
@ -115,6 +116,7 @@ finalcutinclude_HEADERS = \
include/final/fmenulist.h \ include/final/fmenulist.h \
include/final/fmessagebox.h \ include/final/fmessagebox.h \
include/final/ftooltip.h \ include/final/ftooltip.h \
include/final/fbusyindicator.h \
include/final/fobject.h \ include/final/fobject.h \
include/final/fpoint.h \ include/final/fpoint.h \
include/final/fsize.h \ include/final/fsize.h \

View File

@ -34,6 +34,7 @@ INCLUDE_HEADERS = \
fcheckmenuitem.h \ fcheckmenuitem.h \
fmessagebox.h \ fmessagebox.h \
ftooltip.h \ ftooltip.h \
fbusyindicator.h \
sgr_optimizer.h \ sgr_optimizer.h \
foptiattr.h \ foptiattr.h \
foptimove.h \ foptimove.h \
@ -118,6 +119,7 @@ OBJS = \
fcombobox.o \ fcombobox.o \
fmessagebox.o \ fmessagebox.o \
ftooltip.o \ ftooltip.o \
fbusyindicator.o \
ffiledialog.o \ ffiledialog.o \
fkey_map.o \ fkey_map.o \
fcharmap.o \ fcharmap.o \

View File

@ -34,6 +34,7 @@ INCLUDE_HEADERS = \
fcheckmenuitem.h \ fcheckmenuitem.h \
fmessagebox.h \ fmessagebox.h \
ftooltip.h \ ftooltip.h \
fbusyindicator.h \
sgr_optimizer.h \ sgr_optimizer.h \
foptiattr.h \ foptiattr.h \
foptimove.h \ foptimove.h \
@ -118,6 +119,7 @@ OBJS = \
fcombobox.o \ fcombobox.o \
fmessagebox.o \ fmessagebox.o \
ftooltip.o \ ftooltip.o \
fbusyindicator.o \
ffiledialog.o \ ffiledialog.o \
fkey_map.o \ fkey_map.o \
fcharmap.o \ fcharmap.o \

View File

@ -399,13 +399,13 @@ void FApplication::setTerminalEncoding (const FString& enc_str)
//---------------------------------------------------------------------- //----------------------------------------------------------------------
void FApplication::setLogFile (const FString& filename) void FApplication::setLogFile (const FString& filename)
{ {
// Get the global logger object
FLog& log = *FApplication::getLog();
auto& log_stream = getStartOptions().logfile_stream; auto& log_stream = getStartOptions().logfile_stream;
log_stream.open(filename, std::ofstream::out); log_stream.open(filename, std::ofstream::out);
if ( log_stream.is_open() ) if ( log_stream.is_open() )
{ {
// Get the global logger object
FLog& log = *FApplication::getLog();
log.setOutputStream(log_stream); log.setOutputStream(log_stream);
log.enableTimestamp(); log.enableTimestamp();
log.setLineEnding (finalcut::FLog::LF); log.setLineEnding (finalcut::FLog::LF);
@ -414,7 +414,7 @@ void FApplication::setLogFile (const FString& filename)
{ {
auto ftermdata = FTerm::getFTermData(); auto ftermdata = FTerm::getFTermData();
ftermdata->setExitMessage ( "Could not open log file \"" ftermdata->setExitMessage ( "Could not open log file \""
+ FString(optarg) + "\"" ); + filename + "\"" );
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
} }

120
src/fbusyindicator.cpp Normal file
View File

@ -0,0 +1,120 @@
/***********************************************************************
* fbusyindicator.cpp - Shows background activity *
* *
* This file is part of the Final Cut widget toolkit *
* *
* Copyright 2020 Markus Gans *
* *
* The Final Cut is free software; you can redistribute it and/or *
* modify it under the terms of the GNU Lesser General Public License *
* as published by the Free Software Foundation; either version 3 of *
* the License, or (at your option) any later version. *
* *
* The Final Cut 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 Lesser General Public License for more details. *
* *
* You should have received a copy of the GNU Lesser General Public *
* License along with this program. If not, see *
* <http://www.gnu.org/licenses/>. *
***********************************************************************/
#include "final/fbusyindicator.h"
namespace finalcut
{
//----------------------------------------------------------------------
// class FBusyIndicator
//----------------------------------------------------------------------
// constructors and destructor
//----------------------------------------------------------------------
FBusyIndicator::FBusyIndicator (FWidget* parent)
: FToolTip{parent}
{
FToolTip::hide();
createIndicatorText();
}
//----------------------------------------------------------------------
FBusyIndicator::~FBusyIndicator() // destructor
{ }
// public methods of FBusyIndicator
//----------------------------------------------------------------------
void FBusyIndicator::start()
{
running = true;
show();
updateTerminal();
flush();
addTimer(TIMER);
}
//----------------------------------------------------------------------
void FBusyIndicator::stop()
{
delOwnTimer();
running = false;
hide();
updateTerminal();
flush();
}
// private methods of FBusyIndicator
//----------------------------------------------------------------------
void FBusyIndicator::createIndicatorText()
{
FString line[4]{};
if ( FTerm::getEncoding() == fc::UTF8 )
{
const wchar_t (&p)[8] = uni_pattern;
line[0] << " " << p[7] << " " << p[0] << " \n";
line[1] << " " << p[6] << " " << p[1] << " \n";
line[2] << " " << p[5] << " " << p[2] << " \n";
line[3] << " " << p[4] << " " << p[3] << " ";
}
else
{
const char (&p)[8] = pattern;
line[0] << " " << p[7] << " " << p[0] << " \n";
line[1] << " " << p[6] << " " << p[1] << " \n";
line[2] << " " << p[5] << " " << p[2] << " \n";
line[3] << " " << p[4] << " " << p[3] << " ";
}
FString txt{line[0] + line[1] + line[2] + line[3]};
FToolTip::setText(txt);
}
//----------------------------------------------------------------------
void FBusyIndicator::onTimer (finalcut::FTimerEvent*)
{
// Rotate pattern
if ( FTerm::getEncoding() == fc::UTF8 )
{
const wchar_t last = uni_pattern[7];
std::memmove(uni_pattern + 1, uni_pattern , sizeof(wchar_t) * 7);
uni_pattern[0] = last;
}
else
{
const char last = pattern[7];
std::memmove(pattern + 1, pattern , sizeof(char) * 7);
pattern[0] = last;
}
// Redraw the rotated pattern
createIndicatorText();
redraw();
updateTerminal();
flush();
}
} // namespace finalcut

View File

@ -317,6 +317,11 @@ void FSpinBox::init()
input_field.unsetShadow(); input_field.unsetShadow();
input_field << value; input_field << value;
input_field.addCallback input_field.addCallback
(
"activate",
F_METHOD_CALLBACK (this, &FSpinBox::cb_inputFieldActivate)
);
input_field.addCallback
( (
"changed", "changed",
F_METHOD_CALLBACK (this, &FSpinBox::cb_inputFieldChange) F_METHOD_CALLBACK (this, &FSpinBox::cb_inputFieldChange)
@ -392,6 +397,12 @@ inline void FSpinBox::decreaseValue()
delOwnTimer(); delOwnTimer();
} }
//----------------------------------------------------------------------
void FSpinBox::processActivate()
{
emitCallback("activate");
}
//---------------------------------------------------------------------- //----------------------------------------------------------------------
void FSpinBox::processChanged() void FSpinBox::processChanged()
{ {
@ -416,6 +427,12 @@ void FSpinBox::forceFocus()
getStatusBar()->drawMessage(); getStatusBar()->drawMessage();
} }
//----------------------------------------------------------------------
void FSpinBox::cb_inputFieldActivate (finalcut::FWidget*, const FDataPtr)
{
processActivate();
}
//---------------------------------------------------------------------- //----------------------------------------------------------------------
void FSpinBox::cb_inputFieldChange (finalcut::FWidget* w, const FDataPtr) void FSpinBox::cb_inputFieldChange (finalcut::FWidget* w, const FDataPtr)
{ {

View File

@ -282,6 +282,8 @@ void FWindow::hide()
getVWin()->visible = false; getVWin()->visible = false;
FWidget::hide(); FWidget::hide();
const auto& t_geometry = getTermGeometryWithShadow();
restoreVTerm (t_geometry);
} }
//---------------------------------------------------------------------- //----------------------------------------------------------------------

View File

@ -35,9 +35,13 @@
* *
* *
* *
* 1 * * 1 1
* FApplication -- - - - FEvent * FApplication -- - - - FLog
* : * :
* :
* : *
* :- - - - FEvent
* :
* : * :
* : * * : *
* :- - - - FPoint * :- - - - FPoint

View File

@ -0,0 +1,128 @@
/***********************************************************************
* fbusyindicator.h - Shows background activity *
* *
* This file is part of the Final Cut widget toolkit *
* *
* Copyright 2020 Markus Gans *
* *
* The Final Cut is free software; you can redistribute it and/or *
* modify it under the terms of the GNU Lesser General Public License *
* as published by the Free Software Foundation; either version 3 of *
* the License, or (at your option) any later version. *
* *
* The Final Cut 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 Lesser General Public License for more details. *
* *
* You should have received a copy of the GNU Lesser General Public *
* License along with this program. If not, see *
* <http://www.gnu.org/licenses/>. *
***********************************************************************/
/* Inheritance diagram
*
*
*
* FVTerm FObject
*
*
*
*
*
*
* FWidget
*
*
*
*
* FWindow
*
*
*
*
* FToolTip
*
*
*
*
* FBusyIndicator
*
*/
#ifndef FBUSYINDICATOR_H
#define FBUSYINDICATOR_H
#if !defined (USE_FINAL_H) && !defined (COMPILE_FINAL_CUT)
#error "Only <final/final.h> can be included directly."
#endif
#include "final/ftooltip.h"
namespace finalcut
{
//----------------------------------------------------------------------
// class FBusyIndicator
//----------------------------------------------------------------------
class FBusyIndicator : public FToolTip
{
public:
// Constructor
explicit FBusyIndicator (FWidget* = nullptr);
// Disable copy constructor
FBusyIndicator (const FBusyIndicator&) = delete;
// Destructor
~FBusyIndicator();
// Disable copy assignment operator (=)
FBusyIndicator& operator = (const FBusyIndicator&) = delete;
// Accessors
const FString getClassName() const override;
// Inquiries
bool isRunning();
// Methods
void start();
void stop();
private:
// Constants
static constexpr std::size_t TIMER = 200;
// Methods
void createIndicatorText();
// Event handler
void onTimer (finalcut::FTimerEvent*) override;
// Callback methods
// Data members
wchar_t uni_pattern[8]{L' ', L' ', L'·', L'·', L'', L'', L'', L''};
char pattern[8]{L' ', L' ', L'.', L'.', L'+', L'+', L'#', L'#'};
bool running{false};
};
// FBusyIndicator inline functions
//----------------------------------------------------------------------
inline const FString FBusyIndicator::getClassName() const
{ return "FBusyIndicator"; }
//----------------------------------------------------------------------
inline bool FBusyIndicator::isRunning()
{
return running;
}
} // namespace finalcut
#endif // FBUSYINDICATOR_H

View File

@ -159,6 +159,18 @@ class default16ColorPalette final : public FColorPalette
inline const FString default16ColorPalette::getClassName() const inline const FString default16ColorPalette::getClassName() const
{ return "default16ColorPalette"; } { return "default16ColorPalette"; }
/* Inheritance diagram
*
*
*
* FColorPalette
*
*
*
*
* default16DarkColorPalette
*
*/
//---------------------------------------------------------------------- //----------------------------------------------------------------------
// class default16DarkColorPalette // class default16DarkColorPalette

View File

@ -32,6 +32,7 @@
#include <final/fapplication.h> #include <final/fapplication.h>
#include <final/fbuttongroup.h> #include <final/fbuttongroup.h>
#include <final/fbutton.h> #include <final/fbutton.h>
#include <final/fbusyindicator.h>
#include <final/fc.h> #include <final/fc.h>
#include <final/fobject.h> #include <final/fobject.h>
#include <final/fcolorpalette.h> #include <final/fcolorpalette.h>

View File

@ -135,10 +135,12 @@ class FSpinBox : public FWidget
void updateInputField(); void updateInputField();
void increaseValue(); void increaseValue();
void decreaseValue(); void decreaseValue();
void processActivate();
void processChanged(); void processChanged();
void forceFocus(); void forceFocus();
// Callback methods // Callback methods
void cb_inputFieldActivate (finalcut::FWidget*, const FDataPtr);
void cb_inputFieldChange (finalcut::FWidget*, const FDataPtr); void cb_inputFieldChange (finalcut::FWidget*, const FDataPtr);
// Data members // Data members

View File

@ -66,7 +66,7 @@ namespace finalcut
class FToolTip : public FWindow class FToolTip : public FWindow
{ {
public: public:
// Constructor // Constructors
explicit FToolTip (FWidget* = nullptr); explicit FToolTip (FWidget* = nullptr);
explicit FToolTip (const FString&, FWidget* = nullptr); explicit FToolTip (const FString&, FWidget* = nullptr);

View File

@ -37,6 +37,10 @@
* : 1 * : 1
* :- - - - FMenuBar * :- - - - FMenuBar
* : * :
*
* : 1
* :- - - - FWidgetColors
* :
* : * :
* : * * : *
* :- - - - FString * :- - - - FString