New zoom interaction-elements to maximize a FDialog
This commit is contained in:
parent
fa037ee3ec
commit
e462db30a9
|
@ -1,3 +1,12 @@
|
|||
2016-09-11 Markus Gans <guru.mail@muenster.de>
|
||||
* New zoom interaction-elements to maximize a FDialog
|
||||
|
||||
2016-09-08 Markus Gans <guru.mail@muenster.de>
|
||||
* Different color when focusing the title bar button
|
||||
* Move clearArea() from FWidget to FTerm
|
||||
* Move setWidth(), setHeight() and setGeometry from
|
||||
FDialog to FWindow
|
||||
|
||||
2016-09-04 Markus Gans <guru.mail@muenster.de>
|
||||
* FButton, FLineEdit and FProgressbar has shadow now enabled
|
||||
by default
|
||||
|
|
358
src/fdialog.cpp
358
src/fdialog.cpp
|
@ -16,11 +16,14 @@ FDialog::FDialog(FWidget* parent)
|
|||
: FWindow(parent)
|
||||
, tb_text()
|
||||
, result_code(FDialog::Reject)
|
||||
, maximized(false)
|
||||
, zoom_button_pressed(false)
|
||||
, zoom_button_active(false)
|
||||
, TitleBarClickPos()
|
||||
, oldGeometry()
|
||||
, dialog_menu()
|
||||
, dgl_menuitem()
|
||||
, zoom_item()
|
||||
, close_item()
|
||||
{
|
||||
init();
|
||||
}
|
||||
|
@ -30,11 +33,14 @@ FDialog::FDialog (const FString& txt, FWidget* parent)
|
|||
: FWindow(parent)
|
||||
, tb_text(txt)
|
||||
, result_code(FDialog::Reject)
|
||||
, maximized(false)
|
||||
, zoom_button_pressed(false)
|
||||
, zoom_button_active(false)
|
||||
, TitleBarClickPos()
|
||||
, oldGeometry()
|
||||
, dialog_menu()
|
||||
, dgl_menuitem()
|
||||
, zoom_item()
|
||||
, close_item()
|
||||
{
|
||||
init();
|
||||
}
|
||||
|
@ -80,7 +86,6 @@ FDialog::~FDialog() // destructor
|
|||
//----------------------------------------------------------------------
|
||||
void FDialog::init()
|
||||
{
|
||||
FMenuItem* close_item;
|
||||
FWidget* old_focus;
|
||||
FWidget* rootObj = getRootWidget();
|
||||
|
||||
|
@ -136,8 +141,18 @@ void FDialog::init()
|
|||
dgl_menuitem->unsetFocusable();
|
||||
}
|
||||
|
||||
zoom_item = new FMenuItem ("&Zoom", dialog_menu);
|
||||
zoom_item->setStatusbarMessage ("Enlarge or restore the window size");
|
||||
zoom_item->setDisable();
|
||||
|
||||
zoom_item->addCallback
|
||||
(
|
||||
"clicked",
|
||||
_METHOD_CALLBACK (this, &FDialog::cb_zoom)
|
||||
);
|
||||
|
||||
close_item = new FMenuItem ("&Close", dialog_menu);
|
||||
close_item->setStatusbarMessage ("Close window");
|
||||
close_item->setStatusbarMessage ("Close this window");
|
||||
|
||||
close_item->addCallback
|
||||
(
|
||||
|
@ -155,18 +170,13 @@ void FDialog::drawBorder()
|
|||
y1 = ypos+ymin;
|
||||
y2 = ypos+ymin-2+height;
|
||||
|
||||
//if ( resize )
|
||||
// setColor (wc.dialog_resize_fg, backgroundColor);
|
||||
|
||||
if ( isNewFont() )
|
||||
{
|
||||
short fg;
|
||||
|
||||
if ( ! isRootWidget() && getParentWidget() )
|
||||
fg = getParentWidget()->getForegroundColor();
|
||||
else
|
||||
fg = wc.term_fg;
|
||||
|
||||
for (int y=y1; y <= y2; y++)
|
||||
{
|
||||
setColor (fg, backgroundColor);
|
||||
gotoxy (x1, y);
|
||||
// border left ⎸
|
||||
print (fc::NF_border_line_left);
|
||||
|
@ -175,20 +185,17 @@ void FDialog::drawBorder()
|
|||
print (fc::NF_rev_border_line_right);
|
||||
}
|
||||
|
||||
if ( (flags & fc::shadow) == 0 )
|
||||
{
|
||||
setColor (fg, backgroundColor);
|
||||
gotoxy (x1, y2);
|
||||
// lower left corner border ⎣
|
||||
print (fc::NF_border_corner_lower_left);
|
||||
|
||||
for (int x=1; x < width-1; x++) // low line _
|
||||
print (fc::NF_border_line_bottom);
|
||||
|
||||
gotoxy (x2, y2);
|
||||
// lower right corner border ⎦
|
||||
print (fc::NF_rev_border_corner_lower_right);
|
||||
}
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
gotoxy (x1, y1);
|
||||
|
@ -220,11 +227,15 @@ void FDialog::drawBorder()
|
|||
//----------------------------------------------------------------------
|
||||
void FDialog::drawTitleBar()
|
||||
{
|
||||
int i,x;
|
||||
uInt length = tb_text.getLength();
|
||||
int i,x,length, zoom_btn;
|
||||
const int menu_btn = 3;
|
||||
|
||||
// draw the title button
|
||||
gotoxy (xpos+xmin-1, ypos+ymin-1);
|
||||
|
||||
if ( dialog_menu->isVisible() )
|
||||
setColor (wc.titlebar_button_focus_fg, wc.titlebar_button_focus_bg);
|
||||
else
|
||||
setColor (wc.titlebar_button_fg, wc.titlebar_button_bg);
|
||||
|
||||
if ( isMonochron() )
|
||||
|
@ -274,7 +285,15 @@ void FDialog::drawTitleBar()
|
|||
else
|
||||
setColor (wc.titlebar_inactive_fg, wc.titlebar_inactive_bg);
|
||||
|
||||
i = width - 3 - int(length);
|
||||
if ( (flags & fc::resizeable) == 0 )
|
||||
zoom_btn = 0;
|
||||
else if ( isNewFont() )
|
||||
zoom_btn = 2;
|
||||
else
|
||||
zoom_btn = 3;
|
||||
|
||||
length = int(tb_text.getLength());
|
||||
i = width - length - menu_btn - zoom_btn;
|
||||
i = int(i/2);
|
||||
|
||||
for (x=1; x <= i; x++)
|
||||
|
@ -285,12 +304,78 @@ void FDialog::drawTitleBar()
|
|||
print (tb_text);
|
||||
|
||||
// fill the rest of the bar
|
||||
for (; x+1+int(length) < width-1; x++)
|
||||
for (; x+1+length < width-zoom_btn-1; x++)
|
||||
print (' ');
|
||||
|
||||
if ( getMaxColor() < 16 )
|
||||
unsetBold();
|
||||
|
||||
// draw the zoom/unzoom button
|
||||
if ( (flags & fc::resizeable) != 0 )
|
||||
{
|
||||
if ( zoom_button_pressed )
|
||||
setColor (wc.titlebar_button_focus_fg, wc.titlebar_button_focus_bg);
|
||||
else
|
||||
setColor (wc.titlebar_button_fg, wc.titlebar_button_bg);
|
||||
|
||||
if ( isZoomed() )
|
||||
{
|
||||
if ( isNewFont() )
|
||||
{
|
||||
print (fc::NF_rev_down_pointing_triangle1);
|
||||
print (fc::NF_rev_down_pointing_triangle2);
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( isMonochron() )
|
||||
{
|
||||
print ('[');
|
||||
print (fc::BlackDownPointingTriangle); // ▼
|
||||
print (']');
|
||||
}
|
||||
else
|
||||
{
|
||||
print (' ');
|
||||
|
||||
if ( isCygwinTerminal() )
|
||||
print ('v');
|
||||
else
|
||||
print (fc::BlackDownPointingTriangle); // ▼
|
||||
|
||||
print (' ');
|
||||
}
|
||||
}
|
||||
}
|
||||
else // is not zoomed
|
||||
{
|
||||
if ( isNewFont() )
|
||||
{
|
||||
print (fc::NF_rev_up_pointing_triangle1);
|
||||
print (fc::NF_rev_up_pointing_triangle2);
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( isMonochron() )
|
||||
{
|
||||
print ('[');
|
||||
print (fc::BlackUpPointingTriangle); // ▲
|
||||
print (']');
|
||||
}
|
||||
else
|
||||
{
|
||||
print (' ');
|
||||
|
||||
if ( isCygwinTerminal() )
|
||||
print ('^');
|
||||
else
|
||||
print (fc::BlackUpPointingTriangle); // ▲
|
||||
|
||||
print (' ');
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ( isMonochron() )
|
||||
setReverse(false);
|
||||
|
||||
|
@ -320,6 +405,16 @@ void FDialog::leaveMenu()
|
|||
flush_out();
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
void FDialog::cb_zoom (FWidget*, void*)
|
||||
{
|
||||
dialog_menu->unselectItem();
|
||||
dialog_menu->hide();
|
||||
setClickedWidget(0);
|
||||
drawTitleBar();
|
||||
zoomWindow();
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
void FDialog::cb_close (FWidget*, void*)
|
||||
{
|
||||
|
@ -372,61 +467,26 @@ void FDialog::done(int result)
|
|||
//----------------------------------------------------------------------
|
||||
void FDialog::drawDialogShadow()
|
||||
{
|
||||
if ((flags & fc::trans_shadow) != 0)
|
||||
{
|
||||
// transparent shadow
|
||||
drawShadow();
|
||||
|
||||
if ( isNewFont() && ((flags & fc::scrollable) == 0) )
|
||||
{
|
||||
// left of the shadow ▀▀
|
||||
gotoxy (xpos+xmin-1, ypos+ymin-1+height);
|
||||
setColor (wc.shadow_fg, wc.shadow_bg);
|
||||
// current background color will be ignored
|
||||
setInheritBackground();
|
||||
|
||||
for (int x=0; x <= 1; x++)
|
||||
print (fc::NF_border_line_upper); // high line ⎺
|
||||
|
||||
unsetInheritBackground();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( isMonochron() )
|
||||
if ( isMonochron() && (flags & fc::trans_shadow) == 0 )
|
||||
return;
|
||||
|
||||
drawShadow();
|
||||
// left of the shadow ▀▀
|
||||
gotoxy (xpos+xmin-1, ypos+ymin-1+height);
|
||||
|
||||
if ( isNewFont() && ((flags & fc::scrollable) == 0) )
|
||||
{
|
||||
setColor (wc.shadow_fg, wc.shadow_bg);
|
||||
// current background color will be ignored
|
||||
setInheritBackground();
|
||||
print (fc::NF_border_line_upper); // high line ⎺
|
||||
unsetInheritBackground();
|
||||
}
|
||||
else
|
||||
{
|
||||
setTransparent();
|
||||
print(' ');
|
||||
unsetTransparent();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
void FDialog::draw()
|
||||
{
|
||||
if ( maximized && ! isRootWidget() )
|
||||
/*if ( isZoomed() && ! isRootWidget() )
|
||||
{
|
||||
xpos = 1;
|
||||
ypos = 1;
|
||||
width = xmax;
|
||||
height = ymax;
|
||||
}
|
||||
}*/
|
||||
|
||||
updateVTerm(false);
|
||||
// fill the background
|
||||
|
@ -439,62 +499,9 @@ void FDialog::draw()
|
|||
drawBorder();
|
||||
drawTitleBar();
|
||||
|
||||
if ( ! maximized && (flags & fc::shadow) != 0 )
|
||||
if ( (flags & fc::shadow) != 0 )
|
||||
drawDialogShadow();
|
||||
|
||||
if ( (flags & fc::resizeable) != 0 )
|
||||
{
|
||||
if ( isMonochron() )
|
||||
setReverse(false);
|
||||
|
||||
if ( maximized )
|
||||
{
|
||||
if ( isNewFont() )
|
||||
{
|
||||
gotoxy (xpos+xmin+width-3, ypos+ymin-1);
|
||||
setColor (wc.titlebar_button_fg, wc.titlebar_button_bg);
|
||||
print (fc::NF_rev_down_pointing_triangle1);
|
||||
print (fc::NF_rev_down_pointing_triangle2);
|
||||
}
|
||||
else
|
||||
{
|
||||
gotoxy (xpos+xmin+width-4, ypos+ymin-1);
|
||||
setColor (wc.titlebar_button_fg, wc.titlebar_button_bg);
|
||||
print (' ');
|
||||
|
||||
if ( isCygwinTerminal() )
|
||||
print ('v');
|
||||
else
|
||||
print (fc::BlackDownPointingTriangle); // ▼
|
||||
|
||||
print (' ');
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( isNewFont() )
|
||||
{
|
||||
gotoxy (xpos+xmin+width-3, ypos+ymin-1);
|
||||
setColor (wc.titlebar_button_fg, wc.titlebar_button_bg);
|
||||
print (fc::NF_rev_up_pointing_triangle1);
|
||||
print (fc::NF_rev_up_pointing_triangle2);
|
||||
}
|
||||
else
|
||||
{
|
||||
gotoxy (xpos+xmin+width-4, ypos+ymin-1);
|
||||
setColor (wc.titlebar_button_fg, wc.titlebar_button_bg);
|
||||
print (' ');
|
||||
|
||||
if ( isCygwinTerminal() )
|
||||
print ('^');
|
||||
else
|
||||
print (fc::BlackUpPointingTriangle); // ▲
|
||||
|
||||
print (' ');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ( isMonochron() )
|
||||
setReverse(false);
|
||||
|
||||
|
@ -540,13 +547,28 @@ void FDialog::onMouseDown (FMouseEvent* ev)
|
|||
{
|
||||
int mouse_x = ev->getX();
|
||||
int mouse_y = ev->getY();
|
||||
int zoom_btn;
|
||||
|
||||
if ( (flags & fc::resizeable) == 0 )
|
||||
zoom_btn = 0;
|
||||
else if ( isNewFont() )
|
||||
zoom_btn = 2;
|
||||
else
|
||||
zoom_btn = 3;
|
||||
|
||||
if ( zoom_button_pressed || zoom_button_active )
|
||||
{
|
||||
zoom_button_pressed = false;
|
||||
zoom_button_active = false;
|
||||
drawTitleBar();
|
||||
}
|
||||
|
||||
if ( ev->getButton() == fc::LeftButton )
|
||||
{
|
||||
bool has_raised;
|
||||
|
||||
// click on titlebar or window: raise + activate
|
||||
if ( mouse_x >= 4 && mouse_x <= width && mouse_y == 1 )
|
||||
if ( mouse_x >= 4 && mouse_x <= width-zoom_btn && mouse_y == 1 )
|
||||
TitleBarClickPos.setPoint (ev->getGlobalX(), ev->getGlobalY());
|
||||
else
|
||||
TitleBarClickPos.setPoint (0,0);
|
||||
|
@ -563,17 +585,27 @@ void FDialog::onMouseDown (FMouseEvent* ev)
|
|||
if ( mouse_x < 4 && mouse_y == 1 )
|
||||
{
|
||||
if ( dialog_menu->isVisible() )
|
||||
{
|
||||
leaveMenu();
|
||||
drawTitleBar();
|
||||
}
|
||||
else
|
||||
{
|
||||
setOpenMenu(dialog_menu);
|
||||
dialog_menu->move (xpos, ypos+1);
|
||||
dialog_menu->setVisible();
|
||||
drawTitleBar();
|
||||
dialog_menu->show();
|
||||
dialog_menu->raiseWindow(dialog_menu);
|
||||
dialog_menu->redraw();
|
||||
}
|
||||
}
|
||||
else if ( mouse_x > width-zoom_btn && mouse_y == 1 )
|
||||
{
|
||||
zoom_button_pressed = true;
|
||||
zoom_button_active = true;
|
||||
drawTitleBar();
|
||||
}
|
||||
}
|
||||
else // ev->getButton() != fc::LeftButton
|
||||
{
|
||||
|
@ -612,6 +644,14 @@ void FDialog::onMouseUp (FMouseEvent* ev)
|
|||
{
|
||||
int titlebar_x = TitleBarClickPos.getX();
|
||||
int titlebar_y = TitleBarClickPos.getY();
|
||||
int zoom_btn;
|
||||
|
||||
if ( (flags & fc::resizeable) == 0 )
|
||||
zoom_btn = 0;
|
||||
else if ( isNewFont() )
|
||||
zoom_btn = 2;
|
||||
else
|
||||
zoom_btn = 3;
|
||||
|
||||
if ( ev->getButton() == fc::LeftButton )
|
||||
{
|
||||
|
@ -650,14 +690,40 @@ void FDialog::onMouseUp (FMouseEvent* ev)
|
|||
updateTerminal();
|
||||
flush_out();
|
||||
}
|
||||
else if ( mouse_x > width - zoom_btn
|
||||
&& mouse_y == 1
|
||||
&& zoom_button_pressed )
|
||||
{
|
||||
// zoom to maximum or restore the window size
|
||||
zoomWindow();
|
||||
}
|
||||
}
|
||||
|
||||
if ( zoom_button_pressed || zoom_button_active )
|
||||
{
|
||||
zoom_button_pressed = false;
|
||||
zoom_button_active = false;
|
||||
drawTitleBar();
|
||||
}
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
void FDialog::onMouseMove (FMouseEvent* ev)
|
||||
{
|
||||
int zoom_btn;
|
||||
|
||||
if ( (flags & fc::resizeable) == 0 )
|
||||
zoom_btn = 0;
|
||||
else if ( isNewFont() )
|
||||
zoom_btn = 2;
|
||||
else
|
||||
zoom_btn = 3;
|
||||
|
||||
if ( ev->getButton() == fc::LeftButton )
|
||||
{
|
||||
int mouse_x = ev->getX();
|
||||
int mouse_y = ev->getY();
|
||||
|
||||
if ( ! TitleBarClickPos.isNull() )
|
||||
{
|
||||
FPoint currentPos(getGeometry().getX(), getGeometry().getY());
|
||||
|
@ -684,6 +750,18 @@ void FDialog::onMouseMove (FMouseEvent* ev)
|
|||
delete _ev;
|
||||
}
|
||||
}
|
||||
|
||||
if ( mouse_x > width - zoom_btn && mouse_y == 1 && zoom_button_active )
|
||||
{
|
||||
zoom_button_pressed = true;
|
||||
drawTitleBar();
|
||||
}
|
||||
else if ( zoom_button_pressed )
|
||||
{
|
||||
zoom_button_pressed = false;
|
||||
drawTitleBar();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -882,6 +960,9 @@ void FDialog::move (int x, int y)
|
|||
if ( x+width < 1 || x > getColumnNumber() || y < 1 || y > getLineNumber() )
|
||||
return;
|
||||
|
||||
if ( isZoomed() )
|
||||
return;
|
||||
|
||||
dx = xpos - x;
|
||||
dy = ypos - y;
|
||||
old_x = getGlobalX();
|
||||
|
@ -998,37 +1079,6 @@ void FDialog::activateDialog()
|
|||
updateTerminal();
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
void FDialog::setWidth (int w, bool adjust)
|
||||
{
|
||||
int old_width = width;
|
||||
FWidget::setWidth (w, adjust);
|
||||
|
||||
if ( vwin && width != old_width )
|
||||
resizeArea (vwin);
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
void FDialog::setHeight (int h, bool adjust)
|
||||
{
|
||||
int old_height = height;
|
||||
FWidget::setHeight (h, adjust);
|
||||
|
||||
if ( vwin && height != old_height )
|
||||
resizeArea (vwin);
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
void FDialog::setGeometry (int x, int y, int w, int h, bool adjust)
|
||||
{
|
||||
int old_width = width;
|
||||
int old_height = height;
|
||||
FWidget::setGeometry (x, y, w, h, adjust);
|
||||
|
||||
if ( vwin && (width != old_width || height != old_height) )
|
||||
resizeArea (vwin);
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
bool FDialog::setFocus (bool on)
|
||||
{
|
||||
|
@ -1128,21 +1178,15 @@ bool FDialog::setScrollable (bool on)
|
|||
bool FDialog::setResizeable (bool on)
|
||||
{
|
||||
if ( on )
|
||||
{
|
||||
flags |= fc::resizeable;
|
||||
zoom_item->setEnable();
|
||||
}
|
||||
else
|
||||
{
|
||||
flags &= ~fc::resizeable;
|
||||
zoom_item->setDisable();
|
||||
}
|
||||
|
||||
return on;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
bool FDialog::setMaximized()
|
||||
{
|
||||
if ( maximized )
|
||||
return true;
|
||||
|
||||
maximized = true;
|
||||
//setGeometry (1, 1, xmax, ymax);
|
||||
|
||||
return maximized;
|
||||
}
|
||||
|
|
|
@ -52,11 +52,14 @@ class FDialog : public FWindow
|
|||
private:
|
||||
FString tb_text; // title bar text
|
||||
int result_code;
|
||||
bool maximized;
|
||||
bool zoom_button_pressed;
|
||||
bool zoom_button_active;
|
||||
FPoint TitleBarClickPos;
|
||||
FRect oldGeometry; // required by move()
|
||||
FMenu* dialog_menu;
|
||||
FMenuItem* dgl_menuitem;
|
||||
FMenuItem* zoom_item;
|
||||
FMenuItem* close_item;
|
||||
|
||||
private:
|
||||
FDialog (const FDialog&);
|
||||
|
@ -65,6 +68,7 @@ class FDialog : public FWindow
|
|||
void drawBorder();
|
||||
void drawTitleBar();
|
||||
void leaveMenu();
|
||||
void cb_zoom (FWidget*, void*);
|
||||
void cb_close (FWidget*, void*);
|
||||
static void addDialog (FWidget*);
|
||||
static void delDialog (FWidget*);
|
||||
|
@ -100,11 +104,6 @@ class FDialog : public FWindow
|
|||
void move (const FPoint&);
|
||||
void move (int, int);
|
||||
|
||||
void setWidth (int, bool = true);
|
||||
void setHeight (int, bool = true);
|
||||
// make every setGeometry from FWidget available
|
||||
using FWidget::setGeometry;
|
||||
void setGeometry (int, int, int, int, bool = true);
|
||||
bool setFocus(bool);
|
||||
bool setFocus();
|
||||
bool unsetFocus();
|
||||
|
@ -120,8 +119,6 @@ class FDialog : public FWindow
|
|||
bool setResizeable();
|
||||
bool unsetResizeable();
|
||||
bool isResizeable();
|
||||
bool setMaximized();
|
||||
bool isMaximized() const;
|
||||
bool setTransparentShadow(bool);
|
||||
bool setTransparentShadow();
|
||||
bool unsetTransparentShadow();
|
||||
|
@ -187,10 +184,6 @@ inline bool FDialog::unsetResizeable()
|
|||
inline bool FDialog::isResizeable()
|
||||
{ return ((flags & fc::resizeable) != 0); }
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
inline bool FDialog::isMaximized() const
|
||||
{ return maximized; }
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
inline bool FDialog::setTransparentShadow()
|
||||
{ return setTransparentShadow(true); }
|
||||
|
|
|
@ -2921,6 +2921,101 @@ void FTerm::putArea (int ax, int ay, FTerm::term_area* area)
|
|||
}
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
void FTerm::clearArea()
|
||||
{
|
||||
term_area* area;
|
||||
FWindow* area_widget;
|
||||
FWidget* widget;
|
||||
FOptiAttr::char_data default_char;
|
||||
int total_width;
|
||||
uInt w;
|
||||
|
||||
default_char.code = ' ';
|
||||
default_char.fg_color = next_attribute.fg_color;
|
||||
default_char.bg_color = next_attribute.bg_color;
|
||||
default_char.bold = next_attribute.bold;
|
||||
default_char.dim = next_attribute.dim;
|
||||
default_char.italic = next_attribute.italic;
|
||||
default_char.underline = next_attribute.underline;
|
||||
default_char.blink = next_attribute.blink;
|
||||
default_char.reverse = next_attribute.reverse;
|
||||
default_char.standout = next_attribute.standout;
|
||||
default_char.invisible = next_attribute.invisible;
|
||||
default_char.protect = next_attribute.protect;
|
||||
default_char.crossed_out = next_attribute.crossed_out;
|
||||
default_char.dbl_underline = next_attribute.dbl_underline;
|
||||
default_char.alt_charset = next_attribute.alt_charset;
|
||||
default_char.pc_charset = next_attribute.pc_charset;
|
||||
default_char.transparent = next_attribute.transparent;
|
||||
default_char.trans_shadow = next_attribute.trans_shadow;
|
||||
default_char.inherit_bg = next_attribute.inherit_bg;
|
||||
|
||||
widget = static_cast<FWidget*>(this);
|
||||
area_widget = FWindow::getWindowWidget(widget);
|
||||
|
||||
if ( area_widget )
|
||||
area = area_widget->getVWin();
|
||||
else
|
||||
area = vdesktop;
|
||||
|
||||
if ( ! area )
|
||||
return;
|
||||
|
||||
total_width = area->width + area->right_shadow;
|
||||
w = uInt(total_width);
|
||||
|
||||
if ( area->right_shadow == 0 )
|
||||
{
|
||||
int area_size = area->width * area->height;
|
||||
std::fill_n (area->text, area_size, default_char);
|
||||
}
|
||||
else
|
||||
{
|
||||
FOptiAttr::char_data t_char = default_char;
|
||||
t_char.transparent = true;
|
||||
|
||||
for (int y=0; y < area->height; y++)
|
||||
{
|
||||
int pos = y * total_width;
|
||||
std::fill_n (&area->text[pos], total_width, default_char);
|
||||
std::fill_n (&area->text[pos+area->width], area->right_shadow, t_char);
|
||||
}
|
||||
|
||||
for (int y=0; y < area->bottom_shadow; y++)
|
||||
{
|
||||
int pos = total_width * (y + area->height);
|
||||
std::fill_n (&area->text[pos], total_width, t_char);
|
||||
}
|
||||
}
|
||||
|
||||
for (int i=0; i < area->height; i++)
|
||||
{
|
||||
|
||||
area->changes[i].xmin = 0;
|
||||
area->changes[i].xmax = w - 1;
|
||||
|
||||
if ( default_char.transparent
|
||||
|| default_char.trans_shadow
|
||||
|| default_char.inherit_bg )
|
||||
area->changes[i].trans_count = w;
|
||||
else if ( area->right_shadow != 0 )
|
||||
area->changes[i].trans_count = uInt(area->right_shadow);
|
||||
else
|
||||
area->changes[i].trans_count = 0;
|
||||
}
|
||||
|
||||
for (int i=0; i < area->bottom_shadow; i++)
|
||||
{
|
||||
int y = area->height + i;
|
||||
area->changes[y].xmin = 0;
|
||||
area->changes[y].xmax = w - 1;
|
||||
area->changes[y].trans_count = w;
|
||||
}
|
||||
|
||||
updateVTerm (area);
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
FOptiAttr::char_data FTerm::getCharacter ( int char_type
|
||||
, int x
|
||||
|
|
|
@ -300,6 +300,7 @@ class FTerm
|
|||
void getArea (int, int, int, int, FTerm::term_area*);
|
||||
void putArea (const FPoint&, FTerm::term_area*);
|
||||
void putArea (int, int, FTerm::term_area*);
|
||||
void clearArea();
|
||||
FOptiAttr::char_data getCharacter (int, const FPoint&, FTerm*);
|
||||
FOptiAttr::char_data getCharacter (int, int, int, FTerm*);
|
||||
FOptiAttr::char_data getCoveredCharacter (const FPoint&, FTerm*);
|
||||
|
|
112
src/fwidget.cpp
112
src/fwidget.cpp
|
@ -218,6 +218,7 @@ void FWidget::setColorTheme()
|
|||
wc.selected_list_fg = fc::Cyan;
|
||||
wc.selected_list_bg = fc::White;
|
||||
wc.dialog_fg = fc::Black;
|
||||
wc.dialog_resize_fg = fc::Red;
|
||||
wc.dialog_emphasis_fg = fc::Blue;
|
||||
wc.dialog_bg = fc::White;
|
||||
wc.error_box_fg = fc::White;
|
||||
|
@ -267,6 +268,8 @@ void FWidget::setColorTheme()
|
|||
wc.titlebar_inactive_bg = fc::DarkGray;
|
||||
wc.titlebar_button_fg = fc::DarkGray;
|
||||
wc.titlebar_button_bg = fc::LightGray;
|
||||
wc.titlebar_button_focus_fg = fc::LightGray;
|
||||
wc.titlebar_button_focus_bg = fc::Black;
|
||||
wc.menu_active_focus_fg = fc::White;
|
||||
wc.menu_active_focus_bg = fc::Blue;
|
||||
wc.menu_active_fg = fc::Black;
|
||||
|
@ -306,6 +309,7 @@ void FWidget::setColorTheme()
|
|||
wc.selected_list_fg = fc::Blue;
|
||||
wc.selected_list_bg = fc::LightGray;
|
||||
wc.dialog_fg = fc::Black;
|
||||
wc.dialog_resize_fg = fc::Red;
|
||||
wc.dialog_emphasis_fg = fc::Blue;
|
||||
wc.dialog_bg = fc::LightGray;
|
||||
wc.error_box_fg = fc::Black;
|
||||
|
@ -355,6 +359,8 @@ void FWidget::setColorTheme()
|
|||
wc.titlebar_inactive_bg = fc::LightGray;
|
||||
wc.titlebar_button_fg = fc::Black;
|
||||
wc.titlebar_button_bg = fc::LightGray;
|
||||
wc.titlebar_button_focus_fg = fc::LightGray;
|
||||
wc.titlebar_button_focus_bg = fc::Black;
|
||||
wc.menu_active_focus_fg = fc::LightGray;
|
||||
wc.menu_active_focus_bg = fc::Blue;
|
||||
wc.menu_active_fg = fc::Black;
|
||||
|
@ -1854,6 +1860,8 @@ void FWidget::setTermGeometry (int w, int h)
|
|||
//----------------------------------------------------------------------
|
||||
void FWidget::setGeometry (int x, int y, int w, int h, bool adjust)
|
||||
{
|
||||
int global_x, global_y;
|
||||
|
||||
if ( xpos == x && ypos == y && width == w && height == h )
|
||||
return;
|
||||
|
||||
|
@ -1876,13 +1884,12 @@ void FWidget::setGeometry (int x, int y, int w, int h, bool adjust)
|
|||
client_xmax = xpos + xmin - 2 + width - right_padding;
|
||||
client_ymax = ypos + ymin - 2 + height - bottom_padding;
|
||||
|
||||
widgetSize.setRect(xpos, ypos, width, height);
|
||||
adjustWidgetSize.setRect(xpos, ypos, width, height);
|
||||
widgetSize.setRect (xpos, ypos, width, height);
|
||||
adjustWidgetSize.setRect (xpos, ypos, width, height);
|
||||
adjustWidgetSizeShadow = adjustWidgetSize + shadow;
|
||||
adjustWidgetSizeGlobal.setRect ( xpos + xmin - 1
|
||||
, ypos + ymin - 1
|
||||
, width
|
||||
, height );
|
||||
global_x = xpos + xmin - 1;
|
||||
global_y = ypos + ymin - 1;
|
||||
adjustWidgetSizeGlobal.setRect (global_x, global_y, width, height);
|
||||
adjustWidgetSizeGlobalShadow = adjustWidgetSizeGlobal + shadow;
|
||||
|
||||
double_flatline_mask.top.resize (uLong(width), false);
|
||||
|
@ -1938,99 +1945,6 @@ bool FWidget::setCursorPos (register int x, register int y)
|
|||
return false;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
void FWidget::clearArea()
|
||||
{
|
||||
term_area* area;
|
||||
FWindow* area_widget;
|
||||
FOptiAttr::char_data default_char;
|
||||
int total_width;
|
||||
uInt w;
|
||||
|
||||
default_char.code = ' ';
|
||||
default_char.fg_color = next_attribute.fg_color;
|
||||
default_char.bg_color = next_attribute.bg_color;
|
||||
default_char.bold = next_attribute.bold;
|
||||
default_char.dim = next_attribute.dim;
|
||||
default_char.italic = next_attribute.italic;
|
||||
default_char.underline = next_attribute.underline;
|
||||
default_char.blink = next_attribute.blink;
|
||||
default_char.reverse = next_attribute.reverse;
|
||||
default_char.standout = next_attribute.standout;
|
||||
default_char.invisible = next_attribute.invisible;
|
||||
default_char.protect = next_attribute.protect;
|
||||
default_char.crossed_out = next_attribute.crossed_out;
|
||||
default_char.dbl_underline = next_attribute.dbl_underline;
|
||||
default_char.alt_charset = next_attribute.alt_charset;
|
||||
default_char.pc_charset = next_attribute.pc_charset;
|
||||
default_char.transparent = next_attribute.transparent;
|
||||
default_char.trans_shadow = next_attribute.trans_shadow;
|
||||
default_char.inherit_bg = next_attribute.inherit_bg;
|
||||
|
||||
area_widget = FWindow::getWindowWidget(this);
|
||||
|
||||
if ( area_widget )
|
||||
area = area_widget->getVWin();
|
||||
else
|
||||
area = vdesktop;
|
||||
|
||||
if ( ! area )
|
||||
return;
|
||||
|
||||
total_width = area->width + area->right_shadow;
|
||||
w = uInt(total_width);
|
||||
|
||||
if ( area->right_shadow == 0 )
|
||||
{
|
||||
int area_size = area->width * area->height;
|
||||
std::fill_n (area->text, area_size, default_char);
|
||||
}
|
||||
else
|
||||
{
|
||||
FOptiAttr::char_data t_char = default_char;
|
||||
t_char.transparent = true;
|
||||
|
||||
for (int y=0; y < area->height; y++)
|
||||
{
|
||||
int pos = y * total_width;
|
||||
std::fill_n (&area->text[pos], total_width, default_char);
|
||||
std::fill_n (&area->text[pos+area->width], area->right_shadow, t_char);
|
||||
}
|
||||
|
||||
for (int y=0; y < area->bottom_shadow; y++)
|
||||
{
|
||||
int pos = total_width * (y + area->height);
|
||||
std::fill_n (&area->text[pos], total_width, t_char);
|
||||
}
|
||||
}
|
||||
|
||||
for (int i=0; i < area->height; i++)
|
||||
{
|
||||
|
||||
area->changes[i].xmin = 0;
|
||||
area->changes[i].xmax = w - 1;
|
||||
|
||||
if ( default_char.transparent
|
||||
|| default_char.trans_shadow
|
||||
|| default_char.inherit_bg )
|
||||
area->changes[i].trans_count = w;
|
||||
else if ( area->right_shadow != 0 )
|
||||
area->changes[i].trans_count = uInt(area->right_shadow);
|
||||
else
|
||||
area->changes[i].trans_count = 0;
|
||||
}
|
||||
|
||||
for (int i=0; i < area->bottom_shadow; i++)
|
||||
{
|
||||
int y = area->height + i;
|
||||
area->changes[y].xmin = 0;
|
||||
area->changes[y].xmax = w - 1;
|
||||
area->changes[y].trans_count = w;
|
||||
}
|
||||
|
||||
updateVTerm (area);
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
void FWidget::drawShadow()
|
||||
{
|
||||
|
|
|
@ -162,6 +162,7 @@ class FWidget : public FObject, public FTerm
|
|||
short inputfield_inactive_fg;
|
||||
short inputfield_inactive_bg;
|
||||
short dialog_fg;
|
||||
short dialog_resize_fg;
|
||||
short dialog_emphasis_fg;
|
||||
short dialog_bg;
|
||||
short error_box_fg;
|
||||
|
@ -188,6 +189,8 @@ class FWidget : public FObject, public FTerm
|
|||
short titlebar_inactive_bg;
|
||||
short titlebar_button_fg;
|
||||
short titlebar_button_bg;
|
||||
short titlebar_button_focus_fg;
|
||||
short titlebar_button_focus_bg;
|
||||
short menu_active_focus_fg;
|
||||
short menu_active_focus_bg;
|
||||
short menu_active_fg;
|
||||
|
@ -409,6 +412,8 @@ class FWidget : public FObject, public FTerm
|
|||
int getRightPadding() const;
|
||||
int getClientWidth() const;
|
||||
int getClientHeight() const;
|
||||
int getMaxWidth() const;
|
||||
int getMinHeight() const;
|
||||
const FPoint& getShadow() const;
|
||||
const FRect& getGeometry() const;
|
||||
const FRect& getGeometryShadow() const;
|
||||
|
@ -444,7 +449,6 @@ class FWidget : public FObject, public FTerm
|
|||
|
||||
static void gotoxy (const FPoint&);
|
||||
static void gotoxy (register int, register int);
|
||||
void clearArea();
|
||||
|
||||
static void setNormal();
|
||||
|
||||
|
@ -756,6 +760,14 @@ inline int FWidget::getClientWidth() const
|
|||
inline int FWidget::getClientHeight() const
|
||||
{ return client_ymax-client_ymin+1; }
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
inline int FWidget::getMaxWidth() const
|
||||
{ return xmax-xmin+1; }
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
inline int FWidget::getMinHeight() const
|
||||
{ return ymax-ymin+1; }
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
inline const FPoint& FWidget::getShadow() const
|
||||
{ return shadow; }
|
||||
|
|
|
@ -18,7 +18,11 @@ FWindow* FWindow::previous_widget = 0;
|
|||
FWindow::FWindow(FWidget* parent)
|
||||
: FWidget(parent)
|
||||
, window_active(false)
|
||||
, zoomed(false)
|
||||
, win_focus_widget(0)
|
||||
, normalGeometry()
|
||||
, maxGeometry()
|
||||
, minGeometry()
|
||||
{
|
||||
window_object = true;
|
||||
}
|
||||
|
@ -99,6 +103,37 @@ void FWindow::hide()
|
|||
FWidget::hide();
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
void FWindow::setWidth (int w, bool adjust)
|
||||
{
|
||||
int old_width = width;
|
||||
FWidget::setWidth (w, adjust);
|
||||
|
||||
if ( vwin && width != old_width )
|
||||
resizeArea (vwin);
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
void FWindow::setHeight (int h, bool adjust)
|
||||
{
|
||||
int old_height = height;
|
||||
FWidget::setHeight (h, adjust);
|
||||
|
||||
if ( vwin && height != old_height )
|
||||
resizeArea (vwin);
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
void FWindow::setGeometry (int x, int y, int w, int h, bool adjust)
|
||||
{
|
||||
int old_width = width;
|
||||
int old_height = height;
|
||||
FWidget::setGeometry (x, y, w, h, adjust);
|
||||
|
||||
if ( vwin && (width != old_width || height != old_height) )
|
||||
resizeArea (vwin);
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
FWindow* FWindow::getWindowWidgetAt (int x, int y)
|
||||
{
|
||||
|
@ -335,6 +370,29 @@ bool FWindow::lowerWindow (FWidget* obj)
|
|||
return false;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
bool FWindow::zoomWindow()
|
||||
{
|
||||
if ( zoomed )
|
||||
{
|
||||
zoomed = false;
|
||||
FRect currentGeometry = getGeometryShadow();
|
||||
setGeometry (normalGeometry);
|
||||
restoreVTerm (currentGeometry);
|
||||
redraw();
|
||||
}
|
||||
else
|
||||
{
|
||||
zoomed = true;
|
||||
// save the current geometry
|
||||
normalGeometry = getGeometry();
|
||||
setGeometry (1, 1, getMaxWidth(), getMinHeight());
|
||||
redraw();
|
||||
}
|
||||
|
||||
return zoomed;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
FWindow* FWindow::getActiveWindow()
|
||||
{
|
||||
|
|
|
@ -45,7 +45,11 @@ class FWindow : public FWidget
|
|||
{
|
||||
private:
|
||||
bool window_active;
|
||||
bool zoomed;
|
||||
FWidget* win_focus_widget;
|
||||
FRect normalGeometry;
|
||||
FRect maxGeometry;
|
||||
FRect minGeometry;
|
||||
|
||||
protected:
|
||||
static FWindow* previous_widget;
|
||||
|
@ -69,6 +73,11 @@ class FWindow : public FWidget
|
|||
const char* getClassName() const;
|
||||
virtual void show();
|
||||
virtual void hide();
|
||||
void setWidth (int, bool = true);
|
||||
void setHeight (int, bool = true);
|
||||
// make every setGeometry from FWidget available
|
||||
using FWidget::setGeometry;
|
||||
void setGeometry (int, int, int, int, bool = true);
|
||||
static FWindow* getWindowWidgetAt (const FPoint&);
|
||||
static FWindow* getWindowWidgetAt (int, int);
|
||||
static void addWindow (FWidget*);
|
||||
|
@ -80,6 +89,8 @@ class FWindow : public FWidget
|
|||
bool raiseWindow ();
|
||||
static bool lowerWindow (FWidget*);
|
||||
bool lowerWindow ();
|
||||
bool zoomWindow ();
|
||||
bool isZoomed() const;
|
||||
static FWindow* getActiveWindow();
|
||||
static void setActiveWindow (FWindow*);
|
||||
FWidget* getWindowFocusWidget() const;
|
||||
|
@ -112,6 +123,10 @@ inline bool FWindow::raiseWindow()
|
|||
inline bool FWindow::lowerWindow()
|
||||
{ return lowerWindow(this); }
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
inline bool FWindow::isZoomed() const
|
||||
{ return zoomed; }
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
inline bool FWindow::activateWindow()
|
||||
{ return activateWindow(true); }
|
||||
|
|
79
test/ui.cpp
79
test/ui.cpp
|
@ -154,6 +154,68 @@ void ProgressDialog::cb_exit_bar (FWidget*, void*)
|
|||
}
|
||||
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
// class TextWindow
|
||||
//----------------------------------------------------------------------
|
||||
|
||||
#pragma pack(push)
|
||||
#pragma pack(1)
|
||||
|
||||
class TextWindow : public FDialog
|
||||
{
|
||||
private:
|
||||
FTextView* scrollText;
|
||||
|
||||
private:
|
||||
TextWindow (const TextWindow&); // Disabled copy constructor
|
||||
TextWindow& operator = (const TextWindow&); // and operator '='
|
||||
void adjustSize();
|
||||
|
||||
public:
|
||||
explicit TextWindow (FWidget* = 0); // constructor
|
||||
~TextWindow(); // destructor
|
||||
|
||||
void append (const FString&);
|
||||
};
|
||||
#pragma pack(pop)
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
TextWindow::TextWindow (FWidget* parent)
|
||||
: FDialog(parent)
|
||||
, scrollText()
|
||||
{
|
||||
scrollText = new FTextView(this);
|
||||
scrollText->ignorePadding();
|
||||
scrollText->setGeometry (1, 2, getWidth(), getHeight()-1);
|
||||
scrollText->setFocus();
|
||||
scrollText->insert(" -----------------------------------------------\n"
|
||||
" line 1\n"
|
||||
" -----------------------------------------------\n"
|
||||
" line 3\n"
|
||||
" line 4"
|
||||
, -1);
|
||||
scrollText->replaceRange(" File viewer", 1, 1);
|
||||
scrollText->deleteRange(3, 4);
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
TextWindow::~TextWindow()
|
||||
{ }
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
void TextWindow::append (const FString& str)
|
||||
{
|
||||
scrollText->append(str);
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
void TextWindow::adjustSize()
|
||||
{
|
||||
scrollText->setGeometry (1, 2, getWidth(), getHeight()-1);
|
||||
FDialog::adjustSize();
|
||||
}
|
||||
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
// class MyDialog
|
||||
//----------------------------------------------------------------------
|
||||
|
@ -745,26 +807,15 @@ void MyDialog::cb_view (FWidget*, void* data_ptr)
|
|||
if ( file.isNull() )
|
||||
return;
|
||||
|
||||
FDialog* view = new FDialog(this);
|
||||
TextWindow* view = new TextWindow(this);
|
||||
FString filename(basename(const_cast<char*>(file.c_str())));
|
||||
view->setText ("Viewer: " + filename);
|
||||
view->setGeometry (1+int((getRootWidget()->getWidth()-60)/2),
|
||||
int(getRootWidget()->getHeight()/6),
|
||||
60,
|
||||
int(getRootWidget()->getHeight()*3/4));
|
||||
view->setResizeable();
|
||||
|
||||
FTextView* scrollText = new FTextView(view);
|
||||
scrollText->ignorePadding();
|
||||
scrollText->setGeometry (1, 2, view->getWidth(), view->getHeight()-1);
|
||||
scrollText->setFocus();
|
||||
scrollText->insert(" -----------------------------------------------\n"
|
||||
" line 1\n"
|
||||
" -----------------------------------------------\n"
|
||||
" line 3\n"
|
||||
" line 4"
|
||||
, -1);
|
||||
scrollText->replaceRange(" File viewer", 1, 1);
|
||||
scrollText->deleteRange(3, 4);
|
||||
std::string line = "";
|
||||
std::ifstream infile;
|
||||
infile.open(file);
|
||||
|
@ -772,7 +823,7 @@ void MyDialog::cb_view (FWidget*, void* data_ptr)
|
|||
while ( ! infile.eof() && infile.good() )
|
||||
{
|
||||
getline(infile, line);
|
||||
scrollText->append(line);
|
||||
view->append(line);
|
||||
}
|
||||
|
||||
if ( infile.is_open() )
|
||||
|
|
|
@ -239,6 +239,7 @@ void Window::cb_createWindows (FWidget*, void*)
|
|||
x = dx + 5 + (n%3)*25 + int(n/3)*3;
|
||||
y = dy + 11 + int(n/3)*3;
|
||||
win->setGeometry (x, y, 20, 8);
|
||||
win->setResizeable();
|
||||
win->show();
|
||||
|
||||
win->addCallback
|
||||
|
|
Loading…
Reference in New Issue