2017-11-04 07:03:53 +01:00
|
|
|
/***********************************************************************
|
|
|
|
* fwidget.cpp - Intermediate base class for all widget objects *
|
|
|
|
* *
|
|
|
|
* This file is part of the Final Cut widget toolkit *
|
|
|
|
* *
|
2018-01-21 16:25:19 +01:00
|
|
|
* Copyright 2015-2018 Markus Gans *
|
2017-11-04 07:03:53 +01:00
|
|
|
* *
|
|
|
|
* 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/>. *
|
|
|
|
***********************************************************************/
|
2015-05-23 13:35:12 +02:00
|
|
|
|
2017-09-11 03:06:02 +02:00
|
|
|
#include <vector>
|
|
|
|
|
2017-09-17 21:32:46 +02:00
|
|
|
#include "final/fapplication.h"
|
|
|
|
#include "final/fmenubar.h"
|
|
|
|
#include "final/fstatusbar.h"
|
|
|
|
#include "final/fwidget.h"
|
2016-10-11 04:57:36 +02:00
|
|
|
|
2018-09-20 23:59:01 +02:00
|
|
|
namespace finalcut
|
|
|
|
{
|
2015-05-23 13:35:12 +02:00
|
|
|
|
|
|
|
// global FWidget object
|
|
|
|
static FWidget* rootObject = 0;
|
|
|
|
|
|
|
|
// static class attributes
|
2018-10-21 21:06:52 +02:00
|
|
|
FStatusBar* FWidget::statusbar = 0;
|
|
|
|
FMenuBar* FWidget::menubar = 0;
|
|
|
|
FWidget* FWidget::show_root_widget = 0;
|
|
|
|
FWidget* FWidget::redraw_root_widget = 0;
|
|
|
|
FWidget::widgetList* FWidget::window_list = 0;
|
|
|
|
FWidget::widgetList* FWidget::dialog_list = 0;
|
|
|
|
FWidget::widgetList* FWidget::always_on_top_list = 0;
|
|
|
|
FWidget::widgetList* FWidget::close_widget = 0;
|
|
|
|
FWidgetColors FWidget::wc;
|
|
|
|
bool FWidget::init_desktop;
|
|
|
|
bool FWidget::hideable;
|
|
|
|
uInt FWidget::modal_dialogs;
|
2016-11-12 22:59:48 +01:00
|
|
|
|
2015-05-23 13:35:12 +02:00
|
|
|
|
|
|
|
//----------------------------------------------------------------------
|
|
|
|
// class FWidget
|
|
|
|
//----------------------------------------------------------------------
|
|
|
|
|
|
|
|
// constructors and destructor
|
|
|
|
//----------------------------------------------------------------------
|
2017-03-26 20:40:04 +02:00
|
|
|
FWidget::FWidget (FWidget* parent, bool disable_alt_screen)
|
2017-10-30 20:29:00 +01:00
|
|
|
: FVTerm(bool(! parent), disable_alt_screen)
|
|
|
|
, FObject(parent)
|
2015-09-22 04:18:20 +02:00
|
|
|
{
|
2018-11-04 23:00:06 +01:00
|
|
|
// init bit field with 0
|
|
|
|
memset (&flags, 0, sizeof(flags));
|
|
|
|
|
2018-11-05 23:19:03 +01:00
|
|
|
flags.active = true; // Enable widget by default
|
|
|
|
flags.visible = true; // A widget is visible by default
|
|
|
|
flags.focusable = true; // A widget is focusable by default
|
|
|
|
flags.visible_cursor = true; // A widget has a visible cursor by default
|
|
|
|
widget_object = true; // This FObject is a widget
|
2017-06-11 17:47:50 +02:00
|
|
|
|
2015-11-05 23:25:21 +01:00
|
|
|
if ( ! parent )
|
2015-05-23 13:35:12 +02:00
|
|
|
{
|
|
|
|
assert ( ! rootObject
|
2017-11-26 22:37:18 +01:00
|
|
|
&& "FTerm: There should be only one root object" );
|
2015-05-23 13:35:12 +02:00
|
|
|
|
|
|
|
rootObject = this;
|
|
|
|
show_root_widget = 0;
|
|
|
|
redraw_root_widget = 0;
|
|
|
|
modal_dialogs = 0;
|
|
|
|
statusbar = 0;
|
|
|
|
init();
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2018-11-05 23:19:03 +01:00
|
|
|
flags.visible_cursor = ! hideable;
|
2016-09-25 23:53:48 +02:00
|
|
|
offset = parent->client_offset;
|
2018-10-14 06:25:33 +02:00
|
|
|
double_flatline_mask.top.resize (getWidth(), false);
|
|
|
|
double_flatline_mask.right.resize (getHeight(), false);
|
|
|
|
double_flatline_mask.bottom.resize (getWidth(), false);
|
|
|
|
double_flatline_mask.left.resize (getHeight(), false);
|
2015-05-23 13:35:12 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
//----------------------------------------------------------------------
|
|
|
|
FWidget::~FWidget() // destructor
|
|
|
|
{
|
|
|
|
processDestroy();
|
2017-11-03 22:57:40 +01:00
|
|
|
delCallbacks();
|
2015-05-23 13:35:12 +02:00
|
|
|
FApplication::removeQueuedEvent(this);
|
|
|
|
|
2016-07-31 20:25:25 +02:00
|
|
|
// unset clicked widget
|
2015-05-23 13:35:12 +02:00
|
|
|
if ( this == getClickedWidget() )
|
|
|
|
setClickedWidget(0);
|
|
|
|
|
2016-07-31 20:25:25 +02:00
|
|
|
// unset the local window widget focus
|
2018-11-04 23:00:06 +01:00
|
|
|
if ( flags.focus )
|
2016-07-31 20:25:25 +02:00
|
|
|
{
|
2016-10-02 21:26:25 +02:00
|
|
|
if ( FWindow* window = FWindow::getWindowWidget(this) )
|
2016-07-31 20:25:25 +02:00
|
|
|
window->setWindowFocusWidget(0);
|
|
|
|
}
|
|
|
|
|
|
|
|
// unset the global widget focus
|
2015-05-23 13:35:12 +02:00
|
|
|
if ( this == FWidget::getFocusWidget() )
|
|
|
|
FWidget::setFocusWidget(0);
|
|
|
|
|
2016-07-31 20:25:25 +02:00
|
|
|
// unset main widget
|
2015-05-23 13:35:12 +02:00
|
|
|
if ( this == getMainWidget() )
|
|
|
|
{
|
|
|
|
setMainWidget(0);
|
|
|
|
quit();
|
|
|
|
}
|
|
|
|
|
2016-07-31 20:25:25 +02:00
|
|
|
// finish the program
|
2015-05-23 13:35:12 +02:00
|
|
|
if ( rootObject == this )
|
2017-09-17 01:50:41 +02:00
|
|
|
finish();
|
2015-05-23 13:35:12 +02:00
|
|
|
}
|
|
|
|
|
2016-11-02 00:37:58 +01:00
|
|
|
|
|
|
|
// public methods of FWidget
|
2015-05-23 13:35:12 +02:00
|
|
|
//----------------------------------------------------------------------
|
2016-11-02 00:37:58 +01:00
|
|
|
FWidget* FWidget::getRootWidget() const
|
2015-05-23 13:35:12 +02:00
|
|
|
{
|
2016-11-02 00:37:58 +01:00
|
|
|
FWidget* obj = const_cast<FWidget*>(this);
|
|
|
|
FWidget* p_obj = getParentWidget();
|
2016-09-25 23:53:48 +02:00
|
|
|
|
2016-11-02 00:37:58 +01:00
|
|
|
while ( ! obj->isRootWidget() && p_obj )
|
|
|
|
{
|
|
|
|
obj = p_obj;
|
|
|
|
p_obj = p_obj->getParentWidget();
|
|
|
|
}
|
2016-09-25 23:53:48 +02:00
|
|
|
|
2016-11-02 00:37:58 +01:00
|
|
|
return obj;
|
|
|
|
}
|
2015-06-21 23:27:10 +02:00
|
|
|
|
2017-06-11 17:47:50 +02:00
|
|
|
//----------------------------------------------------------------------
|
2017-06-14 01:06:48 +02:00
|
|
|
FWidget* FWidget::getParentWidget() const
|
2017-06-11 17:47:50 +02:00
|
|
|
{
|
|
|
|
FObject* p_obj = getParent();
|
|
|
|
|
|
|
|
if ( p_obj && p_obj->isWidget() )
|
|
|
|
return static_cast<FWidget*>(p_obj);
|
|
|
|
else
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2017-01-28 22:03:15 +01:00
|
|
|
//----------------------------------------------------------------------
|
2017-09-17 01:50:41 +02:00
|
|
|
FWidget* FWidget::getFirstFocusableWidget (FObjectList list)
|
2017-01-28 22:03:15 +01:00
|
|
|
{
|
2017-09-17 01:50:41 +02:00
|
|
|
if ( list.empty() )
|
2017-01-28 22:03:15 +01:00
|
|
|
return 0;
|
|
|
|
|
2017-09-17 01:50:41 +02:00
|
|
|
constFObjectIterator iter, last;
|
|
|
|
iter = list.begin();
|
|
|
|
last = list.end();
|
2017-01-28 22:03:15 +01:00
|
|
|
|
2017-09-17 01:50:41 +02:00
|
|
|
while ( iter != last )
|
2017-01-28 22:03:15 +01:00
|
|
|
{
|
2017-06-11 17:47:50 +02:00
|
|
|
if ( (*iter)->isWidget() )
|
|
|
|
{
|
|
|
|
FWidget* child = static_cast<FWidget*>(*iter);
|
2017-01-28 22:03:15 +01:00
|
|
|
|
2017-06-11 17:47:50 +02:00
|
|
|
if ( child->isEnabled() && child->acceptFocus() )
|
|
|
|
return child;
|
|
|
|
}
|
2017-01-28 22:03:15 +01:00
|
|
|
|
|
|
|
++iter;
|
|
|
|
}
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
//----------------------------------------------------------------------
|
2017-09-17 01:50:41 +02:00
|
|
|
FWidget* FWidget::getLastFocusableWidget (FObjectList list)
|
2017-01-28 22:03:15 +01:00
|
|
|
{
|
2017-09-17 01:50:41 +02:00
|
|
|
if ( list.empty() )
|
2017-01-28 22:03:15 +01:00
|
|
|
return 0;
|
|
|
|
|
2017-09-17 01:50:41 +02:00
|
|
|
constFObjectIterator iter, first;
|
|
|
|
first = list.begin();
|
|
|
|
iter = list.end();
|
2017-01-28 22:03:15 +01:00
|
|
|
|
|
|
|
do
|
|
|
|
{
|
|
|
|
--iter;
|
2017-06-11 17:47:50 +02:00
|
|
|
|
|
|
|
if ( ! (*iter)->isWidget() )
|
|
|
|
continue;
|
|
|
|
|
2017-01-28 22:03:15 +01:00
|
|
|
FWidget* child = static_cast<FWidget*>(*iter);
|
|
|
|
|
|
|
|
if ( child->isEnabled() && child->acceptFocus() )
|
|
|
|
return child;
|
|
|
|
}
|
2017-09-17 01:50:41 +02:00
|
|
|
while ( iter != first );
|
2017-01-28 22:03:15 +01:00
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2016-11-02 00:37:58 +01:00
|
|
|
//----------------------------------------------------------------------
|
|
|
|
FPoint FWidget::getPrintPos()
|
|
|
|
{
|
|
|
|
const FPoint cur = getPrintCursor();
|
|
|
|
int cx = cur.getX();
|
|
|
|
int cy = cur.getY();
|
|
|
|
return FPoint ( cx - offset.getX1() - getX() + 1
|
|
|
|
, cy - offset.getY1() - getY() + 1 );
|
|
|
|
}
|
|
|
|
|
|
|
|
//----------------------------------------------------------------------
|
|
|
|
std::vector<bool>& FWidget::doubleFlatLine_ref (fc::sides side)
|
|
|
|
{
|
2016-12-18 23:34:11 +01:00
|
|
|
assert ( side == fc::top
|
2017-11-26 22:37:18 +01:00
|
|
|
|| side == fc::right
|
|
|
|
|| side == fc::bottom
|
|
|
|
|| side == fc::left );
|
2016-11-02 00:37:58 +01:00
|
|
|
|
|
|
|
switch ( side )
|
2016-07-14 23:55:22 +02:00
|
|
|
{
|
2016-11-02 00:37:58 +01:00
|
|
|
case fc::top:
|
|
|
|
return double_flatline_mask.top;
|
|
|
|
|
|
|
|
case fc::right:
|
|
|
|
return double_flatline_mask.right;
|
|
|
|
|
|
|
|
case fc::bottom:
|
|
|
|
return double_flatline_mask.bottom;
|
|
|
|
|
|
|
|
case fc::left:
|
|
|
|
return double_flatline_mask.left;
|
2016-07-14 23:55:22 +02:00
|
|
|
}
|
|
|
|
|
2016-11-02 00:37:58 +01:00
|
|
|
return double_flatline_mask.left;
|
|
|
|
}
|
|
|
|
|
|
|
|
//----------------------------------------------------------------------
|
|
|
|
void FWidget::setMainWidget (FWidget* obj)
|
|
|
|
{
|
2018-10-21 21:06:52 +02:00
|
|
|
main_widget = obj;
|
|
|
|
FWidget* app_object = FApplication::getApplicationObject();
|
2016-11-02 00:37:58 +01:00
|
|
|
|
2018-10-21 21:06:52 +02:00
|
|
|
if ( obj && app_object && ! getFocusWidget() )
|
|
|
|
app_object->focusFirstChild();
|
2016-11-02 00:37:58 +01:00
|
|
|
}
|
|
|
|
|
2017-06-05 16:11:25 +02:00
|
|
|
//----------------------------------------------------------------------
|
|
|
|
bool FWidget::setEnable (bool on)
|
2017-06-11 17:47:50 +02:00
|
|
|
{
|
2018-11-04 23:00:06 +01:00
|
|
|
return (flags.active = on);
|
2017-06-05 16:11:25 +02:00
|
|
|
}
|
|
|
|
|
2016-11-02 00:37:58 +01:00
|
|
|
//----------------------------------------------------------------------
|
|
|
|
bool FWidget::setFocus (bool on)
|
|
|
|
{
|
|
|
|
FWindow* window;
|
2017-01-26 00:31:07 +01:00
|
|
|
FWidget* last_focus;
|
2016-11-02 00:37:58 +01:00
|
|
|
|
2018-11-04 23:00:06 +01:00
|
|
|
if ( ! isEnabled() )
|
2016-11-02 00:37:58 +01:00
|
|
|
return false;
|
|
|
|
|
2018-11-04 23:00:06 +01:00
|
|
|
if ( flags.focus == on )
|
2016-11-02 00:37:58 +01:00
|
|
|
return true;
|
|
|
|
|
2017-01-26 00:31:07 +01:00
|
|
|
last_focus = FWidget::getFocusWidget();
|
|
|
|
|
2016-11-02 00:37:58 +01:00
|
|
|
// set widget focus
|
2018-11-04 23:00:06 +01:00
|
|
|
if ( on && ! flags.focus )
|
2016-10-01 23:18:49 +02:00
|
|
|
{
|
2016-11-02 00:37:58 +01:00
|
|
|
int focusable_children = numOfFocusableChildren();
|
|
|
|
|
2017-01-26 00:31:07 +01:00
|
|
|
if ( last_focus )
|
|
|
|
last_focus->unsetFocus();
|
2016-11-02 00:37:58 +01:00
|
|
|
|
|
|
|
if ( (!isDialogWidget() && focusable_children == 0)
|
2017-11-26 22:37:18 +01:00
|
|
|
|| (isDialogWidget() && focusable_children == 1) )
|
2016-11-02 00:37:58 +01:00
|
|
|
{
|
|
|
|
FWidget::setFocusWidget(this);
|
|
|
|
}
|
2016-10-01 23:18:49 +02:00
|
|
|
}
|
|
|
|
|
2016-11-02 00:37:58 +01:00
|
|
|
window = FWindow::getWindowWidget(this);
|
|
|
|
|
|
|
|
// set window focus
|
|
|
|
if ( on && window )
|
2015-05-23 13:35:12 +02:00
|
|
|
{
|
2016-11-02 00:37:58 +01:00
|
|
|
if ( ! window->isWindowActive() )
|
|
|
|
{
|
|
|
|
bool has_raised = window->raiseWindow();
|
|
|
|
FWindow::setActiveWindow(window);
|
|
|
|
|
|
|
|
if ( has_raised && window->isVisible() && window->isShown() )
|
|
|
|
window->redraw();
|
|
|
|
}
|
|
|
|
window->setWindowFocusWidget(this);
|
2015-05-23 13:35:12 +02:00
|
|
|
}
|
2016-11-02 00:37:58 +01:00
|
|
|
|
2018-11-04 23:00:06 +01:00
|
|
|
return (flags.focus = on);
|
2015-05-23 13:35:12 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
//----------------------------------------------------------------------
|
2016-11-02 00:37:58 +01:00
|
|
|
void FWidget::setColor ()
|
|
|
|
{
|
|
|
|
// Changes colors to the widget default colors
|
|
|
|
setColor (foreground_color, background_color);
|
|
|
|
}
|
2015-05-23 13:35:12 +02:00
|
|
|
|
|
|
|
//----------------------------------------------------------------------
|
2016-11-02 00:37:58 +01:00
|
|
|
void FWidget::setX (int x, bool adjust)
|
2015-05-23 13:35:12 +02:00
|
|
|
{
|
2016-11-02 00:37:58 +01:00
|
|
|
if ( getX() == x && wsize.getX() == x )
|
|
|
|
return;
|
2015-05-23 13:35:12 +02:00
|
|
|
|
2016-11-02 00:37:58 +01:00
|
|
|
if ( ! isWindowWidget() && x < 1 )
|
|
|
|
x = 1;
|
2015-05-23 13:35:12 +02:00
|
|
|
|
2016-11-02 00:37:58 +01:00
|
|
|
wsize.setX(x);
|
|
|
|
adjust_wsize.setX(x);
|
2015-05-23 13:35:12 +02:00
|
|
|
|
2016-11-02 00:37:58 +01:00
|
|
|
if ( adjust )
|
|
|
|
adjustSize();
|
2015-05-23 13:35:12 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
//----------------------------------------------------------------------
|
2016-11-02 00:37:58 +01:00
|
|
|
void FWidget::setY (int y, bool adjust)
|
2015-05-23 13:35:12 +02:00
|
|
|
{
|
2016-11-02 00:37:58 +01:00
|
|
|
if ( getY() == y && wsize.getY() == y )
|
|
|
|
return;
|
2016-08-21 21:27:44 +02:00
|
|
|
|
2016-11-02 00:37:58 +01:00
|
|
|
if ( ! isWindowWidget() && y < 1 )
|
|
|
|
y = 1;
|
2016-07-09 00:01:59 +02:00
|
|
|
|
2016-11-02 00:37:58 +01:00
|
|
|
wsize.setY(y);
|
|
|
|
adjust_wsize.setY(y);
|
|
|
|
|
|
|
|
if ( adjust )
|
|
|
|
adjustSize();
|
|
|
|
}
|
|
|
|
|
|
|
|
//----------------------------------------------------------------------
|
|
|
|
void FWidget::setPos (int x, int y, bool adjust)
|
|
|
|
{
|
2016-12-18 23:34:11 +01:00
|
|
|
if ( getX() == x && wsize.getX() == x
|
2017-11-26 22:37:18 +01:00
|
|
|
&& getY() == y && wsize.getY() == y )
|
2016-11-02 00:37:58 +01:00
|
|
|
{
|
|
|
|
return;
|
2015-05-23 13:35:12 +02:00
|
|
|
}
|
|
|
|
|
2016-09-25 23:53:48 +02:00
|
|
|
if ( ! isWindowWidget() )
|
2015-05-23 13:35:12 +02:00
|
|
|
{
|
2016-11-02 00:37:58 +01:00
|
|
|
if ( x < 1 )
|
|
|
|
x = 1;
|
2016-07-09 00:01:59 +02:00
|
|
|
|
2016-11-02 00:37:58 +01:00
|
|
|
if ( y < 1 )
|
|
|
|
y = 1;
|
|
|
|
}
|
2015-05-23 13:35:12 +02:00
|
|
|
|
2017-09-11 03:06:02 +02:00
|
|
|
wsize.setPos(x, y);
|
|
|
|
adjust_wsize.setPos(x, y);
|
2016-07-09 00:01:59 +02:00
|
|
|
|
2016-11-02 00:37:58 +01:00
|
|
|
if ( adjust )
|
|
|
|
adjustSize();
|
|
|
|
}
|
2015-05-23 13:35:12 +02:00
|
|
|
|
2016-11-02 00:37:58 +01:00
|
|
|
//----------------------------------------------------------------------
|
2018-10-14 06:25:33 +02:00
|
|
|
void FWidget::setWidth (std::size_t width, bool adjust)
|
2016-11-02 00:37:58 +01:00
|
|
|
{
|
|
|
|
width = std::min (width, size_hints.max_width);
|
|
|
|
width = std::max (width, size_hints.min_width);
|
2016-07-09 00:01:59 +02:00
|
|
|
|
2016-11-02 00:37:58 +01:00
|
|
|
if ( getWidth() == width && wsize.getWidth() == width )
|
|
|
|
return;
|
2016-01-17 23:37:52 +01:00
|
|
|
|
2016-11-02 00:37:58 +01:00
|
|
|
if ( width < 1 )
|
|
|
|
width = 1;
|
2016-07-09 00:01:59 +02:00
|
|
|
|
2016-11-02 00:37:58 +01:00
|
|
|
wsize.setWidth(width);
|
|
|
|
adjust_wsize.setWidth(width);
|
2015-05-23 13:35:12 +02:00
|
|
|
|
2016-11-02 00:37:58 +01:00
|
|
|
if ( adjust )
|
|
|
|
adjustSize();
|
2015-05-23 13:35:12 +02:00
|
|
|
|
2018-10-14 06:25:33 +02:00
|
|
|
double_flatline_mask.top.resize (getWidth(), false);
|
|
|
|
double_flatline_mask.bottom.resize (getWidth(), false);
|
2016-11-02 00:37:58 +01:00
|
|
|
}
|
2016-09-25 23:53:48 +02:00
|
|
|
|
2016-11-02 00:37:58 +01:00
|
|
|
//----------------------------------------------------------------------
|
2018-10-14 06:25:33 +02:00
|
|
|
void FWidget::setHeight (std::size_t height, bool adjust)
|
2016-11-02 00:37:58 +01:00
|
|
|
{
|
|
|
|
height = std::min (height, size_hints.max_height);
|
|
|
|
height = std::max (height, size_hints.min_height);
|
2015-05-23 13:35:12 +02:00
|
|
|
|
2016-11-02 00:37:58 +01:00
|
|
|
if ( getHeight() == height && wsize.getHeight() == height )
|
|
|
|
return;
|
2015-05-23 13:35:12 +02:00
|
|
|
|
2016-11-02 00:37:58 +01:00
|
|
|
if ( height < 1 )
|
|
|
|
height = 1;
|
2015-05-23 13:35:12 +02:00
|
|
|
|
2016-11-02 00:37:58 +01:00
|
|
|
wsize.setHeight(height);
|
|
|
|
adjust_wsize.setHeight(height);
|
2016-07-09 00:01:59 +02:00
|
|
|
|
2016-11-02 00:37:58 +01:00
|
|
|
if ( adjust )
|
|
|
|
adjustSize();
|
2016-07-09 00:01:59 +02:00
|
|
|
|
2018-10-14 06:25:33 +02:00
|
|
|
double_flatline_mask.right.resize (getHeight(), false);
|
|
|
|
double_flatline_mask.left.resize (getHeight(), false);
|
2015-05-23 13:35:12 +02:00
|
|
|
}
|
|
|
|
|
2016-05-16 21:11:32 +02:00
|
|
|
//----------------------------------------------------------------------
|
2018-10-14 06:25:33 +02:00
|
|
|
void FWidget::setSize (std::size_t width, std::size_t height, bool adjust)
|
2016-05-16 21:11:32 +02:00
|
|
|
{
|
2016-11-02 00:37:58 +01:00
|
|
|
width = std::min (width, size_hints.max_width);
|
|
|
|
width = std::max (width, size_hints.min_width);
|
|
|
|
height = std::min (height, size_hints.max_height);
|
|
|
|
height = std::max (height, size_hints.min_height);
|
|
|
|
|
|
|
|
if ( getWidth() == width && wsize.getWidth() == width
|
2017-11-26 22:37:18 +01:00
|
|
|
&& getHeight() == height && wsize.getHeight() == height )
|
2016-05-16 21:11:32 +02:00
|
|
|
return;
|
|
|
|
|
2016-11-02 00:37:58 +01:00
|
|
|
if ( width < 1 )
|
|
|
|
width = 1;
|
2016-05-16 21:11:32 +02:00
|
|
|
|
2016-11-02 00:37:58 +01:00
|
|
|
if ( height < 1 )
|
|
|
|
height = 1;
|
|
|
|
|
|
|
|
wsize.setWidth(width);
|
|
|
|
wsize.setHeight(height);
|
|
|
|
adjust_wsize.setWidth(width);
|
|
|
|
adjust_wsize.setHeight(height);
|
|
|
|
|
|
|
|
if ( adjust )
|
|
|
|
adjustSize();
|
|
|
|
|
2018-10-14 06:25:33 +02:00
|
|
|
double_flatline_mask.top.resize (getWidth(), false);
|
|
|
|
double_flatline_mask.right.resize (getHeight(), false);
|
|
|
|
double_flatline_mask.bottom.resize (getWidth(), false);
|
|
|
|
double_flatline_mask.left.resize (getHeight(), false);
|
2016-11-02 00:37:58 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
//----------------------------------------------------------------------
|
|
|
|
void FWidget::setTopPadding (int top, bool adjust)
|
|
|
|
{
|
|
|
|
if ( padding.top == top )
|
|
|
|
return;
|
|
|
|
|
2017-01-22 23:04:40 +01:00
|
|
|
padding.top = top;
|
2016-11-02 00:37:58 +01:00
|
|
|
|
|
|
|
if ( adjust )
|
|
|
|
{
|
|
|
|
if ( isRootWidget() )
|
2016-05-16 21:11:32 +02:00
|
|
|
{
|
2016-11-02 00:37:58 +01:00
|
|
|
FWidget* r = rootObject;
|
|
|
|
r->client_offset.setY1 (r->padding.top);
|
|
|
|
adjustSizeGlobal();
|
2016-05-16 21:11:32 +02:00
|
|
|
}
|
2016-11-02 00:37:58 +01:00
|
|
|
else
|
|
|
|
adjustSize();
|
2016-05-16 21:11:32 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-05-23 13:35:12 +02:00
|
|
|
//----------------------------------------------------------------------
|
2016-11-02 00:37:58 +01:00
|
|
|
void FWidget::setLeftPadding (int left, bool adjust)
|
2015-05-23 13:35:12 +02:00
|
|
|
{
|
2016-11-02 00:37:58 +01:00
|
|
|
if ( padding.left == left )
|
2015-05-23 13:35:12 +02:00
|
|
|
return;
|
2016-07-09 00:01:59 +02:00
|
|
|
|
2017-01-22 23:04:40 +01:00
|
|
|
padding.left = left;
|
2015-05-23 13:35:12 +02:00
|
|
|
|
2016-11-02 00:37:58 +01:00
|
|
|
if ( adjust )
|
|
|
|
{
|
|
|
|
if ( isRootWidget() )
|
|
|
|
{
|
|
|
|
FWidget* r = rootObject;
|
|
|
|
r->client_offset.setX1 (r->padding.left);
|
|
|
|
adjustSizeGlobal();
|
|
|
|
}
|
|
|
|
else
|
|
|
|
adjustSize();
|
|
|
|
}
|
2015-05-23 13:35:12 +02:00
|
|
|
}
|
|
|
|
|
2015-08-09 23:44:11 +02:00
|
|
|
//----------------------------------------------------------------------
|
2016-11-02 00:37:58 +01:00
|
|
|
void FWidget::setBottomPadding (int bottom, bool adjust)
|
2015-08-09 23:44:11 +02:00
|
|
|
{
|
2016-11-02 00:37:58 +01:00
|
|
|
if ( padding.bottom == bottom )
|
2015-08-09 23:44:11 +02:00
|
|
|
return;
|
2016-07-09 00:01:59 +02:00
|
|
|
|
2017-01-22 23:04:40 +01:00
|
|
|
padding.bottom = bottom;
|
2015-08-09 23:44:11 +02:00
|
|
|
|
2016-11-02 00:37:58 +01:00
|
|
|
if ( adjust )
|
|
|
|
{
|
|
|
|
if ( isRootWidget() )
|
|
|
|
{
|
|
|
|
FWidget* r = rootObject;
|
2018-10-14 06:25:33 +02:00
|
|
|
r->client_offset.setY2 (int(r->getHeight()) - 1 - r->padding.bottom);
|
2016-11-02 00:37:58 +01:00
|
|
|
adjustSizeGlobal();
|
|
|
|
}
|
|
|
|
else
|
|
|
|
adjustSize();
|
|
|
|
}
|
2015-08-09 23:44:11 +02:00
|
|
|
}
|
|
|
|
|
2015-05-23 13:35:12 +02:00
|
|
|
//----------------------------------------------------------------------
|
2016-11-02 00:37:58 +01:00
|
|
|
void FWidget::setRightPadding (int right, bool adjust)
|
2015-05-23 13:35:12 +02:00
|
|
|
{
|
2016-11-02 00:37:58 +01:00
|
|
|
if ( padding.right == right )
|
|
|
|
return;
|
2016-07-09 00:01:59 +02:00
|
|
|
|
2017-01-22 23:04:40 +01:00
|
|
|
padding.right = right;
|
2016-07-09 00:01:59 +02:00
|
|
|
|
2016-11-02 00:37:58 +01:00
|
|
|
if ( adjust )
|
|
|
|
{
|
|
|
|
if ( isRootWidget() )
|
|
|
|
{
|
|
|
|
FWidget* r = rootObject;
|
2018-10-14 06:25:33 +02:00
|
|
|
r->client_offset.setX2 (int(r->getWidth()) - 1 - r->padding.right);
|
2016-11-02 00:37:58 +01:00
|
|
|
adjustSizeGlobal();
|
|
|
|
}
|
|
|
|
else
|
|
|
|
adjustSize();
|
|
|
|
}
|
|
|
|
}
|
2016-07-09 00:01:59 +02:00
|
|
|
|
2016-11-02 00:37:58 +01:00
|
|
|
//----------------------------------------------------------------------
|
|
|
|
void FWidget::setParentOffset()
|
|
|
|
{
|
|
|
|
FWidget* p = getParentWidget();
|
2016-07-09 00:01:59 +02:00
|
|
|
|
2016-11-02 00:37:58 +01:00
|
|
|
if ( p )
|
|
|
|
offset = p->client_offset;
|
|
|
|
}
|
2016-07-09 00:01:59 +02:00
|
|
|
|
2016-11-02 00:37:58 +01:00
|
|
|
//----------------------------------------------------------------------
|
|
|
|
void FWidget::setTermOffset()
|
|
|
|
{
|
|
|
|
FWidget* r = getRootWidget();
|
2018-10-14 06:25:33 +02:00
|
|
|
int w = int(r->getWidth());
|
|
|
|
int h = int(r->getHeight());
|
2016-11-02 00:37:58 +01:00
|
|
|
offset.setCoordinates (0, 0, w - 1, h - 1);
|
|
|
|
}
|
2016-07-09 00:01:59 +02:00
|
|
|
|
2016-11-02 00:37:58 +01:00
|
|
|
//----------------------------------------------------------------------
|
|
|
|
void FWidget::setTermOffsetWithPadding()
|
|
|
|
{
|
|
|
|
FWidget* r = getRootWidget();
|
|
|
|
offset.setCoordinates ( r->getLeftPadding()
|
|
|
|
, r->getTopPadding()
|
2018-10-14 06:25:33 +02:00
|
|
|
, int(r->getWidth()) - 1 - r->getRightPadding()
|
|
|
|
, int(r->getHeight()) - 1 - r->getBottomPadding() );
|
2016-11-02 00:37:58 +01:00
|
|
|
}
|
2016-07-09 00:01:59 +02:00
|
|
|
|
2016-11-02 00:37:58 +01:00
|
|
|
//----------------------------------------------------------------------
|
2018-10-14 06:25:33 +02:00
|
|
|
void FWidget::setTermSize (std::size_t w, std::size_t h)
|
2016-11-02 00:37:58 +01:00
|
|
|
{
|
|
|
|
// Set xterm size to w x h
|
2018-10-14 06:25:33 +02:00
|
|
|
|
2016-11-02 00:37:58 +01:00
|
|
|
if ( isXTerminal() )
|
|
|
|
{
|
|
|
|
rootObject->wsize.setRect(1, 1, w, h);
|
|
|
|
rootObject->adjust_wsize = rootObject->wsize;
|
|
|
|
FTerm::setTermSize (w, h); // w = columns / h = lines
|
|
|
|
detectTermSize();
|
|
|
|
}
|
|
|
|
}
|
2016-07-09 00:01:59 +02:00
|
|
|
|
2016-11-02 00:37:58 +01:00
|
|
|
//----------------------------------------------------------------------
|
2018-10-24 00:16:45 +02:00
|
|
|
void FWidget::setGeometry ( int x, int y
|
|
|
|
, std::size_t w, std::size_t h
|
|
|
|
, bool adjust )
|
2016-11-02 00:37:58 +01:00
|
|
|
{
|
2017-08-06 17:02:19 +02:00
|
|
|
// Sets the geometry of the widget relative to its parent
|
|
|
|
|
2018-10-14 06:25:33 +02:00
|
|
|
int term_x, term_y;
|
2015-05-23 13:35:12 +02:00
|
|
|
|
2016-11-02 00:37:58 +01:00
|
|
|
w = std::min (w, size_hints.max_width);
|
|
|
|
w = std::max (w, size_hints.min_width);
|
|
|
|
h = std::min (h, size_hints.max_height);
|
|
|
|
h = std::max (h, size_hints.min_height);
|
2015-05-23 13:35:12 +02:00
|
|
|
|
2016-11-02 00:37:58 +01:00
|
|
|
if ( getX() == x && getY() == y && getWidth() == w && getHeight() == h )
|
|
|
|
return;
|
2016-07-09 00:01:59 +02:00
|
|
|
|
2016-11-02 00:37:58 +01:00
|
|
|
if ( ! isWindowWidget() )
|
|
|
|
{
|
2017-09-17 21:32:46 +02:00
|
|
|
( x < 1 ) ? wsize.setX(1) : wsize.setX(x);
|
|
|
|
( y < 1 ) ? wsize.setY(1) : wsize.setY(y);
|
2016-11-02 00:37:58 +01:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
wsize.setX(x);
|
|
|
|
wsize.setY(y);
|
|
|
|
}
|
2016-07-09 00:01:59 +02:00
|
|
|
|
2017-09-17 21:32:46 +02:00
|
|
|
( w < 1 ) ? wsize.setWidth(1) : wsize.setWidth(w);
|
|
|
|
( h < 1 ) ? wsize.setHeight(1) : wsize.setHeight(h);
|
2016-07-09 00:01:59 +02:00
|
|
|
|
2016-11-02 00:37:58 +01:00
|
|
|
adjust_wsize = wsize;
|
|
|
|
term_x = getTermX();
|
|
|
|
term_y = getTermY();
|
2015-05-23 13:35:12 +02:00
|
|
|
|
2016-11-02 00:37:58 +01:00
|
|
|
client_offset.setCoordinates ( term_x - 1 + padding.left
|
|
|
|
, term_y - 1 + padding.top
|
2018-10-14 06:25:33 +02:00
|
|
|
, term_x - 2 + int(getWidth()) - padding.right
|
|
|
|
, term_y - 2 + int(getHeight()) - padding.bottom );
|
2015-05-23 13:35:12 +02:00
|
|
|
|
2018-10-14 06:25:33 +02:00
|
|
|
double_flatline_mask.top.resize (getWidth(), false);
|
|
|
|
double_flatline_mask.right.resize (getHeight(), false);
|
|
|
|
double_flatline_mask.bottom.resize (getWidth(), false);
|
|
|
|
double_flatline_mask.left.resize (getHeight(), false);
|
2015-05-23 13:35:12 +02:00
|
|
|
|
2016-11-02 00:37:58 +01:00
|
|
|
if ( adjust )
|
|
|
|
adjustSize();
|
|
|
|
}
|
2015-05-23 13:35:12 +02:00
|
|
|
|
2016-11-02 00:37:58 +01:00
|
|
|
//----------------------------------------------------------------------
|
2018-09-12 22:51:15 +02:00
|
|
|
bool FWidget::setCursorPos (int x, int y)
|
2016-11-02 00:37:58 +01:00
|
|
|
{
|
|
|
|
// sets the input cursor position
|
2017-02-24 00:30:07 +01:00
|
|
|
|
2017-09-11 03:06:02 +02:00
|
|
|
widget_cursor_position.setPoint(x, y);
|
2015-05-23 13:35:12 +02:00
|
|
|
|
2018-11-04 23:00:06 +01:00
|
|
|
if ( ! flags.focus || isWindowWidget() )
|
2017-02-24 00:30:07 +01:00
|
|
|
return false;
|
2015-05-23 13:35:12 +02:00
|
|
|
|
2017-03-08 23:48:30 +01:00
|
|
|
if ( ! FWindow::getWindowWidget(this) )
|
2017-02-24 00:30:07 +01:00
|
|
|
return false;
|
|
|
|
|
2017-03-08 23:48:30 +01:00
|
|
|
term_area* area = getPrintArea();
|
|
|
|
|
|
|
|
if ( area->widget )
|
2017-02-24 00:30:07 +01:00
|
|
|
{
|
2017-03-08 23:48:30 +01:00
|
|
|
int widget_offsetX = getTermX() - area->widget->getTermX();
|
|
|
|
int widget_offsetY = getTermY() - area->widget->getTermY();
|
|
|
|
|
|
|
|
if ( isChildPrintArea() )
|
|
|
|
{
|
|
|
|
widget_offsetX += (1 - area->widget->getLeftPadding());
|
|
|
|
widget_offsetY += (1 - area->widget->getTopPadding());
|
|
|
|
}
|
|
|
|
|
|
|
|
setAreaCursor ( widget_offsetX + x
|
|
|
|
, widget_offsetY + y
|
2018-11-05 23:19:03 +01:00
|
|
|
, flags.visible_cursor
|
2017-02-24 00:30:07 +01:00
|
|
|
, area );
|
|
|
|
return true;
|
2016-11-02 00:37:58 +01:00
|
|
|
}
|
2015-05-23 13:35:12 +02:00
|
|
|
|
2016-11-02 00:37:58 +01:00
|
|
|
return false;
|
|
|
|
}
|
2015-05-23 13:35:12 +02:00
|
|
|
|
2016-11-02 00:37:58 +01:00
|
|
|
//----------------------------------------------------------------------
|
2018-09-12 22:51:15 +02:00
|
|
|
void FWidget::setPrintPos (int x, int y)
|
2016-11-02 00:37:58 +01:00
|
|
|
{
|
|
|
|
setPrintCursor ( offset.getX1() + getX() + x - 1,
|
|
|
|
offset.getY1() + getY() + y - 1 );
|
|
|
|
}
|
2015-05-23 13:35:12 +02:00
|
|
|
|
2016-11-02 00:37:58 +01:00
|
|
|
//----------------------------------------------------------------------
|
|
|
|
void FWidget::setDoubleFlatLine (fc::sides side, bool bit)
|
|
|
|
{
|
|
|
|
uLong length;
|
2015-05-23 13:35:12 +02:00
|
|
|
|
2016-12-18 23:34:11 +01:00
|
|
|
assert ( side == fc::top
|
2017-11-26 22:37:18 +01:00
|
|
|
|| side == fc::right
|
|
|
|
|| side == fc::bottom
|
|
|
|
|| side == fc::left );
|
2015-05-23 13:35:12 +02:00
|
|
|
|
2016-11-02 00:37:58 +01:00
|
|
|
switch ( side )
|
|
|
|
{
|
|
|
|
case fc::top:
|
|
|
|
length = double_flatline_mask.top.size();
|
|
|
|
double_flatline_mask.top.assign(length, bit);
|
2015-05-23 13:35:12 +02:00
|
|
|
break;
|
|
|
|
|
2016-11-02 00:37:58 +01:00
|
|
|
case fc::right:
|
|
|
|
length = double_flatline_mask.right.size();
|
|
|
|
double_flatline_mask.right.assign(length, bit);
|
2015-05-23 13:35:12 +02:00
|
|
|
break;
|
|
|
|
|
2016-11-02 00:37:58 +01:00
|
|
|
case fc::bottom:
|
|
|
|
length = double_flatline_mask.bottom.size();
|
|
|
|
double_flatline_mask.bottom.assign(length, bit);
|
2015-05-23 13:35:12 +02:00
|
|
|
break;
|
|
|
|
|
2016-11-02 00:37:58 +01:00
|
|
|
case fc::left:
|
|
|
|
length = double_flatline_mask.left.size();
|
|
|
|
double_flatline_mask.left.assign(length, bit);
|
|
|
|
break;
|
2015-05-23 13:35:12 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
//----------------------------------------------------------------------
|
2016-11-02 00:37:58 +01:00
|
|
|
void FWidget::setDoubleFlatLine (fc::sides side, int pos, bool bit)
|
|
|
|
{
|
|
|
|
uLong length, index;
|
2015-05-23 13:35:12 +02:00
|
|
|
|
2016-12-18 23:34:11 +01:00
|
|
|
assert ( side == fc::top
|
2017-11-26 22:37:18 +01:00
|
|
|
|| side == fc::right
|
|
|
|
|| side == fc::bottom
|
|
|
|
|| side == fc::left );
|
2015-05-23 13:35:12 +02:00
|
|
|
|
2016-11-02 00:37:58 +01:00
|
|
|
assert ( pos >= 1 );
|
2015-05-23 13:35:12 +02:00
|
|
|
|
2016-11-02 00:37:58 +01:00
|
|
|
index = uLong(pos - 1);
|
2015-05-23 13:35:12 +02:00
|
|
|
|
2016-11-02 00:37:58 +01:00
|
|
|
switch ( side )
|
|
|
|
{
|
|
|
|
case fc::top:
|
|
|
|
length = double_flatline_mask.top.size();
|
2015-05-23 13:35:12 +02:00
|
|
|
|
2016-11-02 00:37:58 +01:00
|
|
|
if ( index < length )
|
|
|
|
double_flatline_mask.top[index] = bit;
|
2015-05-23 13:35:12 +02:00
|
|
|
|
2016-11-02 00:37:58 +01:00
|
|
|
break;
|
2015-05-23 13:35:12 +02:00
|
|
|
|
2016-11-02 00:37:58 +01:00
|
|
|
case fc::right:
|
|
|
|
length = double_flatline_mask.right.size();
|
2015-05-23 13:35:12 +02:00
|
|
|
|
2016-11-02 00:37:58 +01:00
|
|
|
if ( index < length )
|
|
|
|
double_flatline_mask.right[index] = bit;
|
2015-05-23 13:35:12 +02:00
|
|
|
|
2016-11-02 00:37:58 +01:00
|
|
|
break;
|
2015-05-23 13:35:12 +02:00
|
|
|
|
2016-11-02 00:37:58 +01:00
|
|
|
case fc::bottom:
|
|
|
|
length = double_flatline_mask.bottom.size();
|
2015-05-23 13:35:12 +02:00
|
|
|
|
2016-11-02 00:37:58 +01:00
|
|
|
if ( index < length )
|
|
|
|
double_flatline_mask.bottom[index] = bit;
|
2015-05-23 13:35:12 +02:00
|
|
|
|
2016-11-02 00:37:58 +01:00
|
|
|
break;
|
2015-05-23 13:35:12 +02:00
|
|
|
|
2016-11-02 00:37:58 +01:00
|
|
|
case fc::left:
|
|
|
|
length = double_flatline_mask.left.size();
|
2015-05-23 13:35:12 +02:00
|
|
|
|
2016-11-02 00:37:58 +01:00
|
|
|
if ( index < length )
|
|
|
|
double_flatline_mask.left[index] = bit;
|
|
|
|
|
|
|
|
break;
|
|
|
|
}
|
2015-05-23 13:35:12 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
//----------------------------------------------------------------------
|
2016-11-02 00:37:58 +01:00
|
|
|
FWidget* FWidget::childWidgetAt (FWidget* p, int x, int y)
|
2015-05-23 13:35:12 +02:00
|
|
|
{
|
2016-11-02 00:37:58 +01:00
|
|
|
if ( p && p->hasChildren() )
|
2015-05-23 13:35:12 +02:00
|
|
|
{
|
2017-09-17 01:50:41 +02:00
|
|
|
constFObjectIterator iter, last;
|
|
|
|
iter = p->begin();
|
|
|
|
last = p->end();
|
2016-07-09 00:01:59 +02:00
|
|
|
|
2017-09-17 01:50:41 +02:00
|
|
|
while ( iter != last )
|
2016-11-02 00:37:58 +01:00
|
|
|
{
|
2017-06-11 17:47:50 +02:00
|
|
|
if ( ! (*iter)->isWidget() )
|
|
|
|
{
|
|
|
|
++iter;
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
2016-11-02 00:37:58 +01:00
|
|
|
FWidget* widget = static_cast<FWidget*>(*iter);
|
2015-05-23 13:35:12 +02:00
|
|
|
|
2016-12-18 23:34:11 +01:00
|
|
|
if ( widget->isEnabled()
|
2017-11-26 22:37:18 +01:00
|
|
|
&& widget->isVisible()
|
|
|
|
&& ! widget->isWindowWidget()
|
|
|
|
&& widget->getTermGeometry().contains(x, y) )
|
2015-05-23 13:35:12 +02:00
|
|
|
{
|
2016-11-02 00:37:58 +01:00
|
|
|
FWidget* child = childWidgetAt(widget, x, y);
|
2017-09-17 21:32:46 +02:00
|
|
|
return ( child != 0 ) ? child : widget;
|
2015-05-23 13:35:12 +02:00
|
|
|
}
|
2016-11-02 00:37:58 +01:00
|
|
|
|
|
|
|
++iter;
|
2015-05-23 13:35:12 +02:00
|
|
|
}
|
|
|
|
}
|
2016-11-02 00:37:58 +01:00
|
|
|
|
|
|
|
return 0;
|
2015-05-23 13:35:12 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
//----------------------------------------------------------------------
|
2016-11-02 00:37:58 +01:00
|
|
|
int FWidget::numOfFocusableChildren()
|
2015-05-23 13:35:12 +02:00
|
|
|
{
|
2017-09-17 01:50:41 +02:00
|
|
|
constFObjectIterator iter, last;
|
2015-05-23 13:35:12 +02:00
|
|
|
|
2017-09-17 01:50:41 +02:00
|
|
|
if ( ! hasChildren() )
|
2015-05-23 13:35:12 +02:00
|
|
|
return 0;
|
|
|
|
|
|
|
|
int num = 0;
|
2017-09-17 01:50:41 +02:00
|
|
|
iter = FObject::begin();
|
|
|
|
last = FObject::end();
|
2015-05-23 13:35:12 +02:00
|
|
|
|
2017-09-17 01:50:41 +02:00
|
|
|
while ( iter != last )
|
2015-05-23 13:35:12 +02:00
|
|
|
{
|
2017-06-11 17:47:50 +02:00
|
|
|
if ( (*iter)->isWidget() )
|
|
|
|
{
|
|
|
|
FWidget* widget = static_cast<FWidget*>(*iter);
|
2016-07-09 00:01:59 +02:00
|
|
|
|
2017-06-11 17:47:50 +02:00
|
|
|
if ( widget->acceptFocus() )
|
|
|
|
num++;
|
|
|
|
}
|
2016-07-09 00:01:59 +02:00
|
|
|
|
2015-05-23 13:35:12 +02:00
|
|
|
++iter;
|
|
|
|
}
|
2016-07-09 00:01:59 +02:00
|
|
|
|
2015-05-23 13:35:12 +02:00
|
|
|
return num;
|
|
|
|
}
|
|
|
|
|
|
|
|
//----------------------------------------------------------------------
|
|
|
|
bool FWidget::close()
|
|
|
|
{
|
2016-01-17 02:57:08 +01:00
|
|
|
FCloseEvent ev(fc::Close_Event);
|
2015-09-20 05:44:50 +02:00
|
|
|
FApplication::sendEvent(this, &ev);
|
2015-05-23 13:35:12 +02:00
|
|
|
|
2015-09-20 05:44:50 +02:00
|
|
|
if ( ev.isAccepted() )
|
2015-05-23 13:35:12 +02:00
|
|
|
{
|
|
|
|
if ( this == getMainWidget() )
|
|
|
|
quit();
|
|
|
|
else
|
|
|
|
{
|
|
|
|
hide();
|
2016-07-09 00:01:59 +02:00
|
|
|
|
2018-11-04 23:00:06 +01:00
|
|
|
if ( ! flags.modal )
|
2015-05-23 13:35:12 +02:00
|
|
|
close_widget->push_back(this);
|
|
|
|
}
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
//----------------------------------------------------------------------
|
2017-03-26 20:40:04 +02:00
|
|
|
void FWidget::addCallback ( const FString& cb_signal
|
2017-02-18 23:37:10 +01:00
|
|
|
, FCallback cb_handler
|
2015-09-22 04:18:20 +02:00
|
|
|
, data_ptr data )
|
2015-05-23 13:35:12 +02:00
|
|
|
{
|
|
|
|
// add a (normal) function pointer as callback
|
|
|
|
callback_data obj = { cb_signal, cb_handler, data };
|
2016-09-25 23:53:48 +02:00
|
|
|
callback_objects.push_back(obj);
|
2015-05-23 13:35:12 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
//----------------------------------------------------------------------
|
2017-03-26 20:40:04 +02:00
|
|
|
void FWidget::addCallback ( const FString& cb_signal
|
2015-09-22 04:18:20 +02:00
|
|
|
, FWidget* cb_instance
|
2017-02-18 23:37:10 +01:00
|
|
|
, FMemberCallback cb_handler
|
2015-09-22 04:18:20 +02:00
|
|
|
, data_ptr data )
|
2015-05-23 13:35:12 +02:00
|
|
|
{
|
|
|
|
// add a member function pointer as callback
|
|
|
|
member_callback_data obj = { cb_signal, cb_instance, cb_handler, data };
|
2016-09-25 23:53:48 +02:00
|
|
|
member_callback_objects.push_back(obj);
|
2015-05-23 13:35:12 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
//----------------------------------------------------------------------
|
2017-02-18 23:37:10 +01:00
|
|
|
void FWidget::delCallback (FCallback cb_handler)
|
2015-05-23 13:35:12 +02:00
|
|
|
{
|
|
|
|
// delete a cb_handler function pointer
|
2017-02-18 23:37:10 +01:00
|
|
|
|
|
|
|
CallbackObjects::iterator iter;
|
|
|
|
|
2016-09-25 23:53:48 +02:00
|
|
|
if ( callback_objects.empty() )
|
2015-05-23 13:35:12 +02:00
|
|
|
return;
|
|
|
|
|
2016-09-25 23:53:48 +02:00
|
|
|
iter = callback_objects.begin();
|
2015-05-23 13:35:12 +02:00
|
|
|
|
2016-09-25 23:53:48 +02:00
|
|
|
while ( iter != callback_objects.end() )
|
2015-05-23 13:35:12 +02:00
|
|
|
{
|
|
|
|
if ( iter->cb_handler == cb_handler )
|
2016-09-25 23:53:48 +02:00
|
|
|
iter = callback_objects.erase(iter);
|
2015-05-23 13:35:12 +02:00
|
|
|
else
|
|
|
|
++iter;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
//----------------------------------------------------------------------
|
|
|
|
void FWidget::delCallback (FWidget* cb_instance)
|
|
|
|
{
|
2017-02-18 23:37:10 +01:00
|
|
|
// delete all member function pointer from cb_instance
|
|
|
|
|
2015-05-23 13:35:12 +02:00
|
|
|
FWidget::MemberCallbackObjects::iterator iter;
|
|
|
|
|
2016-09-25 23:53:48 +02:00
|
|
|
if ( member_callback_objects.empty() )
|
2015-05-23 13:35:12 +02:00
|
|
|
return;
|
|
|
|
|
2016-09-25 23:53:48 +02:00
|
|
|
iter = member_callback_objects.begin();
|
2015-05-23 13:35:12 +02:00
|
|
|
|
2016-09-25 23:53:48 +02:00
|
|
|
while ( iter != member_callback_objects.end() )
|
2015-05-23 13:35:12 +02:00
|
|
|
{
|
|
|
|
if ( iter->cb_instance == cb_instance )
|
2016-09-25 23:53:48 +02:00
|
|
|
iter = member_callback_objects.erase(iter);
|
2015-05-23 13:35:12 +02:00
|
|
|
else
|
|
|
|
++iter;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-07-30 14:34:13 +02:00
|
|
|
//----------------------------------------------------------------------
|
2017-11-03 22:57:40 +01:00
|
|
|
void FWidget::delCallbacks()
|
2016-07-30 14:34:13 +02:00
|
|
|
{
|
|
|
|
// delete all callbacks from this widget
|
2017-01-15 19:48:27 +01:00
|
|
|
|
2016-09-25 23:53:48 +02:00
|
|
|
member_callback_objects.clear(); // member function pointer
|
2017-01-15 19:48:27 +01:00
|
|
|
callback_objects.clear(); // function pointer
|
2016-07-30 14:34:13 +02:00
|
|
|
}
|
|
|
|
|
2015-05-23 13:35:12 +02:00
|
|
|
//----------------------------------------------------------------------
|
2017-03-26 20:40:04 +02:00
|
|
|
void FWidget::emitCallback (const FString& emit_signal)
|
2015-05-23 13:35:12 +02:00
|
|
|
{
|
|
|
|
// member function pointer
|
2016-09-25 23:53:48 +02:00
|
|
|
if ( ! member_callback_objects.empty() )
|
2015-05-23 13:35:12 +02:00
|
|
|
{
|
2017-02-18 23:37:10 +01:00
|
|
|
MemberCallbackObjects::const_iterator m_iter, m_end;
|
2016-09-25 23:53:48 +02:00
|
|
|
m_iter = member_callback_objects.begin();
|
|
|
|
m_end = member_callback_objects.end();
|
2015-05-23 13:35:12 +02:00
|
|
|
|
|
|
|
while ( m_iter != m_end )
|
|
|
|
{
|
|
|
|
if ( m_iter->cb_signal == emit_signal )
|
|
|
|
{
|
|
|
|
FMemberCallback callback = m_iter->cb_handler;
|
|
|
|
// call the member function pointer
|
|
|
|
(m_iter->cb_instance->*callback)(this, m_iter->data);
|
|
|
|
}
|
2016-07-09 00:01:59 +02:00
|
|
|
|
2015-05-23 13:35:12 +02:00
|
|
|
++m_iter;
|
|
|
|
}
|
|
|
|
}
|
2016-07-09 00:01:59 +02:00
|
|
|
|
2015-05-23 13:35:12 +02:00
|
|
|
// function pointer
|
2016-09-25 23:53:48 +02:00
|
|
|
if ( ! callback_objects.empty() )
|
2015-05-23 13:35:12 +02:00
|
|
|
{
|
2017-09-17 01:50:41 +02:00
|
|
|
CallbackObjects::const_iterator iter, last;
|
2016-09-25 23:53:48 +02:00
|
|
|
iter = callback_objects.begin();
|
2017-09-17 01:50:41 +02:00
|
|
|
last = callback_objects.end();
|
2015-05-23 13:35:12 +02:00
|
|
|
|
2017-09-17 01:50:41 +02:00
|
|
|
while ( iter != last )
|
2015-05-23 13:35:12 +02:00
|
|
|
{
|
|
|
|
if ( iter->cb_signal == emit_signal )
|
|
|
|
{
|
|
|
|
FCallback callback = iter->cb_handler;
|
|
|
|
// call the function pointer
|
|
|
|
callback(this, iter->data);
|
|
|
|
}
|
2016-07-09 00:01:59 +02:00
|
|
|
|
2015-05-23 13:35:12 +02:00
|
|
|
++iter;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
//----------------------------------------------------------------------
|
2018-11-21 20:07:08 +01:00
|
|
|
void FWidget::addAccelerator (FKey key, FWidget* obj)
|
2015-05-23 13:35:12 +02:00
|
|
|
{
|
2016-07-12 23:35:33 +02:00
|
|
|
FWidget* widget = FWindow::getWindowWidget(obj);
|
2015-05-23 13:35:12 +02:00
|
|
|
accelerator accel = { key, obj };
|
|
|
|
|
2016-07-12 23:35:33 +02:00
|
|
|
if ( ! widget || widget == statusbar || widget == menubar )
|
|
|
|
widget = getRootWidget();
|
2016-07-09 00:01:59 +02:00
|
|
|
|
2016-07-12 23:35:33 +02:00
|
|
|
if ( widget && widget->accelerator_list )
|
|
|
|
widget->accelerator_list->push_back(accel);
|
2015-05-23 13:35:12 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
//----------------------------------------------------------------------
|
|
|
|
void FWidget::delAccelerator (FWidget* obj)
|
|
|
|
{
|
2016-07-12 23:35:33 +02:00
|
|
|
FWidget* widget = FWindow::getWindowWidget(this);
|
2016-07-09 00:01:59 +02:00
|
|
|
|
2016-07-12 23:35:33 +02:00
|
|
|
if ( ! widget || widget == statusbar || widget == menubar )
|
|
|
|
widget = getRootWidget();
|
2016-07-09 00:01:59 +02:00
|
|
|
|
2016-12-18 23:34:11 +01:00
|
|
|
if ( widget
|
2017-11-26 22:37:18 +01:00
|
|
|
&& widget->accelerator_list
|
|
|
|
&& ! widget->accelerator_list->empty() )
|
2015-05-23 13:35:12 +02:00
|
|
|
{
|
|
|
|
FWidget::Accelerators::iterator iter;
|
2016-07-12 23:35:33 +02:00
|
|
|
iter = widget->accelerator_list->begin();
|
2015-05-23 13:35:12 +02:00
|
|
|
|
2016-07-12 23:35:33 +02:00
|
|
|
while ( iter != widget->accelerator_list->end() )
|
2015-05-23 13:35:12 +02:00
|
|
|
{
|
|
|
|
if ( iter->object == obj )
|
2016-07-12 23:35:33 +02:00
|
|
|
iter = widget->accelerator_list->erase(iter);
|
2015-05-23 13:35:12 +02:00
|
|
|
else
|
|
|
|
++iter;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
//----------------------------------------------------------------------
|
|
|
|
void FWidget::redraw()
|
|
|
|
{
|
|
|
|
if ( ! redraw_root_widget )
|
|
|
|
redraw_root_widget = this;
|
|
|
|
|
|
|
|
if ( isRootWidget() )
|
|
|
|
{
|
2016-10-13 02:16:51 +02:00
|
|
|
startTerminalUpdate();
|
2016-10-02 21:26:25 +02:00
|
|
|
// clean desktop
|
2015-05-23 13:35:12 +02:00
|
|
|
setColor (wc.term_fg, wc.term_bg);
|
2016-10-08 02:54:32 +02:00
|
|
|
clearArea (vdesktop);
|
2015-05-23 13:35:12 +02:00
|
|
|
}
|
2018-11-04 23:12:41 +01:00
|
|
|
else if ( ! isVisible() )
|
2015-05-23 13:35:12 +02:00
|
|
|
return;
|
|
|
|
|
|
|
|
draw();
|
|
|
|
|
|
|
|
if ( isRootWidget() )
|
2018-01-31 00:17:00 +01:00
|
|
|
drawWindows();
|
2015-05-23 13:35:12 +02:00
|
|
|
else
|
2018-01-31 00:17:00 +01:00
|
|
|
drawChildren();
|
2015-05-23 13:35:12 +02:00
|
|
|
|
|
|
|
if ( isRootWidget() )
|
2016-10-13 02:16:51 +02:00
|
|
|
finishTerminalUpdate();
|
2015-05-23 13:35:12 +02:00
|
|
|
|
|
|
|
if ( redraw_root_widget == this )
|
|
|
|
{
|
|
|
|
updateTerminal();
|
|
|
|
flush_out();
|
|
|
|
redraw_root_widget = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
//----------------------------------------------------------------------
|
|
|
|
void FWidget::resize()
|
|
|
|
{
|
2016-10-13 02:16:51 +02:00
|
|
|
if ( isRootWidget() )
|
2015-05-23 13:35:12 +02:00
|
|
|
{
|
2016-10-13 02:16:51 +02:00
|
|
|
detectTermSize();
|
2016-10-14 13:02:35 +02:00
|
|
|
FRect term_geometry = getTermGeometry();
|
2017-08-27 09:50:30 +02:00
|
|
|
term_geometry.move (-1, -1);
|
2016-10-14 13:02:35 +02:00
|
|
|
|
2016-10-09 02:06:06 +02:00
|
|
|
resizeVTerm (term_geometry);
|
|
|
|
resizeArea (term_geometry, getShadow(), vdesktop);
|
2016-05-16 23:36:13 +02:00
|
|
|
adjustSizeGlobal();
|
2015-05-23 13:35:12 +02:00
|
|
|
}
|
|
|
|
else
|
|
|
|
adjustSize();
|
2015-10-11 21:56:16 +02:00
|
|
|
|
|
|
|
// resize the four double-flatline-masks
|
2018-10-14 06:25:33 +02:00
|
|
|
double_flatline_mask.top.resize (getWidth(), false);
|
|
|
|
double_flatline_mask.right.resize (getHeight(), false);
|
|
|
|
double_flatline_mask.bottom.resize (getWidth(), false);
|
|
|
|
double_flatline_mask.left.resize (getHeight(), false);
|
2015-05-23 13:35:12 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
//----------------------------------------------------------------------
|
|
|
|
void FWidget::show()
|
|
|
|
{
|
2018-11-04 23:12:41 +01:00
|
|
|
if ( ! isVisible() )
|
2015-05-23 13:35:12 +02:00
|
|
|
return;
|
|
|
|
|
2016-11-27 19:16:52 +01:00
|
|
|
if ( ! init_desktop )
|
2016-11-06 16:36:21 +01:00
|
|
|
{
|
2018-05-20 15:15:42 +02:00
|
|
|
// Sets the initial screen settings
|
|
|
|
initScreenSettings();
|
2016-11-27 00:41:34 +01:00
|
|
|
|
|
|
|
// draw the vdesktop
|
|
|
|
FWidget* r = getRootWidget();
|
|
|
|
setColor(r->getForegroundColor(), r->getBackgroundColor());
|
|
|
|
clearArea (vdesktop);
|
2016-11-27 19:16:52 +01:00
|
|
|
init_desktop = true;
|
2016-11-06 16:36:21 +01:00
|
|
|
}
|
2015-05-23 13:35:12 +02:00
|
|
|
|
|
|
|
if ( ! show_root_widget )
|
|
|
|
{
|
2016-10-13 02:16:51 +02:00
|
|
|
startTerminalUpdate();
|
2015-05-23 13:35:12 +02:00
|
|
|
show_root_widget = this;
|
|
|
|
}
|
|
|
|
|
|
|
|
draw();
|
2018-11-05 23:19:03 +01:00
|
|
|
flags.shown = true;
|
2015-05-23 13:35:12 +02:00
|
|
|
|
2017-09-17 01:50:41 +02:00
|
|
|
if ( hasChildren() )
|
2015-05-23 13:35:12 +02:00
|
|
|
{
|
2017-09-17 01:50:41 +02:00
|
|
|
constFObjectIterator iter, last;
|
|
|
|
iter = FObject::begin();
|
|
|
|
last = FObject::end();
|
2015-05-23 13:35:12 +02:00
|
|
|
|
2017-09-17 01:50:41 +02:00
|
|
|
while ( iter != last )
|
2015-05-23 13:35:12 +02:00
|
|
|
{
|
2017-06-11 17:47:50 +02:00
|
|
|
if ( (*iter)->isWidget() )
|
|
|
|
{
|
|
|
|
FWidget* widget = static_cast<FWidget*>(*iter);
|
|
|
|
widget->show();
|
|
|
|
}
|
|
|
|
|
2015-05-23 13:35:12 +02:00
|
|
|
++iter;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( show_root_widget && show_root_widget == this )
|
|
|
|
{
|
2016-10-13 02:16:51 +02:00
|
|
|
finishTerminalUpdate();
|
2015-05-23 13:35:12 +02:00
|
|
|
updateTerminal();
|
|
|
|
flush_out();
|
|
|
|
show_root_widget = 0;
|
|
|
|
}
|
|
|
|
|
2016-01-17 02:57:08 +01:00
|
|
|
FShowEvent show_ev (fc::Show_Event);
|
2015-09-20 05:44:50 +02:00
|
|
|
FApplication::sendEvent(this, &show_ev);
|
2015-05-23 13:35:12 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
//----------------------------------------------------------------------
|
|
|
|
void FWidget::hide()
|
|
|
|
{
|
2018-11-04 23:12:41 +01:00
|
|
|
if ( isVisible() )
|
2015-05-23 13:35:12 +02:00
|
|
|
{
|
2018-11-05 23:19:03 +01:00
|
|
|
flags.visible = false;
|
|
|
|
flags.shown = false;
|
2015-05-23 13:35:12 +02:00
|
|
|
|
2016-09-25 23:53:48 +02:00
|
|
|
if ( ! isDialogWidget()
|
2017-11-26 22:37:18 +01:00
|
|
|
&& FWidget::getFocusWidget() == this
|
|
|
|
&& ! focusPrevChild() )
|
2015-05-23 13:35:12 +02:00
|
|
|
{
|
2016-08-21 21:27:44 +02:00
|
|
|
if ( FWidget::getFocusWidget() )
|
|
|
|
FWidget::getFocusWidget()->unsetFocus();
|
|
|
|
|
2016-08-20 22:27:23 +02:00
|
|
|
FWidget::setFocusWidget(getParentWidget());
|
2015-05-23 13:35:12 +02:00
|
|
|
}
|
2016-07-09 00:01:59 +02:00
|
|
|
|
2016-01-17 02:57:08 +01:00
|
|
|
FHideEvent hide_ev (fc::Hide_Event);
|
2015-09-20 05:44:50 +02:00
|
|
|
FApplication::sendEvent(this, &hide_ev);
|
2015-05-23 13:35:12 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
//----------------------------------------------------------------------
|
2016-05-22 19:18:16 +02:00
|
|
|
bool FWidget::focusFirstChild()
|
2015-05-23 13:35:12 +02:00
|
|
|
{
|
2017-09-17 01:50:41 +02:00
|
|
|
constFObjectIterator iter, last;
|
2015-05-23 13:35:12 +02:00
|
|
|
|
2017-09-17 01:50:41 +02:00
|
|
|
if ( ! hasChildren() )
|
2015-05-23 13:35:12 +02:00
|
|
|
return false;
|
|
|
|
|
2017-09-17 01:50:41 +02:00
|
|
|
iter = FObject::begin();
|
|
|
|
last = FObject::end();
|
2015-05-23 13:35:12 +02:00
|
|
|
|
2017-09-17 01:50:41 +02:00
|
|
|
while ( iter != last )
|
2015-05-23 13:35:12 +02:00
|
|
|
{
|
2017-06-11 17:47:50 +02:00
|
|
|
if ( ! (*iter)->isWidget() )
|
|
|
|
{
|
|
|
|
++iter;
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
2015-05-23 13:35:12 +02:00
|
|
|
FWidget* widget = static_cast<FWidget*>(*iter);
|
2016-05-16 23:26:04 +02:00
|
|
|
|
2016-12-18 23:34:11 +01:00
|
|
|
if ( widget->isEnabled()
|
2017-11-26 22:37:18 +01:00
|
|
|
&& widget->acceptFocus()
|
|
|
|
&& ! widget->isMenuWidget() )
|
2015-05-23 13:35:12 +02:00
|
|
|
{
|
2015-07-13 00:15:57 +02:00
|
|
|
widget->setFocus();
|
2016-07-09 00:01:59 +02:00
|
|
|
|
2015-05-23 13:35:12 +02:00
|
|
|
if ( widget->numOfChildren() >= 1 )
|
2015-07-12 21:49:30 +02:00
|
|
|
{
|
2016-09-25 23:53:48 +02:00
|
|
|
if ( ! widget->focusFirstChild() && widget->isWindowWidget() )
|
2015-07-12 23:28:45 +02:00
|
|
|
{
|
|
|
|
++iter;
|
2015-07-12 21:49:30 +02:00
|
|
|
continue;
|
2015-07-12 23:28:45 +02:00
|
|
|
}
|
2015-07-12 21:49:30 +02:00
|
|
|
}
|
2016-07-09 00:01:59 +02:00
|
|
|
|
2015-05-23 13:35:12 +02:00
|
|
|
return true;
|
|
|
|
}
|
2016-07-09 00:01:59 +02:00
|
|
|
|
2015-05-23 13:35:12 +02:00
|
|
|
++iter;
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
//----------------------------------------------------------------------
|
2016-05-22 19:18:16 +02:00
|
|
|
bool FWidget::focusLastChild()
|
2015-05-23 13:35:12 +02:00
|
|
|
{
|
2017-09-17 01:50:41 +02:00
|
|
|
constFObjectIterator iter, first;
|
2015-05-23 13:35:12 +02:00
|
|
|
|
2017-09-17 01:50:41 +02:00
|
|
|
if ( ! hasChildren() )
|
2015-05-23 13:35:12 +02:00
|
|
|
return false;
|
|
|
|
|
2017-09-17 01:50:41 +02:00
|
|
|
iter = FObject::end();
|
|
|
|
first = FObject::begin();
|
2015-05-23 13:35:12 +02:00
|
|
|
|
|
|
|
do
|
|
|
|
{
|
|
|
|
--iter;
|
2017-06-11 17:47:50 +02:00
|
|
|
|
|
|
|
if ( ! (*iter)->isWidget() )
|
|
|
|
continue;
|
|
|
|
|
2015-05-23 13:35:12 +02:00
|
|
|
FWidget* widget = static_cast<FWidget*>(*iter);
|
2016-05-16 23:26:04 +02:00
|
|
|
|
2016-12-18 23:34:11 +01:00
|
|
|
if ( widget->isEnabled()
|
2017-11-26 22:37:18 +01:00
|
|
|
&& widget->acceptFocus()
|
|
|
|
&& ! widget->isMenuWidget() )
|
2015-05-23 13:35:12 +02:00
|
|
|
{
|
2015-07-13 00:15:57 +02:00
|
|
|
widget->setFocus();
|
2016-07-09 00:01:59 +02:00
|
|
|
|
2015-05-23 13:35:12 +02:00
|
|
|
if ( widget->numOfChildren() >= 1 )
|
2015-07-12 21:49:30 +02:00
|
|
|
{
|
2016-09-25 23:53:48 +02:00
|
|
|
if ( ! widget->focusLastChild() && widget->isWindowWidget() )
|
2015-07-12 21:49:30 +02:00
|
|
|
continue;
|
|
|
|
}
|
2016-07-09 00:01:59 +02:00
|
|
|
|
2015-05-23 13:35:12 +02:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
2017-09-17 01:50:41 +02:00
|
|
|
while ( iter != first );
|
2015-05-23 13:35:12 +02:00
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
//----------------------------------------------------------------------
|
2016-11-02 00:37:58 +01:00
|
|
|
void FWidget::detectTermSize()
|
2015-05-23 13:35:12 +02:00
|
|
|
{
|
2016-11-02 00:37:58 +01:00
|
|
|
FWidget* r = rootObject;
|
|
|
|
FTerm::detectTermSize();
|
2017-12-30 21:27:17 +01:00
|
|
|
r->adjust_wsize.setRect (1, 1, getDesktopWidth(), getDesktopHeight());
|
|
|
|
r->offset.setRect (0, 0, getDesktopWidth(), getDesktopHeight());
|
2016-11-02 00:37:58 +01:00
|
|
|
r->client_offset.setCoordinates
|
|
|
|
(
|
|
|
|
r->padding.left,
|
|
|
|
r->padding.top,
|
2018-10-14 06:25:33 +02:00
|
|
|
int(getDesktopWidth()) - 1 - r->padding.right,
|
|
|
|
int(getDesktopHeight()) - 1 - r->padding.bottom
|
2016-11-02 00:37:58 +01:00
|
|
|
);
|
|
|
|
}
|
2015-05-23 13:35:12 +02:00
|
|
|
|
2016-11-02 00:37:58 +01:00
|
|
|
//----------------------------------------------------------------------
|
|
|
|
void FWidget::move (int dx, int dy)
|
|
|
|
{
|
2017-09-11 03:06:02 +02:00
|
|
|
wsize.move(dx, dy);
|
|
|
|
adjust_wsize.move(dx, dy);
|
2016-11-02 00:37:58 +01:00
|
|
|
}
|
2016-07-09 00:01:59 +02:00
|
|
|
|
2016-11-02 00:37:58 +01:00
|
|
|
//----------------------------------------------------------------------
|
|
|
|
void FWidget::drawShadow()
|
|
|
|
{
|
2018-11-04 23:00:06 +01:00
|
|
|
if ( isMonochron() && ! flags.trans_shadow )
|
2016-11-02 00:37:58 +01:00
|
|
|
return;
|
|
|
|
|
2018-11-04 23:00:06 +01:00
|
|
|
if ( (getEncoding() == fc::VT100 && ! flags.trans_shadow)
|
|
|
|
|| (getEncoding() == fc::ASCII && ! flags.trans_shadow) )
|
2015-05-23 13:35:12 +02:00
|
|
|
{
|
2016-11-02 00:37:58 +01:00
|
|
|
clearShadow();
|
|
|
|
return;
|
|
|
|
}
|
2016-07-03 20:08:39 +02:00
|
|
|
|
2017-10-02 07:32:33 +02:00
|
|
|
int x1 = 1
|
2018-10-14 06:25:33 +02:00
|
|
|
, x2 = int(getWidth())
|
2017-10-02 07:32:33 +02:00
|
|
|
, y1 = 1
|
2018-10-14 06:25:33 +02:00
|
|
|
, y2 = int(getHeight());
|
2016-07-03 20:08:39 +02:00
|
|
|
|
2018-11-04 23:00:06 +01:00
|
|
|
if ( flags.trans_shadow )
|
2016-11-02 00:37:58 +01:00
|
|
|
{
|
|
|
|
// transparent shadow
|
2018-01-21 16:21:41 +01:00
|
|
|
drawTransparentShadow (x1, y1, x2, y2);
|
2016-11-02 00:37:58 +01:00
|
|
|
}
|
|
|
|
else
|
2015-05-23 13:35:12 +02:00
|
|
|
{
|
2016-11-02 00:37:58 +01:00
|
|
|
// non-transparent shadow
|
2018-01-21 16:21:41 +01:00
|
|
|
drawBlockShadow (x1, y1, x2, y2);
|
2016-11-02 00:37:58 +01:00
|
|
|
}
|
2015-05-23 13:35:12 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
//----------------------------------------------------------------------
|
2016-11-02 00:37:58 +01:00
|
|
|
void FWidget::clearShadow()
|
2015-05-23 13:35:12 +02:00
|
|
|
{
|
2016-11-02 00:37:58 +01:00
|
|
|
if ( isMonochron() )
|
|
|
|
return;
|
2015-05-23 13:35:12 +02:00
|
|
|
|
2018-10-14 06:25:33 +02:00
|
|
|
int w = int(getWidth());
|
|
|
|
int h = int(getHeight());
|
2015-05-23 13:35:12 +02:00
|
|
|
|
2016-11-02 00:37:58 +01:00
|
|
|
if ( isWindowWidget() )
|
|
|
|
{
|
|
|
|
setColor (wc.shadow_fg, wc.shadow_bg);
|
|
|
|
setInheritBackground(); // current background color will be ignored
|
|
|
|
}
|
|
|
|
else if ( FWidget* p = getParentWidget() )
|
|
|
|
setColor (wc.shadow_fg, p->getBackgroundColor());
|
2015-05-23 13:35:12 +02:00
|
|
|
|
2017-11-02 16:05:34 +01:00
|
|
|
if ( w <= offset.getX2() )
|
2015-09-28 04:31:29 +02:00
|
|
|
{
|
2018-10-14 06:25:33 +02:00
|
|
|
for (int i = 1; i <= int(getHeight()); i++)
|
2016-11-02 00:37:58 +01:00
|
|
|
{
|
2017-11-02 16:05:34 +01:00
|
|
|
setPrintPos (w + 1, i);
|
2016-11-02 00:37:58 +01:00
|
|
|
print (' '); // clear █
|
|
|
|
}
|
2015-09-28 04:31:29 +02:00
|
|
|
}
|
2015-09-27 16:00:13 +02:00
|
|
|
|
2017-11-02 16:05:34 +01:00
|
|
|
if ( h <= offset.getY2() )
|
2015-09-27 16:00:13 +02:00
|
|
|
{
|
2017-11-02 16:05:34 +01:00
|
|
|
setPrintPos (2, h + 1);
|
2016-09-25 23:53:48 +02:00
|
|
|
|
2018-10-14 06:25:33 +02:00
|
|
|
for (std::size_t i = 1; i <= getWidth(); i++)
|
2017-09-11 03:06:02 +02:00
|
|
|
print (' '); // clear ▀
|
2015-09-27 16:00:13 +02:00
|
|
|
}
|
|
|
|
|
2016-11-02 00:37:58 +01:00
|
|
|
if ( isWindowWidget() )
|
|
|
|
unsetInheritBackground();
|
2016-09-25 23:53:48 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
//----------------------------------------------------------------------
|
2016-11-02 00:37:58 +01:00
|
|
|
void FWidget::drawFlatBorder()
|
2016-09-25 23:53:48 +02:00
|
|
|
{
|
2016-11-02 00:37:58 +01:00
|
|
|
if ( ! isNewFont() )
|
2016-09-25 23:53:48 +02:00
|
|
|
return;
|
|
|
|
|
2017-10-02 07:32:33 +02:00
|
|
|
int x1 = 1
|
2018-10-14 06:25:33 +02:00
|
|
|
, x2 = int(getWidth()) + 1
|
2017-10-02 07:32:33 +02:00
|
|
|
, y1 = 0
|
2018-10-14 06:25:33 +02:00
|
|
|
, y2 = int(getHeight()) + 1;
|
2016-09-25 23:53:48 +02:00
|
|
|
|
2016-11-02 00:37:58 +01:00
|
|
|
if ( FWidget* p = getParentWidget() )
|
|
|
|
setColor (wc.dialog_fg, p->getBackgroundColor());
|
|
|
|
else
|
|
|
|
setColor (wc.dialog_fg, wc.dialog_bg);
|
2015-09-27 16:00:13 +02:00
|
|
|
|
2018-10-14 06:25:33 +02:00
|
|
|
for (int y = 0; y < int(getHeight()); y++)
|
2016-11-02 00:37:58 +01:00
|
|
|
{
|
2017-08-27 09:50:30 +02:00
|
|
|
setPrintPos (x1 - 1, y1 + y + 1);
|
2016-09-25 23:53:48 +02:00
|
|
|
|
2016-11-02 00:37:58 +01:00
|
|
|
if ( double_flatline_mask.left[uLong(y)] )
|
2017-09-11 03:06:02 +02:00
|
|
|
// left+right line (on left side)
|
|
|
|
print (fc::NF_rev_border_line_right_and_left);
|
2016-11-02 00:37:58 +01:00
|
|
|
else
|
2017-09-11 03:06:02 +02:00
|
|
|
// right line (on left side)
|
|
|
|
print (fc::NF_rev_border_line_right);
|
2016-11-02 00:37:58 +01:00
|
|
|
}
|
2015-09-27 16:00:13 +02:00
|
|
|
|
2017-08-27 09:50:30 +02:00
|
|
|
setPrintPos (x2, y1 + 1);
|
2016-09-25 23:53:48 +02:00
|
|
|
|
2018-10-14 06:25:33 +02:00
|
|
|
for (int y = 0; y < int(getHeight()); y++)
|
2016-11-02 00:37:58 +01:00
|
|
|
{
|
|
|
|
if ( double_flatline_mask.right[uLong(y)] )
|
2017-09-11 03:06:02 +02:00
|
|
|
// left+right line (on right side)
|
|
|
|
print (fc::NF_rev_border_line_right_and_left);
|
2016-11-02 00:37:58 +01:00
|
|
|
else
|
2017-09-11 03:06:02 +02:00
|
|
|
// left line (on right side)
|
|
|
|
print (fc::NF_border_line_left);
|
2015-05-23 13:35:12 +02:00
|
|
|
|
2017-08-27 09:50:30 +02:00
|
|
|
setPrintPos (x2, y1 + y + 2);
|
2016-11-02 00:37:58 +01:00
|
|
|
}
|
2015-05-23 13:35:12 +02:00
|
|
|
|
2016-11-02 00:37:58 +01:00
|
|
|
setPrintPos (x1, y1);
|
2015-05-23 13:35:12 +02:00
|
|
|
|
2018-10-14 06:25:33 +02:00
|
|
|
for (int x = 0; x < int(getWidth()); x++)
|
2016-11-02 00:37:58 +01:00
|
|
|
{
|
|
|
|
if ( double_flatline_mask.top[uLong(x)] )
|
2017-09-11 03:06:02 +02:00
|
|
|
// top+bottom line (at top)
|
|
|
|
print (fc::NF_border_line_up_and_down);
|
2016-11-02 00:37:58 +01:00
|
|
|
else
|
2017-09-11 03:06:02 +02:00
|
|
|
// bottom line (at top)
|
|
|
|
print (fc::NF_border_line_bottom);
|
2016-11-02 00:37:58 +01:00
|
|
|
}
|
2015-06-21 23:27:10 +02:00
|
|
|
|
2016-11-02 00:37:58 +01:00
|
|
|
setPrintPos (x1, y2);
|
|
|
|
|
2018-10-14 06:25:33 +02:00
|
|
|
for (int x = 0; x < int(getWidth()); x++)
|
2016-11-02 00:37:58 +01:00
|
|
|
{
|
|
|
|
if ( double_flatline_mask.bottom[uLong(x)] )
|
2017-09-11 03:06:02 +02:00
|
|
|
// top+bottom line (at bottom)
|
|
|
|
print (fc::NF_border_line_up_and_down);
|
2016-11-02 00:37:58 +01:00
|
|
|
else
|
2017-09-11 03:06:02 +02:00
|
|
|
// top line (at bottom)
|
|
|
|
print (fc::NF_border_line_upper);
|
2016-11-02 00:37:58 +01:00
|
|
|
}
|
2015-05-23 13:35:12 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
//----------------------------------------------------------------------
|
2016-11-02 00:37:58 +01:00
|
|
|
void FWidget::clearFlatBorder()
|
2015-05-23 13:35:12 +02:00
|
|
|
{
|
2016-11-02 00:37:58 +01:00
|
|
|
if ( ! isNewFont() )
|
2015-05-23 13:35:12 +02:00
|
|
|
return;
|
|
|
|
|
2017-10-02 07:32:33 +02:00
|
|
|
int x1 = 1
|
2018-10-14 06:25:33 +02:00
|
|
|
, x2 = int(getWidth()) + 1
|
2017-10-02 07:32:33 +02:00
|
|
|
, y1 = 0
|
2018-10-14 06:25:33 +02:00
|
|
|
, y2 = int(getHeight()) + 1;
|
2016-09-25 23:53:48 +02:00
|
|
|
|
2016-11-02 00:37:58 +01:00
|
|
|
if ( FWidget* p = getParentWidget() )
|
|
|
|
setColor (wc.dialog_fg, p->getBackgroundColor());
|
|
|
|
else
|
|
|
|
setColor (wc.dialog_fg, wc.dialog_bg);
|
2015-05-23 13:35:12 +02:00
|
|
|
|
2016-11-02 00:37:58 +01:00
|
|
|
// clear on left side
|
2018-10-14 06:25:33 +02:00
|
|
|
for (int y = 0; y < int(getHeight()); y++)
|
2016-11-02 00:37:58 +01:00
|
|
|
{
|
2017-08-27 09:50:30 +02:00
|
|
|
setPrintPos (x1 - 1, y1 + y + 1);
|
2015-05-23 13:35:12 +02:00
|
|
|
|
2016-11-02 00:37:58 +01:00
|
|
|
if ( double_flatline_mask.left[uLong(y)] )
|
|
|
|
print (fc::NF_border_line_left);
|
|
|
|
else
|
|
|
|
print (' ');
|
|
|
|
}
|
2015-06-21 23:27:10 +02:00
|
|
|
|
2016-11-02 00:37:58 +01:00
|
|
|
// clear on right side
|
2018-10-14 06:25:33 +02:00
|
|
|
for (int y = 0; y < int(getHeight()); y++)
|
2016-11-02 00:37:58 +01:00
|
|
|
{
|
2017-08-27 09:50:30 +02:00
|
|
|
setPrintPos (x2, y1 + y + 1);
|
2015-05-23 13:35:12 +02:00
|
|
|
|
2016-11-02 00:37:58 +01:00
|
|
|
if ( double_flatline_mask.right[uLong(y)] )
|
|
|
|
print (fc::NF_rev_border_line_right);
|
|
|
|
else
|
|
|
|
print (' ');
|
|
|
|
}
|
2016-05-16 21:11:32 +02:00
|
|
|
|
2016-11-02 00:37:58 +01:00
|
|
|
// clear at top
|
|
|
|
setPrintPos (x1, y1);
|
2016-05-16 21:11:32 +02:00
|
|
|
|
2018-10-14 06:25:33 +02:00
|
|
|
for (int x = 0; x < int(getWidth()); x++)
|
2016-05-16 21:11:32 +02:00
|
|
|
{
|
2016-11-02 00:37:58 +01:00
|
|
|
if ( double_flatline_mask.top[uLong(x)] )
|
|
|
|
print (fc::NF_border_line_upper);
|
2016-05-16 21:11:32 +02:00
|
|
|
else
|
2016-11-02 00:37:58 +01:00
|
|
|
print (' ');
|
2016-05-16 21:11:32 +02:00
|
|
|
}
|
|
|
|
|
2016-11-02 00:37:58 +01:00
|
|
|
// clear at bottom
|
|
|
|
setPrintPos (x1, y2);
|
2016-05-16 21:11:32 +02:00
|
|
|
|
2018-10-14 06:25:33 +02:00
|
|
|
for (int x = 0; x < int(getWidth()); x++)
|
2016-05-16 21:11:32 +02:00
|
|
|
{
|
2016-11-02 00:37:58 +01:00
|
|
|
if ( double_flatline_mask.bottom[uLong(x)] )
|
|
|
|
print (fc::NF_border_line_bottom);
|
2016-05-16 21:11:32 +02:00
|
|
|
else
|
2016-11-02 00:37:58 +01:00
|
|
|
print (' ');
|
2016-05-16 21:11:32 +02:00
|
|
|
}
|
2015-05-23 13:35:12 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
//----------------------------------------------------------------------
|
2016-11-02 00:37:58 +01:00
|
|
|
void FWidget::drawBorder (int x1, int y1, int x2, int y2)
|
2015-05-23 13:35:12 +02:00
|
|
|
{
|
2016-11-02 00:37:58 +01:00
|
|
|
if ( x1 > x2 )
|
|
|
|
std::swap (x1, x2);
|
2016-05-16 21:11:32 +02:00
|
|
|
|
2016-11-02 00:37:58 +01:00
|
|
|
if ( y1 > y2 )
|
|
|
|
std::swap (y1, y2);
|
2016-05-16 21:11:32 +02:00
|
|
|
|
2016-11-02 00:37:58 +01:00
|
|
|
if ( x1 < 1 )
|
|
|
|
x1 = 1;
|
|
|
|
|
|
|
|
if ( y1 < 1 )
|
|
|
|
y1 = 1;
|
|
|
|
|
2018-10-14 06:25:33 +02:00
|
|
|
if ( x2 > int(getWidth()) )
|
|
|
|
x2 = int(getWidth());
|
2016-11-02 00:37:58 +01:00
|
|
|
|
2018-10-14 06:25:33 +02:00
|
|
|
if ( y2 > int(getHeight()) )
|
|
|
|
y2 = int(getHeight());
|
2016-11-02 00:37:58 +01:00
|
|
|
|
|
|
|
if ( isNewFont() )
|
2018-02-10 17:35:09 +01:00
|
|
|
drawNewFontBox (x1, y1, x2, y2);
|
2016-11-02 00:37:58 +01:00
|
|
|
else
|
2018-02-10 17:35:09 +01:00
|
|
|
drawBox (x1, y1, x2, y2);
|
2016-09-25 23:53:48 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
//----------------------------------------------------------------------
|
2016-11-02 00:37:58 +01:00
|
|
|
void FWidget::quit()
|
2016-09-25 23:53:48 +02:00
|
|
|
{
|
2018-10-21 21:06:52 +02:00
|
|
|
FWidget* app_object = FApplication::getApplicationObject();
|
|
|
|
FApplication* fapp = static_cast<FApplication*>(app_object);
|
2016-11-02 00:37:58 +01:00
|
|
|
fapp->exit(0);
|
2015-05-23 13:35:12 +02:00
|
|
|
}
|
|
|
|
|
2016-11-02 00:37:58 +01:00
|
|
|
|
|
|
|
// protected methods of FWidget
|
2017-10-27 23:28:37 +02:00
|
|
|
//----------------------------------------------------------------------
|
|
|
|
FVTerm::term_area* FWidget::getPrintArea()
|
|
|
|
{
|
|
|
|
// returns the print area of this object
|
|
|
|
|
|
|
|
if ( print_area )
|
|
|
|
return print_area;
|
|
|
|
else
|
|
|
|
{
|
2017-10-30 20:29:00 +01:00
|
|
|
FWidget* obj;
|
|
|
|
FWidget* p_obj = this;
|
2017-10-27 23:28:37 +02:00
|
|
|
|
2017-10-30 20:29:00 +01:00
|
|
|
do
|
2017-10-27 23:28:37 +02:00
|
|
|
{
|
|
|
|
obj = p_obj;
|
2017-10-30 20:29:00 +01:00
|
|
|
p_obj = static_cast<FWidget*>(obj->getParent());
|
2017-10-27 23:28:37 +02:00
|
|
|
}
|
2017-10-30 20:29:00 +01:00
|
|
|
while ( ! obj->vwin && ! obj->child_print_area && p_obj );
|
2017-10-27 23:28:37 +02:00
|
|
|
|
|
|
|
if ( obj->vwin )
|
|
|
|
{
|
|
|
|
print_area = obj->vwin;
|
|
|
|
return print_area;
|
|
|
|
}
|
|
|
|
else if ( obj->child_print_area )
|
|
|
|
{
|
|
|
|
print_area = obj->child_print_area;
|
|
|
|
return print_area;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return vdesktop;
|
|
|
|
}
|
|
|
|
|
2017-10-30 20:29:00 +01:00
|
|
|
//----------------------------------------------------------------------
|
|
|
|
void FWidget::addPreprocessingHandler ( FVTerm* instance
|
|
|
|
, FPreprocessingHandler handler )
|
|
|
|
{
|
|
|
|
if ( ! print_area )
|
|
|
|
FWidget::getPrintArea();
|
|
|
|
|
|
|
|
FVTerm::addPreprocessingHandler (instance, handler);
|
|
|
|
}
|
|
|
|
|
|
|
|
//----------------------------------------------------------------------
|
|
|
|
void FWidget::delPreprocessingHandler (FVTerm* instance)
|
|
|
|
{
|
|
|
|
if ( ! print_area )
|
|
|
|
FWidget::getPrintArea();
|
|
|
|
|
|
|
|
FVTerm::delPreprocessingHandler (instance);
|
|
|
|
}
|
|
|
|
|
2017-10-27 23:28:37 +02:00
|
|
|
//----------------------------------------------------------------------
|
|
|
|
bool FWidget::isChildPrintArea() const
|
|
|
|
{
|
|
|
|
FWidget* p_obj = static_cast<FWidget*>(getParent());
|
|
|
|
|
|
|
|
if ( p_obj
|
2017-11-26 22:37:18 +01:00
|
|
|
&& p_obj->child_print_area
|
|
|
|
&& p_obj->child_print_area == print_area )
|
2017-10-27 23:28:37 +02:00
|
|
|
return true;
|
|
|
|
else
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2015-05-23 13:35:12 +02:00
|
|
|
//----------------------------------------------------------------------
|
2016-11-02 00:37:58 +01:00
|
|
|
void FWidget::setStatusBar (FStatusBar* sbar)
|
2015-05-23 13:35:12 +02:00
|
|
|
{
|
2016-11-02 00:37:58 +01:00
|
|
|
if ( ! sbar || statusbar == sbar )
|
|
|
|
return;
|
|
|
|
|
2017-10-02 07:32:33 +02:00
|
|
|
if ( statusbar )
|
2016-11-02 00:37:58 +01:00
|
|
|
delete statusbar;
|
|
|
|
|
|
|
|
statusbar = sbar;
|
2015-05-23 13:35:12 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
//----------------------------------------------------------------------
|
2016-11-02 00:37:58 +01:00
|
|
|
void FWidget::setMenuBar (FMenuBar* mbar)
|
2015-05-23 13:35:12 +02:00
|
|
|
{
|
2016-11-02 00:37:58 +01:00
|
|
|
if ( ! mbar || menubar == mbar )
|
|
|
|
return;
|
2016-09-11 16:48:39 +02:00
|
|
|
|
2016-11-02 00:37:58 +01:00
|
|
|
if ( menubar )
|
|
|
|
delete menubar;
|
2016-09-25 23:53:48 +02:00
|
|
|
|
2016-11-02 00:37:58 +01:00
|
|
|
menubar = mbar;
|
|
|
|
}
|
2015-05-23 13:35:12 +02:00
|
|
|
|
2016-11-02 00:37:58 +01:00
|
|
|
//----------------------------------------------------------------------
|
|
|
|
void FWidget::adjustSize()
|
|
|
|
{
|
|
|
|
if ( ! isRootWidget() )
|
2015-05-23 13:35:12 +02:00
|
|
|
{
|
2016-11-02 00:37:58 +01:00
|
|
|
FWidget* p = getParentWidget();
|
|
|
|
|
|
|
|
if ( isWindowWidget() )
|
|
|
|
{
|
|
|
|
if ( ignore_padding && ! isDialogWidget() )
|
|
|
|
setTermOffset();
|
|
|
|
else
|
|
|
|
offset = rootObject->client_offset;
|
|
|
|
}
|
|
|
|
else if ( ignore_padding && p )
|
|
|
|
{
|
|
|
|
offset.setCoordinates ( p->getTermX() - 1
|
|
|
|
, p->getTermY() - 1
|
2018-10-14 06:25:33 +02:00
|
|
|
, p->getTermX() + int(p->getWidth()) - 2
|
|
|
|
, p->getTermY() + int(p->getHeight()) - 2 );
|
2016-11-02 00:37:58 +01:00
|
|
|
}
|
|
|
|
else if ( p )
|
|
|
|
offset = p->client_offset;
|
|
|
|
|
|
|
|
adjust_wsize = wsize;
|
2015-05-23 13:35:12 +02:00
|
|
|
}
|
2016-09-02 23:06:47 +02:00
|
|
|
|
2017-01-22 23:04:40 +01:00
|
|
|
// Move and shrink in case of lack of space
|
|
|
|
if ( ! hasChildPrintArea() )
|
|
|
|
insufficientSpaceAdjust();
|
2015-05-23 13:35:12 +02:00
|
|
|
|
2016-11-02 00:37:58 +01:00
|
|
|
client_offset.setCoordinates
|
|
|
|
(
|
|
|
|
getTermX() - 1 + padding.left,
|
|
|
|
getTermY() - 1 + padding.top,
|
2018-10-14 06:25:33 +02:00
|
|
|
getTermX() - 2 + int(getWidth()) - padding.right,
|
|
|
|
getTermY() - 2 + int(getHeight()) - padding.bottom
|
2016-11-02 00:37:58 +01:00
|
|
|
);
|
2015-05-23 13:35:12 +02:00
|
|
|
|
2017-09-17 01:50:41 +02:00
|
|
|
if ( hasChildren() )
|
2016-11-02 00:37:58 +01:00
|
|
|
{
|
2017-09-17 01:50:41 +02:00
|
|
|
constFObjectIterator iter, last;
|
|
|
|
iter = FObject::begin();
|
|
|
|
last = FObject::end();
|
2016-10-11 04:57:36 +02:00
|
|
|
|
2017-09-17 01:50:41 +02:00
|
|
|
while ( iter != last )
|
2016-11-02 00:37:58 +01:00
|
|
|
{
|
2017-06-11 17:47:50 +02:00
|
|
|
if ( (*iter)->isWidget() )
|
|
|
|
{
|
|
|
|
FWidget* widget = static_cast<FWidget*>(*iter);
|
2016-10-15 03:32:30 +02:00
|
|
|
|
2017-06-11 17:47:50 +02:00
|
|
|
if ( ! widget->isWindowWidget() )
|
|
|
|
widget->adjustSize();
|
|
|
|
}
|
2016-11-02 00:37:58 +01:00
|
|
|
++iter;
|
|
|
|
}
|
|
|
|
}
|
2016-10-11 04:57:36 +02:00
|
|
|
}
|
|
|
|
|
2015-05-23 13:35:12 +02:00
|
|
|
//----------------------------------------------------------------------
|
2016-11-02 00:37:58 +01:00
|
|
|
void FWidget::adjustSizeGlobal()
|
2015-05-23 13:35:12 +02:00
|
|
|
{
|
2016-11-02 00:37:58 +01:00
|
|
|
if ( ! isRootWidget() )
|
2015-05-23 13:35:12 +02:00
|
|
|
{
|
2016-11-02 00:37:58 +01:00
|
|
|
getRootWidget()->adjustSizeGlobal();
|
2015-05-23 13:35:12 +02:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2016-11-02 00:37:58 +01:00
|
|
|
if ( window_list && ! window_list->empty() )
|
2015-05-23 13:35:12 +02:00
|
|
|
{
|
2017-09-17 01:50:41 +02:00
|
|
|
widgetList::const_iterator iter, last;
|
2016-11-02 00:37:58 +01:00
|
|
|
iter = window_list->begin();
|
2017-09-17 01:50:41 +02:00
|
|
|
last = window_list->end();
|
2016-07-09 00:01:59 +02:00
|
|
|
|
2017-09-17 01:50:41 +02:00
|
|
|
while ( iter != last )
|
2015-05-23 13:35:12 +02:00
|
|
|
{
|
2016-11-02 00:37:58 +01:00
|
|
|
(*iter)->adjustSize();
|
|
|
|
++iter;
|
2016-08-25 01:54:10 +02:00
|
|
|
}
|
2016-11-02 00:37:58 +01:00
|
|
|
}
|
|
|
|
}
|
2016-07-09 00:01:59 +02:00
|
|
|
|
2016-11-02 00:37:58 +01:00
|
|
|
//----------------------------------------------------------------------
|
|
|
|
bool FWidget::focusNextChild()
|
|
|
|
{
|
2018-02-11 23:41:23 +01:00
|
|
|
if ( isDialogWidget() || ! hasParent() )
|
2016-11-02 00:37:58 +01:00
|
|
|
return false;
|
2016-07-09 00:01:59 +02:00
|
|
|
|
2018-02-11 23:41:23 +01:00
|
|
|
FWidget* parent = getParentWidget();
|
|
|
|
|
2018-03-30 00:12:20 +02:00
|
|
|
if ( ! parent
|
|
|
|
|| ! parent->hasChildren()
|
|
|
|
|| parent->numOfFocusableChildren() <= 1 )
|
2018-02-11 23:41:23 +01:00
|
|
|
return false;
|
|
|
|
|
|
|
|
FObjectIterator iter, last;
|
|
|
|
iter = parent->begin();
|
|
|
|
last = parent->end();
|
|
|
|
|
|
|
|
while ( iter != last )
|
2015-05-23 13:35:12 +02:00
|
|
|
{
|
2018-02-11 23:41:23 +01:00
|
|
|
if ( ! (*iter)->isWidget() )
|
|
|
|
{
|
|
|
|
++iter;
|
|
|
|
continue;
|
|
|
|
}
|
2016-08-27 23:23:42 +02:00
|
|
|
|
2018-02-11 23:41:23 +01:00
|
|
|
FWidget* w = static_cast<FWidget*>(*iter);
|
|
|
|
|
|
|
|
if ( w != this )
|
2016-08-27 23:23:42 +02:00
|
|
|
{
|
2018-02-11 23:41:23 +01:00
|
|
|
++iter;
|
|
|
|
continue;
|
|
|
|
}
|
2015-05-23 13:35:12 +02:00
|
|
|
|
2018-02-11 23:41:23 +01:00
|
|
|
FWidget* next = 0;
|
|
|
|
constFObjectIterator next_element;
|
|
|
|
next_element = iter;
|
2017-06-11 17:47:50 +02:00
|
|
|
|
2018-02-11 23:41:23 +01:00
|
|
|
do
|
|
|
|
{
|
|
|
|
++next_element;
|
2015-05-23 13:35:12 +02:00
|
|
|
|
2018-02-11 23:41:23 +01:00
|
|
|
if ( next_element == parent->end() )
|
|
|
|
next_element = parent->begin();
|
|
|
|
|
|
|
|
if ( ! (*next_element)->isWidget() )
|
|
|
|
continue;
|
|
|
|
|
|
|
|
next = static_cast<FWidget*>(*next_element);
|
|
|
|
} while ( ! next
|
|
|
|
|| ! next->isEnabled()
|
|
|
|
|| ! next->acceptFocus()
|
|
|
|
|| ! next->isVisible()
|
|
|
|
|| next->isWindowWidget() );
|
|
|
|
|
|
|
|
bool accpt = changeFocus (next, parent, fc::FocusNextWidget);
|
|
|
|
|
|
|
|
if ( ! accpt )
|
|
|
|
return false;
|
|
|
|
|
|
|
|
break; // The focus has been changed
|
2015-05-23 13:35:12 +02:00
|
|
|
}
|
2018-02-11 23:41:23 +01:00
|
|
|
|
2016-11-02 00:37:58 +01:00
|
|
|
return true;
|
2015-05-23 13:35:12 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
//----------------------------------------------------------------------
|
2016-11-02 00:37:58 +01:00
|
|
|
bool FWidget::focusPrevChild()
|
2015-05-23 13:35:12 +02:00
|
|
|
{
|
2018-02-11 23:41:23 +01:00
|
|
|
if ( isDialogWidget() || ! hasParent() )
|
2016-11-02 00:37:58 +01:00
|
|
|
return false;
|
2015-05-23 13:35:12 +02:00
|
|
|
|
2018-02-11 23:41:23 +01:00
|
|
|
FWidget* parent = getParentWidget();
|
|
|
|
|
2018-03-30 00:12:20 +02:00
|
|
|
if ( ! parent
|
|
|
|
|| ! parent->hasChildren()
|
|
|
|
|| parent->numOfFocusableChildren() <= 1 )
|
2018-02-11 23:41:23 +01:00
|
|
|
return false;
|
|
|
|
|
|
|
|
FObjectIterator iter, first;
|
|
|
|
iter = parent->end();
|
|
|
|
first = parent->begin();
|
|
|
|
|
|
|
|
do
|
2016-08-27 23:23:42 +02:00
|
|
|
{
|
2018-02-11 23:41:23 +01:00
|
|
|
--iter;
|
2016-08-27 23:23:42 +02:00
|
|
|
|
2018-02-11 23:41:23 +01:00
|
|
|
if ( ! (*iter)->isWidget() )
|
|
|
|
continue;
|
2016-07-09 00:01:59 +02:00
|
|
|
|
2018-02-11 23:41:23 +01:00
|
|
|
FWidget* w = static_cast<FWidget*>(*iter);
|
2017-06-11 17:47:50 +02:00
|
|
|
|
2018-02-11 23:41:23 +01:00
|
|
|
if ( w != this )
|
|
|
|
continue;
|
2017-06-11 17:47:50 +02:00
|
|
|
|
2018-02-11 23:41:23 +01:00
|
|
|
FWidget* prev = 0;
|
|
|
|
constFObjectIterator prev_element;
|
|
|
|
prev_element = iter;
|
2016-08-27 23:23:42 +02:00
|
|
|
|
2018-02-11 23:41:23 +01:00
|
|
|
do
|
|
|
|
{
|
|
|
|
if ( ! (*prev_element)->isWidget() )
|
|
|
|
{
|
|
|
|
--prev_element;
|
|
|
|
continue;
|
2016-11-02 00:37:58 +01:00
|
|
|
}
|
2018-02-11 23:41:23 +01:00
|
|
|
|
|
|
|
if ( prev_element == parent->begin() )
|
|
|
|
prev_element = parent->end();
|
|
|
|
|
|
|
|
--prev_element;
|
|
|
|
prev = static_cast<FWidget*>(*prev_element);
|
|
|
|
} while ( ! prev
|
|
|
|
|| ! prev->isEnabled()
|
|
|
|
|| ! prev->acceptFocus()
|
|
|
|
|| ! prev->isVisible()
|
|
|
|
|| prev->isWindowWidget() );
|
|
|
|
|
|
|
|
bool accpt = changeFocus (prev, parent, fc::FocusPreviousWidget);
|
|
|
|
|
|
|
|
if ( ! accpt )
|
|
|
|
return false;
|
|
|
|
|
|
|
|
break; // The focus has been changed
|
2015-05-23 13:35:12 +02:00
|
|
|
}
|
2018-02-11 23:41:23 +01:00
|
|
|
while ( iter != first );
|
2015-05-23 13:35:12 +02:00
|
|
|
|
2016-11-02 00:37:58 +01:00
|
|
|
return true;
|
|
|
|
}
|
2016-07-09 00:01:59 +02:00
|
|
|
|
2016-11-02 00:37:58 +01:00
|
|
|
//----------------------------------------------------------------------
|
|
|
|
bool FWidget::event (FEvent* ev)
|
|
|
|
{
|
|
|
|
switch ( ev->type() )
|
2015-05-23 13:35:12 +02:00
|
|
|
{
|
2016-11-02 00:37:58 +01:00
|
|
|
case fc::KeyPress_Event:
|
2017-12-03 21:06:21 +01:00
|
|
|
KeyPressEvent ( static_cast<FKeyEvent*>(ev) );
|
2016-11-02 00:37:58 +01:00
|
|
|
break;
|
2015-05-23 13:35:12 +02:00
|
|
|
|
2016-11-02 00:37:58 +01:00
|
|
|
case fc::KeyUp_Event:
|
|
|
|
onKeyUp ( static_cast<FKeyEvent*>(ev) );
|
|
|
|
break;
|
2016-08-27 23:23:42 +02:00
|
|
|
|
2016-11-02 00:37:58 +01:00
|
|
|
case fc::KeyDown_Event:
|
2017-12-03 21:06:21 +01:00
|
|
|
KeyDownEvent ( static_cast<FKeyEvent*>(ev) );
|
2016-11-02 00:37:58 +01:00
|
|
|
break;
|
2015-05-23 13:35:12 +02:00
|
|
|
|
2016-11-02 00:37:58 +01:00
|
|
|
case fc::MouseDown_Event:
|
|
|
|
onMouseDown ( static_cast<FMouseEvent*>(ev) );
|
|
|
|
break;
|
2016-09-03 15:17:48 +02:00
|
|
|
|
2016-11-02 00:37:58 +01:00
|
|
|
case fc::MouseUp_Event:
|
|
|
|
onMouseUp ( static_cast<FMouseEvent*>(ev) );
|
2015-06-21 23:27:10 +02:00
|
|
|
break;
|
|
|
|
|
2016-11-02 00:37:58 +01:00
|
|
|
case fc::MouseDoubleClick_Event:
|
|
|
|
onMouseDoubleClick ( static_cast<FMouseEvent*>(ev) );
|
2015-06-21 23:27:10 +02:00
|
|
|
break;
|
|
|
|
|
2016-11-02 00:37:58 +01:00
|
|
|
case fc::MouseWheel_Event:
|
|
|
|
onWheel ( static_cast<FWheelEvent*>(ev) );
|
2015-06-21 23:27:10 +02:00
|
|
|
break;
|
|
|
|
|
2016-11-02 00:37:58 +01:00
|
|
|
case fc::MouseMove_Event:
|
|
|
|
onMouseMove ( static_cast<FMouseEvent*>(ev) );
|
2015-06-21 23:27:10 +02:00
|
|
|
break;
|
2015-09-20 05:44:50 +02:00
|
|
|
|
2016-11-02 00:37:58 +01:00
|
|
|
case fc::FocusIn_Event:
|
|
|
|
onFocusIn ( static_cast<FFocusEvent*>(ev) );
|
2015-09-20 05:44:50 +02:00
|
|
|
break;
|
2016-09-03 15:17:48 +02:00
|
|
|
|
2016-11-02 00:37:58 +01:00
|
|
|
case fc::FocusOut_Event:
|
|
|
|
onFocusOut ( static_cast<FFocusEvent*>(ev) );
|
2016-09-03 15:17:48 +02:00
|
|
|
break;
|
|
|
|
|
2017-01-28 22:03:15 +01:00
|
|
|
case fc::ChildFocusIn_Event:
|
|
|
|
onChildFocusIn ( static_cast<FFocusEvent*>(ev) );
|
|
|
|
break;
|
|
|
|
|
|
|
|
case fc::ChildFocusOut_Event:
|
|
|
|
onChildFocusOut ( static_cast<FFocusEvent*>(ev) );
|
2017-01-26 00:31:07 +01:00
|
|
|
break;
|
|
|
|
|
2016-11-02 00:37:58 +01:00
|
|
|
case fc::Accelerator_Event:
|
|
|
|
onAccel ( static_cast<FAccelEvent*>(ev) );
|
2016-09-03 15:17:48 +02:00
|
|
|
break;
|
|
|
|
|
2016-11-02 00:37:58 +01:00
|
|
|
case fc::Resize_Event:
|
|
|
|
onResize ( static_cast<FResizeEvent*>(ev) );
|
|
|
|
break;
|
2016-09-03 15:17:48 +02:00
|
|
|
|
2016-11-02 00:37:58 +01:00
|
|
|
case fc::Show_Event:
|
|
|
|
onShow ( static_cast<FShowEvent*>(ev) );
|
2016-09-03 15:17:48 +02:00
|
|
|
break;
|
|
|
|
|
2016-11-02 00:37:58 +01:00
|
|
|
case fc::Hide_Event:
|
|
|
|
onHide ( static_cast<FHideEvent*>(ev) );
|
|
|
|
break;
|
2016-09-03 15:17:48 +02:00
|
|
|
|
2016-11-02 00:37:58 +01:00
|
|
|
case fc::Close_Event:
|
|
|
|
onClose ( static_cast<FCloseEvent*>(ev) );
|
|
|
|
break;
|
2016-09-03 15:17:48 +02:00
|
|
|
|
2016-11-02 00:37:58 +01:00
|
|
|
case fc::Timer_Event:
|
|
|
|
onTimer ( static_cast<FTimerEvent*>(ev) );
|
2016-09-03 15:17:48 +02:00
|
|
|
break;
|
|
|
|
|
|
|
|
default:
|
2016-11-02 00:37:58 +01:00
|
|
|
return false;
|
2016-09-03 15:17:48 +02:00
|
|
|
}
|
2017-12-03 21:06:21 +01:00
|
|
|
|
2016-11-02 00:37:58 +01:00
|
|
|
return true;
|
2016-09-03 15:17:48 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
//----------------------------------------------------------------------
|
2016-11-02 00:37:58 +01:00
|
|
|
void FWidget::onKeyPress (FKeyEvent*)
|
|
|
|
{ }
|
2015-06-21 23:27:10 +02:00
|
|
|
|
2016-11-02 00:37:58 +01:00
|
|
|
//----------------------------------------------------------------------
|
|
|
|
void FWidget::onKeyUp (FKeyEvent*)
|
|
|
|
{ }
|
2015-06-21 23:27:10 +02:00
|
|
|
|
2016-11-02 00:37:58 +01:00
|
|
|
//----------------------------------------------------------------------
|
|
|
|
void FWidget::onKeyDown (FKeyEvent*)
|
|
|
|
{ }
|
2015-06-21 23:27:10 +02:00
|
|
|
|
2016-11-02 00:37:58 +01:00
|
|
|
//----------------------------------------------------------------------
|
|
|
|
void FWidget::onMouseDown (FMouseEvent*)
|
|
|
|
{ }
|
2015-06-21 23:27:10 +02:00
|
|
|
|
2016-11-02 00:37:58 +01:00
|
|
|
//----------------------------------------------------------------------
|
|
|
|
void FWidget::onMouseUp (FMouseEvent*)
|
|
|
|
{ }
|
2015-06-21 23:27:10 +02:00
|
|
|
|
2015-05-23 13:35:12 +02:00
|
|
|
//----------------------------------------------------------------------
|
2016-11-02 00:37:58 +01:00
|
|
|
void FWidget::onMouseDoubleClick (FMouseEvent*)
|
|
|
|
{ }
|
2015-05-23 13:35:12 +02:00
|
|
|
|
2016-11-02 00:37:58 +01:00
|
|
|
//----------------------------------------------------------------------
|
|
|
|
void FWidget::onWheel (FWheelEvent*)
|
|
|
|
{ }
|
2015-05-23 13:35:12 +02:00
|
|
|
|
2016-11-02 00:37:58 +01:00
|
|
|
//----------------------------------------------------------------------
|
|
|
|
void FWidget::onMouseMove (FMouseEvent*)
|
|
|
|
{ }
|
2016-07-09 00:01:59 +02:00
|
|
|
|
2016-11-02 00:37:58 +01:00
|
|
|
//----------------------------------------------------------------------
|
|
|
|
void FWidget::onFocusIn (FFocusEvent*)
|
|
|
|
{ }
|
2016-07-09 00:01:59 +02:00
|
|
|
|
2016-11-02 00:37:58 +01:00
|
|
|
//----------------------------------------------------------------------
|
|
|
|
void FWidget::onFocusOut (FFocusEvent*)
|
|
|
|
{ }
|
2016-07-09 00:01:59 +02:00
|
|
|
|
2017-01-26 00:31:07 +01:00
|
|
|
//----------------------------------------------------------------------
|
2017-01-28 22:03:15 +01:00
|
|
|
void FWidget::onChildFocusIn (FFocusEvent*)
|
|
|
|
{ }
|
|
|
|
|
|
|
|
//----------------------------------------------------------------------
|
|
|
|
void FWidget::onChildFocusOut (FFocusEvent*)
|
2017-01-26 00:31:07 +01:00
|
|
|
{ }
|
|
|
|
|
2016-11-02 00:37:58 +01:00
|
|
|
//----------------------------------------------------------------------
|
|
|
|
void FWidget::onAccel (FAccelEvent*)
|
|
|
|
{ }
|
2015-05-23 13:35:12 +02:00
|
|
|
|
2016-11-02 00:37:58 +01:00
|
|
|
//----------------------------------------------------------------------
|
|
|
|
void FWidget::onResize (FResizeEvent* ev)
|
|
|
|
{
|
|
|
|
rootObject->resize();
|
|
|
|
rootObject->redraw();
|
|
|
|
ev->accept();
|
|
|
|
}
|
2016-07-09 00:01:59 +02:00
|
|
|
|
2016-11-02 00:37:58 +01:00
|
|
|
//----------------------------------------------------------------------
|
|
|
|
void FWidget::onShow (FShowEvent*)
|
|
|
|
{ }
|
2016-07-09 00:01:59 +02:00
|
|
|
|
2016-11-02 00:37:58 +01:00
|
|
|
//----------------------------------------------------------------------
|
|
|
|
void FWidget::onHide (FHideEvent*)
|
|
|
|
{ }
|
2016-07-09 00:01:59 +02:00
|
|
|
|
2016-11-02 00:37:58 +01:00
|
|
|
//----------------------------------------------------------------------
|
|
|
|
void FWidget::onClose (FCloseEvent* ev)
|
|
|
|
{
|
|
|
|
ev->accept();
|
|
|
|
}
|
2016-07-09 00:01:59 +02:00
|
|
|
|
|
|
|
|
2016-11-02 00:37:58 +01:00
|
|
|
// private methods of FWidget
|
|
|
|
//----------------------------------------------------------------------
|
|
|
|
void FWidget::init()
|
|
|
|
{
|
2017-08-12 22:55:29 +02:00
|
|
|
try
|
|
|
|
{
|
|
|
|
// Initialize widget lists
|
|
|
|
window_list = new widgetList();
|
|
|
|
dialog_list = new widgetList();
|
|
|
|
always_on_top_list = new widgetList();
|
|
|
|
close_widget = new widgetList();
|
|
|
|
}
|
|
|
|
catch (const std::bad_alloc& ex)
|
|
|
|
{
|
2018-11-22 21:51:32 +01:00
|
|
|
std::cerr << bad_alloc_str << ex.what() << std::endl;
|
2017-08-12 22:55:29 +02:00
|
|
|
return;
|
|
|
|
}
|
2016-07-09 00:01:59 +02:00
|
|
|
|
2018-10-29 00:45:45 +01:00
|
|
|
hideable = isCursorHideable();
|
2018-11-05 23:19:03 +01:00
|
|
|
flags.visible_cursor = ! hideable;
|
2016-11-12 22:59:48 +01:00
|
|
|
|
2017-08-12 22:55:29 +02:00
|
|
|
// Determine width and height of the terminal
|
2016-11-02 00:37:58 +01:00
|
|
|
detectTermSize();
|
2017-12-30 21:27:17 +01:00
|
|
|
wsize.setRect(1, 1, getDesktopWidth(), getDesktopHeight());
|
2016-11-02 00:37:58 +01:00
|
|
|
adjust_wsize = wsize;
|
2017-12-30 21:27:17 +01:00
|
|
|
offset.setRect(0, 0, getDesktopWidth(), getDesktopHeight());
|
2016-11-02 00:37:58 +01:00
|
|
|
client_offset = offset;
|
2015-05-23 13:35:12 +02:00
|
|
|
|
2018-10-14 06:25:33 +02:00
|
|
|
double_flatline_mask.top.resize (getWidth(), false);
|
|
|
|
double_flatline_mask.right.resize (getHeight(), false);
|
|
|
|
double_flatline_mask.bottom.resize (getWidth(), false);
|
|
|
|
double_flatline_mask.left.resize (getHeight(), false);
|
2016-07-09 00:01:59 +02:00
|
|
|
|
2016-11-02 00:37:58 +01:00
|
|
|
// Initialize default widget colors
|
|
|
|
setColorTheme();
|
2016-07-09 00:01:59 +02:00
|
|
|
|
2018-01-24 00:25:32 +01:00
|
|
|
// Default foreground and background color of the desktop/terminal
|
2016-11-02 00:37:58 +01:00
|
|
|
foreground_color = wc.term_fg;
|
|
|
|
background_color = wc.term_bg;
|
2016-11-27 19:16:52 +01:00
|
|
|
init_desktop = false;
|
2016-07-09 00:01:59 +02:00
|
|
|
|
2017-08-12 22:55:29 +02:00
|
|
|
try
|
|
|
|
{
|
|
|
|
accelerator_list = new Accelerators();
|
|
|
|
}
|
|
|
|
catch (const std::bad_alloc& ex)
|
|
|
|
{
|
2018-11-22 21:51:32 +01:00
|
|
|
std::cerr << bad_alloc_str << ex.what() << std::endl;
|
2017-08-12 22:55:29 +02:00
|
|
|
}
|
2016-11-02 00:37:58 +01:00
|
|
|
}
|
2016-07-09 00:01:59 +02:00
|
|
|
|
2016-11-02 00:37:58 +01:00
|
|
|
//----------------------------------------------------------------------
|
|
|
|
void FWidget::finish()
|
|
|
|
{
|
|
|
|
delete accelerator_list;
|
|
|
|
accelerator_list = 0;
|
2016-07-09 00:01:59 +02:00
|
|
|
|
2016-11-02 00:37:58 +01:00
|
|
|
if ( close_widget )
|
|
|
|
{
|
|
|
|
delete close_widget;
|
|
|
|
close_widget = 0;
|
|
|
|
}
|
2015-05-23 13:35:12 +02:00
|
|
|
|
2016-11-02 00:37:58 +01:00
|
|
|
if ( dialog_list )
|
|
|
|
{
|
|
|
|
delete dialog_list;
|
|
|
|
dialog_list = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( always_on_top_list )
|
|
|
|
{
|
|
|
|
delete always_on_top_list;
|
|
|
|
always_on_top_list = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( window_list )
|
|
|
|
{
|
|
|
|
delete window_list;
|
|
|
|
window_list = 0;
|
2015-05-23 13:35:12 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-01-22 23:04:40 +01:00
|
|
|
//----------------------------------------------------------------------
|
|
|
|
inline void FWidget::insufficientSpaceAdjust()
|
|
|
|
{
|
|
|
|
// Move and shrink widget if there is not enough space available
|
|
|
|
|
|
|
|
if ( isWindowWidget() )
|
|
|
|
return;
|
|
|
|
|
|
|
|
// move left if not enough space
|
2018-10-14 06:25:33 +02:00
|
|
|
while ( getTermX() + int(getWidth()) - padding.right > offset.getX2() + 2 )
|
2017-01-22 23:04:40 +01:00
|
|
|
{
|
|
|
|
adjust_wsize.x1_ref()--;
|
|
|
|
adjust_wsize.x2_ref()--;
|
|
|
|
|
|
|
|
if ( adjust_wsize.x1_ref() < 1 )
|
|
|
|
adjust_wsize.x1_ref() = 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
// move up if not enough space
|
2018-10-14 06:25:33 +02:00
|
|
|
while ( getTermY() + int(getHeight()) - padding.bottom > offset.getY2() + 2 )
|
2017-01-22 23:04:40 +01:00
|
|
|
{
|
|
|
|
adjust_wsize.y1_ref()--;
|
|
|
|
adjust_wsize.y2_ref()--;
|
|
|
|
|
|
|
|
if ( adjust_wsize.y1_ref() < 1 )
|
|
|
|
adjust_wsize.y1_ref() = 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
// reduce the width if not enough space
|
2018-10-14 06:25:33 +02:00
|
|
|
while ( offset.getX1() + int(getWidth()) - 1 > offset.getX2() )
|
2017-01-22 23:04:40 +01:00
|
|
|
adjust_wsize.x2_ref()--;
|
|
|
|
|
|
|
|
if ( getWidth() < size_hints.min_width )
|
|
|
|
adjust_wsize.setWidth(size_hints.min_width);
|
|
|
|
|
2018-10-14 06:25:33 +02:00
|
|
|
if ( getWidth() == 0 )
|
2017-01-22 23:04:40 +01:00
|
|
|
adjust_wsize.setWidth(1);
|
|
|
|
|
|
|
|
// reduce the height if not enough space
|
2018-10-14 06:25:33 +02:00
|
|
|
while ( offset.getY1() + int(getHeight()) - 1 > offset.getY2() )
|
2017-01-22 23:04:40 +01:00
|
|
|
adjust_wsize.y2_ref()--;
|
|
|
|
|
|
|
|
if ( getHeight() < size_hints.min_height )
|
|
|
|
adjust_wsize.setWidth(size_hints.min_height);
|
|
|
|
|
|
|
|
if ( getHeight() <= 0 )
|
|
|
|
adjust_wsize.setHeight(1);
|
|
|
|
}
|
|
|
|
|
2017-12-03 21:06:21 +01:00
|
|
|
//----------------------------------------------------------------------
|
|
|
|
void FWidget::KeyPressEvent (FKeyEvent* kev)
|
|
|
|
{
|
|
|
|
bool accpt_focus = false;
|
|
|
|
|
|
|
|
if ( kev->key() == fc::Fkey_tab )
|
|
|
|
accpt_focus = focusNextChild();
|
|
|
|
else if ( kev->key() == fc::Fkey_btab )
|
|
|
|
accpt_focus = focusPrevChild();
|
|
|
|
|
|
|
|
if ( accpt_focus )
|
|
|
|
return;
|
|
|
|
|
|
|
|
FWidget* widget = this;
|
|
|
|
|
|
|
|
while ( widget )
|
|
|
|
{
|
|
|
|
widget->onKeyPress(kev);
|
|
|
|
|
|
|
|
if ( ! kev->isAccepted() )
|
|
|
|
{
|
|
|
|
if ( kev->key() == fc::Fkey_right
|
|
|
|
|| kev->key() == fc::Fkey_down )
|
|
|
|
accpt_focus = focusNextChild();
|
|
|
|
else if ( kev->key() == fc::Fkey_left
|
|
|
|
|| kev->key() == fc::Fkey_up )
|
|
|
|
accpt_focus = focusPrevChild();
|
|
|
|
|
|
|
|
if ( accpt_focus )
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( kev->isAccepted() || widget->isRootWidget() )
|
|
|
|
return;
|
|
|
|
|
|
|
|
widget = widget->getParentWidget();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
//----------------------------------------------------------------------
|
|
|
|
void FWidget::KeyDownEvent (FKeyEvent* kev)
|
|
|
|
{
|
|
|
|
FWidget* widget = this;
|
|
|
|
|
|
|
|
while ( widget )
|
|
|
|
{
|
|
|
|
widget->onKeyDown(kev);
|
|
|
|
|
|
|
|
if ( kev->isAccepted() || widget->isRootWidget() )
|
|
|
|
break;
|
|
|
|
|
|
|
|
widget = widget->getParentWidget();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-02-11 23:41:23 +01:00
|
|
|
//----------------------------------------------------------------------
|
|
|
|
bool FWidget::changeFocus ( FWidget* follower, FWidget* parent
|
|
|
|
, fc::FocusTypes ft )
|
|
|
|
{
|
|
|
|
FFocusEvent out (fc::FocusOut_Event);
|
|
|
|
out.setFocusType(ft);
|
|
|
|
FApplication::sendEvent(this, &out);
|
|
|
|
|
|
|
|
FFocusEvent cfo (fc::ChildFocusOut_Event);
|
|
|
|
cfo.setFocusType(ft);
|
|
|
|
cfo.ignore();
|
|
|
|
FApplication::sendEvent(parent, &cfo);
|
|
|
|
|
|
|
|
if ( cfo.isAccepted() )
|
|
|
|
out.ignore();
|
|
|
|
|
|
|
|
if ( out.isAccepted() )
|
|
|
|
{
|
|
|
|
if ( follower == this )
|
|
|
|
return false;
|
|
|
|
|
|
|
|
follower->setFocus();
|
|
|
|
FFocusEvent cfi (fc::ChildFocusIn_Event);
|
|
|
|
FApplication::sendEvent(parent, &cfi);
|
|
|
|
|
|
|
|
FFocusEvent in (fc::FocusIn_Event);
|
|
|
|
in.setFocusType(ft);
|
|
|
|
FApplication::sendEvent(follower, &in);
|
|
|
|
|
|
|
|
if ( in.isAccepted() )
|
|
|
|
{
|
|
|
|
redraw();
|
|
|
|
follower->redraw();
|
|
|
|
updateTerminal();
|
|
|
|
flush_out();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2015-05-23 13:35:12 +02:00
|
|
|
//----------------------------------------------------------------------
|
2016-11-02 00:37:58 +01:00
|
|
|
void FWidget::draw()
|
|
|
|
{ }
|
|
|
|
|
2018-01-31 00:17:00 +01:00
|
|
|
//----------------------------------------------------------------------
|
|
|
|
void FWidget::drawWindows()
|
|
|
|
{
|
|
|
|
// redraw windows
|
2018-06-25 00:14:53 +02:00
|
|
|
FOptiAttr::charData default_char;
|
2018-01-31 00:17:00 +01:00
|
|
|
default_char.code = ' ';
|
|
|
|
default_char.fg_color = fc::Black;
|
|
|
|
default_char.bg_color = fc::Black;
|
|
|
|
default_char.attr.byte[0] = 0;
|
|
|
|
default_char.attr.byte[1] = 0;
|
|
|
|
|
|
|
|
if ( ! window_list || window_list->empty() )
|
|
|
|
return;
|
|
|
|
|
|
|
|
widgetList::const_iterator iter, last;
|
|
|
|
iter = window_list->begin();
|
|
|
|
last = window_list->end();
|
|
|
|
|
|
|
|
while ( iter != last )
|
|
|
|
{
|
|
|
|
if ( (*iter)->isVisible() )
|
|
|
|
{
|
|
|
|
term_area* win = (*iter)->getVWin();
|
|
|
|
int w = win->width + win->right_shadow;
|
|
|
|
int h = win->height + win->bottom_shadow;
|
|
|
|
std::fill_n (win->text, w * h, default_char);
|
|
|
|
|
|
|
|
(*iter)->redraw();
|
|
|
|
}
|
|
|
|
|
|
|
|
++iter;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
//----------------------------------------------------------------------
|
|
|
|
void FWidget::drawChildren()
|
|
|
|
{
|
|
|
|
// draw child elements
|
|
|
|
if ( ! hasChildren() )
|
|
|
|
return;
|
|
|
|
|
|
|
|
constFObjectIterator iter, last;
|
|
|
|
iter = FObject::begin();
|
|
|
|
last = FObject::end();
|
|
|
|
|
|
|
|
while ( iter != last )
|
|
|
|
{
|
|
|
|
if ( (*iter)->isWidget() )
|
|
|
|
{
|
|
|
|
FWidget* widget = static_cast<FWidget*>(*iter);
|
|
|
|
|
|
|
|
if ( widget->isVisible() && ! widget->isWindowWidget() )
|
|
|
|
widget->redraw();
|
|
|
|
}
|
|
|
|
|
|
|
|
++iter;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-01-21 16:21:41 +01:00
|
|
|
//----------------------------------------------------------------------
|
|
|
|
void FWidget::drawTransparentShadow (int x1, int y1, int x2, int y2)
|
|
|
|
{
|
|
|
|
// transparent shadow
|
|
|
|
setPrintPos (x2 + 1, y1);
|
|
|
|
setTransparent();
|
|
|
|
print (" ");
|
|
|
|
unsetTransparent();
|
|
|
|
|
|
|
|
setColor (wc.shadow_bg, wc.shadow_fg);
|
|
|
|
setTransShadow();
|
|
|
|
|
2018-10-14 06:25:33 +02:00
|
|
|
for (int i = 1; i < int(getHeight()); i++)
|
2018-01-21 16:21:41 +01:00
|
|
|
{
|
|
|
|
setPrintPos (x2 + 1, y1 + i);
|
|
|
|
print (" ");
|
|
|
|
}
|
|
|
|
|
|
|
|
unsetTransShadow();
|
|
|
|
setPrintPos (x1, y2 + 1);
|
|
|
|
setTransparent();
|
|
|
|
print (" ");
|
|
|
|
unsetTransparent();
|
|
|
|
|
|
|
|
setColor (wc.shadow_bg, wc.shadow_fg);
|
|
|
|
setTransShadow();
|
|
|
|
|
2018-10-14 06:25:33 +02:00
|
|
|
for (std::size_t i = 2; i <= getWidth() + 1; i++)
|
2018-01-21 16:21:41 +01:00
|
|
|
print (' ');
|
|
|
|
|
|
|
|
unsetTransShadow();
|
|
|
|
|
|
|
|
if ( isMonochron() )
|
|
|
|
setReverse(false);
|
|
|
|
}
|
|
|
|
|
|
|
|
//----------------------------------------------------------------------
|
|
|
|
void FWidget::drawBlockShadow (int x1, int y1, int x2, int y2)
|
|
|
|
{
|
|
|
|
// non-transparent shadow
|
|
|
|
int block;
|
|
|
|
|
2018-05-06 21:41:55 +02:00
|
|
|
if ( ! hasShadowCharacter() )
|
2018-01-21 16:21:41 +01:00
|
|
|
return;
|
|
|
|
|
|
|
|
setPrintPos (x2 + 1, y1);
|
|
|
|
|
|
|
|
if ( isWindowWidget() )
|
|
|
|
{
|
|
|
|
setColor (wc.shadow_fg, wc.shadow_bg);
|
|
|
|
setInheritBackground(); // current background color will be ignored
|
|
|
|
}
|
|
|
|
else if ( FWidget* p = getParentWidget() )
|
|
|
|
setColor (wc.shadow_fg, p->getBackgroundColor());
|
|
|
|
|
|
|
|
block = fc::FullBlock; // █
|
|
|
|
print (fc::LowerHalfBlock); // ▄
|
|
|
|
|
|
|
|
if ( isWindowWidget() )
|
|
|
|
unsetInheritBackground();
|
|
|
|
|
2018-10-14 06:25:33 +02:00
|
|
|
for (int i = 1; i < int(getHeight()); i++)
|
2018-01-21 16:21:41 +01:00
|
|
|
{
|
|
|
|
setPrintPos (x2 + 1, y1 + i);
|
|
|
|
print (block); // █
|
|
|
|
}
|
|
|
|
|
|
|
|
setPrintPos (x1 + 1, y2 + 1);
|
|
|
|
|
|
|
|
if ( isWindowWidget() )
|
|
|
|
setInheritBackground();
|
|
|
|
|
2018-10-14 06:25:33 +02:00
|
|
|
for (std::size_t i = 1; i <= getWidth(); i++)
|
2018-01-21 16:21:41 +01:00
|
|
|
print (fc::UpperHalfBlock); // ▀
|
|
|
|
|
|
|
|
if ( isWindowWidget() )
|
|
|
|
unsetInheritBackground();
|
|
|
|
}
|
|
|
|
|
2018-02-10 17:35:09 +01:00
|
|
|
//----------------------------------------------------------------------
|
|
|
|
inline void FWidget::drawBox (int x1, int y1, int x2, int y2)
|
|
|
|
{
|
|
|
|
// Use box-drawing characters to draw a border
|
|
|
|
|
|
|
|
setPrintPos (x1, y1);
|
|
|
|
print (fc::BoxDrawingsDownAndRight); // ┌
|
|
|
|
|
|
|
|
for (int x = x1 + 1; x < x2; x++)
|
|
|
|
print (fc::BoxDrawingsHorizontal); // ─
|
|
|
|
|
|
|
|
print (fc::BoxDrawingsDownAndLeft); // ┐
|
|
|
|
|
|
|
|
for (int y = y1 + 1; y < y2; y++)
|
|
|
|
{
|
|
|
|
setPrintPos (x1, y);
|
|
|
|
print (fc::BoxDrawingsVertical); // │
|
|
|
|
setPrintPos (x2, y);
|
|
|
|
print (fc::BoxDrawingsVertical); // │
|
|
|
|
}
|
|
|
|
|
|
|
|
setPrintPos (x1, y2);
|
|
|
|
print (fc::BoxDrawingsUpAndRight); // └
|
|
|
|
|
|
|
|
for (int x = x1 + 1; x < x2; x++)
|
|
|
|
print (fc::BoxDrawingsHorizontal); // ─
|
|
|
|
|
|
|
|
print (fc::BoxDrawingsUpAndLeft); // ┘
|
|
|
|
|
|
|
|
for (int x = x1 + 1; x < x2; x++)
|
|
|
|
{
|
|
|
|
setPrintPos (x, y1);
|
|
|
|
print (fc::BoxDrawingsHorizontal); // ─
|
|
|
|
setPrintPos (x, y2);
|
|
|
|
print (fc::BoxDrawingsHorizontal); // ─
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
//----------------------------------------------------------------------
|
|
|
|
inline void FWidget::drawNewFontBox (int x1, int y1, int x2, int y2)
|
|
|
|
{
|
|
|
|
// Use new graphical font characters to draw a border
|
|
|
|
|
|
|
|
setPrintPos (x1, y1);
|
|
|
|
print (fc::NF_border_corner_middle_upper_left); // ┌
|
|
|
|
|
|
|
|
for (int x = x1 + 1; x < x2; x++)
|
|
|
|
print (fc::BoxDrawingsHorizontal); // ─
|
|
|
|
|
|
|
|
print (fc::NF_border_corner_middle_upper_right); // ┐
|
|
|
|
|
|
|
|
for (int y = y1 + 1; y <= y2; y++)
|
|
|
|
{
|
|
|
|
setPrintPos (x1, y);
|
|
|
|
print (fc::NF_border_line_left); // border left ⎸
|
|
|
|
setPrintPos (x2, y);
|
|
|
|
print (fc::NF_rev_border_line_right); // border right⎹
|
|
|
|
}
|
|
|
|
|
|
|
|
setPrintPos (x1, y2);
|
|
|
|
print (fc::NF_border_corner_middle_lower_left); // └
|
|
|
|
|
|
|
|
for (int x = x1 + 1; x < x2; x++)
|
|
|
|
print (fc::BoxDrawingsHorizontal); // ─
|
|
|
|
|
|
|
|
print (fc::NF_border_corner_middle_lower_right); // ┘
|
|
|
|
}
|
|
|
|
|
2016-11-02 00:37:58 +01:00
|
|
|
//----------------------------------------------------------------------
|
|
|
|
void FWidget::setColorTheme()
|
2017-11-19 19:47:24 +01:00
|
|
|
{
|
2018-02-10 17:35:09 +01:00
|
|
|
// Sets the default color theme
|
|
|
|
|
2017-11-19 19:47:24 +01:00
|
|
|
if ( getMaxColor() < 16 ) // for 8 color mode
|
|
|
|
{
|
2018-01-24 00:25:32 +01:00
|
|
|
wc.set8ColorTheme();
|
2017-11-19 19:47:24 +01:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2018-01-24 00:25:32 +01:00
|
|
|
wc.set16ColorTheme();
|
2017-11-19 19:47:24 +01:00
|
|
|
|
|
|
|
if ( isKdeTerminal() )
|
2017-11-22 23:56:21 +01:00
|
|
|
wc.term_bg = fc::SteelBlue3;
|
2017-11-19 19:47:24 +01:00
|
|
|
}
|
|
|
|
}
|
2018-09-20 23:59:01 +02:00
|
|
|
|
|
|
|
} // namespace finalcut
|