mirror of
https://github.com/aseprite/aseprite.git
synced 2025-02-23 18:39:55 +00:00
Merge branch 'master' into beta
This commit is contained in:
commit
e21b142305
@ -226,6 +226,8 @@ void App::run()
|
||||
// Initialize Steam API
|
||||
#ifdef ENABLE_STEAM
|
||||
steam::SteamAPI steam;
|
||||
if (steam.initialized())
|
||||
she::instance()->activateApp();
|
||||
#endif
|
||||
|
||||
#ifdef ENABLE_UPDATER
|
||||
|
@ -50,7 +50,7 @@ protected:
|
||||
Workspace* workspace = App::instance()->workspace();
|
||||
WorkspaceView* view = workspace->activeView();
|
||||
if (view)
|
||||
workspace->closeView(view);
|
||||
workspace->closeView(view, false);
|
||||
}
|
||||
};
|
||||
|
||||
@ -60,12 +60,17 @@ public:
|
||||
: Command("CloseAllFiles",
|
||||
"Close All Files",
|
||||
CmdRecordableFlag) {
|
||||
m_quitting = false;
|
||||
}
|
||||
|
||||
Command* clone() const override { return new CloseAllFilesCommand(*this); }
|
||||
|
||||
protected:
|
||||
|
||||
void onLoadParams(const Params& params) override {
|
||||
m_quitting = params.get_as<bool>("quitting");
|
||||
}
|
||||
|
||||
void onExecute(Context* context) override {
|
||||
Workspace* workspace = App::instance()->workspace();
|
||||
|
||||
@ -78,11 +83,13 @@ protected:
|
||||
}
|
||||
|
||||
for (auto docView : docViews) {
|
||||
if (!workspace->closeView(docView))
|
||||
if (!workspace->closeView(docView, m_quitting))
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
bool m_quitting;
|
||||
};
|
||||
|
||||
Command* CommandFactory::createCloseFileCommand()
|
||||
|
@ -11,6 +11,7 @@
|
||||
|
||||
#include "app/app.h"
|
||||
#include "app/commands/command.h"
|
||||
#include "app/commands/commands.h"
|
||||
#include "app/context.h"
|
||||
#include "app/document.h"
|
||||
#include "app/ui/main_window.h"
|
||||
@ -34,22 +35,17 @@ ExitCommand::ExitCommand()
|
||||
{
|
||||
}
|
||||
|
||||
void ExitCommand::onExecute(Context* context)
|
||||
void ExitCommand::onExecute(Context* ctx)
|
||||
{
|
||||
const doc::Documents& docs = context->documents();
|
||||
bool modifiedFiles = false;
|
||||
if (ctx->hasModifiedDocuments()) {
|
||||
Command* closeAll = CommandsModule::instance()->getCommandByName(CommandId::CloseAllFiles);
|
||||
Params params;
|
||||
params.set("quitting", "1");
|
||||
ctx->executeCommand(closeAll, params);
|
||||
|
||||
for (doc::Documents::const_iterator it=docs.begin(), end=docs.end(); it!=end; ++it) {
|
||||
const Document* document = static_cast<Document*>(*it);
|
||||
if (document->isModified()) {
|
||||
modifiedFiles = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (modifiedFiles) {
|
||||
if (ui::Alert::show("Warning<<There are sprites with changes.<<Do you want to quit anyway?||&Yes||&No") != 1)
|
||||
return; // In this case the user doesn't want to close with modified files
|
||||
// The user didn't save all documents (canceled the exit)
|
||||
if (ctx->hasModifiedDocuments())
|
||||
return;
|
||||
}
|
||||
|
||||
// Close the window
|
||||
|
@ -1,5 +1,5 @@
|
||||
// Aseprite
|
||||
// Copyright (C) 2001-2015 David Capello
|
||||
// Copyright (C) 2001-2016 David Capello
|
||||
//
|
||||
// This program is free software; you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License version 2 as
|
||||
@ -38,6 +38,14 @@ app::Document* Context::activeDocument() const
|
||||
return static_cast<app::Document*>(doc::Context::activeDocument());
|
||||
}
|
||||
|
||||
bool Context::hasModifiedDocuments() const
|
||||
{
|
||||
for (auto doc : documents())
|
||||
if (static_cast<app::Document*>(doc)->isModified())
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
void Context::executeCommand(const char* commandName)
|
||||
{
|
||||
Command* cmd = CommandsModule::instance()->getCommandByName(commandName);
|
||||
|
@ -1,5 +1,5 @@
|
||||
// Aseprite
|
||||
// Copyright (C) 2001-2015 David Capello
|
||||
// Copyright (C) 2001-2016 David Capello
|
||||
//
|
||||
// This program is free software; you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License version 2 as
|
||||
@ -63,6 +63,7 @@ namespace app {
|
||||
void sendDocumentToTop(doc::Document* document);
|
||||
|
||||
app::Document* activeDocument() const;
|
||||
bool hasModifiedDocuments() const;
|
||||
|
||||
void executeCommand(const char* commandName);
|
||||
virtual void executeCommand(Command* command, const Params& params = Params());
|
||||
|
@ -218,7 +218,7 @@ void DataRecoveryView::onWorkspaceViewSelected()
|
||||
{
|
||||
}
|
||||
|
||||
bool DataRecoveryView::onCloseView(Workspace* workspace)
|
||||
bool DataRecoveryView::onCloseView(Workspace* workspace, bool quitting)
|
||||
{
|
||||
workspace->removeView(this);
|
||||
return true;
|
||||
|
@ -1,5 +1,5 @@
|
||||
// Aseprite
|
||||
// Copyright (C) 2001-2015 David Capello
|
||||
// Copyright (C) 2001-2016 David Capello
|
||||
//
|
||||
// This program is free software; you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License version 2 as
|
||||
@ -34,7 +34,7 @@ namespace app {
|
||||
// WorkspaceView implementation
|
||||
ui::Widget* getContentWidget() override { return this; }
|
||||
void onWorkspaceViewSelected() override;
|
||||
bool onCloseView(Workspace* workspace) override;
|
||||
bool onCloseView(Workspace* workspace, bool quitting) override;
|
||||
void onTabPopup(Workspace* workspace) override;
|
||||
|
||||
// Triggered when the list is empty (because the user deleted all
|
||||
|
@ -1,5 +1,5 @@
|
||||
// Aseprite
|
||||
// Copyright (C) 2001-2015 David Capello
|
||||
// Copyright (C) 2001-2016 David Capello
|
||||
//
|
||||
// This program is free software; you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License version 2 as
|
||||
@ -109,7 +109,7 @@ void DevConsoleView::onWorkspaceViewSelected()
|
||||
m_entry->requestFocus();
|
||||
}
|
||||
|
||||
bool DevConsoleView::onCloseView(Workspace* workspace)
|
||||
bool DevConsoleView::onCloseView(Workspace* workspace, bool quitting)
|
||||
{
|
||||
workspace->removeView(this);
|
||||
return true;
|
||||
|
@ -36,7 +36,7 @@ namespace app {
|
||||
bool canCloneWorkspaceView() override { return true; }
|
||||
WorkspaceView* cloneWorkspaceView() override;
|
||||
void onWorkspaceViewSelected() override;
|
||||
bool onCloseView(Workspace* workspace) override;
|
||||
bool onCloseView(Workspace* workspace, bool quitting) override;
|
||||
void onTabPopup(Workspace* workspace) override;
|
||||
|
||||
// EngineDelegate impl
|
||||
|
@ -220,7 +220,7 @@ void DocumentView::onClonedFrom(WorkspaceView* from)
|
||||
->setViewScroll(View::getView(srcEditor)->viewScroll());
|
||||
}
|
||||
|
||||
bool DocumentView::onCloseView(Workspace* workspace)
|
||||
bool DocumentView::onCloseView(Workspace* workspace, bool quitting)
|
||||
{
|
||||
if (m_editor->isMovingPixels())
|
||||
m_editor->dropMovingPixels();
|
||||
@ -247,8 +247,12 @@ bool DocumentView::onCloseView(Workspace* workspace)
|
||||
// see if the sprite has changes
|
||||
while (m_document->isModified()) {
|
||||
// ask what want to do the user with the changes in the sprite
|
||||
int ret = Alert::show("Warning<<Saving changes in:<<%s||&Save||Do&n't Save||&Cancel",
|
||||
m_document->name().c_str());
|
||||
int ret = Alert::show("Warning"
|
||||
"<<Saving changes to the sprite"
|
||||
"<<\"%s\" before %s?"
|
||||
"||&Save||Do&n't Save||&Cancel",
|
||||
m_document->name().c_str(),
|
||||
quitting ? "quitting": "closing");
|
||||
|
||||
if (ret == 1) {
|
||||
// "save": save the changes
|
||||
|
@ -67,7 +67,7 @@ namespace app {
|
||||
WorkspaceView* cloneWorkspaceView() override;
|
||||
void onWorkspaceViewSelected() override;
|
||||
void onClonedFrom(WorkspaceView* from) override;
|
||||
bool onCloseView(Workspace* workspace) override;
|
||||
bool onCloseView(Workspace* workspace, bool quitting) override;
|
||||
void onTabPopup(Workspace* workspace) override;
|
||||
InputChainElement* onGetInputChainElement() override { return this; }
|
||||
|
||||
|
@ -89,7 +89,7 @@ TabIcon HomeView::getTabIcon()
|
||||
return TabIcon::HOME;
|
||||
}
|
||||
|
||||
bool HomeView::onCloseView(Workspace* workspace)
|
||||
bool HomeView::onCloseView(Workspace* workspace, bool quitting)
|
||||
{
|
||||
workspace->removeView(this);
|
||||
return true;
|
||||
|
@ -1,5 +1,5 @@
|
||||
// Aseprite
|
||||
// Copyright (C) 2001-2015 David Capello
|
||||
// Copyright (C) 2001-2016 David Capello
|
||||
//
|
||||
// This program is free software; you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License version 2 as
|
||||
@ -50,7 +50,7 @@ namespace app {
|
||||
|
||||
// WorkspaceView implementation
|
||||
ui::Widget* getContentWidget() override { return this; }
|
||||
bool onCloseView(Workspace* workspace) override;
|
||||
bool onCloseView(Workspace* workspace, bool quitting) override;
|
||||
void onTabPopup(Workspace* workspace) override;
|
||||
void onWorkspaceViewSelected() override;
|
||||
|
||||
|
@ -298,7 +298,7 @@ void MainWindow::onCloseTab(Tabs* tabs, TabView* tabView)
|
||||
WorkspaceView* view = dynamic_cast<WorkspaceView*>(tabView);
|
||||
ASSERT(view);
|
||||
if (view)
|
||||
m_workspace->closeView(view);
|
||||
m_workspace->closeView(view, false);
|
||||
}
|
||||
|
||||
void MainWindow::onCloneTab(Tabs* tabs, TabView* tabView, int pos)
|
||||
|
@ -1,5 +1,5 @@
|
||||
// Aseprite
|
||||
// Copyright (C) 2001-2015 David Capello
|
||||
// Copyright (C) 2001-2016 David Capello
|
||||
//
|
||||
// This program is free software; you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License version 2 as
|
||||
@ -75,9 +75,9 @@ void Workspace::removeView(WorkspaceView* view)
|
||||
panel->removeView(view);
|
||||
}
|
||||
|
||||
bool Workspace::closeView(WorkspaceView* view)
|
||||
bool Workspace::closeView(WorkspaceView* view, bool quitting)
|
||||
{
|
||||
return view->onCloseView(this);
|
||||
return view->onCloseView(this, quitting);
|
||||
}
|
||||
|
||||
WorkspaceView* Workspace::activeView()
|
||||
|
@ -1,5 +1,5 @@
|
||||
// Aseprite
|
||||
// Copyright (C) 2001-2015 David Capello
|
||||
// Copyright (C) 2001-2016 David Capello
|
||||
//
|
||||
// This program is free software; you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License version 2 as
|
||||
@ -39,7 +39,7 @@ namespace app {
|
||||
|
||||
// Closes the given view. Returns false if the user cancels the
|
||||
// operation.
|
||||
bool closeView(WorkspaceView* view);
|
||||
bool closeView(WorkspaceView* view, bool quitting);
|
||||
|
||||
WorkspaceView* activeView();
|
||||
void setActiveView(WorkspaceView* view);
|
||||
|
@ -1,5 +1,5 @@
|
||||
// Aseprite
|
||||
// Copyright (C) 2001-2015 David Capello
|
||||
// Copyright (C) 2001-2016 David Capello
|
||||
//
|
||||
// This program is free software; you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License version 2 as
|
||||
@ -37,7 +37,7 @@ namespace app {
|
||||
|
||||
// Returns true if the view was closed successfully or false if
|
||||
// the user cancels the operation.
|
||||
virtual bool onCloseView(Workspace* workspace) = 0;
|
||||
virtual bool onCloseView(Workspace* workspace, bool quitting) = 0;
|
||||
|
||||
virtual void onTabPopup(Workspace* workspace) = 0;
|
||||
|
||||
|
@ -144,6 +144,10 @@ public:
|
||||
delete this;
|
||||
}
|
||||
|
||||
void activateApp() override {
|
||||
// Do nothing
|
||||
}
|
||||
|
||||
void finishLaunching() override {
|
||||
// Do nothing
|
||||
}
|
||||
|
@ -22,6 +22,7 @@ namespace she {
|
||||
~OSXApp();
|
||||
|
||||
bool init();
|
||||
void activateApp();
|
||||
void finishLaunching();
|
||||
|
||||
private:
|
||||
|
@ -27,11 +27,25 @@ public:
|
||||
|
||||
[m_app setActivationPolicy:NSApplicationActivationPolicyRegular];
|
||||
[m_app setDelegate:m_appDelegate];
|
||||
[m_app activateIgnoringOtherApps:YES];
|
||||
|
||||
// Don't activate the application ignoring other apps. This is
|
||||
// called by OS X when the application is launched by the user
|
||||
// from the application bundle. In this way, we can execute
|
||||
// aseprite from the command line/bash scripts and the app will
|
||||
// not be activated.
|
||||
//[m_app activateIgnoringOtherApps:YES];
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
// We might need to call this function when the app is launched from
|
||||
// Steam. It appears that there is a bug on OS X Steam client where
|
||||
// the app is launched, activated, and then the Steam client is
|
||||
// activated again.
|
||||
void activateApp() {
|
||||
[m_app activateIgnoringOtherApps:YES];
|
||||
}
|
||||
|
||||
void finishLaunching() {
|
||||
[m_app finishLaunching];
|
||||
}
|
||||
@ -67,6 +81,11 @@ bool OSXApp::init()
|
||||
return m_impl->init();
|
||||
}
|
||||
|
||||
void OSXApp::activateApp()
|
||||
{
|
||||
m_impl->activateApp();
|
||||
}
|
||||
|
||||
void OSXApp::finishLaunching()
|
||||
{
|
||||
m_impl->finishLaunching();
|
||||
|
@ -91,7 +91,8 @@ bool is_key_pressed(KeyScancode scancode)
|
||||
|
||||
- (id)initWithFrame:(NSRect)frameRect
|
||||
{
|
||||
m_nsCursor = [NSCursor arrowCursor];
|
||||
// We start without the system mouse cursor
|
||||
m_nsCursor = nil;
|
||||
m_visibleMouse = true;
|
||||
m_pointerType = she::PointerType::Unknown;
|
||||
|
||||
|
@ -57,6 +57,12 @@ public:
|
||||
delete this;
|
||||
}
|
||||
|
||||
void activateApp() override {
|
||||
#if __APPLE__
|
||||
OSXApp::instance()->activateApp();
|
||||
#endif
|
||||
}
|
||||
|
||||
void finishLaunching() override {
|
||||
#if __APPLE__
|
||||
// Start processing NSApplicationDelegate events. (E.g. after
|
||||
|
@ -32,6 +32,7 @@ namespace she {
|
||||
public:
|
||||
virtual ~System() { }
|
||||
virtual void dispose() = 0;
|
||||
virtual void activateApp() = 0;
|
||||
virtual void finishLaunching() = 0;
|
||||
virtual Capabilities capabilities() const = 0;
|
||||
virtual Logger* logger() = 0;
|
||||
|
@ -35,16 +35,20 @@ typedef void (*SteamAPI_Shutdown_Func)();
|
||||
|
||||
class SteamAPI::Impl {
|
||||
public:
|
||||
Impl() {
|
||||
Impl() : m_initialized(false) {
|
||||
m_steamLib = base::load_dll(
|
||||
base::join_path(base::get_file_path(base::get_app_path()),
|
||||
STEAM_API_DLL_FILENAME));
|
||||
if (!m_steamLib)
|
||||
if (!m_steamLib) {
|
||||
LOG("Steam library not found...\n");
|
||||
return;
|
||||
}
|
||||
|
||||
auto SteamAPI_Init = base::get_dll_proc<SteamAPI_Init_Func>(m_steamLib, "SteamAPI_Init");
|
||||
if (!SteamAPI_Init)
|
||||
if (!SteamAPI_Init) {
|
||||
LOG("SteamAPI_Init not found...\n");
|
||||
return;
|
||||
}
|
||||
|
||||
if (!SteamAPI_Init()) {
|
||||
LOG("Steam is not initialized...\n");
|
||||
@ -52,6 +56,7 @@ public:
|
||||
}
|
||||
|
||||
LOG("Steam initialized...\n");
|
||||
m_initialized = true;
|
||||
}
|
||||
|
||||
~Impl() {
|
||||
@ -67,8 +72,13 @@ public:
|
||||
base::unload_dll(m_steamLib);
|
||||
}
|
||||
|
||||
bool initialized() const {
|
||||
return m_initialized;
|
||||
}
|
||||
|
||||
private:
|
||||
base::dll m_steamLib;
|
||||
bool m_initialized;
|
||||
};
|
||||
|
||||
SteamAPI::SteamAPI()
|
||||
@ -81,4 +91,9 @@ SteamAPI::~SteamAPI()
|
||||
delete m_impl;
|
||||
}
|
||||
|
||||
bool SteamAPI::initialized() const
|
||||
{
|
||||
return m_impl->initialized();
|
||||
}
|
||||
|
||||
} // namespace steam
|
||||
|
@ -15,6 +15,8 @@ public:
|
||||
SteamAPI();
|
||||
~SteamAPI();
|
||||
|
||||
bool initialized() const;
|
||||
|
||||
private:
|
||||
class Impl;
|
||||
Impl* m_impl;
|
||||
|
2
third_party/freetype2
vendored
2
third_party/freetype2
vendored
@ -1 +1 @@
|
||||
Subproject commit 27e2f011ebef85144724c30f63285852612aafa0
|
||||
Subproject commit 8529e84fb4bb22abfc5c4d9cafbb06025a8b909d
|
Loading…
x
Reference in New Issue
Block a user