From 08fb98d40d45253f3d866c99e4937122706e71d1 Mon Sep 17 00:00:00 2001 From: David Capello Date: Sun, 25 May 2014 11:21:10 -0300 Subject: [PATCH] New notifications area at the top-right corner --- data/skins/default/sheet.png | Bin 11608 -> 11725 bytes data/skins/default/skin.xml | 16 ++++++ src/app/CMakeLists.txt | 1 + src/app/app.cpp | 5 ++ src/app/app.h | 2 + src/app/check_update.cpp | 4 +- src/app/ui/main_window.cpp | 17 +++++- src/app/ui/main_window.h | 3 ++ src/app/ui/notifications.cpp | 97 +++++++++++++++++++++++++++++++++++ src/app/ui/notifications.h | 50 ++++++++++++++++++ src/app/ui/status_bar.cpp | 8 --- src/app/ui/status_bar.h | 3 -- src/ui/menu.cpp | 8 +-- 13 files changed, 197 insertions(+), 17 deletions(-) create mode 100644 src/app/ui/notifications.cpp create mode 100644 src/app/ui/notifications.h diff --git a/data/skins/default/sheet.png b/data/skins/default/sheet.png index 09a8e58ed212505510f030721d5e23434035e0fe..8d1c0009462ed2d07416f02f390b214c3a1496e6 100644 GIT binary patch delta 11673 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 + + + @@ -318,6 +321,8 @@ + + @@ -525,6 +530,17 @@ + + + + + diff --git a/src/app/CMakeLists.txt b/src/app/CMakeLists.txt index d513c11ff..547dc28b5 100644 --- a/src/app/CMakeLists.txt +++ b/src/app/CMakeLists.txt @@ -183,6 +183,7 @@ add_library(app-lib ui/main_menu_bar.cpp ui/main_window.cpp ui/mini_editor.cpp + ui/notifications.cpp ui/palette_listbox.cpp ui/palette_popup.cpp ui/palette_view.cpp diff --git a/src/app/app.cpp b/src/app/app.cpp index 66f5fc2aa..42d30c2c7 100644 --- a/src/app/app.cpp +++ b/src/app/app.cpp @@ -331,6 +331,11 @@ RecentFiles* App::getRecentFiles() const return &m_modules->m_recent_files; } +void App::showNotification(const char* text, const char* url) +{ + m_mainWindow->showNotification(text, url); +} + // Updates palette and redraw the screen. void app_refresh_screen() { diff --git a/src/app/app.h b/src/app/app.h index d5806ede5..af93b56a0 100644 --- a/src/app/app.h +++ b/src/app/app.h @@ -71,6 +71,8 @@ namespace app { RecentFiles* getRecentFiles() const; MainWindow* getMainWindow() const { return m_mainWindow; } + void showNotification(const char* text, const char* url); + // App Signals Signal0 Exit; Signal0 PaletteChange; diff --git a/src/app/check_update.cpp b/src/app/check_update.cpp index a5ccdc9cc..5eb548cd0 100644 --- a/src/app/check_update.cpp +++ b/src/app/check_update.cpp @@ -24,8 +24,8 @@ #include "app/check_update.h" +#include "app/app.h" #include "app/ini_file.h" -#include "app/ui/status_bar.h" #include "base/bind.h" #include @@ -169,7 +169,7 @@ void CheckUpdateThreadLauncher::onMonitoringTick() case updater::CheckUpdateResponse::Critical: case updater::CheckUpdateResponse::Major: - StatusBar::instance()->showNotification("New Version!", m_response.getUrl().c_str()); + App::instance()->showNotification("New Version Available!", m_response.getUrl().c_str()); break; } diff --git a/src/app/ui/main_window.cpp b/src/app/ui/main_window.cpp index 69ad1218b..d8b751ddd 100644 --- a/src/app/ui/main_window.cpp +++ b/src/app/ui/main_window.cpp @@ -36,6 +36,9 @@ #include "app/ui/editor/editor_view.h" #include "app/ui/main_menu_bar.h" #include "app/ui/mini_editor.h" +#include "app/ui/notifications.h" +#include "app/ui/skin/skin_property.h" +#include "app/ui/skin/skin_theme.h" #include "app/ui/start_view.h" #include "app/ui/status_bar.h" #include "app/ui/tabs.h" @@ -77,6 +80,7 @@ MainWindow::MainWindow() Widget* box_timeline = findChild("timeline"); m_menuBar = new MainMenuBar(); + m_notifications = new Notifications(); m_contextBar = new ContextBar(); m_statusBar = new StatusBar(); m_colorBar = new ColorBar(box_colorbar->getAlign()); @@ -99,12 +103,16 @@ MainWindow::MainWindow() m_tabsBar->setExpansive(true); m_timeline->setExpansive(true); m_workspace->setExpansive(true); + m_notifications->setVisible(false); // Setup the menus m_menuBar->setMenu(AppMenus::instance()->getRootMenu()); // Add the widgets in the boxes - if (box_menubar) box_menubar->addChild(m_menuBar); + if (box_menubar) { + box_menubar->addChild(m_menuBar); + box_menubar->addChild(m_notifications); + } if (box_contextbar) box_contextbar->addChild(m_contextBar); if (box_colorbar) box_colorbar->addChild(m_colorBar); if (box_toolbar) box_toolbar->addChild(m_toolBar); @@ -149,6 +157,13 @@ void MainWindow::reloadMenus() invalidate(); } +void MainWindow::showNotification(const char* text, const char* url) +{ + m_notifications->addLink(text, url); + m_notifications->setVisible(true); + m_notifications->getParent()->layout(); +} + void MainWindow::setMode(Mode mode) { // Check if we already are in the given mode. diff --git a/src/app/ui/main_window.h b/src/app/ui/main_window.h index 0fb017a1d..5ec641a9f 100644 --- a/src/app/ui/main_window.h +++ b/src/app/ui/main_window.h @@ -33,6 +33,7 @@ namespace app { class ContextBar; class MainMenuBar; class MiniEditorWindow; + class Notifications; class StartView; class StatusBar; class Tabs; @@ -60,6 +61,7 @@ namespace app { void start(); void reloadMenus(); + void showNotification(const char* text, const char* url); Mode getMode() const { return m_mode; } void setMode(Mode mode); @@ -93,6 +95,7 @@ namespace app { Workspace* m_workspace; MiniEditorWindow* m_miniEditor; StartView* m_startView; + Notifications* m_notifications; }; } diff --git a/src/app/ui/notifications.cpp b/src/app/ui/notifications.cpp new file mode 100644 index 000000000..0c5bed86d --- /dev/null +++ b/src/app/ui/notifications.cpp @@ -0,0 +1,97 @@ +/* Aseprite + * Copyright (C) 2001-2014 David Capello + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "app/ui/notifications.h" + +#include "app/ui/skin/skin_theme.h" +#include "app/ui/skin/style.h" +#include "base/launcher.h" +#include "ui/menu.h" +#include "ui/paint_event.h" +#include "ui/preferred_size_event.h" + +namespace app { + +using namespace ui; + +static const char* kFlag = "flag"; + +class NotificationItem : public MenuItem { +public: + NotificationItem(const char* text, const char* url) + : MenuItem(text), + m_url(url) { + } + +protected: + void onClick() OVERRIDE { + MenuItem::onClick(); + + if (!m_url.empty()) + base::launcher::open_url(m_url); + } + +private: + std::string m_url; +}; + +Notifications::Notifications() + : Button("") + , m_flagStyle(skin::get_style(kFlag)) + , m_withNotifications(false) +{ +} + +void Notifications::addLink(const char* text, const char* url) +{ + m_popup.addChild(new NotificationItem(text, url)); + m_withNotifications = true; +} + +void Notifications::onPreferredSize(PreferredSizeEvent& ev) +{ + ev.setPreferredSize(gfx::Size(16, 10)*jguiscale()); // TODO hard-coded flag size +} + +void Notifications::onPaint(PaintEvent& ev) +{ + Graphics* g = ev.getGraphics(); + + skin::Style::State state; + if (hasMouseOver()) state += skin::Style::hover(); + if (m_withNotifications) state += skin::Style::active(); + if (isSelected()) state += skin::Style::clicked(); + m_flagStyle->paint(g, getClientBounds(), NULL, state); +} + +void Notifications::onClick(ui::Event& ev) +{ + m_withNotifications = false; + invalidate(); + + gfx::Rect bounds = getBounds(); + m_popup.showPopup( + bounds.x - m_popup.getPreferredSize().w, + bounds.y + bounds.h); +} + +} // namespace app diff --git a/src/app/ui/notifications.h b/src/app/ui/notifications.h new file mode 100644 index 000000000..59353fae5 --- /dev/null +++ b/src/app/ui/notifications.h @@ -0,0 +1,50 @@ +/* Aseprite + * Copyright (C) 2001-2014 David Capello + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef APP_UI_NOTIFICATIONS_H_INCLUDED +#define APP_UI_NOTIFICATIONS_H_INCLUDED +#pragma once + +#include "ui/button.h" +#include "ui/menu.h" + +namespace app { + namespace skin { + class Style; + } + + class Notifications : public ui::Button { + public: + Notifications(); + + void addLink(const char* text, const char* url); + + protected: + void onPreferredSize(ui::PreferredSizeEvent& ev) OVERRIDE; + void onPaint(ui::PaintEvent& ev) OVERRIDE; + void onClick(ui::Event& ev) OVERRIDE; + + private: + skin::Style* m_flagStyle; + bool m_withNotifications; + ui::Menu m_popup; + }; + +} // namespace app + +#endif diff --git a/src/app/ui/status_bar.cpp b/src/app/ui/status_bar.cpp index 3fd32a636..028874d87 100644 --- a/src/app/ui/status_bar.cpp +++ b/src/app/ui/status_bar.cpp @@ -371,14 +371,6 @@ void StatusBar::showTool(int msecs, tools::Tool* tool) } } -void StatusBar::showNotification(const char* text, const char* link) -{ - m_linkLabel->setText(text); - m_linkLabel->setUrl(link); - layout(); - invalidate(); -} - ////////////////////////////////////////////////////////////////////// // Progress bars stuff diff --git a/src/app/ui/status_bar.h b/src/app/ui/status_bar.h index 790ef23b9..e33a3e533 100644 --- a/src/app/ui/status_bar.h +++ b/src/app/ui/status_bar.h @@ -80,9 +80,6 @@ namespace app { Progress* addProgress(); void removeProgress(Progress* progress); - // Method to show notifications (each notification can contain a link). - void showNotification(const char* text, const char* link); - protected: bool onProcessMessage(ui::Message* msg) OVERRIDE; void onResize(ui::ResizeEvent& ev) OVERRIDE; diff --git a/src/ui/menu.cpp b/src/ui/menu.cpp index 81b11e050..e758e58cb 100644 --- a/src/ui/menu.cpp +++ b/src/ui/menu.cpp @@ -346,7 +346,7 @@ void Menu::onPreferredSize(PreferredSizeEvent& ev) UI_FOREACH_WIDGET_WITH_END(getChildren(), it, end) { reqSize = (*it)->getPreferredSize(); - if (this->getParent()->type == kMenuBarWidget) { + if (getParent() && getParent()->type == kMenuBarWidget) { size.w += reqSize.w + ((it+1 != end) ? this->child_spacing: 0); size.h = MAX(size.h, reqSize.h); } @@ -872,13 +872,15 @@ void MenuItem::onClick() void MenuItem::onPreferredSize(PreferredSizeEvent& ev) { Size size(0, 0); - int bar = (this->getParent()->getParent()->type == kMenuBarWidget); + bool bar = (getParent() && + getParent()->getParent() && + getParent()->getParent()->type == kMenuBarWidget); if (hasText()) { size.w = + this->border_width.l + getTextWidth() - + ((bar) ? this->child_spacing/4: this->child_spacing) + + (bar ? this->child_spacing/4: this->child_spacing) + this->border_width.r; size.h =