Support for the menu key

This commit is contained in:
Markus Gans 2015-10-29 21:10:50 +01:00
parent 825e7fc959
commit 60fe968ce0
21 changed files with 750 additions and 225 deletions

View File

@ -1,3 +1,6 @@
2015-10-29 Markus Gans <guru.mail@muenster.de>
* Support for the menu key
2015-10-23 Markus Gans <guru.mail@muenster.de> 2015-10-23 Markus Gans <guru.mail@muenster.de>
* Color setting improvements * Color setting improvements

View File

@ -4,7 +4,6 @@ Bugs
Improvements Improvements
~~~~~~~~~~~~ ~~~~~~~~~~~~
- Use only termpap variables for FTerm::hideCursor()
- If t_exit_underline_mode == "\E[24m" - If t_exit_underline_mode == "\E[24m"
-> implement t_exit_bold_mode with "\E[21m" -> implement t_exit_bold_mode with "\E[21m"
-> implement t_exit_reverse_mode with "\E[27m" -> implement t_exit_reverse_mode with "\E[27m"

View File

@ -269,7 +269,7 @@ void FDialog::drawDialogShadow()
if ( isNewFont() && ((flags & SCROLLABLE) == 0) ) if ( isNewFont() && ((flags & SCROLLABLE) == 0) )
{ {
FTerm::char_data ch; FTerm::char_data ch;
// left of the shaddow ▀▀ // left of the shadow ▀▀
gotoxy (xpos+xmin-1, ypos+ymin-1+height); gotoxy (xpos+xmin-1, ypos+ymin-1+height);
for (int x=0; x <= 1; x++) for (int x=0; x <= 1; x++)
{ {
@ -289,7 +289,7 @@ void FDialog::drawDialogShadow()
FTerm::char_data ch; FTerm::char_data ch;
ch = getCoveredCharacter (xpos+xmin-1, ypos+ymin-1+height, this); ch = getCoveredCharacter (xpos+xmin-1, ypos+ymin-1+height, this);
// left of the shaddow ▀▀ // left of the shadow ▀▀
gotoxy (xpos+xmin-1, ypos+ymin-1+height); gotoxy (xpos+xmin-1, ypos+ymin-1+height);
if ( isNewFont() && ((flags & SCROLLABLE) == 0) ) if ( isNewFont() && ((flags & SCROLLABLE) == 0) )
@ -608,7 +608,7 @@ void FDialog::onWindowRaised (FEvent*)
if ( window_list->empty() ) if ( window_list->empty() )
return; return;
// redraw shaddow of the other windows // redraw shadow of the other windows
iter = window_list->begin(); iter = window_list->begin();
end = window_list->end(); end = window_list->end();

View File

@ -426,6 +426,14 @@ class fc
Fcmkey_sdown = 0x150015d, // shifted control-M-Down Fcmkey_sdown = 0x150015d, // shifted control-M-Down
Fcmkey_sright = 0x150015e, // shifted control-M-Right Fcmkey_sright = 0x150015e, // shifted control-M-Right
Fcmkey_sleft = 0x150015f, // shifted control-M-Left Fcmkey_sleft = 0x150015f, // shifted control-M-Left
Fkey_menu = 0x1600000, // menu
Fkey_smenu = 0x1600001, // shifted menu
Fckey_menu = 0x1600002, // control-menu
Fckey_smenu = 0x1600003, // shifted control-menu
Fmkey_menu = 0x1600004, // M-menu
Fmkey_smenu = 0x1600005, // shifted M-menu
Fcmkey_menu = 0x1600006, // control-M-menu
Fcmkey_smenu = 0x1600007, // shifted control-M-menu
Fkey_escape_mintty = 0x200001b, // mintty Esc Fkey_escape_mintty = 0x200001b, // mintty Esc
Fkey_mouse = 0x2000020, // xterm mouse Fkey_mouse = 0x2000020, // xterm mouse
Fkey_extended_mouse = 0x2000021, // SGR extended mouse Fkey_extended_mouse = 0x2000021, // SGR extended mouse

View File

@ -290,6 +290,17 @@ static metakeymap Fmetakey[] =
{ fc::Fcmkey_sdown , "\033[1;8B" }, // shift-ctrl-M-down { fc::Fcmkey_sdown , "\033[1;8B" }, // shift-ctrl-M-down
{ fc::Fcmkey_sright , "\033[1;8C" }, // shift-ctrl-M-right { fc::Fcmkey_sright , "\033[1;8C" }, // shift-ctrl-M-right
{ fc::Fcmkey_sleft , "\033[1;8D" }, // shift-ctrl-M-left { fc::Fcmkey_sleft , "\033[1;8D" }, // shift-ctrl-M-left
{ fc::Fkey_menu , "\033[29~" }, // menu
{ fc::Fkey_smenu , "\033[29$" }, // shift-menu
{ fc::Fkey_smenu , "\033[29;2~" }, // shift-menu
{ fc::Fckey_menu , "\033[29^" }, // ctrl-menu
{ fc::Fckey_menu , "\033[29;5~" }, // ctrl-menu
{ fc::Fckey_smenu , "\033[29@" }, // shift-ctrl-menu
{ fc::Fckey_smenu , "\033[29;6~" }, // shift-ctrl-menu
{ fc::Fmkey_menu , "\033[29;3~" }, // M-menu
{ fc::Fmkey_smenu , "\033[29;4~" }, // shift-M-menu
{ fc::Fcmkey_menu , "\033[29;7~" }, // ctrl-M-menu
{ fc::Fcmkey_smenu , "\033[29;8~" }, // shift-ctrl-M-menu
{ fc::Fkey_escape_mintty , "\033O["}, // mintty Esc { fc::Fkey_escape_mintty , "\033O["}, // mintty Esc
{ fc::Fmkey_space , "\033 " }, // M-' ' { fc::Fmkey_space , "\033 " }, // M-' '
{ fc::Fmkey_bang , "\033!" }, // M-! { fc::Fmkey_bang , "\033!" }, // M-!
@ -654,6 +665,14 @@ static keyname FkeyName[] =
{ fc::Fcmkey_sdown , "Shift+Ctrl+Meta+Down" }, { fc::Fcmkey_sdown , "Shift+Ctrl+Meta+Down" },
{ fc::Fcmkey_sright , "Shift+Ctrl+Meta+Right" }, { fc::Fcmkey_sright , "Shift+Ctrl+Meta+Right" },
{ fc::Fcmkey_sleft , "Shift+Ctrl+Meta+Left" }, { fc::Fcmkey_sleft , "Shift+Ctrl+Meta+Left" },
{ fc::Fkey_menu , "Menu" },
{ fc::Fkey_smenu , "Shift+Menu" },
{ fc::Fckey_menu , "Ctrl+Menu" },
{ fc::Fckey_smenu , "Shift+Ctrl+Menu" },
{ fc::Fmkey_menu , "Meta+Menu" },
{ fc::Fmkey_smenu , "Shift+Meta+Menu" },
{ fc::Fcmkey_menu , "Ctrl+Meta+Menu" },
{ fc::Fcmkey_smenu , "Shift+Ctrl+Meta+Menu" },
{ fc::Fmkey_space , "Meta+Space" }, { fc::Fmkey_space , "Meta+Space" },
{ fc::Fmkey_bang , "Meta+!" }, { fc::Fmkey_bang , "Meta+!" },
{ fc::Fmkey_quotes , "Meta+\"" }, { fc::Fmkey_quotes , "Meta+\"" },

View File

@ -1,8 +1,10 @@
// File: fmenu.cpp // File: fmenu.cpp
// Provides: class FMenu // Provides: class FMenu
#include "fapp.h"
#include "fmenu.h" #include "fmenu.h"
#include "fmessagebox.h" // <----- remove later #include "fmessagebox.h" // <----- remove later
#include "fstatusbar.h"
//---------------------------------------------------------------------- //----------------------------------------------------------------------
// class FMenu // class FMenu
@ -100,6 +102,7 @@ void FMenu::init(FWidget* parent)
right_padding = 1; right_padding = 1;
createArea (vwin); createArea (vwin);
setGeometry (1, 1 , 10, 2, false); // initialize geometry values setGeometry (1, 1 , 10, 2, false); // initialize geometry values
setTransparentShadow();
window_object = true; window_object = true;
addWindow(this); addWindow(this);
hide(); hide();
@ -226,6 +229,103 @@ bool FMenu::containsMenuStructure (int x, int y) const
return false; return false;
} }
//----------------------------------------------------------------------
bool FMenu::selectNextItem()
{
std::vector<FMenuItem*>::const_iterator iter, end;
iter = itemlist.begin();
end = itemlist.end();
while ( iter != end )
{
if ( (*iter)->isSelected() )
{
FMenuItem* next;
std::vector<FMenuItem*>::const_iterator next_element;
next_element = iter;
do
{
++next_element;
if ( next_element == itemlist.end() )
next_element = itemlist.begin();
next = static_cast<FMenuItem*>(*next_element);
} while ( ! next->isEnabled()
|| ! next->acceptFocus()
|| ! next->isVisible()
|| next->isSeparator() );
if ( next == *iter )
return false;
unselectItemInList();
next->setSelected();
next->setFocus();
if ( statusBar() )
statusBar()->drawMessage();
selectedListItem = next;
redraw();
break;
}
++iter;
}
return true;
}
//----------------------------------------------------------------------
bool FMenu::selectPrevItem()
{
std::vector<FMenuItem*>::const_iterator iter, begin;
iter = itemlist.end();
begin = itemlist.begin();
do
{
--iter;
if ( (*iter)->isSelected() )
{
FMenuItem* prev;
std::vector<FMenuItem*>::const_iterator prev_element;
prev_element = iter;
do
{
if ( prev_element == itemlist.begin() )
prev_element = itemlist.end();
--prev_element;
prev = static_cast<FMenuItem*>(*prev_element);
} while ( ! prev->isEnabled()
|| ! prev->acceptFocus()
|| ! prev->isVisible()
|| prev->isSeparator() );
if ( prev == *iter )
return false;
unselectItemInList();
prev->setSelected();
prev->setFocus();
if ( statusBar() )
statusBar()->drawMessage();
selectedListItem = prev;
redraw();
break;
}
} while ( iter != begin );
return true;
}
//----------------------------------------------------------------------
void FMenu::keypressMenuBar (FKeyEvent* ev)
{
FWidget* super = getSuperMenu();
if ( super )
{
if ( isMenuBar(super) )
{
FMenuBar* mb = reinterpret_cast<FMenuBar*>(super);
mb->onKeyPress(ev);
}
}
}
//---------------------------------------------------------------------- //----------------------------------------------------------------------
int FMenu::getHotkeyPos (wchar_t*& src, wchar_t*& dest, uInt length) int FMenu::getHotkeyPos (wchar_t*& src, wchar_t*& dest, uInt length)
{ {
@ -260,8 +360,8 @@ void FMenu::draw()
drawItems(); drawItems();
if ( isMonochron() ) if ( isMonochron() )
setReverse(false); setReverse(false);
//if ( (flags & SHADOW) != 0 ) if ( (flags & SHADOW) != 0 )
// drawMenuShadow(); drawMenuShadow();
setUpdateVTerm(true); setUpdateVTerm(true);
} }
@ -327,6 +427,12 @@ void FMenu::drawBorder()
} }
} }
//----------------------------------------------------------------------
void FMenu::drawMenuShadow()
{
drawShadow();
}
//---------------------------------------------------------------------- //----------------------------------------------------------------------
void FMenu::drawItems() void FMenu::drawItems()
{ {
@ -344,87 +450,116 @@ void FMenu::drawItems()
FString txt; FString txt;
uInt txt_length; uInt txt_length;
int hotkeypos, to_char; int hotkeypos, to_char;
bool is_Active = (*iter)->isActivated(); bool is_enabled = (*iter)->isEnabled();
bool is_Selected = (*iter)->isSelected(); bool has_focus = (*iter)->hasFocus();
bool is_NoUnderline = (((*iter)->getFlags() & NO_UNDERLINE) != 0); bool is_selected = (*iter)->isSelected();
bool is_noUnderline = (((*iter)->getFlags() & NO_UNDERLINE) != 0);
bool is_separator = (*iter)->isSeparator();
if ( is_Active ) if ( is_separator )
{ {
if ( is_Selected ) drawSeparator(y);
{
foregroundColor = wc.menu_active_focus_fg;
backgroundColor = wc.menu_active_focus_bg;
if ( isMonochron() )
setReverse(false);
}
else
{
foregroundColor = wc.menu_active_fg;
backgroundColor = wc.menu_active_bg;
}
} }
else else
{ {
foregroundColor = wc.menu_inactive_fg; if ( is_enabled )
backgroundColor = wc.menu_inactive_bg;
}
gotoxy (xpos+xmin, ypos+ymin+y);
setColor (foregroundColor, backgroundColor);
print (' ');
txt = (*iter)->getText();
txt_length = uInt(txt.getLength());
item_text = new wchar_t[txt_length+1]();
src = const_cast<wchar_t*>(txt.wc_str());
dest = const_cast<wchar_t*>(item_text);
to_char = int(txt_length);
hotkeypos = getHotkeyPos (src, dest, txt_length);
if ( hotkeypos != -1 )
{
txt_length--;
to_char--;
}
for (int z=0; z < to_char; z++)
{
if ( ! iswprint(wint_t(item_text[z])) )
{ {
if ( ! isNewFont() && ( int(item_text[z]) < fc::NF_rev_left_arrow2 if ( is_selected )
|| int(item_text[z]) > fc::NF_check_mark ) )
{ {
item_text[z] = L' '; foregroundColor = wc.menu_active_focus_fg;
backgroundColor = wc.menu_active_focus_bg;
if ( isMonochron() )
setReverse(false);
}
else
{
foregroundColor = wc.menu_active_fg;
backgroundColor = wc.menu_active_bg;
} }
} }
if ( (z == hotkeypos) && is_Active && ! is_Selected )
{
setColor (wc.menu_hotkey_fg, wc.menu_hotkey_bg);
if ( ! is_NoUnderline )
setUnderline();
print (item_text[z]);
if ( ! is_NoUnderline )
unsetUnderline();
setColor (foregroundColor, backgroundColor);
}
else else
print (item_text[z]); {
} foregroundColor = wc.menu_inactive_fg;
backgroundColor = wc.menu_inactive_bg;
}
gotoxy (xpos+xmin, ypos+ymin+y);
setColor (foregroundColor, backgroundColor);
print (' ');
if ( is_Selected ) txt = (*iter)->getText();
txt_length = uInt(txt.getLength());
item_text = new wchar_t[txt_length+1]();
src = const_cast<wchar_t*>(txt.wc_str());
dest = const_cast<wchar_t*>(item_text);
to_char = int(txt_length);
hotkeypos = getHotkeyPos (src, dest, txt_length);
if ( hotkeypos != -1 )
{
txt_length--;
to_char--;
}
for (int z=0; z < to_char; z++)
{
if ( ! iswprint(wint_t(item_text[z])) )
{
if ( ! isNewFont() && ( int(item_text[z]) < fc::NF_rev_left_arrow2
|| int(item_text[z]) > fc::NF_check_mark ) )
{
item_text[z] = L' ';
}
}
if ( (z == hotkeypos) && is_enabled && ! is_selected )
{
setColor (wc.menu_hotkey_fg, wc.menu_hotkey_bg);
if ( ! is_noUnderline )
setUnderline();
print (item_text[z]);
if ( ! is_noUnderline )
unsetUnderline();
setColor (foregroundColor, backgroundColor);
}
else
print (item_text[z]);
}
if ( is_selected )
{
for (uInt i=uInt(to_char); i < maxItemWidth-1; i++)
print (' ');
}
if ( isMonochron() && is_enabled && is_selected )
setReverse(true);
delete[] item_text;
}
if ( has_focus && statusBar() )
{ {
for (uInt i=uInt(to_char); i < maxItemWidth-1; i++) FString msg = (*iter)->getStatusbarMessage();
print (' '); FString curMsg = statusBar()->getMessage();
if ( curMsg != msg )
{
statusBar()->setMessage(msg);
statusBar()->drawMessage();
}
} }
if ( isMonochron() && is_Active && is_Selected )
setReverse(true);
delete[] item_text;
++iter; ++iter;
y++; y++;
} }
} }
//----------------------------------------------------------------------
inline void FMenu::drawSeparator(int y)
{
gotoxy (xpos+xmin-1, ypos+ymin+y);
setColor (wc.menu_active_fg, wc.menu_active_bg);
print(fc::BoxDrawingsVerticalAndRight);
FString line(width-2, wchar_t(fc::BoxDrawingsHorizontal));
print (line);
print(fc::BoxDrawingsVerticalAndLeft);
}
//---------------------------------------------------------------------- //----------------------------------------------------------------------
void FMenu::processActivate() void FMenu::processActivate()
{ {
@ -433,6 +568,86 @@ void FMenu::processActivate()
// public methods of FMenu // public methods of FMenu
//----------------------------------------------------------------------
void FMenu::onKeyPress (FKeyEvent* ev)
{
switch ( ev->key() )
{
case fc::Fkey_return:
case fc::Fkey_enter:
if ( hasSelectedListItem() )
{
FMenuItem* sel_item = selectedListItem;
unselectItemInList();
hide();
hideSuperMenus();
sel_item->processClicked();
}
ev->accept();
break;
case fc::Fkey_up:
selectPrevItem();
ev->accept();
break;
case fc::Fkey_down:
selectNextItem();
ev->accept();
break;
case fc::Fkey_left:
if ( selectedListItem->hasMenu() )
{
FMenu* sub_menu = selectedListItem->getMenu();
if ( sub_menu->isVisible() )
hideSubMenus();
else
keypressMenuBar(ev); // select previous menu
ev->accept();
}
else
keypressMenuBar(ev); // select previous menu
break;
case fc::Fkey_right:
if ( selectedListItem->hasMenu() )
{
FMenu* sub_menu = selectedListItem->getMenu();
if ( ! sub_menu->isVisible() )
{
// open sub menu
sub_menu->selectFirstItemInList();
sub_menu->getSelectedListItem()->setFocus();;
sub_menu->setVisible();
sub_menu->show();
raiseWindow (sub_menu);
sub_menu->redraw();
updateTerminal();
flush_out();
}
else
keypressMenuBar(ev); // select next menu
ev->accept();
}
else
keypressMenuBar(ev); // select next menu
break;
case fc::Fkey_escape:
case fc::Fkey_escape_mintty:
unselectItemInList();
hide();
hideSubMenus();
hideSuperMenus();
ev->accept();
break;
default:
break;
}
}
//---------------------------------------------------------------------- //----------------------------------------------------------------------
void FMenu::onMouseDown (FMouseEvent* ev) void FMenu::onMouseDown (FMouseEvent* ev)
{ {
@ -473,10 +688,17 @@ void FMenu::onMouseDown (FMouseEvent* ev)
&& mouse_y == y && mouse_y == y
&& ! (*iter)->isSelected() ) && ! (*iter)->isSelected() )
{ {
FWidget* focused_widget = getFocusWidget();
FFocusEvent out (FocusOut_Event);
FApplication::queueEvent(focused_widget, &out);
if ( hasSelectedListItem() ) if ( hasSelectedListItem() )
unselectItemInList(); unselectItemInList();
(*iter)->setSelected(); (*iter)->setSelected();
(*iter)->setFocus();
if ( focused_widget )
focused_widget->redraw();
if ( statusBar() )
statusBar()->drawMessage();
selectedListItem = *iter; selectedListItem = *iter;
focus_changed = true; focus_changed = true;
} }
@ -577,9 +799,17 @@ FMessageBox::info (this, "Info", FString().sprintf("local(%d,%d) global(%d,%d)\n
&& mouse_x <= x2 && mouse_x <= x2
&& mouse_y == y ) && mouse_y == y )
{ {
if ( (*iter)->isActivated() && ! (*iter)->isSelected() ) if ( (*iter)->isEnabled() && ! (*iter)->isSelected() )
{ {
FWidget* focused_widget = getFocusWidget();
FFocusEvent out (FocusOut_Event);
FApplication::queueEvent(focused_widget, &out);
(*iter)->setSelected(); (*iter)->setSelected();
(*iter)->setFocus();
if ( focused_widget )
focused_widget->redraw();
if ( statusBar() )
statusBar()->drawMessage();
selectedListItem = *iter; selectedListItem = *iter;
focus_changed = true; focus_changed = true;
} }
@ -587,7 +817,7 @@ FMessageBox::info (this, "Info", FString().sprintf("local(%d,%d) global(%d,%d)\n
else else
{ {
if ( getGeometryGlobal().contains(ev->getGlobalPos()) if ( getGeometryGlobal().contains(ev->getGlobalPos())
&& (*iter)->isActivated() && (*iter)->isEnabled()
&& (*iter)->isSelected() ) && (*iter)->isSelected() )
{ {
(*iter)->unsetSelected(); (*iter)->unsetSelected();
@ -706,7 +936,7 @@ void FMenu::cb_menuitem_activated (FWidget* widget, void*)
menu->setVisible(); menu->setVisible();
menu->show(); menu->show();
raiseWindow(menu); raiseWindow (menu);
menu->redraw(); menu->redraw();
updateTerminal(); updateTerminal();
flush_out(); flush_out();
@ -716,6 +946,29 @@ void FMenu::cb_menuitem_activated (FWidget* widget, void*)
} }
} }
//----------------------------------------------------------------------
bool FMenu::setTransparentShadow (bool on)
{
if ( on )
{
flags |= SHADOW;
flags |= TRANS_SHADOW;
shadow.setPoint(2,1);
adjustWidgetSizeShadow = getGeometry() + getShadow();
adjustWidgetSizeGlobalShadow = getGeometryGlobal() + getShadow();
}
else
{
flags &= ~SHADOW;
flags &= ~TRANS_SHADOW;
shadow.setPoint(0,0);
adjustWidgetSizeShadow = getGeometry() + getShadow();
adjustWidgetSizeGlobalShadow = getGeometryGlobal() + getShadow();
}
resizeArea (vwin);
return on;
}
//---------------------------------------------------------------------- //----------------------------------------------------------------------
void FMenu::cb_menuitem_deactivated (FWidget* widget, void*) void FMenu::cb_menuitem_deactivated (FWidget* widget, void*)
{ {

View File

@ -65,10 +65,15 @@ class FMenu : public FWindow, public FMenuList
void hideSuperMenus(); void hideSuperMenus();
bool containsMenuStructure (const FPoint&) const; bool containsMenuStructure (const FPoint&) const;
bool containsMenuStructure (int, int) const; bool containsMenuStructure (int, int) const;
bool selectNextItem();
bool selectPrevItem();
void keypressMenuBar (FKeyEvent*);
int getHotkeyPos (wchar_t*&, wchar_t*&, uInt); int getHotkeyPos (wchar_t*&, wchar_t*&, uInt);
void draw(); void draw();
void drawBorder(); void drawBorder();
void drawMenuShadow();
void drawItems(); void drawItems();
void drawSeparator(int);
void processActivate(); void processActivate();
public: public:
@ -79,30 +84,37 @@ class FMenu : public FWindow, public FMenuList
virtual ~FMenu(); // destructor virtual ~FMenu(); // destructor
virtual const char* getClassName() const; virtual const char* getClassName() const;
void onKeyPress (FKeyEvent*);
void onMouseDown (FMouseEvent*); void onMouseDown (FMouseEvent*);
void onMouseUp (FMouseEvent*); void onMouseUp (FMouseEvent*);
void onMouseMove (FMouseEvent*); void onMouseMove (FMouseEvent*);
void onAccel (FAccelEvent*);
void show(); void show();
void hide(); void hide();
// make every setGeometry from FWidget available // make every setGeometry from FWidget available
using FWidget::setGeometry; using FWidget::setGeometry;
void setGeometry (int, int, int, int, bool = true); void setGeometry (int, int, int, int, bool = true);
FMenuItem* getItem() const; FMenuItem* getItem() const;
void onAccel (FAccelEvent*);
FString getText() const; FString getText() const;
void setActive(); bool setEnable(bool);
void unsetActive(); bool setEnable();
bool isActivated() const; bool unsetEnable();
bool setDisable();
bool isEnabled() const;
void setSelected(); void setSelected();
void unsetSelected(); void unsetSelected();
bool isSelected() const; bool isSelected() const;
void selectFirstItemInList(); void selectFirstItemInList();
void unselectItemInList(); void unselectItemInList();
FMenuItem* getSelectedListItem() const;
bool hasSelectedListItem() const; bool hasSelectedListItem() const;
bool hasHotkey() const; bool hasHotkey() const;
void setMenu (FMenu*); void setMenu (FMenu*);
bool hasMenu() const; bool hasMenu() const;
bool setTransparentShadow (bool);
bool setTransparentShadow();
bool unsetTransparentShadow();
bool hasTransparentShadow();
void setText (FString&); void setText (FString&);
void setText (const std::string&); void setText (const std::string&);
void setText (const char*); void setText (const char*);
@ -146,16 +158,24 @@ inline FString FMenu::getText() const
{ return item->getText(); } { return item->getText(); }
//---------------------------------------------------------------------- //----------------------------------------------------------------------
inline void FMenu::setActive() inline bool FMenu::setEnable(bool on)
{ item->setActive(); } { return item->setEnable(on); }
//---------------------------------------------------------------------- //----------------------------------------------------------------------
inline void FMenu::unsetActive() inline bool FMenu::setEnable()
{ item->unsetActive(); } { return item->setEnable(); }
//---------------------------------------------------------------------- //----------------------------------------------------------------------
inline bool FMenu::isActivated() const inline bool FMenu::unsetEnable()
{ return item->isActivated(); } { return item->unsetEnable(); }
//----------------------------------------------------------------------
inline bool FMenu::setDisable()
{ return item->setDisable(); }
//----------------------------------------------------------------------
inline bool FMenu::isEnabled() const
{ return item->isEnabled(); }
//---------------------------------------------------------------------- //----------------------------------------------------------------------
inline void FMenu::setSelected() inline void FMenu::setSelected()
@ -169,6 +189,10 @@ inline void FMenu::unsetSelected()
inline bool FMenu::isSelected() const inline bool FMenu::isSelected() const
{ return item->isSelected(); } { return item->isSelected(); }
//----------------------------------------------------------------------
inline FMenuItem* FMenu::getSelectedListItem() const
{ return selectedListItem; }
//---------------------------------------------------------------------- //----------------------------------------------------------------------
inline bool FMenu::hasSelectedListItem() const inline bool FMenu::hasSelectedListItem() const
{ return selectedListItem; } { return selectedListItem; }
@ -185,6 +209,18 @@ inline void FMenu::setMenu (FMenu* m)
inline bool FMenu::hasMenu() const inline bool FMenu::hasMenu() const
{ return item->hasMenu(); } { return item->hasMenu(); }
//----------------------------------------------------------------------
inline bool FMenu::setTransparentShadow()
{ return setTransparentShadow(true); }
//----------------------------------------------------------------------
inline bool FMenu::unsetTransparentShadow()
{ return setTransparentShadow(false); }
//----------------------------------------------------------------------
inline bool FMenu::hasTransparentShadow()
{ return ((flags & TRANS_SHADOW) != 0); }
//---------------------------------------------------------------------- //----------------------------------------------------------------------
inline void FMenu::setText (FString& txt) inline void FMenu::setText (FString& txt)
{ item->setText(txt); } { item->setText(txt); }

View File

@ -150,7 +150,7 @@ void FMenuBar::drawItems()
int hotkeypos, to_char; int hotkeypos, to_char;
bool is_Active, is_Selected, is_NoUnderline; bool is_Active, is_Selected, is_NoUnderline;
is_Active = (*iter)->isActivated(); is_Active = (*iter)->isEnabled();
is_Selected = (*iter)->isSelected(); is_Selected = (*iter)->isSelected();
is_NoUnderline = (((*iter)->getFlags() & NO_UNDERLINE) != 0); is_NoUnderline = (((*iter)->getFlags() & NO_UNDERLINE) != 0);
@ -262,6 +262,26 @@ void FMenuBar::adjustSize()
} }
// public methods of FMenuBar // public methods of FMenuBar
//----------------------------------------------------------------------
void FMenuBar::onKeyPress (FKeyEvent* ev)
{
switch ( ev->key() )
{
case fc::Fkey_left:
beep();
ev->accept();
break;
case fc::Fkey_right:
beep();
ev->accept();
break;
default:
break;
}
}
//---------------------------------------------------------------------- //----------------------------------------------------------------------
void FMenuBar::onMouseDown (FMouseEvent* ev) void FMenuBar::onMouseDown (FMouseEvent* ev)
{ {
@ -318,9 +338,10 @@ void FMenuBar::onMouseDown (FMouseEvent* ev)
&& mouse_x <= x2 && mouse_x <= x2
&& mouse_y == 1 ) && mouse_y == 1 )
{ {
if ( (*iter)->isActivated() && ! (*iter)->isSelected() ) if ( (*iter)->isEnabled() && ! (*iter)->isSelected() )
{ {
(*iter)->setSelected(); (*iter)->setSelected();
(*iter)->setFocus();
selectedMenuItem = *iter; selectedMenuItem = *iter;
focus_changed = true; focus_changed = true;
} }
@ -337,7 +358,7 @@ void FMenuBar::onMouseDown (FMouseEvent* ev)
else else
{ {
if ( mouse_y == 1 if ( mouse_y == 1
&& (*iter)->isActivated() && (*iter)->isEnabled()
&& (*iter)->isSelected() ) && (*iter)->isSelected() )
{ {
(*iter)->unsetSelected(); (*iter)->unsetSelected();
@ -382,7 +403,7 @@ void FMenuBar::onMouseUp (FMouseEvent* ev)
if ( mouse_x >= x1 if ( mouse_x >= x1
&& mouse_x <= x2 && mouse_x <= x2
&& mouse_y == 1 && mouse_y == 1
&& (*iter)->isActivated() && (*iter)->isEnabled()
&& (*iter)->isSelected() ) && (*iter)->isSelected() )
{ {
if ( (*iter)->hasMenu() ) if ( (*iter)->hasMenu() )
@ -391,6 +412,7 @@ void FMenuBar::onMouseUp (FMouseEvent* ev)
if ( ! menu->hasSelectedListItem() ) if ( ! menu->hasSelectedListItem() )
{ {
menu->selectFirstItemInList(); menu->selectFirstItemInList();
menu->getSelectedListItem()->setFocus();
menu->redraw(); menu->redraw();
} }
} }
@ -440,9 +462,10 @@ void FMenuBar::onMouseMove (FMouseEvent* ev)
&& mouse_x <= x2 && mouse_x <= x2
&& mouse_y == 1 ) && mouse_y == 1 )
{ {
if ( (*iter)->isActivated() && ! (*iter)->isSelected() ) if ( (*iter)->isEnabled() && ! (*iter)->isSelected() )
{ {
(*iter)->setSelected(); (*iter)->setSelected();
(*iter)->setFocus();
selectedMenuItem = *iter; selectedMenuItem = *iter;
focus_changed = true; focus_changed = true;
} }
@ -459,7 +482,7 @@ void FMenuBar::onMouseMove (FMouseEvent* ev)
else else
{ {
if ( getGeometryGlobal().contains(ev->getGlobalPos()) if ( getGeometryGlobal().contains(ev->getGlobalPos())
&& (*iter)->isActivated() && (*iter)->isEnabled()
&& (*iter)->isSelected() ) && (*iter)->isSelected() )
{ {
(*iter)->unsetSelected(); (*iter)->unsetSelected();
@ -543,7 +566,6 @@ void FMenuBar::cb_item_activated (FWidget* widget, void*)
menu->redraw(); menu->redraw();
updateTerminal(); updateTerminal();
flush_out(); flush_out();
} }
} }
} }

View File

@ -64,6 +64,7 @@ class FMenuBar : public FWindow, public FMenuList
virtual ~FMenuBar(); // destructor virtual ~FMenuBar(); // destructor
virtual const char* getClassName() const; virtual const char* getClassName() const;
void onKeyPress (FKeyEvent*);
void onMouseDown (FMouseEvent*); void onMouseDown (FMouseEvent*);
void onMouseUp (FMouseEvent*); void onMouseUp (FMouseEvent*);
void onMouseMove (FMouseEvent*); void onMouseMove (FMouseEvent*);

View File

@ -1,10 +1,12 @@
// File: fmenuitem.cpp // File: fmenuitem.cpp
// Provides: class FMenuItem // Provides: class FMenuItem
#include "fapp.h"
#include "fmenu.h" #include "fmenu.h"
#include "fmenubar.h" #include "fmenubar.h"
#include "fmenulist.h" #include "fmenulist.h"
#include "fmenuitem.h" #include "fmenuitem.h"
#include "fstatusbar.h"
//---------------------------------------------------------------------- //----------------------------------------------------------------------
// class FMenuItem // class FMenuItem
@ -15,7 +17,6 @@
FMenuItem::FMenuItem (FWidget* parent) FMenuItem::FMenuItem (FWidget* parent)
: FWidget(parent) : FWidget(parent)
, text() , text()
, active(true)
, selected(false) , selected(false)
, separator(false) , separator(false)
, checked(false) , checked(false)
@ -32,7 +33,6 @@ FMenuItem::FMenuItem (FWidget* parent)
FMenuItem::FMenuItem (FString& txt, FWidget* parent) FMenuItem::FMenuItem (FString& txt, FWidget* parent)
: FWidget(parent) : FWidget(parent)
, text(txt) , text(txt)
, active(true)
, selected(false) , selected(false)
, separator(false) , separator(false)
, checked(false) , checked(false)
@ -49,7 +49,6 @@ FMenuItem::FMenuItem (FString& txt, FWidget* parent)
FMenuItem::FMenuItem (const std::string& txt, FWidget* parent) FMenuItem::FMenuItem (const std::string& txt, FWidget* parent)
: FWidget(parent) : FWidget(parent)
, text(txt) , text(txt)
, active(true)
, selected(false) , selected(false)
, separator(false) , separator(false)
, checked(false) , checked(false)
@ -66,7 +65,6 @@ FMenuItem::FMenuItem (const std::string& txt, FWidget* parent)
FMenuItem::FMenuItem (const char* txt, FWidget* parent) FMenuItem::FMenuItem (const char* txt, FWidget* parent)
: FWidget(parent) : FWidget(parent)
, text(txt) , text(txt)
, active(true)
, selected(false) , selected(false)
, separator(false) , separator(false)
, checked(false) , checked(false)
@ -108,7 +106,7 @@ void FMenuItem::init (FWidget* parent)
menubar_ptr->menu_dimension(); menubar_ptr->menu_dimension();
// Meta + hotkey // Meta + hotkey
addAccelerator (0x20000e0+tolower(hotkey), this); menubar_ptr->addAccelerator (0x20000e0+tolower(hotkey), this);
this->addCallback this->addCallback
( (
@ -127,7 +125,7 @@ void FMenuItem::init (FWidget* parent)
if ( super_menu_ptr ) if ( super_menu_ptr )
super_menu_ptr->menu_dimension(); super_menu_ptr->menu_dimension();
//addAccelerator (item->getKey(), item); //addAccelerator (accel_key, this);
this->addCallback this->addCallback
( (
@ -141,6 +139,11 @@ void FMenuItem::init (FWidget* parent)
); );
} }
} }
if ( hasFocus() )
flags = FOCUS;
if ( isEnabled() )
flags |= ACTIVE;
} }
//---------------------------------------------------------------------- //----------------------------------------------------------------------
@ -202,21 +205,22 @@ void FMenuItem::processClicked()
// public methods of FMenuItem // public methods of FMenuItem
//---------------------------------------------------------------------- //----------------------------------------------------------------------
void FMenuItem::onAccel (FAccelEvent* ev) void FMenuItem::onKeyPress (FKeyEvent* ev)
{ {
beep(); // activate by key if ( super_menu )
if ( isActivated() && ! isSelected() )
{ {
if ( super_menu && isMenuBar(super_menu) ) if ( isMenu(super_menu) )
{
FMenu* sm = dynamic_cast<FMenu*>(super_menu);
if ( sm )
sm->onKeyPress(ev);
}
if ( isMenuBar(super_menu) )
{ {
FMenuBar* mb = dynamic_cast<FMenuBar*>(super_menu); FMenuBar* mb = dynamic_cast<FMenuBar*>(super_menu);
if ( mb ) if ( mb )
{ mb->onKeyPress(ev);
setSelected();
mb->selectedMenuItem = this;
mb->redraw();
ev->accept();
}
} }
} }
} }
@ -252,7 +256,6 @@ void FMenuItem::onMouseDown (FMouseEvent* ev)
delete ev; delete ev;
} }
} }
} }
} }
@ -287,7 +290,6 @@ void FMenuItem::onMouseUp (FMouseEvent* ev)
delete ev; delete ev;
} }
} }
} }
} }
@ -326,10 +328,118 @@ void FMenuItem::onMouseMove (FMouseEvent* ev)
} }
} }
//----------------------------------------------------------------------
void FMenuItem::onAccel (FAccelEvent* ev)
{
if ( isEnabled() && ! isSelected() )
{
if ( super_menu && isMenuBar(super_menu) )
{
FMenuBar* mb = dynamic_cast<FMenuBar*>(super_menu);
if ( mb )
{
if ( mb->selectedMenuItem )
mb->selectedMenuItem->unsetSelected();
setSelected();
mb->selectedMenuItem = this;
mb->redraw();
if ( menu && ! menu->hasSelectedListItem() )
{
FWidget* focused_widget = static_cast<FWidget*>(ev->focusedWidget());
FFocusEvent out (FocusOut_Event);
FApplication::queueEvent(focused_widget, &out);
menu->selectFirstItemInList();
menu->selectedListItem->setFocus();
if ( focused_widget )
focused_widget->redraw();
menu->redraw();
if ( statusBar() )
statusBar()->drawMessage();
}
ev->accept();
}
}
}
}
//----------------------------------------------------------------------
void FMenuItem::onFocusIn (FFocusEvent*)
{
if ( statusBar() )
statusBar()->drawMessage();
}
//----------------------------------------------------------------------
void FMenuItem::onFocusOut (FFocusEvent*)
{
if ( statusBar() )
{
statusBar()->clearMessage();
statusBar()->drawMessage();
}
}
//----------------------------------------------------------------------
bool FMenuItem::setEnable (bool on)
{
FWidget::setEnable(on);
FWidget* super = getSuperMenu();
if ( on )
{
flags |= ACTIVE;
if ( super && isMenuBar(super) )
{
// Meta + hotkey
super->addAccelerator (0x20000e0+tolower(hotkey), this);
}
}
else
{
flags &= ~ACTIVE;
if ( super && isMenuBar(super) )
super->delAccelerator (this);
}
return on;
}
//----------------------------------------------------------------------
bool FMenuItem::setFocus (bool on)
{
FWidget::setFocus(on);
if ( on )
{
flags |= FOCUS;
if ( isEnabled() )
{
/*if ( statusBar() )
{
FString msg = getStatusbarMessage();
FString curMsg = statusBar()->getMessage();
if ( curMsg != msg )
statusBar()->setMessage(msg);
}*/
}
}
else
{
flags &= ~FOCUS;
if ( isEnabled() && statusBar() )
statusBar()->clearMessage();
}
return on;
}
//---------------------------------------------------------------------- //----------------------------------------------------------------------
void FMenuItem::setSelected() void FMenuItem::setSelected()
{ {
if ( isActivated() ) if ( isEnabled() )
{ {
selected = true; selected = true;
processActivate(); processActivate();

View File

@ -44,7 +44,6 @@ class FMenuItem : public FWidget
{ {
private: private:
FString text; FString text;
bool active;
bool selected; bool selected;
bool separator; bool separator;
bool checked; bool checked;
@ -74,14 +73,20 @@ class FMenuItem : public FWidget
FMenuItem (const char*, FWidget* = 0); FMenuItem (const char*, FWidget* = 0);
virtual ~FMenuItem(); virtual ~FMenuItem();
void onAccel (FAccelEvent*); void onKeyPress (FKeyEvent*);
void onMouseDown (FMouseEvent*); void onMouseDown (FMouseEvent*);
void onMouseUp (FMouseEvent*); void onMouseUp (FMouseEvent*);
void onMouseMove (FMouseEvent*); void onMouseMove (FMouseEvent*);
void onAccel (FAccelEvent*);
void onFocusIn (FFocusEvent*);
void onFocusOut (FFocusEvent*);
FString getText() const; FString getText() const;
void setActive(); // make every setEnable from FWidget available
void unsetActive(); using FWidget::setEnable;
bool isActivated() const; bool setEnable(bool);
bool setFocus(bool);
bool setFocus();
bool unsetFocus();
void setSelected(); void setSelected();
void unsetSelected(); void unsetSelected();
bool isSelected() const; bool isSelected() const;
@ -122,16 +127,12 @@ inline FString FMenuItem::getText() const
{ return text; } { return text; }
//---------------------------------------------------------------------- //----------------------------------------------------------------------
inline void FMenuItem::setActive() inline bool FMenuItem::setFocus()
{ active = true; } { return setFocus(true); }
//---------------------------------------------------------------------- //----------------------------------------------------------------------
inline void FMenuItem::unsetActive() inline bool FMenuItem::unsetFocus()
{ active = false; } { return setFocus(false); }
//----------------------------------------------------------------------
inline bool FMenuItem::isActivated() const
{ return active; }
//---------------------------------------------------------------------- //----------------------------------------------------------------------
inline bool FMenuItem::isSelected() const inline bool FMenuItem::isSelected() const

View File

@ -51,8 +51,8 @@ class FMenuList
uInt count() const; uInt count() const;
FMenuItem* item (int) const; FMenuItem* item (int) const;
void activateItem (int); void enableItem (int);
void deactivateItem (int); void disableItem (int);
bool isSelected (int) const; bool isSelected (int) const;
bool hasSelectedItem(); bool hasSelectedItem();
@ -78,12 +78,12 @@ inline FMenuItem* FMenuList::item(int index) const
{ return itemlist[uInt(index-1)]; } { return itemlist[uInt(index-1)]; }
//---------------------------------------------------------------------- //----------------------------------------------------------------------
inline void FMenuList::activateItem (int index) inline void FMenuList::enableItem (int index)
{ itemlist[uInt(index-1)]->setActive(); } { itemlist[uInt(index-1)]->setEnable(); }
//---------------------------------------------------------------------- //----------------------------------------------------------------------
inline void FMenuList::deactivateItem (int index) inline void FMenuList::disableItem (int index)
{ itemlist[uInt(index-1)]->unsetActive(); } { itemlist[uInt(index-1)]->unsetEnable(); }
//---------------------------------------------------------------------- //----------------------------------------------------------------------
inline bool FMenuList::isSelected(int index) const inline bool FMenuList::isSelected(int index) const

View File

@ -1538,7 +1538,10 @@ void FTerm::init()
if ( kde_konsole ) if ( kde_konsole )
setKDECursor(fc::UnderlineCursor); setKDECursor(fc::UnderlineCursor);
if ( max_color >= 16 && ! kde_konsole && ! tera_terminal ) if ( max_color >= 16
&& ! cygwin_terminal
&& ! kde_konsole
&& ! tera_terminal )
{ {
resetColorMap(); resetColorMap();
saveColorMap(); saveColorMap();

View File

@ -207,9 +207,9 @@ void FWidget::setColorTheme()
wc.current_element_fg = fc::LightGray; wc.current_element_fg = fc::LightGray;
wc.current_element_bg = fc::Blue; wc.current_element_bg = fc::Blue;
wc.current_inc_search_element_fg = fc::LightRed; wc.current_inc_search_element_fg = fc::LightRed;
wc.selected_current_element_focus_fg = fc::LightBlue; wc.selected_current_element_focus_fg = fc::LightCyan;
wc.selected_current_element_focus_bg = fc::Blue; wc.selected_current_element_focus_bg = fc::Blue;
wc.selected_current_element_fg = fc::Cyan; wc.selected_current_element_fg = fc::LightBlue;
wc.selected_current_element_bg = fc::Blue; wc.selected_current_element_bg = fc::Blue;
wc.label_fg = fc::Black; wc.label_fg = fc::Black;
wc.label_bg = fc::White; wc.label_bg = fc::White;
@ -1074,7 +1074,7 @@ void FWidget::addAccelerator (int key)
if ( ! window ) if ( ! window )
window = getRootWidget(); window = getRootWidget();
if ( window == statusbar ) if ( window == statusbar || window == menubar )
window = FWindow::getWindowWidget(parentWidget()); window = FWindow::getWindowWidget(parentWidget());
if ( window && window->accelerator_list ) if ( window && window->accelerator_list )
window->accelerator_list->push_back(accel); window->accelerator_list->push_back(accel);
@ -1088,7 +1088,7 @@ void FWidget::addAccelerator (int key, FWidget* obj)
if ( ! window ) if ( ! window )
window = getRootWidget(); window = getRootWidget();
if ( window == statusbar ) if ( window == statusbar || window == menubar )
window = FWindow::getWindowWidget(parentWidget()); window = FWindow::getWindowWidget(parentWidget());
if ( window && window->accelerator_list ) if ( window && window->accelerator_list )
window->accelerator_list->push_back(accel); window->accelerator_list->push_back(accel);
@ -1101,7 +1101,7 @@ void FWidget::delAccelerator (FWidget* obj)
if ( ! window ) if ( ! window )
window = getRootWidget(); window = getRootWidget();
if ( window == statusbar ) if ( window == statusbar || window == menubar )
window = FWindow::getWindowWidget(parentWidget()); window = FWindow::getWindowWidget(parentWidget());
if ( window if ( window
&& window->accelerator_list && window->accelerator_list
@ -1329,6 +1329,30 @@ void FWidget::hide()
} }
} }
//----------------------------------------------------------------------
bool FWidget::setEnable (bool on)
{
return enable = (on) ? true : false;
}
//----------------------------------------------------------------------
bool FWidget::setEnable()
{
return setEnable(true);
}
//----------------------------------------------------------------------
bool FWidget::unsetEnable()
{
return setEnable(false);
}
//----------------------------------------------------------------------
bool FWidget::setDisable()
{
return setEnable(false);
}
//---------------------------------------------------------------------- //----------------------------------------------------------------------
bool FWidget::focusFirstChild (void) bool FWidget::focusFirstChild (void)
{ {

View File

@ -529,22 +529,6 @@ inline bool FWidget::isShown() const
inline bool FWidget::isWindow() const inline bool FWidget::isWindow() const
{ return window_object; } { return window_object; }
//----------------------------------------------------------------------
inline bool FWidget::setEnable (bool on)
{ return enable = (on) ? true : false; }
//----------------------------------------------------------------------
inline bool FWidget::setEnable()
{ return setEnable(true); }
//----------------------------------------------------------------------
inline bool FWidget::unsetEnable()
{ return setEnable(false); }
//----------------------------------------------------------------------
inline bool FWidget::setDisable()
{ return setEnable(false); }
//---------------------------------------------------------------------- //----------------------------------------------------------------------
inline bool FWidget::isEnabled() const inline bool FWidget::isEnabled() const
{ return enable; } { return enable; }

View File

@ -13,6 +13,7 @@ noinst_PROGRAMS = \
mandelbrot \ mandelbrot \
calculator \ calculator \
watch \ watch \
keyboard \
timer \ timer \
ui ui
@ -23,6 +24,7 @@ string_operations_SOURCES = string-operations.cpp
mandelbrot_SOURCES = mandelbrot.cpp mandelbrot_SOURCES = mandelbrot.cpp
calculator_SOURCES = calculator.cpp calculator_SOURCES = calculator.cpp
watch_SOURCES = watch.cpp watch_SOURCES = watch.cpp
keyboard_SOURCES = keyboard.cpp
timer_SOURCES = timer.cpp timer_SOURCES = timer.cpp
ui_SOURCES = ui.cpp ui_SOURCES = ui.cpp

View File

@ -84,7 +84,8 @@ build_triplet = @build@
host_triplet = @host@ host_triplet = @host@
noinst_PROGRAMS = hello$(EXEEXT) dialog$(EXEEXT) input-dialog$(EXEEXT) \ noinst_PROGRAMS = hello$(EXEEXT) dialog$(EXEEXT) input-dialog$(EXEEXT) \
string-operations$(EXEEXT) mandelbrot$(EXEEXT) \ string-operations$(EXEEXT) mandelbrot$(EXEEXT) \
calculator$(EXEEXT) watch$(EXEEXT) timer$(EXEEXT) ui$(EXEEXT) calculator$(EXEEXT) watch$(EXEEXT) keyboard$(EXEEXT) \
timer$(EXEEXT) ui$(EXEEXT)
subdir = test subdir = test
DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
$(top_srcdir)/depcomp $(top_srcdir)/depcomp
@ -116,6 +117,9 @@ hello_LDADD = $(LDADD)
am_input_dialog_OBJECTS = input-dialog.$(OBJEXT) am_input_dialog_OBJECTS = input-dialog.$(OBJEXT)
input_dialog_OBJECTS = $(am_input_dialog_OBJECTS) input_dialog_OBJECTS = $(am_input_dialog_OBJECTS)
input_dialog_LDADD = $(LDADD) input_dialog_LDADD = $(LDADD)
am_keyboard_OBJECTS = keyboard.$(OBJEXT)
keyboard_OBJECTS = $(am_keyboard_OBJECTS)
keyboard_LDADD = $(LDADD)
am_mandelbrot_OBJECTS = mandelbrot.$(OBJEXT) am_mandelbrot_OBJECTS = mandelbrot.$(OBJEXT)
mandelbrot_OBJECTS = $(am_mandelbrot_OBJECTS) mandelbrot_OBJECTS = $(am_mandelbrot_OBJECTS)
mandelbrot_LDADD = $(LDADD) mandelbrot_LDADD = $(LDADD)
@ -166,13 +170,13 @@ am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@)
am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_0 = @echo " CXXLD " $@;
am__v_CXXLD_1 = am__v_CXXLD_1 =
SOURCES = $(calculator_SOURCES) $(dialog_SOURCES) $(hello_SOURCES) \ SOURCES = $(calculator_SOURCES) $(dialog_SOURCES) $(hello_SOURCES) \
$(input_dialog_SOURCES) $(mandelbrot_SOURCES) \ $(input_dialog_SOURCES) $(keyboard_SOURCES) \
$(string_operations_SOURCES) $(timer_SOURCES) $(ui_SOURCES) \ $(mandelbrot_SOURCES) $(string_operations_SOURCES) \
$(watch_SOURCES) $(timer_SOURCES) $(ui_SOURCES) $(watch_SOURCES)
DIST_SOURCES = $(calculator_SOURCES) $(dialog_SOURCES) \ DIST_SOURCES = $(calculator_SOURCES) $(dialog_SOURCES) \
$(hello_SOURCES) $(input_dialog_SOURCES) $(mandelbrot_SOURCES) \ $(hello_SOURCES) $(input_dialog_SOURCES) $(keyboard_SOURCES) \
$(string_operations_SOURCES) $(timer_SOURCES) $(ui_SOURCES) \ $(mandelbrot_SOURCES) $(string_operations_SOURCES) \
$(watch_SOURCES) $(timer_SOURCES) $(ui_SOURCES) $(watch_SOURCES)
am__can_run_installinfo = \ am__can_run_installinfo = \
case $$AM_UPDATE_INFO_DIR in \ case $$AM_UPDATE_INFO_DIR in \
n|no|NO) false;; \ n|no|NO) false;; \
@ -328,6 +332,7 @@ string_operations_SOURCES = string-operations.cpp
mandelbrot_SOURCES = mandelbrot.cpp mandelbrot_SOURCES = mandelbrot.cpp
calculator_SOURCES = calculator.cpp calculator_SOURCES = calculator.cpp
watch_SOURCES = watch.cpp watch_SOURCES = watch.cpp
keyboard_SOURCES = keyboard.cpp
timer_SOURCES = timer.cpp timer_SOURCES = timer.cpp
ui_SOURCES = ui.cpp ui_SOURCES = ui.cpp
all: all-am all: all-am
@ -390,6 +395,10 @@ input-dialog$(EXEEXT): $(input_dialog_OBJECTS) $(input_dialog_DEPENDENCIES) $(EX
@rm -f input-dialog$(EXEEXT) @rm -f input-dialog$(EXEEXT)
$(AM_V_CXXLD)$(CXXLINK) $(input_dialog_OBJECTS) $(input_dialog_LDADD) $(LIBS) $(AM_V_CXXLD)$(CXXLINK) $(input_dialog_OBJECTS) $(input_dialog_LDADD) $(LIBS)
keyboard$(EXEEXT): $(keyboard_OBJECTS) $(keyboard_DEPENDENCIES) $(EXTRA_keyboard_DEPENDENCIES)
@rm -f keyboard$(EXEEXT)
$(AM_V_CXXLD)$(CXXLINK) $(keyboard_OBJECTS) $(keyboard_LDADD) $(LIBS)
mandelbrot$(EXEEXT): $(mandelbrot_OBJECTS) $(mandelbrot_DEPENDENCIES) $(EXTRA_mandelbrot_DEPENDENCIES) mandelbrot$(EXEEXT): $(mandelbrot_OBJECTS) $(mandelbrot_DEPENDENCIES) $(EXTRA_mandelbrot_DEPENDENCIES)
@rm -f mandelbrot$(EXEEXT) @rm -f mandelbrot$(EXEEXT)
$(AM_V_CXXLD)$(CXXLINK) $(mandelbrot_OBJECTS) $(mandelbrot_LDADD) $(LIBS) $(AM_V_CXXLD)$(CXXLINK) $(mandelbrot_OBJECTS) $(mandelbrot_LDADD) $(LIBS)
@ -420,6 +429,7 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dialog.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dialog.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hello.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hello.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/input-dialog.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/input-dialog.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/keyboard.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mandelbrot.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mandelbrot.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/string-operations.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/string-operations.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/timer.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/timer.Po@am__quote@

58
test/keyboard.cpp Normal file
View File

@ -0,0 +1,58 @@
// File: keyboard.cpp
#include "final.h"
//----------------------------------------------------------------------
// class keyboard
//----------------------------------------------------------------------
class keyboard : public FWidget
{
public:
explicit keyboard (FWidget* = 0);
protected:
void onKeyPress (FKeyEvent*);
void onAccel (FAccelEvent*);
};
//----------------------------------------------------------------------
keyboard::keyboard (FWidget* parent)
: FWidget(parent)
{
setColor(fc::LightGray, fc::Black);
clrscr();
updateTerminal();
}
//----------------------------------------------------------------------
void keyboard::onKeyPress (FKeyEvent* ev)
{
int key_id = ev->key();
::printf("Key %s (id %d)\n\r", getKeyName(key_id).c_str(), key_id);
}
//----------------------------------------------------------------------
void keyboard::onAccel (FAccelEvent* ev)
{
quit();
ev->accept();
}
//----------------------------------------------------------------------
// main part
//----------------------------------------------------------------------
int main (int argc, char* argv[])
{
FApplication app(argc, argv);
keyboard t(&app);
t.addAccelerator('q');
app.setMainWidget(&t);
t.show();
t.setTermXY(0,0);
t.flush_out();
::printf("---------------\n\r");
::printf("Press Q to quit\n\r");
::printf("---------------\n\r\n");
return app.exec();
}

View File

@ -11,13 +11,13 @@ class timer : public FWidget
public: public:
explicit timer (FWidget* = 0); explicit timer (FWidget* = 0);
protected: protected:
virtual void draw();
void onTimer (FTimerEvent*); void onTimer (FTimerEvent*);
void onAccel (FAccelEvent*); void onAccel (FAccelEvent*);
}; };
//---------------------------------------------------------------------- //----------------------------------------------------------------------
timer::timer (FWidget* parent) : FWidget(parent) timer::timer (FWidget* parent)
: FWidget(parent)
{ {
addTimer (60000); // 1-minute timer addTimer (60000); // 1-minute timer
int id = addTimer (50); // 50-millisecond timer int id = addTimer (50); // 50-millisecond timer
@ -30,15 +30,6 @@ timer::timer (FWidget* parent) : FWidget(parent)
updateTerminal(); updateTerminal();
} }
//----------------------------------------------------------------------
void timer::draw()
{
setTermXY(1,2);
::printf("---------------\n\r");
::printf("Press Q to quit\n\r");
::printf("---------------\n\r\n");
}
//---------------------------------------------------------------------- //----------------------------------------------------------------------
void timer::onTimer (FTimerEvent* ev) void timer::onTimer (FTimerEvent* ev)
{ {
@ -63,5 +54,10 @@ int main (int argc, char* argv[])
t.addAccelerator('q'); t.addAccelerator('q');
app.setMainWidget(&t); app.setMainWidget(&t);
t.show(); t.show();
t.setTermXY(0,0);
t.flush_out();
::printf("---------------\n\r");
::printf("Press Q to quit\n\r");
::printf("---------------\n\r\n");
return app.exec(); return app.exec();
} }

View File

@ -172,7 +172,8 @@ class MyDialog : public FDialog
void onClose (FCloseEvent*); void onClose (FCloseEvent*);
void cb_noFunctionMsg (FWidget*, void*); void cb_noFunctionMsg (FWidget*, void*);
void cb_about (FWidget*, void*); void cb_about (FWidget*, void*);
void cb_info (FWidget*, void*); void cb_terminfo (FWidget*, void*);
void cb_drives (FWidget*, void*);
void cb_input2buttonText (FWidget*, void*); void cb_input2buttonText (FWidget*, void*);
void cb_setTitlebar (FWidget*, void*); void cb_setTitlebar (FWidget*, void*);
void cb_ProgressBar (FWidget*, void*); void cb_ProgressBar (FWidget*, void*);
@ -192,19 +193,24 @@ MyDialog::MyDialog (FWidget* parent)
, myList() , myList()
{ {
/* .--------------------------------------------. */ /* .--------------------------------------------. */
/* v This Code is working in progress v * / /* v This Code is working in progress v */
FMenuBar* Menubar = new FMenuBar(this); FMenuBar* Menubar = new FMenuBar(this);
FMenu* File = new FMenu("&File", Menubar); FMenu* File = new FMenu("&File", Menubar);
File->setStatusbarMessage("File management commands");
FMenu* Edit = new FMenu("&Edit", Menubar); FMenu* Edit = new FMenu("&Edit", Menubar);
FMenu* View = new FMenu("&View", Menubar); FMenu* View = new FMenu("&View", Menubar);
FMenuItem* Options = new FMenuItem("&Options", Menubar); FMenuItem* Options = new FMenuItem("&Options", Menubar);
Options->unsetActive(); Options->setDisable();
FMenuItem* Help = new FMenuItem("&Help", Menubar); FMenuItem* Help = new FMenuItem("&Help", Menubar);
FMenuItem* Open = new FMenuItem("&Open...", File); FMenuItem* Open = new FMenuItem("&Open...", File);
Open->setStatusbarMessage("Locate and open a text file");
FMenuItem* Line = new FMenuItem(File);
Line->setSeparator();
FMenuItem* Quit = new FMenuItem("&Quit", File); FMenuItem* Quit = new FMenuItem("&Quit", File);
Quit->setStatusbarMessage("Exit the program");
FMenuItem* Cut = new FMenuItem("Cu&t", Edit); FMenuItem* Cut = new FMenuItem("Cu&t", Edit);
FMenuItem* Copy = new FMenuItem("&Copy", Edit); FMenuItem* Copy = new FMenuItem("&Copy", Edit);
@ -241,12 +247,12 @@ MyDialog::MyDialog (FWidget* parent)
Env->addCallback Env->addCallback
( (
"clicked", "clicked",
_METHOD_CALLBACK (this, &MyDialog::cb_info) _METHOD_CALLBACK (this, &MyDialog::cb_terminfo)
); );
Drive->addCallback Drive->addCallback
( (
"clicked", "clicked",
_METHOD_CALLBACK (this, &MyDialog::cb_info) _METHOD_CALLBACK (this, &MyDialog::cb_drives)
); );
Options->addCallback Options->addCallback
( (
@ -259,7 +265,7 @@ MyDialog::MyDialog (FWidget* parent)
_METHOD_CALLBACK (this, &MyDialog::cb_about) _METHOD_CALLBACK (this, &MyDialog::cb_about)
); );
/ * ^ This Code is working in progress ^ */ /* ^ This Code is working in progress ^ */
/* '--------------------------------------------' */ /* '--------------------------------------------' */
FButton* MyButton1 = new FButton(this); FButton* MyButton1 = new FButton(this);
@ -289,7 +295,7 @@ MyDialog::MyDialog (FWidget* parent)
radioButtonGroup->setGeometry(3, 8, 14, 4); radioButtonGroup->setGeometry(3, 8, 14, 4);
//radioButtonGroup->unsetBorder(); //radioButtonGroup->unsetBorder();
FRadioButton* radio1 = new FRadioButton("&Enable", radioButtonGroup); FRadioButton* radio1 = new FRadioButton("E&nable", radioButtonGroup);
radio1->setGeometry(1, 1, 7, 1); radio1->setGeometry(1, 1, 7, 1);
radio1->setStatusbarMessage("Enable button Test"); radio1->setStatusbarMessage("Enable button Test");
@ -303,7 +309,7 @@ MyDialog::MyDialog (FWidget* parent)
FButtonGroup* checkButtonGroup = new FButtonGroup("Options", this); FButtonGroup* checkButtonGroup = new FButtonGroup("Options", this);
checkButtonGroup->setGeometry(3, 12, 14, 4); checkButtonGroup->setGeometry(3, 12, 14, 4);
FCheckBox* check1 = new FCheckBox("&Fastmode", checkButtonGroup); FCheckBox* check1 = new FCheckBox("&Bitmode", checkButtonGroup);
check1->setGeometry(1, 1, 7, 1); check1->setGeometry(1, 1, 7, 1);
check1->setNoUnderline(); check1->setNoUnderline();
@ -313,38 +319,32 @@ MyDialog::MyDialog (FWidget* parent)
check2->setNoUnderline(); check2->setNoUnderline();
FLineEdit* MyLineEdit = new FLineEdit(this); FLineEdit* MyLineEdit = new FLineEdit(this);
MyLineEdit->setGeometry(21, 1, 10, 1); MyLineEdit->setGeometry(22, 1, 10, 1);
MyLineEdit->setText( FString("EnTry").toLower()); MyLineEdit->setText( FString("EnTry").toLower());
MyLineEdit->setLabelText(L"&Input:"); MyLineEdit->setLabelText(L"&Input:");
MyLineEdit->setStatusbarMessage("Press Enter to set the title"); MyLineEdit->setStatusbarMessage("Press Enter to set the title");
MyLineEdit->setShadow(); MyLineEdit->setShadow();
FButton* MyButton4 = new FButton(this); FButton* MyButton4 = new FButton(this);
MyButton4->setGeometry(19, 8, 12, 1); MyButton4->setGeometry(20, 8, 12, 1);
MyButton4->setText(L"&Test"); MyButton4->setText(L"&Get input");
MyButton4->setStatusbarMessage("Progressbar testing dialog"); MyButton4->setStatusbarMessage("Take text from input field");
MyButton4->setShadow(); MyButton4->setShadow();
MyButton4->setDisable(); MyButton4->setFocus();
FButton* MyButton5 = new FButton(this); FButton* MyButton5 = new FButton(this);
MyButton5->setGeometry(19, 11, 12, 1); MyButton5->setGeometry(20, 11, 12, 1);
MyButton5->setText(L"Environs"); MyButton5->setText(L"&Test");
MyButton5->setStatusbarMessage("Show environment settings"); MyButton5->setStatusbarMessage("Progressbar testing dialog");
MyButton5->setShadow(); MyButton5->setShadow();
MyButton5->setDisable();
FButton* MyButton6 = new FButton(this); FButton* MyButton6 = new FButton(this);
MyButton6->setGeometry(19, 14, 12, 1); MyButton6->setGeometry(20, 14, 12, 1);
MyButton6->setText(L"&Get input"); MyButton6->setText(L"&Quit");
MyButton6->setStatusbarMessage("Take text from input field"); MyButton6->setStatusbarMessage("Exit the program");
MyButton6->setShadow(); MyButton6->setShadow();
MyButton6->setFocus(); MyButton6->addAccelerator('x');
FButton* MyButton7 = new FButton(this);
MyButton7->setGeometry(19, 17, 12, 1);
MyButton7->setText(L"&Quit");
MyButton7->setStatusbarMessage("Exit the program");
MyButton7->setShadow();
MyButton7->addAccelerator('x');
myList = new FListBox(this); myList = new FListBox(this);
myList->setGeometry(38, 1, 14, 17); myList->setGeometry(38, 1, 14, 17);
@ -355,24 +355,24 @@ MyDialog::MyDialog (FWidget* parent)
myList->insert( FString().setNumber(z) + L" placeholder" ); myList->insert( FString().setNumber(z) + L" placeholder" );
FLabel* headline = new FLabel(this); FLabel* headline = new FLabel(this);
headline->setGeometry(20, 3, 10, 1); headline->setGeometry(21, 3, 10, 1);
headline->setText(L"List items"); headline->setText(L"List items");
headline->setEmphasis(); headline->setEmphasis();
headline->setAlignment(fc::alignCenter); headline->setAlignment(fc::alignCenter);
FLabel* tagged = new FLabel(L"Tagged:", this); FLabel* tagged = new FLabel(L"Tagged:", this);
tagged->setGeometry(20, 4, 7, 1); tagged->setGeometry(21, 4, 7, 1);
FLabel* tagged_count = new FLabel(this); FLabel* tagged_count = new FLabel(this);
tagged_count->setGeometry(28, 4, 5, 1); tagged_count->setGeometry(29, 4, 5, 1);
tagged_count->setNumber(0); tagged_count->setNumber(0);
FLabel* sum = new FLabel(L"Sum:", this); FLabel* sum = new FLabel(L"Sum:", this);
sum->setGeometry(20, 5, 7, 3); sum->setGeometry(21, 5, 7, 3);
sum->setAlignment(fc::alignRight); sum->setAlignment(fc::alignRight);
FLabel* sum_count = new FLabel(this); FLabel* sum_count = new FLabel(this);
sum_count->setGeometry(28, 5, 5, 3); sum_count->setGeometry(29, 5, 5, 3);
sum_count->setNumber(myList->count()); sum_count->setNumber(myList->count());
FStatusBar* statusbar = new FStatusBar(this); FStatusBar* statusbar = new FStatusBar(this);
@ -401,23 +401,17 @@ MyDialog::MyDialog (FWidget* parent)
MyButton4->addCallback MyButton4->addCallback
( (
"clicked", "clicked",
_METHOD_CALLBACK (this, &MyDialog::cb_ProgressBar) _METHOD_CALLBACK (this, &MyDialog::cb_input2buttonText),
dynamic_cast<FWidget::data_ptr>(MyLineEdit)
); );
MyButton5->addCallback MyButton5->addCallback
( (
"clicked", "clicked",
_METHOD_CALLBACK (this, &MyDialog::cb_info) _METHOD_CALLBACK (this, &MyDialog::cb_ProgressBar)
); );
MyButton6->addCallback MyButton6->addCallback
(
"clicked",
_METHOD_CALLBACK (this, &MyDialog::cb_input2buttonText),
dynamic_cast<FWidget::data_ptr>(MyLineEdit)
);
MyButton7->addCallback
( (
"clicked", "clicked",
_METHOD_CALLBACK (this, &MyDialog::cb_exitApp) _METHOD_CALLBACK (this, &MyDialog::cb_exitApp)
@ -433,7 +427,7 @@ MyDialog::MyDialog (FWidget* parent)
( (
"toggled", "toggled",
_METHOD_CALLBACK (this, &MyDialog::cb_activateButton), _METHOD_CALLBACK (this, &MyDialog::cb_activateButton),
dynamic_cast<FWidget::data_ptr>(MyButton4) dynamic_cast<FWidget::data_ptr>(MyButton5)
); );
myList->addCallback myList->addCallback
@ -513,19 +507,21 @@ void MyDialog::cb_about (FWidget*, void*)
} }
//---------------------------------------------------------------------- //----------------------------------------------------------------------
void MyDialog::cb_info (FWidget*, void*) void MyDialog::cb_terminfo (FWidget*, void*)
{ {
{ FMessageBox info1 ( "Environment"
FMessageBox info1 ( "Environment" , " Type: " + FString(getTermType()) + "\n"
, " Type: " + FString(getTermType()) + "\n" " Name: " + FString(getTermName()) + "\n"
" Name: " + FString(getTermName()) + "\n" " Mode: " + FString(getEncoding()) + "\n"
" Mode: " + FString(getEncoding()) "Colors: " + FString().setNumber(getMaxColor())
, FMessageBox::Ok, 0, 0, this ); , FMessageBox::Ok, 0, 0, this );
info1.setHeadline("Terminal:"); info1.setHeadline("Terminal:");
info1.exec(); info1.exec();
} // end of scope => delete info1 }
FString line(15, wchar_t(fc::BoxDrawingsHorizontal)); //----------------------------------------------------------------------
void MyDialog::cb_drives (FWidget*, void*)
{
FMessageBox info2 ( "Drive symbols" FMessageBox info2 ( "Drive symbols"
, "Generic: \n\n" , "Generic: \n\n"
"Network: \n\n" "Network: \n\n"